From 983d04d36240bb16db40c06ed3560bc4d622557c Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Fri, 23 Jan 2026 02:15:27 +0000 Subject: [PATCH] Restores missing hint types that got lost in a merge (#6194) Also fix bad text id on deku tree compass & fix dungeon map custom messages --- .../custom-message/CustomMessageManager.cpp | 2 +- .../randomizer/Messages/ItemMessages.cpp | 5 ++ .../randomizer/Messages/StaticHints.cpp | 46 +++++++++++++++++++ soh/soh/Enhancements/randomizer/item_list.cpp | 2 +- 4 files changed, 53 insertions(+), 2 deletions(-) diff --git a/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp b/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp index aa4cf4d33..7f8dace73 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp +++ b/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp @@ -295,7 +295,7 @@ void CustomMessage::Replace(std::string&& oldStr, std::string&& newStr) { size_t position = str.find(oldStr); while (position != std::string::npos) { str.replace(position, oldStr.length(), newStr); - position = str.find(oldStr); + position = str.find(oldStr, position + 1); } } } diff --git a/soh/soh/Enhancements/randomizer/Messages/ItemMessages.cpp b/soh/soh/Enhancements/randomizer/Messages/ItemMessages.cpp index 055b24ad0..966f2f1a8 100644 --- a/soh/soh/Enhancements/randomizer/Messages/ItemMessages.cpp +++ b/soh/soh/Enhancements/randomizer/Messages/ItemMessages.cpp @@ -9,6 +9,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/Enhancements/custom-message/CustomMessageTypes.h" #include "soh/ShipInit.hpp" +#include "z64item.h" #include extern "C" { @@ -446,6 +447,9 @@ void BuildMapMessage(uint16_t* textId, bool* loadFromMessageTable) { sceneNum = SCENE_ICE_CAVERN; break; } + CustomMessage name = + CustomMessage(Rando::StaticData::RetrieveItem(static_cast(itemEntry.getItemId)).GetName()); + msg.Replace("[[name]]", name); if (ctx->GetOption(RSK_MQ_DUNGEON_RANDOM).Is(RO_MQ_DUNGEONS_NONE) || (ctx->GetOption(RSK_MQ_DUNGEON_RANDOM).Is(RO_MQ_DUNGEONS_SET_NUMBER) && ctx->GetOption(RSK_MQ_DUNGEON_COUNT).Is(12))) { @@ -456,6 +460,7 @@ void BuildMapMessage(uint16_t* textId, bool* loadFromMessageTable) { msg.Replace("[[typeHint]]", Rando::StaticData::hintTextTable[RHT_DUNGEON_ORDINARY].GetHintMessage()); } *loadFromMessageTable = false; + msg.AutoFormat(ITEM_DUNGEON_MAP); msg.LoadIntoFont(); } diff --git a/soh/soh/Enhancements/randomizer/Messages/StaticHints.cpp b/soh/soh/Enhancements/randomizer/Messages/StaticHints.cpp index a947bd0ae..9c5440017 100644 --- a/soh/soh/Enhancements/randomizer/Messages/StaticHints.cpp +++ b/soh/soh/Enhancements/randomizer/Messages/StaticHints.cpp @@ -5,6 +5,8 @@ * File for registering hooks for "Static" hints, i.e. hints that * are always given by a specific NPC and/or for a specific item. */ +#include "soh/Enhancements/randomizer/randomizerTypes.h" +#include "z64scene.h" #include extern "C" { @@ -301,6 +303,12 @@ void BuildSariaMessage(uint16_t* textId, bool* loadFromMessageTable) { *loadFromMessageTable = false; } +void BuildMidoMessage(uint16_t* textId, bool* loadFromMessageTable) { + CustomMessage msg = RAND_GET_HINT(RH_MIDO_HINT)->GetHintMessage(MF_AUTO_FORMAT); + msg.LoadIntoFont(); + *loadFromMessageTable = false; +} + void BuildBiggoronHintMessage(uint16_t* textId, bool* loadFromMessageTable) { CustomMessage msg = RAND_GET_HINT(RH_BIGGORON_HINT)->GetHintMessage(MF_AUTO_FORMAT); msg.LoadIntoFont(); @@ -365,6 +373,37 @@ void BuildMaskShopSignMessage(uint16_t* textId, bool* loadFromMessageTable) { *loadFromMessageTable = false; } +void BuildBossKeyHintMessage(uint16_t* textId, bool* loadFromMessageTable) { + RandomizerHint rh = RH_NONE; + switch (gPlayState->sceneNum) { + case SCENE_FOREST_TEMPLE: + rh = RH_FOREST_BOSS_KEY_HINT; + break; + case SCENE_FIRE_TEMPLE: + rh = RH_FIRE_BOSS_KEY_HINT; + break; + case SCENE_WATER_TEMPLE: + rh = RH_WATER_BOSS_KEY_HINT; + break; + case SCENE_SHADOW_TEMPLE: + rh = RH_SHADOW_BOSS_KEY_HINT; + break; + case SCENE_SPIRIT_TEMPLE: + rh = RH_SPIRIT_BOSS_KEY_HINT; + break; + case SCENE_GANONS_TOWER: + rh = RH_GANONS_BOSS_KEY_HINT; + break; + default: + break; + } + if (rh != RH_NONE) { + CustomMessage msg = RAND_GET_HINT(rh)->GetHintMessage(MF_AUTO_FORMAT); + msg.LoadIntoFont(); + *loadFromMessageTable = false; + } +} + void RegisterStaticHints() { // Ganondorf COND_ID_HOOK(OnOpenText, TEXT_GANONDORF, RAND_GET_OPTION(RSK_GANONDORF_HINT), BuildGanondorfHint); @@ -426,6 +465,11 @@ void RegisterStaticHints() { COND_ID_HOOK(OnOpenText, TEXT_SARIAS_SONG_GLAD_NOW, RAND_GET_OPTION(RSK_SARIA_HINT), BuildSariaMessage); COND_ID_HOOK(OnOpenText, TEXT_SARIAS_SONG_IMPRISON_GANONDORF, RAND_GET_OPTION(RSK_SARIA_HINT), BuildSariaMessage); COND_ID_HOOK(OnOpenText, TEXT_SARIAS_SONG_CHANNELING_POWER, RAND_GET_OPTION(RSK_SARIA_HINT), BuildSariaMessage); + // Mido + COND_ID_HOOK(OnOpenText, TEXT_MIDO_SPEAK_TO_MIDO_FIRST_TIME, RAND_GET_OPTION(RSK_MIDO_HINT), BuildMidoMessage); + COND_ID_HOOK(OnOpenText, TEXT_MIDO_SPEAK_TO_MIDO_AGAIN, RAND_GET_OPTION(RSK_MIDO_HINT), BuildMidoMessage); + COND_ID_HOOK(OnOpenText, TEXT_MIDO_HOME_AFTER_ZELDAS_LETTER, RAND_GET_OPTION(RSK_MIDO_HINT), BuildMidoMessage); + COND_ID_HOOK(OnOpenText, TEXT_MIDO_HOME_BEFORE_ZELDAS_LETTER, RAND_GET_OPTION(RSK_MIDO_HINT), BuildMidoMessage); // Biggoron COND_ID_HOOK(OnOpenText, TEXT_BIGGORON_BETTER_AT_SMITHING, RAND_GET_OPTION(RSK_BIGGORON_HINT), BuildBiggoronHintMessage); @@ -465,6 +509,8 @@ void RegisterStaticHints() { COND_ID_HOOK(OnOpenText, TEXT_HBA_ALREADY_HAVE_1000, RAND_GET_OPTION(RSK_HBA_HINT), BuildHorsebackArcheryMessage); // Mask Shop Sign COND_ID_HOOK(OnOpenText, TEXT_MASK_SHOP_SIGN, RAND_GET_OPTION(RSK_MASK_SHOP_HINT), BuildMaskShopSignMessage); + // Boss Key Hints + COND_ID_HOOK(OnOpenText, TEXT_NEED_SPECIAL_KEY, RAND_GET_OPTION(RSK_BOSS_KEY_HINT), BuildBossKeyHintMessage); } static RegisterShipInitFunc initFunc(RegisterStaticHints, { "IS_RANDO" }); \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/item_list.cpp b/soh/soh/Enhancements/randomizer/item_list.cpp index ce29f260d..7ae9956bb 100644 --- a/soh/soh/Enhancements/randomizer/item_list.cpp +++ b/soh/soh/Enhancements/randomizer/item_list.cpp @@ -108,7 +108,7 @@ void Rando::StaticData::InitItemTable() { 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_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_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_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, {"the ", "den ", "la "}, "%g"); + 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"); itemTable[RG_DODONGOS_CAVERN_COMPASS].SetCustomDrawFunc(Randomizer_DrawCompass);