summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Dubé <serprex@users.noreply.github.com>2026-03-19 00:14:37 +0000
committerGitHub <noreply@github.com>2026-03-19 00:14:37 +0000
commit2f12677b25959f85e322ea47d45dc8ea53e0ccb1 (patch)
tree4a4bd6410a315ce9343d280ec1799ab8cff94366
parenta40ca58aba8d39554c8b8b1183c4454bd8c60eb4 (diff)
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
-rw-r--r--soh/include/variables.h2
-rw-r--r--soh/soh/Enhancements/randomizer/ColoredMapsAndCompasses.cpp15
-rw-r--r--soh/soh/Enhancements/randomizer/draw.cpp50
-rw-r--r--soh/soh/Enhancements/randomizer/item_list.cpp10
-rw-r--r--soh/soh/SohGui/SohMenuRandomizer.cpp18
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 <libultraship/bridge.h>
-#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.")