Add option for Navi to hint location of boss key at boss doors (#6058)

This commit is contained in:
Philip Dubé
2026-01-02 16:23:15 +00:00
committed by GitHub
parent 33758e49db
commit 88494169e6
8 changed files with 92 additions and 56 deletions

View File

@@ -78,6 +78,7 @@ typedef enum {
TEXT_SARIAS_SONG_IMPRISON_GANONDORF = 0x016C, TEXT_SARIAS_SONG_IMPRISON_GANONDORF = 0x016C,
TEXT_SARIAS_SONG_CHANNELING_POWER = 0x016D, TEXT_SARIAS_SONG_CHANNELING_POWER = 0x016D,
TEXT_LAKE_HYLIA_WATER_SWITCH_NAVI = 0x01B3, // 0x1yy for Navi msg range TEXT_LAKE_HYLIA_WATER_SWITCH_NAVI = 0x01B3, // 0x1yy for Navi msg range
TEXT_NEED_SPECIAL_KEY = 0x0204,
TEXT_MASK_SHOP_SIGN = 0x0207, TEXT_MASK_SHOP_SIGN = 0x0207,
TEXT_WATERFALL = 0x022D, TEXT_WATERFALL = 0x022D,
TEXT_FROGS_UNDERWATER = 0x022E, TEXT_FROGS_UNDERWATER = 0x022E,

View File

@@ -2237,6 +2237,11 @@ void StaticData::HintTable_Init() {
/*french*/ "J'ai entendu dire que Ganondorf aurait caché les #Flèches de Lumière# dans #[[1]]#.", /*french*/ "J'ai entendu dire que Ganondorf aurait caché les #Flèches de Lumière# dans #[[1]]#.",
{QM_YELLOW, QM_RED})); {QM_YELLOW, QM_RED}));
hintTextTable[RHT_BOSS_KEY_HINT] = HintText(CustomMessage("The #boss key# for this door is in #[[1]]#!",
/*german*/ TODO_TRANSLATE,
/*french*/ TODO_TRANSLATE,
{QM_GREEN, QM_RED}));
hintTextTable[RHT_DAMPE_DIARY] = HintText(CustomMessage("Whoever reads this, please enter #[[1]]#. I will let you have my #stretching, shrinking keepsake#.^I'm waiting for you.&--Dampé", hintTextTable[RHT_DAMPE_DIARY] = HintText(CustomMessage("Whoever reads this, please enter #[[1]]#. I will let you have my #stretching, shrinking keepsake#.^I'm waiting for you.&--Dampé",
/*german*/ "Wer immer dies liest, der möge #[[1]]# nach meinem #langen, kurzen Schatz# suchen.^Ich warte!&Boris", /*german*/ "Wer immer dies liest, der möge #[[1]]# nach meinem #langen, kurzen Schatz# suchen.^Ich warte!&Boris",
/*french*/ "Toi qui lit ce journal, rends-toi dans #[[1]]#. Et peut-être auras-tu droit à mon précieux #trésor#.^Je t'attends...&--Igor", /*french*/ "Toi qui lit ce journal, rends-toi dans #[[1]]#. Et peut-être auras-tu droit à mon précieux #trésor#.^Je t'attends...&--Igor",

View File

@@ -223,10 +223,7 @@ size_t Hint::GetNumberOfMessages() const {
if (StaticData::staticHintInfoMap.contains(ownKey)) { if (StaticData::staticHintInfoMap.contains(ownKey)) {
numMessages = std::max(StaticData::staticHintInfoMap[ownKey].hintKeys.size(), numMessages); numMessages = std::max(StaticData::staticHintInfoMap[ownKey].hintKeys.size(), numMessages);
} }
if (numMessages == 0) { return std::max(numMessages, (size_t)1);
numMessages = 1; // RANDOTODO make std::max actually fucking work for 3 arguments
}
return numMessages;
} }
const std::vector<std::string> Hint::GetAllMessageStrings(MessageFormat format) const { const std::vector<std::string> Hint::GetAllMessageStrings(MessageFormat format) const {
@@ -251,7 +248,6 @@ const HintText Hint::GetHintText(size_t id) const {
switch (hintType) { switch (hintType) {
case HINT_TYPE_HINT_KEY: case HINT_TYPE_HINT_KEY:
return StaticData::hintTextTable[0]; return StaticData::hintTextTable[0];
break;
case HINT_TYPE_TRIAL: case HINT_TYPE_TRIAL:
if (ctx->GetTrial(trials[0])->IsRequired()) { if (ctx->GetTrial(trials[0])->IsRequired()) {
return StaticData::hintTextTable[RHT_TRIAL_ON]; return StaticData::hintTextTable[RHT_TRIAL_ON];

View File

@@ -704,6 +704,7 @@ void Settings::CreateOptionDescriptions() {
"Talking to the chest game owner after buying a key will tell you the location of Greg the Green Rupee."; "Talking to the chest game owner after buying a key will tell you the location of Greg the Green Rupee.";
mOptionDescriptions[RSK_LOACH_HINT] = "Talking to the fishing pond owner and asking to talk about something will " mOptionDescriptions[RSK_LOACH_HINT] = "Talking to the fishing pond owner and asking to talk about something will "
"tell you what's the reward for the Hyrule Loach."; "tell you what's the reward for the Hyrule Loach.";
mOptionDescriptions[RSK_BOSS_KEY_HINT] = "Navi will tell where boss key can be found when prompted at boss door.";
mOptionDescriptions[RSK_SARIA_HINT] = "Talking to Saria either in person or through Saria's Song will tell you the " mOptionDescriptions[RSK_SARIA_HINT] = "Talking to Saria either in person or through Saria's Song will tell you the "
"location of a progressive magic meter."; "location of a progressive magic meter.";
mOptionDescriptions[RSK_MIDO_HINT] = "Talking to Mido as child will tell you the location of the Kokiri Sword."; mOptionDescriptions[RSK_MIDO_HINT] = "Talking to Mido as child will tell you the location of the Kokiri Sword.";

View File

@@ -4547,6 +4547,12 @@ typedef enum {
RH_GREG_RUPEE, RH_GREG_RUPEE,
RH_ALTAR_CHILD, RH_ALTAR_CHILD,
RH_ALTAR_ADULT, RH_ALTAR_ADULT,
RH_FOREST_BOSS_KEY_HINT,
RH_FIRE_BOSS_KEY_HINT,
RH_WATER_BOSS_KEY_HINT,
RH_SPIRIT_BOSS_KEY_HINT,
RH_SHADOW_BOSS_KEY_HINT,
RH_GANONS_BOSS_KEY_HINT,
RH_SARIA_HINT, RH_SARIA_HINT,
RH_MIDO_HINT, RH_MIDO_HINT,
RH_LOACH_HINT, RH_LOACH_HINT,
@@ -5813,6 +5819,7 @@ typedef enum {
RHT_GANONDORF_HINT_MS_ONLY, RHT_GANONDORF_HINT_MS_ONLY,
RHT_GANONDORF_HINT_LA_AND_MS, RHT_GANONDORF_HINT_LA_AND_MS,
RHT_SHEIK_HINT_LA_ONLY, RHT_SHEIK_HINT_LA_ONLY,
RHT_BOSS_KEY_HINT,
RHT_DAMPE_DIARY, RHT_DAMPE_DIARY,
RHT_GREG_HINT, RHT_GREG_HINT,
RHT_SARIA_TALK_HINT, RHT_SARIA_TALK_HINT,
@@ -6282,6 +6289,7 @@ typedef enum {
RSK_TOT_ALTAR_HINT, RSK_TOT_ALTAR_HINT,
RSK_GANONDORF_HINT, RSK_GANONDORF_HINT,
RSK_SHEIK_LA_HINT, RSK_SHEIK_LA_HINT,
RSK_BOSS_KEY_HINT,
RSK_DAMPES_DIARY_HINT, RSK_DAMPES_DIARY_HINT,
RSK_GREG_HINT, RSK_GREG_HINT,
RSK_LOACH_HINT, RSK_LOACH_HINT,

View File

@@ -1202,6 +1202,7 @@ void Settings::CreateOptions() {
OPT_BOOL(RSK_TOT_ALTAR_HINT, "ToT Altar Hint", {"Off", "On"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("AltarHint"), mOptionDescriptions[RSK_TOT_ALTAR_HINT], WIDGET_CVAR_CHECKBOX, RO_GENERIC_ON, false, nullptr, IMFLAG_INDENT); OPT_BOOL(RSK_TOT_ALTAR_HINT, "ToT Altar Hint", {"Off", "On"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("AltarHint"), mOptionDescriptions[RSK_TOT_ALTAR_HINT], WIDGET_CVAR_CHECKBOX, RO_GENERIC_ON, false, nullptr, IMFLAG_INDENT);
OPT_BOOL(RSK_GANONDORF_HINT, "Ganondorf Hint", {"Off", "On"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("GanondorfHint"), mOptionDescriptions[RSK_GANONDORF_HINT], WIDGET_CVAR_CHECKBOX, RO_GENERIC_ON, false, nullptr, IMFLAG_NONE); OPT_BOOL(RSK_GANONDORF_HINT, "Ganondorf Hint", {"Off", "On"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("GanondorfHint"), mOptionDescriptions[RSK_GANONDORF_HINT], WIDGET_CVAR_CHECKBOX, RO_GENERIC_ON, false, nullptr, IMFLAG_NONE);
OPT_BOOL(RSK_SHEIK_LA_HINT, "Sheik Light Arrow Hint", {"Off", "On"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("SheikLAHint"), mOptionDescriptions[RSK_SHEIK_LA_HINT], WIDGET_CVAR_CHECKBOX, RO_GENERIC_ON, false, nullptr, IMFLAG_NONE); OPT_BOOL(RSK_SHEIK_LA_HINT, "Sheik Light Arrow Hint", {"Off", "On"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("SheikLAHint"), mOptionDescriptions[RSK_SHEIK_LA_HINT], WIDGET_CVAR_CHECKBOX, RO_GENERIC_ON, false, nullptr, IMFLAG_NONE);
OPT_BOOL(RSK_BOSS_KEY_HINT, "Boss Door Hints", CVAR_RANDOMIZER_SETTING("BossKeyHint"), mOptionDescriptions[RSK_BOSS_KEY_HINT], IMFLAG_NONE);
OPT_BOOL(RSK_DAMPES_DIARY_HINT, "Dampe's Diary Hint", CVAR_RANDOMIZER_SETTING("DampeHint"), mOptionDescriptions[RSK_DAMPES_DIARY_HINT], IMFLAG_NONE); OPT_BOOL(RSK_DAMPES_DIARY_HINT, "Dampe's Diary Hint", CVAR_RANDOMIZER_SETTING("DampeHint"), mOptionDescriptions[RSK_DAMPES_DIARY_HINT], IMFLAG_NONE);
OPT_BOOL(RSK_GREG_HINT, "Greg the Green Rupee Hint", CVAR_RANDOMIZER_SETTING("GregHint"), mOptionDescriptions[RSK_GREG_HINT], IMFLAG_NONE); OPT_BOOL(RSK_GREG_HINT, "Greg the Green Rupee Hint", CVAR_RANDOMIZER_SETTING("GregHint"), mOptionDescriptions[RSK_GREG_HINT], IMFLAG_NONE);
OPT_BOOL(RSK_LOACH_HINT, "Hyrule Loach Hint", CVAR_RANDOMIZER_SETTING("LoachHint"), mOptionDescriptions[RSK_LOACH_HINT], IMFLAG_NONE); OPT_BOOL(RSK_LOACH_HINT, "Hyrule Loach Hint", CVAR_RANDOMIZER_SETTING("LoachHint"), mOptionDescriptions[RSK_LOACH_HINT], IMFLAG_NONE);
@@ -2409,32 +2410,19 @@ void Settings::CreateOptions() {
&mOptionGroups[RSG_MENU_SECTION_TRAPS] }, &mOptionGroups[RSG_MENU_SECTION_TRAPS] },
WidgetContainerType::COLUMN); WidgetContainerType::COLUMN);
mOptionGroups[RSG_MENU_SECTION_STATIC_HINTS] = OptionGroup::SubGroup( mOptionGroups[RSG_MENU_SECTION_STATIC_HINTS] = OptionGroup::SubGroup(
"Static Hints", "Static Hints", { &mOptions[RSK_TOT_ALTAR_HINT], &mOptions[RSK_GANONDORF_HINT],
{ &mOptions[RSK_TOT_ALTAR_HINT], &mOptions[RSK_SHEIK_LA_HINT], &mOptions[RSK_BOSS_KEY_HINT],
&mOptions[RSK_GANONDORF_HINT], &mOptions[RSK_DAMPES_DIARY_HINT], &mOptions[RSK_GREG_HINT],
&mOptions[RSK_SHEIK_LA_HINT], &mOptions[RSK_LOACH_HINT], &mOptions[RSK_SARIA_HINT],
&mOptions[RSK_DAMPES_DIARY_HINT], &mOptions[RSK_MIDO_HINT], &mOptions[RSK_FROGS_HINT],
&mOptions[RSK_GREG_HINT], &mOptions[RSK_OOT_HINT], &mOptions[RSK_BIGGORON_HINT],
&mOptions[RSK_LOACH_HINT], &mOptions[RSK_BIG_POES_HINT], &mOptions[RSK_CHICKENS_HINT],
&mOptions[RSK_SARIA_HINT], &mOptions[RSK_MALON_HINT], &mOptions[RSK_HBA_HINT],
&mOptions[RSK_MIDO_HINT], &mOptions[RSK_FISHING_POLE_HINT], &mOptions[RSK_WARP_SONG_HINTS],
&mOptions[RSK_FROGS_HINT], &mOptions[RSK_SCRUB_TEXT_HINT], &mOptions[RSK_MERCHANT_TEXT_HINT],
&mOptions[RSK_OOT_HINT], &mOptions[RSK_KAK_10_SKULLS_HINT], &mOptions[RSK_KAK_20_SKULLS_HINT],
&mOptions[RSK_BIGGORON_HINT], &mOptions[RSK_KAK_30_SKULLS_HINT], &mOptions[RSK_KAK_40_SKULLS_HINT],
&mOptions[RSK_BIG_POES_HINT], &mOptions[RSK_KAK_50_SKULLS_HINT], &mOptions[RSK_KAK_100_SKULLS_HINT],
&mOptions[RSK_CHICKENS_HINT],
&mOptions[RSK_MALON_HINT],
&mOptions[RSK_HBA_HINT],
&mOptions[RSK_FISHING_POLE_HINT],
&mOptions[RSK_WARP_SONG_HINTS],
&mOptions[RSK_SCRUB_TEXT_HINT],
&mOptions[RSK_MERCHANT_TEXT_HINT],
&mOptions[RSK_KAK_10_SKULLS_HINT],
&mOptions[RSK_KAK_20_SKULLS_HINT],
&mOptions[RSK_KAK_30_SKULLS_HINT],
&mOptions[RSK_KAK_40_SKULLS_HINT],
&mOptions[RSK_KAK_50_SKULLS_HINT],
&mOptions[RSK_KAK_100_SKULLS_HINT],
&mOptions[RSK_MASK_SHOP_HINT] }, &mOptions[RSK_MASK_SHOP_HINT] },
WidgetContainerType::SECTION, "This setting adds some hints at locations other than Gossip Stones."); WidgetContainerType::SECTION, "This setting adds some hints at locations other than Gossip Stones.");
mOptionGroups[RSG_MENU_COLUMN_STATIC_HINTS] = mOptionGroups[RSG_MENU_COLUMN_STATIC_HINTS] =
@@ -2702,6 +2690,7 @@ void Settings::CreateOptions() {
&mOptions[RSK_TOT_ALTAR_HINT], &mOptions[RSK_TOT_ALTAR_HINT],
&mOptions[RSK_GANONDORF_HINT], &mOptions[RSK_GANONDORF_HINT],
&mOptions[RSK_SHEIK_LA_HINT], &mOptions[RSK_SHEIK_LA_HINT],
&mOptions[RSK_BOSS_KEY_HINT],
&mOptions[RSK_DAMPES_DIARY_HINT], &mOptions[RSK_DAMPES_DIARY_HINT],
&mOptions[RSK_GREG_HINT], &mOptions[RSK_GREG_HINT],
&mOptions[RSK_LOACH_HINT], &mOptions[RSK_LOACH_HINT],

View File

@@ -70,6 +70,12 @@ std::unordered_map<uint32_t, CustomMessage> StaticData::hintNames = {
{ RH_GREG_RUPEE, CustomMessage("Treasure Chest Game Greg Hint") }, { RH_GREG_RUPEE, CustomMessage("Treasure Chest Game Greg Hint") },
{ RH_ALTAR_CHILD, CustomMessage("ToT Altar as Child") }, { RH_ALTAR_CHILD, CustomMessage("ToT Altar as Child") },
{ RH_ALTAR_ADULT, CustomMessage("ToT Altar as Adult") }, { RH_ALTAR_ADULT, CustomMessage("ToT Altar as Adult") },
{ RH_FOREST_BOSS_KEY_HINT, CustomMessage("Forest Temple Boss Key Hint") },
{ RH_FIRE_BOSS_KEY_HINT, CustomMessage("Fire Temple Boss Key Hint") },
{ RH_WATER_BOSS_KEY_HINT, CustomMessage("Water Temple Boss Key Hint") },
{ RH_SPIRIT_BOSS_KEY_HINT, CustomMessage("Spirit Temple Boss Key Hint") },
{ RH_SHADOW_BOSS_KEY_HINT, CustomMessage("Shadow Temple Boss Key Hint") },
{ RH_GANONS_BOSS_KEY_HINT, CustomMessage("Ganon's Boss Key Hint") },
{ RH_SARIA_HINT, CustomMessage("Saria's Magic Hint") }, { RH_SARIA_HINT, CustomMessage("Saria's Magic Hint") },
{ RH_MIDO_HINT, CustomMessage("Mido's Kokiri Sword Hint") }, { RH_MIDO_HINT, CustomMessage("Mido's Kokiri Sword Hint") },
{ RH_LOACH_HINT, CustomMessage("Loach Hint") }, { RH_LOACH_HINT, CustomMessage("Loach Hint") },
@@ -192,6 +198,12 @@ std::unordered_map<RandomizerHint, StaticHintInfo> StaticData::staticHintInfoMap
// warp song hints are special cased due to entrances not being done properly yet // warp song hints are special cased due to entrances not being done properly yet
// Ganondorf Joke is special cased as the text is random // Ganondorf Joke is special cased as the text is random
{RH_SHEIK_HINT, StaticHintInfo(HINT_TYPE_AREA, {RHT_SHEIK_HINT_LA_ONLY}, RSK_SHEIK_LA_HINT, true, {}, {RG_LIGHT_ARROWS}, {RC_SHEIK_HINT_GC, RC_SHEIK_HINT_MQ_GC}, true)}, {RH_SHEIK_HINT, StaticHintInfo(HINT_TYPE_AREA, {RHT_SHEIK_HINT_LA_ONLY}, RSK_SHEIK_LA_HINT, true, {}, {RG_LIGHT_ARROWS}, {RC_SHEIK_HINT_GC, RC_SHEIK_HINT_MQ_GC}, true)},
{RH_FOREST_BOSS_KEY_HINT, StaticHintInfo(HINT_TYPE_AREA, {RHT_BOSS_KEY_HINT}, RSK_BOSS_KEY_HINT, true, {}, {RG_FOREST_TEMPLE_BOSS_KEY}, {}, true)},
{RH_FIRE_BOSS_KEY_HINT, StaticHintInfo(HINT_TYPE_AREA, {RHT_BOSS_KEY_HINT}, RSK_BOSS_KEY_HINT, true, {}, {RG_FIRE_TEMPLE_BOSS_KEY}, {}, true)},
{RH_WATER_BOSS_KEY_HINT, StaticHintInfo(HINT_TYPE_AREA, {RHT_BOSS_KEY_HINT}, RSK_BOSS_KEY_HINT, true, {}, {RG_WATER_TEMPLE_BOSS_KEY}, {}, true)},
{RH_SPIRIT_BOSS_KEY_HINT, StaticHintInfo(HINT_TYPE_AREA, {RHT_BOSS_KEY_HINT}, RSK_BOSS_KEY_HINT, true, {}, {RG_SPIRIT_TEMPLE_BOSS_KEY}, {}, true)},
{RH_SHADOW_BOSS_KEY_HINT, StaticHintInfo(HINT_TYPE_AREA, {RHT_BOSS_KEY_HINT}, RSK_BOSS_KEY_HINT, true, {}, {RG_SHADOW_TEMPLE_BOSS_KEY}, {}, true)},
{RH_GANONS_BOSS_KEY_HINT, StaticHintInfo(HINT_TYPE_AREA, {RHT_BOSS_KEY_HINT}, RSK_BOSS_KEY_HINT, true, {}, {RG_GANONS_CASTLE_BOSS_KEY}, {}, true)},
{RH_DAMPES_DIARY, StaticHintInfo(HINT_TYPE_AREA, {RHT_DAMPE_DIARY}, RSK_DAMPES_DIARY_HINT, true, {}, {RG_PROGRESSIVE_HOOKSHOT}, {RC_DAMPE_HINT})}, {RH_DAMPES_DIARY, StaticHintInfo(HINT_TYPE_AREA, {RHT_DAMPE_DIARY}, RSK_DAMPES_DIARY_HINT, true, {}, {RG_PROGRESSIVE_HOOKSHOT}, {RC_DAMPE_HINT})},
{RH_GREG_RUPEE, StaticHintInfo(HINT_TYPE_AREA, {RHT_GREG_HINT}, RSK_GREG_HINT, true, {}, {RG_GREG_RUPEE}, {RC_GREG_HINT})}, {RH_GREG_RUPEE, StaticHintInfo(HINT_TYPE_AREA, {RHT_GREG_HINT}, RSK_GREG_HINT, true, {}, {RG_GREG_RUPEE}, {RC_GREG_HINT})},
{RH_SARIA_HINT, StaticHintInfo(HINT_TYPE_AREA, {RHT_SARIA_TALK_HINT, RHT_SARIA_SONG_HINT}, RSK_SARIA_HINT, true, {}, {RG_PROGRESSIVE_MAGIC_METER}, {RC_SARIA_SONG_HINT, RC_SONG_FROM_SARIA}, true)}, {RH_SARIA_HINT, StaticHintInfo(HINT_TYPE_AREA, {RHT_SARIA_TALK_HINT, RHT_SARIA_SONG_HINT}, RSK_SARIA_HINT, true, {}, {RG_PROGRESSIVE_MAGIC_METER}, {RC_SARIA_SONG_HINT, RC_SONG_FROM_SARIA}, true)},
@@ -211,8 +223,7 @@ std::unordered_map<RandomizerHint, StaticHintInfo> StaticData::staticHintInfoMap
{RH_KAK_40_SKULLS_HINT, StaticHintInfo(HINT_TYPE_ITEM, {RHT_SKULLS_HINT}, RSK_KAK_40_SKULLS_HINT, true, {RC_KAK_40_GOLD_SKULLTULA_REWARD}, {}, {}, false, 40)}, {RH_KAK_40_SKULLS_HINT, StaticHintInfo(HINT_TYPE_ITEM, {RHT_SKULLS_HINT}, RSK_KAK_40_SKULLS_HINT, true, {RC_KAK_40_GOLD_SKULLTULA_REWARD}, {}, {}, false, 40)},
{RH_KAK_50_SKULLS_HINT, StaticHintInfo(HINT_TYPE_ITEM, {RHT_SKULLS_HINT}, RSK_KAK_50_SKULLS_HINT, true, {RC_KAK_50_GOLD_SKULLTULA_REWARD}, {}, {}, false, 50)}, {RH_KAK_50_SKULLS_HINT, StaticHintInfo(HINT_TYPE_ITEM, {RHT_SKULLS_HINT}, RSK_KAK_50_SKULLS_HINT, true, {RC_KAK_50_GOLD_SKULLTULA_REWARD}, {}, {}, false, 50)},
{RH_KAK_100_SKULLS_HINT, StaticHintInfo(HINT_TYPE_ITEM, {RHT_SKULLS_HINT}, RSK_KAK_100_SKULLS_HINT, true, {RC_KAK_100_GOLD_SKULLTULA_REWARD}, {}, {}, false, 100)}, {RH_KAK_100_SKULLS_HINT, StaticHintInfo(HINT_TYPE_ITEM, {RHT_SKULLS_HINT}, RSK_KAK_100_SKULLS_HINT, true, {RC_KAK_100_GOLD_SKULLTULA_REWARD}, {}, {}, false, 100)},
{RH_MASK_SHOP_HINT, StaticHintInfo(HINT_TYPE_ITEM, {RHT_MASK_SHOP_HINT}, RSK_MASK_SHOP_HINT, true, {RC_DEKU_THEATER_SKULL_MASK, RC_DEKU_THEATER_MASK_OF_TRUTH}, {}, {RC_MASK_SHOP_HINT})} {RH_MASK_SHOP_HINT, StaticHintInfo(HINT_TYPE_ITEM, {RHT_MASK_SHOP_HINT}, RSK_MASK_SHOP_HINT, true, {RC_DEKU_THEATER_SKULL_MASK, RC_DEKU_THEATER_MASK_OF_TRUTH}, {}, {RC_MASK_SHOP_HINT})},
// clang-format on // clang-format on
}; };

View File

@@ -2451,6 +2451,31 @@ extern "C" int CustomMessage_RetrieveIfExists(PlayState* play) {
messageEntry = Randomizer_GetCustomGetItemMessage(player); messageEntry = Randomizer_GetCustomGetItemMessage(player);
} }
} }
} else if (textId == TEXT_NEED_SPECIAL_KEY && ctx->GetOption(RSK_BOSS_KEY_HINT)) {
auto 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;
}
if (rh != RH_NONE) {
messageEntry = ctx->GetHint(rh)->GetHintMessage(MF_AUTO_FORMAT);
}
} else if (textId == TEXT_RANDOMIZER_GOSSIP_STONE_HINTS && } else if (textId == TEXT_RANDOMIZER_GOSSIP_STONE_HINTS &&
Randomizer_GetSettingValue(RSK_GOSSIP_STONE_HINTS) != RO_GOSSIP_STONES_NONE && Randomizer_GetSettingValue(RSK_GOSSIP_STONE_HINTS) != RO_GOSSIP_STONES_NONE &&
(Randomizer_GetSettingValue(RSK_GOSSIP_STONE_HINTS) == RO_GOSSIP_STONES_NEED_NOTHING || (Randomizer_GetSettingValue(RSK_GOSSIP_STONE_HINTS) == RO_GOSSIP_STONES_NEED_NOTHING ||