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
This commit is contained in:
Christopher Leggett
2026-01-23 02:15:27 +00:00
committed by GitHub
parent 2af265dbce
commit 983d04d362
4 changed files with 53 additions and 2 deletions

View File

@@ -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);
}
}
}

View File

@@ -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 <soh/ResourceManagerHelpers.h>
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<RandomizerGet>(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();
}

View File

@@ -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 <soh/OTRGlobals.h>
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" });

View File

@@ -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);