Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
2ba85cb
Add necessary enums and structs for silver rupee shuffle
leggettc18 Feb 10, 2025
8739048
Add SilverRupeeIdentity to silver rupee actor
leggettc18 Feb 10, 2025
e80682e
Initial commit for ShuffleSilverRupees files.
leggettc18 Feb 10, 2025
1497d0e
Add Locations and Silver Counter class
leggettc18 Feb 11, 2025
728c317
Adds more of the actor update code to Silver Rupees
leggettc18 Feb 11, 2025
d0e6faf
Wire up silver rupee hook_handlers
leggettc18 Feb 12, 2025
c8b4e2e
Adds placeholder locations to area table.
leggettc18 Feb 13, 2025
478cd75
Makes silver rupee items work
leggettc18 Feb 15, 2025
228482d
Persist silver rupee items collected to save file
leggettc18 Feb 15, 2025
efffccc
Makes silver rupee trackers count and unlock puzzles.
leggettc18 Feb 15, 2025
485b3c2
Add necessary enums and structs for silver rupee shuffle
leggettc18 Feb 10, 2025
7daa7bd
Add SilverRupeeIdentity to silver rupee actor
leggettc18 Feb 10, 2025
249104f
Initial commit for ShuffleSilverRupees files.
leggettc18 Feb 10, 2025
d10a89c
Add Locations and Silver Counter class
leggettc18 Feb 11, 2025
bdbc263
Adds more of the actor update code to Silver Rupees
leggettc18 Feb 11, 2025
63f0c03
Wire up silver rupee hook_handlers
leggettc18 Feb 12, 2025
89b88fd
Adds placeholder locations to area table.
leggettc18 Feb 13, 2025
068e9ce
Makes silver rupee items work
leggettc18 Feb 15, 2025
e0ca535
Persist silver rupee items collected to save file
leggettc18 Feb 15, 2025
ceba178
Makes silver rupee trackers count and unlock puzzles.
leggettc18 Feb 15, 2025
5674661
Merge branch 'shuffle-silver-rupees' of github.com:leggettc18/Shipwri…
leggettc18 Sep 15, 2025
dd456d1
Merge branch 'develop' into shuffle-silver-rupees
leggettc18 Sep 16, 2025
45ba7c1
Implement the actual option for Silver Shuffle
leggettc18 Sep 17, 2025
6918dc2
Adds keysanity style options to silver shuffle.
leggettc18 Sep 17, 2025
70ca578
Location list cleanup, remove spoilerNames
leggettc18 Sep 17, 2025
e3b1ef9
Fix Silver Rupee related hints
leggettc18 Sep 18, 2025
bc992a4
Apply clang-formatting
leggettc18 Sep 18, 2025
499264b
Hopefully fix Linux builds.
leggettc18 Sep 18, 2025
fe0625d
Fix missing hint text for Bottom of the Well Silver Rupees
leggettc18 Sep 18, 2025
94c2032
Fix off by one bug on the silver rupee counters
leggettc18 Sep 19, 2025
e1df242
Adds save editor sliders for silver rupee counts
leggettc18 Sep 19, 2025
afb1d6c
Fixed option not enabling when Logic is switched to No Logic
leggettc18 Sep 19, 2025
3003161
Prevent some MQ Dungeon spoiling
leggettc18 Sep 19, 2025
93acd23
Adds Silver Rupees to ImGui Item Tracker
leggettc18 Sep 19, 2025
8a83e4b
Formatting bump
leggettc18 Sep 19, 2025
f25430e
Filter out MQ/Vanilla silver rupees in tracker
leggettc18 Sep 19, 2025
30c3086
Fix crash
leggettc18 Sep 20, 2025
2ee9999
First pass at Kaleido tracker entries
leggettc18 Sep 25, 2025
9b0b642
slightly more consistent truncation
leggettc18 Sep 25, 2025
e7c925a
Fix Mac build and format
leggettc18 Sep 25, 2025
744930a
Separates Grayscale from "Achieved"
leggettc18 Sep 25, 2025
6e43e63
Fixes coordinates typo
leggettc18 Sep 30, 2025
1bf88aa
Adds sparkles to the Silver Rupee items
leggettc18 Sep 30, 2025
6d376e9
Merge branch 'develop' into shuffle-silver-rupees
leggettc18 Oct 2, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions soh/soh/Enhancements/debugger/debugSaveEditor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1685,6 +1685,30 @@ void ResetBaseOptions() {
.Tooltip("");
}

void DrawRandomizerTab() {
auto ctx = OTRGlobals::Instance->gRandoContext;
ImGui::Text("Silver Rupee Counts");
if (ctx->GetOption(RSK_SHUFFLE_SILVER_RUPEES)) {
for (int32_t i = RG_SILVER_RUPEE_FIRST; i <= RG_SILVER_RUPEE_LAST; i++) {
RandomizerGet rgid = static_cast<RandomizerGet>(i);
int32_t collected = ctx->GetSilverRupeeCounter(rgid).GetCollected();
PushStyleSlider(THEME_COLOR);
if (UIWidgets::SliderInt(Rando::StaticData::RetrieveItem(rgid).GetName().GetEnglish().c_str(), &collected,
UIWidgets::IntSliderOptions()
.DefaultValue(0)
.Max(ctx->GetSilverRupeeCounter(rgid).GetTotal())
.Min(0)
.ShowButtons(true))) {
ctx->GetSilverRupeeCounter(rgid).SetCollected(collected);
}
PopStyleSlider();
}
} else {
ImGui::Text("Silver Rupees are not shuffled");
}
UIWidgets::PaddedSeparator();
}

void SaveEditorWindow::DrawElement() {
PushStyleTabs(THEME_COLOR);
ImGui::PushFont(OTRGlobals::Instance->fontMonoLarger);
Expand Down Expand Up @@ -1727,6 +1751,12 @@ void SaveEditorWindow::DrawElement() {
ImGui::EndTabItem();
}

ResetBaseOptions();
if (ImGui::BeginTabItem("Randomizer")) {
DrawRandomizerTab();
ImGui::EndTabItem();
}

ImGui::EndTabBar();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2257,6 +2257,27 @@ typedef enum {

// #### `result`
// ```c
// true
// ```
// #### `args`
// - `*EnGSwitch`
VB_SILVER_RUPEE_COLLECT,

// #### `result`
// ```c
// true
// ```
// #### `args`
// - `*EnGSwitch`
VB_SILVER_RUPEE_COUNT_CHECK,

// #### `result`
// ```c
// true
// ```
// #### `args`
// - `*EnGSwitch`
VB_SILVER_RUPEE_SETUP_DRAW,
// CVarGetInteger(CVAR_ENHANCEMENT("3DSceneRender"), 0)
// ```
// #### `args`
Expand Down
1 change: 1 addition & 0 deletions soh/soh/Enhancements/item-tables/ItemTableTypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ typedef enum GetItemCategory {
/* 0x03 */ ITEM_CATEGORY_SMALL_KEY,
/* 0x04 */ ITEM_CATEGORY_SKULLTULA_TOKEN,
/* 0x05 */ ITEM_CATEGORY_MAJOR,
/* 0x06 */ ITEM_CATEGORY_SILVER_RUPEE,
} GetItemCategory;

#define GET_ITEM(itemId, objectId, drawId, textId, field, chestAnim, itemCategory, modIndex, getItemId) \
Expand Down
87 changes: 83 additions & 4 deletions soh/soh/Enhancements/kaleido.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ extern PlayState* gPlayState;
#include "textures/icon_item_static/icon_item_static.h"
#include "consolevariablebridge.h"
#include "soh/Enhancements/cosmetics/cosmeticsTypes.h"
#include "soh/Enhancements/randomizer/dungeon.h"

#include <sstream>

Expand Down Expand Up @@ -75,7 +76,7 @@ void KaleidoEntryIcon::Draw(PlayState* play, std::vector<Gfx>* mEntryDl) {
G_MTX_PUSH | G_MTX_LOAD | G_MTX_MODELVIEW));

// icon
if (!mAchieved) {
if (mGrayscale) {
mEntryDl->push_back(gsDPSetGrayscaleColor(109, 109, 109, 255));
mEntryDl->push_back(gsSPGrayscale(true));
}
Expand Down Expand Up @@ -146,6 +147,18 @@ Kaleido::Kaleido() {
FlagType::FLAG_RANDOMIZER_INF, RAND_INF_GANON_SOUL, 0, yOffset, "Ganon's Soul"));
yOffset += 18;
}
if (ctx->GetOption(RSK_SHUFFLE_SILVER_RUPEES).Get() > RO_DUNGEON_ITEM_LOC_VANILLA) {
for (int i = RG_SILVER_RUPEE_FIRST; i <= RG_SILVER_RUPEE_LAST; i++) {
uint8_t dungeonId = ctx->GetSilverRupeeCounter(static_cast<RandomizerGet>(i)).DungeonID();
RandomizerCheckQuest dungeonQuest = ctx->GetDungeon(dungeonId)->IsMQ() ? RCQUEST_MQ : RCQUEST_VANILLA;
RandomizerCheckQuest rupeeQuest = ctx->GetSilverRupeeCounter(static_cast<RandomizerGet>(i)).Quest();
if (dungeonQuest == rupeeQuest) {
mEntries.push_back(
std::make_shared<KaleidoEntrySilverRupeeCounter>(static_cast<RandomizerGet>(i), 0, yOffset));
yOffset += 18;
}
}
}
}

extern "C" {
Expand Down Expand Up @@ -260,21 +273,28 @@ KaleidoEntryIconFlag::KaleidoEntryIconFlag(const char* iconResourceName, int ico

void KaleidoEntryIconFlag::Update(PlayState* play) {
mAchieved = GameInteractor::RawAction::CheckFlag(mFlagType, static_cast<int16_t>(mFlag));
mGrayscale = !mAchieved;
}

KaleidoEntryIconCountRequired::KaleidoEntryIconCountRequired(const char* iconResourceName, int iconFormat, int iconSize,
int iconWidth, int iconHeight, Color_RGBA8 iconColor,
int16_t x, int16_t y, int* watch, int required, int total)
: mWatch(watch), mRequired(required), mTotal(total),
KaleidoEntryIcon(iconResourceName, iconFormat, iconSize, iconWidth, iconHeight, iconColor, x, y) {
mCount = *mWatch;
if (mWatch != nullptr) {
mCount = *mWatch;
}
mAchieved = mCount >= mRequired;
mGrayscale = mCount == 0;
BuildText();
BuildVertices();
}

void KaleidoEntryIconCountRequired::BuildText() {
std::ostringstream totals;
totals << mCount;
if (mCount < mRequired) {
totals << mCount;
}
if (mRequired != 0 && mCount < mRequired) {
totals << '/' << mRequired;
}
Expand All @@ -284,6 +304,49 @@ void KaleidoEntryIconCountRequired::BuildText() {
mText = totals.str();
}

KaleidoEntrySilverRupeeCounter::KaleidoEntrySilverRupeeCounter(RandomizerGet rgid, int16_t x, int16_t y)
: mRgid(rgid), KaleidoEntryIconCountRequired(gRupeeCounterIconTex, G_IM_FMT_IA, G_IM_SIZ_8b, 16, 16,
Color_RGBA8{ 255, 255, 255, 255 }, x, y) {
mCount = OTRGlobals::Instance->gRandoContext->GetSilverRupeeCounter(mRgid).GetCollected();
mRequired = OTRGlobals::Instance->gRandoContext->GetSilverRupeeCounter(mRgid).GetTotal();
mAchieved = mCount >= mRequired;
mGrayscale = mCount == 0;
BuildText();
BuildVertices();
}

void KaleidoEntrySilverRupeeCounter::BuildText() {
KaleidoEntryIconCountRequired::BuildText();
CustomMessage name = CustomMessage(Rando::StaticData::RetrieveItem(mRgid).GetName());
// Abbreviate Dungeon Names
name.Replace("Spirit Temple", "SpT");
name.Replace("Shadow Temple", "ShT");
name.Replace("Bottom of the Well", "BotW");
name.Replace("Gerudo Training Grounds", "GTG");
name.Replace("Dodongo's Cavern", "DC");
name.Replace("Ice Cavern", "IC");
name.Replace("Ganon's Castle", "GC");
// Remove MQ to make spoilers less prevalent
name.Replace("MQ", "");
// Remove "Silver Rupee" from the name
name.Replace("Silver Rupee", "");
if (!mText.empty()) {
mText += " ";
}
mText += name.GetForCurrentLanguage();
}

void KaleidoEntrySilverRupeeCounter::Update(PlayState* play) {
int newCount = OTRGlobals::Instance->gRandoContext->GetSilverRupeeCounter(mRgid).GetCollected();
if (mCount != newCount) {
mCount = newCount;
BuildText();
RebuildVertices();
mAchieved = mCount >= mRequired;
mGrayscale = mCount == 0;
}
}

void KaleidoEntryIcon::BuildVertices() {
int offsetY = 0;
int offsetX = 0;
Expand All @@ -294,6 +357,19 @@ void KaleidoEntryIcon::BuildVertices() {
offsetX += 18;
for (size_t i = 0; i < mText.length(); i++) {
int charWidth = static_cast<int>(Ship_GetCharFontWidth(mText[i]));
if ((offsetX + charWidth) > 220) {
offsetX -= Ship_GetCharFontWidth(mText[i - 1]);
offsetX -= Ship_GetCharFontWidth(mText[i - 2]);
mText = mText.substr(0, i - 2) + "...";
int periodWidth = Ship_GetCharFontWidth('.');
Ship_CreateQuadVertexGroup(&(vertices)[(i - 1) * 4], offsetX, offsetY, periodWidth, 16, 0);
offsetX += periodWidth;
Ship_CreateQuadVertexGroup(&(vertices)[(i)*4], offsetX, offsetY, periodWidth, 16, 0);
offsetX += periodWidth;
Ship_CreateQuadVertexGroup(&(vertices)[(i + 1) * 4], offsetX, offsetY, periodWidth, 16, 0);
offsetX += periodWidth;
break;
}
Ship_CreateQuadVertexGroup(&(vertices)[(i + 1) * 4], offsetX, offsetY, charWidth, 16, 0);
offsetX += charWidth;
}
Expand Down Expand Up @@ -326,6 +402,7 @@ void KaleidoEntryIconCountRequired::Update(PlayState* play) {
BuildText();
RebuildVertices();
mAchieved = mCount >= mRequired;
mGrayscale = mCount == 0;
}
}

Expand Down Expand Up @@ -381,11 +458,13 @@ void KaleidoEntryOcarinaButtons::Update(PlayState* play) {
mButtonCollected[4] = GameInteractor::RawAction::CheckFlag(FLAG_RANDOMIZER_INF, RAND_INF_HAS_OCARINA_C_RIGHT) > 0;
CalculateColors();
mAchieved = false;
mGrayscale = true;
for (int i = 0; i < mButtonCollected.size(); i++) {
if (!mButtonCollected[i]) {
mButtonColors[i] = Color_RGBA8{ 109, 109, 109, 255 };
} else {
mAchieved = true;
mGrayscale = false;
}
}
}
Expand All @@ -406,7 +485,7 @@ void KaleidoEntryOcarinaButtons::Draw(PlayState* play, std::vector<Gfx>* mEntryD
G_MTX_PUSH | G_MTX_LOAD | G_MTX_MODELVIEW));

// icon
if (!mAchieved) {
if (mGrayscale) {
mEntryDl->push_back(gsDPSetGrayscaleColor(109, 109, 109, 255));
mEntryDl->push_back(gsSPGrayscale(true));
}
Expand Down
18 changes: 15 additions & 3 deletions soh/soh/Enhancements/kaleido.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ class KaleidoEntry {
Vtx* vtx;
std::string mText;
bool mAchieved = false;
bool mGrayscale = true;
};

/**
Expand Down Expand Up @@ -128,17 +129,28 @@ class KaleidoEntryIconCountRequired : public KaleidoEntryIcon {
* @param total The amount of this collectible available in the seed. Set to 0 to not render.
*/
KaleidoEntryIconCountRequired(const char* iconResourceName, int iconFormat, int iconSize, int iconWidth,
int iconHeight, Color_RGBA8 iconColor, int16_t x, int16_t y, int* watch,
int iconHeight, Color_RGBA8 iconColor, int16_t x, int16_t y, int* watch = nullptr,
int required = 0, int total = 0);
void Update(PlayState* play) override;
void BuildText();

protected:
int mRequired;
int mCount;

private:
int* mWatch;
int mRequired;
int mTotal;
int mCount;
};

class KaleidoEntrySilverRupeeCounter : public KaleidoEntryIconCountRequired {
public:
KaleidoEntrySilverRupeeCounter(RandomizerGet rgid, int16_t x, int16_t y);
void Update(PlayState* play) override;
void BuildText();

private:
RandomizerGet mRgid;
};

class KaleidoEntryOcarinaButtons : public KaleidoEntryIcon {
Expand Down
17 changes: 17 additions & 0 deletions soh/soh/Enhancements/randomizer/3drando/fill.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1066,6 +1066,13 @@ static void RandomizeOwnDungeon(const Rando::DungeonInfo* dungeon) {
AddElementsToPool(dungeonItems, dungeonBossKey);
}

// randomize Silver Rupees
if (ctx->GetOption(RSK_SHUFFLE_SILVER_RUPEES).Is(RO_DUNGEON_ITEM_LOC_OWN_DUNGEON)) {
auto dungeonSilverRupees = FilterAndEraseFromPool(
ItemPool, [dungeon](const RandomizerGet i) { return dungeon->ContainsSilverRupee(i); });
AddElementsToPool(dungeonItems, dungeonSilverRupees);
}

// randomize boss key and small keys together for even distribution
AssumedFill(dungeonItems, dungeonLocations);

Expand Down Expand Up @@ -1131,6 +1138,16 @@ static void RandomizeDungeonItems() {
FilterAndEraseFromPool(ItemPool, [](const auto i) { return i == RG_GANONS_CASTLE_BOSS_KEY; });
AddElementsToPool(overworldItems, ganonBossKey);
}

if (ctx->GetOption(RSK_SHUFFLE_SILVER_RUPEES).Is(RO_DUNGEON_ITEM_LOC_ANY_DUNGEON)) {
auto silverRupees = FilterAndEraseFromPool(
ItemPool, [dungeon](const RandomizerGet i) { return dungeon->ContainsSilverRupee(i); });
AddElementsToPool(anyDungeonItems, silverRupees);
} else if (ctx->GetOption(RSK_SHUFFLE_SILVER_RUPEES).Is(RO_DUNGEON_ITEM_LOC_OVERWORLD)) {
auto silverRupees = FilterAndEraseFromPool(
ItemPool, [dungeon](const RandomizerGet i) { return dungeon->ContainsSilverRupee(i); });
AddElementsToPool(overworldItems, silverRupees);
}
}

if (ctx->GetOption(RSK_GERUDO_KEYS).Is(RO_GERUDO_KEYS_ANY_DUNGEON)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2225,6 +2225,28 @@ void StaticData::HintTable_Init_Exclude_Dungeon() {
/*german*/ "Man erzählt sich, daß ein #Herz in Ganons Schloß# #[[1]]# verstecke.",
/*french*/ "Selon moi, un #coeur dans le Château de Ganon# cache #[[1]]#.", {QM_RED, QM_GREEN}));

hintTextTable[RHT_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE] = HintText(CustomMessage("They say that #spinning blades in Ice Cavern# protect #[[1]]#.", {QM_RED, QM_GREEN}));
hintTextTable[RHT_ICE_CAVERN_SLIDING_SILVER_RUPEE] = HintText(CustomMessage("They say that a #freezing slippery room# hides #[[1]]#.", {QM_RED, QM_GREEN}));
hintTextTable[RHT_BOTTOM_OF_THE_WELL_BASEMENT_SILVER_RUPEE] = HintText(CustomMessage("They say that the #Bottom of the well acid pit# protects #[[1]]#.", {QM_RED, QM_GREEN}));
hintTextTable[RHT_GERUDO_TRAINING_GROUND_BOULDER_SILVER_RUPEE] = HintText(CustomMessage("They say that a #timed boulder maze# guards #[[1]]#.", {QM_RED, QM_GREEN}));
hintTextTable[RHT_GERUDO_TRAINING_GROUND_LAVA_SILVER_RUPEE] = HintText(CustomMessage("They say that #a pillar rising out of lava in the desert# holds #[[1]]#.", {QM_RED, QM_GREEN}));
hintTextTable[RHT_GERUDO_TRAINING_GROUND_TOILET_SILVER_RUPEE] = HintText(CustomMessage("They say that a #whirlpool in the desert# guards #[[1]]#.", {QM_RED, QM_GREEN}));
hintTextTable[RHT_SPIRIT_GATE_SILVER_RUPEE] = HintText(CustomMessage("They say that a #gate in the Spirit Temple# protects #[[1]]#.", {QM_RED, QM_GREEN}));
hintTextTable[RHT_SPIRIT_BEAMOS_SILVER_RUPEE] = HintText(CustomMessage("They say that #Beamos in the Spirit Temple# guard #[[1]]# from a #child#.", {QM_RED, QM_GREEN, QM_LBLUE}));
hintTextTable[RHT_SPIRIT_BOULDER_SILVER_RUPEE] = HintText(CustomMessage("They say that #boulders in the Spirit Temple# guard #[[1]]#.", {QM_RED, QM_GREEN}));
hintTextTable[RHT_SPIRIT_LOBBY_SILVER_RUPEE] = HintText(CustomMessage("They say that #in the first room of the Spirit Temple#, #[[1]]# can be found.", {QM_RED, QM_GREEN}));
hintTextTable[RHT_SHADOW_SPINNING_SCYTHE_SILVER_RUPEE] = HintText(CustomMessage("They say that #visible spinning scythes in the Shadow Temple# guard #[[1]]#.", {QM_RED, QM_GREEN}));
hintTextTable[RHT_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE] = HintText(CustomMessage("They say that #outside the door to falling spikes in the Shadow Temple#, #[[1]]# can be found.", {QM_RED, QM_GREEN}));
hintTextTable[RHT_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE] = HintText(CustomMessage("They say that #invisible spikes in the Shadow Temple# guard #[[1]]#.", {QM_RED, QM_GREEN}));
hintTextTable[RHT_FOREST_TRIAL_SILVER_RUPEE] = HintText(CustomMessage("They say that #a trial of the forest# guards #[[1]]#.", {QM_RED, QM_GREEN}));
hintTextTable[RHT_FIRE_TRIAL_SILVER_RUPEE] = HintText(CustomMessage("They say that #a trial of fire# guards #[[1]]#.", {QM_RED, QM_GREEN}));
hintTextTable[RHT_WATER_TRIAL_SILVER_RUPEE] = HintText(CustomMessage("They say that #a trial of water# guards #[[1]]#.", {QM_RED, QM_GREEN}));
hintTextTable[RHT_SPIRIT_TRIAL_SILVER_RUPEE] = HintText(CustomMessage("They say that #a trial of the spirit# guards #[[1]]#.", {QM_RED, QM_GREEN}));
hintTextTable[RHT_SHADOW_TRIAL_SILVER_RUPEE] = HintText(CustomMessage("They say that #a trial of the shadows# guards #[[1]]#.", {QM_RED, QM_GREEN}));
hintTextTable[RHT_LIGHT_TRIAL_SILVER_RUPEE] = HintText(CustomMessage("They say that #a trial of light# guards #[[1]]#.", {QM_RED, QM_GREEN}));
hintTextTable[RHT_DODONGOS_CAVERN_SILVER_RUPEE] = HintText(CustomMessage("They say that #around a collapsible staircase#, #[[1]]# can be found.", {QM_RED, QM_GREEN}));
hintTextTable[RHT_SHADOW_INVISIBLE_SCYTHE_SILVER_RUPEE] = HintText(CustomMessage("They say that #invisible scythes in the Shadow Temple# guard #[[1]]#.", {QM_RED, QM_GREEN}));

// clang-format on
}
} // namespace Rando
Original file line number Diff line number Diff line change
Expand Up @@ -2117,6 +2117,16 @@ void StaticData::HintTable_Init_Item() {

hintTextTable[RHT_WALLET_INF] = HintText(CustomMessage("an infinite Wallet", /*german*/"die unendliche Geldbörse", /*french*/"une Bourse sans fond"));

hintTextTable[RHT_DC_SILVER_RUPEE] = HintText(CustomMessage("a Dodongo's Cavern Silver Rupee"));
hintTextTable[RHT_BOTTOM_OF_THE_WELL_SILVER_RUPEE] = HintText(CustomMessage("a Bottom of the Well Silver Rupee"));
hintTextTable[RHT_ICE_CAVERN_SILVER_RUPEE] = HintText(CustomMessage("an Ice Cavern Silver Rupee"));
hintTextTable[RHT_BOTTOM_OF_THE_WELL] = HintText(CustomMessage("a Bottom of the Well Silver Rupee"));
hintTextTable[RHT_GERUDO_TRAINING_GROUND_SILVER_RUPEE] = HintText(CustomMessage("a Gerudo Training Ground Silver Rupee"));
hintTextTable[RHT_SPIRIT_TEMPLE_SILVER_RUPEE] = HintText(CustomMessage("a Spirit Temple Silver Rupee"));
hintTextTable[RHT_SHADOW_TEMPLE_SILVER_RUPEE] = HintText(CustomMessage("a Shadow Temple Silver Rupee"));
hintTextTable[RHT_GANONS_CASTLE_SILVER_RUPEE] = HintText(CustomMessage("a Ganon's Castle Silver Rupee"));
hintTextTable[RHT_BOTTOMLESS_SILVER_RUPEE_POUCH] = HintText(CustomMessage("a pouch full of Silver Rupees"));

hintTextTable[RHT_EPONA] = HintText(CustomMessage("Epona", /*german*/"Epona", /*french*/"Epona"),
// /*spanish*/a Epona
{
Expand Down
Loading
Loading