diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp index 463f900e0d4..ed5bae40e1a 100644 --- a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp @@ -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(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); @@ -1727,6 +1751,12 @@ void SaveEditorWindow::DrawElement() { ImGui::EndTabItem(); } + ResetBaseOptions(); + if (ImGui::BeginTabItem("Randomizer")) { + DrawRandomizerTab(); + ImGui::EndTabItem(); + } + ImGui::EndTabBar(); } diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index cc32829b731..9f487184b5e 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -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` diff --git a/soh/soh/Enhancements/item-tables/ItemTableTypes.h b/soh/soh/Enhancements/item-tables/ItemTableTypes.h index df59d67704a..8a45e0af57d 100644 --- a/soh/soh/Enhancements/item-tables/ItemTableTypes.h +++ b/soh/soh/Enhancements/item-tables/ItemTableTypes.h @@ -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) \ diff --git a/soh/soh/Enhancements/kaleido.cpp b/soh/soh/Enhancements/kaleido.cpp index eef19b49520..e3327b5accb 100644 --- a/soh/soh/Enhancements/kaleido.cpp +++ b/soh/soh/Enhancements/kaleido.cpp @@ -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 @@ -75,7 +76,7 @@ void KaleidoEntryIcon::Draw(PlayState* play, std::vector* 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)); } @@ -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(i)).DungeonID(); + RandomizerCheckQuest dungeonQuest = ctx->GetDungeon(dungeonId)->IsMQ() ? RCQUEST_MQ : RCQUEST_VANILLA; + RandomizerCheckQuest rupeeQuest = ctx->GetSilverRupeeCounter(static_cast(i)).Quest(); + if (dungeonQuest == rupeeQuest) { + mEntries.push_back( + std::make_shared(static_cast(i), 0, yOffset)); + yOffset += 18; + } + } + } } extern "C" { @@ -260,6 +273,7 @@ KaleidoEntryIconFlag::KaleidoEntryIconFlag(const char* iconResourceName, int ico void KaleidoEntryIconFlag::Update(PlayState* play) { mAchieved = GameInteractor::RawAction::CheckFlag(mFlagType, static_cast(mFlag)); + mGrayscale = !mAchieved; } KaleidoEntryIconCountRequired::KaleidoEntryIconCountRequired(const char* iconResourceName, int iconFormat, int iconSize, @@ -267,14 +281,20 @@ KaleidoEntryIconCountRequired::KaleidoEntryIconCountRequired(const char* iconRes 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; } @@ -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; @@ -294,6 +357,19 @@ void KaleidoEntryIcon::BuildVertices() { offsetX += 18; for (size_t i = 0; i < mText.length(); i++) { int charWidth = static_cast(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; } @@ -326,6 +402,7 @@ void KaleidoEntryIconCountRequired::Update(PlayState* play) { BuildText(); RebuildVertices(); mAchieved = mCount >= mRequired; + mGrayscale = mCount == 0; } } @@ -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; } } } @@ -406,7 +485,7 @@ void KaleidoEntryOcarinaButtons::Draw(PlayState* play, std::vector* 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)); } diff --git a/soh/soh/Enhancements/kaleido.h b/soh/soh/Enhancements/kaleido.h index 7776afb6631..d298dbeb108 100644 --- a/soh/soh/Enhancements/kaleido.h +++ b/soh/soh/Enhancements/kaleido.h @@ -39,6 +39,7 @@ class KaleidoEntry { Vtx* vtx; std::string mText; bool mAchieved = false; + bool mGrayscale = true; }; /** @@ -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 { diff --git a/soh/soh/Enhancements/randomizer/3drando/fill.cpp b/soh/soh/Enhancements/randomizer/3drando/fill.cpp index fe0ab514bf8..83a21e90e00 100644 --- a/soh/soh/Enhancements/randomizer/3drando/fill.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/fill.cpp @@ -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); @@ -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)) { diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp index aa375716f68..fb17f6e5b81 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp @@ -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 diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp index c74c0ff23b9..9589c737cba 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp @@ -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 { diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index 28f05010eac..199e4d77c13 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -1232,6 +1232,67 @@ void GenerateItemPool() { ctx->possibleIceTrapModels.push_back(RG_BIGGORON_SWORD); } + // Add Silver Rupees to the pool if the setting is not on Start With or Vanilla + if (ctx->GetOption(RSK_SHUFFLE_SILVER_RUPEES).Get() > RO_DUNGEON_ITEM_LOC_VANILLA) { + std::vector silversToAdd; + if (ctx->GetDungeon(Rando::ICE_CAVERN)->IsVanilla()) { + silversToAdd.push_back(RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE); + silversToAdd.push_back(RG_ICE_CAVERN_SLIDING_SILVER_RUPEE); + } + if (ctx->GetDungeon(Rando::BOTTOM_OF_THE_WELL)->IsVanilla()) { + silversToAdd.push_back(RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE); + } + if (ctx->GetDungeon(Rando::GERUDO_TRAINING_GROUND)->IsVanilla()) { + silversToAdd.push_back(RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE); + silversToAdd.push_back(RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE); + silversToAdd.push_back(RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE); + } else { + silversToAdd.push_back(RG_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE); + silversToAdd.push_back(RG_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE); + silversToAdd.push_back(RG_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE); + } + if (ctx->GetDungeon(Rando::SPIRIT_TEMPLE)->IsVanilla()) { + silversToAdd.push_back(RG_SPIRIT_GATE_SILVER_RUPEE); + silversToAdd.push_back(RG_SPIRIT_BEAMOS_SILVER_RUPEE); + silversToAdd.push_back(RG_SPIRIT_BOULDER_SILVER_RUPEE); + } else { + silversToAdd.push_back(RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE); + } + if (ctx->GetDungeon(Rando::SHADOW_TEMPLE)->IsVanilla()) { + silversToAdd.push_back(RG_SHADOW_SCYTHE_SILVER_RUPEE); + silversToAdd.push_back(RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE); + silversToAdd.push_back(RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE); + } else { + silversToAdd.push_back(RG_SHADOW_MQ_SCYTHE_SILVER_RUPEE); + silversToAdd.push_back(RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE); + silversToAdd.push_back(RG_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE); + silversToAdd.push_back(RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE); + } + if (ctx->GetDungeon(Rando::GANONS_CASTLE)->IsVanilla()) { + silversToAdd.push_back(RG_FOREST_TRIAL_SILVER_RUPEE); + silversToAdd.push_back(RG_FIRE_TRIAL_SILVER_RUPEE); + silversToAdd.push_back(RG_SPIRIT_TRIAL_SILVER_RUPEE); + silversToAdd.push_back(RG_LIGHT_TRIAL_SILVER_RUPEE); + } else { + silversToAdd.push_back(RG_FIRE_TRIAL_MQ_SILVER_RUPEE); + silversToAdd.push_back(RG_WATER_TRIAL_MQ_SILVER_RUPEE); + silversToAdd.push_back(RG_SHADOW_TRIAL_MQ_SILVER_RUPEE); + } + for (auto rgid : silversToAdd) { + AddItemToMainPool(rgid, ctx->GetSilverRupeeCounter(rgid).GetTotal()); + } + } + + if (ctx->GetOption(RSK_BOTTOMLESS_SILVER_RUPEE_POUCH)) { + AddItemToMainPool(RG_BOTTOMLESS_SILVER_RUPEE_POUCH); + } + + if (ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_PLENTIFUL)) { + if (ctx->GetOption(RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD)) { + AddItemToPool(PendingJunkPool, RG_GERUDO_MEMBERSHIP_CARD); + } + } + // Replace ice traps with junk from the pending junk pool if necessary if (ctx->GetOption(RSK_ICE_TRAPS).Is(RO_ICE_TRAPS_OFF)) { ReplaceMaxItem(RG_ICE_TRAP, 0); diff --git a/soh/soh/Enhancements/randomizer/3drando/starting_inventory.cpp b/soh/soh/Enhancements/randomizer/3drando/starting_inventory.cpp index dda37b18a15..69b85a3e8cd 100644 --- a/soh/soh/Enhancements/randomizer/3drando/starting_inventory.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/starting_inventory.cpp @@ -65,6 +65,13 @@ void GenerateStartingInventory() { AddItemToInventory(RG_GERUDO_MEMBERSHIP_CARD); } + if (ctx->GetOption(RSK_SHUFFLE_SILVER_RUPEES).Is(RO_DUNGEON_ITEM_LOC_STARTWITH)) { + for (int i = RG_SILVER_RUPEE_FIRST; i <= RG_SILVER_RUPEE_LAST; i++) { + ctx->GetSilverRupeeCounter(static_cast(i)) + .IncrementCollected(ctx->GetSilverRupeeCounter(static_cast(i)).GetTotal()); + } + } + // Starting Inventory Menu // Values are associated so that the count of items matches the index of // the option selected. If None is selected, the value will be zero and diff --git a/soh/soh/Enhancements/randomizer/ShuffleSilverRupees.cpp b/soh/soh/Enhancements/randomizer/ShuffleSilverRupees.cpp new file mode 100644 index 00000000000..ad3f8679c91 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/ShuffleSilverRupees.cpp @@ -0,0 +1,1010 @@ +#include "ShuffleSilverRupees.h" +#include "static_data.h" +#include +#include "draw.h" +#include + +extern "C" { +#include "variables.h" +#include "overlays/actors/ovl_En_G_Switch/z_en_g_switch.h" +#include +extern PlayState* gPlayState; +} + +CustomMessage GetSilverRupeeItemMessage(uint16_t rgid) { + CustomMessage messageEntry; + if (rgid >= RG_SILVER_RUPEE_FIRST && rgid <= RG_SILVER_RUPEE_LAST) { + messageEntry = + CustomMessageManager::Instance->RetrieveMessage(Randomizer::getItemMessageTableID, RG_SILVER_RUPEE_FIRST); + auto ctx = OTRGlobals::Instance->gRandoContext; + bool complete = ctx->GetSilverRupeeCounter(static_cast(rgid)).AllCollected(); + if (complete) { + messageEntry.Replace("[[count_text]]", "That's all of them"); + } else { + int srCount = ctx->GetSilverRupeeCounter(static_cast(rgid)).GetCollected() + 1; + messageEntry.Replace("[[count_text]]", CustomMessage("You have collected %g[[count]]%w of them so far")); + messageEntry.Replace("[[count]]", std::to_string(srCount)); + } + messageEntry.Replace( + "[[rupee_name]]", + CustomMessage(Rando::StaticData::RetrieveItem(static_cast(rgid)).GetName())); + // Remove the "MQ" text from the item name to avoid *some* MQ dungeon spoiling. + messageEntry.Replace(" MQ", CustomMessage("")); + messageEntry.AutoFormat(); + } + return messageEntry; +} + +extern "C" void EnGSwitch_RandomizerDraw(Actor* thisx, PlayState* play) { + EnGSwitch* srActor = reinterpret_cast(thisx); + Matrix_Push(); + Matrix_Scale(17.5f, 17.5f, 17.5f, MTXMODE_APPLY); + if (srActor->type == ENGSWITCH_SILVER_RUPEE) { + if (CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MysteriousShuffle"), 0)) { + EnItem00_CustomItemsParticles(thisx, play, GET_ITEM_MYSTERY); + GetItemEntry_Draw(play, GET_ITEM_MYSTERY); + } else { + SilverRupeeIdentity* srIdentity = ObjectExtension::GetInstance().Get(srActor); + EnItem00_CustomItemsParticles(thisx, play, srIdentity->itemEntry); + GetItemEntry_Draw(play, srIdentity->itemEntry); + } + Matrix_Pop(); + } +} + +SilverRupeeIdentity IdentifySilverRupee(Vec3f_ pos) { + SilverRupeeIdentity srIdentity; + uint16_t sceneNum = gPlayState->sceneNum; + int16_t param1 = (int16_t)pos.x; + int16_t param2 = (int16_t)pos.z; + // Two particular silver rupees in Master Quest Shadow Temple have + // the same X and Z coordinates. We have to make an exception here + // and look them up by X and Y coordinates instead. + if (sceneNum == SCENE_SHADOW_TEMPLE && param1 == 2110 && param2 == 3372) { + param2 = (int16_t)pos.y; + } + Rando::Location* location = OTRGlobals::Instance->gRandomizer->GetCheckObjectFromActor( + ACTOR_EN_G_SWITCH, sceneNum, TWO_ACTOR_PARAMS(param1, param2)); + if (location->GetRandomizerCheck() == RC_UNKNOWN_CHECK) { + LUSLOG_WARN("SilverRupeeIdentity did not receive a valid RC value (%d).", location->GetRandomizerCheck()); + assert(false); + } else { + srIdentity.index.randomizerCheck = location->GetRandomizerCheck(); + srIdentity.itemEntry = + OTRGlobals::Instance->gRandoContext->GetFinalGIEntry(srIdentity.index.randomizerCheck, true, GI_NONE); + srIdentity.randomizerInf = static_cast(location->GetCollectionCheck().flag); + } + return srIdentity; +} + +std::unordered_map Rando::StaticData::silverTrackerMap = { + { { SCENE_ICE_CAVERN, RCQUEST_VANILLA, 328 }, RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE }, + { { SCENE_ICE_CAVERN, RCQUEST_VANILLA, 329 }, RG_ICE_CAVERN_SLIDING_SILVER_RUPEE }, + { { SCENE_BOTTOM_OF_THE_WELL, RCQUEST_VANILLA, 351 }, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE }, + { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_VANILLA, 348 }, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE }, + { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_VANILLA, 332 }, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE }, + { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_VANILLA, 347 }, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE }, + { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, 325 }, RG_SPIRIT_GATE_SILVER_RUPEE }, + { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, 330 }, RG_SPIRIT_BEAMOS_SILVER_RUPEE }, + { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, 322 }, RG_SPIRIT_BOULDER_SILVER_RUPEE }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_VANILLA, 321 }, RG_SHADOW_SCYTHE_SILVER_RUPEE }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_VANILLA, 329 }, RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_VANILLA, 328 }, RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_VANILLA, 334 }, RG_FOREST_TRIAL_SILVER_RUPEE }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_VANILLA, 329 }, RG_FIRE_TRIAL_SILVER_RUPEE }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_VANILLA, 331 }, RG_SPIRIT_TRIAL_SILVER_RUPEE }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_VANILLA, 338 }, RG_LIGHT_TRIAL_SILVER_RUPEE }, + // MQ + { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_MQ, 348 }, RG_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE }, + { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_MQ, 396 }, RG_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE }, + { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_MQ, 219 }, RG_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE }, + { { SCENE_DODONGOS_CAVERN, RCQUEST_MQ, 357 }, RG_DODONGOS_CAVERN_MQ_SILVER_RUPEE }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, 321 }, RG_SHADOW_MQ_SCYTHE_SILVER_RUPEE }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, 643 }, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, 337 }, RG_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, 648 }, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE }, + { { SCENE_SPIRIT_TEMPLE, RCQUEST_MQ, 375 }, RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_MQ, 322 }, RG_WATER_TRIAL_MQ_SILVER_RUPEE }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_MQ, 331 }, RG_SHADOW_TRIAL_MQ_SILVER_RUPEE }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_MQ, 321 }, RG_FIRE_TRIAL_MQ_SILVER_RUPEE }, +}; + +void EnGSwitch_RandomizerInit(void* actor) { + EnGSwitch* srActor = static_cast(actor); + SilverRupeeIdentity srIdentity; + if (srActor->type == ENGSWITCH_SILVER_RUPEE) { + srIdentity = IdentifySilverRupee(srActor->actor.world.pos); + if (Flags_GetRandomizerInf(srIdentity.randomizerInf)) { + Actor_Kill(&srActor->actor); + } + ObjectExtension::GetInstance().Set(actor, std::move(srIdentity)); + } else if (srActor->type == ENGSWITCH_SILVER_TRACKER) { + Rando::Identifier identifier = { static_cast(gPlayState->sceneNum), + ResourceMgr_IsSceneMasterQuest(gPlayState->sceneNum) ? RCQUEST_MQ + : RCQUEST_VANILLA, + srActor->actor.params }; + srIdentity.index.randomizerGet = Rando::StaticData::silverTrackerMap.at(identifier); + ObjectExtension::GetInstance().Set(actor, std::move(srIdentity)); + } else { + LUSLOG_INFO("EnGSwitch Actor Type %d, no Randomizer logic required", srActor->type); + } +} + +void RegisterShuffleSilverRupees() { + bool shouldRegister = IS_RANDO && RAND_GET_OPTION(RSK_SHUFFLE_SILVER_RUPEES); + + COND_ID_HOOK(OnActorInit, ACTOR_EN_G_SWITCH, shouldRegister, EnGSwitch_RandomizerInit); + COND_VB_SHOULD(VB_SILVER_RUPEE_COLLECT, shouldRegister, { + EnGSwitch* srActor = va_arg(args, EnGSwitch*); + SilverRupeeIdentity* srIdentity = ObjectExtension::GetInstance().Get(srActor); + Flags_SetRandomizerInf(srIdentity->randomizerInf); + Actor_Kill(&srActor->actor); + *should = false; + }); + COND_VB_SHOULD(VB_SILVER_RUPEE_COUNT_CHECK, shouldRegister, { + EnGSwitch* srActor = va_arg(args, EnGSwitch*); + SilverRupeeIdentity* srIdentity = ObjectExtension::GetInstance().Get(srActor); + // check if all silver rupees for that room have been collected + // we run this every frame in case one of the rupees for a room + // is randomized into the same room. Without this we'd need to + // reload the scene after collecting it to unlock the door. + if (OTRGlobals::Instance->gRandoContext->GetSilverRupeeCounter(srIdentity->index.randomizerGet) + .AllCollected()) { + if ((gPlayState->sceneNum == SCENE_GERUDO_TRAINING_GROUND) && (srActor->actor.room == 2)) { + Flags_SetTempClear(gPlayState, srActor->actor.room); + } else { + Sfx_PlaySfxCentered(NA_SE_SY_CORRECT_CHIME); + Flags_SetSwitch(gPlayState, srActor->switchFlag); + } + Actor_Kill(&srActor->actor); + } + *should = false; + }); + COND_VB_SHOULD(VB_SILVER_RUPEE_SETUP_DRAW, shouldRegister, { + EnGSwitch* srActor = va_arg(args, EnGSwitch*); + srActor->actor.draw = (ActorFunc)EnGSwitch_RandomizerDraw; + *should = false; + }) +} + +static RegisterShipInitFunc initFunc(RegisterShuffleSilverRupees, { "IS_RANDO" }); + +void Rando::StaticData::RegisterSilverRupeeLocations() { + locationTable[RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_1] = Location::Base( + RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_1, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_ICE_CAVERN, + ACTOR_EN_G_SWITCH, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(389, -382), "Spinning Blades Silver Rupee 1", + RHT_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_1)); + locationTable[RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_2] = Location::Base( + RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_2, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_ICE_CAVERN, + ACTOR_EN_G_SWITCH, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(414, -579), "Spinning Blades Silver Rupee 2", + RHT_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_2)); + locationTable[RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_3] = Location::Base( + RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_3, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_ICE_CAVERN, + ACTOR_EN_G_SWITCH, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(278, -637), "Spinning Blades Silver Rupee 3", + RHT_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_3)); + locationTable[RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_4] = Location::Base( + RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_4, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_ICE_CAVERN, + ACTOR_EN_G_SWITCH, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(198, -388), "Spinning Blades Silver Rupee 4", + RHT_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_4)); + locationTable[RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_5] = Location::Base( + RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_5, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_ICE_CAVERN, + ACTOR_EN_G_SWITCH, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1, -143), "Spinning Blades Silver Rupee 5", + RHT_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_5)); + + locationTable[RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_1] = Location::Base( + RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_1, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_ICE_CAVERN, + ACTOR_EN_G_SWITCH, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1040, -485), "Sliding Puzzle Silver Rupee 1", + RHT_ICE_CAVERN_SLIDING_SILVER_RUPEE, RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SLIDING_SILVER_RUPEE_1)); + locationTable[RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_2] = Location::Base( + RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_2, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_ICE_CAVERN, + ACTOR_EN_G_SWITCH, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1120, -1577), "Sliding Puzzle Silver Rupee 2", + RHT_ICE_CAVERN_SLIDING_SILVER_RUPEE, RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SLIDING_SILVER_RUPEE_2)); + locationTable[RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_3] = Location::Base( + RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_3, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_ICE_CAVERN, + ACTOR_EN_G_SWITCH, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1294, -899), "Sliding Puzzle Silver Rupee 3", + RHT_ICE_CAVERN_SLIDING_SILVER_RUPEE, RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SLIDING_SILVER_RUPEE_3)); + locationTable[RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_4] = Location::Base( + RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_4, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_ICE_CAVERN, + ACTOR_EN_G_SWITCH, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1558, -951), "Sliding Puzzle Silver Rupee 4", + RHT_ICE_CAVERN_SLIDING_SILVER_RUPEE, RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SLIDING_SILVER_RUPEE_4)); + locationTable[RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_5] = Location::Base( + RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_5, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_ICE_CAVERN, + ACTOR_EN_G_SWITCH, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1676, -552), "Sliding Puzzle Silver Rupee 5", + RHT_ICE_CAVERN_SLIDING_SILVER_RUPEE, RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SLIDING_SILVER_RUPEE_5)); + + locationTable[RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_1] = Location::Base( + RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_1, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_BOTTOM_OF_THE_WELL, + ACTOR_EN_G_SWITCH, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-259, -234), "Basement Silver Rupee 1", + RHT_BOTTOM_OF_THE_WELL_BASEMENT_SILVER_RUPEE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_SILVER_RUPEE_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_2] = Location::Base( + RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_2, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_BOTTOM_OF_THE_WELL, + ACTOR_EN_G_SWITCH, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-402, -401), "Basement Silver Rupee 2", + RHT_BOTTOM_OF_THE_WELL_BASEMENT_SILVER_RUPEE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_SILVER_RUPEE_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_3] = Location::Base( + RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_3, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_BOTTOM_OF_THE_WELL, + ACTOR_EN_G_SWITCH, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-560, -291), "Basement Silver Rupee 3", + RHT_BOTTOM_OF_THE_WELL_BASEMENT_SILVER_RUPEE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_SILVER_RUPEE_3)); + locationTable[RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_4] = Location::Base( + RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_4, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_BOTTOM_OF_THE_WELL, + ACTOR_EN_G_SWITCH, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-614, -297), "Basement Silver Rupee 4", + RHT_BOTTOM_OF_THE_WELL_BASEMENT_SILVER_RUPEE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_SILVER_RUPEE_4)); + locationTable[RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_5] = Location::Base( + RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_5, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_BOTTOM_OF_THE_WELL, + ACTOR_EN_G_SWITCH, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-796, -150), "Basement Silver Rupee 5", + RHT_BOTTOM_OF_THE_WELL_BASEMENT_SILVER_RUPEE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_SILVER_RUPEE_5)); + + locationTable[RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_1] = + Location::Base(RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_1, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, + RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_G_SWITCH, SCENE_GERUDO_TRAINING_GROUND, + TWO_ACTOR_PARAMS(-1887, -2134), "Boulder Maze Silver Rupee 1", + RHT_GERUDO_TRAINING_GROUND_BOULDER_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_1)); + locationTable[RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_2] = + Location::Base(RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_2, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, + RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_G_SWITCH, SCENE_GERUDO_TRAINING_GROUND, + TWO_ACTOR_PARAMS(-1627, -1462), "Boulder Maze Silver Rupee 2", + RHT_GERUDO_TRAINING_GROUND_BOULDER_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_2)); + locationTable[RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_3] = + Location::Base(RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_3, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, + RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_G_SWITCH, SCENE_GERUDO_TRAINING_GROUND, + TWO_ACTOR_PARAMS(-1579, -999), "Boulder Maze Silver Rupee 3", + RHT_GERUDO_TRAINING_GROUND_BOULDER_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_3)); + locationTable[RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_4] = + Location::Base(RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_4, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, + RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_G_SWITCH, SCENE_GERUDO_TRAINING_GROUND, + TWO_ACTOR_PARAMS(-1886, -956), "Boulder Maze Silver Rupee 4", + RHT_GERUDO_TRAINING_GROUND_BOULDER_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_4)); + locationTable[RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_5] = + Location::Base(RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_5, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, + RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_G_SWITCH, SCENE_GERUDO_TRAINING_GROUND, + TWO_ACTOR_PARAMS(-1332, -992), "Boulder Maze Silver Rupee 5", + RHT_GERUDO_TRAINING_GROUND_BOULDER_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_5)); + + locationTable[RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_1] = + Location::Base(RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_1, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, + RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_G_SWITCH, SCENE_GERUDO_TRAINING_GROUND, + TWO_ACTOR_PARAMS(1560, -1861), "Lava Room Silver Rupee 1", + RHT_GERUDO_TRAINING_GROUND_LAVA_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_1)); + locationTable[RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_2] = + Location::Base(RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_2, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, + RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_G_SWITCH, SCENE_GERUDO_TRAINING_GROUND, + TWO_ACTOR_PARAMS(1437, -2193), "Lava Room Silver Rupee 2", + RHT_GERUDO_TRAINING_GROUND_LAVA_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_2)); + locationTable[RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_3] = + Location::Base(RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_3, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, + RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_G_SWITCH, SCENE_GERUDO_TRAINING_GROUND, + TWO_ACTOR_PARAMS(1134, -1841), "Lava Room Silver Rupee 3", + RHT_GERUDO_TRAINING_GROUND_LAVA_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_3)); + locationTable[RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_4] = + Location::Base(RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_4, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, + RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_G_SWITCH, SCENE_GERUDO_TRAINING_GROUND, + TWO_ACTOR_PARAMS(1558, -1370), "Lava Room Silver Rupee 4", + RHT_GERUDO_TRAINING_GROUND_LAVA_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_4)); + locationTable[RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_5] = + Location::Base(RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_5, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, + RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_G_SWITCH, SCENE_GERUDO_TRAINING_GROUND, + TWO_ACTOR_PARAMS(1320, -1248), "Lava Room Silver Rupee 5", + RHT_GERUDO_TRAINING_GROUND_LAVA_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_5)); + + locationTable[RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_1] = + Location::Base(RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_1, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, + RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_G_SWITCH, SCENE_GERUDO_TRAINING_GROUND, + TWO_ACTOR_PARAMS(2160, -1315), "Whirlpool Room Silver Rupee 1", + RHT_GERUDO_TRAINING_GROUND_TOILET_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_1)); + locationTable[RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_2] = + Location::Base(RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_2, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, + RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_G_SWITCH, SCENE_GERUDO_TRAINING_GROUND, + TWO_ACTOR_PARAMS(2078, -1458), "Whirlpool Room Silver Rupee 2", + RHT_GERUDO_TRAINING_GROUND_TOILET_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_2)); + locationTable[RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_3] = + Location::Base(RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_3, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, + RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_G_SWITCH, SCENE_GERUDO_TRAINING_GROUND, + TWO_ACTOR_PARAMS(2453, -1612), "Whirlpool Room Silver Rupee 3", + RHT_GERUDO_TRAINING_GROUND_TOILET_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_3)); + locationTable[RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_4] = + Location::Base(RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_4, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, + RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_G_SWITCH, SCENE_GERUDO_TRAINING_GROUND, + TWO_ACTOR_PARAMS(2497, -1465), "Whirlpool Room Silver Rupee 4", + RHT_GERUDO_TRAINING_GROUND_TOILET_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_4)); + locationTable[RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_5] = + Location::Base(RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_5, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, + RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_G_SWITCH, SCENE_GERUDO_TRAINING_GROUND, + TWO_ACTOR_PARAMS(2308, -1464), "Whirlpool Room Silver Rupee 5", + RHT_GERUDO_TRAINING_GROUND_TOILET_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_5)); + + locationTable[RC_SPIRIT_GATE_SILVER_RUPEE_1] = Location::Base( + RC_SPIRIT_GATE_SILVER_RUPEE_1, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, + SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-335, -1409), "Child Gate Silver Rupee 1", RHT_SPIRIT_GATE_SILVER_RUPEE, + RG_SPIRIT_GATE_SILVER_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_GATE_SILVER_RUPEE_1)); + locationTable[RC_SPIRIT_GATE_SILVER_RUPEE_2] = Location::Base( + RC_SPIRIT_GATE_SILVER_RUPEE_2, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, + SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-347, -1075), "Child Gate Silver Rupee 2", RHT_SPIRIT_GATE_SILVER_RUPEE, + RG_SPIRIT_GATE_SILVER_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_GATE_SILVER_RUPEE_2)); + locationTable[RC_SPIRIT_GATE_SILVER_RUPEE_3] = Location::Base( + RC_SPIRIT_GATE_SILVER_RUPEE_3, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, + SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-511, -1075), "Child Gate Silver Rupee 3", RHT_SPIRIT_GATE_SILVER_RUPEE, + RG_SPIRIT_GATE_SILVER_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_GATE_SILVER_RUPEE_3)); + locationTable[RC_SPIRIT_GATE_SILVER_RUPEE_4] = Location::Base( + RC_SPIRIT_GATE_SILVER_RUPEE_4, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, + SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-672, -1075), "Child Gate Silver Rupee 4", RHT_SPIRIT_GATE_SILVER_RUPEE, + RG_SPIRIT_GATE_SILVER_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_GATE_SILVER_RUPEE_4)); + locationTable[RC_SPIRIT_GATE_SILVER_RUPEE_5] = Location::Base( + RC_SPIRIT_GATE_SILVER_RUPEE_5, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, + SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-766, -1075), "Child Gate Silver Rupee 5", RHT_SPIRIT_GATE_SILVER_RUPEE, + RG_SPIRIT_GATE_SILVER_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_GATE_SILVER_RUPEE_5)); + + locationTable[RC_SPIRIT_BEAMOS_SILVER_RUPEE_1] = Location::Base( + RC_SPIRIT_BEAMOS_SILVER_RUPEE_1, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, + SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-984, -450), "Beamos Room Silver Rupee 1", RHT_SPIRIT_BEAMOS_SILVER_RUPEE, + RG_SPIRIT_BEAMOS_SILVER_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_BEAMOS_SILVER_RUPEE_1)); + locationTable[RC_SPIRIT_BEAMOS_SILVER_RUPEE_2] = Location::Base( + RC_SPIRIT_BEAMOS_SILVER_RUPEE_2, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, + SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1123, 428), "Beamos Room Silver Rupee 2", RHT_SPIRIT_BEAMOS_SILVER_RUPEE, + RG_SPIRIT_BEAMOS_SILVER_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_BEAMOS_SILVER_RUPEE_2)); + locationTable[RC_SPIRIT_BEAMOS_SILVER_RUPEE_3] = + Location::Base(RC_SPIRIT_BEAMOS_SILVER_RUPEE_3, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1275, -247), + "Beamos Room Silver Rupee 3", RHT_SPIRIT_BEAMOS_SILVER_RUPEE, RG_SPIRIT_BEAMOS_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_BEAMOS_SILVER_RUPEE_3)); + locationTable[RC_SPIRIT_BEAMOS_SILVER_RUPEE_4] = + Location::Base(RC_SPIRIT_BEAMOS_SILVER_RUPEE_4, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1433, -283), + "Beamos Room Silver Rupee 4", RHT_SPIRIT_BEAMOS_SILVER_RUPEE, RG_SPIRIT_BEAMOS_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_BEAMOS_SILVER_RUPEE_4)); + locationTable[RC_SPIRIT_BEAMOS_SILVER_RUPEE_5] = + Location::Base(RC_SPIRIT_BEAMOS_SILVER_RUPEE_5, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1836, -446), + "Beamos Room Silver Rupee 5", RHT_SPIRIT_BEAMOS_SILVER_RUPEE, RG_SPIRIT_BEAMOS_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_BEAMOS_SILVER_RUPEE_5)); + + locationTable[RC_SPIRIT_BOULDER_SILVER_RUPEE_1] = + Location::Base(RC_SPIRIT_BOULDER_SILVER_RUPEE_1, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(1573, -920), + "Boulder Room Silver Rupee 1", RHT_SPIRIT_BOULDER_SILVER_RUPEE, RG_SPIRIT_BOULDER_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_BOULDER_SILVER_RUPEE_1)); + locationTable[RC_SPIRIT_BOULDER_SILVER_RUPEE_2] = + Location::Base(RC_SPIRIT_BOULDER_SILVER_RUPEE_2, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(1856, -1219), + "Boulder Room Silver Rupee 2", RHT_SPIRIT_BOULDER_SILVER_RUPEE, RG_SPIRIT_BOULDER_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_BOULDER_SILVER_RUPEE_2)); + locationTable[RC_SPIRIT_BOULDER_SILVER_RUPEE_3] = + Location::Base(RC_SPIRIT_BOULDER_SILVER_RUPEE_3, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(1856, -944), + "Boulder Room Silver Rupee 3", RHT_SPIRIT_BOULDER_SILVER_RUPEE, RG_SPIRIT_BOULDER_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_BOULDER_SILVER_RUPEE_3)); + locationTable[RC_SPIRIT_BOULDER_SILVER_RUPEE_4] = + Location::Base(RC_SPIRIT_BOULDER_SILVER_RUPEE_4, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(1284, -813), + "Boulder Room Silver Rupee 4", RHT_SPIRIT_BOULDER_SILVER_RUPEE, RG_SPIRIT_BOULDER_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_BOULDER_SILVER_RUPEE_4)); + locationTable[RC_SPIRIT_BOULDER_SILVER_RUPEE_5] = + Location::Base(RC_SPIRIT_BOULDER_SILVER_RUPEE_5, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(1284, -1355), + "Boulder Room Silver Rupee 5", RHT_SPIRIT_BOULDER_SILVER_RUPEE, RG_SPIRIT_BOULDER_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_BOULDER_SILVER_RUPEE_5)); + + locationTable[RC_SHADOW_SCYTHE_SILVER_RUPEE_1] = Location::Base( + RC_SHADOW_SCYTHE_SILVER_RUPEE_1, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, ACTOR_EN_G_SWITCH, + SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(3399, -838), "Spinning Scythe Silver Rupee 1", + RHT_SHADOW_SPINNING_SCYTHE_SILVER_RUPEE, RG_SHADOW_SCYTHE_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_SCYTHE_SILVER_RUPEE_1)); + locationTable[RC_SHADOW_SCYTHE_SILVER_RUPEE_2] = Location::Base( + RC_SHADOW_SCYTHE_SILVER_RUPEE_2, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, ACTOR_EN_G_SWITCH, + SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2869, -948), "Spinning Scythe Silver Rupee 2", + RHT_SHADOW_SPINNING_SCYTHE_SILVER_RUPEE, RG_SHADOW_SCYTHE_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_SCYTHE_SILVER_RUPEE_2)); + locationTable[RC_SHADOW_SCYTHE_SILVER_RUPEE_3] = Location::Base( + RC_SHADOW_SCYTHE_SILVER_RUPEE_3, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, ACTOR_EN_G_SWITCH, + SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(3554, -1432), "Spinning Scythe Silver Rupee 3", + RHT_SHADOW_SPINNING_SCYTHE_SILVER_RUPEE, RG_SHADOW_SCYTHE_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_SCYTHE_SILVER_RUPEE_3)); + locationTable[RC_SHADOW_SCYTHE_SILVER_RUPEE_4] = Location::Base( + RC_SHADOW_SCYTHE_SILVER_RUPEE_4, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, ACTOR_EN_G_SWITCH, + SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(3007, -1222), "Spinning Scythe Silver Rupee 4", + RHT_SHADOW_SPINNING_SCYTHE_SILVER_RUPEE, RG_SHADOW_SCYTHE_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_SCYTHE_SILVER_RUPEE_4)); + locationTable[RC_SHADOW_SCYTHE_SILVER_RUPEE_5] = Location::Base( + RC_SHADOW_SCYTHE_SILVER_RUPEE_5, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, ACTOR_EN_G_SWITCH, + SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(3243, -1061), "Spinning Scythe Silver Rupee 5", + RHT_SHADOW_SPINNING_SCYTHE_SILVER_RUPEE, RG_SHADOW_SCYTHE_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_SCYTHE_SILVER_RUPEE_5)); + + locationTable[RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_1] = Location::Base( + RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_1, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(1998, 3358), "Outside Spike Rain Room Silver Rupee 1", + RHT_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_1)); + locationTable[RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_2] = Location::Base( + RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_2, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2243, 3361), "Outside Spike Rain Room Silver Rupee 2", + RHT_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_2)); + locationTable[RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_3] = Location::Base( + RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_3, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2110, 3368), "Outside Spike Rain Room Silver Rupee 3", + RHT_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_3)); + locationTable[RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_4] = Location::Base( + RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_4, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2115, 3738), "Outside Spike Rain Room Silver Rupee 4", + RHT_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_4)); + locationTable[RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_5] = Location::Base( + RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_5, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2131, 3030), "Outside Spike Rain Room Silver Rupee 5", + RHT_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_5)); + + locationTable[RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_1] = Location::Base( + RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_1, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2254, 988), "Invisible Spikes Room Silver Rupee 1", + RHT_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_1)); + locationTable[RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_2] = Location::Base( + RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_2, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2135, 1297), "Invisible Spikes Room Silver Rupee 2", + RHT_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_2)); + locationTable[RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_3] = Location::Base( + RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_3, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2478, 1208), "Invisible Spikes Room Silver Rupee 3", + RHT_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_3)); + locationTable[RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_4] = Location::Base( + RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_4, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2940, 1069), "Invisible Spikes Room Silver Rupee 4", + RHT_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_4)); + locationTable[RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_5] = Location::Base( + RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_5, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2042, 849), "Invisible Spikes Room Silver Rupee 5", + RHT_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_5)); + + locationTable[RC_FOREST_TRIAL_SILVER_RUPEE_1] = + Location::Base(RC_FOREST_TRIAL_SILVER_RUPEE_1, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_GANONS_CASTLE, + ACTOR_EN_G_SWITCH, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1634, 1550), + "Forest Trial Silver Rupee 1", RHT_FOREST_TRIAL_SILVER_RUPEE, RG_FOREST_TRIAL_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TRIAL_SILVER_RUPEE_1)); + locationTable[RC_FOREST_TRIAL_SILVER_RUPEE_2] = + Location::Base(RC_FOREST_TRIAL_SILVER_RUPEE_2, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_GANONS_CASTLE, + ACTOR_EN_G_SWITCH, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1651, 2021), + "Forest Trial Silver Rupee 2", RHT_FOREST_TRIAL_SILVER_RUPEE, RG_FOREST_TRIAL_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TRIAL_SILVER_RUPEE_2)); + locationTable[RC_FOREST_TRIAL_SILVER_RUPEE_3] = + Location::Base(RC_FOREST_TRIAL_SILVER_RUPEE_3, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_GANONS_CASTLE, + ACTOR_EN_G_SWITCH, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1538, 2225), + "Forest Trial Silver Rupee 3", RHT_FOREST_TRIAL_SILVER_RUPEE, RG_FOREST_TRIAL_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TRIAL_SILVER_RUPEE_3)); + locationTable[RC_FOREST_TRIAL_SILVER_RUPEE_4] = + Location::Base(RC_FOREST_TRIAL_SILVER_RUPEE_4, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_GANONS_CASTLE, + ACTOR_EN_G_SWITCH, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1361, 1222), + "Forest Trial Silver Rupee 4", RHT_FOREST_TRIAL_SILVER_RUPEE, RG_FOREST_TRIAL_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TRIAL_SILVER_RUPEE_4)); + locationTable[RC_FOREST_TRIAL_SILVER_RUPEE_5] = + Location::Base(RC_FOREST_TRIAL_SILVER_RUPEE_5, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_GANONS_CASTLE, + ACTOR_EN_G_SWITCH, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1247, 1787), + "Forest Trial Silver Rupee 5", RHT_FOREST_TRIAL_SILVER_RUPEE, RG_FOREST_TRIAL_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TRIAL_SILVER_RUPEE_5)); + + locationTable[RC_FIRE_TRIAL_SILVER_RUPEE_1] = + Location::Base(RC_FIRE_TRIAL_SILVER_RUPEE_1, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_GANONS_CASTLE, + ACTOR_EN_G_SWITCH, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1867, -2754), + "Fire Trial Silver Rupee 1", RHT_FIRE_TRIAL_SILVER_RUPEE, RG_FIRE_TRIAL_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TRIAL_SILVER_RUPEE_1)); + locationTable[RC_FIRE_TRIAL_SILVER_RUPEE_2] = + Location::Base(RC_FIRE_TRIAL_SILVER_RUPEE_2, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_GANONS_CASTLE, + ACTOR_EN_G_SWITCH, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-604, -2592), + "Fire Trial Silver Rupee 2", RHT_FIRE_TRIAL_SILVER_RUPEE, RG_FIRE_TRIAL_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TRIAL_SILVER_RUPEE_2)); + locationTable[RC_FIRE_TRIAL_SILVER_RUPEE_3] = + Location::Base(RC_FIRE_TRIAL_SILVER_RUPEE_3, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_GANONS_CASTLE, + ACTOR_EN_G_SWITCH, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-515, -3253), + "Fire Trial Silver Rupee 3", RHT_FIRE_TRIAL_SILVER_RUPEE, RG_FIRE_TRIAL_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TRIAL_SILVER_RUPEE_3)); + locationTable[RC_FIRE_TRIAL_SILVER_RUPEE_4] = + Location::Base(RC_FIRE_TRIAL_SILVER_RUPEE_4, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_GANONS_CASTLE, + ACTOR_EN_G_SWITCH, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1555, -2317), + "Fire Trial Silver Rupee 4", RHT_FIRE_TRIAL_SILVER_RUPEE, RG_FIRE_TRIAL_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TRIAL_SILVER_RUPEE_4)); + locationTable[RC_FIRE_TRIAL_SILVER_RUPEE_5] = + Location::Base(RC_FIRE_TRIAL_SILVER_RUPEE_5, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_GANONS_CASTLE, + ACTOR_EN_G_SWITCH, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-854, -3679), + "Fire Trial Silver Rupee 5", RHT_FIRE_TRIAL_SILVER_RUPEE, RG_FIRE_TRIAL_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TRIAL_SILVER_RUPEE_5)); + + locationTable[RC_SPIRIT_TRIAL_SILVER_RUPEE_1] = + Location::Base(RC_SPIRIT_TRIAL_SILVER_RUPEE_1, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_GANONS_CASTLE, + ACTOR_EN_G_SWITCH, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1142, 639), + "Spirit Trial Silver Rupee 1", RHT_SPIRIT_TRIAL_SILVER_RUPEE, RG_SPIRIT_TRIAL_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TRIAL_SILVER_RUPEE_1)); + locationTable[RC_SPIRIT_TRIAL_SILVER_RUPEE_2] = + Location::Base(RC_SPIRIT_TRIAL_SILVER_RUPEE_2, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_GANONS_CASTLE, + ACTOR_EN_G_SWITCH, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-725, 942), + "Spirit Trial Silver Rupee 2", RHT_SPIRIT_TRIAL_SILVER_RUPEE, RG_SPIRIT_TRIAL_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TRIAL_SILVER_RUPEE_2)); + locationTable[RC_SPIRIT_TRIAL_SILVER_RUPEE_3] = + Location::Base(RC_SPIRIT_TRIAL_SILVER_RUPEE_3, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_GANONS_CASTLE, + ACTOR_EN_G_SWITCH, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-865, 656), + "Spirit Trial Silver Rupee 3", RHT_SPIRIT_TRIAL_SILVER_RUPEE, RG_SPIRIT_TRIAL_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TRIAL_SILVER_RUPEE_3)); + locationTable[RC_SPIRIT_TRIAL_SILVER_RUPEE_4] = + Location::Base(RC_SPIRIT_TRIAL_SILVER_RUPEE_4, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_GANONS_CASTLE, + ACTOR_EN_G_SWITCH, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-940, 270), + "Spirit Trial Silver Rupee 4", RHT_SPIRIT_TRIAL_SILVER_RUPEE, RG_SPIRIT_TRIAL_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TRIAL_SILVER_RUPEE_4)); + locationTable[RC_SPIRIT_TRIAL_SILVER_RUPEE_5] = + Location::Base(RC_SPIRIT_TRIAL_SILVER_RUPEE_5, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_GANONS_CASTLE, + ACTOR_EN_G_SWITCH, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-829, 591), + "Spirit Trial Silver Rupee 5", RHT_SPIRIT_TRIAL_SILVER_RUPEE, RG_SPIRIT_TRIAL_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TRIAL_SILVER_RUPEE_5)); + + locationTable[RC_LIGHT_TRIAL_SILVER_RUPEE_1] = + Location::Base(RC_LIGHT_TRIAL_SILVER_RUPEE_1, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_GANONS_CASTLE, + ACTOR_EN_G_SWITCH, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2674, -777), + "Light Trial Silver Rupee 1", RHT_LIGHT_TRIAL_SILVER_RUPEE, RG_LIGHT_TRIAL_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_LIGHT_TRIAL_SILVER_RUPEE_1)); + locationTable[RC_LIGHT_TRIAL_SILVER_RUPEE_2] = + Location::Base(RC_LIGHT_TRIAL_SILVER_RUPEE_2, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_GANONS_CASTLE, + ACTOR_EN_G_SWITCH, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2680, -893), + "Light Trial Silver Rupee 2", RHT_LIGHT_TRIAL_SILVER_RUPEE, RG_LIGHT_TRIAL_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_LIGHT_TRIAL_SILVER_RUPEE_2)); + locationTable[RC_LIGHT_TRIAL_SILVER_RUPEE_3] = + Location::Base(RC_LIGHT_TRIAL_SILVER_RUPEE_3, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_GANONS_CASTLE, + ACTOR_EN_G_SWITCH, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2646, -839), + "Light Trial Silver Rupee 3", RHT_LIGHT_TRIAL_SILVER_RUPEE, RG_LIGHT_TRIAL_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_LIGHT_TRIAL_SILVER_RUPEE_3)); + locationTable[RC_LIGHT_TRIAL_SILVER_RUPEE_4] = + Location::Base(RC_LIGHT_TRIAL_SILVER_RUPEE_4, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_GANONS_CASTLE, + ACTOR_EN_G_SWITCH, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2649, -545), + "Light Trial Silver Rupee 4", RHT_LIGHT_TRIAL_SILVER_RUPEE, RG_LIGHT_TRIAL_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_LIGHT_TRIAL_SILVER_RUPEE_4)); + locationTable[RC_LIGHT_TRIAL_SILVER_RUPEE_5] = + Location::Base(RC_LIGHT_TRIAL_SILVER_RUPEE_5, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_GANONS_CASTLE, + ACTOR_EN_G_SWITCH, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2509, -1091), + "Light Trial Silver Rupee 5", RHT_LIGHT_TRIAL_SILVER_RUPEE, RG_LIGHT_TRIAL_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_LIGHT_TRIAL_SILVER_RUPEE_5)); + + locationTable[RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_1] = + Location::Base(RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_1, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_DODONGOS_CAVERN, + ACTOR_EN_G_SWITCH, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1512, -1083), "Silver Rupee 1", + RHT_DODONGOS_CAVERN_SILVER_RUPEE, RG_DODONGOS_CAVERN_MQ_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_RUPEE_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_2] = + Location::Base(RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_2, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_DODONGOS_CAVERN, + ACTOR_EN_G_SWITCH, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1907, -1243), "Silver Rupee 2", + RHT_DODONGOS_CAVERN_SILVER_RUPEE, RG_DODONGOS_CAVERN_MQ_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_RUPEE_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_3] = + Location::Base(RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_3, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_DODONGOS_CAVERN, + ACTOR_EN_G_SWITCH, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2411, -1836), "Silver Rupee 3", + RHT_DODONGOS_CAVERN_SILVER_RUPEE, RG_DODONGOS_CAVERN_MQ_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_RUPEE_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_4] = + Location::Base(RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_4, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_DODONGOS_CAVERN, + ACTOR_EN_G_SWITCH, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2189, -1834), "Silver Rupee 4", + RHT_DODONGOS_CAVERN_SILVER_RUPEE, RG_DODONGOS_CAVERN_MQ_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_RUPEE_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_5] = + Location::Base(RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_5, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_DODONGOS_CAVERN, + ACTOR_EN_G_SWITCH, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2277, -1362), "Silver Rupee 5", + RHT_DODONGOS_CAVERN_SILVER_RUPEE, RG_DODONGOS_CAVERN_MQ_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_RUPEE_5)); + + locationTable[RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_1] = Location::Base( + RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_1, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, ACTOR_EN_G_SWITCH, + SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(3558, -1490), "Spinning Scythe Silver Rupee 1", + RHT_SHADOW_SPINNING_SCYTHE_SILVER_RUPEE, RG_SHADOW_MQ_SCYTHE_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_SCYTHE_SILVER_RUPEE_1)); + locationTable[RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_2] = Location::Base( + RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_2, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, ACTOR_EN_G_SWITCH, + SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(3399, -838), "Spinning Scythe Silver Rupee 2", + RHT_SHADOW_SPINNING_SCYTHE_SILVER_RUPEE, RG_SHADOW_MQ_SCYTHE_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_SCYTHE_SILVER_RUPEE_2)); + locationTable[RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_3] = Location::Base( + RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_3, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, ACTOR_EN_G_SWITCH, + SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(3243, -1061), "Spinning Scythe Silver Rupee 3", + RHT_SHADOW_SPINNING_SCYTHE_SILVER_RUPEE, RG_SHADOW_MQ_SCYTHE_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_SCYTHE_SILVER_RUPEE_3)); + locationTable[RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_4] = Location::Base( + RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_4, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, ACTOR_EN_G_SWITCH, + SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(3007, -1222), "Spinning Scythe Silver Rupee 4", + RHT_SHADOW_SPINNING_SCYTHE_SILVER_RUPEE, RG_SHADOW_MQ_SCYTHE_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_SCYTHE_SILVER_RUPEE_4)); + locationTable[RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_5] = Location::Base( + RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_5, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, ACTOR_EN_G_SWITCH, + SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2810, -961), "Spinning Scythe Silver Rupee 5", + RHT_SHADOW_SPINNING_SCYTHE_SILVER_RUPEE, RG_SHADOW_MQ_SCYTHE_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_SCYTHE_SILVER_RUPEE_5)); + + locationTable[RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_1] = Location::Base( + RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_1, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(5667, 2686), "Invisible Scythe Silver Rupee 1", + RHT_SHADOW_INVISIBLE_SCYTHE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_1)); + locationTable[RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_2] = Location::Base( + RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_2, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(5637, 2134), "Invisible Scythe Silver Rupee 2", + RHT_SHADOW_INVISIBLE_SCYTHE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_2)); + locationTable[RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_3] = Location::Base( + RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_3, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(5601, 1898), "Invisible Scythe Silver Rupee 3", + RHT_SHADOW_INVISIBLE_SCYTHE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_3)); + locationTable[RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_4] = Location::Base( + RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_4, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(5489, 2476), "Invisible Scythe Silver Rupee 4", + RHT_SHADOW_INVISIBLE_SCYTHE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_4)); + locationTable[RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_5] = Location::Base( + RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_5, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(5466, 2243), "Invisible Scythe Silver Rupee 5", + RHT_SHADOW_INVISIBLE_SCYTHE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_5)); + locationTable[RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_6] = Location::Base( + RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_6, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(5404, 1977), "Invisible Scythe Silver Rupee 6", + RHT_SHADOW_INVISIBLE_SCYTHE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_6)); + locationTable[RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_7] = Location::Base( + RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_7, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(5270, 2453), "Invisible Scythe Silver Rupee 7", + RHT_SHADOW_INVISIBLE_SCYTHE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_7)); + locationTable[RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_8] = Location::Base( + RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_8, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(5217, 1852), "Invisible Scythe Silver Rupee 8", + RHT_SHADOW_INVISIBLE_SCYTHE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_8)); + locationTable[RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_9] = Location::Base( + RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_9, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(5158, 2315), "Invisible Scythe Silver Rupee 9", + RHT_SHADOW_INVISIBLE_SCYTHE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_9)); + locationTable[RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_10] = Location::Base( + RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_10, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(5089, 2049), "Invisible Scythe Silver Rupee 10", + RHT_SHADOW_INVISIBLE_SCYTHE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_10)); + + locationTable[RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_1] = Location::Base( + RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_1, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2250, 3372), "Outside Spike Rain Silver Rupee 1", + RHT_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, RG_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_1)); + locationTable[RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_2] = Location::Base( + RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_2, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2131, 3030), "Outside Spike Rain Silver Rupee 2", + RHT_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, RG_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_2)); + // The following two locations have the same X and Z coordinates, so use X and Y for the params instead. + locationTable[RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_3] = Location::Base( + RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_3, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2110, -970), "Outside Spike Rain Silver Rupee 3", + RHT_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, RG_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_3)); + locationTable[RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_4] = Location::Base( + RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_4, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2110, -1092), "Outside Spike Rain Silver Rupee 4", + RHT_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, RG_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_4)); + // Back to X and Z coordinates for the params. + locationTable[RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_5] = Location::Base( + RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_5, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(1970, 3372), "Outside Spike Rain Silver Rupee 5", + RHT_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, RG_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_5)); + + locationTable[RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_1] = Location::Base( + RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_1, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2940, 1069), "Invisible Spikes Silver Rupee 1", + RHT_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_1)); + locationTable[RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_2] = Location::Base( + RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_2, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2730, 876), "Invisible Spikes Silver Rupee 2", + RHT_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_2)); + locationTable[RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_3] = Location::Base( + RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_3, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2705, 1089), "Invisible Spikes Silver Rupee 3", + RHT_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_3)); + locationTable[RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_4] = Location::Base( + RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_4, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2478, 1404), "Invisible Spikes Silver Rupee 4", + RHT_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_4)); + locationTable[RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_5] = Location::Base( + RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_5, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2478, 1200), "Invisible Spikes Silver Rupee 5", + RHT_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_5)); + locationTable[RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_6] = Location::Base( + RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_6, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2478, 1208), "Invisible Spikes Silver Rupee 6", + RHT_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_6)); + locationTable[RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_7] = Location::Base( + RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_7, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2478, 893), "Invisible Spikes Silver Rupee 7", + RHT_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_7)); + locationTable[RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_8] = Location::Base( + RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_8, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2254, 988), "Invisible Spikes Silver Rupee 8", + RHT_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_8)); + locationTable[RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_9] = Location::Base( + RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_9, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2135, 1297), "Invisible Spikes Silver Rupee 9", + RHT_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_9)); + locationTable[RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_10] = Location::Base( + RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_10, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_SHADOW_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2042, 849), "Invisible Spikes Silver Rupee 10", + RHT_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_10)); + + locationTable[RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_1] = + Location::Base(RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_1, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(744, 4), "Lobby Silver Rupee 1", + RHT_SPIRIT_LOBBY_SILVER_RUPEE, RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_MQ_LOBBY_SILVER_RUPEE_1)); + locationTable[RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_2] = + Location::Base(RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_2, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(967, -574), "Lobby Silver Rupee 2", + RHT_SPIRIT_LOBBY_SILVER_RUPEE, RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_MQ_LOBBY_SILVER_RUPEE_2)); + locationTable[RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_3] = + Location::Base(RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_3, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-160, 270), "Lobby Silver Rupee 3", + RHT_SPIRIT_LOBBY_SILVER_RUPEE, RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_MQ_LOBBY_SILVER_RUPEE_3)); + locationTable[RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_4] = + Location::Base(RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_4, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(160, 268), "Lobby Silver Rupee 4", + RHT_SPIRIT_LOBBY_SILVER_RUPEE, RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_MQ_LOBBY_SILVER_RUPEE_4)); + locationTable[RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_5] = + Location::Base(RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_5, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, + ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(1016, -73), "Lobby Silver Rupee 5", + RHT_SPIRIT_LOBBY_SILVER_RUPEE, RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_MQ_LOBBY_SILVER_RUPEE_5)); + + locationTable[RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_1] = + Location::Base(RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_1, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, + RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_G_SWITCH, SCENE_GERUDO_TRAINING_GROUND, + TWO_ACTOR_PARAMS(-1261, -923), "Boulder Maze Silver Rupee 1", + RHT_GERUDO_TRAINING_GROUND_BOULDER_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_1)); + locationTable[RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_2] = + Location::Base(RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_2, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, + RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_G_SWITCH, SCENE_GERUDO_TRAINING_GROUND, + TWO_ACTOR_PARAMS(-1886, -956), "Boulder Maze Silver Rupee 2", + RHT_GERUDO_TRAINING_GROUND_BOULDER_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_2)); + locationTable[RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_3] = + Location::Base(RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_3, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, + RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_G_SWITCH, SCENE_GERUDO_TRAINING_GROUND, + TWO_ACTOR_PARAMS(-1480, -1000), "Boulder Maze Silver Rupee 3", + RHT_GERUDO_TRAINING_GROUND_BOULDER_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_3)); + locationTable[RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_4] = + Location::Base(RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_4, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, + RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_G_SWITCH, SCENE_GERUDO_TRAINING_GROUND, + TWO_ACTOR_PARAMS(-1542, -1476), "Boulder Maze Silver Rupee 4", + RHT_GERUDO_TRAINING_GROUND_BOULDER_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_4)); + locationTable[RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_5] = + Location::Base(RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_5, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, + RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_G_SWITCH, SCENE_GERUDO_TRAINING_GROUND, + TWO_ACTOR_PARAMS(-1245, -2112), "Boulder Maze Silver Rupee 5", + RHT_GERUDO_TRAINING_GROUND_BOULDER_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_5)); + + locationTable[RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_1] = + Location::Base(RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_1, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, + RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_G_SWITCH, SCENE_GERUDO_TRAINING_GROUND, + TWO_ACTOR_PARAMS(1317, -1243), "Lava Room Silver Rupee 1", + RHT_GERUDO_TRAINING_GROUND_LAVA_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_1)); + locationTable[RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_2] = + Location::Base(RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_2, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, + RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_G_SWITCH, SCENE_GERUDO_TRAINING_GROUND, + TWO_ACTOR_PARAMS(1083, -1374), "Lava Room Silver Rupee 2", + RHT_GERUDO_TRAINING_GROUND_LAVA_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_2)); + locationTable[RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_3] = + Location::Base(RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_3, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, + RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_G_SWITCH, SCENE_GERUDO_TRAINING_GROUND, + TWO_ACTOR_PARAMS(1560, -1380), "Lava Room Silver Rupee 3", + RHT_GERUDO_TRAINING_GROUND_LAVA_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_3)); + locationTable[RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_4] = + Location::Base(RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_4, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, + RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_G_SWITCH, SCENE_GERUDO_TRAINING_GROUND, + TWO_ACTOR_PARAMS(1404, -1653), "Lava Room Silver Rupee 4", + RHT_GERUDO_TRAINING_GROUND_LAVA_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_4)); + locationTable[RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_5] = + Location::Base(RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_5, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, + RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_G_SWITCH, SCENE_GERUDO_TRAINING_GROUND, + TWO_ACTOR_PARAMS(1134, -1841), "Lava Room Silver Rupee 5", + RHT_GERUDO_TRAINING_GROUND_LAVA_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_5)); + locationTable[RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_6] = + Location::Base(RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_6, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, + RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_G_SWITCH, SCENE_GERUDO_TRAINING_GROUND, + TWO_ACTOR_PARAMS(1560, -1861), "Lava Room Silver Rupee 6", + RHT_GERUDO_TRAINING_GROUND_LAVA_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_6)); + + locationTable[RC_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE_1] = + Location::Base(RC_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE_1, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, + RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_G_SWITCH, SCENE_GERUDO_TRAINING_GROUND, + TWO_ACTOR_PARAMS(2160, -1315), "Toilet Room Silver Rupee 1", + RHT_GERUDO_TRAINING_GROUND_TOILET_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_1)); + locationTable[RC_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE_2] = + Location::Base(RC_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE_2, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, + RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_G_SWITCH, SCENE_GERUDO_TRAINING_GROUND, + TWO_ACTOR_PARAMS(2302, -1464), "Toilet Room Silver Rupee 2", + RHT_GERUDO_TRAINING_GROUND_TOILET_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_2)); + locationTable[RC_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE_3] = + Location::Base(RC_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE_3, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, + RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_G_SWITCH, SCENE_GERUDO_TRAINING_GROUND, + TWO_ACTOR_PARAMS(2453, -1612), "Toilet Room Silver Rupee 3", + RHT_GERUDO_TRAINING_GROUND_TOILET_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_3)); + + locationTable[RC_FIRE_TRIAL_MQ_SILVER_RUPEE_1] = + Location::Base(RC_FIRE_TRIAL_MQ_SILVER_RUPEE_1, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_GANONS_CASTLE, + ACTOR_EN_G_SWITCH, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1655, -2133), + "Fire Trial MQ Silver Rupee 1", RHT_FIRE_TRIAL_SILVER_RUPEE, RG_FIRE_TRIAL_MQ_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TRIAL_MQ_SILVER_RUPEE_1)); + locationTable[RC_FIRE_TRIAL_MQ_SILVER_RUPEE_2] = + Location::Base(RC_FIRE_TRIAL_MQ_SILVER_RUPEE_2, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_GANONS_CASTLE, + ACTOR_EN_G_SWITCH, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-686, -2945), + "Fire Trial MQ Silver Rupee 2", RHT_FIRE_TRIAL_SILVER_RUPEE, RG_FIRE_TRIAL_MQ_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TRIAL_MQ_SILVER_RUPEE_2)); + locationTable[RC_FIRE_TRIAL_MQ_SILVER_RUPEE_3] = + Location::Base(RC_FIRE_TRIAL_MQ_SILVER_RUPEE_3, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_GANONS_CASTLE, + ACTOR_EN_G_SWITCH, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2044, -2254), + "Fire Trial MQ Silver Rupee 3", RHT_FIRE_TRIAL_SILVER_RUPEE, RG_FIRE_TRIAL_MQ_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TRIAL_MQ_SILVER_RUPEE_3)); + locationTable[RC_FIRE_TRIAL_MQ_SILVER_RUPEE_4] = + Location::Base(RC_FIRE_TRIAL_MQ_SILVER_RUPEE_4, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_GANONS_CASTLE, + ACTOR_EN_G_SWITCH, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1891, -2753), + "Fire Trial MQ Silver Rupee 4", RHT_FIRE_TRIAL_SILVER_RUPEE, RG_FIRE_TRIAL_MQ_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TRIAL_MQ_SILVER_RUPEE_4)); + locationTable[RC_FIRE_TRIAL_MQ_SILVER_RUPEE_5] = + Location::Base(RC_FIRE_TRIAL_MQ_SILVER_RUPEE_5, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_GANONS_CASTLE, + ACTOR_EN_G_SWITCH, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-970, -3747), + "Fire Trial MQ Silver Rupee 5", RHT_FIRE_TRIAL_SILVER_RUPEE, RG_FIRE_TRIAL_MQ_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TRIAL_MQ_SILVER_RUPEE_5)); + + locationTable[RC_WATER_TRIAL_MQ_SILVER_RUPEE_1] = + Location::Base(RC_WATER_TRIAL_MQ_SILVER_RUPEE_1, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_GANONS_CASTLE, + ACTOR_EN_G_SWITCH, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2905, -1263), + "Water Trial MQ Silver Rupee 1", RHT_WATER_TRIAL_SILVER_RUPEE, RG_WATER_TRIAL_MQ_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TRIAL_MQ_SILVER_RUPEE_1)); + locationTable[RC_WATER_TRIAL_MQ_SILVER_RUPEE_2] = + Location::Base(RC_WATER_TRIAL_MQ_SILVER_RUPEE_2, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_GANONS_CASTLE, + ACTOR_EN_G_SWITCH, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3253, -649), + "Water Trial MQ Silver Rupee 2", RHT_WATER_TRIAL_SILVER_RUPEE, RG_WATER_TRIAL_MQ_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TRIAL_MQ_SILVER_RUPEE_2)); + locationTable[RC_WATER_TRIAL_MQ_SILVER_RUPEE_3] = + Location::Base(RC_WATER_TRIAL_MQ_SILVER_RUPEE_3, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_GANONS_CASTLE, + ACTOR_EN_G_SWITCH, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2905, -1478), + "Water Trial MQ Silver Rupee 3", RHT_WATER_TRIAL_SILVER_RUPEE, RG_WATER_TRIAL_MQ_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TRIAL_MQ_SILVER_RUPEE_3)); + locationTable[RC_WATER_TRIAL_MQ_SILVER_RUPEE_4] = + Location::Base(RC_WATER_TRIAL_MQ_SILVER_RUPEE_4, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_GANONS_CASTLE, + ACTOR_EN_G_SWITCH, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2912, -971), + "Water Trial MQ Silver Rupee 4", RHT_WATER_TRIAL_SILVER_RUPEE, RG_WATER_TRIAL_MQ_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TRIAL_MQ_SILVER_RUPEE_4)); + locationTable[RC_WATER_TRIAL_MQ_SILVER_RUPEE_5] = + Location::Base(RC_WATER_TRIAL_MQ_SILVER_RUPEE_5, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_GANONS_CASTLE, + ACTOR_EN_G_SWITCH, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2757, -765), + "Water Trial MQ Silver Rupee 5", RHT_WATER_TRIAL_SILVER_RUPEE, RG_WATER_TRIAL_MQ_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TRIAL_MQ_SILVER_RUPEE_5)); + + locationTable[RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_1] = + Location::Base(RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_1, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_GANONS_CASTLE, + ACTOR_EN_G_SWITCH, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1100, -2554), + "Shadow Trial MQ Silver Rupee 1", RHT_SHADOW_TRIAL_SILVER_RUPEE, RG_SHADOW_TRIAL_MQ_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TRIAL_MQ_SILVER_RUPEE_1)); + locationTable[RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_2] = + Location::Base(RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_2, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_GANONS_CASTLE, + ACTOR_EN_G_SWITCH, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1829, -4071), + "Shadow Trial MQ Silver Rupee 2", RHT_SHADOW_TRIAL_SILVER_RUPEE, RG_SHADOW_TRIAL_MQ_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TRIAL_MQ_SILVER_RUPEE_2)); + locationTable[RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_3] = + Location::Base(RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_3, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_GANONS_CASTLE, + ACTOR_EN_G_SWITCH, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1529, -4117), + "Shadow Trial MQ Silver Rupee 3", RHT_SHADOW_TRIAL_SILVER_RUPEE, RG_SHADOW_TRIAL_MQ_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TRIAL_MQ_SILVER_RUPEE_3)); + locationTable[RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_4] = + Location::Base(RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_4, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_GANONS_CASTLE, + ACTOR_EN_G_SWITCH, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1279, -3111), + "Shadow Trial MQ Silver Rupee 4", RHT_SHADOW_TRIAL_SILVER_RUPEE, RG_SHADOW_TRIAL_MQ_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TRIAL_MQ_SILVER_RUPEE_4)); + locationTable[RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_5] = + Location::Base(RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_5, RCQUEST_MQ, RCTYPE_SILVER_RUPEE, RCAREA_GANONS_CASTLE, + ACTOR_EN_G_SWITCH, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1322, -2262), + "Shadow Trial MQ Silver Rupee 5", RHT_SHADOW_TRIAL_SILVER_RUPEE, RG_SHADOW_TRIAL_MQ_SILVER_RUPEE, + SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TRIAL_MQ_SILVER_RUPEE_5)); +} + +static ObjectExtension::Register RegisterSilverRupeeIdentity; +static RegisterShipInitFunc registerFunc(Rando::StaticData::RegisterSilverRupeeLocations); + +Rando::SilverRupeeCounter::SilverRupeeCounter() : mCollected(0), mTotal(0), mRandoGet(RG_NONE) { +} + +Rando::SilverRupeeCounter::SilverRupeeCounter(uint8_t total, RandomizerGet randoGet, uint8_t dungeonId, + RandomizerCheckQuest quest) + : mCollected(0), mTotal(total), mRandoGet(randoGet), mDungeonId(dungeonId), mQuest(quest) { +} + +uint8_t Rando::SilverRupeeCounter::GetCollected() const { + return mCollected; +} + +uint8_t Rando::SilverRupeeCounter::GetTotal() const { + return mTotal; +} + +void Rando::SilverRupeeCounter::IncrementCollected(uint8_t amount) { + mCollected += amount; +} + +bool Rando::SilverRupeeCounter::AllCollected() { + return GetCollected() == GetTotal(); +} + +void Rando::SilverRupeeCounter::SetCollected(uint8_t newCollected) { + if (newCollected >= 0 && newCollected <= GetTotal()) { + mCollected = newCollected; + } +} + +uint8_t Rando::SilverRupeeCounter::DungeonID() { + return mDungeonId; +} + +RandomizerCheckQuest Rando::SilverRupeeCounter::Quest() { + return mQuest; +} diff --git a/soh/soh/Enhancements/randomizer/ShuffleSilverRupees.h b/soh/soh/Enhancements/randomizer/ShuffleSilverRupees.h new file mode 100644 index 00000000000..4ea76aa3a9c --- /dev/null +++ b/soh/soh/Enhancements/randomizer/ShuffleSilverRupees.h @@ -0,0 +1,43 @@ +#ifndef SHUFFLESILVERRUPEES_H +#define SHUFFLESILVERRUPEES_H + +#include "soh/Enhancements/item-tables/ItemTableTypes.h" +#include "randomizerTypes.h" + +typedef struct SilverRupeeIdentity { + RandomizerInf randomizerInf; + union { + RandomizerCheck randomizerCheck; + RandomizerGet randomizerGet; + } index; + GetItemEntry itemEntry; +} SilverRupeeIdentity; + +#ifdef __cplusplus +#include +CustomMessage GetSilverRupeeItemMessage(uint16_t rgid); +namespace Rando { +class SilverRupeeCounter { + public: + SilverRupeeCounter(); + SilverRupeeCounter(uint8_t total, RandomizerGet randoGet, uint8_t dungeonId, RandomizerCheckQuest quest); + + uint8_t GetCollected() const; + uint8_t GetTotal() const; + void IncrementCollected(uint8_t amount = 1); + bool AllCollected(); + void SetCollected(uint8_t newCollected); + uint8_t DungeonID(); + RandomizerCheckQuest Quest(); + + private: + uint8_t mCollected = 0; + uint8_t mTotal; + RandomizerGet mRandoGet; + uint8_t mDungeonId; + RandomizerCheckQuest mQuest; +}; +} // namespace Rando +#endif + +#endif // SHUFLESILVERRUPEES_H \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/context.cpp b/soh/soh/Enhancements/randomizer/context.cpp index bd011d654a2..32acd2f6b7a 100644 --- a/soh/soh/Enhancements/randomizer/context.cpp +++ b/soh/soh/Enhancements/randomizer/context.cpp @@ -30,6 +30,38 @@ Context::Context() { mLogic = std::make_shared(); mTrials = std::make_shared(); mFishsanity = std::make_shared(); + mSilverRupeeCounters = { + // Vanilla + SilverRupeeCounter(5, RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, ICE_CAVERN, RCQUEST_VANILLA), + SilverRupeeCounter(5, RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, ICE_CAVERN, RCQUEST_VANILLA), + SilverRupeeCounter(5, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, BOTTOM_OF_THE_WELL, RCQUEST_VANILLA), + SilverRupeeCounter(5, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, GERUDO_TRAINING_GROUND, RCQUEST_VANILLA), + SilverRupeeCounter(5, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, GERUDO_TRAINING_GROUND, RCQUEST_VANILLA), + SilverRupeeCounter(5, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, GERUDO_TRAINING_GROUND, RCQUEST_VANILLA), + SilverRupeeCounter(5, RG_SPIRIT_GATE_SILVER_RUPEE, SPIRIT_TEMPLE, RCQUEST_VANILLA), + SilverRupeeCounter(5, RG_SPIRIT_BEAMOS_SILVER_RUPEE, SPIRIT_TEMPLE, RCQUEST_VANILLA), + SilverRupeeCounter(5, RG_SPIRIT_BOULDER_SILVER_RUPEE, SPIRIT_TEMPLE, RCQUEST_VANILLA), + SilverRupeeCounter(5, RG_SHADOW_SCYTHE_SILVER_RUPEE, SHADOW_TEMPLE, RCQUEST_VANILLA), + SilverRupeeCounter(5, RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, SHADOW_TEMPLE, RCQUEST_VANILLA), + SilverRupeeCounter(5, RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, SHADOW_TEMPLE, RCQUEST_VANILLA), + SilverRupeeCounter(5, RG_FOREST_TRIAL_SILVER_RUPEE, GANONS_CASTLE, RCQUEST_VANILLA), + SilverRupeeCounter(5, RG_FIRE_TRIAL_SILVER_RUPEE, GANONS_CASTLE, RCQUEST_VANILLA), + SilverRupeeCounter(5, RG_SPIRIT_TRIAL_SILVER_RUPEE, GANONS_CASTLE, RCQUEST_VANILLA), + SilverRupeeCounter(5, RG_LIGHT_TRIAL_SILVER_RUPEE, GANONS_CASTLE, RCQUEST_VANILLA), + // MQ + SilverRupeeCounter(5, RG_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE, GERUDO_TRAINING_GROUND, RCQUEST_MQ), + SilverRupeeCounter(6, RG_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE, GERUDO_TRAINING_GROUND, RCQUEST_MQ), + SilverRupeeCounter(3, RG_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE, GERUDO_TRAINING_GROUND, RCQUEST_MQ), + SilverRupeeCounter(5, RG_DODONGOS_CAVERN_MQ_SILVER_RUPEE, DODONGOS_CAVERN, RCQUEST_MQ), + SilverRupeeCounter(5, RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE, SPIRIT_TEMPLE, RCQUEST_MQ), + SilverRupeeCounter(5, RG_SHADOW_MQ_SCYTHE_SILVER_RUPEE, SHADOW_TEMPLE, RCQUEST_MQ), + SilverRupeeCounter(10, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, SHADOW_TEMPLE, RCQUEST_MQ), + SilverRupeeCounter(5, RG_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, SHADOW_TEMPLE, RCQUEST_MQ), + SilverRupeeCounter(10, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, SHADOW_TEMPLE, RCQUEST_MQ), + SilverRupeeCounter(5, RG_FIRE_TRIAL_SILVER_RUPEE, GANONS_CASTLE, RCQUEST_MQ), + SilverRupeeCounter(5, RG_WATER_TRIAL_MQ_SILVER_RUPEE, GANONS_CASTLE, RCQUEST_MQ), + SilverRupeeCounter(5, RG_SHADOW_TRIAL_MQ_SILVER_RUPEE, GANONS_CASTLE, RCQUEST_MQ), + }; VanillaLogicDefaults = { // RANDOTODO check what this does &mOptions[RSK_LINKS_POCKET], @@ -198,7 +230,8 @@ void Context::GenerateLocationPool() { (location.GetRCType() == RCTYPE_FAIRY && !mOptions[RSK_SHUFFLE_FAIRIES]) || (location.GetRCType() == RCTYPE_FREESTANDING && mOptions[RSK_SHUFFLE_FREESTANDING].Is(RO_SHUFFLE_FREESTANDING_OFF)) || - (location.GetRCType() == RCTYPE_BEEHIVE && !mOptions[RSK_SHUFFLE_BEEHIVES])) { + (location.GetRCType() == RCTYPE_BEEHIVE && !mOptions[RSK_SHUFFLE_BEEHIVES]) || + (location.GetRCType() == RCTYPE_SILVER_RUPEE && !mOptions[RSK_SHUFFLE_SILVER_RUPEES])) { continue; } if (location.IsOverworld()) { @@ -294,6 +327,10 @@ void Context::ItemReset() { GetItemLocation(RC_GIFT_FROM_RAURU)->ResetVariables(); GetItemLocation(RC_LINKS_POCKET)->ResetVariables(); + + for (auto silverCounter : mSilverRupeeCounters) { + silverCounter.SetCollected(0); + } } void Context::LocationReset() { @@ -544,6 +581,11 @@ void Context::SetHash(std::string hash) { mHash = std::move(hash); } +SilverRupeeCounter& Context::GetSilverRupeeCounter(RandomizerGet rg) { + assert(rg >= RG_SILVER_RUPEE_FIRST && rg <= RG_SILVER_RUPEE_LAST); + return mSilverRupeeCounters[rg - RG_SILVER_RUPEE_FIRST]; +} + const std::string& Context::GetSeedString() const { return mSeedString; } diff --git a/soh/soh/Enhancements/randomizer/context.h b/soh/soh/Enhancements/randomizer/context.h index 96894775680..acfac670204 100644 --- a/soh/soh/Enhancements/randomizer/context.h +++ b/soh/soh/Enhancements/randomizer/context.h @@ -8,6 +8,7 @@ #include "hint.h" #include "fishsanity.h" #include "trial.h" +#include "ShuffleSilverRupees.h" #include #include @@ -175,12 +176,22 @@ class Context { */ void SetHash(std::string hash); + /** + * @brief Gets a reference to the silver rupee counter corresponding to the + * Given RandomizerGet value. + * + * @param rg + * @return SilverRupeeCounter& + */ + SilverRupeeCounter& GetSilverRupeeCounter(RandomizerGet rg); + private: static std::weak_ptr mContext; std::array hintTable = {}; std::array itemLocationTable = {}; std::array mOptions; std::array mTrickOptions; + std::array mSilverRupeeCounters; RandoOptionLACSCondition mLACSCondition = RO_LACS_VANILLA; std::shared_ptr mEntranceShuffler; std::shared_ptr mDungeons; diff --git a/soh/soh/Enhancements/randomizer/draw.cpp b/soh/soh/Enhancements/randomizer/draw.cpp index b17718b6518..e6f87323d2b 100644 --- a/soh/soh/Enhancements/randomizer/draw.cpp +++ b/soh/soh/Enhancements/randomizer/draw.cpp @@ -34,6 +34,8 @@ extern "C" { #include "overlays/ovl_Boss_Sst/ovl_Boss_Sst.h" #include "objects/object_tw/object_tw.h" #include "objects/object_ganon2/object_ganon2.h" +#include + extern PlayState* gPlayState; extern SaveContext gSaveContext; } @@ -1222,3 +1224,23 @@ extern "C" void Randomizer_DrawOverworldKey(PlayState* play, GetItemEntry* getIt CLOSE_DISPS(play->state.gfxCtx); } + +extern "C" void Randomizer_DrawSilverRupee(PlayState* play, GetItemEntry* getItemEntry) { + OPEN_DISPS(play->state.gfxCtx); + Color_RGB8 silverRupeeColor = + CVarGetColor24(CVAR_COSMETIC("Consumable.SilverRupee.Value"), Color_RGB8({ 255, 255, 255 })); + Gfx_SetupDL_25Opa(play->state.gfxCtx); + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_MODELVIEW | G_MTX_LOAD); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0x80, silverRupeeColor.r, silverRupeeColor.g, silverRupeeColor.b, 255); + gDPSetEnvColor(POLY_OPA_DISP++, silverRupeeColor.r / 5, silverRupeeColor.g / 5, silverRupeeColor.b / 5, 255); + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gGiRupeeInnerDL); + Gfx_SetupDL_25Xlu(play->state.gfxCtx); + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_MODELVIEW | G_MTX_LOAD); + gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255, 255, 255, 255); + gDPSetEnvColor(POLY_XLU_DISP++, silverRupeeColor.r * 0.75f, silverRupeeColor.g * 0.75f, silverRupeeColor.b * 0.75f, + 255); + gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gGiRupeeOuterDL); + CLOSE_DISPS(play->state.gfxCtx); +} diff --git a/soh/soh/Enhancements/randomizer/draw.h b/soh/soh/Enhancements/randomizer/draw.h index 8483a7bf966..aadfa472047 100644 --- a/soh/soh/Enhancements/randomizer/draw.h +++ b/soh/soh/Enhancements/randomizer/draw.h @@ -27,6 +27,7 @@ void Randomizer_DrawMysteryItem(PlayState* play, GetItemEntry* getItemEntry); void Randomizer_DrawBombchuBagInLogic(PlayState* play, GetItemEntry* getItemEntry); void Randomizer_DrawBombchuBag(PlayState* play, GetItemEntry* getItemEntry); void Randomizer_DrawOverworldKey(PlayState* play, GetItemEntry* getItemEntry); +void Randomizer_DrawSilverRupee(PlayState* play, GetItemEntry* getItemEntry); #define GET_ITEM_MYSTERY \ { \ diff --git a/soh/soh/Enhancements/randomizer/dungeon.cpp b/soh/soh/Enhancements/randomizer/dungeon.cpp index 1eb88ed73a9..4be5f4c4620 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/dungeon.cpp @@ -145,6 +145,22 @@ std::vector DungeonInfo::GetDungeonLocations() const { return locations; } +bool DungeonInfo::ContainsSilverRupee(RandomizerGet silverRupee) const { + auto dungeonLocations = GetDungeonLocations(); + const auto silverRupeeLocations = FilterFromPool(dungeonLocations, [](const RandomizerCheck loc) { + return StaticData::GetLocation(loc)->GetRCType() == RCTYPE_SILVER_RUPEE; + }); + if (silverRupeeLocations.empty()) { + return false; + } + for (auto silverRupeeLocation : silverRupeeLocations) { + if (StaticData::GetLocation(silverRupeeLocation)->GetVanillaItem() == silverRupee) { + return true; + } + } + return false; +} + Dungeons::Dungeons() { dungeonList[DEKU_TREE] = DungeonInfo("Deku Tree", RHT_DEKU_TREE, RG_DEKU_TREE_MAP, RG_DEKU_TREE_COMPASS, RG_NONE, RG_NONE, RG_NONE, RA_DEKU_TREE, 0, 0, RSK_MQ_DEKU_TREE); diff --git a/soh/soh/Enhancements/randomizer/dungeon.h b/soh/soh/Enhancements/randomizer/dungeon.h index ba81d289d67..2d9dd575967 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.h +++ b/soh/soh/Enhancements/randomizer/dungeon.h @@ -38,6 +38,7 @@ class DungeonInfo { void PlaceVanillaCompass() const; void PlaceVanillaBossKey() const; void PlaceVanillaSmallKeys() const; + bool ContainsSilverRupee(RandomizerGet silverRupee) const; std::vector GetDungeonLocations() const; std::vector locations; diff --git a/soh/soh/Enhancements/randomizer/item.h b/soh/soh/Enhancements/randomizer/item.h index 13a654d9c22..79820a68c9c 100644 --- a/soh/soh/Enhancements/randomizer/item.h +++ b/soh/soh/Enhancements/randomizer/item.h @@ -23,7 +23,8 @@ enum ItemType { ITEMTYPE_REFILL, ITEMTYPE_SONG, ITEMTYPE_SHOP, - ITEMTYPE_DUNGEONREWARD + ITEMTYPE_DUNGEONREWARD, + ITEMTYPE_SILVERRUPEE }; namespace Rando { diff --git a/soh/soh/Enhancements/randomizer/item_list.cpp b/soh/soh/Enhancements/randomizer/item_list.cpp index 3f6535c8326..6f4c589bf53 100644 --- a/soh/soh/Enhancements/randomizer/item_list.cpp +++ b/soh/soh/Enhancements/randomizer/item_list.cpp @@ -372,6 +372,65 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_DEKU_NUT_BAG] = Item(RG_DEKU_NUT_BAG, Text{ "Deku Nut Bag", "Sac de Noix Mojo", "Deku-Nuß-Tasche" }, ITEMTYPE_ITEM, GI_NUT_UPGRADE_30, true, LOGIC_PROGRESSIVE_NUT_BAG, RHT_NONE, RG_DEKU_NUT_BAG, OBJECT_GI_NUTS, GID_NUTS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE] = Item(RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, Text{ "Ice Cavern Spinning Blades Silver Rupee", "Ice Cavern Spinning Blades Silver Rupee", "Ice Cavern Spinning Blades Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, LOGIC_NONE, RHT_ICE_CAVERN_SILVER_RUPEE, RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_SILVER_RUPEE, MOD_RANDOMIZER); + itemTable[RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_ICE_CAVERN_SLIDING_SILVER_RUPEE] = Item(RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, Text{ "Ice Cavern Block Sliding Silver Rupee", "Ice Cavern Block Sliding Silver Rupee", "Ice Cavern Block Sliding Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, LOGIC_NONE, RHT_ICE_CAVERN_SILVER_RUPEE, RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_SILVER_RUPEE, MOD_RANDOMIZER); + itemTable[RG_ICE_CAVERN_SLIDING_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE] = Item(RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, Text{ "BotW Silver Rupee", "BotW Silver Rupee", "BotW Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, LOGIC_NONE, RHT_BOTTOM_OF_THE_WELL_SILVER_RUPEE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_SILVER_RUPEE, MOD_RANDOMIZER); + itemTable[RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE] = Item(RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, Text{ "GTG Boulder Maze Silver Rupee", "GTG Boulder Maze Silver Rupee", "GTG Boulder Maze Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, LOGIC_NONE, RHT_GERUDO_TRAINING_GROUND_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_SILVER_RUPEE, MOD_RANDOMIZER); + itemTable[RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE] = Item(RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, Text{ "GTG Lava Room Silver Rupee", "GTG Lava Room Silver Rupee", "GTG Lava Room Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, LOGIC_NONE, RHT_GERUDO_TRAINING_GROUND_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_SILVER_RUPEE, MOD_RANDOMIZER); + itemTable[RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE] = Item(RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, Text{ "GTG Whirlpool Silver Rupee", "GTG Whirlpool Silver Rupee", "GTG Whirlpool Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, LOGIC_NONE, RHT_GERUDO_TRAINING_GROUND_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_SILVER_RUPEE, MOD_RANDOMIZER); + itemTable[RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_SPIRIT_GATE_SILVER_RUPEE] = Item(RG_SPIRIT_GATE_SILVER_RUPEE, Text{ "Spirit Temple Child Gate Silver Rupee", "Spirit Temple Child Gate Silver Rupee", "Spirit Temple Child Gate Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, LOGIC_NONE, RHT_SPIRIT_TEMPLE_SILVER_RUPEE, RG_SPIRIT_GATE_SILVER_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_SILVER_RUPEE, MOD_RANDOMIZER); + itemTable[RG_SPIRIT_GATE_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_SPIRIT_BEAMOS_SILVER_RUPEE] = Item(RG_SPIRIT_BEAMOS_SILVER_RUPEE, Text{ "Spirit Temple Sun Block Room Silver Rupee", "Spirit Temple Sun Block Room Silver Rupee", "Spirit Temple Sun Block Room Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, LOGIC_NONE, RHT_SPIRIT_TEMPLE_SILVER_RUPEE, RG_SPIRIT_BEAMOS_SILVER_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_SILVER_RUPEE, MOD_RANDOMIZER); + itemTable[RG_SPIRIT_BEAMOS_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_SPIRIT_BOULDER_SILVER_RUPEE] = Item(RG_SPIRIT_BOULDER_SILVER_RUPEE, Text{ "Spirit Temple Boulder Room Silver Rupee", "Spirit Temple Boulder Room Silver Rupee", "Spirit Temple Boulder Room Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, LOGIC_NONE, RHT_SPIRIT_TEMPLE_SILVER_RUPEE, RG_SPIRIT_BOULDER_SILVER_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_SILVER_RUPEE, MOD_RANDOMIZER); + itemTable[RG_SPIRIT_BOULDER_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_SHADOW_SCYTHE_SILVER_RUPEE] = Item(RG_SHADOW_SCYTHE_SILVER_RUPEE, Text{ "Shadow Temple Scythe Room Silver Rupee", "Shadow Temple Scythe Room Silver Rupee", "Shadow Temple Scythe Room Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, LOGIC_NONE, RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_SCYTHE_SILVER_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_SILVER_RUPEE, MOD_RANDOMIZER); + itemTable[RG_SHADOW_SCYTHE_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE] = Item(RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, Text{ "Shadow Temple Near Falling Spikes Silver Rupee", "Shadow Temple Near Falling Spikes Silver Rupee", "Shadow Temple Near Falling Spikes Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, LOGIC_NONE, RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_SILVER_RUPEE, MOD_RANDOMIZER); + itemTable[RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE] = Item(RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, Text{ "Shadow Temple Invisible Spikes Room Silver Rupee", "Shadow Temple Invisible Spikes Room Silver Rupee", "Shadow Temple Invisible Spikes Room Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, LOGIC_NONE, RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_SILVER_RUPEE, MOD_RANDOMIZER); + itemTable[RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_FOREST_TRIAL_SILVER_RUPEE] = Item(RG_FOREST_TRIAL_SILVER_RUPEE, Text{ "Ganon's Castle Forest Trial Silver Rupee", "Ganon's Castle Forest Trial Silver Rupee", "Ganon's Castle Forest Trial Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, LOGIC_NONE, RHT_GANONS_CASTLE_SILVER_RUPEE, RG_FOREST_TRIAL_SILVER_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_SILVER_RUPEE, MOD_RANDOMIZER); + itemTable[RG_FOREST_TRIAL_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_FIRE_TRIAL_SILVER_RUPEE] = Item(RG_FIRE_TRIAL_SILVER_RUPEE, Text{ "Ganon's Castle Fire Trial Silver Rupee", "Ganon's Castle Fire Trial Silver Rupee", "Ganon's Castle Fire Trial Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, LOGIC_NONE, RHT_GANONS_CASTLE_SILVER_RUPEE, RG_FIRE_TRIAL_SILVER_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_SILVER_RUPEE, MOD_RANDOMIZER); + itemTable[RG_FIRE_TRIAL_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_SPIRIT_TRIAL_SILVER_RUPEE] = Item(RG_SPIRIT_TRIAL_SILVER_RUPEE, Text{ "Ganon's Castle Spirit Trial Silver Rupee", "Ganon's Castle Spirit Trial Silver Rupee", "Ganon's Castle Spirit Trial Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, LOGIC_NONE, RHT_GANONS_CASTLE_SILVER_RUPEE, RG_SPIRIT_TRIAL_SILVER_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_SILVER_RUPEE, MOD_RANDOMIZER); + itemTable[RG_SPIRIT_TRIAL_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_LIGHT_TRIAL_SILVER_RUPEE] = Item(RG_LIGHT_TRIAL_SILVER_RUPEE, Text{ "Ganon's Castle Light Trial Silver Rupee", "Ganon's Castle Light Trial Silver Rupee", "Ganon's Castle Light Trial Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, LOGIC_NONE, RHT_GANONS_CASTLE_SILVER_RUPEE, RG_LIGHT_TRIAL_SILVER_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_SILVER_RUPEE, MOD_RANDOMIZER); + itemTable[RG_LIGHT_TRIAL_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_DODONGOS_CAVERN_MQ_SILVER_RUPEE] = Item(RG_DODONGOS_CAVERN_MQ_SILVER_RUPEE, Text{ "Dodongo's Cavern Silver Rupee", "Dodongo's Cavern Silver Rupee", "Dodongo's Cavern Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, LOGIC_NONE, RHT_DODONGOS_CAVERN_SILVER_RUPEE, RG_DODONGOS_CAVERN_MQ_SILVER_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_SILVER_RUPEE, MOD_RANDOMIZER); + itemTable[RG_DODONGOS_CAVERN_MQ_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_SHADOW_MQ_SCYTHE_SILVER_RUPEE] = Item(RG_SHADOW_MQ_SCYTHE_SILVER_RUPEE, Text{ "Shadow Temple MQ Spinning Scythes Silver Rupee", "Shadow Temple MQ Spinning Scythes Silver Rupee", "Shadow Temple MQ Spinning Scythes Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, LOGIC_NONE, RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_SCYTHE_SILVER_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_SILVER_RUPEE, MOD_RANDOMIZER); + itemTable[RG_SHADOW_MQ_SCYTHE_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE] = Item(RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, Text{ "Shadow Temple MQ Invisible Scythes Silver Rupee", "Shadow Temple MQ Invisible Scythes Silver Rupee", "Shadow Temple MQ Invisible Scythes Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, LOGIC_NONE, RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_SILVER_RUPEE, MOD_RANDOMIZER); + itemTable[RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE] = Item(RG_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, Text{ "Shadow Temple MQ Near Falling Spikes Silver Rupee", "Shadow Temple MQ Near Falling Spikes Silver Rupee", "Shadow Temple MQ Near Falling Spikes Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, LOGIC_NONE, RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_SILVER_RUPEE, MOD_RANDOMIZER); + itemTable[RG_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE] = Item(RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, Text{ "Shadow Temple MQ Invisible Spike Room Silver Rupee", "Shadow Temple MQ Invisible Spike Room Silver Rupee", "Shadow Temple MQ Invisible Spike Room Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, LOGIC_NONE, RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_SILVER_RUPEE, MOD_RANDOMIZER); + itemTable[RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE] = Item(RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE, Text{ "Spirit Temple MQ Lobby Silver Rupee", "Spirit Temple MQ Lobby Silver Rupee", "Spirit Temple MQ Lobby Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, LOGIC_NONE, RHT_SPIRIT_TEMPLE_SILVER_RUPEE, RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_SILVER_RUPEE, MOD_RANDOMIZER); + itemTable[RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE] = Item(RG_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE, Text{ "GTG MQ Boulder Maze Silver Rupee", "GTG MQ Boulder Maze Silver Rupee", "GTG MQ Boulder Maze Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, LOGIC_NONE, RHT_GERUDO_TRAINING_GROUND_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_SILVER_RUPEE, MOD_RANDOMIZER); + itemTable[RG_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE] = Item(RG_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE, Text{ "GTG MQ Lava Room Silver Rupee", "GTG MQ Lava Room Silver Rupee", "GTG MQ Lava Room Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, LOGIC_NONE, RHT_GERUDO_TRAINING_GROUND_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_SILVER_RUPEE, MOD_RANDOMIZER); + itemTable[RG_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE] = Item(RG_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE, Text{ "GTG MQ Whirlpool Room Silver Rupee", "GTG MQ Whirlpool Room Silver Rupee", "GTG MQ Whirlpool Room Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, LOGIC_NONE, RHT_GERUDO_TRAINING_GROUND_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_SILVER_RUPEE, MOD_RANDOMIZER); + itemTable[RG_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_FIRE_TRIAL_MQ_SILVER_RUPEE] = Item(RG_FIRE_TRIAL_MQ_SILVER_RUPEE, Text{ "Ganon's Castle Fire Trial MQ Silver Rupee", "Ganon's Castle Fire Trial MQ Silver Rupee", "Ganon's Castle Fire Trial MQ Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, LOGIC_NONE, RHT_GANONS_CASTLE_SILVER_RUPEE, RG_FIRE_TRIAL_MQ_SILVER_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_SILVER_RUPEE, MOD_RANDOMIZER); + itemTable[RG_FIRE_TRIAL_MQ_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_WATER_TRIAL_MQ_SILVER_RUPEE] = Item(RG_WATER_TRIAL_MQ_SILVER_RUPEE, Text{ "Ganon's Castle Water Trial MQ Silver Rupee", "Ganon's Castle Water Trial MQ Silver Rupee", "Ganon's Castle Water Trial MQ Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, LOGIC_NONE, RHT_GANONS_CASTLE_SILVER_RUPEE, RG_WATER_TRIAL_MQ_SILVER_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_SILVER_RUPEE, MOD_RANDOMIZER); + itemTable[RG_WATER_TRIAL_MQ_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_SHADOW_TRIAL_MQ_SILVER_RUPEE] = Item(RG_SHADOW_TRIAL_MQ_SILVER_RUPEE, Text{ "Ganon's Castle Shadow Trial MQ Silver Rupee", "Ganon's Castle Shadow Trial MQ Silver Rupee", "Ganon's Castle Shadow Trial MQ Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, LOGIC_NONE, RHT_GANONS_CASTLE_SILVER_RUPEE, RG_SHADOW_TRIAL_MQ_SILVER_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_SILVER_RUPEE, MOD_RANDOMIZER); + itemTable[RG_SHADOW_TRIAL_MQ_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_BOTTOMLESS_SILVER_RUPEE_POUCH] = Item(RG_BOTTOMLESS_SILVER_RUPEE_POUCH, Text{ "Bottomless Silver Rupee Pouch", "Bottomless Silver Rupee Pouch", "Bottomless Silver Rupee Pouch" }, ITEMTYPE_SILVERRUPEE, 0, true, LOGIC_NONE, RHT_BOTTOMLESS_SILVER_RUPEE_POUCH, RG_BOTTOMLESS_SILVER_RUPEE_POUCH, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_SILVER_RUPEE, MOD_RANDOMIZER); + itemTable[RG_BOTTOMLESS_SILVER_RUPEE_POUCH].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_TRIFORCE] = Item(RG_TRIFORCE, Text{ "Triforce", "Triforce", "Triforce" }, ITEMTYPE_EVENT, RG_TRIFORCE, false, LOGIC_NONE, RHT_NONE, ITEM_CATEGORY_MAJOR); itemTable[RG_HINT] = Item(RG_HINT, Text{ "Hint", "Indice", "Hinweis" }, ITEMTYPE_EVENT, RG_HINT, false, LOGIC_NONE, RHT_NONE, ITEM_CATEGORY_LESSER); // Individual stages of progressive items (only here for GetItemEntry purposes, not for use in seed gen) diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp index 46a89f7af69..d1f331f4920 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp @@ -130,20 +130,25 @@ void RegionTable_Init_BottomOfTheWell() { areaTable[RR_BOTTOM_OF_THE_WELL_BASEMENT] = Region("Bottom of the Well Basement", SCENE_BOTTOM_OF_THE_WELL, {}, { //Locations - LOCATION(RC_BOTTOM_OF_THE_WELL_MAP_CHEST, logic->BlastOrSmash()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_1, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_2, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_3, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_4, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_5, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_6, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_7, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_8, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_9, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_10, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_11, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_12, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), + LOCATION(RC_BOTTOM_OF_THE_WELL_MAP_CHEST, logic->BlastOrSmash()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_1, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_2, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_3, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_4, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_5, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_6, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_7, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_8, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_9, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_10, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_11, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_12, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), + LOCATION(RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_1, true), + LOCATION(RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_2, true), + LOCATION(RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_3, true), + LOCATION(RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_4, true), + LOCATION(RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_5, true), LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1, logic->CanCutShrubs()), LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2, logic->CanCutShrubs()), LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3, logic->CanCutShrubs()), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp index 1bb3cb1ed75..397f2574912 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp @@ -330,10 +330,16 @@ void RegionTable_Init_DodongosCavern() { //EventAccess(LOGIC_DC_CAN_CLIMB_STAIRS, []{return logic->HasExplosives() || logic->CanUse(RG_DINS_FIRE) || (ctx->GetTrickOption(RT_DC_STAIRS_WITH_BOW) && logic->CanUse(RG_FAIRY_BOW));}), }, { //Locations - LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1, logic->CanBreakPots()), - LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2, logic->CanBreakPots()), - LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3, logic->CanBreakPots()), - LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4, logic->CanBreakPots()), + // RANDOTODO some of these are lower but some of these are actually in upper. + LOCATION(RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_1, true), + LOCATION(RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_2, true), + LOCATION(RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_3, true), + LOCATION(RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_4, true), + LOCATION(RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_5, true), LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1, logic->CanBreakCrates()), LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2, logic->CanBreakCrates()), }, { diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp index de95e359f61..ca888cd7565 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp @@ -60,6 +60,13 @@ void RegionTable_Init_GanonsCastle() { LOCATION(RC_GANONS_CASTLE_FOREST_TRIAL_CHEST, logic->CanKillEnemy(RE_WOLFOS)), LOCATION(RC_GANONS_CASTLE_FOREST_TRIAL_POT_1, logic->CanBreakPots() && (logic->CanUse(RG_FIRE_ARROWS) || (logic->CanUse(RG_DINS_FIRE) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT))))), LOCATION(RC_GANONS_CASTLE_FOREST_TRIAL_POT_2, logic->CanBreakPots() && (logic->CanUse(RG_FIRE_ARROWS) || (logic->CanUse(RG_DINS_FIRE) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT))))), + // RANDOTODO consider adding a new region here, since there will now be + // seven checks locked behind Fire Arrows or Din's Fire. + LOCATION(RC_FOREST_TRIAL_SILVER_RUPEE_1, true), + LOCATION(RC_FOREST_TRIAL_SILVER_RUPEE_2, true), + LOCATION(RC_FOREST_TRIAL_SILVER_RUPEE_3, true), + LOCATION(RC_FOREST_TRIAL_SILVER_RUPEE_4, true), + LOCATION(RC_FOREST_TRIAL_SILVER_RUPEE_5, true), }, {}); areaTable[RR_GANONS_CASTLE_FIRE_TRIAL] = Region("Ganon's Castle Fire Trial", SCENE_INSIDE_GANONS_CASTLE, { @@ -70,6 +77,13 @@ void RegionTable_Init_GanonsCastle() { LOCATION(RC_GANONS_CASTLE_FIRE_TRIAL_POT_1, logic->CanBreakPots() && logic->CanUse(RG_GORON_TUNIC) && logic->CanUse(RG_GOLDEN_GAUNTLETS) && logic->CanUse(RG_LONGSHOT)), LOCATION(RC_GANONS_CASTLE_FIRE_TRIAL_POT_2, logic->CanBreakPots() && logic->CanUse(RG_GORON_TUNIC) && logic->CanUse(RG_GOLDEN_GAUNTLETS) && logic->CanUse(RG_LONGSHOT)), LOCATION(RC_GANONS_CASTLE_FIRE_TRIAL_HEART, logic->CanUse(RG_GORON_TUNIC)), + // RANDOTODO consider a new region here, since collecting silver rupees out in + // the overworld will be required to reach the pots above. + LOCATION(RC_FIRE_TRIAL_SILVER_RUPEE_1, true), + LOCATION(RC_FIRE_TRIAL_SILVER_RUPEE_2, true), + LOCATION(RC_FIRE_TRIAL_SILVER_RUPEE_3, true), + LOCATION(RC_FIRE_TRIAL_SILVER_RUPEE_4, true), + LOCATION(RC_FIRE_TRIAL_SILVER_RUPEE_5, true), }, {}); areaTable[RR_GANONS_CASTLE_WATER_TRIAL] = Region("Ganon's Castle Water Trial", SCENE_INSIDE_GANONS_CASTLE, { @@ -114,6 +128,13 @@ void RegionTable_Init_GanonsCastle() { LOCATION(RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_2, ((ctx->GetTrickOption(RT_GANON_SPIRIT_TRIAL_HOOKSHOT) && logic->CanJumpslashExceptHammer()) || logic->CanUse(RG_HOOKSHOT)) && logic->CanUse(RG_BOMBCHU_5) && logic->CanUse(RG_FAIRY_BOW) && (logic->CanUse(RG_MIRROR_SHIELD) || (ctx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS)))), LOCATION(RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), LOCATION(RC_GANONS_CASTLE_SPIRIT_TRIAL_HEART, true), + // RANDOTODO new region here, some chests and pots will be locked behind collecting + // silver rupees from elsewhere now. Also one of these will require hookshot/a trick. + LOCATION(RC_SPIRIT_TRIAL_SILVER_RUPEE_1, true), + LOCATION(RC_SPIRIT_TRIAL_SILVER_RUPEE_2, true), + LOCATION(RC_SPIRIT_TRIAL_SILVER_RUPEE_3, true), + LOCATION(RC_SPIRIT_TRIAL_SILVER_RUPEE_4, true), + LOCATION(RC_SPIRIT_TRIAL_SILVER_RUPEE_5, true), }, {}); areaTable[RR_GANONS_CASTLE_LIGHT_TRIAL] = Region("Ganon's Castle Light Trial", SCENE_INSIDE_GANONS_CASTLE, { @@ -132,6 +153,13 @@ void RegionTable_Init_GanonsCastle() { LOCATION(RC_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1, logic->CanBreakPots() && logic->SmallKeys(SCENE_INSIDE_GANONS_CASTLE, 2)), LOCATION(RC_GANONS_CASTLE_LIGHT_TRIAL_POT_1, logic->CanBreakPots() && logic->CanUse(RG_HOOKSHOT) && logic->SmallKeys(SCENE_INSIDE_GANONS_CASTLE, 2) && (ctx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH))), LOCATION(RC_GANONS_CASTLE_LIGHT_TRIAL_POT_2, logic->CanBreakPots() && logic->CanUse(RG_HOOKSHOT) && logic->SmallKeys(SCENE_INSIDE_GANONS_CASTLE, 2) && (ctx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH))), + // RANDOTODO new region to handle silver rupee collection logic for the pots past + // this puzzle. Also one of these will require hookshot. + LOCATION(RC_LIGHT_TRIAL_SILVER_RUPEE_1, true), + LOCATION(RC_LIGHT_TRIAL_SILVER_RUPEE_2, true), + LOCATION(RC_LIGHT_TRIAL_SILVER_RUPEE_3, true), + LOCATION(RC_LIGHT_TRIAL_SILVER_RUPEE_4, true), + LOCATION(RC_LIGHT_TRIAL_SILVER_RUPEE_5, true), }, {}); #pragma endregion @@ -216,7 +244,14 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_FOREST_TRIAL_BEAMOS_ROOM, []{return true;}), }); - areaTable[RR_GANONS_CASTLE_MQ_FIRE_TRIAL_MAIN_ROOM] = Region("Ganon's Castle MQ Fire Trial Main Room", SCENE_INSIDE_GANONS_CASTLE, {}, {}, { + areaTable[RR_GANONS_CASTLE_MQ_FIRE_TRIAL_MAIN_ROOM] = Region("Ganon's Castle MQ Fire Trial Main Room", SCENE_INSIDE_GANONS_CASTLE, {}, { + // RANDOTODO logic + LOCATION(RC_FIRE_TRIAL_MQ_SILVER_RUPEE_1, true), + LOCATION(RC_FIRE_TRIAL_MQ_SILVER_RUPEE_2, true), + LOCATION(RC_FIRE_TRIAL_MQ_SILVER_RUPEE_3, true), + LOCATION(RC_FIRE_TRIAL_MQ_SILVER_RUPEE_4, true), + LOCATION(RC_FIRE_TRIAL_MQ_SILVER_RUPEE_5, true), + }, { //Exits Entrance(RR_GANONS_CASTLE_MQ_MAIN, []{return true;}), //2 checks, 1 for the rupees, 1 for actually making it, as the rupees are permanent but throwing a pillar is not @@ -246,7 +281,14 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_WATER_TRIAL_BLOCK_ROOM, []{return logic->SmallKeys(SCENE_INSIDE_GANONS_CASTLE, 3) && Here(RR_GANONS_CASTLE_MQ_WATER_TRIAL_GEYSER_ROOM, []{return logic->BlueFire();});}), }); - areaTable[RR_GANONS_CASTLE_MQ_WATER_TRIAL_BLOCK_ROOM] = Region("Ganon's Castle MQ Water Trial Block Room", SCENE_INSIDE_GANONS_CASTLE, {}, {}, { + areaTable[RR_GANONS_CASTLE_MQ_WATER_TRIAL_BLOCK_ROOM] = Region("Ganon's Castle MQ Water Trial Block Room", SCENE_INSIDE_GANONS_CASTLE, {}, { + // RANDOTODO logic, most likely will need bottle/arrows to collect all, maybe hammer? + LOCATION(RC_WATER_TRIAL_MQ_SILVER_RUPEE_1, true), + LOCATION(RC_WATER_TRIAL_MQ_SILVER_RUPEE_2, true), + LOCATION(RC_WATER_TRIAL_MQ_SILVER_RUPEE_3, true), + LOCATION(RC_WATER_TRIAL_MQ_SILVER_RUPEE_4, true), + LOCATION(RC_WATER_TRIAL_MQ_SILVER_RUPEE_5, true), + }, { //Exits Entrance(RR_GANONS_CASTLE_MQ_WATER_TRIAL_GEYSER_ROOM, []{return logic->SmallKeys(SCENE_INSIDE_GANONS_CASTLE, 3);}), //This assumes there's no way for child to have blue fire and not adult. @@ -310,6 +352,13 @@ void RegionTable_Init_GanonsCastle() { areaTable[RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_FAR_SIDE] = Region("Ganon's Castle MQ Shadow Trial Far Side", SCENE_INSIDE_GANONS_CASTLE, {}, { //Locations LOCATION(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, logic->CanHitEyeTargets()), + // RANDOTODO logic for individual silver rupees, which probably also need to be moved + // to some of the other regions here rather than being all in one place. + LOCATION(RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_1, true), + LOCATION(RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_2, true), + LOCATION(RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_3, true), + LOCATION(RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_4, true), + LOCATION(RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_5, true), }, { //Exits Entrance(RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_BEAMOS_TORCH, []{return logic->CanUse(RG_FIRE_ARROWS) || logic->CanUse(RG_HOVER_BOOTS);}), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp index c3f5b3f105c..26bf55ad7b4 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp @@ -25,9 +25,18 @@ void RegionTable_Init_GerudoTrainingGround() { LOCATION(RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART, true), LOCATION(RC_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART, true), + // RANDOTODO move these to their own region, as one for the boulder maze + // currently does not exist. + LOCATION(RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_1, true), + LOCATION(RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_2, true), + LOCATION(RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_3, true), + LOCATION(RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_4, true), + LOCATION(RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_5, true), }, { //Exits Entrance(RR_GERUDO_TRAINING_GROUND_ENTRYWAY, []{return true;}), + // RANDOTODO with silver rupees we can't necessarily get all the way to the heavy + // block room with this logic anymore, will likely need a middle region. Entrance(RR_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_ROOM, []{return logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 2, true) && (logic->CanUse(RG_HOOKSHOT) || ctx->GetTrickOption(RT_GTG_WITHOUT_HOOKSHOT));}), Entrance(RR_GERUDO_TRAINING_GROUND_LAVA_ROOM, []{return Here(RR_GERUDO_TRAINING_GROUND_LOBBY, []{return logic->CanKillEnemy(RE_BEAMOS) && logic->CanKillEnemy(RE_DINOLFOS, ED_CLOSE, true, 2, true);});}), Entrance(RR_GERUDO_TRAINING_GROUND_CENTRAL_MAZE, []{return true;}), @@ -59,6 +68,18 @@ void RegionTable_Init_GerudoTrainingGround() { areaTable[RR_GERUDO_TRAINING_GROUND_LAVA_ROOM] = Region("Gerudo Training Ground Lava Room", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations LOCATION(RC_GERUDO_TRAINING_GROUND_UNDERWATER_SILVER_RUPEE_CHEST, logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_SONG_OF_TIME) && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 24), + // RANDOTODO invidual silver rupee logic, and also moving the check above to another + // region to handle silver rupee puzzle access logic. + LOCATION(RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_1, true), + LOCATION(RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_2, true), + LOCATION(RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_3, true), + LOCATION(RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_4, true), + LOCATION(RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_5, true), + LOCATION(RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_1, true), + LOCATION(RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_2, true), + LOCATION(RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_3, true), + LOCATION(RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_4, true), + LOCATION(RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_5, true), }, { //Exits Entrance(RR_GERUDO_TRAINING_GROUND_CENTRAL_MAZE_RIGHT, []{return logic->CanUse(RG_SONG_OF_TIME) || logic->IsChild;}), @@ -170,7 +191,15 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_MQ_LEFT_SIDE, []{return Here(RR_GERUDO_TRAINING_GROUND_MQ_SAND_ROOM, []{return logic->CanKillEnemy(RE_IRON_KNUCKLE);});}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_LEFT_SIDE] = Region("Gerudo Training Ground MQ Left Side", SCENE_GERUDO_TRAINING_GROUND, {}, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_LEFT_SIDE] = Region("Gerudo Training Ground MQ Left Side", SCENE_GERUDO_TRAINING_GROUND, {}, { + // RANDOTODO I think this is the silver rupee boulder room? Some of the entrance logic + // below might need to be changed to account for silver rupees. + LOCATION(RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_1, true), + LOCATION(RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_2, true), + LOCATION(RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_3, true), + LOCATION(RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_4, true), + LOCATION(RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_5, true), + }, { //Exits Entrance(RR_GERUDO_TRAINING_GROUND_MQ_SAND_ROOM, []{return true;}), Entrance(RR_GERUDO_TRAINING_GROUND_MQ_STALFOS_ROOM, []{return Here(RR_GERUDO_TRAINING_GROUND_MQ_LEFT_SIDE, []{return logic->CanUse(RG_LONGSHOT) || ctx->GetTrickOption(RT_GTG_MQ_WITHOUT_HOOKSHOT) || (ctx->GetTrickOption(RT_GTG_MQ_WITH_HOOKSHOT) && logic->IsAdult && logic->CanJumpslash() && logic->CanUse(RG_HOOKSHOT));});}), @@ -255,7 +284,15 @@ void RegionTable_Init_GerudoTrainingGround() { //this region exists to place silver rupee items on later, normally it's all on fire and cannot be stood on without access from another area //This covers the platform that needs hover boots or the spawned targets to reach from any starting point other than RR_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT //the unshuffled rupee collection is handled by the event GTGPlatformSilverRupees - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_FURTHEST_PLATFORM] = Region("Gerudo Training Ground MQ Furthest Platform", SCENE_GERUDO_TRAINING_GROUND, {}, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_FURTHEST_PLATFORM] = Region("Gerudo Training Ground MQ Furthest Platform", SCENE_GERUDO_TRAINING_GROUND, {}, { + // RANDOTODO double check on these silver rupees, some may need to go to other regions + LOCATION(RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_1, true), + LOCATION(RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_2, true), + LOCATION(RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_3, true), + LOCATION(RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_4, true), + LOCATION(RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_5, true), + LOCATION(RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_6, true) + }, { //Exits //This is merely to extend this region's logic if you have hovers Entrance(RR_GERUDO_TRAINING_GROUND_MQ_LEDGE_SIDE_PLATFORMS, []{return logic->CanUse(RG_HOVER_BOOTS);}), @@ -288,6 +325,10 @@ void RegionTable_Init_GerudoTrainingGround() { //Locations //it is possible to snipe the stingers with bow or sling before dropping in, or just get really lucky, and avoid needing to take damage, but that might be trick worthy LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, logic->HasFireSource() && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 24 && logic->HasItem(RG_BRONZE_SCALE) && logic->TakeDamage()), + // RANDOTODO double check this logic, might at least require Iron Boots. + LOCATION(RC_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE_1, true), + LOCATION(RC_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE_2, true), + LOCATION(RC_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE_3, true), }, { //Exits Entrance(RR_GERUDO_TRAINING_GROUND_MQ_PLATFORMS_UNLIT_TORCH, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp index 9aaaf27a5c3..0970b04a6de 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp @@ -53,6 +53,17 @@ void RegionTable_Init_IceCavern() { LOCATION(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1, logic->BlueFire() && (logic->CanUse(RG_SONG_OF_TIME) || logic->CanUse(RG_BOOMERANG))), LOCATION(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2, logic->BlueFire() && (logic->CanUse(RG_SONG_OF_TIME) || logic->CanUse(RG_BOOMERANG))), LOCATION(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3, logic->BlueFire() && (logic->CanUse(RG_SONG_OF_TIME) || logic->CanUse(RG_BOOMERANG))), + // RANDOTODO might need a new region here for everything past the bars. + LOCATION(RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_1, true), + LOCATION(RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_2, true), + LOCATION(RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_3, true), + LOCATION(RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_4, true), + LOCATION(RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_5, true), + LOCATION(RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_1, true), + LOCATION(RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_2, true), + LOCATION(RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_3, true), + LOCATION(RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_4, true), + LOCATION(RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_5, true), }, {}); #pragma endregion diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp index ac570543ecf..0ce82589b14 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp @@ -44,6 +44,12 @@ void RegionTable_Init_ShadowTemple() { //Locations LOCATION(RC_SHADOW_TEMPLE_COMPASS_CHEST, logic->CanJumpslashExceptHammer()), LOCATION(RC_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_HOOKSHOT)), + // RANDOTODO above logic needs to change/move to the silver rupee items below. + LOCATION(RC_SHADOW_SCYTHE_SILVER_RUPEE_1, true), + LOCATION(RC_SHADOW_SCYTHE_SILVER_RUPEE_2, true), + LOCATION(RC_SHADOW_SCYTHE_SILVER_RUPEE_3, true), + LOCATION(RC_SHADOW_SCYTHE_SILVER_RUPEE_4, true), + LOCATION(RC_SHADOW_SCYTHE_SILVER_RUPEE_5, true), LOCATION(RC_SHADOW_TEMPLE_GS_NEAR_SHIP, false), LOCATION(RC_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), }, { @@ -56,10 +62,22 @@ void RegionTable_Init_ShadowTemple() { //Locations LOCATION(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, logic->CanJumpslashExceptHammer()), LOCATION(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, logic->CanJumpslashExceptHammer()), + // RANDOTODO possibly new region here for silver rupee collection logic + LOCATION(RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_1, true), + LOCATION(RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_2, true), + LOCATION(RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_3, true), + LOCATION(RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_4, true), + LOCATION(RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_5, true), LOCATION(RC_SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST, true), LOCATION(RC_SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST, (ctx->GetTrickOption(RT_SHADOW_UMBRELLA_HOVER) && logic->CanUse(RG_HOVER_BOOTS)) || ctx->GetTrickOption(RT_SHADOW_UMBRELLA_CLIP) || logic->HasItem(RG_GORONS_BRACELET)), LOCATION(RC_SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST, (ctx->GetTrickOption(RT_SHADOW_UMBRELLA_HOVER) && logic->CanUse(RG_HOVER_BOOTS)) || ctx->GetTrickOption(RT_SHADOW_UMBRELLA_CLIP) || logic->HasItem(RG_GORONS_BRACELET)), LOCATION(RC_SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST, logic->SmallKeys(SCENE_SHADOW_TEMPLE, 2) && ((ctx->GetTrickOption(RT_LENS_SHADOW_PLATFORM) && ctx->GetTrickOption(RT_LENS_SHADOW)) || logic->CanUse(RG_LENS_OF_TRUTH))), + // RANDOTODO possible new regions to handle getting past silver rupee puzzle. + LOCATION(RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_1, true), + LOCATION(RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_2, true), + LOCATION(RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_3, true), + LOCATION(RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_4, true), + LOCATION(RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_5, true), LOCATION(RC_SHADOW_TEMPLE_FREESTANDING_KEY, logic->SmallKeys(SCENE_SHADOW_TEMPLE, 2) && ((ctx->GetTrickOption(RT_LENS_SHADOW_PLATFORM) && ctx->GetTrickOption(RT_LENS_SHADOW)) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->CanUse(RG_HOOKSHOT) && (logic->CanUse(RG_BOMB_BAG) || logic->HasItem(RG_GORONS_BRACELET) || (ctx->GetTrickOption(RT_SHADOW_FREESTANDING_KEY) && logic->CanUse(RG_BOMBCHU_5)))), LOCATION(RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, logic->CanJumpslashExceptHammer()), LOCATION(RC_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, logic->CanUse(RG_HOOKSHOT) || (ctx->GetTrickOption(RT_SHADOW_UMBRELLA_GS) && logic->CanUse(RG_HOVER_BOOTS) && logic->CanStandingShield() && logic->CanUse(RG_MASTER_SWORD))), @@ -171,6 +189,12 @@ void RegionTable_Init_ShadowTemple() { areaTable[RR_SHADOW_TEMPLE_MQ_B2_SPINNING_BLADE_ROOM] = Region("Shadow Temple MQ B2 Spinning Blade Room", SCENE_SHADOW_TEMPLE, {}, { //Locations LOCATION(RC_SHADOW_TEMPLE_MQ_MAP_CHEST, logic->CanPassEnemy(RE_BIG_SKULLTULA) && (logic->CanUse(RG_HOOKSHOT) || (logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS)))), + // RANDOTODO silver rupee logic + LOCATION(RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_1, true), + LOCATION(RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_2, true), + LOCATION(RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_3, true), + LOCATION(RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_4, true), + LOCATION(RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_5, true), }, { //Exits Entrance(RR_SHADOW_TEMPLE_MQ_FIRST_BEAMOS, []{return Here(RR_SHADOW_TEMPLE_MQ_B2_SPINNING_BLADE_ROOM, []{return logic->CanKillEnemy(RE_BIG_SKULLTULA) && (logic->CanUse(RG_HOOKSHOT) || (logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS)));});}), @@ -215,6 +239,17 @@ void RegionTable_Init_ShadowTemple() { ((ctx->GetTrickOption(RT_LENS_SHADOW_MQ) && (ctx->GetTrickOption(RT_LENS_SHADOW_MQ_INVISIBLE_BLADES) || logic->IsChild || logic->CanUse(RG_NAYRUS_LOVE))) || logic->CanUse(RG_LENS_OF_TRUTH))), LOCATION(RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_LEFT_HEART, (logic->CanUse(RG_SONG_OF_TIME) && logic->IsAdult) || (ctx->GetTrickOption(RT_SHADOW_MQ_INVISIBLE_BLADES) && logic->EffectiveHealth() > 1) || logic->CanUse(RG_BOOMERANG)), LOCATION(RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_RIGHT_HEART, (logic->CanUse(RG_SONG_OF_TIME) && logic->IsAdult) || (ctx->GetTrickOption(RT_SHADOW_MQ_INVISIBLE_BLADES) && logic->EffectiveHealth() > 1) || logic->CanUse(RG_BOOMERANG)), + // RANDOTODO silver rupee logic + LOCATION(RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_1, true), + LOCATION(RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_2, true), + LOCATION(RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_3, true), + LOCATION(RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_4, true), + LOCATION(RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_5, true), + LOCATION(RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_6, true), + LOCATION(RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_7, true), + LOCATION(RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_8, true), + LOCATION(RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_9, true), + LOCATION(RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_10, true), }, { //Exits Entrance(RR_SHADOW_TEMPLE_MQ_UPPER_HUGE_PIT, []{return true;}), @@ -223,6 +258,12 @@ void RegionTable_Init_ShadowTemple() { areaTable[RR_SHADOW_TEMPLE_MQ_LOWER_HUGE_PIT] = Region("Shadow Temple MQ Lower Huge Pit", SCENE_SHADOW_TEMPLE, {}, { //Locations LOCATION(RC_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, logic->CanUse(RG_LONGSHOT)), + // RANDOTODO silver rupee logic + LOCATION(RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_1, true), + LOCATION(RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_2, true), + LOCATION(RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_3, true), + LOCATION(RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_4, true), + LOCATION(RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_5, true), }, { //Exits Entrance(RR_SHADOW_TEMPLE_MQ_STONE_UMBRELLA_ROOM, []{return Here(RR_SHADOW_TEMPLE_MQ_LOWER_HUGE_PIT, []{return logic->CanJumpslash() || logic->HasExplosives();});}), @@ -269,6 +310,17 @@ void RegionTable_Init_ShadowTemple() { }, { //Locations LOCATION(RC_SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST, logic->CanKillEnemy(RE_REDEAD) && (ctx->GetTrickOption(RT_LENS_SHADOW_MQ) || logic->TakeDamage() || logic->CanUse(RG_LENS_OF_TRUTH))), + // RANDOTODO silver rupee logic + LOCATION(RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_1, true), + LOCATION(RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_2, true), + LOCATION(RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_3, true), + LOCATION(RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_4, true), + LOCATION(RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_5, true), + LOCATION(RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_6, true), + LOCATION(RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_7, true), + LOCATION(RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_8, true), + LOCATION(RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_9, true), + LOCATION(RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_10, true), }, { //Exits Entrance(RR_SHADOW_TEMPLE_MQ_STALFOS_ROOM, []{return logic->Get(LOGIC_SHADOW_MQ_FLOOR_SPIKES_RUPEES);}), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp index 8b75e7b9588..7ba8c7b4d25 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp @@ -35,6 +35,13 @@ void RegionTable_Init_SpiritTemple() { LOCATION(RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), LOCATION(RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT)))) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_DINS_FIRE))), LOCATION(RC_SPIRIT_TEMPLE_GS_METAL_FENCE, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + // RANDOTODO silver rupee logic. Shouldn't need much here. Maybe could make each room a + // a region to simplify some of this other logic. + LOCATION(RC_SPIRIT_GATE_SILVER_RUPEE_1, true), + LOCATION(RC_SPIRIT_GATE_SILVER_RUPEE_2, true), + LOCATION(RC_SPIRIT_GATE_SILVER_RUPEE_3, true), + LOCATION(RC_SPIRIT_GATE_SILVER_RUPEE_4, true), + LOCATION(RC_SPIRIT_GATE_SILVER_RUPEE_5, true), LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_1, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_2, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_3, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), @@ -68,6 +75,13 @@ void RegionTable_Init_SpiritTemple() { LOCATION(RC_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, logic->SmallKeys(SCENE_SPIRIT_TEMPLE, 3)), LOCATION(RC_SPIRIT_TEMPLE_GS_BOULDER_ROOM, logic->CanUse(RG_SONG_OF_TIME) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_BOMBCHU_5) || (logic->CanUse(RG_BOMB_BAG) && ctx->GetTrickOption(RT_SPIRIT_LOWER_ADULT_SWITCH)))), LOCATION(RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_BOMBCHU_5) || (logic->CanUse(RG_BOMB_BAG) && logic->IsAdult && ctx->GetTrickOption(RT_SPIRIT_LOWER_ADULT_SWITCH))) && (logic->CanUse(RG_HOVER_BOOTS) || logic->CanJumpslash())), + //RANDOTODO silver rupee logic. This one might actually be fine as is, other than maybe + // the chest after boulder room? + LOCATION(RC_SPIRIT_BOULDER_SILVER_RUPEE_1, true), + LOCATION(RC_SPIRIT_BOULDER_SILVER_RUPEE_2, true), + LOCATION(RC_SPIRIT_BOULDER_SILVER_RUPEE_3, true), + LOCATION(RC_SPIRIT_BOULDER_SILVER_RUPEE_4, true), + LOCATION(RC_SPIRIT_BOULDER_SILVER_RUPEE_5, true), }, { //Exits Entrance(RR_SPIRIT_TEMPLE_CENTRAL_CHAMBER, []{return logic->SmallKeys(SCENE_SPIRIT_TEMPLE, 1);}), @@ -83,6 +97,12 @@ void RegionTable_Init_SpiritTemple() { (logic->CanUse(RG_DINS_FIRE) || ((logic->CanUse(RG_FIRE_ARROWS) || ctx->GetTrickOption(RT_SPIRIT_SUN_CHEST)) && logic->CanUse(RG_FAIRY_BOW) && logic->CanUse(RG_STICKS) ))) || (logic->SmallKeys(SCENE_SPIRIT_TEMPLE, 5) && logic->HasExplosives() && logic->CanUse(RG_STICKS)) || (logic->SmallKeys(SCENE_SPIRIT_TEMPLE, 3) && (logic->CanUse(RG_FIRE_ARROWS) || (ctx->GetTrickOption(RT_SPIRIT_SUN_CHEST) && logic->CanUse(RG_FAIRY_BOW))) && logic->CanUse(RG_SILVER_GAUNTLETS))), + // RANDOTODO silver rupee logic, may need some new regions here, not sure. + LOCATION(RC_SPIRIT_BEAMOS_SILVER_RUPEE_1, true), + LOCATION(RC_SPIRIT_BEAMOS_SILVER_RUPEE_2, true), + LOCATION(RC_SPIRIT_BEAMOS_SILVER_RUPEE_3, true), + LOCATION(RC_SPIRIT_BEAMOS_SILVER_RUPEE_4, true), + LOCATION(RC_SPIRIT_BEAMOS_SILVER_RUPEE_5, true), LOCATION(RC_SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST, logic->SmallKeys(SCENE_SPIRIT_TEMPLE, 3) && logic->CanUse(RG_SILVER_GAUNTLETS) && logic->CanUse(RG_ZELDAS_LULLABY)), LOCATION(RC_SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST, logic->SmallKeys(SCENE_SPIRIT_TEMPLE, 3) && logic->CanUse(RG_SILVER_GAUNTLETS) && logic->CanUse(RG_ZELDAS_LULLABY) && (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS) || ctx->GetTrickOption(RT_SPIRIT_LOBBY_JUMP))), LOCATION(RC_SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM, (logic->HasExplosives() && logic->CanUse(RG_BOOMERANG) && logic->CanUse(RG_HOOKSHOT)) || @@ -161,6 +181,12 @@ void RegionTable_Init_SpiritTemple() { LOCATION(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2, logic->CanBreakPots()), LOCATION(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3, logic->CanBreakPots()), LOCATION(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4, logic->CanBreakPots()), + // RANDOTODO silver rupee logic, a couple of these might need to be in 1f west region. + LOCATION(RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_1, true), + LOCATION(RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_2, true), + LOCATION(RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_3, true), + LOCATION(RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_4, true), + LOCATION(RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_5, true), }, { //Exits Entrance(RR_SPIRIT_TEMPLE_ENTRYWAY, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/option_descriptions.cpp b/soh/soh/Enhancements/randomizer/option_descriptions.cpp index ce612001b8b..023264b6c4f 100644 --- a/soh/soh/Enhancements/randomizer/option_descriptions.cpp +++ b/soh/soh/Enhancements/randomizer/option_descriptions.cpp @@ -763,5 +763,13 @@ void Settings::CreateOptionDescriptions() { "Shuffles 8 boss souls (one for each blue warp dungeon). A boss will not appear until you collect its " "respective soul." "\n\"On + Ganon\" will also hide Ganon and Ganondorf behind a boss soul."; + mOptionDescriptions[RSK_SHUFFLE_SILVER_RUPEES] = + "Shuffle Silver Rupees out of their usual locations in dungeons. " + "They will be replaced with new items and can be found at other locations in the game. The doors they " + "previously controlled will be opened when all of the Silver Rupees that used to be in that room have been " + "found wherever they have been shuffled to."; + mOptionDescriptions[RSK_BOTTOMLESS_SILVER_RUPEE_POUCH] = + "Adds a special item to the pool that causes all " + "Silver Rupee puzzles to be completed regardless of how many Silver Rupees you have collected."; } } // namespace Rando diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index ac0b7ea4af7..68d0292b455 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -4701,6 +4701,15 @@ template void CreateGetItemMessages(const std::arrayCreateMessage( + Randomizer::getItemMessageTableID, RG_SILVER_RUPEE_FIRST, + CustomMessage("You got a %c[[rupee_name]]%w! [[count_text]]", TEXTBOX_TYPE_BLUE, TEXTBOX_POS_BOTTOM)); + + customMessageManager->CreateMessage( + Randomizer::getItemMessageTableID, RG_BOTTOMLESS_SILVER_RUPEE_POUCH, + CustomMessage("You found the %cBottomless Silver Rupee Pouch! All Silver Rupee Puzzles are Unlocked", + TEXTBOX_TYPE_BLUE, TEXTBOX_POS_BOTTOM)); } void CreateRupeeMessages() { @@ -6127,6 +6136,18 @@ extern "C" u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { Flags_SetRandomizerInf( (RandomizerInf)((int)RAND_INF_GUARD_HOUSE_UNLOCKED + ((item - RG_GUARD_HOUSE_KEY) * 2) + 1)); return Return_Item_Entry(giEntry, RG_NONE); + } else if (item >= RG_SILVER_RUPEE_FIRST && item <= RG_SILVER_RUPEE_LAST) { + OTRGlobals::Instance->gRandoContext->GetSilverRupeeCounter(static_cast(item)) + .IncrementCollected(); + return Return_Item_Entry(giEntry, RG_NONE); + } else if (item == RG_BOTTOMLESS_SILVER_RUPEE_POUCH) { + for (int i = RG_SILVER_RUPEE_FIRST; i <= RG_SILVER_RUPEE_LAST; i++) { + int max = + OTRGlobals::Instance->gRandoContext->GetSilverRupeeCounter(static_cast(i)).GetTotal(); + OTRGlobals::Instance->gRandoContext->GetSilverRupeeCounter(static_cast(i)) + .IncrementCollected(max); + } + return Return_Item_Entry(giEntry, RG_NONE); } switch (item) { diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 9f105f400f4..a2998698be6 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -423,6 +423,7 @@ typedef enum { RCTYPE_FREESTANDING, // Freestanding rupees and hearts RCTYPE_FAIRY, // Fairies RCTYPE_GRASS, // Grass + RCTYPE_SILVER_RUPEE, // Silver Rupees } RandomizerCheckType; typedef enum { RCQUEST_VANILLA, RCQUEST_MQ, RCQUEST_BOTH } RandomizerCheckQuest; @@ -3616,6 +3617,159 @@ typedef enum { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_8, // End Grass + // Vanilla Silver Rupee Locations + RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_1, + RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_2, + RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_3, + RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_4, + RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_5, + RC_SHADOW_SCYTHE_SILVER_RUPEE_1, + RC_SHADOW_SCYTHE_SILVER_RUPEE_2, + RC_SHADOW_SCYTHE_SILVER_RUPEE_3, + RC_SHADOW_SCYTHE_SILVER_RUPEE_4, + RC_SHADOW_SCYTHE_SILVER_RUPEE_5, + RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_1, + RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_2, + RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_3, + RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_4, + RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_5, + RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_1, + RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_2, + RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_3, + RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_4, + RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_5, + RC_SPIRIT_GATE_SILVER_RUPEE_1, + RC_SPIRIT_GATE_SILVER_RUPEE_2, + RC_SPIRIT_GATE_SILVER_RUPEE_3, + RC_SPIRIT_GATE_SILVER_RUPEE_4, + RC_SPIRIT_GATE_SILVER_RUPEE_5, + RC_SPIRIT_BEAMOS_SILVER_RUPEE_1, + RC_SPIRIT_BEAMOS_SILVER_RUPEE_2, + RC_SPIRIT_BEAMOS_SILVER_RUPEE_3, + RC_SPIRIT_BEAMOS_SILVER_RUPEE_4, + RC_SPIRIT_BEAMOS_SILVER_RUPEE_5, + RC_SPIRIT_BOULDER_SILVER_RUPEE_1, + RC_SPIRIT_BOULDER_SILVER_RUPEE_2, + RC_SPIRIT_BOULDER_SILVER_RUPEE_3, + RC_SPIRIT_BOULDER_SILVER_RUPEE_4, + RC_SPIRIT_BOULDER_SILVER_RUPEE_5, + RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_1, + RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_2, + RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_3, + RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_4, + RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_5, + RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_1, + RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_2, + RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_3, + RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_4, + RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_5, + RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_1, + RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_2, + RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_3, + RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_4, + RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_5, + RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_1, + RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_2, + RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_3, + RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_4, + RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_5, + RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_1, + RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_2, + RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_3, + RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_4, + RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_5, + RC_FOREST_TRIAL_SILVER_RUPEE_1, + RC_FOREST_TRIAL_SILVER_RUPEE_2, + RC_FOREST_TRIAL_SILVER_RUPEE_3, + RC_FOREST_TRIAL_SILVER_RUPEE_4, + RC_FOREST_TRIAL_SILVER_RUPEE_5, + RC_FIRE_TRIAL_SILVER_RUPEE_1, + RC_FIRE_TRIAL_SILVER_RUPEE_2, + RC_FIRE_TRIAL_SILVER_RUPEE_3, + RC_FIRE_TRIAL_SILVER_RUPEE_4, + RC_FIRE_TRIAL_SILVER_RUPEE_5, + RC_LIGHT_TRIAL_SILVER_RUPEE_1, + RC_LIGHT_TRIAL_SILVER_RUPEE_2, + RC_LIGHT_TRIAL_SILVER_RUPEE_3, + RC_LIGHT_TRIAL_SILVER_RUPEE_4, + RC_LIGHT_TRIAL_SILVER_RUPEE_5, + RC_SPIRIT_TRIAL_SILVER_RUPEE_1, + RC_SPIRIT_TRIAL_SILVER_RUPEE_2, + RC_SPIRIT_TRIAL_SILVER_RUPEE_3, + RC_SPIRIT_TRIAL_SILVER_RUPEE_4, + RC_SPIRIT_TRIAL_SILVER_RUPEE_5, + // MQ Silver Rupee Locations + RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_1, + RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_2, + RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_3, + RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_4, + RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_5, + RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_1, + RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_2, + RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_3, + RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_4, + RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_5, + RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_1, + RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_2, + RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_3, + RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_4, + RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_5, + RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_6, + RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_7, + RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_8, + RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_9, + RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_10, + RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_1, + RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_2, + RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_3, + RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_4, + RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_5, + RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_1, + RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_2, + RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_3, + RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_4, + RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_5, + RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_6, + RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_7, + RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_8, + RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_9, + RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_10, + RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_1, + RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_2, + RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_3, + RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_4, + RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_5, + RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_1, + RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_2, + RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_3, + RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_4, + RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_5, + RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_1, + RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_2, + RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_3, + RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_4, + RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_5, + RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_6, + RC_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE_1, + RC_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE_2, + RC_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE_3, + RC_FIRE_TRIAL_MQ_SILVER_RUPEE_1, + RC_FIRE_TRIAL_MQ_SILVER_RUPEE_2, + RC_FIRE_TRIAL_MQ_SILVER_RUPEE_3, + RC_FIRE_TRIAL_MQ_SILVER_RUPEE_4, + RC_FIRE_TRIAL_MQ_SILVER_RUPEE_5, + RC_WATER_TRIAL_MQ_SILVER_RUPEE_1, + RC_WATER_TRIAL_MQ_SILVER_RUPEE_2, + RC_WATER_TRIAL_MQ_SILVER_RUPEE_3, + RC_WATER_TRIAL_MQ_SILVER_RUPEE_4, + RC_WATER_TRIAL_MQ_SILVER_RUPEE_5, + RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_1, + RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_2, + RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_3, + RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_4, + RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_5, + // End Silver Rupees + RC_MAX } RandomizerCheck; @@ -4108,6 +4262,37 @@ typedef enum { RG_FISHING_POLE, RG_DEKU_STICK_BAG, RG_DEKU_NUT_BAG, + RG_SILVER_RUPEE_FIRST, + RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE = RG_SILVER_RUPEE_FIRST, // for convenience + RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, + RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, + RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, + RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, + RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, + RG_SPIRIT_GATE_SILVER_RUPEE, + RG_SPIRIT_BEAMOS_SILVER_RUPEE, + RG_SPIRIT_BOULDER_SILVER_RUPEE, + RG_SHADOW_SCYTHE_SILVER_RUPEE, + RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, + RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, + RG_FOREST_TRIAL_SILVER_RUPEE, + RG_FIRE_TRIAL_SILVER_RUPEE, + RG_SPIRIT_TRIAL_SILVER_RUPEE, + RG_LIGHT_TRIAL_SILVER_RUPEE, + RG_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE, + RG_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE, + RG_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE, + RG_DODONGOS_CAVERN_MQ_SILVER_RUPEE, + RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE, + RG_SHADOW_MQ_SCYTHE_SILVER_RUPEE, + RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, + RG_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, + RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, + RG_FIRE_TRIAL_MQ_SILVER_RUPEE, + RG_WATER_TRIAL_MQ_SILVER_RUPEE, + RG_SHADOW_TRIAL_MQ_SILVER_RUPEE, + RG_SILVER_RUPEE_LAST = RG_SHADOW_TRIAL_MQ_SILVER_RUPEE, + RG_BOTTOMLESS_SILVER_RUPEE_POUCH, RG_HINT, RG_TYCOON_WALLET, RG_BRONZE_SCALE, @@ -5062,6 +5247,28 @@ typedef enum { RHT_BEEHIVE_SCRUB_TRIO_GROTTO, RHT_BEEHIVE_IN_FRONT_OF_KING_ZORA, RHT_BEEHIVE_BEHIND_KING_ZORA, + // Silver Rupee Locations + RHT_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, + RHT_ICE_CAVERN_SLIDING_SILVER_RUPEE, + RHT_BOTTOM_OF_THE_WELL_BASEMENT_SILVER_RUPEE, + RHT_GERUDO_TRAINING_GROUND_BOULDER_SILVER_RUPEE, + RHT_GERUDO_TRAINING_GROUND_LAVA_SILVER_RUPEE, + RHT_GERUDO_TRAINING_GROUND_TOILET_SILVER_RUPEE, + RHT_SPIRIT_GATE_SILVER_RUPEE, + RHT_SPIRIT_BEAMOS_SILVER_RUPEE, + RHT_SPIRIT_BOULDER_SILVER_RUPEE, + RHT_SPIRIT_LOBBY_SILVER_RUPEE, + RHT_SHADOW_SPINNING_SCYTHE_SILVER_RUPEE, + RHT_SHADOW_INVISIBLE_SCYTHE_SILVER_RUPEE, + RHT_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, + RHT_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, + RHT_FOREST_TRIAL_SILVER_RUPEE, + RHT_FIRE_TRIAL_SILVER_RUPEE, + RHT_SPIRIT_TRIAL_SILVER_RUPEE, + RHT_LIGHT_TRIAL_SILVER_RUPEE, + RHT_DODONGOS_CAVERN_SILVER_RUPEE, + RHT_WATER_TRIAL_SILVER_RUPEE, + RHT_SHADOW_TRIAL_SILVER_RUPEE, // Items RHT_KOKIRI_SWORD, RHT_MASTER_SWORD, @@ -5310,6 +5517,15 @@ typedef enum { RHT_BRONZE_SCALE, RHT_FISHING_POLE, RHT_SKELETON_KEY, + // Silver Rupee Items + RHT_DC_SILVER_RUPEE, + RHT_ICE_CAVERN_SILVER_RUPEE, + RHT_BOTTOM_OF_THE_WELL_SILVER_RUPEE, + RHT_GERUDO_TRAINING_GROUND_SILVER_RUPEE, + RHT_SPIRIT_TEMPLE_SILVER_RUPEE, + RHT_SHADOW_TEMPLE_SILVER_RUPEE, + RHT_GANONS_CASTLE_SILVER_RUPEE, + RHT_BOTTOMLESS_SILVER_RUPEE_POUCH, RHT_EPONA, RHT_OVERWORLD_KEY, RHT_HINT_MYSTERIOUS, @@ -6063,6 +6279,8 @@ typedef enum { RSK_SHUFFLE_FAIRIES, RSK_LOCK_OVERWORLD_DOORS, RSK_SHUFFLE_GRASS, + RSK_SHUFFLE_SILVER_RUPEES, + RSK_BOTTOMLESS_SILVER_RUPEE_POUCH, RSK_MAX } RandomizerSettingKey; diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index d42e14cb101..84e8d0cbf71 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -1953,4 +1953,156 @@ DEFINE_RAND_INF(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_6) DEFINE_RAND_INF(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_7) DEFINE_RAND_INF(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_8) // End Grass -DEFINE_RAND_INF(RAND_INF_OBTAINED_RUTOS_LETTER) \ No newline at end of file +DEFINE_RAND_INF(RAND_INF_OBTAINED_RUTOS_LETTER) + +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_SILVER_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_SILVER_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_SILVER_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_SILVER_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_SILVER_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_SLIDING_SILVER_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_SLIDING_SILVER_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_SLIDING_SILVER_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_SLIDING_SILVER_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_SLIDING_SILVER_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_6) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_SPIRIT_GATE_SILVER_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_GATE_SILVER_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_GATE_SILVER_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_SPIRIT_GATE_SILVER_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_SPIRIT_GATE_SILVER_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_SPIRIT_BEAMOS_SILVER_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_BEAMOS_SILVER_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_BEAMOS_SILVER_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_SPIRIT_BEAMOS_SILVER_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_SPIRIT_BEAMOS_SILVER_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_SPIRIT_BOULDER_SILVER_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_BOULDER_SILVER_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_BOULDER_SILVER_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_SPIRIT_BOULDER_SILVER_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_SPIRIT_BOULDER_SILVER_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_SHADOW_SCYTHE_SILVER_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_SCYTHE_SILVER_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_SCYTHE_SILVER_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_SHADOW_SCYTHE_SILVER_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_SHADOW_SCYTHE_SILVER_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_FOREST_TRIAL_SILVER_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_FOREST_TRIAL_SILVER_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_FOREST_TRIAL_SILVER_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_FOREST_TRIAL_SILVER_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_FOREST_TRIAL_SILVER_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_FIRE_TRIAL_SILVER_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TRIAL_SILVER_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TRIAL_SILVER_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_FIRE_TRIAL_SILVER_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_FIRE_TRIAL_SILVER_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_LIGHT_TRIAL_SILVER_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_LIGHT_TRIAL_SILVER_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_LIGHT_TRIAL_SILVER_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_LIGHT_TRIAL_SILVER_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_LIGHT_TRIAL_SILVER_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TRIAL_SILVER_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TRIAL_SILVER_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TRIAL_SILVER_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TRIAL_SILVER_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TRIAL_SILVER_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_6) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_SPIRIT_MQ_LOBBY_SILVER_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_MQ_LOBBY_SILVER_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_MQ_LOBBY_SILVER_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_SPIRIT_MQ_LOBBY_SILVER_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_SPIRIT_MQ_LOBBY_SILVER_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SCYTHE_SILVER_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SCYTHE_SILVER_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SCYTHE_SILVER_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SCYTHE_SILVER_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SCYTHE_SILVER_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_6) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_7) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_8) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_9) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_10) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_6) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_7) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_8) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_9) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_10) +DEFINE_RAND_INF(RAND_INF_FIRE_TRIAL_MQ_SILVER_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TRIAL_MQ_SILVER_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TRIAL_MQ_SILVER_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_FIRE_TRIAL_MQ_SILVER_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_FIRE_TRIAL_MQ_SILVER_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_WATER_TRIAL_MQ_SILVER_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TRIAL_MQ_SILVER_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TRIAL_MQ_SILVER_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_WATER_TRIAL_MQ_SILVER_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_WATER_TRIAL_MQ_SILVER_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_SHADOW_TRIAL_MQ_SILVER_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_TRIAL_MQ_SILVER_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_TRIAL_MQ_SILVER_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_SHADOW_TRIAL_MQ_SILVER_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_SHADOW_TRIAL_MQ_SILVER_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_MAGICAL_SILVER_RUPEE) \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index 9e5a9be89e1..f8d40315fad 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -8,6 +8,7 @@ #include "randomizer_check_tracker.h" #include "randomizer_item_tracker.h" #include "randomizerTypes.h" +#include "dungeon.h" #include "soh/cvar_prefixes.h" #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/OTRGlobals.h" @@ -27,6 +28,7 @@ extern PlayState* gPlayState; #include "textures/icon_item_static/icon_item_static.h" #include "textures/icon_item_24_static/icon_item_24_static.h" +#include } void DrawEquip(ItemTrackerItem item); @@ -60,6 +62,7 @@ static WidgetInfo overworldKeysTracking; static WidgetInfo fishingPoleTracking; static WidgetInfo personalNotesWiget; static WidgetInfo hookshotIdentWidget; +static WidgetInfo silverRupeeTracking; namespace SohGui { extern std::shared_ptr mSohMenu; @@ -182,6 +185,49 @@ std::vector overworldKeyItems = { ITEM_TRACKER_ITEM_CUSTOM(RG_FISHING_HOLE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), }; +std::vector silverRupeeItems = { + ITEM_TRACKER_ITEM_CUSTOM(RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, ITEM_RUPEE_SILVER, ITEM_RUPEE_SILVER, 0, + DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, ITEM_RUPEE_SILVER, ITEM_RUPEE_SILVER, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, ITEM_RUPEE_SILVER, ITEM_RUPEE_SILVER, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, ITEM_RUPEE_SILVER, ITEM_RUPEE_SILVER, 0, + DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, ITEM_RUPEE_SILVER, ITEM_RUPEE_SILVER, 0, + DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, ITEM_RUPEE_SILVER, ITEM_RUPEE_SILVER, 0, + DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_SPIRIT_GATE_SILVER_RUPEE, ITEM_RUPEE_SILVER, ITEM_RUPEE_SILVER, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_SPIRIT_BEAMOS_SILVER_RUPEE, ITEM_RUPEE_SILVER, ITEM_RUPEE_SILVER, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_SPIRIT_BOULDER_SILVER_RUPEE, ITEM_RUPEE_SILVER, ITEM_RUPEE_SILVER, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_SHADOW_SCYTHE_SILVER_RUPEE, ITEM_RUPEE_SILVER, ITEM_RUPEE_SILVER, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, ITEM_RUPEE_SILVER, ITEM_RUPEE_SILVER, 0, + DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, ITEM_RUPEE_SILVER, ITEM_RUPEE_SILVER, 0, + DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_FOREST_TRIAL_SILVER_RUPEE, ITEM_RUPEE_SILVER, ITEM_RUPEE_SILVER, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_FIRE_TRIAL_SILVER_RUPEE, ITEM_RUPEE_SILVER, ITEM_RUPEE_SILVER, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_SPIRIT_TRIAL_SILVER_RUPEE, ITEM_RUPEE_SILVER, ITEM_RUPEE_SILVER, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_LIGHT_TRIAL_SILVER_RUPEE, ITEM_RUPEE_SILVER, ITEM_RUPEE_SILVER, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE, ITEM_RUPEE_SILVER, ITEM_RUPEE_SILVER, + 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE, ITEM_RUPEE_SILVER, ITEM_RUPEE_SILVER, 0, + DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE, ITEM_RUPEE_SILVER, ITEM_RUPEE_SILVER, 0, + DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_DODONGOS_CAVERN_MQ_SILVER_RUPEE, ITEM_RUPEE_SILVER, ITEM_RUPEE_SILVER, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_SHADOW_MQ_SCYTHE_SILVER_RUPEE, ITEM_RUPEE_SILVER, ITEM_RUPEE_SILVER, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, ITEM_RUPEE_SILVER, ITEM_RUPEE_SILVER, 0, + DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, ITEM_RUPEE_SILVER, ITEM_RUPEE_SILVER, 0, + DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, ITEM_RUPEE_SILVER, ITEM_RUPEE_SILVER, 0, + DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE, ITEM_RUPEE_SILVER, ITEM_RUPEE_SILVER, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_FIRE_TRIAL_MQ_SILVER_RUPEE, ITEM_RUPEE_SILVER, ITEM_RUPEE_SILVER, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_WATER_TRIAL_MQ_SILVER_RUPEE, ITEM_RUPEE_SILVER, ITEM_RUPEE_SILVER, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_SHADOW_TRIAL_MQ_SILVER_RUPEE, ITEM_RUPEE_SILVER, ITEM_RUPEE_SILVER, 0, DrawItem), +}; + std::vector fishingPoleItems = { ITEM_TRACKER_ITEM(ITEM_FISHING_POLE, 0, DrawItem) }; std::vector itemTrackerDungeonsWithMapsHorizontal = { @@ -721,6 +767,30 @@ void DrawItemCount(ItemTrackerItem item, bool hideMax) { ImGui::PushStyleColor(ImGuiCol_Text, maxColor); ImGui::Text("%s", maxString.c_str()); ImGui::PopStyleColor(); + } else if (item.id >= RG_SILVER_RUPEE_FIRST && item.id <= RG_SILVER_RUPEE_LAST && IS_RANDO && + OTRGlobals::Instance->gRandoContext->GetOption(RSK_SHUFFLE_SILVER_RUPEES).Get() > + RO_DUNGEON_ITEM_LOC_VANILLA && + IsValidSaveFile()) { + RandomizerGet rgid = static_cast(item.id); + std::string current = ""; + std::string max = ""; + uint8_t rupeesMax = OTRGlobals::Instance->gRandoContext->GetSilverRupeeCounter(rgid).GetTotal(); + ImU32 currentColor = OTRGlobals::Instance->gRandoContext->GetSilverRupeeCounter(rgid).AllCollected() + ? IM_COL_GREEN + : IM_COL_WHITE; + ImU32 maxColor = IM_COL_GREEN; + current += std::to_string(OTRGlobals::Instance->gRandoContext->GetSilverRupeeCounter(rgid).GetCollected()); + current += "/"; + max += std::to_string(rupeesMax); + ImGui::SetCursorScreenPos( + ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize((current + max).c_str()).x / 2), p.y - 14)); + ImGui::PushStyleColor(ImGuiCol_Text, currentColor); + ImGui::Text("%d/", OTRGlobals::Instance->gRandoContext->GetSilverRupeeCounter(rgid).GetCollected()); + ImGui::PopStyleColor(); + ImGui::SameLine(0, 0.0f); + ImGui::PushStyleColor(ImGuiCol_Text, maxColor); + ImGui::Text("%d", rupeesMax); + ImGui::PopStyleColor(); } else { ImGui::SetCursorScreenPos(ImVec2(p.x, p.y - 14)); ImGui::Text(""); @@ -1008,6 +1078,41 @@ void DrawItem(ItemTrackerItem item) { hasItem = Flags_GetRandomizerInf(RAND_INF_FISHING_HOLE_KEY_OBTAINED); itemName = "Fishing Hole Key"; break; + case RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE: + case RG_ICE_CAVERN_SLIDING_SILVER_RUPEE: + case RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE: + case RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE: + case RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE: + case RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE: + case RG_SPIRIT_GATE_SILVER_RUPEE: + case RG_SPIRIT_BEAMOS_SILVER_RUPEE: + case RG_SPIRIT_BOULDER_SILVER_RUPEE: + case RG_SHADOW_SCYTHE_SILVER_RUPEE: + case RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE: + case RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE: + case RG_FOREST_TRIAL_SILVER_RUPEE: + case RG_FIRE_TRIAL_SILVER_RUPEE: + case RG_SPIRIT_TRIAL_SILVER_RUPEE: + case RG_LIGHT_TRIAL_SILVER_RUPEE: + case RG_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE: + case RG_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE: + case RG_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE: + case RG_DODONGOS_CAVERN_MQ_SILVER_RUPEE: + case RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE: + case RG_SHADOW_MQ_SCYTHE_SILVER_RUPEE: + case RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE: + case RG_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE: + case RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE: + case RG_FIRE_TRIAL_MQ_SILVER_RUPEE: + case RG_WATER_TRIAL_MQ_SILVER_RUPEE: + case RG_SHADOW_TRIAL_MQ_SILVER_RUPEE: + actualItemId = item.id; + hasItem = OTRGlobals::Instance->gRandoContext->GetOption(RSK_SHUFFLE_SILVER_RUPEES).Get() > + RO_DUNGEON_ITEM_LOC_VANILLA; + itemName = Rando::StaticData::RetrieveItem(static_cast(actualItemId)) + .GetName() + .GetForLanguage(CVarGetInteger(CVAR_SETTING("Languages"), LANGUAGE_ENG)); + break; } if (GameInteractor::IsSaveLoaded() && @@ -1516,6 +1621,26 @@ void UpdateVectors() { mainWindowItems.insert(mainWindowItems.end(), overworldKeyItems.begin(), overworldKeyItems.end()); } + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.SilverRupees"), SECTION_DISPLAY_HIDDEN) == + SECTION_DISPLAY_MAIN_WINDOW) { + while (mainWindowItems.size() % 6) { + mainWindowItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); + } + for (auto silverRupee : silverRupeeItems) { + uint8_t dungeonId = + OTRGlobals::Instance->gRandoContext->GetSilverRupeeCounter(static_cast(silverRupee.id)) + .DungeonID(); + RandomizerCheckQuest dungeonQuest = + OTRGlobals::Instance->gRandoContext->GetDungeon(dungeonId)->IsMQ() ? RCQUEST_MQ : RCQUEST_VANILLA; + RandomizerCheckQuest rupeeQuest = + OTRGlobals::Instance->gRandoContext->GetSilverRupeeCounter(static_cast(silverRupee.id)) + .Quest(); + if (dungeonQuest == rupeeQuest) { + mainWindowItems.push_back(silverRupee); + } + } + } + shouldUpdateVectors = false; } @@ -1697,6 +1822,28 @@ void ItemTrackerWindow::DrawElement() { EndFloatingWindows(); } + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.SilverRupees"), SECTION_DISPLAY_HIDDEN) == + SECTION_DISPLAY_SEPARATE) { + std::vector questMatchingSilverRupeeItems; + for (auto silverRupee : silverRupeeItems) { + uint8_t dungeonId = OTRGlobals::Instance->gRandoContext + ->GetSilverRupeeCounter(static_cast(silverRupee.id)) + .DungeonID(); + RandomizerCheckQuest dungeonQuest = + OTRGlobals::Instance->gRandoContext->GetDungeon(dungeonId)->IsMQ() ? RCQUEST_MQ : RCQUEST_VANILLA; + RandomizerCheckQuest rupeeQuest = + OTRGlobals::Instance->gRandoContext + ->GetSilverRupeeCounter(static_cast(silverRupee.id)) + .Quest(); + if (dungeonQuest == rupeeQuest) { + questMatchingSilverRupeeItems.push_back(silverRupee); + } + } + BeginFloatingWindows("Silver Rupee Tracker"); + DrawItemsInRows(questMatchingSilverRupeeItems); + EndFloatingWindows(); + } + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.FishingPole"), SECTION_DISPLAY_EXTENDED_HIDDEN) == SECTION_DISPLAY_EXTENDED_SEPARATE) { BeginFloatingWindows("Fishing Pole Tracker"); @@ -1920,6 +2067,7 @@ void ItemTrackerSettingsWindow::DrawElement() { SohGui::mSohMenu->MenuDrawItem(ocarinaButtonTracking, 250, THEME_COLOR); SohGui::mSohMenu->MenuDrawItem(overworldKeysTracking, 250, THEME_COLOR); SohGui::mSohMenu->MenuDrawItem(fishingPoleTracking, 250, THEME_COLOR); + SohGui::mSohMenu->MenuDrawItem(silverRupeeTracking, 250, THEME_COLOR); if (CVarCombobox("Total Checks", CVAR_TRACKER_ITEM("TotalChecks.DisplayType"), minimalDisplayTypes, ComboboxOptions() @@ -2089,6 +2237,16 @@ void RegisterItemTrackerWidgets() { .ComboMap(extendedDisplayTypes)) .Callback([](WidgetInfo& info) { shouldUpdateVectors = true; }); ; + silverRupeeTracking = { .name = "Silver Rupees", .type = WidgetType::WIDGET_CVAR_COMBOBOX }; + silverRupeeTracking.CVar(CVAR_TRACKER_ITEM("DisplayType.SilverRupees")) + .Options(ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_HIDDEN) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR) + .ComboMap(displayTypes)) + .Callback([](WidgetInfo& info) { shouldUpdateVectors = true; }); + SohGui::mSohMenu->AddSearchWidget( { fishingPoleTracking, "Randomizer", "Item Tracker", "General Settings", "icon" }); diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.h b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.h index 85a2b63a030..b800c8929f0 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.h +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.h @@ -37,6 +37,7 @@ static std::vector itemTrackerWindowIDs = { "Item Tracker", "Boss Soul Tracker", "Ocarina Button Tracker", "Overworld Key Tracker", + "Silver Rupee Tracker", "Fishing Pole Tracker", "Personal Notes", "Total Checks" }; diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index fc1e95d49c7..22f2504c096 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -263,6 +263,8 @@ void Settings::CreateOptions() { OPT_U8(RSK_KEYRINGS_BOTTOM_OF_THE_WELL, "Bottom of the Well Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsBottomOfTheWell"), "", WidgetType::Combobox, 0); OPT_U8(RSK_KEYRINGS_GTG, "Gerudo Training Ground Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsGTG"), "", WidgetType::Combobox, 0); OPT_U8(RSK_KEYRINGS_GANONS_CASTLE, "Ganon's Castle Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsGanonsCastle"), "", WidgetType::Combobox, 0); + OPT_U8(RSK_SHUFFLE_SILVER_RUPEES, "Shuffle Silver Rupees", {"Start With", "Vanilla", "Own Dungeon", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleSilverRupees"), mOptionDescriptions[RSK_SHUFFLE_SILVER_RUPEES], WidgetType::Combobox, RO_DUNGEON_ITEM_LOC_VANILLA); + OPT_BOOL(RSK_BOTTOMLESS_SILVER_RUPEE_POUCH, "Add Bottomless Silver Rupee Pouch", CVAR_RANDOMIZER_SETTING("BottomlessSilverRupeePouch"), mOptionDescriptions[RSK_BOTTOMLESS_SILVER_RUPEE_POUCH]); //Dummied out due to redundancy with TimeSavers.SkipChildStealth until such a time that logic needs to consider child stealth e.g. because it's freestanding checks are added to freestanding shuffle. //To undo this dummying, readd this setting to an OptionGroup so it appears in the UI, then edit the timesaver check hooks to look at this, and the timesaver setting to lock itself as needed. OPT_BOOL(RSK_SKIP_CHILD_STEALTH, "Skip Child Stealth", {"Don't Skip", "Skip"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("SkipChildStealth"), mOptionDescriptions[RSK_SKIP_CHILD_STEALTH], WidgetType::Checkbox, RO_GENERIC_DONT_SKIP); @@ -1308,31 +1310,31 @@ void Settings::CreateOptions() { WidgetContainerType::COLUMN); mOptionGroups[RSG_SHUFFLE_DUNGEON_ITEMS_IMGUI] = OptionGroup::SubGroup("Shuffle Dungeon Items", - { - &mOptions[RSK_SHUFFLE_DUNGEON_REWARDS], - &mOptions[RSK_SHUFFLE_MAPANDCOMPASS], - &mOptions[RSK_KEYSANITY], - &mOptions[RSK_GERUDO_KEYS], - &mOptions[RSK_BOSS_KEYSANITY], - &mOptions[RSK_GANONS_BOSS_KEY], - &mOptions[RSK_LACS_STONE_COUNT], - &mOptions[RSK_LACS_MEDALLION_COUNT], - &mOptions[RSK_LACS_DUNGEON_COUNT], - &mOptions[RSK_LACS_REWARD_COUNT], - &mOptions[RSK_LACS_TOKEN_COUNT], - &mOptions[RSK_LACS_OPTIONS], - &mOptions[RSK_KEYRINGS], - &mOptions[RSK_KEYRINGS_RANDOM_COUNT], - &mOptions[RSK_KEYRINGS_GERUDO_FORTRESS], - &mOptions[RSK_KEYRINGS_FOREST_TEMPLE], - &mOptions[RSK_KEYRINGS_FIRE_TEMPLE], - &mOptions[RSK_KEYRINGS_WATER_TEMPLE], - &mOptions[RSK_KEYRINGS_SPIRIT_TEMPLE], - &mOptions[RSK_KEYRINGS_SHADOW_TEMPLE], - &mOptions[RSK_KEYRINGS_BOTTOM_OF_THE_WELL], - &mOptions[RSK_KEYRINGS_GTG], - &mOptions[RSK_KEYRINGS_GANONS_CASTLE], - }, + { &mOptions[RSK_SHUFFLE_DUNGEON_REWARDS], + &mOptions[RSK_SHUFFLE_MAPANDCOMPASS], + &mOptions[RSK_KEYSANITY], + &mOptions[RSK_GERUDO_KEYS], + &mOptions[RSK_BOSS_KEYSANITY], + &mOptions[RSK_GANONS_BOSS_KEY], + &mOptions[RSK_LACS_STONE_COUNT], + &mOptions[RSK_LACS_MEDALLION_COUNT], + &mOptions[RSK_LACS_DUNGEON_COUNT], + &mOptions[RSK_LACS_REWARD_COUNT], + &mOptions[RSK_LACS_TOKEN_COUNT], + &mOptions[RSK_LACS_OPTIONS], + &mOptions[RSK_KEYRINGS], + &mOptions[RSK_KEYRINGS_RANDOM_COUNT], + &mOptions[RSK_KEYRINGS_GERUDO_FORTRESS], + &mOptions[RSK_KEYRINGS_FOREST_TEMPLE], + &mOptions[RSK_KEYRINGS_FIRE_TEMPLE], + &mOptions[RSK_KEYRINGS_WATER_TEMPLE], + &mOptions[RSK_KEYRINGS_SPIRIT_TEMPLE], + &mOptions[RSK_KEYRINGS_SHADOW_TEMPLE], + &mOptions[RSK_KEYRINGS_BOTTOM_OF_THE_WELL], + &mOptions[RSK_KEYRINGS_GTG], + &mOptions[RSK_KEYRINGS_GANONS_CASTLE], + &mOptions[RSK_SHUFFLE_SILVER_RUPEES], + &mOptions[RSK_BOTTOMLESS_SILVER_RUPEE_POUCH] }, WidgetContainerType::COLUMN); mOptionGroups[RSG_ITEMS_IMGUI_TABLE] = OptionGroup::SubGroup("Items", { @@ -1566,30 +1568,30 @@ void Settings::CreateOptions() { &mOptions[RSK_SHUFFLE_FAIRIES], }); mOptionGroups[RSG_SHUFFLE_DUNGEON_ITEMS] = - OptionGroup("Shuffle Dungeon Items", { - &mOptions[RSK_SHUFFLE_MAPANDCOMPASS], - &mOptions[RSK_KEYSANITY], - &mOptions[RSK_GERUDO_KEYS], - &mOptions[RSK_BOSS_KEYSANITY], - &mOptions[RSK_GANONS_BOSS_KEY], - &mOptions[RSK_LACS_STONE_COUNT], - &mOptions[RSK_LACS_MEDALLION_COUNT], - &mOptions[RSK_LACS_DUNGEON_COUNT], - &mOptions[RSK_LACS_REWARD_COUNT], - &mOptions[RSK_LACS_TOKEN_COUNT], - &mOptions[RSK_LACS_OPTIONS], - &mOptions[RSK_KEYRINGS], - &mOptions[RSK_KEYRINGS_RANDOM_COUNT], - &mOptions[RSK_KEYRINGS_GERUDO_FORTRESS], - &mOptions[RSK_KEYRINGS_FOREST_TEMPLE], - &mOptions[RSK_KEYRINGS_FIRE_TEMPLE], - &mOptions[RSK_KEYRINGS_WATER_TEMPLE], - &mOptions[RSK_KEYRINGS_SPIRIT_TEMPLE], - &mOptions[RSK_KEYRINGS_SHADOW_TEMPLE], - &mOptions[RSK_KEYRINGS_BOTTOM_OF_THE_WELL], - &mOptions[RSK_KEYRINGS_GTG], - &mOptions[RSK_KEYRINGS_GANONS_CASTLE], - }); + OptionGroup("Shuffle Dungeon Items", { &mOptions[RSK_SHUFFLE_MAPANDCOMPASS], + &mOptions[RSK_KEYSANITY], + &mOptions[RSK_GERUDO_KEYS], + &mOptions[RSK_BOSS_KEYSANITY], + &mOptions[RSK_GANONS_BOSS_KEY], + &mOptions[RSK_LACS_STONE_COUNT], + &mOptions[RSK_LACS_MEDALLION_COUNT], + &mOptions[RSK_LACS_DUNGEON_COUNT], + &mOptions[RSK_LACS_REWARD_COUNT], + &mOptions[RSK_LACS_TOKEN_COUNT], + &mOptions[RSK_LACS_OPTIONS], + &mOptions[RSK_KEYRINGS], + &mOptions[RSK_KEYRINGS_RANDOM_COUNT], + &mOptions[RSK_KEYRINGS_GERUDO_FORTRESS], + &mOptions[RSK_KEYRINGS_FOREST_TEMPLE], + &mOptions[RSK_KEYRINGS_FIRE_TEMPLE], + &mOptions[RSK_KEYRINGS_WATER_TEMPLE], + &mOptions[RSK_KEYRINGS_SPIRIT_TEMPLE], + &mOptions[RSK_KEYRINGS_SHADOW_TEMPLE], + &mOptions[RSK_KEYRINGS_BOTTOM_OF_THE_WELL], + &mOptions[RSK_KEYRINGS_GTG], + &mOptions[RSK_KEYRINGS_GANONS_CASTLE], + &mOptions[RSK_SHUFFLE_SILVER_RUPEES], + &mOptions[RSK_BOTTOMLESS_SILVER_RUPEE_POUCH] }); mOptionGroups[RSG_STARTING_ITEMS] = OptionGroup::SubGroup("Items", { &mOptions[RSK_STARTING_OCARINA], &mOptions[RSK_STARTING_KOKIRI_SWORD], &mOptions[RSK_STARTING_DEKU_SHIELD] }); @@ -1826,6 +1828,14 @@ const OptionGroup& Settings::GetOptionGroup(const RandomizerSettingGroupKey key) } void Settings::UpdateOptionProperties() { + // If statement for No Logic Only options. + if (CVarGetInteger(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS) != RO_LOGIC_NO_LOGIC) { + // RANDOTODO: Remove when logic is implemented for Silver Rupee Shuffle. + mOptions[RSK_SHUFFLE_SILVER_RUPEES].Disable("This setting is only available for No Logic runs."); + } else { + mOptions[RSK_SHUFFLE_SILVER_RUPEES].Enable(); + } + // Default to hiding bridge opts and the extra sliders. mOptions[RSK_RAINBOW_BRIDGE].AddFlag(IMFLAG_SEPARATOR_BOTTOM); mOptions[RSK_BRIDGE_OPTIONS].Hide(); @@ -2551,10 +2561,23 @@ void Settings::UpdateOptionProperties() { mOptions[RSK_SLINGBOW_BREAK_BEEHIVES].Disable( "This option is disabled because Shuffle Beehives is not enabled."); } + + if (CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleSilverRupees"), RO_DUNGEON_ITEM_LOC_VANILLA) <= + RO_DUNGEON_ITEM_LOC_VANILLA) { + mOptions[RSK_BOTTOMLESS_SILVER_RUPEE_POUCH].Disable( + "This option is not available unless Silver Rupees are shuffled."); + } else { + mOptions[RSK_BOTTOMLESS_SILVER_RUPEE_POUCH].Enable(); + } } void Context::FinalizeSettings(const std::set& excludedLocations, const std::set& enabledTricks) { + // If you have settings that will only work for No Logic, put them in this if statement. + if (mOptions[RSK_LOGIC_RULES].IsNot(RO_LOGIC_NO_LOGIC)) { + // RANDOTODO: Remove when Logic is implemented for Silver Rupees. + mOptions[RSK_SHUFFLE_SILVER_RUPEES].Set(RO_DUNGEON_ITEM_LOC_VANILLA); + } // if we skip child zelda, we start with zelda's letter, and malon starts // at the ranch, so we should *not* shuffle the weird egg if (mOptions[RSK_SKIP_CHILD_ZELDA]) { @@ -2829,6 +2852,9 @@ void Context::FinalizeSettings(const std::set& excludedLocation (mOptions[RSK_KEYRINGS_GANONS_CASTLE].Is(RO_KEYRING_FOR_DUNGEON_RANDOM) && Random(0, 2) == 1)) { this->GetDungeon(GANONS_CASTLE)->SetKeyRing(); } + if (mOptions[RSK_SHUFFLE_SILVER_RUPEES].Get() > RO_DUNGEON_ITEM_LOC_VANILLA) { + mOptions[RSK_BOTTOMLESS_SILVER_RUPEE_POUCH].Set(RO_GENERIC_OFF); + } } auto trials = this->GetTrials()->GetTrialList(); diff --git a/soh/soh/Enhancements/randomizer/static_data.h b/soh/soh/Enhancements/randomizer/static_data.h index 7bdec17c117..28ab106089b 100644 --- a/soh/soh/Enhancements/randomizer/static_data.h +++ b/soh/soh/Enhancements/randomizer/static_data.h @@ -8,6 +8,12 @@ #include "location.h" namespace Rando { + +struct Identifier { + SceneID scene; + RandomizerCheckQuest quest; + int16_t params; +}; /** * @brief Singleton for storing and accessing static Randomizer-related data * @@ -58,6 +64,7 @@ class StaticData { static void RegisterFreestandingLocations(); static void RegisterGrassLocations(); static void RegisterCrateLocations(); + static void RegisterSilverRupeeLocations(); static void InitHashMaps(); static std::array, 17> randomizerFishingPondFish; static std::unordered_map randomizerGrottoFishMap; @@ -79,8 +86,23 @@ class StaticData { static std::unordered_map stoneParamsToHint; static std::unordered_map grottoChestParamsToHint; static std::array hintTextTable; + static std::unordered_map silverTrackerMap; StaticData(); ~StaticData(); }; -} // namespace Rando \ No newline at end of file +} // namespace Rando + +namespace std { +template <> struct hash { + inline size_t operator()(const Rando::Identifier& id) const { + return hash{}(id.scene) ^ hash{}(id.quest) ^ hash{}(id.params); + } +}; + +template <> struct equal_to { + inline bool operator()(const Rando::Identifier& a, const Rando::Identifier& b) const { + return a.scene == b.scene && a.params == b.params && a.quest == b.quest; + } +}; +} // namespace std diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 963a5b00d8e..eba2ccbee70 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -2387,6 +2387,9 @@ extern "C" int CustomMessage_RetrieveIfExists(PlayState* play) { messageEntry = Randomizer::GetIceTrapMessage(); } else if (player->getItemEntry.getItemId == RG_TRIFORCE_PIECE) { messageEntry = Randomizer::GetTriforcePieceMessage(); + } else if (player->getItemEntry.getItemId >= RG_SILVER_RUPEE_FIRST && + player->getItemEntry.getItemId <= RG_SILVER_RUPEE_LAST) { + messageEntry = GetSilverRupeeItemMessage(player->getItemEntry.getItemId); } else { messageEntry = Randomizer_GetCustomGetItemMessage(player); } diff --git a/soh/soh/SaveManager.cpp b/soh/soh/SaveManager.cpp index d15c0108664..48553c49f7b 100644 --- a/soh/soh/SaveManager.cpp +++ b/soh/soh/SaveManager.cpp @@ -252,6 +252,12 @@ void SaveManager::LoadRandomizer() { SaveManager::Instance->LoadData("", value); randoContext->GetTrickOption(RandomizerTrick(i)).Set(value); }); + + SaveManager::Instance->LoadArray("silverRupees", RG_SILVER_RUPEE_LAST - RG_SILVER_RUPEE_FIRST + 1, [&](size_t i) { + size_t value; + SaveManager::Instance->LoadData("", value); + randoContext->GetSilverRupeeCounter(static_cast(i + RG_SILVER_RUPEE_FIRST)).SetCollected(value); + }); } void SaveManager::SaveRandomizer(SaveContext* saveContext, int sectionID, bool fullSave) { @@ -400,6 +406,12 @@ void SaveManager::SaveRandomizer(SaveContext* saveContext, int sectionID, bool f SaveManager::Instance->SaveArray("trickOptions", RT_MAX, [&](size_t i) { SaveManager::Instance->SaveData("", randoContext->GetTrickOption(RandomizerTrick(i)).Get()); }); + + SaveManager::Instance->SaveArray("silverRupees", RG_SILVER_RUPEE_LAST - RG_SILVER_RUPEE_FIRST + 1, [&](size_t i) { + SaveManager::Instance->SaveData( + "", + randoContext->GetSilverRupeeCounter(static_cast(i + RG_SILVER_RUPEE_FIRST)).GetCollected()); + }); } // Init() here is an extension of InitSram, and thus not truly an initializer for SaveManager itself. don't put any diff --git a/soh/soh/SohGui/ImGuiUtils.cpp b/soh/soh/SohGui/ImGuiUtils.cpp index ab3d8f59c52..be327684046 100644 --- a/soh/soh/SohGui/ImGuiUtils.cpp +++ b/soh/soh/SohGui/ImGuiUtils.cpp @@ -133,6 +133,10 @@ std::map gregMapping = { { ITEM_RUPEE_GREEN, { ITEM_RUPEE_GREEN, "ITEM_RUPEE_GREEN", "ITEM_RUPEE_GREEN_Faded", gRupeeCounterIconTex } } }; +std::map silverRupeeMapping = { + { ITEM_RUPEE_GREEN, { ITEM_RUPEE_GREEN, "ITEM_RUPEE_SILVER", "ITEM_RUPEE_SILVER_Faded", gRupeeCounterIconTex } } +}; + std::map triforcePieceMapping = { { RG_TRIFORCE_PIECE, { RG_TRIFORCE_PIECE, "RG_TRIFORCE_PIECE", "RG_TRIFORCE_PIECE_Faded", gTriforcePieceTex } } }; @@ -216,6 +220,16 @@ void RegisterImGuiItemIcons() { entry.second.texturePath, gregFadedGreen); } + for (const auto& entry : silverRupeeMapping) { + ImVec4 silver = ImVec4(0.7f, 0.7f, 0.7f, 1.0f); + ImVec4 silverFaded = silver; + silverFaded.w = 0.3f; + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture(entry.second.name, entry.second.texturePath, + silver); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture(entry.second.nameFaded, + entry.second.texturePath, silverFaded); + } + for (const auto& entry : triforcePieceMapping) { Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture(entry.second.name, entry.second.texturePath, ImVec4(1, 1, 1, 1)); diff --git a/soh/src/code/z_en_item00.c b/soh/src/code/z_en_item00.c index b6bf5ecdf90..bf2acdc507d 100644 --- a/soh/src/code/z_en_item00.c +++ b/soh/src/code/z_en_item00.c @@ -1195,6 +1195,7 @@ typedef enum { PARTICLE_PINK, PARTICLE_BRIGHT_RED, PARTICLE_BLUE, + PARTICLE_DARK_PURPLE } Item00ParticleColors; void EnItem00_CustomItemsParticles(Actor* Parent, PlayState* play, GetItemEntry giEntry) { @@ -1231,21 +1232,42 @@ void EnItem00_CustomItemsParticles(Actor* Parent, PlayState* play, GetItemEntry colorIndex = PARTICLE_BRIGHT_GREEN; break; case RG_BOLERO_OF_FIRE: + case RG_DODONGOS_CAVERN_MQ_SILVER_RUPEE: colorIndex = PARTICLE_RED; break; case RG_SERENADE_OF_WATER: case RG_BOTTLE_WITH_FISH: + case RG_ICE_CAVERN_SLIDING_SILVER_RUPEE: + case RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE: colorIndex = PARTICLE_CYAN; break; case RG_REQUIEM_OF_SPIRIT: + case RG_SPIRIT_GATE_SILVER_RUPEE: + case RG_SPIRIT_BEAMOS_SILVER_RUPEE: + case RG_SPIRIT_BOULDER_SILVER_RUPEE: + case RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE: colorIndex = PARTICLE_ORANGE; break; case RG_NOCTURNE_OF_SHADOW: case RG_BOTTLE_WITH_POE: + case RG_SHADOW_SCYTHE_SILVER_RUPEE: + case RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE: + case RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE: + case RG_SHADOW_MQ_SCYTHE_SILVER_RUPEE: + case RG_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE: + case RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE: + case RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE: + case RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE: colorIndex = PARTICLE_VIOLET; break; case RG_PRELUDE_OF_LIGHT: case RG_BOTTLE_WITH_BIG_POE: + case RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE: + case RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE: + case RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE: + case RG_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE: + case RG_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE: + case RG_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE: colorIndex = PARTICLE_YELLOW; break; case RG_DEKU_STICK_BAG: @@ -1272,6 +1294,15 @@ void EnItem00_CustomItemsParticles(Actor* Parent, PlayState* play, GetItemEntry case RG_BOTTLE_WITH_BLUE_POTION: colorIndex = PARTICLE_BLUE; break; + case RG_FIRE_TRIAL_SILVER_RUPEE: + case RG_FIRE_TRIAL_MQ_SILVER_RUPEE: + case RG_SPIRIT_TRIAL_SILVER_RUPEE: + case RG_FOREST_TRIAL_SILVER_RUPEE: + case RG_LIGHT_TRIAL_SILVER_RUPEE: + case RG_SHADOW_TRIAL_MQ_SILVER_RUPEE: + case RG_WATER_TRIAL_MQ_SILVER_RUPEE: + colorIndex = PARTICLE_DARK_PURPLE; + break; default: return; } @@ -1281,7 +1312,7 @@ void EnItem00_CustomItemsParticles(Actor* Parent, PlayState* play, GetItemEntry } // Color of the circle for the particles - static Color_RGBA8 mainColors[13][3] = { + static Color_RGBA8 mainColors[14][3] = { { 34, 255, 76 }, // Minuet, Bean Pack, Magic Upgrades, Bottle with Green Potion, Bottle with Bugs, and Greg { 177, 35, 35 }, // Bolero { 115, 251, 253 }, // Serenade and Bottle with Fish @@ -1294,11 +1325,12 @@ void EnItem00_CustomItemsParticles(Actor* Parent, PlayState* play, GetItemEntry { 19, 120, 182 }, // Progressive Bombchu { 255, 205, 255 }, // Bottle with Fairy { 255, 118, 118 }, // Bottle with Red Potion - { 154, 204, 255 } // Bottle with Blue Fire and Bottle with Blue Potion + { 154, 204, 255 }, // Bottle with Blue Fire and Bottle with Blue Potion + { 118, 10, 143 } // Ganon's Castle Silver Rupees }; // Color of the faded flares stretching off the particles - static Color_RGBA8 flareColors[13][3] = { + static Color_RGBA8 flareColors[14][3] = { { 30, 110, 30 }, // Minuet, Bean Pack, Magic Upgrades, Bottle with Green Potion, Bottle with Bugs, and Greg { 90, 10, 10 }, // Bolero { 35, 35, 177 }, // Serenade and Bottle with Fish @@ -1311,7 +1343,8 @@ void EnItem00_CustomItemsParticles(Actor* Parent, PlayState* play, GetItemEntry { 204, 102, 0 }, // Progressive Bombchu { 216, 70, 216 }, // Bottle with Fairy { 90, 10, 10 }, // Bottle with Red Potion - { 35, 35, 177 } // Bottle with Blue Fire + { 35, 35, 177 }, // Bottle with Blue Fire + { 131, 81, 143 } // Ganon's Castle Silver Rupees }; static Vec3f velocity = { 0.0f, 0.0f, 0.0f }; diff --git a/soh/src/overlays/actors/ovl_En_G_Switch/z_en_g_switch.c b/soh/src/overlays/actors/ovl_En_G_Switch/z_en_g_switch.c index 5337a61bc77..1b83f2c65a1 100644 --- a/soh/src/overlays/actors/ovl_En_G_Switch/z_en_g_switch.c +++ b/soh/src/overlays/actors/ovl_En_G_Switch/z_en_g_switch.c @@ -13,6 +13,7 @@ #include "objects/object_tsubo/object_tsubo.h" #include "objects/object_gi_rupy/object_gi_rupy.h" #include "soh/frame_interpolation.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) @@ -117,7 +118,9 @@ void EnGSwitch_Init(Actor* thisx, PlayState* play) { this->numEffects = 20; Collider_InitCylinder(play, &this->collider); Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit); - this->actor.draw = EnGSwitch_DrawRupee; + if (GameInteractor_Should(VB_SILVER_RUPEE_SETUP_DRAW, true, this)) { + this->actor.draw = EnGSwitch_DrawRupee; + } this->actor.shape.yOffset = 700.0f; if (Flags_GetSwitch(play, this->switchFlag)) { osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ You are Shock! ☆☆☆☆☆ %d\n" VT_RST, this->switchFlag); @@ -209,30 +212,32 @@ void EnGSwitch_WaitForObject(EnGSwitch* this, PlayState* play) { } void EnGSwitch_SilverRupeeTracker(EnGSwitch* this, PlayState* play) { - static s8 majorScale[] = { 0, 2, 4, 5, 7, 9, 11, 13, 15, 17 }; - - if (this->noteIndex < sCollectedCount) { - if (sCollectedCount < (CVarGetInteger(CVAR_ENHANCEMENT("SilverRupeeJingleExtend"), 0) ? 10 : 5)) { - // "sound?" - osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ 音? ☆☆☆☆☆ %d\n" VT_RST, this->noteIndex); - Audio_PlaySoundTransposed(&gSfxDefaultPos, NA_SE_EV_FIVE_COUNT_LUPY, majorScale[this->noteIndex]); - this->noteIndex = sCollectedCount; + if (GameInteractor_Should(VB_SILVER_RUPEE_COUNT_CHECK, true, this)) { + static s8 majorScale[] = { 0, 2, 4, 5, 7, 9, 11, 13, 15, 17 }; + + if (this->noteIndex < sCollectedCount) { + if (sCollectedCount < (CVarGetInteger(CVAR_ENHANCEMENT("SilverRupeeJingleExtend"), 0) ? 10 : 5)) { + // "sound?" + osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ 音? ☆☆☆☆☆ %d\n" VT_RST, this->noteIndex); + Audio_PlaySoundTransposed(&gSfxDefaultPos, NA_SE_EV_FIVE_COUNT_LUPY, majorScale[this->noteIndex]); + this->noteIndex = sCollectedCount; + } } - } - if (sCollectedCount >= this->silverCount) { - // "It is now the end of the century." - // This another reference to Hokuto no Ken. - osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ 時はまさに世紀末〜 ☆☆☆☆☆ %d\n" VT_RST, this->switchFlag); - // "Last!" - osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ らすとぉ! ☆☆☆☆☆ \n" VT_RST); - if ((play->sceneNum == SCENE_GERUDO_TRAINING_GROUND) && (this->actor.room == 2)) { - Flags_SetTempClear(play, this->actor.room); - } else { - Sfx_PlaySfxCentered(NA_SE_SY_CORRECT_CHIME); - Flags_SetSwitch(play, this->switchFlag); + if (sCollectedCount >= this->silverCount) { + // "It is now the end of the century." + // This another reference to Hokuto no Ken. + osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ 時はまさに世紀末〜 ☆☆☆☆☆ %d\n" VT_RST, this->switchFlag); + // "Last!" + osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ らすとぉ! ☆☆☆☆☆ \n" VT_RST); + if ((play->sceneNum == SCENE_GERUDO_TRAINING_GROUND) && (this->actor.room == 2)) { + Flags_SetTempClear(play, this->actor.room); + } else { + Sfx_PlaySfxCentered(NA_SE_SY_CORRECT_CHIME); + Flags_SetSwitch(play, this->switchFlag); + } + Sfx_PlaySfxCentered(NA_SE_SY_GET_RUPY); + Actor_Kill(&this->actor); } - Sfx_PlaySfxCentered(NA_SE_SY_GET_RUPY); - Actor_Kill(&this->actor); } } @@ -241,17 +246,19 @@ void EnGSwitch_SilverRupeeIdle(EnGSwitch* this, PlayState* play) { this->actor.shape.rot.y += 0x800; if (this->actor.xyzDistToPlayerSq < 900.0f) { - Rupees_ChangeBy(5); - sCollectedCount++; - Sfx_PlaySfxCentered(NA_SE_SY_GET_RUPY); - this->actor.world.pos = player->actor.world.pos; - this->actor.world.pos.y += 40.0f; - if (LINK_IS_ADULT) { - this->actor.world.pos.y += 20.0f; + if (GameInteractor_Should(VB_SILVER_RUPEE_COLLECT, true, this)) { + Rupees_ChangeBy(5); + sCollectedCount++; + Sfx_PlaySfxCentered(NA_SE_SY_GET_RUPY); + this->actor.world.pos = player->actor.world.pos; + this->actor.world.pos.y += 40.0f; + if (LINK_IS_ADULT) { + this->actor.world.pos.y += 20.0f; + } + this->actor.gravity = 0.0f; + this->killTimer = 15; + this->actionFunc = EnGSwitch_SilverRupeeCollected; } - this->actor.gravity = 0.0f; - this->killTimer = 15; - this->actionFunc = EnGSwitch_SilverRupeeCollected; } }