From 2f12677b25959f85e322ea47d45dc8ea53e0ccb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Thu, 19 Mar 2026 00:14:37 +0000 Subject: [PATCH] Refactor Maps & Compasses coloring hook, remove PreFunc (#6351) PreFunc for map/compass coloring & jabber nut coloring doesn't work in file select menu, could make them always enabled in file select, but this seems simpler Also fix map colors & ice cavern compass color --- soh/include/variables.h | 2 +- .../randomizer/ColoredMapsAndCompasses.cpp | 15 ++---- soh/soh/Enhancements/randomizer/draw.cpp | 50 +++++++------------ soh/soh/Enhancements/randomizer/item_list.cpp | 10 ++++ soh/soh/SohGui/SohMenuRandomizer.cpp | 18 +------ 5 files changed, 33 insertions(+), 62 deletions(-) diff --git a/soh/include/variables.h b/soh/include/variables.h index dc20ea2db..8c877e294 100644 --- a/soh/include/variables.h +++ b/soh/include/variables.h @@ -50,7 +50,7 @@ extern "C" extern u16 gBuildVersionMinor; extern u16 gBuildVersionPatch; extern const char gGitBranch[]; - extern const char gGitCommitHash[]; + extern const char gGitCommitHash[]; extern u8 gGitCommitTag[]; extern u8 gBuildTeam[]; extern u8 gBuildDate[]; diff --git a/soh/soh/Enhancements/randomizer/ColoredMapsAndCompasses.cpp b/soh/soh/Enhancements/randomizer/ColoredMapsAndCompasses.cpp index 84c12291c..161cf87b0 100644 --- a/soh/soh/Enhancements/randomizer/ColoredMapsAndCompasses.cpp +++ b/soh/soh/Enhancements/randomizer/ColoredMapsAndCompasses.cpp @@ -1,5 +1,4 @@ #include -#include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/ResourceManagerHelpers.h" #include "soh/ShipInit.hpp" #include "z64save.h" @@ -8,10 +7,8 @@ #include "soh/OTRGlobals.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") @@ -19,7 +16,7 @@ u8 Randomizer_GetSettingValue(RandomizerSettingKey randoSettingKey); #define CVAR_COLORED_MAPS_AND_COMPASSES_VALUE \ CVarGetInteger(CVAR_COLORED_MAPS_AND_COMPASSES_NAME, CVAR_COLORED_MAPS_AND_COMPASSES_DEFAULT) -void OnLoadFileColoredMapsAndCompasses(int32_t _) { +void RegisterColoredMapsAndCompasses() { s8 mapsAndCompassesCanBeOutsideDungeon = IS_RANDO && DUNGEON_ITEMS_CAN_BE_OUTSIDE_DUNGEON(RSK_SHUFFLE_MAPANDCOMPASS); s8 isColoredMapsAndCompassesEnabled = mapsAndCompassesCanBeOutsideDungeon && CVAR_COLORED_MAPS_AND_COMPASSES_VALUE; @@ -36,11 +33,5 @@ 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 - OnLoadFileColoredMapsAndCompasses(0); -} - -static RegisterShipInitFunc initFunc(RegisterColoredMapsAndCompasses, { CVAR_COLORED_MAPS_AND_COMPASSES_NAME }); +static RegisterShipInitFunc initFunc(RegisterColoredMapsAndCompasses, + { "IS_RANDO", CVAR_COLORED_MAPS_AND_COMPASSES_NAME }); diff --git a/soh/soh/Enhancements/randomizer/draw.cpp b/soh/soh/Enhancements/randomizer/draw.cpp index f63441f3f..f16ae7440 100644 --- a/soh/soh/Enhancements/randomizer/draw.cpp +++ b/soh/soh/Enhancements/randomizer/draw.cpp @@ -70,6 +70,19 @@ Color_RGB8 SmallEmblemDefaultValue[10] = { { 255, 255, 255 }, // Chest Game }; +Color_RGB8 MapOrCompassColor[10] = { + { 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 +}; + extern "C" u8 Randomizer_GetSettingValue(RandomizerSettingKey randoSettingKey); extern "C" void Randomizer_DrawSmallKey(PlayState* play, GetItemEntry* getItemEntry) { @@ -120,19 +133,7 @@ extern "C" void Randomizer_DrawSmallKey(PlayState* play, GetItemEntry* getItemEn } 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 - }; + auto color = MapOrCompassColor[getItemEntry->drawItemId - RG_DEKU_TREE_MAP]; OPEN_DISPS(play->state.gfxCtx); @@ -140,7 +141,7 @@ extern "C" void Randomizer_DrawMap(PlayState* play, GetItemEntry* getItemEntry) 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); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, color.r, color.g, color.b, 255); gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gGiDungeonMapDL); @@ -148,21 +149,7 @@ extern "C" void Randomizer_DrawMap(PlayState* play, GetItemEntry* getItemEntry) } extern "C" void Randomizer_DrawCompass(PlayState* play, GetItemEntry* getItemEntry) { - s16 color_slot = getItemEntry->drawItemId - RG_DEKU_TREE_COMPASS; - 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 - { 221, 212, 60 }, // Gerudo Training Ground - { 255, 255, 255 }, // Thieves' Hideout - { 80, 80, 80 } // Ganon's Castle - }; + auto color = MapOrCompassColor[getItemEntry->drawItemId - RG_DEKU_TREE_COMPASS]; OPEN_DISPS(play->state.gfxCtx); @@ -170,9 +157,8 @@ extern "C" void Randomizer_DrawCompass(PlayState* play, GetItemEntry* getItemEnt 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); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, color.r, color.g, color.b, 255); + gDPSetEnvColor(POLY_OPA_DISP++, color.r / 2, color.g / 2, color.b / 2, 255); gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gGiCompassDL); diff --git a/soh/soh/Enhancements/randomizer/item_list.cpp b/soh/soh/Enhancements/randomizer/item_list.cpp index 195044e66..af2e6a244 100644 --- a/soh/soh/Enhancements/randomizer/item_list.cpp +++ b/soh/soh/Enhancements/randomizer/item_list.cpp @@ -99,15 +99,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, {"the ", "das ", "le "}); // 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, {"the", " die ", "la "}, "%g"); + 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, {"the ", "die ", "la "}, "%r"); + 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, {"the ", "die ", "la "}, "%b"); + 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, {"the ", "die ", "la "}, "%g"); + 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, {"the ", "die ", "la "}, "%r"); + 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, {"the ", "die ", "la "}, "%b"); + 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, {"the ", "die ", "la "}, "%y"); + 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, {"the ", "die ", "la "}, "%p"); + 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, {"the ", "die ", "la "}, "%p"); + 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, {"the ", "die ", "la "}, "%c"); + 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_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER, {"the ", "den ", "la "}, "%g"); 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, {"the ", "den ", "la "}, "%r"); diff --git a/soh/soh/SohGui/SohMenuRandomizer.cpp b/soh/soh/SohGui/SohMenuRandomizer.cpp index 54c83ee02..710f52207 100644 --- a/soh/soh/SohGui/SohMenuRandomizer.cpp +++ b/soh/soh/SohGui/SohMenuRandomizer.cpp @@ -576,7 +576,7 @@ void SohMenu::AddMenuRandomizer() { GenerateRandomizer(CVarGetInteger(CVAR_RANDOMIZER_SETTING("ManualSeedEntry"), 0) ? seedString : ""); }) .PreFunc([](WidgetInfo& info) { - info.options->Disabled((gSaveContext.gameMode != GAMEMODE_FILE_SELECT) || GameInteractor::IsSaveLoaded()); + info.options->disabled = (gSaveContext.gameMode != GAMEMODE_FILE_SELECT) || GameInteractor::IsSaveLoaded(); }) .Options(ButtonOptions() .Size(ImVec2(250.f, 0.f)) @@ -615,17 +615,6 @@ void SohMenu::AddMenuRandomizer() { .DefaultValue(true)); 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 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. " @@ -635,11 +624,6 @@ void SohMenu::AddMenuRandomizer() { .DefaultValue(true)); AddWidget(path, "Jabber Nut Colors Match Kind", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_RANDOMIZER_ENHANCEMENT("GenericJabberNutModel")) - .PreFunc([](WidgetInfo& info) { - info.options->disabled = !OTRGlobals::Instance->gRandoContext->GetOption(RSK_SHUFFLE_SPEAK); - info.options->disabledTooltip = - "This setting is disabled because a savefile is loaded without Shuffle Speak."; - }) .RaceDisable(false) .Options(CheckboxOptions() .Tooltip("With Shuffle Speak, jabber nut model & color will be generic.")