From ad2807ce322412667704085ffc895de92b33aadb Mon Sep 17 00:00:00 2001 From: Malkierian Date: Thu, 23 Oct 2025 18:32:00 -0700 Subject: [PATCH 1/7] Fix adding Enable Mods twice as search widget. (#5880) Fix a couple typos in search widget extra terms. --- soh/soh/Enhancements/mod_menu.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/soh/soh/Enhancements/mod_menu.cpp b/soh/soh/Enhancements/mod_menu.cpp index 3051efe74..9e3fda114 100644 --- a/soh/soh/Enhancements/mod_menu.cpp +++ b/soh/soh/Enhancements/mod_menu.cpp @@ -205,7 +205,7 @@ void DrawMods(bool enabled) { int switchToIndex = -1; uint32_t index = 0; - for (int i = selectedModFiles.size() - 1; i >= 0; i--) { + for (int i = static_cast(selectedModFiles.size()) - 1; i >= 0; i--) { std::string file = selectedModFiles[i]; if (enabled) { ImGui::BeginGroup(); @@ -365,7 +365,7 @@ void RegisterModMenuWidgets() { auto options = std::static_pointer_cast(info.options); options->disabled = editing; }); - SohGui::mSohMenu->AddSearchWidget({ enableModsWidget, "Settings", "Mod Menu", "Top", "alternat assets" }); + SohGui::mSohMenu->AddSearchWidget({ enableModsWidget, "Settings", "Mod Menu", "Top", "alternate assets" }); tabHotkeyWidget = { .name = "Mods Tab Hotkey", .type = WidgetType::WIDGET_CVAR_CHECKBOX }; tabHotkeyWidget.CVar(CVAR_SETTING("Mods.AlternateAssetsHotkey")) @@ -375,7 +375,7 @@ void RegisterModMenuWidgets() { .Tooltip("Allows pressing the Tab key to toggle mods") .DefaultValue(true)); SohGui::mSohMenu->AddSearchWidget( - { enableModsWidget, "Settings", "Mod Menu", "Top", "alternat assets tab hotkey" }); + { tabHotkeyWidget, "Settings", "Mod Menu", "Top", "alternate assets tab hotkey" }); } static RegisterMenuInitFunc menuInitFunc(RegisterModMenuWidgets); From 74312442d55afcb2574b26ebd956c685b279c163 Mon Sep 17 00:00:00 2001 From: Malkierian Date: Sat, 25 Oct 2025 19:52:22 -0700 Subject: [PATCH 2/7] Fix wrong CVar on Hookshot Identifier. (#5883) --- soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index 0935ce46c..cd32cc4b1 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -2113,7 +2113,7 @@ void RegisterItemTrackerWidgets() { SohGui::mSohMenu->AddSearchWidget({ personalNotesWiget, "Randomizer", "Item Tracker", "General Settings" }); hookshotIdentWidget = { .name = "Show Hookshot Identifiers", .type = WidgetType::WIDGET_CVAR_CHECKBOX }; - hookshotIdentWidget.CVar(CVAR_SETTING("FreeLook.Enabled")) + hookshotIdentWidget.CVar(CVAR_TRACKER_ITEM("HookshotIdentifier")) .Options(CheckboxOptions() .Color(THEME_COLOR) .Tooltip("Shows an 'H' or an 'L' to more easily distinguish between Hookshot and Longshot.")); From 1b29c0cad36f64ec1217b6ba192c99455a100f66 Mon Sep 17 00:00:00 2001 From: Pepper0ni <93387759+Pepper0ni@users.noreply.github.com> Date: Tue, 28 Oct 2025 23:57:16 +0000 Subject: [PATCH 3/7] fix logic error with detu tree torch room (#5898) --- .../randomizer/location_access/dungeons/deku_tree.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 caa46d9c7..6dde5698d 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp @@ -133,7 +133,7 @@ void RegionTable_Init_DekuTree() { 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_WATER_ROOM_BACK, []{return Here(RR_DEKU_TREE_BASEMENT_TORCH_ROOM, []{return logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW);});}), Entrance(RR_DEKU_TREE_BASEMENT_BACK_LOBBY, []{return Here(RR_DEKU_TREE_BASEMENT_TORCH_ROOM, []{return logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW);});}), }); From 48f4f56bac082351ad7eb51d218d43523e4f9e9e Mon Sep 17 00:00:00 2001 From: Malkierian Date: Tue, 28 Oct 2025 17:01:59 -0700 Subject: [PATCH 4/7] Change disabling rules for Skip Feeding Jabu-Jabu to reflect the fact that it only works in rando based on the rando setting. (#5889) --- soh/soh/SohGui/SohMenuEnhancements.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/soh/soh/SohGui/SohMenuEnhancements.cpp b/soh/soh/SohGui/SohMenuEnhancements.cpp index 639d7469b..a48706035 100644 --- a/soh/soh/SohGui/SohMenuEnhancements.cpp +++ b/soh/soh/SohGui/SohMenuEnhancements.cpp @@ -334,8 +334,7 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Skip Feeding Jabu-Jabu", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("TimeSavers.SkipJabuJabuFish")) .PreFunc([](WidgetInfo& info) { - info.options->disabled = - IS_RANDO && OTRGlobals::Instance->gRandoContext->GetOption(RSK_JABU_OPEN).Is(RO_JABU_OPEN); + info.options->disabled = IS_RANDO; info.options->disabledTooltip = "This setting is disabled because a randomizer savefile with \"Jabu-Jabu: Open\" is loaded."; }) From a419b431a7b6d7f5e1afe57f495aadbb4bcf608f Mon Sep 17 00:00:00 2001 From: Jordan Longstaff Date: Tue, 28 Oct 2025 23:52:18 -0400 Subject: [PATCH 5/7] Modularize Pause Warp hook (#5869) * Modularize Pause Warp hook * Make RegisterPauseMenuHooks static * Merge pausewarp.c into hook module * Use brackets with if statements * Fix timer bug with spoiling items --- soh/include/functions.h | 4 -- .../{pausewarp.c => QoL/PauseWarp.cpp} | 45 +++++++++++++++---- soh/soh/Enhancements/mods.cpp | 18 -------- 3 files changed, 37 insertions(+), 30 deletions(-) rename soh/soh/Enhancements/{pausewarp.c => QoL/PauseWarp.cpp} (81%) diff --git a/soh/include/functions.h b/soh/include/functions.h index 75797401e..9d96a3c8b 100644 --- a/soh/include/functions.h +++ b/soh/include/functions.h @@ -2457,10 +2457,6 @@ void Interface_RandoRestoreSwordless(void); s32 Ship_CalcShouldDrawAndUpdate(PlayState* play, Actor* actor, Vec3f* projectedPos, f32 projectedW, bool* shouldDraw, bool* shouldUpdate); -//Pause Warp -void PauseWarp_HandleSelection(); -void PauseWarp_Execute(); - // #endregion #ifdef __cplusplus diff --git a/soh/soh/Enhancements/pausewarp.c b/soh/soh/Enhancements/QoL/PauseWarp.cpp similarity index 81% rename from soh/soh/Enhancements/pausewarp.c rename to soh/soh/Enhancements/QoL/PauseWarp.cpp index 10f7e4e39..391f42c61 100644 --- a/soh/soh/Enhancements/pausewarp.c +++ b/soh/soh/Enhancements/QoL/PauseWarp.cpp @@ -1,8 +1,21 @@ -#include "custom-message/CustomMessageTypes.h" -#include "global.h" -#include "z64.h" -#include "game-interactor/GameInteractor.h" -#include "soh/OTRGlobals.h" +#include +#include "soh/Enhancements/custom-message/CustomMessageTypes.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" + +extern "C" { +#include "functions.h" +#include "macros.h" +#include "variables.h" + +extern PlayState* gPlayState; + +u8 Randomizer_GetSettingValue(RandomizerSettingKey); +} + +static constexpr int32_t CVAR_PAUSE_WARP_DEFAULT = 0; +#define CVAR_PAUSE_WARP_NAME CVAR_ENHANCEMENT("PauseWarp") +#define CVAR_PAUSE_WARP_VALUE CVarGetInteger(CVAR_PAUSE_WARP_NAME, CVAR_PAUSE_WARP_DEFAULT) static const int songMessageMap[] = { TEXT_WARP_MINUET_OF_FOREST, TEXT_WARP_BOLERO_OF_FIRE, TEXT_WARP_SERENADE_OF_WATER, @@ -30,7 +43,7 @@ static const int songAudioMap[] = { static bool isWarpActive = false; -void PauseWarp_Execute() { +static void PauseWarp_Execute() { if (!isWarpActive || gPlayState->msgCtx.msgMode != MSGMODE_NONE) { return; } @@ -48,13 +61,14 @@ void PauseWarp_Execute() { for (int i = 0; i < ARRAY_COUNT(ocarinaSongMap); i++) { if (gPlayState->msgCtx.lastPlayedSong == ocarinaSongMap[i]) { gPlayState->nextEntranceIndex = entranceIndexMap[i]; + func_80088AF0(gPlayState); return; } } gPlayState->transitionTrigger = TRANS_TRIGGER_OFF; } -void ActivateWarp(PauseContext* pauseCtx, int song) { +static void ActivateWarp(PauseContext* pauseCtx, int song) { Audio_OcaSetInstrument(0); Interface_SetDoAction(gPlayState, DO_ACTION_NONE); pauseCtx->state = 0x12; @@ -70,7 +84,7 @@ void ActivateWarp(PauseContext* pauseCtx, int song) { isWarpActive = true; } -void PauseWarp_HandleSelection() { +static void PauseWarp_HandleSelection() { if (gSaveContext.inventory.items[SLOT_OCARINA] != ITEM_NONE) { int aButtonPressed = CHECK_BTN_ALL(gPlayState->state.input->press.button, BTN_A); int song = gPlayState->pauseCtx.cursorPoint[PAUSE_QUEST]; @@ -122,3 +136,18 @@ void PauseWarp_HandleSelection() { } } } + +static void RegisterPauseMenuHooks() { + COND_HOOK(OnKaleidoUpdate, CVAR_PAUSE_WARP_VALUE, [] { + if (GameInteractor::IsSaveLoaded()) { + PauseWarp_HandleSelection(); + } + }); + COND_HOOK(OnGameFrameUpdate, CVAR_PAUSE_WARP_VALUE, [] { + if (GameInteractor::IsSaveLoaded()) { + PauseWarp_Execute(); + } + }); +} + +static RegisterShipInitFunc initFunc(RegisterPauseMenuHooks, { CVAR_PAUSE_WARP_NAME }); diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index 919658348..08c226340 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -858,23 +858,6 @@ void RegisterFloorSwitchesHook() { }); } -void RegisterPauseMenuHooks() { - static bool pauseWarpHooksRegistered = false; - GameInteractor::Instance->RegisterGameHook([&]() { - if (!GameInteractor::IsSaveLoaded() || !CVarGetInteger(CVAR_ENHANCEMENT("PauseWarp"), 0)) { - pauseWarpHooksRegistered = false; - return; - } - if (!pauseWarpHooksRegistered) { - GameInteractor::Instance->RegisterGameHook( - []() { PauseWarp_HandleSelection(); }); - GameInteractor::Instance->RegisterGameHook( - []() { PauseWarp_Execute(); }); - pauseWarpHooksRegistered = true; - } - }); -} - void RegisterCustomSkeletons() { static int8_t previousTunic = -1; @@ -917,7 +900,6 @@ void InitMods() { RegisterFloorSwitchesHook(); RegisterPatchHandHandler(); RegisterHurtContainerModeHandler(); - RegisterPauseMenuHooks(); RandoKaleido_RegisterHooks(); RegisterCustomSkeletons(); } From b30191f36935e870ee521fa085c9bd88126cb0ab Mon Sep 17 00:00:00 2001 From: Malkierian Date: Wed, 29 Oct 2025 09:05:14 -0700 Subject: [PATCH 6/7] Set cutsceneIndex to 0 to bypass cutscene shenanigans when spawning in ToT as adult. (#5899) Unify savedSceneNum at -1 regardless of starting age. --- soh/soh/Enhancements/randomizer/savefile.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/savefile.cpp b/soh/soh/Enhancements/randomizer/savefile.cpp index ade5dd163..106cecb11 100644 --- a/soh/soh/Enhancements/randomizer/savefile.cpp +++ b/soh/soh/Enhancements/randomizer/savefile.cpp @@ -282,15 +282,15 @@ extern "C" void Randomizer_InitSaveFile() { } int startingAge = OTRGlobals::Instance->gRandoContext->GetOption(RSK_SELECTED_STARTING_AGE).Get(); + gSaveContext.savedSceneNum = -1; switch (startingAge) { 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.cutsceneIndex = 0; break; case RO_AGE_CHILD: // Child gSaveContext.linkAge = LINK_AGE_CHILD; - gSaveContext.savedSceneNum = -1; break; default: break; From 1ba6cf643dedd0bb4e92e20eb2ad5c459cacf731 Mon Sep 17 00:00:00 2001 From: Jordan Longstaff Date: Wed, 29 Oct 2025 16:36:29 -0400 Subject: [PATCH 7/7] Modularize coloured ToT Medallions hook (#5877) * Modularize colourized ToT Medallions hook * Add overlooked reset of Forest Medallion colour * Move asset variables to hook file * Fix includes * Remove forward declarations * Use data structures to reduceboilerplate code * Simplify data structures, reduce boilerplate even more * Correct patchName2 checks * Clang format * Add brackets on if statements --- .../Enhancements/Graphics/ToTMedallions.cpp | 129 ++++++++++++++++++ soh/soh/Enhancements/mods.cpp | 112 --------------- soh/soh/Enhancements/mods.h | 2 +- soh/soh/SohGui/SohMenuEnhancements.cpp | 2 +- 4 files changed, 131 insertions(+), 114 deletions(-) create mode 100644 soh/soh/Enhancements/Graphics/ToTMedallions.cpp diff --git a/soh/soh/Enhancements/Graphics/ToTMedallions.cpp b/soh/soh/Enhancements/Graphics/ToTMedallions.cpp new file mode 100644 index 000000000..13c752a62 --- /dev/null +++ b/soh/soh/Enhancements/Graphics/ToTMedallions.cpp @@ -0,0 +1,129 @@ +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/Enhancements/mods.h" +#include "soh/ShipInit.hpp" + +extern "C" { +#include "align_asset_macro.h" +#include "macros.h" +#include "variables.h" +#include "soh/ResourceManagerHelpers.h" +extern PlayState* gPlayState; +} + +static constexpr int32_t CVAR_TOT_MEDALLION_COLORS_DEFAULT = 0; +#define CVAR_TOT_MEDALLION_COLORS_NAME CVAR_ENHANCEMENT("ToTMedallionsColors") +#define CVAR_TOT_MEDALLION_COLORS_VALUE \ + CVarGetInteger(CVAR_TOT_MEDALLION_COLORS_NAME, CVAR_TOT_MEDALLION_COLORS_DEFAULT) + +// GreyScaleEndDlist +#define dgEndGrayscaleAndEndDlistDL "__OTR__helpers/cosmetics/gEndGrayscaleAndEndDlistDL" +static const ALIGN_ASSET(2) char gEndGrayscaleAndEndDlistDL[] = dgEndGrayscaleAndEndDlistDL; + +// This is used for the Temple of Time Medalions' color +#define dtokinoma_room_0DL_007A70 "__OTR__scenes/shared/tokinoma_scene/tokinoma_room_0DL_007A70" +static const ALIGN_ASSET(2) char tokinoma_room_0DL_007A70[] = dtokinoma_room_0DL_007A70; +#define dtokinoma_room_0DL_007FD0 "__OTR__scenes/shared/tokinoma_scene/tokinoma_room_0DL_007FD0" +static const ALIGN_ASSET(2) char tokinoma_room_0DL_007FD0[] = dtokinoma_room_0DL_007FD0; + +static Gfx grayscaleWhite = gsDPSetGrayscaleColor(255, 255, 255, 255); + +class ToTPatchSetup { + public: + ToTPatchSetup(Gfx ifColored, const char* patchName, int index, const char* patchName2 = "", int index2 = 0) + : patchName(patchName), index(index), ifColored(ifColored), patchName2(patchName2), index2(index2) { + } + + void ApplyPatch(bool colored = true) { + Gfx colorGfx = colored ? ifColored : grayscaleWhite; + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, patchName, index, colorGfx); + if (patchName2 && *patchName2) { + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007FD0, patchName2, index2, colorGfx); + } + } + + void RevertPatch() { + ResourceMgr_UnpatchGfxByName(tokinoma_room_0DL_007A70, patchName); + if (patchName2 && *patchName2) { + ResourceMgr_UnpatchGfxByName(tokinoma_room_0DL_007FD0, patchName2); + } + } + + private: + const char* patchName; + const char* patchName2; + int index; + int index2; + Gfx ifColored; +}; + +typedef struct MedallionColorPatch { + QuestItem questItemId; + ToTPatchSetup patch; +} MedallionColorPatch; + +static ToTPatchSetup startGrayscale = + ToTPatchSetup(gsSPGrayscale(true), "ToTMedallions_StartGrayscale", 7, "ToTMedallions_2_StartGrayscale", 7); + +static MedallionColorPatch medallionColorPatches[] = { + { QUEST_MEDALLION_WATER, ToTPatchSetup(gsDPSetGrayscaleColor(0, 161, 255, 255), "ToTMedallions_MakeBlue", 16) }, + { QUEST_MEDALLION_SPIRIT, ToTPatchSetup(gsDPSetGrayscaleColor(255, 135, 0, 255), "ToTMedallions_MakeOrange", 45) }, + { QUEST_MEDALLION_LIGHT, ToTPatchSetup(gsDPSetGrayscaleColor(255, 255, 0, 255), "ToTMedallions_MakeYellow", 69, + "ToTMedallions_2_MakeYellow", 16) }, + { QUEST_MEDALLION_FOREST, ToTPatchSetup(gsDPSetGrayscaleColor(0, 255, 0, 255), "ToTMedallions_MakeGreen", 94) }, + { QUEST_MEDALLION_FIRE, ToTPatchSetup(gsDPSetGrayscaleColor(255, 0, 0, 255), "ToTMedallions_MakeRed", 118) }, + { QUEST_MEDALLION_SHADOW, ToTPatchSetup(gsDPSetGrayscaleColor(212, 0, 255, 255), "ToTMedallions_MakePurple", 142, + "ToTMedallions_2_MakePurple", 27) }, +}; + +static ToTPatchSetup endGrayscale = + ToTPatchSetup(gsSPBranchListOTRFilePath(gEndGrayscaleAndEndDlistDL), "ToTMedallions_EndGrayscaleAndEndDlist", 160, + "ToTMedallions_2_EndGrayscaleAndEndDlist", 51); + +static void PatchToTMedallions() { + // TODO: Refactor the DemoEffect_UpdateJewelAdult and DemoEffect_UpdateJewelChild from z_demo_effect + // effects to take effect in there + startGrayscale.ApplyPatch(); + + for (auto& medallionPatch : medallionColorPatches) { + medallionPatch.patch.ApplyPatch(CHECK_QUEST_ITEM(medallionPatch.questItemId)); + } + + endGrayscale.ApplyPatch(); +} + +static void ResetToTMedallions() { + // Unpatch everything + startGrayscale.RevertPatch(); + + for (auto& medallionPatch : medallionColorPatches) { + medallionPatch.patch.RevertPatch(); + } + + endGrayscale.RevertPatch(); +} + +void UpdateToTMedallions() { + if (CVAR_TOT_MEDALLION_COLORS_VALUE) { + PatchToTMedallions(); + } else { + ResetToTMedallions(); + } +} + +static void CheckTempleOfTime(int16_t sceneNum) { + if (sceneNum != SCENE_TEMPLE_OF_TIME) { + return; + } + PatchToTMedallions(); +} + +static void RegisterToTMedallions() { + COND_HOOK(OnItemReceive, CVAR_TOT_MEDALLION_COLORS_VALUE, [](GetItemEntry) { + if (gPlayState) { + CheckTempleOfTime(gPlayState->sceneNum); + } + }); + COND_HOOK(OnSceneInit, CVAR_TOT_MEDALLION_COLORS_VALUE, CheckTempleOfTime); +} + +static RegisterShipInitFunc initFunc(RegisterToTMedallions, { CVAR_TOT_MEDALLION_COLORS_NAME }); diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index 08c226340..2577b7dd2 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -49,16 +49,6 @@ extern SaveContext gSaveContext; extern PlayState* gPlayState; } -// GreyScaleEndDlist -#define dgEndGrayscaleAndEndDlistDL "__OTR__helpers/cosmetics/gEndGrayscaleAndEndDlistDL" -static const ALIGN_ASSET(2) char gEndGrayscaleAndEndDlistDL[] = dgEndGrayscaleAndEndDlistDL; - -// This is used for the Temple of Time Medalions' color -#define dtokinoma_room_0DL_007A70 "__OTR__scenes/shared/tokinoma_scene/tokinoma_room_0DL_007A70" -static const ALIGN_ASSET(2) char tokinoma_room_0DL_007A70[] = dtokinoma_room_0DL_007A70; -#define dtokinoma_room_0DL_007FD0 "__OTR__scenes/shared/tokinoma_scene/tokinoma_room_0DL_007FD0" -static const ALIGN_ASSET(2) char tokinoma_room_0DL_007FD0[] = dtokinoma_room_0DL_007FD0; - /// Switches Link's age and respawns him at the last entrance he entered. void SwitchAge() { if (gPlayState == NULL) @@ -741,107 +731,6 @@ void RegisterRandomizedEnemySizes() { }); } -void PatchToTMedallions() { - // TODO: Refactor the DemoEffect_UpdateJewelAdult and DemoEffect_UpdateJewelChild from z_demo_effect - // effects to take effect in there - if (CVarGetInteger(CVAR_ENHANCEMENT("ToTMedallionsColors"), 0)) { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_StartGrayscale", 7, gsSPGrayscale(true)); - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_StartGrayscale", 7, gsSPGrayscale(true)); - - if (CHECK_QUEST_ITEM(QUEST_MEDALLION_WATER)) { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeBlue", 16, - gsDPSetGrayscaleColor(0, 161, 255, 255)); - } else { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeBlue", 16, - gsDPSetGrayscaleColor(255, 255, 255, 255)); - } - - if (CHECK_QUEST_ITEM(QUEST_MEDALLION_SPIRIT)) { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeOrange", 45, - gsDPSetGrayscaleColor(255, 135, 0, 255)); - } else { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeOrange", 45, - gsDPSetGrayscaleColor(255, 255, 255, 255)); - } - - if (CHECK_QUEST_ITEM(QUEST_MEDALLION_LIGHT)) { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeYellow", 69, - gsDPSetGrayscaleColor(255, 255, 0, 255)); - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_MakeYellow", 16, - gsDPSetGrayscaleColor(255, 255, 0, 255)); - } else { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeYellow", 69, - gsDPSetGrayscaleColor(255, 255, 255, 255)); - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_MakeYellow", 16, - gsDPSetGrayscaleColor(255, 255, 255, 255)); - } - - if (CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST)) { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeGreen", 94, - gsDPSetGrayscaleColor(0, 255, 0, 255)); - } else { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeGreen", 94, - gsDPSetGrayscaleColor(255, 255, 255, 255)); - } - - if (CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeRed", 118, - gsDPSetGrayscaleColor(255, 0, 0, 255)); - } else { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeRed", 118, - gsDPSetGrayscaleColor(255, 255, 255, 255)); - } - - if (CHECK_QUEST_ITEM(QUEST_MEDALLION_SHADOW)) { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakePurple", 142, - gsDPSetGrayscaleColor(212, 0, 255, 255)); - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_MakePurple", 27, - gsDPSetGrayscaleColor(212, 0, 255, 255)); - } else { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakePurple", 142, - gsDPSetGrayscaleColor(255, 255, 255, 255)); - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_MakePurple", 27, - gsDPSetGrayscaleColor(255, 255, 255, 255)); - } - - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_EndGrayscaleAndEndDlist", 160, - gsSPBranchListOTRFilePath(gEndGrayscaleAndEndDlistDL)); - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_EndGrayscaleAndEndDlist", 51, - gsSPBranchListOTRFilePath(gEndGrayscaleAndEndDlistDL)); - } else { - // Unpatch everything - ResourceMgr_UnpatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_StartGrayscale"); - ResourceMgr_UnpatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_StartGrayscale"); - - ResourceMgr_UnpatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeBlue"); - ResourceMgr_UnpatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeOrange"); - ResourceMgr_UnpatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeYellow"); - ResourceMgr_UnpatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_MakeYellow"); - ResourceMgr_UnpatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeRed"); - ResourceMgr_UnpatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakePurple"); - ResourceMgr_UnpatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_MakePurple"); - - ResourceMgr_UnpatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_EndGrayscaleAndEndDlist"); - ResourceMgr_UnpatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_EndGrayscaleAndEndDlist"); - } -} - -void RegisterToTMedallions() { - GameInteractor::Instance->RegisterGameHook([](GetItemEntry _unused) { - if (!CVarGetInteger(CVAR_ENHANCEMENT("ToTMedallionsColors"), 0) || !gPlayState || - gPlayState->sceneNum != SCENE_TEMPLE_OF_TIME) { - return; - } - PatchToTMedallions(); - }); - GameInteractor::Instance->RegisterGameHook([](int16_t sceneNum) { - if (!CVarGetInteger(CVAR_ENHANCEMENT("ToTMedallionsColors"), 0) || sceneNum != SCENE_TEMPLE_OF_TIME) { - return; - } - PatchToTMedallions(); - }); -} - void RegisterFloorSwitchesHook() { GameInteractor::Instance->RegisterGameHook([](void* refActor) { Actor* actor = static_cast(refActor); @@ -896,7 +785,6 @@ void InitMods() { RegisterEnemyDefeatCounts(); RegisterBossDefeatTimestamps(); RegisterRandomizedEnemySizes(); - RegisterToTMedallions(); RegisterFloorSwitchesHook(); RegisterPatchHandHandler(); RegisterHurtContainerModeHandler(); diff --git a/soh/soh/Enhancements/mods.h b/soh/soh/Enhancements/mods.h index 8ada99f1e..f28ef1e7e 100644 --- a/soh/soh/Enhancements/mods.h +++ b/soh/soh/Enhancements/mods.h @@ -10,7 +10,7 @@ extern "C" { void UpdateDirtPathFixState(int32_t sceneNum); void UpdateMirrorModeState(int32_t sceneNum); void UpdateHurtContainerModeState(bool newState); -void PatchToTMedallions(); +void UpdateToTMedallions(); void UpdatePermanentHeartLossState(); void UpdateHyperEnemiesState(); void UpdateHyperBossesState(); diff --git a/soh/soh/SohGui/SohMenuEnhancements.cpp b/soh/soh/SohGui/SohMenuEnhancements.cpp index a48706035..e81478df9 100644 --- a/soh/soh/SohGui/SohMenuEnhancements.cpp +++ b/soh/soh/SohGui/SohMenuEnhancements.cpp @@ -602,7 +602,7 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Color Temple of Time's Medallions", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("ToTMedallionsColors")) .RaceDisable(false) - .Callback([](WidgetInfo& info) { PatchToTMedallions(); }) + .Callback([](WidgetInfo& info) { UpdateToTMedallions(); }) .Options(CheckboxOptions().Tooltip( "When Medallions are collected, the Medallion imprints around the Master Sword Pedestal in the Temple " "of Time will become colored-in."));