From e53040e504ff0713f41f564feea547bbdc8849c9 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sat, 10 Feb 2024 15:57:52 -0500 Subject: [PATCH 001/108] Adds Silver Rupee Shuffle option to menu --- .../Enhancements/randomizer/option_descriptions.cpp | 9 +++++++++ soh/soh/Enhancements/randomizer/randomizerTypes.h | 11 +++++++++++ soh/soh/Enhancements/randomizer/settings.cpp | 3 +++ 3 files changed, 23 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/option_descriptions.cpp b/soh/soh/Enhancements/randomizer/option_descriptions.cpp index 95db75e5556..7b2ce5e843a 100644 --- a/soh/soh/Enhancements/randomizer/option_descriptions.cpp +++ b/soh/soh/Enhancements/randomizer/option_descriptions.cpp @@ -393,6 +393,15 @@ void Settings::CreateOptionDescriptions() { "Overworld - Boss Keys can only appear outside of dungeons.\n" "\n" "Anywhere - Boss Keys can appear anywhere in the world."; + mOptionDescriptions[RSK_SHUFFLE_SILVER_RUPEES] = "Vanilla - Silver Rupees will appear in their vanilla locations.\n" + "\n" + "Own dungeon - Silver Rupees can only appear in their respective dungeon.\n" + "\n" + "Any dungeon - Silver Rupees can only appear inside of any dungeon.\n" + "\n" + "Overworld - Silver Rupees can only appear outside of dungeons.\n" + "\n" + "Anywhere - Silver Rupees can appear anywhere in the world."; mOptionDescriptions[RSK_GANONS_BOSS_KEY] = "Vanilla - Ganon's Boss Key will appear in the vanilla location.\n" "\n" diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index a86dc82c472..de39b3e544b 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -3661,6 +3661,7 @@ typedef enum { RSK_FISHSANITY_POND_COUNT, RSK_FISHSANITY_AGE_SPLIT, RSK_SHUFFLE_FISHING_POLE, + RSK_SHUFFLE_SILVER_RUPEES, RSK_MAX } RandomizerSettingKey; @@ -3810,6 +3811,16 @@ typedef enum { RO_DUNGEON_ITEM_LOC_ANYWHERE, } RandoOptionDungeonItemLocation; +// Silver Rupees (vanilla, own dungeon, any dungeon, overworld, +// anywhere +typedef enum { + RO_SILVER_SHUFFLE_VANILLA, + RO_SILVER_SHUFFLE_OWN_DUNGEON, + RO_SILVER_SHUFFLE_ANY_DUNGEON, + RO_SILVER_SHUFFLE_OVERWORLD, + RO_SILVER_SHUFFLE_ANYWHERE, +} RandoOptionSilverRupeeLocation; + //Dungeon reward settings typedef enum { RO_DUNGEON_REWARDS_END_OF_DUNGEON, diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index 3fc4efa86d8..67e4777a855 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -126,6 +126,7 @@ void Settings::CreateOptions() { mOptions[RSK_KEYSANITY] = Option::U8("Small Keys", {"Start With", "Vanilla", "Own Dungeon", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, "gRandomizeKeysanity", mOptionDescriptions[RSK_KEYSANITY], WidgetType::Combobox, RO_DUNGEON_ITEM_LOC_OWN_DUNGEON); mOptions[RSK_GERUDO_KEYS] = Option::U8("Gerudo Fortress Keys", {"Vanilla", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, "gRandomizeGerudoKeys", mOptionDescriptions[RSK_GERUDO_KEYS], WidgetType::Combobox, RO_GERUDO_KEYS_VANILLA); mOptions[RSK_BOSS_KEYSANITY] = Option::U8("Boss Keys", {"Start With", "Vanilla", "Own Dungeon", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, "gRandomizeBossKeysanity", mOptionDescriptions[RSK_BOSS_KEYSANITY], WidgetType::Combobox, RO_DUNGEON_ITEM_LOC_OWN_DUNGEON); + mOptions[RSK_SHUFFLE_SILVER_RUPEES] = Option::U8("Silver Rupees", {"Vanilla", "Own Dungeon", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, "gRandomizeSilverRupeeShuffle", mOptionDescriptions[RSK_SHUFFLE_SILVER_RUPEES], WidgetType::Combobox, RO_SILVER_SHUFFLE_VANILLA); mOptions[RSK_GANONS_BOSS_KEY] = Option::U8("Ganon's Boss Key", {"Vanilla", "Own Dungeon", "Start With", "Any Dungeon", "Overworld", "Anywhere", "LACS-Vanilla", "LACS-Stones", "LACS-Medallions", "LACS-Rewards", "LACS-Dungeons", "LACS-Tokens", "Triforce Hunt"}, OptionCategory::Setting, "gRandomizeShuffleGanonBossKey", mOptionDescriptions[RSK_GANONS_BOSS_KEY], WidgetType::Combobox, RO_GANON_BOSS_KEY_VANILLA); mOptions[RSK_LACS_STONE_COUNT] = Option::U8("Stone Count", {NumOpts(0, 4)}, OptionCategory::Setting, "gRandomizeLacsStoneCount", "", WidgetType::Slider, 3, true); mOptions[RSK_LACS_MEDALLION_COUNT] = Option::U8("Medallion Count", {NumOpts(0, 7)}, OptionCategory::Setting, "gRandomizeLacsMedallionCount", "", WidgetType::Slider, 6, true); @@ -684,6 +685,7 @@ void Settings::CreateOptions() { &mOptions[RSK_KEYSANITY], &mOptions[RSK_GERUDO_KEYS], &mOptions[RSK_BOSS_KEYSANITY], + &mOptions[RSK_SHUFFLE_SILVER_RUPEES], &mOptions[RSK_GANONS_BOSS_KEY], &mOptions[RSK_LACS_STONE_COUNT], &mOptions[RSK_LACS_MEDALLION_COUNT], @@ -889,6 +891,7 @@ void Settings::CreateOptions() { &mOptions[RSK_KEYSANITY], &mOptions[RSK_GERUDO_KEYS], &mOptions[RSK_BOSS_KEYSANITY], + &mOptions[RSK_SHUFFLE_SILVER_RUPEES], &mOptions[RSK_GANONS_BOSS_KEY], &mOptions[RSK_LACS_STONE_COUNT], &mOptions[RSK_LACS_MEDALLION_COUNT], From 3fc40fa3ffd608c3e2429f1d301e7dc26728a090 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sat, 10 Feb 2024 15:58:53 -0500 Subject: [PATCH 002/108] Sets up hook to override silver rupee behavior. --- soh/soh/Enhancements/mods.cpp | 22 +++++++++++ .../randomizer/actors/z_en_g_switch_rando.c | 37 +++++++++++++++++++ .../randomizer/actors/z_en_g_switch_rando.h | 17 +++++++++ 3 files changed, 76 insertions(+) create mode 100644 soh/soh/Enhancements/randomizer/actors/z_en_g_switch_rando.c create mode 100644 soh/soh/Enhancements/randomizer/actors/z_en_g_switch_rando.h diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index 26adf611dd6..d10077758e4 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -27,6 +27,7 @@ #include "src/overlays//actors/ovl_Fishing/z_fishing.h" #include "objects/object_link_boy/object_link_boy.h" #include "objects/object_link_child/object_link_child.h" +#include "soh/Enhancements/randomizer/actors/z_en_g_switch_rando.h" extern "C" { #include @@ -1151,6 +1152,26 @@ void RegisterRandomizerSheikSpawn() { }); } +//Changes silver rupee update and draw functions, if silver rupees shuffle is enabled +void RegisterSilverRupeeShuffle() { + GameInteractor::Instance->RegisterGameHook([](void* refActor) { + if (!gPlayState) { + return; + } + if (!IS_RANDO || OTRGlobals::Instance->gRandoContext->GetOption(RSK_SHUFFLE_SILVER_RUPEES).Is(RO_SILVER_SHUFFLE_VANILLA)) { + return; + } + auto* actor = static_cast(refActor); + if (actor->id == ACTOR_EN_G_SWITCH) { + auto* silverRupee = reinterpret_cast(actor); + if (silverRupee->type == ENGSWITCH_SILVER_RUPEE) { + silverRupee->actionFunc = EnGSwitch_Randomizer_SilverRupeeIdle; + silverRupee->actor.draw = EnGSwitch_Randomizer_Draw; + } + } + }); +} + //Boss souls require an additional item (represented by a RAND_INF) to spawn a boss in a particular lair void RegisterBossSouls() { GameInteractor::Instance->RegisterGameHook([](void* actor) { @@ -1627,6 +1648,7 @@ void InitMods() { RegisterAltTrapTypes(); RegisterRandomizerSheikSpawn(); RegisterBossSouls(); + RegisterSilverRupeeShuffle(); RegisterRandomizedEnemySizes(); RegisterToTMedallions(); RegisterNoSwim(); diff --git a/soh/soh/Enhancements/randomizer/actors/z_en_g_switch_rando.c b/soh/soh/Enhancements/randomizer/actors/z_en_g_switch_rando.c new file mode 100644 index 00000000000..b78bce33ec2 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/actors/z_en_g_switch_rando.c @@ -0,0 +1,37 @@ +#include "z_en_g_switch_rando.h" + +void EnGSwitch_Kill(EnGSwitch* this, PlayState* play); + +void EnGSwitch_Randomizer_SilverRupeeIdle(EnGSwitch* self, PlayState* play) { + Player* player = GET_PLAYER(play); + + self->actor.shape.rot.y += 0x800; + if (self->actor.xyzDistToPlayerSq < 900.0f) { + if (IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_SILVER_RUPEES) != RO_SILVER_SHUFFLE_VANILLA) { + GetItemEntry getItem = ItemTable_RetrieveEntry(MOD_NONE, GI_NUTS_5); + if (getItem.modIndex == MOD_NONE) { + // RANDOTOD: Move this into Item_Give() or some other more central location + if (getItem.getItemId == GI_SWORD_BGS) { + gSaveContext.bgsFlag = true; + } + Item_Give(play, getItem.itemId); + } else if (getItem.modIndex == MOD_RANDOMIZER) { + Randomizer_Item_Give(play, getItem); + } + self->killTimer = 0; + self->actionFunc = EnGSwitch_Kill; + } + } +} + +void EnGSwitch_Randomizer_Draw(Actor* thisx, PlayState* play) { + EnGSwitch* this = (EnGSwitch*)thisx; + if (IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_SILVER_RUPEES) != RO_SILVER_SHUFFLE_VANILLA && + this->type == ENGSWITCH_SILVER_RUPEE) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Scale(17.5f, 17.5f, 17.5f, MTXMODE_APPLY); + GetItemEntry getItem = ItemTable_RetrieveEntry(MOD_NONE, GI_NUTS_5); + GetItemEntry_Draw(play, getItem); + CLOSE_DISPS(play->state.gfxCtx); + } +} diff --git a/soh/soh/Enhancements/randomizer/actors/z_en_g_switch_rando.h b/soh/soh/Enhancements/randomizer/actors/z_en_g_switch_rando.h new file mode 100644 index 00000000000..d725a8749c7 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/actors/z_en_g_switch_rando.h @@ -0,0 +1,17 @@ +#ifndef SHIP_Z_EN_G_SWITCH_RANDO_H +#define SHIP_Z_EN_G_SWITCH_RANDO_H + +#include "overlays/actors/ovl_En_G_Switch/z_en_g_switch.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void EnGSwitch_Randomizer_SilverRupeeIdle(EnGSwitch *self, PlayState *play); +void EnGSwitch_Randomizer_Draw(Actor *thisx, PlayState *play); + +#ifdef __cplusplus +}; +#endif + +#endif //SHIP_Z_EN_G_SWITCH_RANDO_H From e7113b1e27353fcae1911e8f82c182802f5e6af7 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sat, 10 Feb 2024 16:14:09 -0500 Subject: [PATCH 003/108] Initial scaffolding of tracking silver rupee counts. --- soh/soh/Enhancements/randomizer/context.h | 2 ++ .../Enhancements/randomizer/silver_rupee.cpp | 4 +++ .../Enhancements/randomizer/silver_rupee.h | 33 +++++++++++++++++++ 3 files changed, 39 insertions(+) create mode 100644 soh/soh/Enhancements/randomizer/silver_rupee.cpp create mode 100644 soh/soh/Enhancements/randomizer/silver_rupee.h diff --git a/soh/soh/Enhancements/randomizer/context.h b/soh/soh/Enhancements/randomizer/context.h index cef9e5292ff..11bda9eb3a5 100644 --- a/soh/soh/Enhancements/randomizer/context.h +++ b/soh/soh/Enhancements/randomizer/context.h @@ -7,6 +7,7 @@ #include "3drando/text.hpp" #include "hint.h" #include "fishsanity.h" +#include "silver_rupee.h" #include #include @@ -114,6 +115,7 @@ class Context { std::shared_ptr mLogic; std::shared_ptr mTrials; std::shared_ptr mFishsanity; + std::shared_ptr mSilverRupees; bool mSeedGenerated = false; bool mSpoilerLoaded = false; bool mPlandoLoaded = false; diff --git a/soh/soh/Enhancements/randomizer/silver_rupee.cpp b/soh/soh/Enhancements/randomizer/silver_rupee.cpp new file mode 100644 index 00000000000..35ab1bef65a --- /dev/null +++ b/soh/soh/Enhancements/randomizer/silver_rupee.cpp @@ -0,0 +1,4 @@ +#include "silver_rupee.h" + +namespace Rando { +} // Rando \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/silver_rupee.h b/soh/soh/Enhancements/randomizer/silver_rupee.h new file mode 100644 index 00000000000..5bc58ed27ff --- /dev/null +++ b/soh/soh/Enhancements/randomizer/silver_rupee.h @@ -0,0 +1,33 @@ +#ifndef SHIP_SILVER_RUPEE_H +#define SHIP_SILVER_RUPEE_H + +#include +#include +#include "randomizerTypes.h" + +namespace Rando { + + class SilverRupeesInfo { + public: + SilverRupeesInfo(uint8_t total, RandomizerGet randoGet); + + const uint8_t GetCollected() const; + const uint8_t GetTotal() const; + void IncrementCollected(); + private: + uint8_t mCollected; + uint8_t mTotal; + RandomizerGet mRandoGet; + + }; + + class SilverRupees { + public: + SilverRupees(); + private: + std::array mSilverRupees; + }; + +} // Rando + +#endif //SHIP_SILVER_RUPEE_H From 69d4e43fd54841f61caf75ee548808e5f357466a Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 11 Feb 2024 15:02:34 -0500 Subject: [PATCH 004/108] Adding RCs, RGs, and Silver Rupee Counts. --- soh/soh/Enhancements/randomizer/dungeon.cpp | 144 +++++++++++++++ .../Enhancements/randomizer/randomizerTypes.h | 173 ++++++++++++++++++ .../Enhancements/randomizer/silver_rupee.cpp | 57 ++++++ .../Enhancements/randomizer/silver_rupee.h | 13 +- 4 files changed, 382 insertions(+), 5 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/dungeon.cpp b/soh/soh/Enhancements/randomizer/dungeon.cpp index 8453c938b7b..5a4d4c42221 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/dungeon.cpp @@ -223,6 +223,11 @@ Dungeons::Dungeons() { RC_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, RC_DODONGOS_CAVERN_MQ_GS_BACK_AREA, + 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, }, {}, { @@ -438,6 +443,16 @@ Dungeons::Dungeons() { RC_SPIRIT_TEMPLE_GS_LOBBY, RC_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, RC_SPIRIT_TEMPLE_GS_METAL_FENCE, + RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_1, + RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_2, + RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_3, + RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_4, + RC_SPIRIT_CHILD_BLOCK_PUSH_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, }, { // MQ Locations @@ -466,6 +481,11 @@ Dungeons::Dungeons() { RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, RC_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM, + 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, }, { // Shared Locations @@ -504,6 +524,21 @@ Dungeons::Dungeons() { RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, RC_SHADOW_TEMPLE_GS_NEAR_SHIP, + 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, }, { // MQ Locations @@ -532,6 +567,36 @@ Dungeons::Dungeons() { RC_SHADOW_TEMPLE_MQ_GS_AFTER_WIND, RC_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, + 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, }, {}, { @@ -561,6 +626,11 @@ Dungeons::Dungeons() { RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, RC_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, RC_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, + 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, }, { // MQ Locations @@ -585,6 +655,16 @@ Dungeons::Dungeons() { RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, RC_ICE_CAVERN_GS_HEART_PIECE_ROOM, + 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, }, { // MQ Locations @@ -628,6 +708,21 @@ Dungeons::Dungeons() { RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST, RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST, RC_GERUDO_TRAINING_GROUND_FREESTANDING_KEY, + 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, }, { // MQ Locations @@ -648,6 +743,20 @@ Dungeons::Dungeons() { RC_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST, RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, RC_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST, + 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, }, {}, {}); dungeonList[GANONS_CASTLE] = @@ -656,12 +765,27 @@ Dungeons::Dungeons() { { // Vanilla Locations RC_GANONS_CASTLE_FOREST_TRIAL_CHEST, + 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_GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST, RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST, RC_GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST, RC_GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST, RC_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, RC_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, + 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, RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST, RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST, RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST, @@ -670,6 +794,11 @@ Dungeons::Dungeons() { RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST, RC_GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST, RC_GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST, + 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_GANONS_CASTLE_DEKU_SCRUB_LEFT, RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, @@ -678,11 +807,26 @@ Dungeons::Dungeons() { { // MQ Locations RC_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, + 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_GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, + 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_GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST, RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST, RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, + 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, RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST, RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST, RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST, diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index de39b3e544b..a24b92d9cdd 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1044,6 +1044,11 @@ typedef enum { RC_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, RC_DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, RC_DODONGOS_CAVERN_MQ_GS_BACK_AREA, + 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_DODONGOS_CAVERN_BOSS_ROOM_CHEST, RC_DODONGOS_CAVERN_KING_DODONGO_HEART, RC_JABU_JABUS_BELLY_BOOMERANG_CHEST, @@ -1088,6 +1093,11 @@ typedef enum { RC_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, RC_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, + 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_BOTTOM_OF_THE_WELL_MQ_MAP_CHEST, RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY, RC_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, @@ -1213,6 +1223,21 @@ typedef enum { RC_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, RC_SHADOW_TEMPLE_BOSS_KEY_CHEST, RC_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, + 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_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, RC_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, RC_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, @@ -1243,6 +1268,36 @@ typedef enum { RC_SHADOW_TEMPLE_MQ_GS_AFTER_WIND, RC_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, + 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_SHADOW_TEMPLE_BONGO_BONGO_HEART, RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, @@ -1271,6 +1326,16 @@ typedef enum { RC_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, RC_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, RC_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, + RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_1, + RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_2, + RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_3, + RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_4, + RC_SPIRIT_CHILD_BLOCK_PUSH_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_SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST, RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST, @@ -1283,6 +1348,11 @@ typedef enum { RC_SPIRIT_TEMPLE_BOSS_KEY_CHEST, RC_SPIRIT_TEMPLE_TOPMOST_CHEST, RC_SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST, + 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_SPIRIT_TEMPLE_GS_METAL_FENCE, RC_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, RC_SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM, @@ -1301,6 +1371,16 @@ typedef enum { RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, RC_ICE_CAVERN_GS_HEART_PIECE_ROOM, RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, + 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_ICE_CAVERN_MQ_MAP_CHEST, RC_ICE_CAVERN_MQ_COMPASS_CHEST, RC_ICE_CAVERN_MQ_FREESTANDING_POH, @@ -1330,6 +1410,21 @@ typedef enum { RC_GERUDO_TRAINING_GROUND_MAZE_PATH_SECOND_CHEST, RC_GERUDO_TRAINING_GROUND_MAZE_PATH_THIRD_CHEST, RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FINAL_CHEST, + 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_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_CHEST, RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_CHEST, RC_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST, @@ -1347,7 +1442,31 @@ typedef enum { RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_FIRST_CHEST, RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST, RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_SECOND_CHEST, + 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_GANONS_CASTLE_FOREST_TRIAL_CHEST, + 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_GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST, RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST, RC_GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST, @@ -1360,8 +1479,18 @@ typedef enum { RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST, RC_GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST, RC_GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST, + 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_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, RC_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, + 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, RC_GANONS_CASTLE_DEKU_SCRUB_LEFT, RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, @@ -1369,9 +1498,24 @@ typedef enum { RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, RC_GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST, + 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_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, + 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_GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST, RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, + 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, RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST, RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, @@ -1959,6 +2103,35 @@ typedef enum { RG_OCARINA_C_LEFT_BUTTON, RG_OCARINA_C_RIGHT_BUTTON, RG_FISHING_POLE, + 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_CHILD_BLOCK_PUSH_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_HINT, RG_TYCOON_WALLET, RG_BRONZE_SCALE, diff --git a/soh/soh/Enhancements/randomizer/silver_rupee.cpp b/soh/soh/Enhancements/randomizer/silver_rupee.cpp index 35ab1bef65a..8a15caaa8aa 100644 --- a/soh/soh/Enhancements/randomizer/silver_rupee.cpp +++ b/soh/soh/Enhancements/randomizer/silver_rupee.cpp @@ -1,4 +1,61 @@ #include "silver_rupee.h" namespace Rando { + SilverRupees::SilverRupees() { + mSilverRupees = { + // Vanilla + SilverRupeesInfo(5, RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE), + SilverRupeesInfo(5, RG_ICE_CAVERN_SLIDING_SILVER_RUPEE), + SilverRupeesInfo(5, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE), + SilverRupeesInfo(5, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE), + SilverRupeesInfo(5, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE), + SilverRupeesInfo(5, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE), + SilverRupeesInfo(5, RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE), + SilverRupeesInfo(5, RG_SPIRIT_BOULDER_SILVER_RUPEE), + SilverRupeesInfo(5, RG_SHADOW_SCYTHE_SILVER_RUPEE), + SilverRupeesInfo(5, RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE), + SilverRupeesInfo(5, RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE), + SilverRupeesInfo(5, RG_FOREST_TRIAL_SILVER_RUPEE), + SilverRupeesInfo(5, RG_FIRE_TRIAL_SILVER_RUPEE), + SilverRupeesInfo(5, RG_SPIRIT_TRIAL_SILVER_RUPEE), + SilverRupeesInfo(5, RG_LIGHT_TRIAL_SILVER_RUPEE), + // MQ + SilverRupeesInfo(5, RG_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE), + SilverRupeesInfo(6, RG_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE), + SilverRupeesInfo(3, RG_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE), + SilverRupeesInfo(5, RG_DODONGOS_CAVERN_MQ_SILVER_RUPEE), + SilverRupeesInfo(5, RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE), + SilverRupeesInfo(5, RG_SHADOW_MQ_SCYTHE_SILVER_RUPEE), + SilverRupeesInfo(10, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE), + SilverRupeesInfo(5, RG_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE), + SilverRupeesInfo(10, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE), + SilverRupeesInfo(5, RG_FIRE_TRIAL_SILVER_RUPEE), + SilverRupeesInfo(5, RG_WATER_TRIAL_MQ_SILVER_RUPEE), + SilverRupeesInfo(5, RG_SHADOW_TRIAL_MQ_SILVER_RUPEE), + }; + } + + SilverRupeesInfo &SilverRupees::GetInfo(RandomizerGet rgid) { + return mSilverRupees[rgid - RG_SILVER_RUPEE_FIRST]; + } + + SilverRupeesInfo::SilverRupeesInfo(uint8_t total, RandomizerGet randoGet) : mCollected(0), mTotal(total), mRandoGet(randoGet) { + + } + + uint8_t SilverRupeesInfo::GetCollected() const { + return mCollected; + } + + uint8_t SilverRupeesInfo::GetTotal() const { + return mTotal; + } + + SilverRupeesInfo::SilverRupeesInfo() : mCollected(0), mTotal(0), mRandoGet(RG_NONE) { + + } + + void SilverRupeesInfo::IncrementCollected(uint8_t amount) { + mCollected += amount; + } } // Rando \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/silver_rupee.h b/soh/soh/Enhancements/randomizer/silver_rupee.h index 5bc58ed27ff..7142ff91f9c 100644 --- a/soh/soh/Enhancements/randomizer/silver_rupee.h +++ b/soh/soh/Enhancements/randomizer/silver_rupee.h @@ -9,13 +9,14 @@ namespace Rando { class SilverRupeesInfo { public: + SilverRupeesInfo(); SilverRupeesInfo(uint8_t total, RandomizerGet randoGet); - const uint8_t GetCollected() const; - const uint8_t GetTotal() const; - void IncrementCollected(); + uint8_t GetCollected() const; + uint8_t GetTotal() const; + void IncrementCollected(uint8_t amount = 1); private: - uint8_t mCollected; + uint8_t mCollected = 0; uint8_t mTotal; RandomizerGet mRandoGet; @@ -24,8 +25,10 @@ namespace Rando { class SilverRupees { public: SilverRupees(); + + SilverRupeesInfo& GetInfo(RandomizerGet rgid); private: - std::array mSilverRupees; + std::array mSilverRupees; }; } // Rando From cd27dc5c454aab704a19b4f09ba9701ecf32412d Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 11 Feb 2024 15:14:21 -0500 Subject: [PATCH 005/108] Add RAND_INF flags for all silver rupees. --- soh/include/z64save.h | 2 +- .../Enhancements/randomizer/randomizer_inf.h | 146 ++++++++++++++++++ 2 files changed, 147 insertions(+), 1 deletion(-) diff --git a/soh/include/z64save.h b/soh/include/z64save.h index 0f527925d3e..f1b7a6eae50 100644 --- a/soh/include/z64save.h +++ b/soh/include/z64save.h @@ -283,7 +283,7 @@ typedef struct { // #endregion // #region SOH [Randomizer] // Upstream TODO: Move these to their own struct or name to more obviously specific to Randomizer - /* */ u16 randomizerInf[16]; + /* */ u16 randomizerInf[25]; /* */ u8 mqDungeonCount; /* */ u16 adultTradeItems; /* */ u8 triforcePiecesCollected; diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index c61f933bfd6..d2d86b26cc7 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -267,6 +267,152 @@ typedef enum { RAND_INF_ZD_FISH_4, RAND_INF_ZD_FISH_5, + RAND_INF_BOTTOM_OF_THE_WELL_SILVER_RUPEE_1, + RAND_INF_BOTTOM_OF_THE_WELL_SILVER_RUPEE_2, + RAND_INF_BOTTOM_OF_THE_WELL_SILVER_RUPEE_3, + RAND_INF_BOTTOM_OF_THE_WELL_SILVER_RUPEE_4, + RAND_INF_BOTTOM_OF_THE_WELL_SILVER_RUPEE_5, + RAND_INF_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_1, + RAND_INF_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_2, + RAND_INF_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_3, + RAND_INF_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_4, + RAND_INF_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_5, + RAND_INF_ICE_CAVERN_SLIDING_SILVER_RUPEE_1, + RAND_INF_ICE_CAVERN_SLIDING_SILVER_RUPEE_2, + RAND_INF_ICE_CAVERN_SLIDING_SILVER_RUPEE_3, + RAND_INF_ICE_CAVERN_SLIDING_SILVER_RUPEE_4, + RAND_INF_ICE_CAVERN_SLIDING_SILVER_RUPEE_5, + RAND_INF_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_1, + RAND_INF_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_2, + RAND_INF_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_3, + RAND_INF_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_4, + RAND_INF_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_5, + RAND_INF_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_1, + RAND_INF_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_2, + RAND_INF_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_3, + RAND_INF_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_4, + RAND_INF_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_5, + RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_1, + RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_2, + RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_3, + RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_4, + RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_5, + RAND_INF_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_1, + RAND_INF_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_2, + RAND_INF_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_3, + RAND_INF_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_4, + RAND_INF_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_5, + RAND_INF_SPIRIT_BOULDER_SILVER_RUPEE_1, + RAND_INF_SPIRIT_BOULDER_SILVER_RUPEE_2, + RAND_INF_SPIRIT_BOULDER_SILVER_RUPEE_3, + RAND_INF_SPIRIT_BOULDER_SILVER_RUPEE_4, + RAND_INF_SPIRIT_BOULDER_SILVER_RUPEE_5, + RAND_INF_SHADOW_SCYTHE_SILVER_RUPEE_1, + RAND_INF_SHADOW_SCYTHE_SILVER_RUPEE_2, + RAND_INF_SHADOW_SCYTHE_SILVER_RUPEE_3, + RAND_INF_SHADOW_SCYTHE_SILVER_RUPEE_4, + RAND_INF_SHADOW_SCYTHE_SILVER_RUPEE_5, + RAND_INF_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_1, + RAND_INF_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_2, + RAND_INF_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_3, + RAND_INF_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_4, + RAND_INF_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_5, + RAND_INF_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_1, + RAND_INF_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_2, + RAND_INF_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_3, + RAND_INF_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_4, + RAND_INF_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_5, + RAND_INF_FOREST_TRIAL_SILVER_RUPEE_1, + RAND_INF_FOREST_TRIAL_SILVER_RUPEE_2, + RAND_INF_FOREST_TRIAL_SILVER_RUPEE_3, + RAND_INF_FOREST_TRIAL_SILVER_RUPEE_4, + RAND_INF_FOREST_TRIAL_SILVER_RUPEE_5, + RAND_INF_FIRE_TRIAL_SILVER_RUPEE_1, + RAND_INF_FIRE_TRIAL_SILVER_RUPEE_2, + RAND_INF_FIRE_TRIAL_SILVER_RUPEE_3, + RAND_INF_FIRE_TRIAL_SILVER_RUPEE_4, + RAND_INF_FIRE_TRIAL_SILVER_RUPEE_5, + RAND_INF_LIGHT_TRIAL_SILVER_RUPEE_1, + RAND_INF_LIGHT_TRIAL_SILVER_RUPEE_2, + RAND_INF_LIGHT_TRIAL_SILVER_RUPEE_3, + RAND_INF_LIGHT_TRIAL_SILVER_RUPEE_4, + RAND_INF_LIGHT_TRIAL_SILVER_RUPEE_5, + RAND_INF_SPIRIT_TRIAL_SILVER_RUPEE_1, + RAND_INF_SPIRIT_TRIAL_SILVER_RUPEE_2, + RAND_INF_SPIRIT_TRIAL_SILVER_RUPEE_3, + RAND_INF_SPIRIT_TRIAL_SILVER_RUPEE_4, + RAND_INF_SPIRIT_TRIAL_SILVER_RUPEE_5, + + RAND_INF_DODONGOS_CAVERN_MQ_SILVER_RUPEE_1, + RAND_INF_DODONGOS_CAVERN_MQ_SILVER_RUPEE_2, + RAND_INF_DODONGOS_CAVERN_MQ_SILVER_RUPEE_3, + RAND_INF_DODONGOS_CAVERN_MQ_SILVER_RUPEE_4, + RAND_INF_DODONGOS_CAVERN_MQ_SILVER_RUPEE_5, + RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_1, + RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_2, + RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_3, + RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_4, + RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_5, + RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_1, + RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_2, + RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_3, + RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_4, + RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_5, + RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_6, + RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE_1, + RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE_2, + RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE_3, + RAND_INF_SPIRIT_MQ_LOBBY_SILVER_RUPEE_1, + RAND_INF_SPIRIT_MQ_LOBBY_SILVER_RUPEE_2, + RAND_INF_SPIRIT_MQ_LOBBY_SILVER_RUPEE_3, + RAND_INF_SPIRIT_MQ_LOBBY_SILVER_RUPEE_4, + RAND_INF_SPIRIT_MQ_LOBBY_SILVER_RUPEE_5, + RAND_INF_SHADOW_MQ_SCYTHE_SILVER_RUPEE_1, + RAND_INF_SHADOW_MQ_SCYTHE_SILVER_RUPEE_2, + RAND_INF_SHADOW_MQ_SCYTHE_SILVER_RUPEE_3, + RAND_INF_SHADOW_MQ_SCYTHE_SILVER_RUPEE_4, + RAND_INF_SHADOW_MQ_SCYTHE_SILVER_RUPEE_5, + RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_1, + RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_2, + RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_3, + RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_4, + RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_5, + RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_6, + RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_7, + RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_8, + RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_9, + RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_10, + RAND_INF_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_1, + RAND_INF_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_2, + RAND_INF_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_3, + RAND_INF_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_4, + RAND_INF_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_5, + RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_1, + RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_2, + RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_3, + RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_4, + RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_5, + RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_6, + RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_7, + RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_8, + RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_9, + RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_10, + RAND_INF_FIRE_TRIAL_MQ_SILVER_RUPEE_1, + RAND_INF_FIRE_TRIAL_MQ_SILVER_RUPEE_2, + RAND_INF_FIRE_TRIAL_MQ_SILVER_RUPEE_3, + RAND_INF_FIRE_TRIAL_MQ_SILVER_RUPEE_4, + RAND_INF_FIRE_TRIAL_MQ_SILVER_RUPEE_5, + RAND_INF_WATER_TRIAL_MQ_SILVER_RUPEE_1, + RAND_INF_WATER_TRIAL_MQ_SILVER_RUPEE_2, + RAND_INF_WATER_TRIAL_MQ_SILVER_RUPEE_3, + RAND_INF_WATER_TRIAL_MQ_SILVER_RUPEE_4, + RAND_INF_WATER_TRIAL_MQ_SILVER_RUPEE_5, + RAND_INF_SHADOW_TRIAL_MQ_SILVER_RUPEE_1, + RAND_INF_SHADOW_TRIAL_MQ_SILVER_RUPEE_2, + RAND_INF_SHADOW_TRIAL_MQ_SILVER_RUPEE_3, + RAND_INF_SHADOW_TRIAL_MQ_SILVER_RUPEE_4, + RAND_INF_SHADOW_TRIAL_MQ_SILVER_RUPEE_5, + // If you add anything to this list, you need to update the size of randomizerInf in z64save.h to be ceil(RAND_INF_MAX / 16) RAND_INF_MAX, From c1bd869c940c5f99966e8604f8b76b96446dbed9 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 11 Feb 2024 17:02:26 -0500 Subject: [PATCH 006/108] Actually start randomizing silver rupees Remaining locations yet to be added, but the ones that were added are working. --- soh/soh/Enhancements/mods.cpp | 4 ++++ .../randomizer/3drando/category.hpp | 1 + .../randomizer/3drando/spoiler_log.cpp | 3 +++ .../randomizer/actors/z_en_g_switch_rando.c | 14 ++++++------- soh/soh/Enhancements/randomizer/location.h | 1 + .../Enhancements/randomizer/location_list.cpp | 7 +++++++ .../Enhancements/randomizer/randomizerTypes.h | 1 + .../Enhancements/randomizer/silver_rupee.cpp | 11 ++++++++++ soh/soh/Enhancements/randomizer/static_data.h | 21 +++++++++++++++++++ .../actors/ovl_En_G_Switch/z_en_g_switch.h | 4 ++++ 10 files changed, 59 insertions(+), 8 deletions(-) diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index d10077758e4..193afbe6de1 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -1165,6 +1165,10 @@ void RegisterSilverRupeeShuffle() { if (actor->id == ACTOR_EN_G_SWITCH) { auto* silverRupee = reinterpret_cast(actor); if (silverRupee->type == ENGSWITCH_SILVER_RUPEE) { + Rando::Position randoPos = {static_cast(gPlayState->sceneNum), actor->world.pos}; + silverRupee->rc = Rando::StaticData::silverRupeeMap.at(randoPos); + silverRupee->rg = OTRGlobals::Instance->gRandoContext->GetItemLocation(silverRupee->rc)->GetPlacedRandomizerGet(); + silverRupee->giEntry = OTRGlobals::Instance->gRandoContext->GetItemLocation(silverRupee->rc)->GetPlacedItem().GetGIEntry().get(); silverRupee->actionFunc = EnGSwitch_Randomizer_SilverRupeeIdle; silverRupee->actor.draw = EnGSwitch_Randomizer_Draw; } diff --git a/soh/soh/Enhancements/randomizer/3drando/category.hpp b/soh/soh/Enhancements/randomizer/3drando/category.hpp index 22522789cfd..aa527ad358c 100644 --- a/soh/soh/Enhancements/randomizer/3drando/category.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/category.hpp @@ -19,6 +19,7 @@ enum class Category { cVanillaCompass, cAdultTrade, cBeehive, + cSilverRupee, }; enum class OptionCategory { diff --git a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp index 6dd1802a64e..c0cf5ce2768 100644 --- a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp @@ -660,6 +660,9 @@ static void WriteAllLocations() { auto ctx = Rando::Context::GetInstance(); for (const RandomizerCheck key : ctx->allLocations) { Rando::ItemLocation* location = ctx->GetItemLocation(key); + if (Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName().empty()) { + continue; + } std::string placedItemName; switch (ctx->GetOption(RSK_LANGUAGE).GetSelectedOptionIndex()) { diff --git a/soh/soh/Enhancements/randomizer/actors/z_en_g_switch_rando.c b/soh/soh/Enhancements/randomizer/actors/z_en_g_switch_rando.c index b78bce33ec2..4e3f23f4838 100644 --- a/soh/soh/Enhancements/randomizer/actors/z_en_g_switch_rando.c +++ b/soh/soh/Enhancements/randomizer/actors/z_en_g_switch_rando.c @@ -8,15 +8,14 @@ void EnGSwitch_Randomizer_SilverRupeeIdle(EnGSwitch* self, PlayState* play) { self->actor.shape.rot.y += 0x800; if (self->actor.xyzDistToPlayerSq < 900.0f) { if (IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_SILVER_RUPEES) != RO_SILVER_SHUFFLE_VANILLA) { - GetItemEntry getItem = ItemTable_RetrieveEntry(MOD_NONE, GI_NUTS_5); - if (getItem.modIndex == MOD_NONE) { + if (self->giEntry->modIndex == MOD_NONE) { // RANDOTOD: Move this into Item_Give() or some other more central location - if (getItem.getItemId == GI_SWORD_BGS) { + if (self->giEntry->getItemId == GI_SWORD_BGS) { gSaveContext.bgsFlag = true; } - Item_Give(play, getItem.itemId); - } else if (getItem.modIndex == MOD_RANDOMIZER) { - Randomizer_Item_Give(play, getItem); + Item_Give(play, self->giEntry->itemId); + } else if (self->giEntry->modIndex == MOD_RANDOMIZER) { + Randomizer_Item_Give(play, *self->giEntry); } self->killTimer = 0; self->actionFunc = EnGSwitch_Kill; @@ -30,8 +29,7 @@ void EnGSwitch_Randomizer_Draw(Actor* thisx, PlayState* play) { this->type == ENGSWITCH_SILVER_RUPEE) { OPEN_DISPS(play->state.gfxCtx); Matrix_Scale(17.5f, 17.5f, 17.5f, MTXMODE_APPLY); - GetItemEntry getItem = ItemTable_RetrieveEntry(MOD_NONE, GI_NUTS_5); - GetItemEntry_Draw(play, getItem); + GetItemEntry_Draw(play, *this->giEntry); CLOSE_DISPS(play->state.gfxCtx); } } diff --git a/soh/soh/Enhancements/randomizer/location.h b/soh/soh/Enhancements/randomizer/location.h index 993e8c18405..72d79fabd78 100644 --- a/soh/soh/Enhancements/randomizer/location.h +++ b/soh/soh/Enhancements/randomizer/location.h @@ -108,6 +108,7 @@ enum class LocationType { GrottoScrub, Delayed, TempleReward, + SilverRupee, HintStone, OtherHint, }; diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index ea4775d463e..273134152df 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -1,6 +1,7 @@ #include "static_data.h" #define TWO_ACTOR_PARAMS(a, b) (abs(a) << 16) | abs(b) +#define THREE_ACTOR_PARAMS(a, b, c) (abs(a) << 32 | abs(b) << 16 | abs(c)) std::array Rando::StaticData::locationTable; @@ -1512,6 +1513,12 @@ void Rando::StaticData::InitLocationTable() { locationTable[RC_ZD_FISH_4] = Location::Base(RC_ZD_FISH_4, RCQUEST_BOTH, RCTYPE_FISH, RCAREA_ZORAS_DOMAIN, ACTOR_EN_FISH, SCENE_ZORAS_DOMAIN, -1 ^ 3, 0x00, "Fish 4", "ZD Fish 4", RHT_ZD_FISH, RG_FISH, { Category::cFish }, SpoilerCollectionCheck::Fish(0xFF, SCENE_ZORAS_DOMAIN), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); locationTable[RC_ZD_FISH_5] = Location::Base(RC_ZD_FISH_5, RCQUEST_BOTH, RCTYPE_FISH, RCAREA_ZORAS_DOMAIN, ACTOR_EN_FISH, SCENE_ZORAS_DOMAIN, -1 ^ 4, 0x00, "Fish 5", "ZD Fish 5", RHT_ZD_FISH, RG_FISH, { Category::cFish }, SpoilerCollectionCheck::Fish(0xFF, SCENE_ZORAS_DOMAIN), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + // Silver Rupees + 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,0, 0x0, "Spinning Blades Silver Rupee 1", "Ice Cavern Spinning Blades Silver Rupee 1", RHT_NONE, RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Spinning Blades Silver Rupee 2", "Ice Cavern Spinning Blades Silver Rupee 2", RHT_NONE, RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Spinning Blades Silver Rupee 3", "Ice Cavern Spinning Blades Silver Rupee 3", RHT_NONE, RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Spinning Blades Silver Rupee 4", "Ice Cavern Spinning Blades Silver Rupee 4", RHT_NONE, RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Spinning Blades Silver Rupee 5", "Ice Cavern Spinning Blades Silver Rupee 5", RHT_NONE, RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, RAND_INF_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_5)); // Gossip Stones // RandomizerCheck Randomizer Check Quest Area Scene Params Flag Short Name Spoiler name Categories diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index a24b92d9cdd..5a6cb1decf6 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -114,6 +114,7 @@ typedef enum { RCTYPE_OCARINA, // Ocarina locations RCTYPE_BEEHIVE, // Beehives RCTYPE_FISH, + RCTYPE_SILVER_RUPEE } RandomizerCheckType; typedef enum { RCQUEST_VANILLA, RCQUEST_MQ, RCQUEST_BOTH } RandomizerCheckQuest; diff --git a/soh/soh/Enhancements/randomizer/silver_rupee.cpp b/soh/soh/Enhancements/randomizer/silver_rupee.cpp index 8a15caaa8aa..d389a5dcbfd 100644 --- a/soh/soh/Enhancements/randomizer/silver_rupee.cpp +++ b/soh/soh/Enhancements/randomizer/silver_rupee.cpp @@ -1,6 +1,17 @@ +#include #include "silver_rupee.h" +#include "static_data.h" namespace Rando { + + std::unordered_map StaticData::silverRupeeMap = { + { { SCENE_ICE_CAVERN, {414.0f, 178.0f, -579.0f} }, RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_1 }, + { { SCENE_ICE_CAVERN, {389.0f, 0.0f, -382.0f } }, RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_2 }, + { { SCENE_ICE_CAVERN, {278.0f, 0.0f, -637.0f } }, RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_3 }, + { { SCENE_ICE_CAVERN, { 198.0f, 0.0f, -388.0f } }, RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_4 }, + { { SCENE_ICE_CAVERN, { 1.0f, 0.0f, -143.0f } }, RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_5 }, + }; + SilverRupees::SilverRupees() { mSilverRupees = { // Vanilla diff --git a/soh/soh/Enhancements/randomizer/static_data.h b/soh/soh/Enhancements/randomizer/static_data.h index 7650b5dc424..be8aaa1ff39 100644 --- a/soh/soh/Enhancements/randomizer/static_data.h +++ b/soh/soh/Enhancements/randomizer/static_data.h @@ -7,6 +7,10 @@ #include "location.h" namespace Rando { +struct Position{ + SceneID scene; + Vec3f pos; +}; /** * @brief Singleton for storing and accessing static Randomizer-related data * @@ -37,7 +41,24 @@ class StaticData { static std::vector overworldFishLocations; static std::array, 17> randomizerFishingPondFish; static std::unordered_map randomizerGrottoFishMap; + static std::unordered_map silverRupeeMap; StaticData(); ~StaticData(); }; +} + +namespace std { + template<> + struct hash { + inline size_t operator()(const Rando::Position& pos) const { + return hash{}(pos.scene) ^ hash{}(pos.pos.x) ^ hash{}(pos.pos.y) ^ hash{}(pos.pos.z); + } + }; + + template<> + struct equal_to { + inline bool operator()(const Rando::Position& a, const Rando::Position& b) const { + return a.scene == b.scene && a.pos.x == b.pos.x && a.pos.y == b.pos.y && a.pos.z == b.pos.z; + } + }; } \ No newline at end of file diff --git a/soh/src/overlays/actors/ovl_En_G_Switch/z_en_g_switch.h b/soh/src/overlays/actors/ovl_En_G_Switch/z_en_g_switch.h index 77a19c87351..e7bee199d1c 100644 --- a/soh/src/overlays/actors/ovl_En_G_Switch/z_en_g_switch.h +++ b/soh/src/overlays/actors/ovl_En_G_Switch/z_en_g_switch.h @@ -56,6 +56,10 @@ typedef struct EnGSwitch { /* 0x0178 */ s8 objIndex; /* 0x017C */ ColliderCylinder collider; /* 0x01C8 */ EnGSwitchEffect effects[100]; + // #region SOH [Randomizer] + /* */ RandomizerCheck rc; + /* */ RandomizerGet rg; + /* */ GetItemEntry* giEntry; } EnGSwitch; // size = 0x12F8 #endif From cf60071252c4a901bbb6c7a34b26c8acec4eba9b Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Mon, 12 Feb 2024 19:13:28 -0500 Subject: [PATCH 007/108] Added location data for remaining vanilla silver rupees. --- soh/soh/Enhancements/randomizer/location.h | 6 +- .../Enhancements/randomizer/location_list.cpp | 84 +++++++++++++++++++ .../Enhancements/randomizer/silver_rupee.cpp | 70 ++++++++++++++++ 3 files changed, 157 insertions(+), 3 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/location.h b/soh/soh/Enhancements/randomizer/location.h index 72d79fabd78..691c41ec0ab 100644 --- a/soh/soh/Enhancements/randomizer/location.h +++ b/soh/soh/Enhancements/randomizer/location.h @@ -16,10 +16,10 @@ class SpoilerCollectionCheck { public: SpoilerCollectionCheckType type = SPOILER_CHK_NONE; uint8_t scene = 0; - uint8_t flag = 0; + uint16_t flag = 0; SpoilerCollectionCheck() = default; - SpoilerCollectionCheck(const SpoilerCollectionCheckType type_, const uint8_t scene_, const uint8_t flag_) + SpoilerCollectionCheck(const SpoilerCollectionCheckType type_, const uint8_t scene_, const uint16_t flag_) : type(type_), scene(scene_), flag(flag_) { } @@ -95,7 +95,7 @@ class SpoilerCollectionCheck { return SpoilerCollectionCheck(SPOILER_CHK_MERCHANT, scene, flag); } - static auto RandomizerInf(const int8_t scene, const uint8_t flag) { + static auto RandomizerInf(const int8_t scene, const uint16_t flag) { return SpoilerCollectionCheck(SPOILER_CHK_RANDOMIZER_INF, scene, flag); } }; diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 273134152df..5d976f086dc 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -1520,6 +1520,90 @@ void Rando::StaticData::InitLocationTable() { 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,0, 0x0, "Spinning Blades Silver Rupee 4", "Ice Cavern Spinning Blades Silver Rupee 4", RHT_NONE, RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Spinning Blades Silver Rupee 5", "Ice Cavern Spinning Blades Silver Rupee 5", RHT_NONE, RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Sliding Puzzle Silver Rupee 1", "Ice Cavern Sliding Puzzle Silver Rupee 1", RHT_NONE, RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Sliding Puzzle Silver Rupee 2", "Ice Cavern Sliding Puzzle Silver Rupee 2", RHT_NONE, RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Sliding Puzzle Silver Rupee 3", "Ice Cavern Sliding Puzzle Silver Rupee 3", RHT_NONE, RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Sliding Puzzle Silver Rupee 4", "Ice Cavern Sliding Puzzle Silver Rupee 4", RHT_NONE, RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Sliding Puzzle Silver Rupee 5", "Ice Cavern Sliding Puzzle Silver Rupee 5", RHT_NONE, RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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, 0, 0x0, "Bottom of the Well Basement Silver Rupee 1", "Bottom of the Well Basement Silver Rupee 1", RHT_NONE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_BOTTOM_OF_THE_WELL, 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, 0, 0x0, "Bottom of the Well Basement Silver Rupee 2", "Bottom of the Well Basement Silver Rupee 2", RHT_NONE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_BOTTOM_OF_THE_WELL, 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, 0, 0x0, "Bottom of the Well Basement Silver Rupee 3", "Bottom of the Well Basement Silver Rupee 3", RHT_NONE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_BOTTOM_OF_THE_WELL, 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, 0, 0x0, "Bottom of the Well Basement Silver Rupee 4", "Bottom of the Well Basement Silver Rupee 4", RHT_NONE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_BOTTOM_OF_THE_WELL, 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, 0, 0x0, "Bottom of the Well Basement Silver Rupee 5", "Bottom of the Well Basement Silver Rupee 5", RHT_NONE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_BOTTOM_OF_THE_WELL, 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, 0, 0x0, "Boulder Maze Silver Rupee 1", "GTG Boulder Maze Silver Rupee 1", RHT_NONE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Boulder Maze Silver Rupee 2", "GTG Boulder Maze Silver Rupee 2", RHT_NONE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Boulder Maze Silver Rupee 3", "GTG Boulder Maze Silver Rupee 3", RHT_NONE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Boulder Maze Silver Rupee 4", "GTG Boulder Maze Silver Rupee 4", RHT_NONE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Boulder Maze Silver Rupee 5", "GTG Boulder Maze Silver Rupee 5", RHT_NONE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Lava Room Silver Rupee 1", "GTG Lava Room Silver Rupee 1", RHT_NONE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Lava Room Silver Rupee 2", "GTG Lava Room Silver Rupee 2", RHT_NONE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Lava Room Silver Rupee 3", "GTG Lava Room Silver Rupee 3", RHT_NONE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Lava Room Silver Rupee 4", "GTG Lava Room Silver Rupee 4", RHT_NONE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Lava Room Silver Rupee 5", "GTG Lava Room Silver Rupee 5", RHT_NONE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Whirlpool Room Silver Rupee 1", "GTG Whirlpool Room Silver Rupee 1", RHT_NONE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Whirlpool Room Silver Rupee 2", "GTG Whirlpool Room Silver Rupee 2", RHT_NONE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Whirlpool Room Silver Rupee 3", "GTG Whirlpool Room Silver Rupee 3", RHT_NONE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Whirlpool Room Silver Rupee 4", "GTG Whirlpool Room Silver Rupee 4", RHT_NONE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Whirlpool Room Silver Rupee 5", "GTG Whirlpool Room Silver Rupee 5", RHT_NONE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_5)); + + locationTable[RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_1] = Location::Base(RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_1, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Block Pushing Silver Rupee 1", "Spirit Child Block Pushing Silver Rupee 1", RHT_NONE, RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_1)); + locationTable[RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_2] = Location::Base(RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_2, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Block Pushing Silver Rupee 2", "Spirit Child Block Pushing Silver Rupee 2", RHT_NONE, RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_2)); + locationTable[RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_3] = Location::Base(RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_3, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Block Pushing Silver Rupee 3", "Spirit Child Block Pushing Silver Rupee 3", RHT_NONE, RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_3)); + locationTable[RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_4] = Location::Base(RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_4, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Block Pushing Silver Rupee 4", "Spirit Child Block Pushing Silver Rupee 4", RHT_NONE, RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_4)); + locationTable[RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_5] = Location::Base(RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_5, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Block Pushing Silver Rupee 5", "Spirit Child Block Pushing Silver Rupee 5", RHT_NONE, RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_BLOCK_PUSH_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, 0, 0x0, "Boulder Room Silver Rupee 1", "Spirit Boulder Room Silver Rupee 1", RHT_NONE, RG_SPIRIT_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Boulder Room Silver Rupee 2", "Spirit Boulder Room Silver Rupee 2", RHT_NONE, RG_SPIRIT_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Boulder Room Silver Rupee 3", "Spirit Boulder Room Silver Rupee 3", RHT_NONE, RG_SPIRIT_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Boulder Room Silver Rupee 4", "Spirit Boulder Room Silver Rupee 4", RHT_NONE, RG_SPIRIT_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Boulder Room Silver Rupee 5", "Spirit Boulder Room Silver Rupee 5", RHT_NONE, RG_SPIRIT_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Spinning Scythe Silver Rupee 1", "Shadow Spinning Scythe Silver Rupee 1", RHT_NONE, RG_SHADOW_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Spinning Scythe Silver Rupee 2", "Shadow Spinning Scythe Silver Rupee 2", RHT_NONE, RG_SHADOW_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Spinning Scythe Silver Rupee 3", "Shadow Spinning Scythe Silver Rupee 3", RHT_NONE, RG_SHADOW_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Spinning Scythe Silver Rupee 4", "Shadow Spinning Scythe Silver Rupee 4", RHT_NONE, RG_SHADOW_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Spinning Scythe Silver Rupee 5", "Shadow Spinning Scythe Silver Rupee 5", RHT_NONE, RG_SHADOW_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Outside Spike Rain Room Silver Rupee 1", "Shadow Outside Spike Rain Room Silver Rupee 1", RHT_NONE, RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Outside Spike Rain Room Silver Rupee 2", "Shadow Outside Spike Rain Room Silver Rupee 2", RHT_NONE, RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Outside Spike Rain Room Silver Rupee 3", "Shadow Outside Spike Rain Room Silver Rupee 3", RHT_NONE, RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Outside Spike Rain Room Silver Rupee 4", "Shadow Outside Spike Rain Room Silver Rupee 4", RHT_NONE, RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Outside Spike Rain Room Silver Rupee 5", "Shadow Outside Spike Rain Room Silver Rupee 5", RHT_NONE, RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Room Silver Rupee 1", "Shadow Invisible Spikes Room Silver Rupee 1", RHT_NONE, RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Room Silver Rupee 2", "Shadow Invisible Spikes Room Silver Rupee 2", RHT_NONE, RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Room Silver Rupee 3", "Shadow Invisible Spikes Room Silver Rupee 3", RHT_NONE, RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Room Silver Rupee 4", "Shadow Invisible Spikes Room Silver Rupee 4", RHT_NONE, RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Room Silver Rupee 5", "Shadow Invisible Spikes Room Silver Rupee 5", RHT_NONE, RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Forest Trial Silver Rupee 1", "Inside Ganon's Castle Forest Trial Silver Rupee 1", RHT_NONE, RG_FOREST_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Forest Trial Silver Rupee 2", "Inside Ganon's Castle Forest Trial Silver Rupee 2", RHT_NONE, RG_FOREST_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Forest Trial Silver Rupee 3", "Inside Ganon's Castle Forest Trial Silver Rupee 3", RHT_NONE, RG_FOREST_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Forest Trial Silver Rupee 4", "Inside Ganon's Castle Forest Trial Silver Rupee 4", RHT_NONE, RG_FOREST_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Forest Trial Silver Rupee 5", "Inside Ganon's Castle Forest Trial Silver Rupee 5", RHT_NONE, RG_FOREST_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Fire Trial Silver Rupee 1", "Inside Ganon's Castle Fire Trial Silver Rupee 1", RHT_NONE, RG_FIRE_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Fire Trial Silver Rupee 2", "Inside Ganon's Castle Fire Trial Silver Rupee 2", RHT_NONE, RG_FIRE_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Fire Trial Silver Rupee 3", "Inside Ganon's Castle Fire Trial Silver Rupee 3", RHT_NONE, RG_FIRE_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Fire Trial Silver Rupee 4", "Inside Ganon's Castle Fire Trial Silver Rupee 4", RHT_NONE, RG_FIRE_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Fire Trial Silver Rupee 5", "Inside Ganon's Castle Fire Trial Silver Rupee 5", RHT_NONE, RG_FIRE_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Spirit Trial Silver Rupee 1", "Inside Ganon's Castle Spirit Trial Silver Rupee 1", RHT_NONE, RG_SPIRIT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Spirit Trial Silver Rupee 2", "Inside Ganon's Castle Spirit Trial Silver Rupee 2", RHT_NONE, RG_SPIRIT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Spirit Trial Silver Rupee 3", "Inside Ganon's Castle Spirit Trial Silver Rupee 3", RHT_NONE, RG_SPIRIT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Spirit Trial Silver Rupee 4", "Inside Ganon's Castle Spirit Trial Silver Rupee 4", RHT_NONE, RG_SPIRIT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Spirit Trial Silver Rupee 5", "Inside Ganon's Castle Spirit Trial Silver Rupee 5", RHT_NONE, RG_SPIRIT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Light Trial Silver Rupee 1", "Inside Ganon's Castle Light Trial Silver Rupee 1", RHT_NONE, RG_LIGHT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Light Trial Silver Rupee 2", "Inside Ganon's Castle Light Trial Silver Rupee 2", RHT_NONE, RG_LIGHT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Light Trial Silver Rupee 3", "Inside Ganon's Castle Light Trial Silver Rupee 3", RHT_NONE, RG_LIGHT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Light Trial Silver Rupee 4", "Inside Ganon's Castle Light Trial Silver Rupee 4", RHT_NONE, RG_LIGHT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Light Trial Silver Rupee 5", "Inside Ganon's Castle Light Trial Silver Rupee 5", RHT_NONE, RG_LIGHT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, RAND_INF_LIGHT_TRIAL_SILVER_RUPEE_5)); + // Gossip Stones // RandomizerCheck Randomizer Check Quest Area Scene Params Flag Short Name Spoiler name Categories locationTable[RC_DMC_GOSSIP_STONE] = Location::HintStone(RC_DMC_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 14341, 0x05, "Gossip Stone", "DMC Gossip Stone", {}); diff --git a/soh/soh/Enhancements/randomizer/silver_rupee.cpp b/soh/soh/Enhancements/randomizer/silver_rupee.cpp index d389a5dcbfd..770f93e920d 100644 --- a/soh/soh/Enhancements/randomizer/silver_rupee.cpp +++ b/soh/soh/Enhancements/randomizer/silver_rupee.cpp @@ -10,6 +10,76 @@ namespace Rando { { { SCENE_ICE_CAVERN, {278.0f, 0.0f, -637.0f } }, RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_3 }, { { SCENE_ICE_CAVERN, { 198.0f, 0.0f, -388.0f } }, RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_4 }, { { SCENE_ICE_CAVERN, { 1.0f, 0.0f, -143.0f } }, RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_5 }, + { { SCENE_ICE_CAVERN, { -1040.0f, 112.0f, -485.0f } }, RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_1 }, + { { SCENE_ICE_CAVERN, { -1120.0f, 119.0f, -1577.0f } }, RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_2 }, + { { SCENE_ICE_CAVERN, { -1294.0f, 113.0f, -899.0f } }, RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_3 }, + { { SCENE_ICE_CAVERN, { -1558.0f, 41.0f, -951.0f } }, RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_4 }, + { { SCENE_ICE_CAVERN, { -1676.0f, 112.0f, -552.0f } }, RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_5 }, + { { SCENE_BOTTOM_OF_THE_WELL, { -259.0f, -708.0f, -234.0f } }, RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_1 }, + { { SCENE_BOTTOM_OF_THE_WELL, { -402.0f, -701.0f, -401.0f } }, RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_2 }, + { { SCENE_BOTTOM_OF_THE_WELL, { -560.0f, -720.0f, -291.0f } }, RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_3 }, + { { SCENE_BOTTOM_OF_THE_WELL, { -614.0f, -465.0f, -297.0f } }, RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_4 }, + { { SCENE_BOTTOM_OF_THE_WELL, { -796.0f, 0.0f, -150.0f } }, RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_5 }, + { { SCENE_GERUDO_TRAINING_GROUND, { -1887.0f, 160.0f, -2134.0f } }, RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_1 }, + { { SCENE_GERUDO_TRAINING_GROUND, { -1627.0f, 182.0f, -1462.0f } }, RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_2 }, + { { SCENE_GERUDO_TRAINING_GROUND, { -1579.0f, 236.0f, -999.0f } }, RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_3 }, + { { SCENE_GERUDO_TRAINING_GROUND, { -1886.0f, -80.0f, -956.0f } }, RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_4 }, + { { SCENE_GERUDO_TRAINING_GROUND, { -1332.0f, -80.0f, -992.0f } }, RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_5 }, + { { SCENE_GERUDO_TRAINING_GROUND, { 1560.0f, -239.0f, -1861.0f } }, RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_1 }, + { { SCENE_GERUDO_TRAINING_GROUND, { 1437.0f, 30.0f, -2193.0f } }, RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_2 }, + { { SCENE_GERUDO_TRAINING_GROUND, { 1134.0f, -239.0f, -1841.0f } }, RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_3 }, + { { SCENE_GERUDO_TRAINING_GROUND, { 1558.0f, -239.0f, -1370.0f } }, RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_4 }, + { { SCENE_GERUDO_TRAINING_GROUND, { 1320.0f, -239.0f, -1248.0f } }, RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_5 }, + { { SCENE_GERUDO_TRAINING_GROUND, { 2160.0f, -900.0f, -1315.0f } }, RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_1 }, + { { SCENE_GERUDO_TRAINING_GROUND, { 2078.0f, -806.0f, -1458.0f } }, RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_2 }, + { { SCENE_GERUDO_TRAINING_GROUND, { 2453.0f, -890.0f, -1612.0f } }, RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_3 }, + { { SCENE_GERUDO_TRAINING_GROUND, { 2497.0f, -605.0f, -1465.0f } }, RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_4 }, + { { SCENE_GERUDO_TRAINING_GROUND, { 2308.0f, -961.0f, -1464.0f } }, RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_5 }, + { { SCENE_SPIRIT_TEMPLE, { -984.0f, 923.0f, -450.0f } }, RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_1 }, + { { SCENE_SPIRIT_TEMPLE, { -1123.0f, 923.0f, 428.0f } }, RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_2 }, + { { SCENE_SPIRIT_TEMPLE, { -1275.0f, 922.0f, -247.0f } }, RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_3 }, + { { SCENE_SPIRIT_TEMPLE, { -1433.0f, 913.0f, -283.0f } }, RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_4 }, + { { SCENE_SPIRIT_TEMPLE, { -1836.0f, 923.0f, -446.0f } }, RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_5 }, + { { SCENE_SPIRIT_TEMPLE, { 1573.0f, -33.0f, -920.0f } }, RC_SPIRIT_BOULDER_SILVER_RUPEE_1 }, + { { SCENE_SPIRIT_TEMPLE, { 1856.0f, -33.0f, -1219.0f } }, RC_SPIRIT_BOULDER_SILVER_RUPEE_2 }, + { { SCENE_SPIRIT_TEMPLE, { 1856.0f, -33.0f, -944.0f } }, RC_SPIRIT_BOULDER_SILVER_RUPEE_3 }, + { { SCENE_SPIRIT_TEMPLE, { 1284.0f, -33.0f, -813.0f } }, RC_SPIRIT_BOULDER_SILVER_RUPEE_4 }, + { { SCENE_SPIRIT_TEMPLE, { 1284.0f, -33.0f, -1355.0f } }, RC_SPIRIT_BOULDER_SILVER_RUPEE_5 }, + { { SCENE_SHADOW_TEMPLE, { 3399.0f, -543.0f, -838.0f } }, RC_SHADOW_SCYTHE_SILVER_RUPEE_1 }, + { { SCENE_SHADOW_TEMPLE, { 2869.0f, -543.0f, -948.0f } }, RC_SHADOW_SCYTHE_SILVER_RUPEE_2 }, + { { SCENE_SHADOW_TEMPLE, { 3554.0f, -543.0f, -1432.0f } }, RC_SHADOW_SCYTHE_SILVER_RUPEE_3 }, + { { SCENE_SHADOW_TEMPLE, { 3007.0f, -423.0f, -1222.0f } }, RC_SHADOW_SCYTHE_SILVER_RUPEE_4 }, + { { SCENE_SHADOW_TEMPLE, { 3243.0f, -543.0f, -1061.0f } }, RC_SHADOW_SCYTHE_SILVER_RUPEE_5 }, + { { SCENE_SHADOW_TEMPLE, { 1998.0f, -1343.0f, 3358.0f } }, RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_1 }, + { { SCENE_SHADOW_TEMPLE, { 2243.0f, -1343.0f, 3361.0f } }, RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_2 }, + { { SCENE_SHADOW_TEMPLE, { 2110.0f, -1343.0f, 3368.0f } }, RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_3 }, + { { SCENE_SHADOW_TEMPLE, { 2115.0f, -1343.0f, 3738.0f } }, RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_4 }, + { { SCENE_SHADOW_TEMPLE, { 2131.0f, -1343.0f, 3030.0f } }, RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_5 }, + { { SCENE_SHADOW_TEMPLE, { 2254.0f, -1197.0f, 988.0f } }, RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_1 }, + { { SCENE_SHADOW_TEMPLE, { 2135.0f, -1225.0f, 1297.0f } }, RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_2 }, + { { SCENE_SHADOW_TEMPLE, { 2478.0f, -1343.0f, 1208.0f } }, RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_3 }, + { { SCENE_SHADOW_TEMPLE, { 2940.0f, -1268.0f, 1069.0f } }, RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_4 }, + { { SCENE_SHADOW_TEMPLE, { 2042.0f, -1203.0f, 849.0f } }, RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_5 }, + { { SCENE_INSIDE_GANONS_CASTLE, { 1643.0f, 164.0f, 1550.0f } }, RC_FOREST_TRIAL_SILVER_RUPEE_1 }, + { { SCENE_INSIDE_GANONS_CASTLE, { 1651.0f, 30.0f, 2021.0f } }, RC_FOREST_TRIAL_SILVER_RUPEE_2 }, + { { SCENE_INSIDE_GANONS_CASTLE, { 1538.0f, 118.0f, 2225.0f } }, RC_FOREST_TRIAL_SILVER_RUPEE_3 }, + { { SCENE_INSIDE_GANONS_CASTLE, { 1361.0f, 115.0f, 1222.0f } }, RC_FOREST_TRIAL_SILVER_RUPEE_4 }, + { { SCENE_INSIDE_GANONS_CASTLE, { 1247.0f, 59.0f, 1787.0f } }, RC_FOREST_TRIAL_SILVER_RUPEE_5 }, + { { SCENE_INSIDE_GANONS_CASTLE, { -1867.0f, 227.0f, -2754.0f } }, RC_FIRE_TRIAL_SILVER_RUPEE_1 }, + { { SCENE_INSIDE_GANONS_CASTLE, { -604.0f, 133.0f, -2592.0f } }, RC_FIRE_TRIAL_SILVER_RUPEE_2 }, + { { SCENE_INSIDE_GANONS_CASTLE, { -515.0f, 133.0f, -3253.0f } }, RC_FIRE_TRIAL_SILVER_RUPEE_3 }, + { { SCENE_INSIDE_GANONS_CASTLE, { -1555.0f, 151.0f, -2317.0f } }, RC_FIRE_TRIAL_SILVER_RUPEE_4 }, + { { SCENE_INSIDE_GANONS_CASTLE, { -854.0f, 152.0f, -3679.0f } }, RC_FIRE_TRIAL_SILVER_RUPEE_5 }, + { { SCENE_INSIDE_GANONS_CASTLE, { -1142.0f, 165.0f, 639.0f } }, RC_SPIRIT_TRIAL_SILVER_RUPEE_1 }, + { { SCENE_INSIDE_GANONS_CASTLE, { -725.0f, 165.0f, 942.0f } }, RC_SPIRIT_TRIAL_SILVER_RUPEE_2 }, + { { SCENE_INSIDE_GANONS_CASTLE, { -865.0f, 165.0f, 656.0f } }, RC_SPIRIT_TRIAL_SILVER_RUPEE_3 }, + { { SCENE_INSIDE_GANONS_CASTLE, { -940.0f, 165.0f, 270.0f } }, RC_SPIRIT_TRIAL_SILVER_RUPEE_4 }, + { { SCENE_INSIDE_GANONS_CASTLE, { -829.0f, 274.0f, 591.0f } }, RC_SPIRIT_TRIAL_SILVER_RUPEE_5 }, + { { SCENE_INSIDE_GANONS_CASTLE, { -2674.0f, -240.0f, -777.0f } }, RC_LIGHT_TRIAL_SILVER_RUPEE_1 }, + { { SCENE_INSIDE_GANONS_CASTLE, { -2680.0f, -240.0f, -893.0f } }, RC_LIGHT_TRIAL_SILVER_RUPEE_2 }, + { { SCENE_INSIDE_GANONS_CASTLE, { -2646.0f, -120.0f, -839.0f } }, RC_LIGHT_TRIAL_SILVER_RUPEE_3 }, + { { SCENE_INSIDE_GANONS_CASTLE, { -2649.0f, -240.0f, -545.0f } }, RC_LIGHT_TRIAL_SILVER_RUPEE_4 }, + { { SCENE_INSIDE_GANONS_CASTLE, { -2509.0f, -240.0f, -1091.0f } }, RC_LIGHT_TRIAL_SILVER_RUPEE_5 }, }; SilverRupees::SilverRupees() { From e532baf7bfe4780d4a771473c75bd5b9ba81fd12 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Mon, 12 Feb 2024 21:16:38 -0500 Subject: [PATCH 008/108] Added item data and text. --- .../Enhancements/item-tables/ItemTableTypes.h | 1 + soh/soh/Enhancements/randomizer/context.cpp | 4 ++ soh/soh/Enhancements/randomizer/context.h | 1 + soh/soh/Enhancements/randomizer/item.h | 1 + soh/soh/Enhancements/randomizer/item_list.cpp | 17 ++++++++ .../Enhancements/randomizer/randomizer.cpp | 13 ++++++ .../Enhancements/randomizer/silver_rupee.cpp | 41 +++++++++++++++++++ .../Enhancements/randomizer/silver_rupee.h | 4 ++ soh/soh/OTRGlobals.cpp | 2 + 9 files changed, 84 insertions(+) diff --git a/soh/soh/Enhancements/item-tables/ItemTableTypes.h b/soh/soh/Enhancements/item-tables/ItemTableTypes.h index 44ceb214309..2a86a9bcbb5 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/randomizer/context.cpp b/soh/soh/Enhancements/randomizer/context.cpp index 5cf0dc08777..2f4e1d631cc 100644 --- a/soh/soh/Enhancements/randomizer/context.cpp +++ b/soh/soh/Enhancements/randomizer/context.cpp @@ -581,4 +581,8 @@ Option& Context::GetOption(const RandomizerSettingKey key) const { TrickOption& Context::GetTrickOption(const RandomizerTrick key) const { return mSettings->GetTrickOption(key); } + +std::shared_ptr Context::GetSilverRupees() { + return mSilverRupees; +} } // namespace Rando diff --git a/soh/soh/Enhancements/randomizer/context.h b/soh/soh/Enhancements/randomizer/context.h index 11bda9eb3a5..bbf10aab0b2 100644 --- a/soh/soh/Enhancements/randomizer/context.h +++ b/soh/soh/Enhancements/randomizer/context.h @@ -69,6 +69,7 @@ class Context { std::shared_ptr GetEntranceShuffler(); std::shared_ptr GetDungeons(); std::shared_ptr GetFishsanity(); + std::shared_ptr GetSilverRupees(); DungeonInfo* GetDungeon(size_t key) const; std::shared_ptr GetLogic(); void ResetLogic(); diff --git a/soh/soh/Enhancements/randomizer/item.h b/soh/soh/Enhancements/randomizer/item.h index d1610a7bcd1..e1b3d6c7070 100644 --- a/soh/soh/Enhancements/randomizer/item.h +++ b/soh/soh/Enhancements/randomizer/item.h @@ -15,6 +15,7 @@ enum ItemType { ITEMTYPE_COMPASS, ITEMTYPE_BOSSKEY, ITEMTYPE_SMALLKEY, + ITEMTYPE_SILVERRUPEE, ITEMTYPE_TOKEN, ITEMTYPE_FORTRESS_SMALLKEY, ITEMTYPE_EVENT, diff --git a/soh/soh/Enhancements/randomizer/item_list.cpp b/soh/soh/Enhancements/randomizer/item_list.cpp index a64d62d40c4..ecfa73b5f2f 100644 --- a/soh/soh/Enhancements/randomizer/item_list.cpp +++ b/soh/soh/Enhancements/randomizer/item_list.cpp @@ -280,6 +280,23 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_TRIFORCE] = Item(RG_TRIFORCE, Text{ "Triforce", "Triforce", "Triforce" }, ITEMTYPE_EVENT, RG_TRIFORCE, false, &logic->noVariable, RHT_NONE); itemTable[RG_HINT] = Item(RG_HINT, Text{ "Hint", "Indice", "Hinweis" }, ITEMTYPE_EVENT, RG_HINT, false, &logic->noVariable, RHT_NONE); + + itemTable[RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE] = Item(RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, Text{ "Ice Cavern Spinning Blades Room Silver Rupee", "Ice Cavern Spinning Blades Room Silver Rupee", "Ice Cavern Spinning Blades Room Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_NONE, 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_SLIDING_SILVER_RUPEE] = Item(RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, Text{ "Ice Cavern Block Sliding Room Silver Rupee", "Ice Cavern Block Sliding Room Silver Rupee", "Ice Cavern Block Sliding Room Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_NONE, 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_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->noVariable, RHT_NONE, 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_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE] = Item(RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, Text{ "GTG Boudler Maze Silver Rupee", "GTG Boulder Maze Silver Rupee", "GTG Boulder Maze Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_NONE, 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_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->noVariable, RHT_NONE, 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_TOILET_SILVER_RUPEE] = Item(RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, Text{ "GTG Toilet Room Silver Rupee", "GTG Whirlpool Room Silver Rupee", "GTG Whirlpool Room Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_NONE, 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_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE] = Item(RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, Text{ "Spirit Temple Child Block Pushing Room Silver Rupee", "Spirit Temple Child Block Pushing Room Silver Rupee", "Spirit Temple Child Block Pushing Room Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_NONE, RG_SPIRIT_CHILD_BLOCK_PUSH_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] = 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->noVariable, RHT_NONE, 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_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->noVariable, RHT_NONE, 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_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE] = Item(RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, Text{ "Shadow Temple Outside Falling Spikes Room Silver Rupee", "Shadow Temple Outside Falling Spikes Room Silver Rupee", "Shadow Temple Outside Falling Spikes Room Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_NONE, 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_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->noVariable, RHT_NONE, 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_FOREST_TRIAL_SILVER_RUPEE] = Item(RG_FOREST_TRIAL_SILVER_RUPEE, Text{ "Forest Trial Silver Rupee", "Forest Trial Silver Rupee", "Forest Trial Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_NONE, 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_FIRE_TRIAL_SILVER_RUPEE] = Item(RG_FIRE_TRIAL_SILVER_RUPEE, Text{ "Fire Trial Silver Rupee", "Fire Trial Silver Rupee", "Fire Trial Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_NONE, 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_SPIRIT_TRIAL_SILVER_RUPEE] = Item(RG_SPIRIT_TRIAL_SILVER_RUPEE, Text{ "Spirit Trial Silver Rupee", "Spirit Trial Silver Rupee", "Spirit Trial Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_NONE, 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_LIGHT_TRIAL_SILVER_RUPEE] = Item(RG_LIGHT_TRIAL_SILVER_RUPEE, Text{ "Light Trial Silver Rupee", "Light Trial Silver Rupee", "Light Trial Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_NONE, 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); + // Individual stages of progressive items (only here for GetItemEntry purposes, not for use in seed gen) itemTable[RG_HOOKSHOT] = Item(RG_HOOKSHOT, Text{ "Hookshot", "Grappin", "Fanghaken" }, ITEMTYPE_ITEM, GI_HOOKSHOT, true, &logic->ProgressiveHookshot, RHT_HOOKSHOT, ITEM_HOOKSHOT, OBJECT_GI_HOOKSHOT, GID_HOOKSHOT, 0x36, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_LONGSHOT] = Item(RG_LONGSHOT, Text{ "Longshot", "Super-Grappin", "Enterhaken" }, ITEMTYPE_ITEM, GI_LONGSHOT, true, &logic->ProgressiveHookshot, RHT_LONGSHOT, ITEM_LONGSHOT, OBJECT_GI_HOOKSHOT, GID_LONGSHOT, 0x4F, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index b2d9c78668f..eeb814a2339 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -2853,6 +2853,19 @@ void CreateGetItemMessages(const std::array* messageEntries) CustomMessage(messageEntry.english, messageEntry.german, messageEntry.french, TEXTBOX_TYPE_BLUE, TEXTBOX_POS_BOTTOM)); } + // Special Case for Silver Rupees + //TODO: AI Translated Text, get translation from native speaker. + customMessageManager->CreateMessage(Randomizer::getItemMessageTableID, RG_SILVER_RUPEE_FIRST, + CustomMessage("You got a %cSilver Rupee%w for the&%g{{location}}%w!", + "Du hast eine %cSilberne Rupie%w für die&%g{{location}}%w!", + "Vous avez reçu une %cRoupie d'Argent%w pour le&%g{{location}}%w!", + TEXTBOX_TYPE_BLUE, TEXTBOX_POS_BOTTOM)); + // Special Case for Silver Rupee Pouches +// customMessageManager->CreateMessage(Randomizer::getItemMessageTableID, RG_SILVER_RUPEE_POUCH_FIRST, +// { TEXTBOX_TYPE_BLUE, TEXTBOX_POS_BOTTOM, +// "You got a %cSilver Rupee Pouch%w for the&%g{{location}}%w!", +// "Du hast einen %cBeutel mit Silberrupien%g für die für die&%g{{location}}%w!", +// "Vous avez reçu une %cPochette en Roupie d'Argent%w pour le&%g{{location}}%w!" }); } void CreateRupeeMessages() { diff --git a/soh/soh/Enhancements/randomizer/silver_rupee.cpp b/soh/soh/Enhancements/randomizer/silver_rupee.cpp index 770f93e920d..82bc1674350 100644 --- a/soh/soh/Enhancements/randomizer/silver_rupee.cpp +++ b/soh/soh/Enhancements/randomizer/silver_rupee.cpp @@ -1,6 +1,7 @@ #include #include "silver_rupee.h" #include "static_data.h" +#include "randomizer.h" namespace Rando { @@ -114,6 +115,46 @@ namespace Rando { SilverRupeesInfo(5, RG_WATER_TRIAL_MQ_SILVER_RUPEE), SilverRupeesInfo(5, RG_SHADOW_TRIAL_MQ_SILVER_RUPEE), }; + mSilverRupeeRoomNames = { + // TODO: Translate + // "English" "German" "French" + { RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, { "Ice Cavern's Spinning Blades Room", "Ice Cavern's Spinning Blades Room", "Ice Cavern's Spinning Blades Room" } }, + { RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, { "Ice Cavern's Block Sliding Puzzle Room", "Ice Cavern's Block Sliding Puzzle Room", "Ice Cavern's Block Sliding Puzzle Room" } }, + { RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, { "Bottom of the Well", "Bottom of the Well", "Bottom of the Well" } }, + { RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, { "Boulder Maze in the Gerudo Training Grounds", "Boulder Maze in the Gerudo Training Grounds", "Boulder Maze in the Gerudo Training Grounds" } }, + { RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, { "Lava room in the Gerudo Training Grounds", "Lava room in the Gerudo Training Grounds", "Lava room in the Gerudo Training Grounds" } }, + { RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, { "Whirlpool room in the Gerudo Training Grounds", "Whirlpool room in the Gerudo Training Grounds", "Whirlpool room in the Gerudo Training Grounds" } }, + { RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, { "Child-side Block Pushing room in the Spirit Temple", "Child-side Block Pushing room in the Spirit Temple", "Child-side Block Pushing room in the Spirit Temple" } }, + { RG_SPIRIT_BOULDER_SILVER_RUPEE, { "Boulder room in the Spirit Temple", "Boulder room in the Spirit Temple", "Boulder room in the Spirit Temple" } }, + { RG_SHADOW_SCYTHE_SILVER_RUPEE, { "Spinning Scythes room in the Shadow Temple", "Spinning Scythes room in the Shadow Temple", "Spinning Scythes room in the Shadow Temple" } }, + { RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, { "door to the Falling Spikes room in the Shadow Temple", "door to the Falling Spikes room in the Shadow Temple", "door to the Falling Spikes room in the Shadow Temple" } }, + { RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, { "room with Invisible Spikes in the Shadow Temple", "room with Invisible Spikes in the Shadow Temple", "room with Invisible Spikes in the Shadow Temple" } }, + { RG_FOREST_TRIAL_SILVER_RUPEE, { "Forest Trial in Ganon's Castle", "Forest Trial in Ganon's Castle", "Forest Trial in Ganon's Castle" } }, + { RG_FIRE_TRIAL_SILVER_RUPEE, { "Fire Trial in Ganon's Castle", "Fire Trial in Ganon's Castle", "Fire Trial in Ganon's Castle" } }, + { RG_SPIRIT_TRIAL_SILVER_RUPEE, { "Spirit Trial in Ganon's Castle", "Spirit Trial in Ganon's Castle", "Spirit Trial in Ganon's Castle" } }, + { RG_LIGHT_TRIAL_SILVER_RUPEE, { "Light Trial in Ganon's Castle", "Light Trial in Ganon's Castle", "Light Trial in Ganon's Castle" } }, + { RG_DODONGOS_CAVERN_MQ_SILVER_RUPEE, { "Dodongo's Cavern Staircase Room", "Dodongo's Cavern Staircase Room", "Dodongo's Cavern Staircase Room" } }, + { RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE, { "Spirit Temple Lobby", "Spirit Temple Lobby", "Spirit Temple Lobby" } }, + { RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, { "Invisible Scythes room in the Shadow Temple", "Invisible Scythes room in the Shadow Temple", "Invisible Scythes room in the Shadow Temple" } }, + { RG_WATER_TRIAL_MQ_SILVER_RUPEE, { "Water Trial in Ganon's Castle", "Water Trial in Ganon's Castle", "Water Trial in Ganon's Castle" } }, + { RG_SHADOW_TRIAL_MQ_SILVER_RUPEE, { "Shadow Trial in Ganon's Castle", "Shadow Trial in Ganon's Castle", "Shadow Trial in Ganon's Castle" } } + }; + } + + CustomMessage SilverRupees::GetSilverRupeeMessage(u16 rgid) { + CustomMessage messageEntry; + if (rgid >= RG_SILVER_RUPEE_FIRST && rgid <= RG_SILVER_RUPEE_LAST) { + messageEntry = + CustomMessageManager::Instance->RetrieveMessage(Randomizer::getItemMessageTableID, RG_SILVER_RUPEE_FIRST); + }/* else if (rgid >= RG_SILVER_RUPEE_POUCH_FIRST && rgid <= RG_SILVER_RUPEE_POUCH_LAST) { + messageEntry = + CustomMessageManager::Instance->RetrieveMessage(Randomizer::getItemMessageTableID, RG_SILVER_RUPEE_POUCH_FIRST); + }*/ + u16 roomNameKey = + /*(rgid >= RG_SILVER_RUPEE_POUCH_FIRST) ? (rgid - RG_SILVER_RUPEE_POUCH_FIRST) + RG_SILVER_RUPEE_FIRST :*/ rgid; + Text locationNames = mSilverRupeeRoomNames[(RandomizerGet)roomNameKey]; + messageEntry.Replace("{{location}}", locationNames.english.c_str(), locationNames.german.c_str(), locationNames.french.c_str()); + return messageEntry; } SilverRupeesInfo &SilverRupees::GetInfo(RandomizerGet rgid) { diff --git a/soh/soh/Enhancements/randomizer/silver_rupee.h b/soh/soh/Enhancements/randomizer/silver_rupee.h index 7142ff91f9c..c1facb07159 100644 --- a/soh/soh/Enhancements/randomizer/silver_rupee.h +++ b/soh/soh/Enhancements/randomizer/silver_rupee.h @@ -4,6 +4,8 @@ #include #include #include "randomizerTypes.h" +#include "soh/Enhancements/randomizer/3drando/text.hpp" +#include "soh/Enhancements/custom-message/CustomMessageManager.h" namespace Rando { @@ -27,8 +29,10 @@ namespace Rando { SilverRupees(); SilverRupeesInfo& GetInfo(RandomizerGet rgid); + static CustomMessage GetSilverRupeeMessage(u16 rgid); private: std::array mSilverRupees; + static std::unordered_map mSilverRupeeRoomNames; }; } // Rando diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 38da2015be1..93974486d0c 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -2492,6 +2492,8 @@ extern "C" int CustomMessage_RetrieveIfExists(PlayState* play) { } } 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 = OTRGlobals::Instance->gRandoContext->GetSilverRupees()->GetSilverRupeeMessage(player->getItemEntry.getItemId); } else { messageEntry = Randomizer_GetCustomGetItemMessage(player); } From 5224e006d8062c87dd927980fed80a1a0179be63 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Mon, 12 Feb 2024 21:34:35 -0500 Subject: [PATCH 009/108] Should be enough to make Silver Rupee GetItem work --- soh/soh/Enhancements/mods.cpp | 5 +++++ soh/soh/Enhancements/randomizer/actors/z_en_g_switch_rando.c | 1 + soh/soh/OTRGlobals.cpp | 4 ++++ soh/soh/OTRGlobals.h | 1 + soh/src/code/z_parameter.c | 5 +++++ soh/src/overlays/actors/ovl_En_G_Switch/z_en_g_switch.h | 1 + 6 files changed, 17 insertions(+) diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index 193afbe6de1..735a092f621 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -1167,6 +1167,11 @@ void RegisterSilverRupeeShuffle() { if (silverRupee->type == ENGSWITCH_SILVER_RUPEE) { Rando::Position randoPos = {static_cast(gPlayState->sceneNum), actor->world.pos}; silverRupee->rc = Rando::StaticData::silverRupeeMap.at(randoPos); + Rando::Location* loc = Rando::StaticData::GetLocation(silverRupee->rc); + silverRupee->randInfFlag = static_cast(loc->GetCollectionCheck().flag); + if (Flags_GetRandomizerInf(silverRupee->randInfFlag)) { + Actor_Kill(actor); + } silverRupee->rg = OTRGlobals::Instance->gRandoContext->GetItemLocation(silverRupee->rc)->GetPlacedRandomizerGet(); silverRupee->giEntry = OTRGlobals::Instance->gRandoContext->GetItemLocation(silverRupee->rc)->GetPlacedItem().GetGIEntry().get(); silverRupee->actionFunc = EnGSwitch_Randomizer_SilverRupeeIdle; diff --git a/soh/soh/Enhancements/randomizer/actors/z_en_g_switch_rando.c b/soh/soh/Enhancements/randomizer/actors/z_en_g_switch_rando.c index 4e3f23f4838..5af9fcc3763 100644 --- a/soh/soh/Enhancements/randomizer/actors/z_en_g_switch_rando.c +++ b/soh/soh/Enhancements/randomizer/actors/z_en_g_switch_rando.c @@ -17,6 +17,7 @@ void EnGSwitch_Randomizer_SilverRupeeIdle(EnGSwitch* self, PlayState* play) { } else if (self->giEntry->modIndex == MOD_RANDOMIZER) { Randomizer_Item_Give(play, *self->giEntry); } + Flags_SetRandomizerInf(self->randInfFlag); self->killTimer = 0; self->actionFunc = EnGSwitch_Kill; } diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 93974486d0c..4e1da835107 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -2462,6 +2462,10 @@ extern "C" void Randomizer_SetPlandoLoaded(bool plandoLoaded) { OTRGlobals::Instance->gRandoContext->SetPlandoLoaded(plandoLoaded); } +extern "C" void Randomizer_IncrementSilverRupeeCount(RandomizerGet rgid, uint8_t amount) { + OTRGlobals::Instance->gRandoContext->GetSilverRupees()->GetInfo(rgid).IncrementCollected(amount); +} + CustomMessage Randomizer_GetCustomGetItemMessage(Player* player) { s16 giid; if (player->getItemEntry.objectId != OBJECT_INVALID) { diff --git a/soh/soh/OTRGlobals.h b/soh/soh/OTRGlobals.h index 899e5c10f7c..d6a95646afd 100644 --- a/soh/soh/OTRGlobals.h +++ b/soh/soh/OTRGlobals.h @@ -175,6 +175,7 @@ uint8_t Randomizer_IsSpoilerLoaded(); void Randomizer_SetSpoilerLoaded(bool spoilerLoaded); uint8_t Randomizer_IsPlandoLoaded(); void Randomizer_SetPlandoLoaded(bool plandoLoaded); +void Randomizer_IncrementSilverRupeeCount(RandomizerGet rgid, uint8_t amount); int CustomMessage_RetrieveIfExists(PlayState* play); void Overlay_DisplayText(float duration, const char* text); void Overlay_DisplayText_Seconds(int seconds, const char* text); diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index 828e983689d..5ff95b2b732 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -2694,6 +2694,11 @@ u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { return Return_Item_Entry(giEntry, RG_NONE); } + if (item >= RG_SILVER_RUPEE_FIRST && item <= RG_SILVER_RUPEE_LAST) { + Randomizer_IncrementSilverRupeeCount(item, 1); + return Return_Item_Entry(giEntry, RG_NONE); + } + temp = gSaveContext.inventory.items[slot]; osSyncPrintf("Item_Register(%d)=%d %d\n", slot, item, temp); INV_CONTENT(item) = item; diff --git a/soh/src/overlays/actors/ovl_En_G_Switch/z_en_g_switch.h b/soh/src/overlays/actors/ovl_En_G_Switch/z_en_g_switch.h index e7bee199d1c..53a3251165f 100644 --- a/soh/src/overlays/actors/ovl_En_G_Switch/z_en_g_switch.h +++ b/soh/src/overlays/actors/ovl_En_G_Switch/z_en_g_switch.h @@ -60,6 +60,7 @@ typedef struct EnGSwitch { /* */ RandomizerCheck rc; /* */ RandomizerGet rg; /* */ GetItemEntry* giEntry; + /* */ RandomizerInf randInfFlag; } EnGSwitch; // size = 0x12F8 #endif From 43f3166517d3173910501d89ad94ef7694d2d72d Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Mon, 12 Feb 2024 21:55:33 -0500 Subject: [PATCH 010/108] Adds vanilla silver rupees to pool when option is on. --- .../randomizer/3drando/item_pool.cpp | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index a54f522aa9a..a4a9797fd6f 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -1061,6 +1061,43 @@ void GenerateItemPool() { } } + // Silver Rupees + + // The Silver Rupees to add to the pool will be different according to which dungeons are vanilla/mq. + if (ctx->GetOption(RSK_SHUFFLE_SILVER_RUPEES).IsNot(RO_SILVER_SHUFFLE_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_GROUNDS)->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); + } + if (ctx->GetDungeon(Rando::SPIRIT_TEMPLE)->IsVanilla()) { + silversToAdd.push_back(RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE); + silversToAdd.push_back(RG_SPIRIT_BOULDER_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); + } + 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); + } + for (auto rgid : silversToAdd) { + AddItemToMainPool(rgid, ctx->GetSilverRupees()->GetInfo(rgid).GetTotal()); + } + } + 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); From 397b7107265361f95dbb2f4786193f30c622ad1d Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Mon, 12 Feb 2024 22:03:13 -0500 Subject: [PATCH 011/108] Fix linker error --- .../Enhancements/randomizer/silver_rupee.cpp | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/silver_rupee.cpp b/soh/soh/Enhancements/randomizer/silver_rupee.cpp index 82bc1674350..f9cc2945117 100644 --- a/soh/soh/Enhancements/randomizer/silver_rupee.cpp +++ b/soh/soh/Enhancements/randomizer/silver_rupee.cpp @@ -82,6 +82,30 @@ namespace Rando { { { SCENE_INSIDE_GANONS_CASTLE, { -2649.0f, -240.0f, -545.0f } }, RC_LIGHT_TRIAL_SILVER_RUPEE_4 }, { { SCENE_INSIDE_GANONS_CASTLE, { -2509.0f, -240.0f, -1091.0f } }, RC_LIGHT_TRIAL_SILVER_RUPEE_5 }, }; + std::unordered_map SilverRupees::mSilverRupeeRoomNames = { + // TODO: Translate + // "English" "German" "French" + { RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, { "Ice Cavern's Spinning Blades Room", "Ice Cavern's Spinning Blades Room", "Ice Cavern's Spinning Blades Room" } }, + { RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, { "Ice Cavern's Block Sliding Puzzle Room", "Ice Cavern's Block Sliding Puzzle Room", "Ice Cavern's Block Sliding Puzzle Room" } }, + { RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, { "Bottom of the Well", "Bottom of the Well", "Bottom of the Well" } }, + { RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, { "Boulder Maze in the Gerudo Training Grounds", "Boulder Maze in the Gerudo Training Grounds", "Boulder Maze in the Gerudo Training Grounds" } }, + { RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, { "Lava room in the Gerudo Training Grounds", "Lava room in the Gerudo Training Grounds", "Lava room in the Gerudo Training Grounds" } }, + { RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, { "Whirlpool room in the Gerudo Training Grounds", "Whirlpool room in the Gerudo Training Grounds", "Whirlpool room in the Gerudo Training Grounds" } }, + { RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, { "Child-side Block Pushing room in the Spirit Temple", "Child-side Block Pushing room in the Spirit Temple", "Child-side Block Pushing room in the Spirit Temple" } }, + { RG_SPIRIT_BOULDER_SILVER_RUPEE, { "Boulder room in the Spirit Temple", "Boulder room in the Spirit Temple", "Boulder room in the Spirit Temple" } }, + { RG_SHADOW_SCYTHE_SILVER_RUPEE, { "Spinning Scythes room in the Shadow Temple", "Spinning Scythes room in the Shadow Temple", "Spinning Scythes room in the Shadow Temple" } }, + { RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, { "door to the Falling Spikes room in the Shadow Temple", "door to the Falling Spikes room in the Shadow Temple", "door to the Falling Spikes room in the Shadow Temple" } }, + { RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, { "room with Invisible Spikes in the Shadow Temple", "room with Invisible Spikes in the Shadow Temple", "room with Invisible Spikes in the Shadow Temple" } }, + { RG_FOREST_TRIAL_SILVER_RUPEE, { "Forest Trial in Ganon's Castle", "Forest Trial in Ganon's Castle", "Forest Trial in Ganon's Castle" } }, + { RG_FIRE_TRIAL_SILVER_RUPEE, { "Fire Trial in Ganon's Castle", "Fire Trial in Ganon's Castle", "Fire Trial in Ganon's Castle" } }, + { RG_SPIRIT_TRIAL_SILVER_RUPEE, { "Spirit Trial in Ganon's Castle", "Spirit Trial in Ganon's Castle", "Spirit Trial in Ganon's Castle" } }, + { RG_LIGHT_TRIAL_SILVER_RUPEE, { "Light Trial in Ganon's Castle", "Light Trial in Ganon's Castle", "Light Trial in Ganon's Castle" } }, + { RG_DODONGOS_CAVERN_MQ_SILVER_RUPEE, { "Dodongo's Cavern Staircase Room", "Dodongo's Cavern Staircase Room", "Dodongo's Cavern Staircase Room" } }, + { RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE, { "Spirit Temple Lobby", "Spirit Temple Lobby", "Spirit Temple Lobby" } }, + { RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, { "Invisible Scythes room in the Shadow Temple", "Invisible Scythes room in the Shadow Temple", "Invisible Scythes room in the Shadow Temple" } }, + { RG_WATER_TRIAL_MQ_SILVER_RUPEE, { "Water Trial in Ganon's Castle", "Water Trial in Ganon's Castle", "Water Trial in Ganon's Castle" } }, + { RG_SHADOW_TRIAL_MQ_SILVER_RUPEE, { "Shadow Trial in Ganon's Castle", "Shadow Trial in Ganon's Castle", "Shadow Trial in Ganon's Castle" } } + }; SilverRupees::SilverRupees() { mSilverRupees = { @@ -115,30 +139,6 @@ namespace Rando { SilverRupeesInfo(5, RG_WATER_TRIAL_MQ_SILVER_RUPEE), SilverRupeesInfo(5, RG_SHADOW_TRIAL_MQ_SILVER_RUPEE), }; - mSilverRupeeRoomNames = { - // TODO: Translate - // "English" "German" "French" - { RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, { "Ice Cavern's Spinning Blades Room", "Ice Cavern's Spinning Blades Room", "Ice Cavern's Spinning Blades Room" } }, - { RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, { "Ice Cavern's Block Sliding Puzzle Room", "Ice Cavern's Block Sliding Puzzle Room", "Ice Cavern's Block Sliding Puzzle Room" } }, - { RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, { "Bottom of the Well", "Bottom of the Well", "Bottom of the Well" } }, - { RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, { "Boulder Maze in the Gerudo Training Grounds", "Boulder Maze in the Gerudo Training Grounds", "Boulder Maze in the Gerudo Training Grounds" } }, - { RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, { "Lava room in the Gerudo Training Grounds", "Lava room in the Gerudo Training Grounds", "Lava room in the Gerudo Training Grounds" } }, - { RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, { "Whirlpool room in the Gerudo Training Grounds", "Whirlpool room in the Gerudo Training Grounds", "Whirlpool room in the Gerudo Training Grounds" } }, - { RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, { "Child-side Block Pushing room in the Spirit Temple", "Child-side Block Pushing room in the Spirit Temple", "Child-side Block Pushing room in the Spirit Temple" } }, - { RG_SPIRIT_BOULDER_SILVER_RUPEE, { "Boulder room in the Spirit Temple", "Boulder room in the Spirit Temple", "Boulder room in the Spirit Temple" } }, - { RG_SHADOW_SCYTHE_SILVER_RUPEE, { "Spinning Scythes room in the Shadow Temple", "Spinning Scythes room in the Shadow Temple", "Spinning Scythes room in the Shadow Temple" } }, - { RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, { "door to the Falling Spikes room in the Shadow Temple", "door to the Falling Spikes room in the Shadow Temple", "door to the Falling Spikes room in the Shadow Temple" } }, - { RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, { "room with Invisible Spikes in the Shadow Temple", "room with Invisible Spikes in the Shadow Temple", "room with Invisible Spikes in the Shadow Temple" } }, - { RG_FOREST_TRIAL_SILVER_RUPEE, { "Forest Trial in Ganon's Castle", "Forest Trial in Ganon's Castle", "Forest Trial in Ganon's Castle" } }, - { RG_FIRE_TRIAL_SILVER_RUPEE, { "Fire Trial in Ganon's Castle", "Fire Trial in Ganon's Castle", "Fire Trial in Ganon's Castle" } }, - { RG_SPIRIT_TRIAL_SILVER_RUPEE, { "Spirit Trial in Ganon's Castle", "Spirit Trial in Ganon's Castle", "Spirit Trial in Ganon's Castle" } }, - { RG_LIGHT_TRIAL_SILVER_RUPEE, { "Light Trial in Ganon's Castle", "Light Trial in Ganon's Castle", "Light Trial in Ganon's Castle" } }, - { RG_DODONGOS_CAVERN_MQ_SILVER_RUPEE, { "Dodongo's Cavern Staircase Room", "Dodongo's Cavern Staircase Room", "Dodongo's Cavern Staircase Room" } }, - { RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE, { "Spirit Temple Lobby", "Spirit Temple Lobby", "Spirit Temple Lobby" } }, - { RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, { "Invisible Scythes room in the Shadow Temple", "Invisible Scythes room in the Shadow Temple", "Invisible Scythes room in the Shadow Temple" } }, - { RG_WATER_TRIAL_MQ_SILVER_RUPEE, { "Water Trial in Ganon's Castle", "Water Trial in Ganon's Castle", "Water Trial in Ganon's Castle" } }, - { RG_SHADOW_TRIAL_MQ_SILVER_RUPEE, { "Shadow Trial in Ganon's Castle", "Shadow Trial in Ganon's Castle", "Shadow Trial in Ganon's Castle" } } - }; } CustomMessage SilverRupees::GetSilverRupeeMessage(u16 rgid) { From fff2ec04ef67fefde00b6b4246855d31fc7e747a Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sat, 24 Feb 2024 13:18:46 -0500 Subject: [PATCH 012/108] Shuffle vanilla silver rupees --- soh/soh/Enhancements/mods.cpp | 12 ++++++ .../randomizer/3drando/item_pool.cpp | 1 + .../randomizer/actors/z_en_g_switch_rando.c | 33 ++++++++++++++- soh/soh/Enhancements/randomizer/context.cpp | 1 + soh/soh/Enhancements/randomizer/draw.cpp | 21 ++++++++++ soh/soh/Enhancements/randomizer/draw.h | 1 + soh/soh/Enhancements/randomizer/dungeon.cpp | 5 +++ soh/soh/Enhancements/randomizer/item_list.cpp | 17 ++++++++ .../Enhancements/randomizer/location_list.cpp | 8 +++- .../Enhancements/randomizer/randomizerTypes.h | 8 +++- .../Enhancements/randomizer/randomizer_inf.h | 9 +++- .../Enhancements/randomizer/silver_rupee.cpp | 42 ++++++++++++++++++- .../Enhancements/randomizer/silver_rupee.h | 3 ++ soh/soh/Enhancements/randomizer/static_data.h | 21 ++++++++++ soh/soh/SaveManager.cpp | 11 +++++ 15 files changed, 185 insertions(+), 8 deletions(-) diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index 7e75ad5cceb..6db0d8b9fb8 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -1177,6 +1177,18 @@ void RegisterSilverRupeeShuffle() { silverRupee->giEntry = OTRGlobals::Instance->gRandoContext->GetItemLocation(silverRupee->rc)->GetPlacedItem().GetGIEntry().get(); silverRupee->actionFunc = EnGSwitch_Randomizer_SilverRupeeIdle; silverRupee->actor.draw = EnGSwitch_Randomizer_Draw; + } else if (silverRupee->type == ENGSWITCH_SILVER_TRACKER) { + Rando::Identifier randoIdentifier = { static_cast(gPlayState->sceneNum), RCQUEST_VANILLA, actor->params }; + silverRupee->rg = Rando::StaticData::silverTrackerMap.at(randoIdentifier); + if (OTRGlobals::Instance->gRandoContext->GetSilverRupees()->GetInfo(silverRupee->rg).GetCollected() >= silverRupee->silverCount) { + if ((gPlayState->sceneNum == SCENE_GERUDO_TRAINING_GROUND) && (silverRupee->actor.room == 2)) { + Flags_SetTempClear(gPlayState, silverRupee->actor.room); + } else { + func_80078884(NA_SE_SY_CORRECT_CHIME); + Flags_SetSwitch(gPlayState, silverRupee->switchFlag); + } + Actor_Kill(&silverRupee->actor); + } } } }); diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index a4a9797fd6f..596c78ab42c 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -1079,6 +1079,7 @@ void GenerateItemPool() { silversToAdd.push_back(RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE); } if (ctx->GetDungeon(Rando::SPIRIT_TEMPLE)->IsVanilla()) { + silversToAdd.push_back(RG_SPIRIT_CHILD_GATE_SILVER_RUPEE); silversToAdd.push_back(RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE); silversToAdd.push_back(RG_SPIRIT_BOULDER_SILVER_RUPEE); } diff --git a/soh/soh/Enhancements/randomizer/actors/z_en_g_switch_rando.c b/soh/soh/Enhancements/randomizer/actors/z_en_g_switch_rando.c index 5af9fcc3763..957c31e8462 100644 --- a/soh/soh/Enhancements/randomizer/actors/z_en_g_switch_rando.c +++ b/soh/soh/Enhancements/randomizer/actors/z_en_g_switch_rando.c @@ -14,17 +14,46 @@ void EnGSwitch_Randomizer_SilverRupeeIdle(EnGSwitch* self, PlayState* play) { gSaveContext.bgsFlag = true; } Item_Give(play, self->giEntry->itemId); - } else if (self->giEntry->modIndex == MOD_RANDOMIZER) { + } else if (self->giEntry->modIndex == MOD_RANDOMIZER && self->giEntry->getItemId != RG_ICE_TRAP) { Randomizer_Item_Give(play, *self->giEntry); } Flags_SetRandomizerInf(self->randInfFlag); + // if ((!CVarGetInteger("gSkulltulaFreeze", 0) || self->giEntry->itemId != ITEM_SKULL_TOKEN) && + // self->giEntry->getItemId != RG_ICE_TRAP) { + // player->actor.freezeTimer = 20; + // } + + // if (self->giEntry->getItemId == RG_ICE_TRAP && Message_GetState(&play->msgCtx) != TEXT_STATE_CLOSING) { + // player->actor.freezeTimer = 10; + // } + + player->getItemEntry = *self->giEntry; + + if (self->giEntry->getItemId == RG_ICE_TRAP) { + Message_StartTextbox(play, 0xF8, NULL); + } else { + Message_StartTextbox(play, self->giEntry->textId, NULL); + } + + if (IS_RANDO) { + if (self->giEntry->getItemId != RG_ICE_TRAP) { + Audio_PlayFanfare_Rando(*self->giEntry); + } else { + gSaveContext.pendingIceTrapCount++; + Audio_PlayFanfare(NA_BGM_SMALL_ITEM_GET); + } + } else { + Audio_PlayFanfare(NA_BGM_SMALL_ITEM_GET); + } + + player->getItemEntry = (GetItemEntry)GET_ITEM_NONE; self->killTimer = 0; self->actionFunc = EnGSwitch_Kill; } } } -void EnGSwitch_Randomizer_Draw(Actor* thisx, PlayState* play) { + void EnGSwitch_Randomizer_Draw(Actor* thisx, PlayState* play) { EnGSwitch* this = (EnGSwitch*)thisx; if (IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_SILVER_RUPEES) != RO_SILVER_SHUFFLE_VANILLA && this->type == ENGSWITCH_SILVER_RUPEE) { diff --git a/soh/soh/Enhancements/randomizer/context.cpp b/soh/soh/Enhancements/randomizer/context.cpp index 2f4e1d631cc..36bc1bc5ccf 100644 --- a/soh/soh/Enhancements/randomizer/context.cpp +++ b/soh/soh/Enhancements/randomizer/context.cpp @@ -93,6 +93,7 @@ Context::Context() { mTrials = std::make_shared(); mSettings = std::make_shared(); mFishsanity = std::make_shared(); + mSilverRupees = std::make_shared(); for (auto& location : StaticData::GetLocationTable()) { mSpoilerfileCheckNameToEnum[location.GetName()] = location.GetRandomizerCheck(); } diff --git a/soh/soh/Enhancements/randomizer/draw.cpp b/soh/soh/Enhancements/randomizer/draw.cpp index 4ee80d919fe..f8e5337d007 100644 --- a/soh/soh/Enhancements/randomizer/draw.cpp +++ b/soh/soh/Enhancements/randomizer/draw.cpp @@ -15,6 +15,7 @@ #include "objects/object_gi_fire/object_gi_fire.h" #include "objects/object_fish/object_fish.h" #include "objects/object_toki_objects/object_toki_objects.h" +#include "objects/object_gi_rupy/object_gi_rupy.h" #include "objects/gameplay_field_keep/gameplay_field_keep.h" #include "soh_assets.h" #include "soh/Enhancements/cosmetics/cosmeticsTypes.h" @@ -518,5 +519,25 @@ extern "C" void Randomizer_DrawFishingPoleGI(PlayState* play, GetItemEntry* getI Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); +} + +extern "C" void Randomizer_DrawSilverRupee(PlayState* play, GetItemEntry* getItemEntry) { + OPEN_DISPS(play->state.gfxCtx); + Color_RGB8 silverRupeeColor = + CVarGetColor24("gCosmetics.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); } \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/draw.h b/soh/soh/Enhancements/randomizer/draw.h index 51300f3a62b..9c3397e7d14 100644 --- a/soh/soh/Enhancements/randomizer/draw.h +++ b/soh/soh/Enhancements/randomizer/draw.h @@ -21,6 +21,7 @@ void Randomizer_DrawTriforcePieceGI(PlayState* play, GetItemEntry getItemEntry); void Randomizer_DrawOcarinaButton(PlayState* play, GetItemEntry* getItemEntry); void Randomizer_DrawBronzeScale(PlayState* play, GetItemEntry* getItemEntry); void Randomizer_DrawFishingPoleGI(PlayState* play, GetItemEntry* getItemEntry); +void Randomizer_DrawSilverRupee(PlayState* play, GetItemEntry* getItemEntry); #ifdef __cplusplus }; #endif diff --git a/soh/soh/Enhancements/randomizer/dungeon.cpp b/soh/soh/Enhancements/randomizer/dungeon.cpp index 5a4d4c42221..c15c3d2e709 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/dungeon.cpp @@ -443,6 +443,11 @@ Dungeons::Dungeons() { RC_SPIRIT_TEMPLE_GS_LOBBY, RC_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, RC_SPIRIT_TEMPLE_GS_METAL_FENCE, + RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_1, + RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_2, + RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_3, + RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_4, + RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_5, RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_1, RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_2, RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_3, diff --git a/soh/soh/Enhancements/randomizer/item_list.cpp b/soh/soh/Enhancements/randomizer/item_list.cpp index 54de0177128..5d1e5280e3f 100644 --- a/soh/soh/Enhancements/randomizer/item_list.cpp +++ b/soh/soh/Enhancements/randomizer/item_list.cpp @@ -292,20 +292,37 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_HINT] = Item(RG_HINT, Text{ "Hint", "Indice", "Hinweis" }, ITEMTYPE_EVENT, RG_HINT, false, &logic->noVariable, RHT_NONE); itemTable[RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE] = Item(RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, Text{ "Ice Cavern Spinning Blades Room Silver Rupee", "Ice Cavern Spinning Blades Room Silver Rupee", "Ice Cavern Spinning Blades Room Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_NONE, 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 Room Silver Rupee", "Ice Cavern Block Sliding Room Silver Rupee", "Ice Cavern Block Sliding Room Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_NONE, 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->noVariable, RHT_NONE, 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 Boudler Maze Silver Rupee", "GTG Boulder Maze Silver Rupee", "GTG Boulder Maze Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_NONE, 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->noVariable, RHT_NONE, 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 Toilet Room Silver Rupee", "GTG Whirlpool Room Silver Rupee", "GTG Whirlpool Room Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_NONE, 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_CHILD_GATE_SILVER_RUPEE] = Item(RG_SPIRIT_CHILD_GATE_SILVER_RUPEE, Text{ "Spirit Temple Child Gate Room Silver Rupee", "Spirit Temple Child Gate Room Silver Rupee", "Spirit Temple Child Gate Room Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_NONE, RG_SPIRIT_CHILD_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_CHILD_GATE_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); itemTable[RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE] = Item(RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, Text{ "Spirit Temple Child Block Pushing Room Silver Rupee", "Spirit Temple Child Block Pushing Room Silver Rupee", "Spirit Temple Child Block Pushing Room Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_NONE, RG_SPIRIT_CHILD_BLOCK_PUSH_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_CHILD_BLOCK_PUSH_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->noVariable, RHT_NONE, 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->noVariable, RHT_NONE, 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 Outside Falling Spikes Room Silver Rupee", "Shadow Temple Outside Falling Spikes Room Silver Rupee", "Shadow Temple Outside Falling Spikes Room Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_NONE, 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->noVariable, RHT_NONE, 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{ "Forest Trial Silver Rupee", "Forest Trial Silver Rupee", "Forest Trial Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_NONE, 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{ "Fire Trial Silver Rupee", "Fire Trial Silver Rupee", "Fire Trial Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_NONE, 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{ "Spirit Trial Silver Rupee", "Spirit Trial Silver Rupee", "Spirit Trial Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_NONE, 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{ "Light Trial Silver Rupee", "Light Trial Silver Rupee", "Light Trial Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_NONE, 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); // Individual stages of progressive items (only here for GetItemEntry purposes, not for use in seed gen) itemTable[RG_HOOKSHOT] = Item(RG_HOOKSHOT, Text{ "Hookshot", "Grappin", "Fanghaken" }, ITEMTYPE_ITEM, GI_HOOKSHOT, true, &logic->ProgressiveHookshot, RHT_HOOKSHOT, ITEM_HOOKSHOT, OBJECT_GI_HOOKSHOT, GID_HOOKSHOT, 0x36, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 5d976f086dc..86e88906bff 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -1550,6 +1550,12 @@ void Rando::StaticData::InitLocationTable() { 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, 0, 0x0, "Whirlpool Room Silver Rupee 4", "GTG Whirlpool Room Silver Rupee 4", RHT_NONE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Whirlpool Room Silver Rupee 5", "GTG Whirlpool Room Silver Rupee 5", RHT_NONE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_5)); + locationTable[RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_1] = Location::Base(RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_1, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Gate Silver Rupee 1", "Spirit Temple Child Gate Silver Rupee 1", RHT_NONE, RG_SPIRIT_CHILD_GATE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_GATE_SILVER_RUPEE_1)); + locationTable[RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_2] = Location::Base(RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_2, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Gate Silver Rupee 2", "Spirit Temple Child Gate Silver Rupee 2", RHT_NONE, RG_SPIRIT_CHILD_GATE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_GATE_SILVER_RUPEE_2)); + locationTable[RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_3] = Location::Base(RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_3, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Gate Silver Rupee 3", "Spirit Temple Child Gate Silver Rupee 3", RHT_NONE, RG_SPIRIT_CHILD_GATE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_GATE_SILVER_RUPEE_3)); + locationTable[RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_4] = Location::Base(RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_4, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Gate Silver Rupee 4", "Spirit Temple Child Gate Silver Rupee 4", RHT_NONE, RG_SPIRIT_CHILD_GATE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_GATE_SILVER_RUPEE_4)); + locationTable[RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_5] = Location::Base(RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_5, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Gate Silver Rupee 5", "Spirit Temple Child Gate Silver Rupee 5", RHT_NONE, RG_SPIRIT_CHILD_GATE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_GATE_SILVER_RUPEE_5)); + locationTable[RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_1] = Location::Base(RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_1, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Block Pushing Silver Rupee 1", "Spirit Child Block Pushing Silver Rupee 1", RHT_NONE, RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_1)); locationTable[RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_2] = Location::Base(RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_2, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Block Pushing Silver Rupee 2", "Spirit Child Block Pushing Silver Rupee 2", RHT_NONE, RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_2)); locationTable[RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_3] = Location::Base(RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_3, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Block Pushing Silver Rupee 3", "Spirit Child Block Pushing Silver Rupee 3", RHT_NONE, RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_3)); @@ -1659,7 +1665,7 @@ void Rando::StaticData::InitLocationTable() { locationTable[RC_FISHING_POLE_HINT] = Location::OtherHint(RC_FISHING_POLE_HINT,RCQUEST_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_LAKE_HYLIA, ACTOR_FISHING, SCENE_FISHING_POND, "Fishing Pole Hint","Fishing Pole Hint"); locationTable[RC_TRIFORCE_COMPLETED] = Location::Reward(RC_TRIFORCE_COMPLETED, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, 0x00, "Completed Triforce", "Completed Triforce", RHT_NONE, RG_NONE, {}, SpoilerCollectionCheck::None(), SpoilerCollectionCheckGroup::GROUP_NO_GROUP); - // clang-format on + // clang-format on } Location* Rando::StaticData::GetLocation(RandomizerCheck locKey) { diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 5a6cb1decf6..ec658a1eeed 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1,7 +1,7 @@ #pragma once #include -#include "z64item.h" +#include #include "randomizer_inf.h" #define MAX_TRICK_NAME_SIZE 50 @@ -1327,6 +1327,11 @@ typedef enum { RC_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, RC_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, RC_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, + RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_1, + RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_2, + RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_3, + RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_4, + RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_5, RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_1, RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_2, RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_3, @@ -2111,6 +2116,7 @@ typedef enum { RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, + RG_SPIRIT_CHILD_GATE_SILVER_RUPEE, RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, RG_SPIRIT_BOULDER_SILVER_RUPEE, RG_SHADOW_SCYTHE_SILVER_RUPEE, diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index d2d86b26cc7..4fe620bcc2a 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -154,7 +154,6 @@ typedef enum { RAND_INF_GREG_FOUND, - RAND_INF_TOT_MASTER_SWORD, RAND_INF_CHILD_FISHING, @@ -297,6 +296,11 @@ typedef enum { RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_3, RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_4, RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_5, + RAND_INF_SPIRIT_CHILD_GATE_SILVER_RUPEE_1, + RAND_INF_SPIRIT_CHILD_GATE_SILVER_RUPEE_2, + RAND_INF_SPIRIT_CHILD_GATE_SILVER_RUPEE_3, + RAND_INF_SPIRIT_CHILD_GATE_SILVER_RUPEE_4, + RAND_INF_SPIRIT_CHILD_GATE_SILVER_RUPEE_5, RAND_INF_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_1, RAND_INF_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_2, RAND_INF_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_3, @@ -413,7 +417,8 @@ typedef enum { RAND_INF_SHADOW_TRIAL_MQ_SILVER_RUPEE_4, RAND_INF_SHADOW_TRIAL_MQ_SILVER_RUPEE_5, - // If you add anything to this list, you need to update the size of randomizerInf in z64save.h to be ceil(RAND_INF_MAX / 16) + // If you add anything to this list, you need to update the size of randomizerInf in z64save.h to be + // ceil(RAND_INF_MAX / 16) RAND_INF_MAX, } RandomizerInf; diff --git a/soh/soh/Enhancements/randomizer/silver_rupee.cpp b/soh/soh/Enhancements/randomizer/silver_rupee.cpp index f9cc2945117..1ddfef4d2b5 100644 --- a/soh/soh/Enhancements/randomizer/silver_rupee.cpp +++ b/soh/soh/Enhancements/randomizer/silver_rupee.cpp @@ -5,6 +5,25 @@ namespace Rando { + std::unordered_map 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_CHILD_GATE_SILVER_RUPEE }, + { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, 330 }, RG_SPIRIT_CHILD_BLOCK_PUSH_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 }, + }; + std::unordered_map StaticData::silverRupeeMap = { { { SCENE_ICE_CAVERN, {414.0f, 178.0f, -579.0f} }, RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_1 }, { { SCENE_ICE_CAVERN, {389.0f, 0.0f, -382.0f } }, RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_2 }, @@ -36,6 +55,11 @@ namespace Rando { { { SCENE_GERUDO_TRAINING_GROUND, { 2453.0f, -890.0f, -1612.0f } }, RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_3 }, { { SCENE_GERUDO_TRAINING_GROUND, { 2497.0f, -605.0f, -1465.0f } }, RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_4 }, { { SCENE_GERUDO_TRAINING_GROUND, { 2308.0f, -961.0f, -1464.0f } }, RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_5 }, + { { SCENE_SPIRIT_TEMPLE, { -335.0f, 30.0f, -1409.0f } }, RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_1 }, + { { SCENE_SPIRIT_TEMPLE, { -347.0f, 229.0f, -1075.0f } }, RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_2 }, + { { SCENE_SPIRIT_TEMPLE, { -511.0f, 50.0f, -1075.0f } }, RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_3 }, + { { SCENE_SPIRIT_TEMPLE, { -672.0f, 50.0f, -1075.0f } }, RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_4 }, + { { SCENE_SPIRIT_TEMPLE, { -766.0f, 229.0f, -1075.0f } }, RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_5 }, { { SCENE_SPIRIT_TEMPLE, { -984.0f, 923.0f, -450.0f } }, RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_1 }, { { SCENE_SPIRIT_TEMPLE, { -1123.0f, 923.0f, 428.0f } }, RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_2 }, { { SCENE_SPIRIT_TEMPLE, { -1275.0f, 922.0f, -247.0f } }, RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_3 }, @@ -61,7 +85,7 @@ namespace Rando { { { SCENE_SHADOW_TEMPLE, { 2478.0f, -1343.0f, 1208.0f } }, RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_3 }, { { SCENE_SHADOW_TEMPLE, { 2940.0f, -1268.0f, 1069.0f } }, RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_4 }, { { SCENE_SHADOW_TEMPLE, { 2042.0f, -1203.0f, 849.0f } }, RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_5 }, - { { SCENE_INSIDE_GANONS_CASTLE, { 1643.0f, 164.0f, 1550.0f } }, RC_FOREST_TRIAL_SILVER_RUPEE_1 }, + { { SCENE_INSIDE_GANONS_CASTLE, { 1634.0f, 164.0f, 1550.0f } }, RC_FOREST_TRIAL_SILVER_RUPEE_1 }, { { SCENE_INSIDE_GANONS_CASTLE, { 1651.0f, 30.0f, 2021.0f } }, RC_FOREST_TRIAL_SILVER_RUPEE_2 }, { { SCENE_INSIDE_GANONS_CASTLE, { 1538.0f, 118.0f, 2225.0f } }, RC_FOREST_TRIAL_SILVER_RUPEE_3 }, { { SCENE_INSIDE_GANONS_CASTLE, { 1361.0f, 115.0f, 1222.0f } }, RC_FOREST_TRIAL_SILVER_RUPEE_4 }, @@ -91,6 +115,7 @@ namespace Rando { { RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, { "Boulder Maze in the Gerudo Training Grounds", "Boulder Maze in the Gerudo Training Grounds", "Boulder Maze in the Gerudo Training Grounds" } }, { RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, { "Lava room in the Gerudo Training Grounds", "Lava room in the Gerudo Training Grounds", "Lava room in the Gerudo Training Grounds" } }, { RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, { "Whirlpool room in the Gerudo Training Grounds", "Whirlpool room in the Gerudo Training Grounds", "Whirlpool room in the Gerudo Training Grounds" } }, + { RG_SPIRIT_CHILD_GATE_SILVER_RUPEE, { "Child-side Gate room in the Spirit Temple", "Child-side Gate room in the Spirit Temple", "Child-side Gate room in the Spirit Temple" } }, { RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, { "Child-side Block Pushing room in the Spirit Temple", "Child-side Block Pushing room in the Spirit Temple", "Child-side Block Pushing room in the Spirit Temple" } }, { RG_SPIRIT_BOULDER_SILVER_RUPEE, { "Boulder room in the Spirit Temple", "Boulder room in the Spirit Temple", "Boulder room in the Spirit Temple" } }, { RG_SHADOW_SCYTHE_SILVER_RUPEE, { "Spinning Scythes room in the Shadow Temple", "Spinning Scythes room in the Shadow Temple", "Spinning Scythes room in the Shadow Temple" } }, @@ -157,6 +182,16 @@ namespace Rando { return messageEntry; } + size_t SilverRupees::GetInfoListSize() { + return mSilverRupees.size(); + } + + void SilverRupees::ResetAll() { + for (auto& silverRupee : mSilverRupees) { + silverRupee.Reset(); + } + } + SilverRupeesInfo &SilverRupees::GetInfo(RandomizerGet rgid) { return mSilverRupees[rgid - RG_SILVER_RUPEE_FIRST]; } @@ -180,4 +215,7 @@ namespace Rando { void SilverRupeesInfo::IncrementCollected(uint8_t amount) { mCollected += amount; } -} // Rando \ No newline at end of file + void SilverRupeesInfo::Reset() { + mCollected = 0; + } + } // namespace Rando \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/silver_rupee.h b/soh/soh/Enhancements/randomizer/silver_rupee.h index c1facb07159..1b73aaa4981 100644 --- a/soh/soh/Enhancements/randomizer/silver_rupee.h +++ b/soh/soh/Enhancements/randomizer/silver_rupee.h @@ -17,6 +17,7 @@ namespace Rando { uint8_t GetCollected() const; uint8_t GetTotal() const; void IncrementCollected(uint8_t amount = 1); + void Reset(); private: uint8_t mCollected = 0; uint8_t mTotal; @@ -29,6 +30,8 @@ namespace Rando { SilverRupees(); SilverRupeesInfo& GetInfo(RandomizerGet rgid); + size_t GetInfoListSize(); + void ResetAll(); static CustomMessage GetSilverRupeeMessage(u16 rgid); private: std::array mSilverRupees; diff --git a/soh/soh/Enhancements/randomizer/static_data.h b/soh/soh/Enhancements/randomizer/static_data.h index be8aaa1ff39..6604e992317 100644 --- a/soh/soh/Enhancements/randomizer/static_data.h +++ b/soh/soh/Enhancements/randomizer/static_data.h @@ -11,6 +11,12 @@ struct Position{ SceneID scene; Vec3f pos; }; + +struct Identifier { + SceneID scene; + RandomizerCheckQuest quest; + int16_t params; +}; /** * @brief Singleton for storing and accessing static Randomizer-related data * @@ -42,6 +48,7 @@ class StaticData { static std::array, 17> randomizerFishingPondFish; static std::unordered_map randomizerGrottoFishMap; static std::unordered_map silverRupeeMap; + static std::unordered_map silverTrackerMap; StaticData(); ~StaticData(); }; @@ -55,10 +62,24 @@ 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::Position& a, const Rando::Position& b) const { return a.scene == b.scene && a.pos.x == b.pos.x && a.pos.y == b.pos.y && a.pos.z == b.pos.z; } }; + + 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; + } + }; } \ No newline at end of file diff --git a/soh/soh/SaveManager.cpp b/soh/soh/SaveManager.cpp index daae87146c7..078f5406c49 100644 --- a/soh/soh/SaveManager.cpp +++ b/soh/soh/SaveManager.cpp @@ -428,6 +428,13 @@ void SaveManager::LoadRandomizerVersion3() { SaveManager::Instance->LoadData("", trialId); randoContext->GetTrial(trialId)->SetAsRequired(); }); + + randoContext->GetSilverRupees()->ResetAll(); + SaveManager::Instance->LoadArray("silverRupees", randoContext->GetSilverRupees()->GetInfoListSize(), [&](size_t i) { + size_t value; + SaveManager::Instance->LoadData("", value); + randoContext->GetSilverRupees()->GetInfo(static_cast(i + RG_SILVER_RUPEE_FIRST)).IncrementCollected(value); + }); } void SaveManager::SaveRandomizer(SaveContext* saveContext, int sectionID, bool fullSave) { @@ -511,6 +518,10 @@ void SaveManager::SaveRandomizer(SaveContext* saveContext, int sectionID, bool f SaveManager::Instance->SaveData("", i); } }); + + SaveManager::Instance->SaveArray("silverRupees", randoContext->GetSilverRupees()->GetInfoListSize(), [&](size_t i) { + SaveManager::Instance->SaveData("", randoContext->GetSilverRupees()->GetInfo(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 class initialization stuff here From 6e01572e13b5d1f9e17627ec43895ad6ce386386 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sat, 24 Feb 2024 14:21:28 -0500 Subject: [PATCH 013/108] Add hint text for vanilla silver rupees. --- .../hint_list/hint_list_exclude_dungeon.cpp | 74 +++++++ .../3drando/hint_list/hint_list_item.cpp | 67 ++++++ soh/soh/Enhancements/randomizer/item_list.cpp | 32 +-- .../Enhancements/randomizer/location_list.cpp | 190 +++++++++--------- .../Enhancements/randomizer/randomizerTypes.h | 24 +++ 5 files changed, 276 insertions(+), 111 deletions(-) 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 934a8f56c82..66bf3120a9a 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 @@ -1151,6 +1151,21 @@ void HintTable_Init_Exclude_Dungeon() { Text{"#upon a web of glass# in the Spirit Temple sits a spider holding", /*french*/"une #Skulltula sur une paroi de verre du Temple de l'Esprit# a", /*spanish*/"#sobre una plataforma de cristal# yace una Skulltula que otorga"}, }); + //TODO: Translate + hintTable[RHT_SPIRIT_CHILD_GATE_SILVER_RUPEE] = HintText::Exclude({ + //obscure text + Text{"a #gate# in the Spirit Temple guards"} + }); + hintTable[RHT_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE] = HintText::Exclude({ + //obscure text + Text{"#Beamos and blocks# in the Spirit Temple guard"} + }); + hintTable[RHT_SPIRIT_BOULDER_SILVER_RUPEE] = HintText::Exclude({ + //obscure text + Text{"#rolling rocks# in the Spirit Temple guard"} + }); + //TODO: End Translation + /*-------------------------- | SHADOW TEMPLE | ---------------------------*/ @@ -1392,6 +1407,21 @@ void HintTable_Init_Exclude_Dungeon() { Text{"a #suspended spider# guards", /*french*/"une #Skulltula près du repère du Temple de l'Ombre# a", /*spanish*/"una #Skulltula flotante# del Templo de las Sombras otorga"}, }); + //TODO: Translate + hintTable[RHT_SHADOW_SPINNING_SCYTHE_SILVER_RUPEE] = HintText::Exclude({ + //obscure text + Text{"a #spinning scythe# guards"} + }); + + hintTable[RHT_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE] = HintText::Exclude({ + //obscure text + Text{"a #Beamos and Spike Trap# in the Shadow Temple guard"} + }); + hintTable[RHT_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE] = HintText::Exclude({ + //obscure text + Text{"#invisible spikes# guard"} + }); + /*-------------------------- | BOTTOM OF THE WELL | ---------------------------*/ @@ -1511,6 +1541,11 @@ void HintTable_Init_Exclude_Dungeon() { //obscure text Text{"a #spider locked in a crypt# within the well guards", /*french*/"une #Skulltula embarrée dans la crypte au fonds du Puits# a", /*spanish*/"una #Skulltula encerrada en una cripta# del pozo otorga"}, }); + + hintTable[RHT_BOTTOM_OF_THE_WELL_SILVER_RUPEE] = HintText::Exclude({ + //obscure text + Text{"#Redeads in a well# guard"} + }); /*-------------------------- | ICE CAVERN | @@ -1587,6 +1622,12 @@ void HintTable_Init_Exclude_Dungeon() { Text{"a #spider in fiery ice# hoards", /*french*/"une #Skulltula figée dans la glace rouge# a", /*spanish*/"una #Skulltula tras un ardiente hielo# otorga"}, }); + // TODO: Translate + hintTable[RHT_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE] = HintText::Exclude({ + // obscure text + Text{"#spinning ice# guards"} + }); + /*-------------------------- | GERUDO TRAINING GROUNDS | ---------------------------*/ @@ -1766,6 +1807,21 @@ void HintTable_Init_Exclude_Dungeon() { Text{"a #feat of strength# rewards thieves with", /*french*/"#derrière un bloc argent# dans le Gymnase Gerudo gît", /*spanish*/"una #hazaña de fuerza# premia a las bandidas con"}, }); + // TODO: Translate + hintTable[RHT_GERUDO_TRAINING_GROUND_BOULDER_SILVER_RUPEE] = HintText::Exclude({ + //obscure text + Text{"a #boulder maze# in the Gerudo Training Grounds guards"} + }); + hintTable[RHT_GERUDO_TRAINING_GROUND_LAVA_SILVER_RUPEE] = HintText::Exclude({ + //obscure text + Text{"a #fiery trial# in the Gerudo Training Grounds guards"} + }); + hintTable[RHT_GERUDO_TRAINING_GROUND_TOILET_SILVER_RUPEE] = HintText::Exclude({ + //obscure text + Text{"a #swirly trial# in the Gerudo Training Grounds guards"} + }); + //TODO: End Translation + /*-------------------------- | GANONS CASTLE | ---------------------------*/ @@ -1961,4 +2017,22 @@ void HintTable_Init_Exclude_Dungeon() { //obscure text Text{"#scrubs in Ganon's Castle# sell", /*french*/"les #pestes Mojo dans le Château de Ganon# vendent", /*spanish*/"los #dekus del Castillo de Ganon# venden"}, }); + + hintTable[RHT_FOREST_TRIAL_SILVER_RUPEE] = HintText::Exclude({ + //obscure text + Text{"the #test of the wilds# holds", /*french*/"l'#épreuve des bois# contient", /*spanish*/"la #prueba de la naturaleza# brinda"}, + }); + //TODO: Translate + hintTable[RHT_FIRE_TRIAL_SILVER_RUPEE] = HintText::Exclude({ + //obscure text + Text{"the #test of flames# holds"} + }); + hintTable[RHT_SPIRIT_TRIAL_SILVER_RUPEE] = HintText::Exclude({ + //obscure text + Text{"the #test of the sands# holds", /*french*/"l'#épreuve des sables# contient", /*spanish*/"la #prueba de las arenas# brinda"} + }); + hintTable[RHT_LIGHT_TRIAL_SILVER_RUPEE] = HintText::Exclude({ + //obscure text + Text{"the #test of radiance# holds", /*french*/"l'#épreuve du ciel# contient", /*spanish*/"la #prueba del resplandor# brinda"} + }); } 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 be20b95a3cd..4cd6992ffb5 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 @@ -2113,6 +2113,73 @@ void HintTable_Init_Item() { Text{"a fishing pole", /*french*/"canne à pêche", /*spanish*/"caña de pescar"} ); + // TODO: Translations + hintTable[RHT_ICE_CAVERN_SILVER_RUPEE] = HintText::Item({ + //obscure text + Text{"cold unlocking currency"}, + }, { + //ambiguous text + Text{"a Silver Rupee"}, + }, + Text{"an Ice Cavern Silver Rupee"} + ); + + hintTable[RHT_BOTTOM_OF_THE_WELL_SILVER_RUPEE] = HintText::Item( + { + // obscure text + Text{ "damp unlocking currency" }, + }, + { + // ambiguous text + Text{ "a Silver Rupee" }, + }, + Text{ "a Bottom of the Well Silver Rupee" }); + + hintTable[RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE] = HintText::Item( + { + // obscure text + Text{ "stolen unlocking currency" }, + }, + { + // ambiguous text + Text{ "a Silver Rupee" }, + }, + Text{ "a Gerudo Training Grounds Silver Rupee" }); + + hintTable[RHT_SPIRIT_TEMPLE_SILVER_RUPEE] = HintText::Item( + { + // obscure text + Text{ "spiritual unlocking currency" }, + }, + { + // ambiguous text + Text{ "a Silver Rupee" }, + }, + Text{ "a Spirit Temple Silver Rupee" }); + + hintTable[RHT_SHADOW_TEMPLE_SILVER_RUPEE] = HintText::Item( + { + // obscure text + Text{ "dark unlocking currency" }, + }, + { + // ambiguous text + Text{ "a Silver Rupee" }, + }, + Text{ "a Shadow Temple Silver Rupee" }); + + hintTable[RHT_GANONS_CASTLE_SILVER_RUPEE] = HintText::Item( + { + // obscure text + Text{ "evil unlocking currency" }, + }, + { + // ambiguous text + Text{ "a Silver Rupee" }, + }, + Text{ "a Ganon's Castle Silver Rupee" }); + // TODO: End Translation + hintTable[RHT_EPONA] = HintText::Item({ //obscure text Text{"a horse", /*french*/"un fidèle destrier", /*spanish*/"una yegua"}, diff --git a/soh/soh/Enhancements/randomizer/item_list.cpp b/soh/soh/Enhancements/randomizer/item_list.cpp index 5d1e5280e3f..b368b947acd 100644 --- a/soh/soh/Enhancements/randomizer/item_list.cpp +++ b/soh/soh/Enhancements/randomizer/item_list.cpp @@ -291,37 +291,37 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_TRIFORCE] = Item(RG_TRIFORCE, Text{ "Triforce", "Triforce", "Triforce" }, ITEMTYPE_EVENT, RG_TRIFORCE, false, &logic->noVariable, RHT_NONE); itemTable[RG_HINT] = Item(RG_HINT, Text{ "Hint", "Indice", "Hinweis" }, ITEMTYPE_EVENT, RG_HINT, false, &logic->noVariable, RHT_NONE); - itemTable[RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE] = Item(RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, Text{ "Ice Cavern Spinning Blades Room Silver Rupee", "Ice Cavern Spinning Blades Room Silver Rupee", "Ice Cavern Spinning Blades Room Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_NONE, 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] = Item(RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, Text{ "Ice Cavern Spinning Blades Room Silver Rupee", "Ice Cavern Spinning Blades Room Silver Rupee", "Ice Cavern Spinning Blades Room Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_ICE_CAVERN_SPINNING_BLADES_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 Room Silver Rupee", "Ice Cavern Block Sliding Room Silver Rupee", "Ice Cavern Block Sliding Room Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_NONE, 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] = Item(RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, Text{ "Ice Cavern Block Sliding Room Silver Rupee", "Ice Cavern Block Sliding Room Silver Rupee", "Ice Cavern Block Sliding Room Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_ICE_CAVERN_SLIDING_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->noVariable, RHT_NONE, 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] = Item(RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, Text{ "BotW Silver Rupee", "BotW Silver Rupee", "BotW Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, 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 Boudler Maze Silver Rupee", "GTG Boulder Maze Silver Rupee", "GTG Boulder Maze Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_NONE, 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] = Item(RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, Text{ "GTG Boudler Maze Silver Rupee", "GTG Boulder Maze Silver Rupee", "GTG Boulder Maze Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_GERUDO_TRAINING_GROUND_BOULDER_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->noVariable, RHT_NONE, 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] = 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->noVariable, RHT_GERUDO_TRAINING_GROUND_LAVA_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 Toilet Room Silver Rupee", "GTG Whirlpool Room Silver Rupee", "GTG Whirlpool Room Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_NONE, 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] = Item(RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, Text{ "GTG Toilet Room Silver Rupee", "GTG Whirlpool Room Silver Rupee", "GTG Whirlpool Room Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_GERUDO_TRAINING_GROUND_TOILET_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_CHILD_GATE_SILVER_RUPEE] = Item(RG_SPIRIT_CHILD_GATE_SILVER_RUPEE, Text{ "Spirit Temple Child Gate Room Silver Rupee", "Spirit Temple Child Gate Room Silver Rupee", "Spirit Temple Child Gate Room Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_NONE, RG_SPIRIT_CHILD_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_CHILD_GATE_SILVER_RUPEE] = Item(RG_SPIRIT_CHILD_GATE_SILVER_RUPEE, Text{ "Spirit Temple Child Gate Room Silver Rupee", "Spirit Temple Child Gate Room Silver Rupee", "Spirit Temple Child Gate Room Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_SPIRIT_CHILD_GATE_SILVER_RUPEE, RG_SPIRIT_CHILD_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_CHILD_GATE_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); - itemTable[RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE] = Item(RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, Text{ "Spirit Temple Child Block Pushing Room Silver Rupee", "Spirit Temple Child Block Pushing Room Silver Rupee", "Spirit Temple Child Block Pushing Room Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_NONE, RG_SPIRIT_CHILD_BLOCK_PUSH_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_CHILD_BLOCK_PUSH_SILVER_RUPEE] = Item(RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, Text{ "Spirit Temple Child Block Pushing Room Silver Rupee", "Spirit Temple Child Block Pushing Room Silver Rupee", "Spirit Temple Child Block Pushing Room Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, RG_SPIRIT_CHILD_BLOCK_PUSH_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_CHILD_BLOCK_PUSH_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->noVariable, RHT_NONE, 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] = 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->noVariable, RHT_SPIRIT_BOULDER_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->noVariable, RHT_NONE, 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] = 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->noVariable, RHT_SHADOW_SPINNING_SCYTHE_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 Outside Falling Spikes Room Silver Rupee", "Shadow Temple Outside Falling Spikes Room Silver Rupee", "Shadow Temple Outside Falling Spikes Room Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_NONE, 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] = Item(RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, Text{ "Shadow Temple Outside Falling Spikes Room Silver Rupee", "Shadow Temple Outside Falling Spikes Room Silver Rupee", "Shadow Temple Outside Falling Spikes Room Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_SHADOW_OUTSIDE_SPIKE_RAIN_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->noVariable, RHT_NONE, 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] = 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->noVariable, RHT_SHADOW_INVISIBLE_SPIKES_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{ "Forest Trial Silver Rupee", "Forest Trial Silver Rupee", "Forest Trial Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_NONE, 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] = Item(RG_FOREST_TRIAL_SILVER_RUPEE, Text{ "Forest Trial Silver Rupee", "Forest Trial Silver Rupee", "Forest Trial Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_FOREST_TRIAL_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{ "Fire Trial Silver Rupee", "Fire Trial Silver Rupee", "Fire Trial Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_NONE, 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] = Item(RG_FIRE_TRIAL_SILVER_RUPEE, Text{ "Fire Trial Silver Rupee", "Fire Trial Silver Rupee", "Fire Trial Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_FIRE_TRIAL_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{ "Spirit Trial Silver Rupee", "Spirit Trial Silver Rupee", "Spirit Trial Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_NONE, 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] = Item(RG_SPIRIT_TRIAL_SILVER_RUPEE, Text{ "Spirit Trial Silver Rupee", "Spirit Trial Silver Rupee", "Spirit Trial Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_SPIRIT_TRIAL_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{ "Light Trial Silver Rupee", "Light Trial Silver Rupee", "Light Trial Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_NONE, 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] = Item(RG_LIGHT_TRIAL_SILVER_RUPEE, Text{ "Light Trial Silver Rupee", "Light Trial Silver Rupee", "Light Trial Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_LIGHT_TRIAL_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); // Individual stages of progressive items (only here for GetItemEntry purposes, not for use in seed gen) diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 86e88906bff..115271efa38 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -1514,101 +1514,101 @@ void Rando::StaticData::InitLocationTable() { locationTable[RC_ZD_FISH_5] = Location::Base(RC_ZD_FISH_5, RCQUEST_BOTH, RCTYPE_FISH, RCAREA_ZORAS_DOMAIN, ACTOR_EN_FISH, SCENE_ZORAS_DOMAIN, -1 ^ 4, 0x00, "Fish 5", "ZD Fish 5", RHT_ZD_FISH, RG_FISH, { Category::cFish }, SpoilerCollectionCheck::Fish(0xFF, SCENE_ZORAS_DOMAIN), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); // Silver Rupees - 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,0, 0x0, "Spinning Blades Silver Rupee 1", "Ice Cavern Spinning Blades Silver Rupee 1", RHT_NONE, RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Spinning Blades Silver Rupee 2", "Ice Cavern Spinning Blades Silver Rupee 2", RHT_NONE, RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Spinning Blades Silver Rupee 3", "Ice Cavern Spinning Blades Silver Rupee 3", RHT_NONE, RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Spinning Blades Silver Rupee 4", "Ice Cavern Spinning Blades Silver Rupee 4", RHT_NONE, RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Spinning Blades Silver Rupee 5", "Ice Cavern Spinning Blades Silver Rupee 5", RHT_NONE, RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Sliding Puzzle Silver Rupee 1", "Ice Cavern Sliding Puzzle Silver Rupee 1", RHT_NONE, RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Sliding Puzzle Silver Rupee 2", "Ice Cavern Sliding Puzzle Silver Rupee 2", RHT_NONE, RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Sliding Puzzle Silver Rupee 3", "Ice Cavern Sliding Puzzle Silver Rupee 3", RHT_NONE, RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Sliding Puzzle Silver Rupee 4", "Ice Cavern Sliding Puzzle Silver Rupee 4", RHT_NONE, RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Sliding Puzzle Silver Rupee 5", "Ice Cavern Sliding Puzzle Silver Rupee 5", RHT_NONE, RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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, 0, 0x0, "Bottom of the Well Basement Silver Rupee 1", "Bottom of the Well Basement Silver Rupee 1", RHT_NONE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_BOTTOM_OF_THE_WELL, 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, 0, 0x0, "Bottom of the Well Basement Silver Rupee 2", "Bottom of the Well Basement Silver Rupee 2", RHT_NONE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_BOTTOM_OF_THE_WELL, 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, 0, 0x0, "Bottom of the Well Basement Silver Rupee 3", "Bottom of the Well Basement Silver Rupee 3", RHT_NONE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_BOTTOM_OF_THE_WELL, 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, 0, 0x0, "Bottom of the Well Basement Silver Rupee 4", "Bottom of the Well Basement Silver Rupee 4", RHT_NONE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_BOTTOM_OF_THE_WELL, 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, 0, 0x0, "Bottom of the Well Basement Silver Rupee 5", "Bottom of the Well Basement Silver Rupee 5", RHT_NONE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_BOTTOM_OF_THE_WELL, 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, 0, 0x0, "Boulder Maze Silver Rupee 1", "GTG Boulder Maze Silver Rupee 1", RHT_NONE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Boulder Maze Silver Rupee 2", "GTG Boulder Maze Silver Rupee 2", RHT_NONE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Boulder Maze Silver Rupee 3", "GTG Boulder Maze Silver Rupee 3", RHT_NONE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Boulder Maze Silver Rupee 4", "GTG Boulder Maze Silver Rupee 4", RHT_NONE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Boulder Maze Silver Rupee 5", "GTG Boulder Maze Silver Rupee 5", RHT_NONE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Lava Room Silver Rupee 1", "GTG Lava Room Silver Rupee 1", RHT_NONE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Lava Room Silver Rupee 2", "GTG Lava Room Silver Rupee 2", RHT_NONE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Lava Room Silver Rupee 3", "GTG Lava Room Silver Rupee 3", RHT_NONE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Lava Room Silver Rupee 4", "GTG Lava Room Silver Rupee 4", RHT_NONE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Lava Room Silver Rupee 5", "GTG Lava Room Silver Rupee 5", RHT_NONE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Whirlpool Room Silver Rupee 1", "GTG Whirlpool Room Silver Rupee 1", RHT_NONE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Whirlpool Room Silver Rupee 2", "GTG Whirlpool Room Silver Rupee 2", RHT_NONE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Whirlpool Room Silver Rupee 3", "GTG Whirlpool Room Silver Rupee 3", RHT_NONE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Whirlpool Room Silver Rupee 4", "GTG Whirlpool Room Silver Rupee 4", RHT_NONE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Whirlpool Room Silver Rupee 5", "GTG Whirlpool Room Silver Rupee 5", RHT_NONE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_5)); - - locationTable[RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_1] = Location::Base(RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_1, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Gate Silver Rupee 1", "Spirit Temple Child Gate Silver Rupee 1", RHT_NONE, RG_SPIRIT_CHILD_GATE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_GATE_SILVER_RUPEE_1)); - locationTable[RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_2] = Location::Base(RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_2, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Gate Silver Rupee 2", "Spirit Temple Child Gate Silver Rupee 2", RHT_NONE, RG_SPIRIT_CHILD_GATE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_GATE_SILVER_RUPEE_2)); - locationTable[RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_3] = Location::Base(RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_3, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Gate Silver Rupee 3", "Spirit Temple Child Gate Silver Rupee 3", RHT_NONE, RG_SPIRIT_CHILD_GATE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_GATE_SILVER_RUPEE_3)); - locationTable[RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_4] = Location::Base(RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_4, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Gate Silver Rupee 4", "Spirit Temple Child Gate Silver Rupee 4", RHT_NONE, RG_SPIRIT_CHILD_GATE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_GATE_SILVER_RUPEE_4)); - locationTable[RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_5] = Location::Base(RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_5, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Gate Silver Rupee 5", "Spirit Temple Child Gate Silver Rupee 5", RHT_NONE, RG_SPIRIT_CHILD_GATE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_GATE_SILVER_RUPEE_5)); - - locationTable[RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_1] = Location::Base(RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_1, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Block Pushing Silver Rupee 1", "Spirit Child Block Pushing Silver Rupee 1", RHT_NONE, RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_1)); - locationTable[RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_2] = Location::Base(RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_2, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Block Pushing Silver Rupee 2", "Spirit Child Block Pushing Silver Rupee 2", RHT_NONE, RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_2)); - locationTable[RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_3] = Location::Base(RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_3, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Block Pushing Silver Rupee 3", "Spirit Child Block Pushing Silver Rupee 3", RHT_NONE, RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_3)); - locationTable[RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_4] = Location::Base(RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_4, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Block Pushing Silver Rupee 4", "Spirit Child Block Pushing Silver Rupee 4", RHT_NONE, RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_4)); - locationTable[RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_5] = Location::Base(RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_5, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Block Pushing Silver Rupee 5", "Spirit Child Block Pushing Silver Rupee 5", RHT_NONE, RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_BLOCK_PUSH_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, 0, 0x0, "Boulder Room Silver Rupee 1", "Spirit Boulder Room Silver Rupee 1", RHT_NONE, RG_SPIRIT_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Boulder Room Silver Rupee 2", "Spirit Boulder Room Silver Rupee 2", RHT_NONE, RG_SPIRIT_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Boulder Room Silver Rupee 3", "Spirit Boulder Room Silver Rupee 3", RHT_NONE, RG_SPIRIT_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Boulder Room Silver Rupee 4", "Spirit Boulder Room Silver Rupee 4", RHT_NONE, RG_SPIRIT_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Boulder Room Silver Rupee 5", "Spirit Boulder Room Silver Rupee 5", RHT_NONE, RG_SPIRIT_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Spinning Scythe Silver Rupee 1", "Shadow Spinning Scythe Silver Rupee 1", RHT_NONE, RG_SHADOW_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Spinning Scythe Silver Rupee 2", "Shadow Spinning Scythe Silver Rupee 2", RHT_NONE, RG_SHADOW_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Spinning Scythe Silver Rupee 3", "Shadow Spinning Scythe Silver Rupee 3", RHT_NONE, RG_SHADOW_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Spinning Scythe Silver Rupee 4", "Shadow Spinning Scythe Silver Rupee 4", RHT_NONE, RG_SHADOW_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Spinning Scythe Silver Rupee 5", "Shadow Spinning Scythe Silver Rupee 5", RHT_NONE, RG_SHADOW_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Outside Spike Rain Room Silver Rupee 1", "Shadow Outside Spike Rain Room Silver Rupee 1", RHT_NONE, RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Outside Spike Rain Room Silver Rupee 2", "Shadow Outside Spike Rain Room Silver Rupee 2", RHT_NONE, RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Outside Spike Rain Room Silver Rupee 3", "Shadow Outside Spike Rain Room Silver Rupee 3", RHT_NONE, RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Outside Spike Rain Room Silver Rupee 4", "Shadow Outside Spike Rain Room Silver Rupee 4", RHT_NONE, RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Outside Spike Rain Room Silver Rupee 5", "Shadow Outside Spike Rain Room Silver Rupee 5", RHT_NONE, RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Room Silver Rupee 1", "Shadow Invisible Spikes Room Silver Rupee 1", RHT_NONE, RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Room Silver Rupee 2", "Shadow Invisible Spikes Room Silver Rupee 2", RHT_NONE, RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Room Silver Rupee 3", "Shadow Invisible Spikes Room Silver Rupee 3", RHT_NONE, RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Room Silver Rupee 4", "Shadow Invisible Spikes Room Silver Rupee 4", RHT_NONE, RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Room Silver Rupee 5", "Shadow Invisible Spikes Room Silver Rupee 5", RHT_NONE, RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Forest Trial Silver Rupee 1", "Inside Ganon's Castle Forest Trial Silver Rupee 1", RHT_NONE, RG_FOREST_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Forest Trial Silver Rupee 2", "Inside Ganon's Castle Forest Trial Silver Rupee 2", RHT_NONE, RG_FOREST_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Forest Trial Silver Rupee 3", "Inside Ganon's Castle Forest Trial Silver Rupee 3", RHT_NONE, RG_FOREST_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Forest Trial Silver Rupee 4", "Inside Ganon's Castle Forest Trial Silver Rupee 4", RHT_NONE, RG_FOREST_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Forest Trial Silver Rupee 5", "Inside Ganon's Castle Forest Trial Silver Rupee 5", RHT_NONE, RG_FOREST_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Fire Trial Silver Rupee 1", "Inside Ganon's Castle Fire Trial Silver Rupee 1", RHT_NONE, RG_FIRE_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Fire Trial Silver Rupee 2", "Inside Ganon's Castle Fire Trial Silver Rupee 2", RHT_NONE, RG_FIRE_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Fire Trial Silver Rupee 3", "Inside Ganon's Castle Fire Trial Silver Rupee 3", RHT_NONE, RG_FIRE_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Fire Trial Silver Rupee 4", "Inside Ganon's Castle Fire Trial Silver Rupee 4", RHT_NONE, RG_FIRE_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Fire Trial Silver Rupee 5", "Inside Ganon's Castle Fire Trial Silver Rupee 5", RHT_NONE, RG_FIRE_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Spirit Trial Silver Rupee 1", "Inside Ganon's Castle Spirit Trial Silver Rupee 1", RHT_NONE, RG_SPIRIT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Spirit Trial Silver Rupee 2", "Inside Ganon's Castle Spirit Trial Silver Rupee 2", RHT_NONE, RG_SPIRIT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Spirit Trial Silver Rupee 3", "Inside Ganon's Castle Spirit Trial Silver Rupee 3", RHT_NONE, RG_SPIRIT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Spirit Trial Silver Rupee 4", "Inside Ganon's Castle Spirit Trial Silver Rupee 4", RHT_NONE, RG_SPIRIT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Spirit Trial Silver Rupee 5", "Inside Ganon's Castle Spirit Trial Silver Rupee 5", RHT_NONE, RG_SPIRIT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Light Trial Silver Rupee 1", "Inside Ganon's Castle Light Trial Silver Rupee 1", RHT_NONE, RG_LIGHT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Light Trial Silver Rupee 2", "Inside Ganon's Castle Light Trial Silver Rupee 2", RHT_NONE, RG_LIGHT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Light Trial Silver Rupee 3", "Inside Ganon's Castle Light Trial Silver Rupee 3", RHT_NONE, RG_LIGHT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Light Trial Silver Rupee 4", "Inside Ganon's Castle Light Trial Silver Rupee 4", RHT_NONE, RG_LIGHT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Light Trial Silver Rupee 5", "Inside Ganon's Castle Light Trial Silver Rupee 5", RHT_NONE, RG_LIGHT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, RAND_INF_LIGHT_TRIAL_SILVER_RUPEE_5)); + 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,0, 0x0, "Spinning Blades Silver Rupee 1", "Ice Cavern Spinning Blades Silver Rupee 1", RHT_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Spinning Blades Silver Rupee 2", "Ice Cavern Spinning Blades Silver Rupee 2", RHT_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Spinning Blades Silver Rupee 3", "Ice Cavern Spinning Blades Silver Rupee 3", RHT_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Spinning Blades Silver Rupee 4", "Ice Cavern Spinning Blades Silver Rupee 4", RHT_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Spinning Blades Silver Rupee 5", "Ice Cavern Spinning Blades Silver Rupee 5", RHT_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Sliding Puzzle Silver Rupee 1", "Ice Cavern Sliding Puzzle Silver Rupee 1", RHT_ICE_CAVERN_SLIDING_SILVER_RUPEE, RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Sliding Puzzle Silver Rupee 2", "Ice Cavern Sliding Puzzle Silver Rupee 2", RHT_ICE_CAVERN_SLIDING_SILVER_RUPEE, RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Sliding Puzzle Silver Rupee 3", "Ice Cavern Sliding Puzzle Silver Rupee 3", RHT_ICE_CAVERN_SLIDING_SILVER_RUPEE, RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Sliding Puzzle Silver Rupee 4", "Ice Cavern Sliding Puzzle Silver Rupee 4", RHT_ICE_CAVERN_SLIDING_SILVER_RUPEE, RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Sliding Puzzle Silver Rupee 5", "Ice Cavern Sliding Puzzle Silver Rupee 5", RHT_ICE_CAVERN_SLIDING_SILVER_RUPEE, RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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, 0, 0x0, "Bottom of the Well Basement Silver Rupee 1", "Bottom of the Well Basement Silver Rupee 1", RHT_BOTTOM_OF_THE_WELL_SILVER_RUPEE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_BOTTOM_OF_THE_WELL, 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, 0, 0x0, "Bottom of the Well Basement Silver Rupee 2", "Bottom of the Well Basement Silver Rupee 2", RHT_BOTTOM_OF_THE_WELL_SILVER_RUPEE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_BOTTOM_OF_THE_WELL, 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, 0, 0x0, "Bottom of the Well Basement Silver Rupee 3", "Bottom of the Well Basement Silver Rupee 3", RHT_BOTTOM_OF_THE_WELL_SILVER_RUPEE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_BOTTOM_OF_THE_WELL, 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, 0, 0x0, "Bottom of the Well Basement Silver Rupee 4", "Bottom of the Well Basement Silver Rupee 4", RHT_BOTTOM_OF_THE_WELL_SILVER_RUPEE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_BOTTOM_OF_THE_WELL, 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, 0, 0x0, "Bottom of the Well Basement Silver Rupee 5", "Bottom of the Well Basement Silver Rupee 5", RHT_BOTTOM_OF_THE_WELL_SILVER_RUPEE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_BOTTOM_OF_THE_WELL, 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, 0, 0x0, "Boulder Maze Silver Rupee 1", "GTG Boulder Maze Silver Rupee 1", RHT_GERUDO_TRAINING_GROUND_BOULDER_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Boulder Maze Silver Rupee 2", "GTG Boulder Maze Silver Rupee 2", RHT_GERUDO_TRAINING_GROUND_BOULDER_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Boulder Maze Silver Rupee 3", "GTG Boulder Maze Silver Rupee 3", RHT_GERUDO_TRAINING_GROUND_BOULDER_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Boulder Maze Silver Rupee 4", "GTG Boulder Maze Silver Rupee 4", RHT_GERUDO_TRAINING_GROUND_BOULDER_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Boulder Maze Silver Rupee 5", "GTG Boulder Maze Silver Rupee 5", RHT_GERUDO_TRAINING_GROUND_BOULDER_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Lava Room Silver Rupee 1", "GTG Lava Room Silver Rupee 1", RHT_GERUDO_TRAINING_GROUND_LAVA_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Lava Room Silver Rupee 2", "GTG Lava Room Silver Rupee 2", RHT_GERUDO_TRAINING_GROUND_LAVA_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Lava Room Silver Rupee 3", "GTG Lava Room Silver Rupee 3", RHT_GERUDO_TRAINING_GROUND_LAVA_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Lava Room Silver Rupee 4", "GTG Lava Room Silver Rupee 4", RHT_GERUDO_TRAINING_GROUND_LAVA_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Lava Room Silver Rupee 5", "GTG Lava Room Silver Rupee 5", RHT_GERUDO_TRAINING_GROUND_LAVA_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Whirlpool Room Silver Rupee 1", "GTG Whirlpool Room Silver Rupee 1", RHT_GERUDO_TRAINING_GROUND_TOILET_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Whirlpool Room Silver Rupee 2", "GTG Whirlpool Room Silver Rupee 2", RHT_GERUDO_TRAINING_GROUND_TOILET_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Whirlpool Room Silver Rupee 3", "GTG Whirlpool Room Silver Rupee 3", RHT_GERUDO_TRAINING_GROUND_TOILET_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Whirlpool Room Silver Rupee 4", "GTG Whirlpool Room Silver Rupee 4", RHT_GERUDO_TRAINING_GROUND_TOILET_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Whirlpool Room Silver Rupee 5", "GTG Whirlpool Room Silver Rupee 5", RHT_GERUDO_TRAINING_GROUND_TOILET_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_5)); + + locationTable[RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_1] = Location::Base(RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_1, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Gate Silver Rupee 1", "Spirit Temple Child Gate Silver Rupee 1", RHT_SPIRIT_CHILD_GATE_SILVER_RUPEE, RG_SPIRIT_CHILD_GATE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_GATE_SILVER_RUPEE_1)); + locationTable[RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_2] = Location::Base(RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_2, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Gate Silver Rupee 2", "Spirit Temple Child Gate Silver Rupee 2", RHT_SPIRIT_CHILD_GATE_SILVER_RUPEE, RG_SPIRIT_CHILD_GATE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_GATE_SILVER_RUPEE_2)); + locationTable[RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_3] = Location::Base(RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_3, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Gate Silver Rupee 3", "Spirit Temple Child Gate Silver Rupee 3", RHT_SPIRIT_CHILD_GATE_SILVER_RUPEE, RG_SPIRIT_CHILD_GATE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_GATE_SILVER_RUPEE_3)); + locationTable[RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_4] = Location::Base(RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_4, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Gate Silver Rupee 4", "Spirit Temple Child Gate Silver Rupee 4", RHT_SPIRIT_CHILD_GATE_SILVER_RUPEE, RG_SPIRIT_CHILD_GATE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_GATE_SILVER_RUPEE_4)); + locationTable[RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_5] = Location::Base(RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_5, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Gate Silver Rupee 5", "Spirit Temple Child Gate Silver Rupee 5", RHT_SPIRIT_CHILD_GATE_SILVER_RUPEE, RG_SPIRIT_CHILD_GATE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_GATE_SILVER_RUPEE_5)); + + locationTable[RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_1] = Location::Base(RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_1, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Block Pushing Silver Rupee 1", "Spirit Child Block Pushing Silver Rupee 1", RHT_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_1)); + locationTable[RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_2] = Location::Base(RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_2, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Block Pushing Silver Rupee 2", "Spirit Child Block Pushing Silver Rupee 2", RHT_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_2)); + locationTable[RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_3] = Location::Base(RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_3, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Block Pushing Silver Rupee 3", "Spirit Child Block Pushing Silver Rupee 3", RHT_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_3)); + locationTable[RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_4] = Location::Base(RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_4, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Block Pushing Silver Rupee 4", "Spirit Child Block Pushing Silver Rupee 4", RHT_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_4)); + locationTable[RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_5] = Location::Base(RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_5, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Block Pushing Silver Rupee 5", "Spirit Child Block Pushing Silver Rupee 5", RHT_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_BLOCK_PUSH_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, 0, 0x0, "Boulder Room Silver Rupee 1", "Spirit Boulder Room Silver Rupee 1", RHT_SPIRIT_BOULDER_SILVER_RUPEE, RG_SPIRIT_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Boulder Room Silver Rupee 2", "Spirit Boulder Room Silver Rupee 2", RHT_SPIRIT_BOULDER_SILVER_RUPEE, RG_SPIRIT_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Boulder Room Silver Rupee 3", "Spirit Boulder Room Silver Rupee 3", RHT_SPIRIT_BOULDER_SILVER_RUPEE, RG_SPIRIT_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Boulder Room Silver Rupee 4", "Spirit Boulder Room Silver Rupee 4", RHT_SPIRIT_BOULDER_SILVER_RUPEE, RG_SPIRIT_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Boulder Room Silver Rupee 5", "Spirit Boulder Room Silver Rupee 5", RHT_SPIRIT_BOULDER_SILVER_RUPEE, RG_SPIRIT_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Spinning Scythe Silver Rupee 1", "Shadow Spinning Scythe Silver Rupee 1", RHT_SHADOW_SPINNING_SCYTHE_SILVER_RUPEE, RG_SHADOW_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Spinning Scythe Silver Rupee 2", "Shadow Spinning Scythe Silver Rupee 2", RHT_SHADOW_SPINNING_SCYTHE_SILVER_RUPEE, RG_SHADOW_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Spinning Scythe Silver Rupee 3", "Shadow Spinning Scythe Silver Rupee 3", RHT_SHADOW_SPINNING_SCYTHE_SILVER_RUPEE, RG_SHADOW_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Spinning Scythe Silver Rupee 4", "Shadow Spinning Scythe Silver Rupee 4", RHT_SHADOW_SPINNING_SCYTHE_SILVER_RUPEE, RG_SHADOW_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Spinning Scythe Silver Rupee 5", "Shadow Spinning Scythe Silver Rupee 5", RHT_SHADOW_SPINNING_SCYTHE_SILVER_RUPEE, RG_SHADOW_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Outside Spike Rain Room Silver Rupee 1", "Shadow Outside Spike Rain Room Silver Rupee 1", RHT_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Outside Spike Rain Room Silver Rupee 2", "Shadow Outside Spike Rain Room Silver Rupee 2", RHT_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Outside Spike Rain Room Silver Rupee 3", "Shadow Outside Spike Rain Room Silver Rupee 3", RHT_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Outside Spike Rain Room Silver Rupee 4", "Shadow Outside Spike Rain Room Silver Rupee 4", RHT_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Outside Spike Rain Room Silver Rupee 5", "Shadow Outside Spike Rain Room Silver Rupee 5", RHT_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Room Silver Rupee 1", "Shadow Invisible Spikes Room Silver Rupee 1", RHT_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Room Silver Rupee 2", "Shadow Invisible Spikes Room Silver Rupee 2", RHT_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Room Silver Rupee 3", "Shadow Invisible Spikes Room Silver Rupee 3", RHT_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Room Silver Rupee 4", "Shadow Invisible Spikes Room Silver Rupee 4", RHT_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Room Silver Rupee 5", "Shadow Invisible Spikes Room Silver Rupee 5", RHT_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Forest Trial Silver Rupee 1", "Inside Ganon's Castle Forest Trial Silver Rupee 1", RHT_FOREST_TRIAL_SILVER_RUPEE, RG_FOREST_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Forest Trial Silver Rupee 2", "Inside Ganon's Castle Forest Trial Silver Rupee 2", RHT_FOREST_TRIAL_SILVER_RUPEE, RG_FOREST_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Forest Trial Silver Rupee 3", "Inside Ganon's Castle Forest Trial Silver Rupee 3", RHT_FOREST_TRIAL_SILVER_RUPEE, RG_FOREST_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Forest Trial Silver Rupee 4", "Inside Ganon's Castle Forest Trial Silver Rupee 4", RHT_FOREST_TRIAL_SILVER_RUPEE, RG_FOREST_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Forest Trial Silver Rupee 5", "Inside Ganon's Castle Forest Trial Silver Rupee 5", RHT_FOREST_TRIAL_SILVER_RUPEE, RG_FOREST_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Fire Trial Silver Rupee 1", "Inside Ganon's Castle Fire Trial Silver Rupee 1", RHT_FIRE_TRIAL_SILVER_RUPEE, RG_FIRE_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Fire Trial Silver Rupee 2", "Inside Ganon's Castle Fire Trial Silver Rupee 2", RHT_FIRE_TRIAL_SILVER_RUPEE, RG_FIRE_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Fire Trial Silver Rupee 3", "Inside Ganon's Castle Fire Trial Silver Rupee 3", RHT_FIRE_TRIAL_SILVER_RUPEE, RG_FIRE_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Fire Trial Silver Rupee 4", "Inside Ganon's Castle Fire Trial Silver Rupee 4", RHT_FIRE_TRIAL_SILVER_RUPEE, RG_FIRE_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Fire Trial Silver Rupee 5", "Inside Ganon's Castle Fire Trial Silver Rupee 5", RHT_FIRE_TRIAL_SILVER_RUPEE, RG_FIRE_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Spirit Trial Silver Rupee 1", "Inside Ganon's Castle Spirit Trial Silver Rupee 1", RHT_SPIRIT_TRIAL_SILVER_RUPEE, RG_SPIRIT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Spirit Trial Silver Rupee 2", "Inside Ganon's Castle Spirit Trial Silver Rupee 2", RHT_SPIRIT_TRIAL_SILVER_RUPEE, RG_SPIRIT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Spirit Trial Silver Rupee 3", "Inside Ganon's Castle Spirit Trial Silver Rupee 3", RHT_SPIRIT_TRIAL_SILVER_RUPEE, RG_SPIRIT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Spirit Trial Silver Rupee 4", "Inside Ganon's Castle Spirit Trial Silver Rupee 4", RHT_SPIRIT_TRIAL_SILVER_RUPEE, RG_SPIRIT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Spirit Trial Silver Rupee 5", "Inside Ganon's Castle Spirit Trial Silver Rupee 5", RHT_SPIRIT_TRIAL_SILVER_RUPEE, RG_SPIRIT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Light Trial Silver Rupee 1", "Inside Ganon's Castle Light Trial Silver Rupee 1", RHT_LIGHT_TRIAL_SILVER_RUPEE, RG_LIGHT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Light Trial Silver Rupee 2", "Inside Ganon's Castle Light Trial Silver Rupee 2", RHT_LIGHT_TRIAL_SILVER_RUPEE, RG_LIGHT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Light Trial Silver Rupee 3", "Inside Ganon's Castle Light Trial Silver Rupee 3", RHT_LIGHT_TRIAL_SILVER_RUPEE, RG_LIGHT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Light Trial Silver Rupee 4", "Inside Ganon's Castle Light Trial Silver Rupee 4", RHT_LIGHT_TRIAL_SILVER_RUPEE, RG_LIGHT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Light Trial Silver Rupee 5", "Inside Ganon's Castle Light Trial Silver Rupee 5", RHT_LIGHT_TRIAL_SILVER_RUPEE, RG_LIGHT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, RAND_INF_LIGHT_TRIAL_SILVER_RUPEE_5)); // Gossip Stones // RandomizerCheck Randomizer Check Quest Area Scene Params Flag Short Name Spoiler name Categories diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index ec658a1eeed..3a94b0a462e 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -3148,6 +3148,24 @@ typedef enum { RHT_BEEHIVE_SCRUB_TRIO_GROTTO, RHT_BEEHIVE_IN_FRONT_OF_KING_ZORA, RHT_BEEHIVE_BEHIND_KING_ZORA, + // Silver Rupees + RHT_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, + RHT_ICE_CAVERN_SLIDING_SILVER_RUPEE, + RHT_BOTTOM_OF_THE_WELL_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_CHILD_GATE_SILVER_RUPEE, + RHT_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, + RHT_SPIRIT_BOULDER_SILVER_RUPEE, + RHT_SHADOW_SPINNING_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, + // TODO: MQ Silver Rupees // Items RHT_KOKIRI_SWORD, RHT_MASTER_SWORD, @@ -3387,6 +3405,12 @@ typedef enum { RHT_OCARINA_C_RIGHT_BUTTON, RHT_BRONZE_SCALE, RHT_FISHING_POLE, + RHT_ICE_CAVERN_SILVER_RUPEE, + RHT_BOTTOM_OF_THE_WELL_SILVER_RUPEE, + RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, + RHT_SPIRIT_TEMPLE_SILVER_RUPEE, + RHT_SHADOW_TEMPLE_SILVER_RUPEE, + RHT_GANONS_CASTLE_SILVER_RUPEE, RHT_EPONA, // Entrances RHT_DESERT_COLOSSUS_TO_COLOSSUS_GROTTO, From f7e549e31a9afd0f421111aed1571cc72d71a194 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sat, 24 Feb 2024 20:19:51 -0500 Subject: [PATCH 014/108] Hint text for Vanilla Silver Rupees --- .../hint_list/hint_list_exclude_dungeon.cpp | 2 +- .../locacc_bottom_of_the_well.cpp | 6 ++++ .../location_access/locacc_ganons_castle.cpp | 23 +++++++++++++- .../locacc_gerudo_training_grounds.cpp | 16 ++++++++++ .../location_access/locacc_ice_cavern.cpp | 10 +++++++ .../location_access/locacc_shadow_temple.cpp | 15 ++++++++++ .../location_access/locacc_spirit_temple.cpp | 15 ++++++++++ soh/soh/Enhancements/randomizer/item_list.cpp | 30 +++++++++---------- .../Enhancements/randomizer/location_list.cpp | 10 +++---- .../Enhancements/randomizer/randomizerTypes.h | 2 +- 10 files changed, 106 insertions(+), 23 deletions(-) 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 66bf3120a9a..358f2e3b4fe 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 @@ -1542,7 +1542,7 @@ void HintTable_Init_Exclude_Dungeon() { Text{"a #spider locked in a crypt# within the well guards", /*french*/"une #Skulltula embarrée dans la crypte au fonds du Puits# a", /*spanish*/"una #Skulltula encerrada en una cripta# del pozo otorga"}, }); - hintTable[RHT_BOTTOM_OF_THE_WELL_SILVER_RUPEE] = HintText::Exclude({ + hintTable[RHT_BOTTOM_OF_THE_WELL_BASEMENT_SILVER_RUPEE] = HintText::Exclude({ //obscure text Text{"#Redeads in a well# guard"} }); diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_bottom_of_the_well.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_bottom_of_the_well.cpp index 37312b84bb3..ac2ead8a7cf 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_bottom_of_the_well.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_bottom_of_the_well.cpp @@ -42,6 +42,12 @@ void AreaTable_Init_BottomOfTheWell() { LocationAccess(RC_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, {[]{return logic->Boomerang && (randoCtx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->SmallKeys(RR_BOTTOM_OF_THE_WELL, 3);}}), LocationAccess(RC_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, {[]{return logic->Boomerang && (randoCtx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->SmallKeys(RR_BOTTOM_OF_THE_WELL, 3);}}), LocationAccess(RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, {[]{return logic->SmallKeys(RR_BOTTOM_OF_THE_WELL, 3) && (randoCtx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->Boomerang;}}), + LocationAccess(RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_1, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_1, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_2, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_3, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_4, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_5, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ }, { //Exits Entrance(RR_BOTTOM_OF_THE_WELL_ENTRYWAY, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp index e91513b7949..cd67bd635f7 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp @@ -58,12 +58,23 @@ void AreaTable_Init_GanonsCastle() { }, { //Locations LocationAccess(RC_GANONS_CASTLE_FOREST_TRIAL_CHEST, {[]{return logic->CanAdultDamage || logic->CanChildDamage;}}), + LocationAccess(RC_FOREST_TRIAL_SILVER_RUPEE_1, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_FOREST_TRIAL_SILVER_RUPEE_2, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_FOREST_TRIAL_SILVER_RUPEE_3, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_FOREST_TRIAL_SILVER_RUPEE_4, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_FOREST_TRIAL_SILVER_RUPEE_5, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ }, {}); areaTable[RR_GANONS_CASTLE_FIRE_TRIAL] = Area("Ganon's Castle Fire Trial", "Ganon's Castle", RA_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->FireTrialClear, {[]{return logic->CanUse(RG_GORON_TUNIC) && logic->CanUse(RG_GOLDEN_GAUNTLETS) && logic->CanUse(RG_LIGHT_ARROWS) && logic->CanUse(RG_LONGSHOT);}}), - }, {}, {}); + }, { + LocationAccess(RC_FIRE_TRIAL_SILVER_RUPEE_1, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_FIRE_TRIAL_SILVER_RUPEE_2, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_FIRE_TRIAL_SILVER_RUPEE_3, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_FIRE_TRIAL_SILVER_RUPEE_4, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_FIRE_TRIAL_SILVER_RUPEE_5, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + }, {}); areaTable[RR_GANONS_CASTLE_WATER_TRIAL] = Area("Ganon's Castle Water Trial", "Ganon's Castle", RA_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { //Events @@ -93,6 +104,11 @@ void AreaTable_Init_GanonsCastle() { //Locations LocationAccess(RC_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, {[]{return (randoCtx->GetTrickOption(RT_GANON_SPIRIT_TRIAL_HOOKSHOT) || logic->CanUse(RG_HOOKSHOT)) && logic->CanJumpslash;}}), LocationAccess(RC_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, {[]{return (randoCtx->GetTrickOption(RT_GANON_SPIRIT_TRIAL_HOOKSHOT) || logic->CanUse(RG_HOOKSHOT)) && logic->HasBombchus && (randoCtx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH));}}), + LocationAccess(RC_SPIRIT_TRIAL_SILVER_RUPEE_1, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SPIRIT_TRIAL_SILVER_RUPEE_2, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SPIRIT_TRIAL_SILVER_RUPEE_3, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SPIRIT_TRIAL_SILVER_RUPEE_4, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SPIRIT_TRIAL_SILVER_RUPEE_5, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ }, {}); areaTable[RR_GANONS_CASTLE_LIGHT_TRIAL] = Area("Ganon's Castle Light Trial", "Ganon's Castle", RA_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { @@ -108,6 +124,11 @@ void AreaTable_Init_GanonsCastle() { LocationAccess(RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST, {[]{return true;}}), LocationAccess(RC_GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST, {[]{return randoCtx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH);}}), LocationAccess(RC_GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST, {[]{return logic->CanUse(RG_ZELDAS_LULLABY) && logic->SmallKeys(RR_GANONS_CASTLE, 1);}}), + LocationAccess(RC_LIGHT_TRIAL_SILVER_RUPEE_1, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_LIGHT_TRIAL_SILVER_RUPEE_2, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_LIGHT_TRIAL_SILVER_RUPEE_3, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_LIGHT_TRIAL_SILVER_RUPEE_4, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_LIGHT_TRIAL_SILVER_RUPEE_5, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ }, {}); } diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_training_grounds.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_training_grounds.cpp index f48bac91ca6..5b1bd748060 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_training_grounds.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_training_grounds.cpp @@ -59,6 +59,16 @@ void AreaTable_Init_GerudoTrainingGrounds() { areaTable[RR_GERUDO_TRAINING_GROUNDS_LAVA_ROOM] = Area("Gerudo Training Grounds Lava Room", "Gerudo Training Grounds", RA_GERUDO_TRAINING_GROUND, NO_DAY_NIGHT_CYCLE, {}, { //Locations LocationAccess(RC_GERUDO_TRAINING_GROUND_UNDERWATER_SILVER_RUPEE_CHEST, {[]{return logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_SONG_OF_TIME) && logic->IronBoots && logic->WaterTimer >= 24;}}), + LocationAccess(RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_1, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_2, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_3, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_4, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_5, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_1, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_2, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_3, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_4, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_5, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ }, { //Exits Entrance(RR_GERUDO_TRAINING_GROUNDS_CENTRAL_MAZE_RIGHT, {[]{return logic->CanUse(RG_SONG_OF_TIME) || logic->IsChild;}}), @@ -94,6 +104,12 @@ void AreaTable_Init_GerudoTrainingGrounds() { areaTable[RR_GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_ROOM] = Area("Gerudo Training Grounds Heavy Block Room", "Gerudo Training Grounds", RA_GERUDO_TRAINING_GROUND, NO_DAY_NIGHT_CYCLE, {}, { //Locations LocationAccess(RC_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST, {[]{return logic->CanJumpslash;}}), + // TODO: Maybe a new region for the boulder maze room? Not sure if that's needed or if it's fine for them to stay here. + LocationAccess(RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_1, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_2, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_3, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_4, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_5, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ }, { //Exits Entrance(RR_GERUDO_TRAINING_GROUNDS_EYE_STATUE_UPPER, {[]{return (randoCtx->GetTrickOption(RT_LENS_GTG) || logic->CanUse(RG_LENS_OF_TRUTH)) && (logic->CanUse(RG_HOOKSHOT) || (randoCtx->GetTrickOption(RT_GTG_FAKE_WALL) && logic->CanUse(RG_HOVER_BOOTS)));}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ice_cavern.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ice_cavern.cpp index 4e58272589f..f3b732e8d5e 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ice_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ice_cavern.cpp @@ -38,6 +38,16 @@ void AreaTable_Init_IceCavern() { LocationAccess(RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, {[]{return logic->HookshotOrBoomerang;}}), LocationAccess(RC_ICE_CAVERN_GS_HEART_PIECE_ROOM, {[]{return logic->BlueFire && logic->HookshotOrBoomerang;}}), LocationAccess(RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, {[]{return logic->BlueFire && (logic->HookshotOrBoomerang || (randoCtx->GetTrickOption(RT_ICE_BLOCK_GS) && logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS)));}}), + LocationAccess(RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_1, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_2, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_3, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_4, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_5, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_1, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_2, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_3, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_4, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_5, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ }, {}); } diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp index c742c9c2d41..6c82a8517af 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp @@ -39,6 +39,11 @@ void AreaTable_Init_ShadowTemple() { //Locations LocationAccess(RC_SHADOW_TEMPLE_COMPASS_CHEST, {[]{return logic->CanJumpslash;}}), LocationAccess(RC_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, {[]{return logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_HOOKSHOT);}}), + LocationAccess(RC_SHADOW_SCYTHE_SILVER_RUPEE_1, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_SCYTHE_SILVER_RUPEE_2, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_SCYTHE_SILVER_RUPEE_3, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_SCYTHE_SILVER_RUPEE_4, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_SCYTHE_SILVER_RUPEE_5, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ LocationAccess(RC_SHADOW_TEMPLE_GS_NEAR_SHIP, {[]{return false;}}), }, { //Exits @@ -50,10 +55,20 @@ void AreaTable_Init_ShadowTemple() { //Locations LocationAccess(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, {[]{return logic->CanJumpslash;}}), LocationAccess(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, {[]{return logic->CanJumpslash;}}), + LocationAccess(RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_1, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_2, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_3, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_4, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_5, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ LocationAccess(RC_SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST, {[]{return true;}}), LocationAccess(RC_SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST, {[]{return (randoCtx->GetTrickOption(RT_SHADOW_UMBRELLA) && logic->HoverBoots) || logic->GoronBracelet;}}), LocationAccess(RC_SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST, {[]{return (randoCtx->GetTrickOption(RT_SHADOW_UMBRELLA) && logic->HoverBoots) || logic->GoronBracelet;}}), LocationAccess(RC_SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST, {[]{return logic->SmallKeys(RR_SHADOW_TEMPLE, 2, 3) && ((randoCtx->GetTrickOption(RT_LENS_SHADOW_PLATFORM) && randoCtx->GetTrickOption(RT_LENS_SHADOW)) || logic->CanUse(RG_LENS_OF_TRUTH));}}), + LocationAccess(RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_1, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_2, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_3, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_4, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_5, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ LocationAccess(RC_SHADOW_TEMPLE_FREESTANDING_KEY, {[]{return logic->SmallKeys(RR_SHADOW_TEMPLE, 2, 3) && ((randoCtx->GetTrickOption(RT_LENS_SHADOW_PLATFORM) && randoCtx->GetTrickOption(RT_LENS_SHADOW)) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->Hookshot && (logic->Bombs || logic->GoronBracelet || (randoCtx->GetTrickOption(RT_SHADOW_FREESTANDING_KEY) && logic->HasBombchus));}}), LocationAccess(RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, {[]{return logic->CanJumpslash;}}), LocationAccess(RC_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, {[]{return logic->Hookshot || (randoCtx->GetTrickOption(RT_SHADOW_UMBRELLA_GS) && logic->HoverBoots);}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp index c859aeb8d64..0bbe1d04f77 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp @@ -32,6 +32,11 @@ void AreaTable_Init_SpiritTemple() { }, { //Locations LocationAccess(RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, {[]{return (logic->Boomerang || logic->Slingshot || (logic->HasBombchus && randoCtx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives || ((logic->Nuts || logic->Boomerang) && (logic->Sticks || logic->KokiriSword || logic->Slingshot)));}}), + LocationAccess(RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_1, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_2, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_3, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_4, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_5, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ LocationAccess(RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, {[]{return (logic->Boomerang || logic->Slingshot || (logic->HasBombchus && randoCtx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives || ((logic->Nuts || logic->Boomerang) && (logic->Sticks || logic->KokiriSword || logic->Slingshot))) && (logic->Sticks || logic->CanUse(RG_DINS_FIRE));}}), LocationAccess(RC_SPIRIT_TEMPLE_GS_METAL_FENCE, {[]{return (logic->Boomerang || logic->Slingshot || (logic->HasBombchus && randoCtx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives || ((logic->Nuts || logic->Boomerang) && (logic->Sticks || logic->KokiriSword || logic->Slingshot)));}}), }, { @@ -47,6 +52,11 @@ void AreaTable_Init_SpiritTemple() { (logic->CanTakeDamage && (logic->CanJumpslash || logic->HasProjectile(HasProjectileAge::Child))) || (logic->IsChild && logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && logic->HasProjectile(HasProjectileAge::Child)) || ((logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && randoCtx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && randoCtx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF))) && logic->CanUse(RG_SILVER_GAUNTLETS) && (logic->HasProjectile(HasProjectileAge::Adult) || (logic->CanTakeDamage && logic->CanJumpslash)));}}), + LocationAccess(RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_1, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_2, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_3, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_4, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_5, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ }, { //Exits Entrance(RR_SPIRIT_TEMPLE_CENTRAL_CHAMBER, {[]{return logic->HasExplosives || (randoCtx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS));}}), @@ -59,6 +69,11 @@ void AreaTable_Init_SpiritTemple() { LocationAccess(RC_SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, {[]{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 3);}}), LocationAccess(RC_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, {[]{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 3);}}), LocationAccess(RC_SPIRIT_TEMPLE_GS_BOULDER_ROOM, {[]{return logic->CanUse(RG_SONG_OF_TIME) && (logic->Bow || logic->Hookshot || logic->HasBombchus || (logic->Bombs && randoCtx->GetTrickOption(RT_SPIRIT_LOWER_ADULT_SWITCH)));}}), + LocationAccess(RC_SPIRIT_BOULDER_SILVER_RUPEE_1, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SPIRIT_BOULDER_SILVER_RUPEE_2, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SPIRIT_BOULDER_SILVER_RUPEE_3, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SPIRIT_BOULDER_SILVER_RUPEE_4, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SPIRIT_BOULDER_SILVER_RUPEE_5, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ }, { //Exits Entrance(RR_SPIRIT_TEMPLE_CENTRAL_CHAMBER, {[]{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 1);}}), diff --git a/soh/soh/Enhancements/randomizer/item_list.cpp b/soh/soh/Enhancements/randomizer/item_list.cpp index b368b947acd..2ce5d660e2a 100644 --- a/soh/soh/Enhancements/randomizer/item_list.cpp +++ b/soh/soh/Enhancements/randomizer/item_list.cpp @@ -291,37 +291,37 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_TRIFORCE] = Item(RG_TRIFORCE, Text{ "Triforce", "Triforce", "Triforce" }, ITEMTYPE_EVENT, RG_TRIFORCE, false, &logic->noVariable, RHT_NONE); itemTable[RG_HINT] = Item(RG_HINT, Text{ "Hint", "Indice", "Hinweis" }, ITEMTYPE_EVENT, RG_HINT, false, &logic->noVariable, RHT_NONE); - itemTable[RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE] = Item(RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, Text{ "Ice Cavern Spinning Blades Room Silver Rupee", "Ice Cavern Spinning Blades Room Silver Rupee", "Ice Cavern Spinning Blades Room Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_ICE_CAVERN_SPINNING_BLADES_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] = Item(RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, Text{ "Ice Cavern Spinning Blades Room Silver Rupee", "Ice Cavern Spinning Blades Room Silver Rupee", "Ice Cavern Spinning Blades Room Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, 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 Room Silver Rupee", "Ice Cavern Block Sliding Room Silver Rupee", "Ice Cavern Block Sliding Room Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_ICE_CAVERN_SLIDING_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] = Item(RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, Text{ "Ice Cavern Block Sliding Room Silver Rupee", "Ice Cavern Block Sliding Room Silver Rupee", "Ice Cavern Block Sliding Room Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, 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->noVariable, 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 Boudler Maze Silver Rupee", "GTG Boulder Maze Silver Rupee", "GTG Boulder Maze Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_GERUDO_TRAINING_GROUND_BOULDER_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] = Item(RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, Text{ "GTG Boudler Maze Silver Rupee", "GTG Boulder Maze Silver Rupee", "GTG Boulder Maze Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_GERUDO_TRAINING_GROUNDS_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->noVariable, RHT_GERUDO_TRAINING_GROUND_LAVA_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] = 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->noVariable, RHT_GERUDO_TRAINING_GROUNDS_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 Toilet Room Silver Rupee", "GTG Whirlpool Room Silver Rupee", "GTG Whirlpool Room Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_GERUDO_TRAINING_GROUND_TOILET_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] = Item(RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, Text{ "GTG Toilet Room Silver Rupee", "GTG Whirlpool Room Silver Rupee", "GTG Whirlpool Room Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_GERUDO_TRAINING_GROUNDS_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_CHILD_GATE_SILVER_RUPEE] = Item(RG_SPIRIT_CHILD_GATE_SILVER_RUPEE, Text{ "Spirit Temple Child Gate Room Silver Rupee", "Spirit Temple Child Gate Room Silver Rupee", "Spirit Temple Child Gate Room Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_SPIRIT_CHILD_GATE_SILVER_RUPEE, RG_SPIRIT_CHILD_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_CHILD_GATE_SILVER_RUPEE] = Item(RG_SPIRIT_CHILD_GATE_SILVER_RUPEE, Text{ "Spirit Temple Child Gate Room Silver Rupee", "Spirit Temple Child Gate Room Silver Rupee", "Spirit Temple Child Gate Room Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_SPIRIT_TEMPLE_SILVER_RUPEE, RG_SPIRIT_CHILD_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_CHILD_GATE_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); - itemTable[RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE] = Item(RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, Text{ "Spirit Temple Child Block Pushing Room Silver Rupee", "Spirit Temple Child Block Pushing Room Silver Rupee", "Spirit Temple Child Block Pushing Room Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, RG_SPIRIT_CHILD_BLOCK_PUSH_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_CHILD_BLOCK_PUSH_SILVER_RUPEE] = Item(RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, Text{ "Spirit Temple Child Block Pushing Room Silver Rupee", "Spirit Temple Child Block Pushing Room Silver Rupee", "Spirit Temple Child Block Pushing Room Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_SPIRIT_TEMPLE_SILVER_RUPEE, RG_SPIRIT_CHILD_BLOCK_PUSH_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_CHILD_BLOCK_PUSH_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->noVariable, RHT_SPIRIT_BOULDER_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] = 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->noVariable, 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->noVariable, RHT_SHADOW_SPINNING_SCYTHE_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] = 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->noVariable, 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 Outside Falling Spikes Room Silver Rupee", "Shadow Temple Outside Falling Spikes Room Silver Rupee", "Shadow Temple Outside Falling Spikes Room Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_SHADOW_OUTSIDE_SPIKE_RAIN_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] = Item(RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, Text{ "Shadow Temple Outside Falling Spikes Room Silver Rupee", "Shadow Temple Outside Falling Spikes Room Silver Rupee", "Shadow Temple Outside Falling Spikes Room Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, 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->noVariable, RHT_SHADOW_INVISIBLE_SPIKES_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] = 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->noVariable, 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{ "Forest Trial Silver Rupee", "Forest Trial Silver Rupee", "Forest Trial Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_FOREST_TRIAL_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] = Item(RG_FOREST_TRIAL_SILVER_RUPEE, Text{ "Forest Trial Silver Rupee", "Forest Trial Silver Rupee", "Forest Trial Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, 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{ "Fire Trial Silver Rupee", "Fire Trial Silver Rupee", "Fire Trial Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_FIRE_TRIAL_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] = Item(RG_FIRE_TRIAL_SILVER_RUPEE, Text{ "Fire Trial Silver Rupee", "Fire Trial Silver Rupee", "Fire Trial Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, 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{ "Spirit Trial Silver Rupee", "Spirit Trial Silver Rupee", "Spirit Trial Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_SPIRIT_TRIAL_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] = Item(RG_SPIRIT_TRIAL_SILVER_RUPEE, Text{ "Spirit Trial Silver Rupee", "Spirit Trial Silver Rupee", "Spirit Trial Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, 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{ "Light Trial Silver Rupee", "Light Trial Silver Rupee", "Light Trial Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_LIGHT_TRIAL_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] = Item(RG_LIGHT_TRIAL_SILVER_RUPEE, Text{ "Light Trial Silver Rupee", "Light Trial Silver Rupee", "Light Trial Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, 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); // Individual stages of progressive items (only here for GetItemEntry purposes, not for use in seed gen) diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 115271efa38..e56d958b521 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -1526,11 +1526,11 @@ void Rando::StaticData::InitLocationTable() { 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,0, 0x0, "Sliding Puzzle Silver Rupee 4", "Ice Cavern Sliding Puzzle Silver Rupee 4", RHT_ICE_CAVERN_SLIDING_SILVER_RUPEE, RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Sliding Puzzle Silver Rupee 5", "Ice Cavern Sliding Puzzle Silver Rupee 5", RHT_ICE_CAVERN_SLIDING_SILVER_RUPEE, RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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, 0, 0x0, "Bottom of the Well Basement Silver Rupee 1", "Bottom of the Well Basement Silver Rupee 1", RHT_BOTTOM_OF_THE_WELL_SILVER_RUPEE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_BOTTOM_OF_THE_WELL, 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, 0, 0x0, "Bottom of the Well Basement Silver Rupee 2", "Bottom of the Well Basement Silver Rupee 2", RHT_BOTTOM_OF_THE_WELL_SILVER_RUPEE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_BOTTOM_OF_THE_WELL, 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, 0, 0x0, "Bottom of the Well Basement Silver Rupee 3", "Bottom of the Well Basement Silver Rupee 3", RHT_BOTTOM_OF_THE_WELL_SILVER_RUPEE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_BOTTOM_OF_THE_WELL, 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, 0, 0x0, "Bottom of the Well Basement Silver Rupee 4", "Bottom of the Well Basement Silver Rupee 4", RHT_BOTTOM_OF_THE_WELL_SILVER_RUPEE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_BOTTOM_OF_THE_WELL, 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, 0, 0x0, "Bottom of the Well Basement Silver Rupee 5", "Bottom of the Well Basement Silver Rupee 5", RHT_BOTTOM_OF_THE_WELL_SILVER_RUPEE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_BOTTOM_OF_THE_WELL, RAND_INF_BOTTOM_OF_THE_WELL_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, 0, 0x0, "Bottom of the Well Basement Silver Rupee 1", "Bottom of the Well Basement Silver Rupee 1", RHT_BOTTOM_OF_THE_WELL_BASEMENT_SILVER_RUPEE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_BOTTOM_OF_THE_WELL, 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, 0, 0x0, "Bottom of the Well Basement Silver Rupee 2", "Bottom of the Well Basement Silver Rupee 2", RHT_BOTTOM_OF_THE_WELL_BASEMENT_SILVER_RUPEE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_BOTTOM_OF_THE_WELL, 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, 0, 0x0, "Bottom of the Well Basement Silver Rupee 3", "Bottom of the Well Basement Silver Rupee 3", RHT_BOTTOM_OF_THE_WELL_BASEMENT_SILVER_RUPEE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_BOTTOM_OF_THE_WELL, 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, 0, 0x0, "Bottom of the Well Basement Silver Rupee 4", "Bottom of the Well Basement Silver Rupee 4", RHT_BOTTOM_OF_THE_WELL_BASEMENT_SILVER_RUPEE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_BOTTOM_OF_THE_WELL, 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, 0, 0x0, "Bottom of the Well Basement Silver Rupee 5", "Bottom of the Well Basement Silver Rupee 5", RHT_BOTTOM_OF_THE_WELL_BASEMENT_SILVER_RUPEE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_BOTTOM_OF_THE_WELL, 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, 0, 0x0, "Boulder Maze Silver Rupee 1", "GTG Boulder Maze Silver Rupee 1", RHT_GERUDO_TRAINING_GROUND_BOULDER_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Boulder Maze Silver Rupee 2", "GTG Boulder Maze Silver Rupee 2", RHT_GERUDO_TRAINING_GROUND_BOULDER_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, RAND_INF_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_2)); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index f8a7160f293..d9003f3507c 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -3151,7 +3151,7 @@ typedef enum { // Silver Rupees RHT_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, RHT_ICE_CAVERN_SLIDING_SILVER_RUPEE, - RHT_BOTTOM_OF_THE_WELL_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, From 36eb9c3cb6a18ff3466f24c4acdf5fb96114c59a Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Tue, 5 Mar 2024 21:32:02 -0500 Subject: [PATCH 015/108] Fix hint generation bugs on develop-rando 1. Fixed Ganon Non-hint text from loading as Saria's Magic Hint. 2. Fixed Ganon Non-hint text from not getting saved correctly. 3. Fixed gossip stone hint generation from not generating any non-always hints on No Logic. For #3, the hint distribution and placement algorithm was bailing out too early when it wasn't able to place a hint. For No Logic, what it was doing was failing to place WOTH hints (since No Logic seeds don't calculate WOTH candidacy), returning the amount of hints it failed to place, and then it called the function to redistribute the hints, but did not call the function to attempt to place the remaining hints. Additionally, it was not accounting for the fact that we shouldn't redistribute the hints into the categories we failed to place a hint in, so it would redistribute hints right back into those categories. I changed it so that when DistributeHints gets called after PlaceHints fails to place the hint, it checks if the distribution settings copies attribute was set to 0. In this case, it breaks while looping for the type distribution settings, and moves on to the next category. Also, it now repeatedly attempts to distribute and place hints until PlaceHints returns 0 (meaning it placed all of its hints successfully). --- soh/soh/Enhancements/randomizer/3drando/hints.cpp | 8 +++++--- soh/soh/Enhancements/randomizer/3drando/text.hpp | 10 ++++++++-- soh/soh/Enhancements/randomizer/randomizer.cpp | 2 +- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/hints.cpp b/soh/soh/Enhancements/randomizer/3drando/hints.cpp index c55655de051..1333b331ac8 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hints.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hints.cpp @@ -287,7 +287,7 @@ Text AutoFormatHintText(const Text& unformattedHintText, const std::vector dungeonInfoData; @@ -615,6 +615,7 @@ void CreateGanonAndSheikText() { } ctx->AddHint(RH_GANONDORF_HINT, AutoFormatHintText(ganonHintText), lightArrowLocation[0], HINT_TYPE_STATIC, "Static", lightArrowArea); + ctx->AddHint(RH_GANONDORF_NOHINT, AutoFormatHintText(ganonText), lightArrowLocation[0], HINT_TYPE_STATIC, "Static", lightArrowArea); if (!ctx->GetOption(RSK_TRIAL_COUNT).Is(0)) { sheikText = ::Hint(RHT_SHEIK_LIGHT_ARROW_HINT).GetText() + LightArrowAreaText + "%w."; @@ -963,7 +964,7 @@ static void DistributeHints(std::vector& selected, size_t stoneCount, s for (uint8_t distribution = 0; distribution < distTable.size(); distribution++){ currentWeight -= distTable[distribution].weight; if (currentWeight <= 0){ - if (stoneCount >= distTable[distribution].copies){ + if (stoneCount >= distTable[distribution].copies || distTable[distribution].copies == 0){ selected[distribution] += 1; stoneCount -= distTable[distribution].copies; break; @@ -1074,8 +1075,9 @@ void CreateStoneHints() { while(totalStones != 0){ totalStones = PlaceHints(selectedHints, distTable); - if (totalStones != 0){ + while (totalStones != 0){ DistributeHints(selectedHints, totalStones, distTable, hintSetting.junkWeight, false); + totalStones = PlaceHints(selectedHints, distTable); } } diff --git a/soh/soh/Enhancements/randomizer/3drando/text.hpp b/soh/soh/Enhancements/randomizer/3drando/text.hpp index 7f7d167360b..49e598f63dd 100644 --- a/soh/soh/Enhancements/randomizer/3drando/text.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/text.hpp @@ -13,13 +13,19 @@ class Text { : english(std::move(english_)), french(std::move(french_)), spanish(std::move(spanish_)), - german(std::move("")) {} + german(std::move("")) { + // german defaults to english text until a translation is provided. + german = english; + } Text(std::string english_, std::string french_, std::string spanish_, std::string german_) : english(std::move(english_)), french(std::move(french_)), spanish(std::move(spanish_)), german(std::move(german_)) {} - Text(std::string english_) : english(std::move(english_)), french(std::move("")), spanish(std::move("")), german(std::move("")) {} + Text(std::string english_) : english(std::move(english_)), french(std::move("")), spanish(std::move("")), german(std::move("")) { + // default unprovided languages to english text + french = spanish = german = english; + } const std::string& GetEnglish() const { return english; diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 5d32e7a353c..3e861962ba9 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -271,7 +271,7 @@ void Randomizer::LoadHintMessages() { CustomMessage(ctx->GetHint(RH_GANONDORF_HINT)->GetText())); CustomMessageManager::Instance->CreateMessage( Randomizer::hintMessageTableID, TEXT_GANONDORF_NOHINT, - CustomMessage(ctx->GetHint(RH_SARIA)->GetText()));//RANDOTODO: Change to RH_BLANK or remove {{message}} replacment + CustomMessage(ctx->GetHint(RH_GANONDORF_NOHINT)->GetText())); CustomMessageManager::Instance->CreateMessage( Randomizer::hintMessageTableID, TEXT_SHEIK_NEED_HOOK, CustomMessage("{{message}}", "{{message}}", "{{message}}")); From cae433ddfa3401247e10c299a22bffb52c6616fb Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sat, 9 Mar 2024 20:05:21 -0500 Subject: [PATCH 016/108] Added Silver Rupee Counts to the GetItem Message --- .../randomizer/actors/z_en_g_switch_rando.c | 15 +++++++-------- soh/soh/Enhancements/randomizer/randomizer.cpp | 11 ++++++----- soh/soh/Enhancements/randomizer/silver_rupee.cpp | 10 ++++++++++ 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/actors/z_en_g_switch_rando.c b/soh/soh/Enhancements/randomizer/actors/z_en_g_switch_rando.c index 957c31e8462..872796c4f81 100644 --- a/soh/soh/Enhancements/randomizer/actors/z_en_g_switch_rando.c +++ b/soh/soh/Enhancements/randomizer/actors/z_en_g_switch_rando.c @@ -8,6 +8,13 @@ void EnGSwitch_Randomizer_SilverRupeeIdle(EnGSwitch* self, PlayState* play) { self->actor.shape.rot.y += 0x800; if (self->actor.xyzDistToPlayerSq < 900.0f) { if (IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_SILVER_RUPEES) != RO_SILVER_SHUFFLE_VANILLA) { + player->getItemEntry = *self->giEntry; + + if (self->giEntry->getItemId == RG_ICE_TRAP) { + Message_StartTextbox(play, 0xF8, NULL); + } else { + Message_StartTextbox(play, self->giEntry->textId, NULL); + } if (self->giEntry->modIndex == MOD_NONE) { // RANDOTOD: Move this into Item_Give() or some other more central location if (self->giEntry->getItemId == GI_SWORD_BGS) { @@ -27,14 +34,6 @@ void EnGSwitch_Randomizer_SilverRupeeIdle(EnGSwitch* self, PlayState* play) { // player->actor.freezeTimer = 10; // } - player->getItemEntry = *self->giEntry; - - if (self->giEntry->getItemId == RG_ICE_TRAP) { - Message_StartTextbox(play, 0xF8, NULL); - } else { - Message_StartTextbox(play, self->giEntry->textId, NULL); - } - if (IS_RANDO) { if (self->giEntry->getItemId != RG_ICE_TRAP) { Audio_PlayFanfare_Rando(*self->giEntry); diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 6e348e3bbaf..12b4f562cb8 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -2851,11 +2851,12 @@ void CreateGetItemMessages(const std::array* messageEntries) } // Special Case for Silver Rupees //TODO: AI Translated Text, get translation from native speaker. - customMessageManager->CreateMessage(Randomizer::getItemMessageTableID, RG_SILVER_RUPEE_FIRST, - CustomMessage("You got a %cSilver Rupee%w for the&%g{{location}}%w!", - "Du hast eine %cSilberne Rupie%w für die&%g{{location}}%w!", - "Vous avez reçu une %cRoupie d'Argent%w pour le&%g{{location}}%w!", - TEXTBOX_TYPE_BLUE, TEXTBOX_POS_BOTTOM)); + customMessageManager->CreateMessage( + Randomizer::getItemMessageTableID, RG_SILVER_RUPEE_FIRST, + CustomMessage("You got a %cSilver Rupee%w for the&%g{{location}}%w!&{{count_text}}!", + "Du hast eine %cSilberne Rupie%w für die&%g{{location}}%w!{{count_text}}!", + "Vous avez reçu une %cRoupie d'Argent%w pour le&%g{{location}}%w!{{count_text}}!", + TEXTBOX_TYPE_BLUE, TEXTBOX_POS_BOTTOM)); // Special Case for Silver Rupee Pouches // customMessageManager->CreateMessage(Randomizer::getItemMessageTableID, RG_SILVER_RUPEE_POUCH_FIRST, // { TEXTBOX_TYPE_BLUE, TEXTBOX_POS_BOTTOM, diff --git a/soh/soh/Enhancements/randomizer/silver_rupee.cpp b/soh/soh/Enhancements/randomizer/silver_rupee.cpp index 1ddfef4d2b5..1a8c3633c07 100644 --- a/soh/soh/Enhancements/randomizer/silver_rupee.cpp +++ b/soh/soh/Enhancements/randomizer/silver_rupee.cpp @@ -171,6 +171,16 @@ namespace Rando { if (rgid >= RG_SILVER_RUPEE_FIRST && rgid <= RG_SILVER_RUPEE_LAST) { messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::getItemMessageTableID, RG_SILVER_RUPEE_FIRST); + auto ctx = Rando::Context::GetInstance(); + // Get the collected amount + 1, since the text is retrieved before the count is incremented in `Randomizer_Item_Give` + int srCount = ctx->GetSilverRupees()->GetInfo(static_cast(rgid)).GetCollected() + 1; + bool complete = ctx->GetSilverRupees()->GetInfo(static_cast(rgid)).GetTotal() <= srCount; + if (complete) { + messageEntry.Replace("{{count_text}}", "That's all of them"); + } else { + messageEntry.Replace("{{count_text}}", "You have collected %g{{count}}%w of them so far"); + messageEntry.Replace("{{count}}", std::to_string(srCount)); + } }/* else if (rgid >= RG_SILVER_RUPEE_POUCH_FIRST && rgid <= RG_SILVER_RUPEE_POUCH_LAST) { messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::getItemMessageTableID, RG_SILVER_RUPEE_POUCH_FIRST); From 9f036f4c74c5e0b9892cd6399a32b087c882b04e Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sat, 9 Mar 2024 20:07:00 -0500 Subject: [PATCH 017/108] Shuffled silver rupees now give you 5 rupees when collected. --- soh/src/code/z_parameter.c | 1 + 1 file changed, 1 insertion(+) diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index afc85db9a30..7055a95688d 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -2696,6 +2696,7 @@ u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { if (item >= RG_SILVER_RUPEE_FIRST && item <= RG_SILVER_RUPEE_LAST) { Randomizer_IncrementSilverRupeeCount(item, 1); + Rupees_ChangeBy(5); return Return_Item_Entry(giEntry, RG_NONE); } From 8e283166645383498bfe872e7654fee94412386d Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Tue, 19 Mar 2024 17:25:38 -0400 Subject: [PATCH 018/108] Adds Magical Silver Rupee --- soh/soh/Enhancements/mods.cpp | 3 ++- .../Enhancements/randomizer/3drando/item_pool.cpp | 4 ++++ soh/soh/Enhancements/randomizer/item_list.cpp | 2 ++ .../randomizer/option_descriptions.cpp | 2 ++ soh/soh/Enhancements/randomizer/randomizer.cpp | 8 ++++++++ soh/soh/Enhancements/randomizer/randomizerTypes.h | 3 +++ soh/soh/Enhancements/randomizer/randomizer_inf.h | 2 ++ soh/soh/Enhancements/randomizer/settings.cpp | 15 +++++++++++++++ soh/src/code/z_parameter.c | 5 +++++ 9 files changed, 43 insertions(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index 471c6fb444c..d33607ee667 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -1208,7 +1208,8 @@ void RegisterSilverRupeeShuffle() { } else if (silverRupee->type == ENGSWITCH_SILVER_TRACKER) { Rando::Identifier randoIdentifier = { static_cast(gPlayState->sceneNum), RCQUEST_VANILLA, actor->params }; silverRupee->rg = Rando::StaticData::silverTrackerMap.at(randoIdentifier); - if (OTRGlobals::Instance->gRandoContext->GetSilverRupees()->GetInfo(silverRupee->rg).GetCollected() >= silverRupee->silverCount) { + if ((OTRGlobals::Instance->gRandoContext->GetSilverRupees()->GetInfo(silverRupee->rg).GetCollected() >= silverRupee->silverCount) + || Flags_GetRandomizerInf(RAND_INF_MAGICAL_SILVER_RUPEE)) { if ((gPlayState->sceneNum == SCENE_GERUDO_TRAINING_GROUND) && (silverRupee->actor.room == 2)) { Flags_SetTempClear(gPlayState, silverRupee->actor.room); } else { diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index 596c78ab42c..306333c37f1 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -1063,6 +1063,10 @@ void GenerateItemPool() { // Silver Rupees + // Add the Magical Silver Rupee if the option is on + if (ctx->GetOption(RSK_MAGICAL_SILVER_RUPEE)) { + AddItemToMainPool(RG_MAGICAL_SILVER_RUPEE); + } // The Silver Rupees to add to the pool will be different according to which dungeons are vanilla/mq. if (ctx->GetOption(RSK_SHUFFLE_SILVER_RUPEES).IsNot(RO_SILVER_SHUFFLE_VANILLA)) { std::vector silversToAdd; diff --git a/soh/soh/Enhancements/randomizer/item_list.cpp b/soh/soh/Enhancements/randomizer/item_list.cpp index 2ce5d660e2a..ad952f054bd 100644 --- a/soh/soh/Enhancements/randomizer/item_list.cpp +++ b/soh/soh/Enhancements/randomizer/item_list.cpp @@ -323,6 +323,8 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_SPIRIT_TRIAL_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); itemTable[RG_LIGHT_TRIAL_SILVER_RUPEE] = Item(RG_LIGHT_TRIAL_SILVER_RUPEE, Text{ "Light Trial Silver Rupee", "Light Trial Silver Rupee", "Light Trial Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, 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_MAGICAL_SILVER_RUPEE] = Item(RG_MAGICAL_SILVER_RUPEE, Text{ "Magical Silver Rupee", "Magical Silver Rupee", "Magical Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_MAGICAL_SILVER_RUPEE, RG_MAGICAL_SILVER_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_SILVER_RUPEE, MOD_RANDOMIZER); + itemTable[RG_MAGICAL_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); // Individual stages of progressive items (only here for GetItemEntry purposes, not for use in seed gen) itemTable[RG_HOOKSHOT] = Item(RG_HOOKSHOT, Text{ "Hookshot", "Grappin", "Fanghaken" }, ITEMTYPE_ITEM, GI_HOOKSHOT, true, &logic->ProgressiveHookshot, RHT_HOOKSHOT, ITEM_HOOKSHOT, OBJECT_GI_HOOKSHOT, GID_HOOKSHOT, 0x36, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); diff --git a/soh/soh/Enhancements/randomizer/option_descriptions.cpp b/soh/soh/Enhancements/randomizer/option_descriptions.cpp index 208cfe5d1fe..59b1faaf84f 100644 --- a/soh/soh/Enhancements/randomizer/option_descriptions.cpp +++ b/soh/soh/Enhancements/randomizer/option_descriptions.cpp @@ -404,6 +404,8 @@ void Settings::CreateOptionDescriptions() { "Overworld - Silver Rupees can only appear outside of dungeons.\n" "\n" "Anywhere - Silver Rupees can appear anywhere in the world."; + mOptionDescriptions[RSK_MAGICAL_SILVER_RUPEE] = "Adds a Magical Silver Rupee that opens all silver rupee puzzles to the item pool." + "It is not considered in logic, so you will not be required to find it to beat the seed, but if you do find it, it is a nice bonus."; mOptionDescriptions[RSK_GANONS_BOSS_KEY] = "Vanilla - Ganon's Boss Key will appear in the vanilla location.\n" "\n" diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 12b4f562cb8..5cc8d5022e4 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -2863,6 +2863,14 @@ void CreateGetItemMessages(const std::array* messageEntries) // "You got a %cSilver Rupee Pouch%w for the&%g{{location}}%w!", // "Du hast einen %cBeutel mit Silberrupien%g für die für die&%g{{location}}%w!", // "Vous avez reçu une %cPochette en Roupie d'Argent%w pour le&%g{{location}}%w!" }); + customMessageManager->CreateMessage(Randomizer::getItemMessageTableID, RG_MAGICAL_SILVER_RUPEE, + CustomMessage("You found the %cMagical Silver Rupee%w!&This magical silver " + "rupee automatically&completes all Silver Rupee Puzzles!", + "You found the %cMagical Silver Rupee%w!&This magical silver " + "rupee automatically&completes all Silver Rupee Puzzles!", + "You found the %cMagical Silver Rupee%w!&This magical silver " + "rupee automatically&completes all Silver Rupee Puzzles!", + TEXTBOX_TYPE_BLUE, TEXTBOX_POS_BOTTOM)); } void CreateRupeeMessages() { diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index d9003f3507c..7019c70c3ef 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -2139,6 +2139,7 @@ typedef enum { RG_WATER_TRIAL_MQ_SILVER_RUPEE, RG_SHADOW_TRIAL_MQ_SILVER_RUPEE, RG_SILVER_RUPEE_LAST = RG_SHADOW_TRIAL_MQ_SILVER_RUPEE, + RG_MAGICAL_SILVER_RUPEE, RG_HINT, RG_TYCOON_WALLET, RG_BRONZE_SCALE, @@ -3411,6 +3412,7 @@ typedef enum { RHT_SPIRIT_TEMPLE_SILVER_RUPEE, RHT_SHADOW_TEMPLE_SILVER_RUPEE, RHT_GANONS_CASTLE_SILVER_RUPEE, + RHT_MAGICAL_SILVER_RUPEE, RHT_EPONA, // Entrances RHT_DESERT_COLOSSUS_TO_COLOSSUS_GROTTO, @@ -3867,6 +3869,7 @@ typedef enum { RSK_FISHSANITY_AGE_SPLIT, RSK_SHUFFLE_FISHING_POLE, RSK_SHUFFLE_SILVER_RUPEES, + RSK_MAGICAL_SILVER_RUPEE, RSK_MAX } RandomizerSettingKey; diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index 4fe620bcc2a..60fd2366cbf 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -417,6 +417,8 @@ typedef enum { RAND_INF_SHADOW_TRIAL_MQ_SILVER_RUPEE_4, RAND_INF_SHADOW_TRIAL_MQ_SILVER_RUPEE_5, + RAND_INF_MAGICAL_SILVER_RUPEE, + // If you add anything to this list, you need to update the size of randomizerInf in z64save.h to be // ceil(RAND_INF_MAX / 16) diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index c6c1e802115..b70fd949fff 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -128,6 +128,7 @@ void Settings::CreateOptions() { mOptions[RSK_GERUDO_KEYS] = Option::U8("Gerudo Fortress Keys", {"Vanilla", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, "gRandomizeGerudoKeys", mOptionDescriptions[RSK_GERUDO_KEYS], WidgetType::Combobox, RO_GERUDO_KEYS_VANILLA); mOptions[RSK_BOSS_KEYSANITY] = Option::U8("Boss Keys", {"Start With", "Vanilla", "Own Dungeon", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, "gRandomizeBossKeysanity", mOptionDescriptions[RSK_BOSS_KEYSANITY], WidgetType::Combobox, RO_DUNGEON_ITEM_LOC_OWN_DUNGEON); mOptions[RSK_SHUFFLE_SILVER_RUPEES] = Option::U8("Silver Rupees", {"Vanilla", "Own Dungeon", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, "gRandomizeSilverRupeeShuffle", mOptionDescriptions[RSK_SHUFFLE_SILVER_RUPEES], WidgetType::Combobox, RO_SILVER_SHUFFLE_VANILLA); + mOptions[RSK_MAGICAL_SILVER_RUPEE] = Option::Bool("Magical Silver Rupee", "gRandomizeMagicalSilverRupee", mOptionDescriptions[RSK_MAGICAL_SILVER_RUPEE]); mOptions[RSK_GANONS_BOSS_KEY] = Option::U8("Ganon's Boss Key", {"Vanilla", "Own Dungeon", "Start With", "Any Dungeon", "Overworld", "Anywhere", "LACS-Vanilla", "LACS-Stones", "LACS-Medallions", "LACS-Rewards", "LACS-Dungeons", "LACS-Tokens", "Triforce Hunt"}, OptionCategory::Setting, "gRandomizeShuffleGanonBossKey", mOptionDescriptions[RSK_GANONS_BOSS_KEY], WidgetType::Combobox, RO_GANON_BOSS_KEY_VANILLA); mOptions[RSK_LACS_STONE_COUNT] = Option::U8("Stone Count", {NumOpts(0, 4)}, OptionCategory::Setting, "gRandomizeLacsStoneCount", "", WidgetType::Slider, 3, true); mOptions[RSK_LACS_MEDALLION_COUNT] = Option::U8("Medallion Count", {NumOpts(0, 7)}, OptionCategory::Setting, "gRandomizeLacsMedallionCount", "", WidgetType::Slider, 6, true); @@ -688,6 +689,7 @@ void Settings::CreateOptions() { &mOptions[RSK_GERUDO_KEYS], &mOptions[RSK_BOSS_KEYSANITY], &mOptions[RSK_SHUFFLE_SILVER_RUPEES], + &mOptions[RSK_MAGICAL_SILVER_RUPEE], &mOptions[RSK_GANONS_BOSS_KEY], &mOptions[RSK_LACS_STONE_COUNT], &mOptions[RSK_LACS_MEDALLION_COUNT], @@ -895,6 +897,7 @@ void Settings::CreateOptions() { &mOptions[RSK_GERUDO_KEYS], &mOptions[RSK_BOSS_KEYSANITY], &mOptions[RSK_SHUFFLE_SILVER_RUPEES], + &mOptions[RSK_MAGICAL_SILVER_RUPEE], &mOptions[RSK_GANONS_BOSS_KEY], &mOptions[RSK_LACS_STONE_COUNT], &mOptions[RSK_LACS_MEDALLION_COUNT], @@ -1650,6 +1653,13 @@ void Settings::UpdateOptionProperties() { } else { mOptions[RSK_GANONS_BOSS_KEY].Enable(); } + if (CVarGetInteger("gRandomizeSilverRupeeShuffle", RO_SILVER_SHUFFLE_VANILLA) != RO_SILVER_SHUFFLE_VANILLA) { + mOptions[RSK_SHUFFLE_SILVER_RUPEES].RemoveFlag(IMFLAG_SEPARATOR_BOTTOM); + mOptions[RSK_MAGICAL_SILVER_RUPEE].Unhide(); + } else { + mOptions[RSK_SHUFFLE_SILVER_RUPEES].AddFlag(IMFLAG_SEPARATOR_BOTTOM); + mOptions[RSK_MAGICAL_SILVER_RUPEE].Hide(); + } mOptions[RSK_GANONS_BOSS_KEY].RemoveFlag(IMFLAG_SEPARATOR_BOTTOM); mOptions[RSK_LACS_OPTIONS].Hide(); mOptions[RSK_LACS_STONE_COUNT].Hide(); @@ -1774,6 +1784,11 @@ void Settings::FinalizeSettings(const std::set& excludedLocatio mOptions[RSK_GANONS_BOSS_KEY].SetSelectedIndex(RO_GANON_BOSS_KEY_TRIFORCE_HUNT); } + // Force Magical Silver Rupee off if Silver Rupee Shuffle is off. + if (mOptions[RSK_SHUFFLE_SILVER_RUPEES].Is(RO_SILVER_SHUFFLE_VANILLA)) { + mOptions[RSK_MAGICAL_SILVER_RUPEE].SetSelectedIndex(RO_GENERIC_OFF); + } + // Force 100 GS Shuffle if that's where Ganon's Boss Key is if (mOptions[RSK_GANONS_BOSS_KEY].Is(RO_GANON_BOSS_KEY_KAK_TOKENS)) { mOptions[RSK_SHUFFLE_100_GS_REWARD].SetSelectedIndex(1); diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index 7055a95688d..8db7bdce519 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -2700,6 +2700,11 @@ u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { return Return_Item_Entry(giEntry, RG_NONE); } + if (item == RG_MAGICAL_SILVER_RUPEE) { + Flags_SetRandomizerInf(RAND_INF_MAGICAL_SILVER_RUPEE); + return Return_Item_Entry(giEntry, RG_NONE); + } + temp = gSaveContext.inventory.items[slot]; osSyncPrintf("Item_Register(%d)=%d %d\n", slot, item, temp); INV_CONTENT(item) = item; From 6cb373da1a5724b40c96e3382af1ff3c27732c39 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Tue, 19 Mar 2024 19:28:47 -0400 Subject: [PATCH 019/108] Makes the Own Dungeon, Any Dungeon, and Overworld options work. --- .../Enhancements/randomizer/3drando/fill.cpp | 13 +++ soh/soh/Enhancements/randomizer/dungeon.cpp | 88 +++++++++++++++---- soh/soh/Enhancements/randomizer/dungeon.h | 14 ++- 3 files changed, 94 insertions(+), 21 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/fill.cpp b/soh/soh/Enhancements/randomizer/3drando/fill.cpp index 7f424f758f5..b49609a5c55 100644 --- a/soh/soh/Enhancements/randomizer/3drando/fill.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/fill.cpp @@ -863,6 +863,11 @@ static void RandomizeOwnDungeon(const Rando::DungeonInfo* dungeon) { AddElementsToPool(dungeonItems, dungeonBossKey); } + if ((ctx->GetOption(RSK_SHUFFLE_SILVER_RUPEES).Is(RO_SILVER_SHUFFLE_OWN_DUNGEON) && dungeon->HasSilverRupees())) { + auto silverRupees = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i){ return dungeon->ContainsSilverRupee(i); }); + AddElementsToPool(dungeonItems, silverRupees); + } + //randomize boss key and small keys together for even distribution AssumedFill(dungeonItems, dungeonLocations); @@ -916,6 +921,14 @@ static void RandomizeDungeonItems() { auto ganonBossKey = FilterAndEraseFromPool(ItemPool, [](const auto i) { return i == RG_GANONS_CASTLE_BOSS_KEY; }); AddElementsToPool(overworldItems, ganonBossKey); } + + if (ctx->GetOption(RSK_SHUFFLE_SILVER_RUPEES).Is(RO_SILVER_SHUFFLE_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_SILVER_SHUFFLE_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/dungeon.cpp b/soh/soh/Enhancements/randomizer/dungeon.cpp index c15c3d2e709..5ed2fce1995 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/dungeon.cpp @@ -6,12 +6,15 @@ namespace Rando { DungeonInfo::DungeonInfo(std::string name_, const RandomizerHintTextKey hintKey_, const RandomizerGet map_, - const RandomizerGet compass_, const RandomizerGet smallKey_, const RandomizerGet keyRing_, - const RandomizerGet bossKey_, RandomizerArea area_, const uint8_t vanillaKeyCount_, const uint8_t mqKeyCount_, - std::vector vanillaLocations_, std::vector mqLocations_, - std::vector sharedLocations_, std::vector bossRoomLocations_) + const RandomizerGet compass_, const RandomizerGet smallKey_, const RandomizerGet keyRing_, + const RandomizerGet bossKey_, std::unordered_set vanillaSilverRupees_, + std::unordered_set mqSilverRupees_, RandomizerArea area_, + const uint8_t vanillaKeyCount_, const uint8_t mqKeyCount_, + std::vector vanillaLocations_, std::vector mqLocations_, + std::vector sharedLocations_, std::vector bossRoomLocations_) : name(std::move(name_)), hintKey(hintKey_), map(map_), compass(compass_), smallKey(smallKey_), keyRing(keyRing_), - bossKey(bossKey_), area(area_), vanillaKeyCount(vanillaKeyCount_), mqKeyCount(mqKeyCount_), + bossKey(bossKey_), vanillaSilverRupees(std::move(vanillaSilverRupees_)), mqSilverRupees(std::move(mqSilverRupees_)), + area(area_), vanillaKeyCount(vanillaKeyCount_), mqKeyCount(mqKeyCount_), vanillaLocations(std::move(vanillaLocations_)), mqLocations(std::move(mqLocations_)), sharedLocations(std::move(sharedLocations_)), bossRoomLocations(std::move(bossRoomLocations_)) { } @@ -51,6 +54,20 @@ bool DungeonInfo::IsVanilla() const { return !masterQuest; } +bool DungeonInfo::ContainsSilverRupee(RandomizerGet rg) const { + if (masterQuest) { + return mqSilverRupees.contains(rg); + } + return vanillaSilverRupees.contains(rg); +} + +bool DungeonInfo::HasSilverRupees() const { + if (masterQuest) { + return !mqSilverRupees.empty(); + } + return !vanillaSilverRupees.empty(); +} + uint8_t DungeonInfo::GetSmallKeyCount() const { return masterQuest ? mqKeyCount : vanillaKeyCount; } @@ -152,7 +169,7 @@ std::vector DungeonInfo::GetEveryLocation() const { 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, + 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, { // Vanilla Locations RC_DEKU_TREE_MAP_CHEST, @@ -188,7 +205,7 @@ Dungeons::Dungeons() { RC_QUEEN_GOHMA, }); dungeonList[DODONGOS_CAVERN] = DungeonInfo("Dodongo's Cavern", RHT_DODONGOS_CAVERN, RG_DODONGOS_CAVERN_MAP, - RG_DODONGOS_CAVERN_COMPASS, RG_NONE, RG_NONE, RG_NONE, RA_DODONGOS_CAVERN, 0, 0, + RG_DODONGOS_CAVERN_COMPASS, RG_NONE, RG_NONE, RG_NONE, {}, {RG_DODONGOS_CAVERN_MQ_SILVER_RUPEE}, RA_DODONGOS_CAVERN, 0, 0, { // Vanilla Locations RC_DODONGOS_CAVERN_MAP_CHEST, @@ -237,7 +254,7 @@ Dungeons::Dungeons() { RC_KING_DODONGO, }); dungeonList[JABU_JABUS_BELLY] = DungeonInfo("Jabu Jabu's Belly", RHT_JABU_JABUS_BELLY, RG_JABU_JABUS_BELLY_MAP, - RG_JABU_JABUS_BELLY_COMPASS, RG_NONE, RG_NONE, RG_NONE, RA_JABU_JABUS_BELLY, 0, 0, + RG_JABU_JABUS_BELLY_COMPASS, RG_NONE, RG_NONE, RG_NONE, {}, {}, RA_JABU_JABUS_BELLY, 0, 0, { // Vanilla Locations RC_JABU_JABUS_BELLY_MAP_CHEST, @@ -276,7 +293,7 @@ Dungeons::Dungeons() { }); dungeonList[FOREST_TEMPLE] = DungeonInfo("Forest Temple", RHT_FOREST_TEMPLE, RG_FOREST_TEMPLE_MAP, RG_FOREST_TEMPLE_COMPASS, - RG_FOREST_TEMPLE_SMALL_KEY, RG_FOREST_TEMPLE_KEY_RING, RG_FOREST_TEMPLE_BOSS_KEY, RA_FOREST_TEMPLE, 5, 6, + RG_FOREST_TEMPLE_SMALL_KEY, RG_FOREST_TEMPLE_KEY_RING, RG_FOREST_TEMPLE_BOSS_KEY, {}, {}, RA_FOREST_TEMPLE, 5, 6, { // Vanilla Locations RC_FOREST_TEMPLE_FIRST_ROOM_CHEST, @@ -326,7 +343,7 @@ Dungeons::Dungeons() { }); dungeonList[FIRE_TEMPLE] = DungeonInfo("Fire Temple", RHT_FIRE_TEMPLE, RG_FIRE_TEMPLE_MAP, RG_FIRE_TEMPLE_COMPASS, - RG_FIRE_TEMPLE_SMALL_KEY, RG_FIRE_TEMPLE_KEY_RING, RG_FIRE_TEMPLE_BOSS_KEY, RA_FIRE_TEMPLE, 8, 5, + RG_FIRE_TEMPLE_SMALL_KEY, RG_FIRE_TEMPLE_KEY_RING, RG_FIRE_TEMPLE_BOSS_KEY, {}, {}, RA_FIRE_TEMPLE, 8, 5, { // Vanilla Locations RC_FIRE_TEMPLE_NEAR_BOSS_CHEST, @@ -377,7 +394,7 @@ Dungeons::Dungeons() { }); dungeonList[WATER_TEMPLE] = DungeonInfo("Water Temple", RHT_WATER_TEMPLE, RG_WATER_TEMPLE_MAP, RG_WATER_TEMPLE_COMPASS, - RG_WATER_TEMPLE_SMALL_KEY, RG_WATER_TEMPLE_KEY_RING, RG_WATER_TEMPLE_BOSS_KEY, RA_WATER_TEMPLE, 6, 2, + RG_WATER_TEMPLE_SMALL_KEY, RG_WATER_TEMPLE_KEY_RING, RG_WATER_TEMPLE_BOSS_KEY, {}, {}, RA_WATER_TEMPLE, 6, 2, { // Vanilla Locations RC_WATER_TEMPLE_MAP_CHEST, @@ -418,7 +435,13 @@ Dungeons::Dungeons() { }); dungeonList[SPIRIT_TEMPLE] = DungeonInfo("Spirit Temple", RHT_SPIRIT_TEMPLE, RG_SPIRIT_TEMPLE_MAP, RG_SPIRIT_TEMPLE_COMPASS, - RG_SPIRIT_TEMPLE_SMALL_KEY, RG_SPIRIT_TEMPLE_KEY_RING, RG_SPIRIT_TEMPLE_BOSS_KEY, RA_SPIRIT_TEMPLE, 5, 7, + RG_SPIRIT_TEMPLE_SMALL_KEY, RG_SPIRIT_TEMPLE_KEY_RING, RG_SPIRIT_TEMPLE_BOSS_KEY, { + RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, + RG_SPIRIT_BOULDER_SILVER_RUPEE, + RG_SPIRIT_CHILD_GATE_SILVER_RUPEE, + }, { + RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE, + }, RA_SPIRIT_TEMPLE, 5, 7, { // Vanilla Locations RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, @@ -504,7 +527,16 @@ Dungeons::Dungeons() { }); dungeonList[SHADOW_TEMPLE] = DungeonInfo("Shadow Temple", RHT_SHADOW_TEMPLE, RG_SHADOW_TEMPLE_MAP, RG_SHADOW_TEMPLE_COMPASS, - RG_SHADOW_TEMPLE_SMALL_KEY, RG_SHADOW_TEMPLE_KEY_RING, RG_SHADOW_TEMPLE_BOSS_KEY, RA_SHADOW_TEMPLE, 5, 6, + RG_SHADOW_TEMPLE_SMALL_KEY, RG_SHADOW_TEMPLE_KEY_RING, RG_SHADOW_TEMPLE_BOSS_KEY, { + RG_SHADOW_SCYTHE_SILVER_RUPEE, + RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, + RG_SHADOW_INVISIBLE_SPIKES_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, + }, RA_SHADOW_TEMPLE, 5, 6, { // Vanilla Locations RC_SHADOW_TEMPLE_MAP_CHEST, @@ -611,7 +643,9 @@ Dungeons::Dungeons() { }); dungeonList[BOTTOM_OF_THE_WELL] = DungeonInfo( "Bottom of the Well", RHT_BOTTOM_OF_THE_WELL, RG_BOTTOM_OF_THE_WELL_MAP, RG_BOTTOM_OF_THE_WELL_COMPASS, - RG_BOTTOM_OF_THE_WELL_SMALL_KEY, RG_BOTTOM_OF_THE_WELL_KEY_RING, RG_NONE, RA_BOTTOM_OF_THE_WELL, 3, 2, + RG_BOTTOM_OF_THE_WELL_SMALL_KEY, RG_BOTTOM_OF_THE_WELL_KEY_RING, RG_NONE, { + RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, + }, {}, RA_BOTTOM_OF_THE_WELL, 3, 2, { // Vanilla Locations RC_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, @@ -650,7 +684,10 @@ Dungeons::Dungeons() { }, {}, {}); dungeonList[ICE_CAVERN] = DungeonInfo("Ice Cavern", RHT_ICE_CAVERN, RG_ICE_CAVERN_MAP, RG_ICE_CAVERN_COMPASS, - RG_NONE, RG_NONE, RG_NONE, RA_ICE_CAVERN, 0, 0, + RG_NONE, RG_NONE, RG_NONE,{ + RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, + RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, + }, {}, RA_ICE_CAVERN, 0, 0, { // Vanilla Locations RC_ICE_CAVERN_MAP_CHEST, @@ -688,7 +725,15 @@ Dungeons::Dungeons() { {}); dungeonList[GERUDO_TRAINING_GROUNDS] = DungeonInfo("Gerudo Training Grounds", RHT_GERUDO_TRAINING_GROUND, RG_NONE, RG_NONE, - RG_GERUDO_TRAINING_GROUNDS_SMALL_KEY, RG_GERUDO_TRAINING_GROUNDS_KEY_RING, RG_NONE, RA_GERUDO_TRAINING_GROUND, 9, 3, + RG_GERUDO_TRAINING_GROUNDS_SMALL_KEY, RG_GERUDO_TRAINING_GROUNDS_KEY_RING, RG_NONE, { + RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, + RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, + RG_GERUDO_TRAINING_GROUNDS_TOILET_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, + }, RA_GERUDO_TRAINING_GROUND, 9, 3, { // Vanilla Locations RC_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST, @@ -766,7 +811,16 @@ Dungeons::Dungeons() { {}, {}); dungeonList[GANONS_CASTLE] = DungeonInfo("Ganon's Castle", RHT_GANONS_CASTLE, RG_NONE, RG_NONE, RG_GANONS_CASTLE_SMALL_KEY, - RG_GANONS_CASTLE_KEY_RING, RG_GANONS_CASTLE_BOSS_KEY, RA_GANONS_CASTLE, 2, 3, + RG_GANONS_CASTLE_KEY_RING, RG_GANONS_CASTLE_BOSS_KEY, { + RG_FOREST_TRIAL_SILVER_RUPEE, + RG_FIRE_TRIAL_SILVER_RUPEE, + RG_SPIRIT_TRIAL_SILVER_RUPEE, + RG_LIGHT_TRIAL_SILVER_RUPEE, + }, { + RG_FIRE_TRIAL_MQ_SILVER_RUPEE, + RG_WATER_TRIAL_MQ_SILVER_RUPEE, + RG_SHADOW_TRIAL_MQ_SILVER_RUPEE, + }, RA_GANONS_CASTLE, 2, 3, { // Vanilla Locations RC_GANONS_CASTLE_FOREST_TRIAL_CHEST, diff --git a/soh/soh/Enhancements/randomizer/dungeon.h b/soh/soh/Enhancements/randomizer/dungeon.h index a2338441dc7..7a470ea5400 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.h +++ b/soh/soh/Enhancements/randomizer/dungeon.h @@ -6,15 +6,17 @@ #include #include #include "nlohmann/json.hpp" +#include namespace Rando { class DungeonInfo { public: DungeonInfo(std::string name_, RandomizerHintTextKey hintKey_, RandomizerGet map_, RandomizerGet compass_, - RandomizerGet smallKey_, RandomizerGet keyRing_, RandomizerGet bossKey_, RandomizerArea area_, - uint8_t vanillaKeyCount_, uint8_t mqKeyCount_, std::vector vanillaLocations_, - std::vector mqLocations_, std::vector sharedLocations_, - std::vector bossRoomLocations_); + RandomizerGet smallKey_, RandomizerGet keyRing_, RandomizerGet bossKey_, + std::unordered_set vanillaSilverRupees_, std::unordered_set mqSilverRupees_, + RandomizerArea area_, uint8_t vanillaKeyCount_, uint8_t mqKeyCount_, + std::vector vanillaLocations_, std::vector mqLocations_, + std::vector sharedLocations_, std::vector bossRoomLocations_); DungeonInfo(); ~DungeonInfo(); @@ -26,6 +28,8 @@ class DungeonInfo { void ClearKeyRing(); bool HasKeyRing() const; bool IsVanilla() const; + bool ContainsSilverRupee(RandomizerGet rg) const; + bool HasSilverRupees() const; uint8_t GetSmallKeyCount() const; RandomizerHintTextKey GetHintKey() const; RandomizerArea GetArea() const; @@ -50,6 +54,8 @@ class DungeonInfo { RandomizerGet smallKey; RandomizerGet keyRing; RandomizerGet bossKey; + std::unordered_set vanillaSilverRupees; + std::unordered_set mqSilverRupees; uint8_t vanillaKeyCount{}; uint8_t mqKeyCount{}; bool masterQuest = false; From ddc7d1afb602aa99737e6726b7a89a348c394627 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Fri, 29 Mar 2024 19:55:49 -0400 Subject: [PATCH 020/108] Adds Master Quest Silver Rupee location data. --- .../Enhancements/randomizer/silver_rupee.cpp | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/silver_rupee.cpp b/soh/soh/Enhancements/randomizer/silver_rupee.cpp index 1a8c3633c07..d4f0c8491ef 100644 --- a/soh/soh/Enhancements/randomizer/silver_rupee.cpp +++ b/soh/soh/Enhancements/randomizer/silver_rupee.cpp @@ -22,6 +22,19 @@ namespace Rando { { { 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 }, }; std::unordered_map StaticData::silverRupeeMap = { @@ -105,6 +118,76 @@ namespace Rando { { { SCENE_INSIDE_GANONS_CASTLE, { -2646.0f, -120.0f, -839.0f } }, RC_LIGHT_TRIAL_SILVER_RUPEE_3 }, { { SCENE_INSIDE_GANONS_CASTLE, { -2649.0f, -240.0f, -545.0f } }, RC_LIGHT_TRIAL_SILVER_RUPEE_4 }, { { SCENE_INSIDE_GANONS_CASTLE, { -2509.0f, -240.0f, -1091.0f } }, RC_LIGHT_TRIAL_SILVER_RUPEE_5 }, + // MQ + { { SCENE_GERUDO_TRAINING_GROUND, { -1261.0f, -112.0f, -923.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_1 }, + { { SCENE_GERUDO_TRAINING_GROUND, { -1886.0f, -80.0f, -956.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_2 }, + { { SCENE_GERUDO_TRAINING_GROUND, { -1480.0f, 200.0f, -1000.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_3 }, + { { SCENE_GERUDO_TRAINING_GROUND, { -1542.0f, 53.0f, -1476.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_4 }, + { { SCENE_GERUDO_TRAINING_GROUND, { -1245.0f, 160.0f, -2112.0f } }, RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_5 }, + { { SCENE_GERUDO_TRAINING_GROUND, { 1317.0f, -239.0f, -1243.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_1 }, + { { SCENE_GERUDO_TRAINING_GROUND, { 1083.0f, -239.0f, -1374.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_2 }, + { { SCENE_GERUDO_TRAINING_GROUND, { 1560.0f, -239.0f, -1380.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_3 }, + { { SCENE_GERUDO_TRAINING_GROUND, { 1404.0f, -239.0f, -1653.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_4 }, + { { SCENE_GERUDO_TRAINING_GROUND, { 1134.0f, -239.0f, -1841.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_5 }, + { { SCENE_GERUDO_TRAINING_GROUND, { 1560.0f, -239.0f, -1861.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_6 }, + { { SCENE_GERUDO_TRAINING_GROUND, { 2160.0f, -900.0f, -1315.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE_1 }, + { { SCENE_GERUDO_TRAINING_GROUND, { 2302.0f, -797.0f, -1464.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE_2 }, + { { SCENE_GERUDO_TRAINING_GROUND, { 2453.0f, -890.0f, -1612.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE_3 }, + { { SCENE_DODONGOS_CAVERN, { -1512.0f, 531.0f, -1083.0f } }, RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_1 }, + { { SCENE_DODONGOS_CAVERN, { -1907.0f, 627.0f, -1243.0f } }, RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_2 }, + { { SCENE_DODONGOS_CAVERN, { -2411.0f, 380.0f, -1836.0f } }, RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_3 }, + { { SCENE_DODONGOS_CAVERN, { -2189.0f, 0.0f, -1834.0f } }, RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_4 }, + { { SCENE_DODONGOS_CAVERN, { -2277.0f, 0.0f, -1362.0f } }, RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_5 }, + { { SCENE_SHADOW_TEMPLE, { 3558.0f, -543.0f, -1490.0f } }, RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_1 }, + { { SCENE_SHADOW_TEMPLE, { 3399.0f, -543.0f, -838.0f } }, RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_2 }, + { { SCENE_SHADOW_TEMPLE, { 3243.0f, -543.0f, -1061.0f } }, RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_3 }, + { { SCENE_SHADOW_TEMPLE, { 3007.0f, -423.0f, -1222.0f } }, RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_4 }, + { { SCENE_SHADOW_TEMPLE, { 2810.0f, -543.0f, -961.0f } }, RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_5 }, + { { SCENE_SHADOW_TEMPLE, { 5667.0f, -1043.0f, 2686.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_1 }, + { { SCENE_SHADOW_TEMPLE, { 5637.0f, -1143.0f, 2134.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_2 }, + { { SCENE_SHADOW_TEMPLE, { 5601.0f, -1143.0f, 1898.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_3 }, + { { SCENE_SHADOW_TEMPLE, { 5489.0f, -1143.0f, 2476.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_4 }, + { { SCENE_SHADOW_TEMPLE, { 5466.0f, -1143.0f, 2234.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_5 }, + { { SCENE_SHADOW_TEMPLE, { 5404.0f, -1143.0f, 1977.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_6 }, + { { SCENE_SHADOW_TEMPLE, { 5270.0f, -1143.0f, 2453.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_7 }, + { { SCENE_SHADOW_TEMPLE, { 5217.0f, -1143.0f, 1852.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_8 }, + { { SCENE_SHADOW_TEMPLE, { 5158.0f, -1143.0f, 2315.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_9 }, + { { SCENE_SHADOW_TEMPLE, { 5089.0f, -1143.0f, 2049.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_10 }, + { { SCENE_SHADOW_TEMPLE, { 2250.0f, -1343.0f, 3372.0f } }, RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_1 }, + { { SCENE_SHADOW_TEMPLE, { 2131.0f, -1343.0f, 3030.0f } }, RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_2 }, + { { SCENE_SHADOW_TEMPLE, { 2110.0f, -970.0f, 3372.0f } }, RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_3 }, + { { SCENE_SHADOW_TEMPLE, { 2110.0f, -1092.0f, 3372.0f } }, RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_4 }, + { { SCENE_SHADOW_TEMPLE, { 1970.0f, -1343.0f, 3372.0f } }, RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_5 }, + { { SCENE_SHADOW_TEMPLE, { 2940.0f, -1265.0f, 1069.0f } }, RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_1 }, + { { SCENE_SHADOW_TEMPLE, { 2730.0f, -1203.0f, 876.0f } }, RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_2 }, + { { SCENE_SHADOW_TEMPLE, { 2705.0f, -1329.0f, 1089.0f } }, RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_3 }, + { { SCENE_SHADOW_TEMPLE, { 2478.0f, -1100.0f, 1404.0f } }, RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_4 }, + { { SCENE_SHADOW_TEMPLE, { 2478.0f, -1100.0f, 1200.0f } }, RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_5 }, + { { SCENE_SHADOW_TEMPLE, { 2478.0f, -1343.0f, 1208.0f } }, RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_6 }, + { { SCENE_SHADOW_TEMPLE, { 2478.0f, -975.0f, 893.0f } }, RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_7 }, + { { SCENE_SHADOW_TEMPLE, { 2254.0f, -1203.0f, 988.0f } }, RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_8 }, + { { SCENE_SHADOW_TEMPLE, { 2135.0f, -1225.0f, 1297.0f } }, RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_9 }, + { { SCENE_SHADOW_TEMPLE, { 2042.0f, -1203.0f, 849.0f } }, RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_10 }, + { { SCENE_SPIRIT_TEMPLE, { 744.0f, -50.0f, 4.0f } }, RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_1 }, + { { SCENE_SPIRIT_TEMPLE, { 967.0f, 0.0f, -547.0f } }, RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_2 }, + { { SCENE_SPIRIT_TEMPLE, { -160.0f, -150.0f, 270.0f } }, RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_3 }, + { { SCENE_SPIRIT_TEMPLE, { 160.0f, -150.0f, 268.0f } }, RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_4 }, + { { SCENE_SPIRIT_TEMPLE, { 1016.0f, -50.0f, -73.0f } }, RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_5 }, + { { SCENE_INSIDE_GANONS_CASTLE, { 2905.0f, -320.0f, -1263.0f } }, RC_WATER_TRIAL_MQ_SILVER_RUPEE_1 }, + { { SCENE_INSIDE_GANONS_CASTLE, { 3253.0f, -314.0f, -649.0f } }, RC_WATER_TRIAL_MQ_SILVER_RUPEE_2 }, + { { SCENE_INSIDE_GANONS_CASTLE, { 2905.0f, -120.0f, -1478.0f } }, RC_WATER_TRIAL_MQ_SILVER_RUPEE_3 }, + { { SCENE_INSIDE_GANONS_CASTLE, { 2912.0f, -219.0f, -971.0f } }, RC_WATER_TRIAL_MQ_SILVER_RUPEE_4 }, + { { SCENE_INSIDE_GANONS_CASTLE, { 2757.0f, -420.0f, -765.0f } }, RC_WATER_TRIAL_MQ_SILVER_RUPEE_5 }, + { { SCENE_INSIDE_GANONS_CASTLE, { 1100.0f, 150.0f, -2554.0f } }, RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_1 }, + { { SCENE_INSIDE_GANONS_CASTLE, { 1829.0f, 152.0f, -4071.0f } }, RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_2 }, + { { SCENE_INSIDE_GANONS_CASTLE, { 1529.0f, 150.0f, -4117.0f } }, RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_3 }, + { { SCENE_INSIDE_GANONS_CASTLE, { 1279.0f, 150.0f, -3111.0f } }, RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_4 }, + { { SCENE_INSIDE_GANONS_CASTLE, { 1322.0f, 150.0f, -2262.0f } }, RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_5 }, + { { SCENE_INSIDE_GANONS_CASTLE, { -1655.0f, 120.0f, -2133.0f } }, RC_FIRE_TRIAL_MQ_SILVER_RUPEE_1 }, + { { SCENE_INSIDE_GANONS_CASTLE, { -686.0f, 640.0f, -2945.0f } }, RC_FIRE_TRIAL_MQ_SILVER_RUPEE_2 }, + { { SCENE_INSIDE_GANONS_CASTLE, { -2044.0f, 244.0f, -3354.0f } }, RC_FIRE_TRIAL_MQ_SILVER_RUPEE_3 }, + { { SCENE_INSIDE_GANONS_CASTLE, { -1891.0f, 222.0f, -2753.0f } }, RC_FIRE_TRIAL_MQ_SILVER_RUPEE_4 }, + { { SCENE_INSIDE_GANONS_CASTLE, { -970.0f, 152.0f, -3747.0f } }, RC_FIRE_TRIAL_MQ_SILVER_RUPEE_5 }, }; std::unordered_map SilverRupees::mSilverRupeeRoomNames = { // TODO: Translate From 38be38d736ec247b9b9c2a08e357cb54206bcdaa Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Fri, 29 Mar 2024 20:14:12 -0400 Subject: [PATCH 021/108] Adds RCQUEST to the Position struct --- soh/soh/Enhancements/mods.cpp | 2 +- .../Enhancements/randomizer/silver_rupee.cpp | 307 +++++++++--------- soh/soh/Enhancements/randomizer/static_data.h | 1 + 3 files changed, 159 insertions(+), 151 deletions(-) diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index d33607ee667..9091dbab278 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -1194,7 +1194,7 @@ void RegisterSilverRupeeShuffle() { if (actor->id == ACTOR_EN_G_SWITCH) { auto* silverRupee = reinterpret_cast(actor); if (silverRupee->type == ENGSWITCH_SILVER_RUPEE) { - Rando::Position randoPos = {static_cast(gPlayState->sceneNum), actor->world.pos}; + Rando::Position randoPos = {static_cast(gPlayState->sceneNum), ResourceMgr_IsSceneMasterQuest(gPlayState->sceneNum) ? RCQUEST_MQ : RCQUEST_VANILLA, actor->world.pos}; silverRupee->rc = Rando::StaticData::silverRupeeMap.at(randoPos); Rando::Location* loc = Rando::StaticData::GetLocation(silverRupee->rc); silverRupee->randInfFlag = static_cast(loc->GetCollectionCheck().flag); diff --git a/soh/soh/Enhancements/randomizer/silver_rupee.cpp b/soh/soh/Enhancements/randomizer/silver_rupee.cpp index d4f0c8491ef..84032a55d8d 100644 --- a/soh/soh/Enhancements/randomizer/silver_rupee.cpp +++ b/soh/soh/Enhancements/randomizer/silver_rupee.cpp @@ -38,156 +38,156 @@ namespace Rando { }; std::unordered_map StaticData::silverRupeeMap = { - { { SCENE_ICE_CAVERN, {414.0f, 178.0f, -579.0f} }, RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_1 }, - { { SCENE_ICE_CAVERN, {389.0f, 0.0f, -382.0f } }, RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_2 }, - { { SCENE_ICE_CAVERN, {278.0f, 0.0f, -637.0f } }, RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_3 }, - { { SCENE_ICE_CAVERN, { 198.0f, 0.0f, -388.0f } }, RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_4 }, - { { SCENE_ICE_CAVERN, { 1.0f, 0.0f, -143.0f } }, RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_5 }, - { { SCENE_ICE_CAVERN, { -1040.0f, 112.0f, -485.0f } }, RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_1 }, - { { SCENE_ICE_CAVERN, { -1120.0f, 119.0f, -1577.0f } }, RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_2 }, - { { SCENE_ICE_CAVERN, { -1294.0f, 113.0f, -899.0f } }, RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_3 }, - { { SCENE_ICE_CAVERN, { -1558.0f, 41.0f, -951.0f } }, RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_4 }, - { { SCENE_ICE_CAVERN, { -1676.0f, 112.0f, -552.0f } }, RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_5 }, - { { SCENE_BOTTOM_OF_THE_WELL, { -259.0f, -708.0f, -234.0f } }, RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_1 }, - { { SCENE_BOTTOM_OF_THE_WELL, { -402.0f, -701.0f, -401.0f } }, RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_2 }, - { { SCENE_BOTTOM_OF_THE_WELL, { -560.0f, -720.0f, -291.0f } }, RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_3 }, - { { SCENE_BOTTOM_OF_THE_WELL, { -614.0f, -465.0f, -297.0f } }, RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_4 }, - { { SCENE_BOTTOM_OF_THE_WELL, { -796.0f, 0.0f, -150.0f } }, RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_5 }, - { { SCENE_GERUDO_TRAINING_GROUND, { -1887.0f, 160.0f, -2134.0f } }, RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_1 }, - { { SCENE_GERUDO_TRAINING_GROUND, { -1627.0f, 182.0f, -1462.0f } }, RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_2 }, - { { SCENE_GERUDO_TRAINING_GROUND, { -1579.0f, 236.0f, -999.0f } }, RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_3 }, - { { SCENE_GERUDO_TRAINING_GROUND, { -1886.0f, -80.0f, -956.0f } }, RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_4 }, - { { SCENE_GERUDO_TRAINING_GROUND, { -1332.0f, -80.0f, -992.0f } }, RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_5 }, - { { SCENE_GERUDO_TRAINING_GROUND, { 1560.0f, -239.0f, -1861.0f } }, RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_1 }, - { { SCENE_GERUDO_TRAINING_GROUND, { 1437.0f, 30.0f, -2193.0f } }, RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_2 }, - { { SCENE_GERUDO_TRAINING_GROUND, { 1134.0f, -239.0f, -1841.0f } }, RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_3 }, - { { SCENE_GERUDO_TRAINING_GROUND, { 1558.0f, -239.0f, -1370.0f } }, RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_4 }, - { { SCENE_GERUDO_TRAINING_GROUND, { 1320.0f, -239.0f, -1248.0f } }, RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_5 }, - { { SCENE_GERUDO_TRAINING_GROUND, { 2160.0f, -900.0f, -1315.0f } }, RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_1 }, - { { SCENE_GERUDO_TRAINING_GROUND, { 2078.0f, -806.0f, -1458.0f } }, RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_2 }, - { { SCENE_GERUDO_TRAINING_GROUND, { 2453.0f, -890.0f, -1612.0f } }, RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_3 }, - { { SCENE_GERUDO_TRAINING_GROUND, { 2497.0f, -605.0f, -1465.0f } }, RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_4 }, - { { SCENE_GERUDO_TRAINING_GROUND, { 2308.0f, -961.0f, -1464.0f } }, RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_5 }, - { { SCENE_SPIRIT_TEMPLE, { -335.0f, 30.0f, -1409.0f } }, RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_1 }, - { { SCENE_SPIRIT_TEMPLE, { -347.0f, 229.0f, -1075.0f } }, RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_2 }, - { { SCENE_SPIRIT_TEMPLE, { -511.0f, 50.0f, -1075.0f } }, RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_3 }, - { { SCENE_SPIRIT_TEMPLE, { -672.0f, 50.0f, -1075.0f } }, RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_4 }, - { { SCENE_SPIRIT_TEMPLE, { -766.0f, 229.0f, -1075.0f } }, RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_5 }, - { { SCENE_SPIRIT_TEMPLE, { -984.0f, 923.0f, -450.0f } }, RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_1 }, - { { SCENE_SPIRIT_TEMPLE, { -1123.0f, 923.0f, 428.0f } }, RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_2 }, - { { SCENE_SPIRIT_TEMPLE, { -1275.0f, 922.0f, -247.0f } }, RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_3 }, - { { SCENE_SPIRIT_TEMPLE, { -1433.0f, 913.0f, -283.0f } }, RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_4 }, - { { SCENE_SPIRIT_TEMPLE, { -1836.0f, 923.0f, -446.0f } }, RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_5 }, - { { SCENE_SPIRIT_TEMPLE, { 1573.0f, -33.0f, -920.0f } }, RC_SPIRIT_BOULDER_SILVER_RUPEE_1 }, - { { SCENE_SPIRIT_TEMPLE, { 1856.0f, -33.0f, -1219.0f } }, RC_SPIRIT_BOULDER_SILVER_RUPEE_2 }, - { { SCENE_SPIRIT_TEMPLE, { 1856.0f, -33.0f, -944.0f } }, RC_SPIRIT_BOULDER_SILVER_RUPEE_3 }, - { { SCENE_SPIRIT_TEMPLE, { 1284.0f, -33.0f, -813.0f } }, RC_SPIRIT_BOULDER_SILVER_RUPEE_4 }, - { { SCENE_SPIRIT_TEMPLE, { 1284.0f, -33.0f, -1355.0f } }, RC_SPIRIT_BOULDER_SILVER_RUPEE_5 }, - { { SCENE_SHADOW_TEMPLE, { 3399.0f, -543.0f, -838.0f } }, RC_SHADOW_SCYTHE_SILVER_RUPEE_1 }, - { { SCENE_SHADOW_TEMPLE, { 2869.0f, -543.0f, -948.0f } }, RC_SHADOW_SCYTHE_SILVER_RUPEE_2 }, - { { SCENE_SHADOW_TEMPLE, { 3554.0f, -543.0f, -1432.0f } }, RC_SHADOW_SCYTHE_SILVER_RUPEE_3 }, - { { SCENE_SHADOW_TEMPLE, { 3007.0f, -423.0f, -1222.0f } }, RC_SHADOW_SCYTHE_SILVER_RUPEE_4 }, - { { SCENE_SHADOW_TEMPLE, { 3243.0f, -543.0f, -1061.0f } }, RC_SHADOW_SCYTHE_SILVER_RUPEE_5 }, - { { SCENE_SHADOW_TEMPLE, { 1998.0f, -1343.0f, 3358.0f } }, RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_1 }, - { { SCENE_SHADOW_TEMPLE, { 2243.0f, -1343.0f, 3361.0f } }, RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_2 }, - { { SCENE_SHADOW_TEMPLE, { 2110.0f, -1343.0f, 3368.0f } }, RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_3 }, - { { SCENE_SHADOW_TEMPLE, { 2115.0f, -1343.0f, 3738.0f } }, RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_4 }, - { { SCENE_SHADOW_TEMPLE, { 2131.0f, -1343.0f, 3030.0f } }, RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_5 }, - { { SCENE_SHADOW_TEMPLE, { 2254.0f, -1197.0f, 988.0f } }, RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_1 }, - { { SCENE_SHADOW_TEMPLE, { 2135.0f, -1225.0f, 1297.0f } }, RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_2 }, - { { SCENE_SHADOW_TEMPLE, { 2478.0f, -1343.0f, 1208.0f } }, RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_3 }, - { { SCENE_SHADOW_TEMPLE, { 2940.0f, -1268.0f, 1069.0f } }, RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_4 }, - { { SCENE_SHADOW_TEMPLE, { 2042.0f, -1203.0f, 849.0f } }, RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_5 }, - { { SCENE_INSIDE_GANONS_CASTLE, { 1634.0f, 164.0f, 1550.0f } }, RC_FOREST_TRIAL_SILVER_RUPEE_1 }, - { { SCENE_INSIDE_GANONS_CASTLE, { 1651.0f, 30.0f, 2021.0f } }, RC_FOREST_TRIAL_SILVER_RUPEE_2 }, - { { SCENE_INSIDE_GANONS_CASTLE, { 1538.0f, 118.0f, 2225.0f } }, RC_FOREST_TRIAL_SILVER_RUPEE_3 }, - { { SCENE_INSIDE_GANONS_CASTLE, { 1361.0f, 115.0f, 1222.0f } }, RC_FOREST_TRIAL_SILVER_RUPEE_4 }, - { { SCENE_INSIDE_GANONS_CASTLE, { 1247.0f, 59.0f, 1787.0f } }, RC_FOREST_TRIAL_SILVER_RUPEE_5 }, - { { SCENE_INSIDE_GANONS_CASTLE, { -1867.0f, 227.0f, -2754.0f } }, RC_FIRE_TRIAL_SILVER_RUPEE_1 }, - { { SCENE_INSIDE_GANONS_CASTLE, { -604.0f, 133.0f, -2592.0f } }, RC_FIRE_TRIAL_SILVER_RUPEE_2 }, - { { SCENE_INSIDE_GANONS_CASTLE, { -515.0f, 133.0f, -3253.0f } }, RC_FIRE_TRIAL_SILVER_RUPEE_3 }, - { { SCENE_INSIDE_GANONS_CASTLE, { -1555.0f, 151.0f, -2317.0f } }, RC_FIRE_TRIAL_SILVER_RUPEE_4 }, - { { SCENE_INSIDE_GANONS_CASTLE, { -854.0f, 152.0f, -3679.0f } }, RC_FIRE_TRIAL_SILVER_RUPEE_5 }, - { { SCENE_INSIDE_GANONS_CASTLE, { -1142.0f, 165.0f, 639.0f } }, RC_SPIRIT_TRIAL_SILVER_RUPEE_1 }, - { { SCENE_INSIDE_GANONS_CASTLE, { -725.0f, 165.0f, 942.0f } }, RC_SPIRIT_TRIAL_SILVER_RUPEE_2 }, - { { SCENE_INSIDE_GANONS_CASTLE, { -865.0f, 165.0f, 656.0f } }, RC_SPIRIT_TRIAL_SILVER_RUPEE_3 }, - { { SCENE_INSIDE_GANONS_CASTLE, { -940.0f, 165.0f, 270.0f } }, RC_SPIRIT_TRIAL_SILVER_RUPEE_4 }, - { { SCENE_INSIDE_GANONS_CASTLE, { -829.0f, 274.0f, 591.0f } }, RC_SPIRIT_TRIAL_SILVER_RUPEE_5 }, - { { SCENE_INSIDE_GANONS_CASTLE, { -2674.0f, -240.0f, -777.0f } }, RC_LIGHT_TRIAL_SILVER_RUPEE_1 }, - { { SCENE_INSIDE_GANONS_CASTLE, { -2680.0f, -240.0f, -893.0f } }, RC_LIGHT_TRIAL_SILVER_RUPEE_2 }, - { { SCENE_INSIDE_GANONS_CASTLE, { -2646.0f, -120.0f, -839.0f } }, RC_LIGHT_TRIAL_SILVER_RUPEE_3 }, - { { SCENE_INSIDE_GANONS_CASTLE, { -2649.0f, -240.0f, -545.0f } }, RC_LIGHT_TRIAL_SILVER_RUPEE_4 }, - { { SCENE_INSIDE_GANONS_CASTLE, { -2509.0f, -240.0f, -1091.0f } }, RC_LIGHT_TRIAL_SILVER_RUPEE_5 }, + { { SCENE_ICE_CAVERN, RCQUEST_VANILLA, {389.0f, 0.0f, -382.0f } }, RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_2 }, + { { SCENE_ICE_CAVERN, RCQUEST_VANILLA, {414.0f, 178.0f, -579.0f} }, RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_1 }, + { { SCENE_ICE_CAVERN, RCQUEST_VANILLA, {278.0f, 0.0f, -637.0f } }, RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_3 }, + { { SCENE_ICE_CAVERN, RCQUEST_VANILLA, { 198.0f, 0.0f, -388.0f } }, RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_4 }, + { { SCENE_ICE_CAVERN, RCQUEST_VANILLA, { 1.0f, 0.0f, -143.0f } }, RC_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_5 }, + { { SCENE_ICE_CAVERN, RCQUEST_VANILLA, { -1040.0f, 112.0f, -485.0f } }, RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_1 }, + { { SCENE_ICE_CAVERN, RCQUEST_VANILLA, { -1120.0f, 119.0f, -1577.0f } }, RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_2 }, + { { SCENE_ICE_CAVERN, RCQUEST_VANILLA, { -1294.0f, 113.0f, -899.0f } }, RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_3 }, + { { SCENE_ICE_CAVERN, RCQUEST_VANILLA, { -1558.0f, 41.0f, -951.0f } }, RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_4 }, + { { SCENE_ICE_CAVERN, RCQUEST_VANILLA, { -1676.0f, 112.0f, -552.0f } }, RC_ICE_CAVERN_SLIDING_SILVER_RUPEE_5 }, + { { SCENE_BOTTOM_OF_THE_WELL, RCQUEST_VANILLA, { -259.0f, -708.0f, -234.0f } }, RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_1 }, + { { SCENE_BOTTOM_OF_THE_WELL, RCQUEST_VANILLA, { -402.0f, -701.0f, -401.0f } }, RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_2 }, + { { SCENE_BOTTOM_OF_THE_WELL, RCQUEST_VANILLA, { -560.0f, -720.0f, -291.0f } }, RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_3 }, + { { SCENE_BOTTOM_OF_THE_WELL, RCQUEST_VANILLA, { -614.0f, -465.0f, -297.0f } }, RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_4 }, + { { SCENE_BOTTOM_OF_THE_WELL, RCQUEST_VANILLA, { -796.0f, 0.0f, -150.0f } }, RC_BOTTOM_OF_THE_WELL_SILVER_RUPEE_5 }, + { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_VANILLA, { -1887.0f, 160.0f, -2134.0f } }, RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_1 }, + { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_VANILLA, { -1627.0f, 182.0f, -1462.0f } }, RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_2 }, + { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_VANILLA, { -1579.0f, 236.0f, -999.0f } }, RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_3 }, + { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_VANILLA, { -1886.0f, -80.0f, -956.0f } }, RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_4 }, + { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_VANILLA, { -1332.0f, -80.0f, -992.0f } }, RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_5 }, + { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_VANILLA, { 1560.0f, -239.0f, -1861.0f } }, RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_1 }, + { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_VANILLA, { 1437.0f, 30.0f, -2193.0f } }, RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_2 }, + { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_VANILLA, { 1134.0f, -239.0f, -1841.0f } }, RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_3 }, + { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_VANILLA, { 1558.0f, -239.0f, -1370.0f } }, RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_4 }, + { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_VANILLA, { 1320.0f, -239.0f, -1248.0f } }, RC_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_5 }, + { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_VANILLA, { 2160.0f, -900.0f, -1315.0f } }, RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_1 }, + { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_VANILLA, { 2078.0f, -806.0f, -1458.0f } }, RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_2 }, + { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_VANILLA, { 2453.0f, -890.0f, -1612.0f } }, RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_3 }, + { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_VANILLA, { 2497.0f, -605.0f, -1465.0f } }, RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_4 }, + { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_VANILLA, { 2308.0f, -961.0f, -1464.0f } }, RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_5 }, + { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { -335.0f, 30.0f, -1409.0f } }, RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_1 }, + { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { -347.0f, 229.0f, -1075.0f } }, RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_2 }, + { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { -511.0f, 50.0f, -1075.0f } }, RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_3 }, + { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { -672.0f, 50.0f, -1075.0f } }, RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_4 }, + { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { -766.0f, 229.0f, -1075.0f } }, RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_5 }, + { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { -984.0f, 923.0f, -450.0f } }, RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_1 }, + { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { -1123.0f, 923.0f, 428.0f } }, RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_2 }, + { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { -1275.0f, 922.0f, -247.0f } }, RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_3 }, + { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { -1433.0f, 913.0f, -283.0f } }, RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_4 }, + { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { -1836.0f, 923.0f, -446.0f } }, RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_5 }, + { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { 1573.0f, -33.0f, -920.0f } }, RC_SPIRIT_BOULDER_SILVER_RUPEE_1 }, + { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { 1856.0f, -33.0f, -1219.0f } }, RC_SPIRIT_BOULDER_SILVER_RUPEE_2 }, + { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { 1856.0f, -33.0f, -944.0f } }, RC_SPIRIT_BOULDER_SILVER_RUPEE_3 }, + { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { 1284.0f, -33.0f, -813.0f } }, RC_SPIRIT_BOULDER_SILVER_RUPEE_4 }, + { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { 1284.0f, -33.0f, -1355.0f } }, RC_SPIRIT_BOULDER_SILVER_RUPEE_5 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_VANILLA, { 3399.0f, -543.0f, -838.0f } }, RC_SHADOW_SCYTHE_SILVER_RUPEE_1 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_VANILLA, { 2869.0f, -543.0f, -948.0f } }, RC_SHADOW_SCYTHE_SILVER_RUPEE_2 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_VANILLA, { 3554.0f, -543.0f, -1432.0f } }, RC_SHADOW_SCYTHE_SILVER_RUPEE_3 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_VANILLA, { 3007.0f, -423.0f, -1222.0f } }, RC_SHADOW_SCYTHE_SILVER_RUPEE_4 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_VANILLA, { 3243.0f, -543.0f, -1061.0f } }, RC_SHADOW_SCYTHE_SILVER_RUPEE_5 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_VANILLA, { 1998.0f, -1343.0f, 3358.0f } }, RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_1 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_VANILLA, { 2243.0f, -1343.0f, 3361.0f } }, RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_2 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_VANILLA, { 2110.0f, -1343.0f, 3368.0f } }, RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_3 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_VANILLA, { 2115.0f, -1343.0f, 3738.0f } }, RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_4 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_VANILLA, { 2131.0f, -1343.0f, 3030.0f } }, RC_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_5 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_VANILLA, { 2254.0f, -1197.0f, 988.0f } }, RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_1 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_VANILLA, { 2135.0f, -1225.0f, 1297.0f } }, RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_2 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_VANILLA, { 2478.0f, -1343.0f, 1208.0f } }, RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_3 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_VANILLA, { 2940.0f, -1268.0f, 1069.0f } }, RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_4 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_VANILLA, { 2042.0f, -1203.0f, 849.0f } }, RC_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_5 }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_VANILLA, { 1634.0f, 164.0f, 1550.0f } }, RC_FOREST_TRIAL_SILVER_RUPEE_1 }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_VANILLA, { 1651.0f, 30.0f, 2021.0f } }, RC_FOREST_TRIAL_SILVER_RUPEE_2 }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_VANILLA, { 1538.0f, 118.0f, 2225.0f } }, RC_FOREST_TRIAL_SILVER_RUPEE_3 }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_VANILLA, { 1361.0f, 115.0f, 1222.0f } }, RC_FOREST_TRIAL_SILVER_RUPEE_4 }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_VANILLA, { 1247.0f, 59.0f, 1787.0f } }, RC_FOREST_TRIAL_SILVER_RUPEE_5 }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_VANILLA, { -1867.0f, 227.0f, -2754.0f } }, RC_FIRE_TRIAL_SILVER_RUPEE_1 }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_VANILLA, { -604.0f, 133.0f, -2592.0f } }, RC_FIRE_TRIAL_SILVER_RUPEE_2 }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_VANILLA, { -515.0f, 133.0f, -3253.0f } }, RC_FIRE_TRIAL_SILVER_RUPEE_3 }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_VANILLA, { -1555.0f, 151.0f, -2317.0f } }, RC_FIRE_TRIAL_SILVER_RUPEE_4 }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_VANILLA, { -854.0f, 152.0f, -3679.0f } }, RC_FIRE_TRIAL_SILVER_RUPEE_5 }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_VANILLA, { -1142.0f, 165.0f, 639.0f } }, RC_SPIRIT_TRIAL_SILVER_RUPEE_1 }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_VANILLA, { -725.0f, 165.0f, 942.0f } }, RC_SPIRIT_TRIAL_SILVER_RUPEE_2 }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_VANILLA, { -865.0f, 165.0f, 656.0f } }, RC_SPIRIT_TRIAL_SILVER_RUPEE_3 }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_VANILLA, { -940.0f, 165.0f, 270.0f } }, RC_SPIRIT_TRIAL_SILVER_RUPEE_4 }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_VANILLA, { -829.0f, 274.0f, 591.0f } }, RC_SPIRIT_TRIAL_SILVER_RUPEE_5 }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_VANILLA, { -2674.0f, -240.0f, -777.0f } }, RC_LIGHT_TRIAL_SILVER_RUPEE_1 }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_VANILLA, { -2680.0f, -240.0f, -893.0f } }, RC_LIGHT_TRIAL_SILVER_RUPEE_2 }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_VANILLA, { -2646.0f, -120.0f, -839.0f } }, RC_LIGHT_TRIAL_SILVER_RUPEE_3 }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_VANILLA, { -2649.0f, -240.0f, -545.0f } }, RC_LIGHT_TRIAL_SILVER_RUPEE_4 }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_VANILLA, { -2509.0f, -240.0f, -1091.0f } }, RC_LIGHT_TRIAL_SILVER_RUPEE_5 }, // MQ - { { SCENE_GERUDO_TRAINING_GROUND, { -1261.0f, -112.0f, -923.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_1 }, - { { SCENE_GERUDO_TRAINING_GROUND, { -1886.0f, -80.0f, -956.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_2 }, - { { SCENE_GERUDO_TRAINING_GROUND, { -1480.0f, 200.0f, -1000.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_3 }, - { { SCENE_GERUDO_TRAINING_GROUND, { -1542.0f, 53.0f, -1476.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_4 }, - { { SCENE_GERUDO_TRAINING_GROUND, { -1245.0f, 160.0f, -2112.0f } }, RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_5 }, - { { SCENE_GERUDO_TRAINING_GROUND, { 1317.0f, -239.0f, -1243.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_1 }, - { { SCENE_GERUDO_TRAINING_GROUND, { 1083.0f, -239.0f, -1374.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_2 }, - { { SCENE_GERUDO_TRAINING_GROUND, { 1560.0f, -239.0f, -1380.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_3 }, - { { SCENE_GERUDO_TRAINING_GROUND, { 1404.0f, -239.0f, -1653.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_4 }, - { { SCENE_GERUDO_TRAINING_GROUND, { 1134.0f, -239.0f, -1841.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_5 }, - { { SCENE_GERUDO_TRAINING_GROUND, { 1560.0f, -239.0f, -1861.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_6 }, - { { SCENE_GERUDO_TRAINING_GROUND, { 2160.0f, -900.0f, -1315.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE_1 }, - { { SCENE_GERUDO_TRAINING_GROUND, { 2302.0f, -797.0f, -1464.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE_2 }, - { { SCENE_GERUDO_TRAINING_GROUND, { 2453.0f, -890.0f, -1612.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE_3 }, - { { SCENE_DODONGOS_CAVERN, { -1512.0f, 531.0f, -1083.0f } }, RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_1 }, - { { SCENE_DODONGOS_CAVERN, { -1907.0f, 627.0f, -1243.0f } }, RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_2 }, - { { SCENE_DODONGOS_CAVERN, { -2411.0f, 380.0f, -1836.0f } }, RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_3 }, - { { SCENE_DODONGOS_CAVERN, { -2189.0f, 0.0f, -1834.0f } }, RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_4 }, - { { SCENE_DODONGOS_CAVERN, { -2277.0f, 0.0f, -1362.0f } }, RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_5 }, - { { SCENE_SHADOW_TEMPLE, { 3558.0f, -543.0f, -1490.0f } }, RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_1 }, - { { SCENE_SHADOW_TEMPLE, { 3399.0f, -543.0f, -838.0f } }, RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_2 }, - { { SCENE_SHADOW_TEMPLE, { 3243.0f, -543.0f, -1061.0f } }, RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_3 }, - { { SCENE_SHADOW_TEMPLE, { 3007.0f, -423.0f, -1222.0f } }, RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_4 }, - { { SCENE_SHADOW_TEMPLE, { 2810.0f, -543.0f, -961.0f } }, RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_5 }, - { { SCENE_SHADOW_TEMPLE, { 5667.0f, -1043.0f, 2686.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_1 }, - { { SCENE_SHADOW_TEMPLE, { 5637.0f, -1143.0f, 2134.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_2 }, - { { SCENE_SHADOW_TEMPLE, { 5601.0f, -1143.0f, 1898.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_3 }, - { { SCENE_SHADOW_TEMPLE, { 5489.0f, -1143.0f, 2476.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_4 }, - { { SCENE_SHADOW_TEMPLE, { 5466.0f, -1143.0f, 2234.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_5 }, - { { SCENE_SHADOW_TEMPLE, { 5404.0f, -1143.0f, 1977.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_6 }, - { { SCENE_SHADOW_TEMPLE, { 5270.0f, -1143.0f, 2453.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_7 }, - { { SCENE_SHADOW_TEMPLE, { 5217.0f, -1143.0f, 1852.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_8 }, - { { SCENE_SHADOW_TEMPLE, { 5158.0f, -1143.0f, 2315.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_9 }, - { { SCENE_SHADOW_TEMPLE, { 5089.0f, -1143.0f, 2049.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_10 }, - { { SCENE_SHADOW_TEMPLE, { 2250.0f, -1343.0f, 3372.0f } }, RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_1 }, - { { SCENE_SHADOW_TEMPLE, { 2131.0f, -1343.0f, 3030.0f } }, RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_2 }, - { { SCENE_SHADOW_TEMPLE, { 2110.0f, -970.0f, 3372.0f } }, RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_3 }, - { { SCENE_SHADOW_TEMPLE, { 2110.0f, -1092.0f, 3372.0f } }, RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_4 }, - { { SCENE_SHADOW_TEMPLE, { 1970.0f, -1343.0f, 3372.0f } }, RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_5 }, - { { SCENE_SHADOW_TEMPLE, { 2940.0f, -1265.0f, 1069.0f } }, RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_1 }, - { { SCENE_SHADOW_TEMPLE, { 2730.0f, -1203.0f, 876.0f } }, RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_2 }, - { { SCENE_SHADOW_TEMPLE, { 2705.0f, -1329.0f, 1089.0f } }, RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_3 }, - { { SCENE_SHADOW_TEMPLE, { 2478.0f, -1100.0f, 1404.0f } }, RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_4 }, - { { SCENE_SHADOW_TEMPLE, { 2478.0f, -1100.0f, 1200.0f } }, RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_5 }, - { { SCENE_SHADOW_TEMPLE, { 2478.0f, -1343.0f, 1208.0f } }, RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_6 }, - { { SCENE_SHADOW_TEMPLE, { 2478.0f, -975.0f, 893.0f } }, RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_7 }, - { { SCENE_SHADOW_TEMPLE, { 2254.0f, -1203.0f, 988.0f } }, RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_8 }, - { { SCENE_SHADOW_TEMPLE, { 2135.0f, -1225.0f, 1297.0f } }, RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_9 }, - { { SCENE_SHADOW_TEMPLE, { 2042.0f, -1203.0f, 849.0f } }, RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_10 }, - { { SCENE_SPIRIT_TEMPLE, { 744.0f, -50.0f, 4.0f } }, RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_1 }, - { { SCENE_SPIRIT_TEMPLE, { 967.0f, 0.0f, -547.0f } }, RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_2 }, - { { SCENE_SPIRIT_TEMPLE, { -160.0f, -150.0f, 270.0f } }, RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_3 }, - { { SCENE_SPIRIT_TEMPLE, { 160.0f, -150.0f, 268.0f } }, RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_4 }, - { { SCENE_SPIRIT_TEMPLE, { 1016.0f, -50.0f, -73.0f } }, RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_5 }, - { { SCENE_INSIDE_GANONS_CASTLE, { 2905.0f, -320.0f, -1263.0f } }, RC_WATER_TRIAL_MQ_SILVER_RUPEE_1 }, - { { SCENE_INSIDE_GANONS_CASTLE, { 3253.0f, -314.0f, -649.0f } }, RC_WATER_TRIAL_MQ_SILVER_RUPEE_2 }, - { { SCENE_INSIDE_GANONS_CASTLE, { 2905.0f, -120.0f, -1478.0f } }, RC_WATER_TRIAL_MQ_SILVER_RUPEE_3 }, - { { SCENE_INSIDE_GANONS_CASTLE, { 2912.0f, -219.0f, -971.0f } }, RC_WATER_TRIAL_MQ_SILVER_RUPEE_4 }, - { { SCENE_INSIDE_GANONS_CASTLE, { 2757.0f, -420.0f, -765.0f } }, RC_WATER_TRIAL_MQ_SILVER_RUPEE_5 }, - { { SCENE_INSIDE_GANONS_CASTLE, { 1100.0f, 150.0f, -2554.0f } }, RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_1 }, - { { SCENE_INSIDE_GANONS_CASTLE, { 1829.0f, 152.0f, -4071.0f } }, RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_2 }, - { { SCENE_INSIDE_GANONS_CASTLE, { 1529.0f, 150.0f, -4117.0f } }, RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_3 }, - { { SCENE_INSIDE_GANONS_CASTLE, { 1279.0f, 150.0f, -3111.0f } }, RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_4 }, - { { SCENE_INSIDE_GANONS_CASTLE, { 1322.0f, 150.0f, -2262.0f } }, RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_5 }, - { { SCENE_INSIDE_GANONS_CASTLE, { -1655.0f, 120.0f, -2133.0f } }, RC_FIRE_TRIAL_MQ_SILVER_RUPEE_1 }, - { { SCENE_INSIDE_GANONS_CASTLE, { -686.0f, 640.0f, -2945.0f } }, RC_FIRE_TRIAL_MQ_SILVER_RUPEE_2 }, - { { SCENE_INSIDE_GANONS_CASTLE, { -2044.0f, 244.0f, -3354.0f } }, RC_FIRE_TRIAL_MQ_SILVER_RUPEE_3 }, - { { SCENE_INSIDE_GANONS_CASTLE, { -1891.0f, 222.0f, -2753.0f } }, RC_FIRE_TRIAL_MQ_SILVER_RUPEE_4 }, - { { SCENE_INSIDE_GANONS_CASTLE, { -970.0f, 152.0f, -3747.0f } }, RC_FIRE_TRIAL_MQ_SILVER_RUPEE_5 }, + { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_MQ, { -1261.0f, -112.0f, -923.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_1 }, + { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_MQ, { -1886.0f, -80.0f, -956.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_2 }, + { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_MQ, { -1480.0f, 200.0f, -1000.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_3 }, + { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_MQ, { -1542.0f, 53.0f, -1476.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_4 }, + { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_MQ, { -1245.0f, 160.0f, -2112.0f } }, RC_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_5 }, + { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_MQ, { 1317.0f, -239.0f, -1243.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_1 }, + { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_MQ, { 1083.0f, -239.0f, -1374.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_2 }, + { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_MQ, { 1560.0f, -239.0f, -1380.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_3 }, + { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_MQ, { 1404.0f, -239.0f, -1653.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_4 }, + { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_MQ, { 1134.0f, -239.0f, -1841.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_5 }, + { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_MQ, { 1560.0f, -239.0f, -1861.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_6 }, + { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_MQ, { 2160.0f, -900.0f, -1315.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE_1 }, + { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_MQ, { 2302.0f, -797.0f, -1464.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE_2 }, + { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_MQ, { 2453.0f, -890.0f, -1612.0f } }, RC_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE_3 }, + { { SCENE_DODONGOS_CAVERN, RCQUEST_MQ, { -1512.0f, 531.0f, -1083.0f } }, RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_1 }, + { { SCENE_DODONGOS_CAVERN, RCQUEST_MQ, { -1907.0f, 627.0f, -1243.0f } }, RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_2 }, + { { SCENE_DODONGOS_CAVERN, RCQUEST_MQ, { -2411.0f, 380.0f, -1836.0f } }, RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_3 }, + { { SCENE_DODONGOS_CAVERN, RCQUEST_MQ, { -2189.0f, 0.0f, -1834.0f } }, RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_4 }, + { { SCENE_DODONGOS_CAVERN, RCQUEST_MQ, { -2277.0f, 0.0f, -1362.0f } }, RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_5 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 3558.0f, -543.0f, -1490.0f } }, RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_1 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 3399.0f, -543.0f, -838.0f } }, RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_2 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 3243.0f, -543.0f, -1061.0f } }, RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_3 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 3007.0f, -423.0f, -1222.0f } }, RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_4 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 2810.0f, -543.0f, -961.0f } }, RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_5 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 5667.0f, -1043.0f, 2686.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_1 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 5637.0f, -1143.0f, 2134.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_2 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 5601.0f, -1143.0f, 1898.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_3 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 5489.0f, -1143.0f, 2476.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_4 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 5466.0f, -1143.0f, 2234.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_5 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 5404.0f, -1143.0f, 1977.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_6 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 5270.0f, -1143.0f, 2453.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_7 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 5217.0f, -1143.0f, 1852.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_8 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 5158.0f, -1143.0f, 2315.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_9 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 5089.0f, -1143.0f, 2049.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_10 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 2250.0f, -1343.0f, 3372.0f } }, RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_1 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 2131.0f, -1343.0f, 3030.0f } }, RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_2 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 2110.0f, -970.0f, 3372.0f } }, RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_3 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 2110.0f, -1092.0f, 3372.0f } }, RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_4 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 1970.0f, -1343.0f, 3372.0f } }, RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_5 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 2940.0f, -1265.0f, 1069.0f } }, RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_1 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 2730.0f, -1203.0f, 876.0f } }, RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_2 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 2705.0f, -1329.0f, 1089.0f } }, RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_3 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 2478.0f, -1100.0f, 1404.0f } }, RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_4 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 2478.0f, -1100.0f, 1200.0f } }, RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_5 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 2478.0f, -1343.0f, 1208.0f } }, RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_6 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 2478.0f, -975.0f, 893.0f } }, RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_7 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 2254.0f, -1203.0f, 988.0f } }, RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_8 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 2135.0f, -1225.0f, 1297.0f } }, RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_9 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 2042.0f, -1203.0f, 849.0f } }, RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_10 }, + { { SCENE_SPIRIT_TEMPLE, RCQUEST_MQ, { 744.0f, -50.0f, 4.0f } }, RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_1 }, + { { SCENE_SPIRIT_TEMPLE, RCQUEST_MQ, { 967.0f, 0.0f, -547.0f } }, RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_2 }, + { { SCENE_SPIRIT_TEMPLE, RCQUEST_MQ, { -160.0f, -150.0f, 270.0f } }, RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_3 }, + { { SCENE_SPIRIT_TEMPLE, RCQUEST_MQ, { 160.0f, -150.0f, 268.0f } }, RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_4 }, + { { SCENE_SPIRIT_TEMPLE, RCQUEST_MQ, { 1016.0f, -50.0f, -73.0f } }, RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_5 }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_MQ, { 2905.0f, -320.0f, -1263.0f } }, RC_WATER_TRIAL_MQ_SILVER_RUPEE_1 }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_MQ, { 3253.0f, -314.0f, -649.0f } }, RC_WATER_TRIAL_MQ_SILVER_RUPEE_2 }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_MQ, { 2905.0f, -120.0f, -1478.0f } }, RC_WATER_TRIAL_MQ_SILVER_RUPEE_3 }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_MQ, { 2912.0f, -219.0f, -971.0f } }, RC_WATER_TRIAL_MQ_SILVER_RUPEE_4 }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_MQ, { 2757.0f, -420.0f, -765.0f } }, RC_WATER_TRIAL_MQ_SILVER_RUPEE_5 }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_MQ, { 1100.0f, 150.0f, -2554.0f } }, RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_1 }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_MQ, { 1829.0f, 152.0f, -4071.0f } }, RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_2 }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_MQ, { 1529.0f, 150.0f, -4117.0f } }, RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_3 }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_MQ, { 1279.0f, 150.0f, -3111.0f } }, RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_4 }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_MQ, { 1322.0f, 150.0f, -2262.0f } }, RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_5 }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_MQ, { -1655.0f, 120.0f, -2133.0f } }, RC_FIRE_TRIAL_MQ_SILVER_RUPEE_1 }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_MQ, { -686.0f, 640.0f, -2945.0f } }, RC_FIRE_TRIAL_MQ_SILVER_RUPEE_2 }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_MQ, { -2044.0f, 244.0f, -3354.0f } }, RC_FIRE_TRIAL_MQ_SILVER_RUPEE_3 }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_MQ, { -1891.0f, 222.0f, -2753.0f } }, RC_FIRE_TRIAL_MQ_SILVER_RUPEE_4 }, + { { SCENE_INSIDE_GANONS_CASTLE, RCQUEST_MQ, { -970.0f, 152.0f, -3747.0f } }, RC_FIRE_TRIAL_MQ_SILVER_RUPEE_5 }, }; std::unordered_map SilverRupees::mSilverRupeeRoomNames = { // TODO: Translate @@ -208,11 +208,18 @@ namespace Rando { { RG_FIRE_TRIAL_SILVER_RUPEE, { "Fire Trial in Ganon's Castle", "Fire Trial in Ganon's Castle", "Fire Trial in Ganon's Castle" } }, { RG_SPIRIT_TRIAL_SILVER_RUPEE, { "Spirit Trial in Ganon's Castle", "Spirit Trial in Ganon's Castle", "Spirit Trial in Ganon's Castle" } }, { RG_LIGHT_TRIAL_SILVER_RUPEE, { "Light Trial in Ganon's Castle", "Light Trial in Ganon's Castle", "Light Trial in Ganon's Castle" } }, + { RG_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE, { "Boulder Maze in the Gerudo Training Grounds", "Boulder Maze in the Gerudo Training Grounds", "Boulder Maze in the Gerudo Training Grounds" } }, + { RG_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE, { "Lava room in the Gerudo Training Grounds", "Lava room in the Gerudo Training Grounds", "Lava room in the Gerudo Training Grounds" } }, + { RG_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE, { "Whirlpool room in the Gerudo Training Grounds", "Whirlpool room in the Gerudo Training Grounds", "Whirlpool room in the Gerudo Training Grounds" } }, { RG_DODONGOS_CAVERN_MQ_SILVER_RUPEE, { "Dodongo's Cavern Staircase Room", "Dodongo's Cavern Staircase Room", "Dodongo's Cavern Staircase Room" } }, { RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE, { "Spirit Temple Lobby", "Spirit Temple Lobby", "Spirit Temple Lobby" } }, + { RG_SHADOW_MQ_SCYTHE_SILVER_RUPEE, { "Spinning Scythes room in the Shadow Temple", "Spinning Scythes room in the Shadow Temple", "Spinning Scythes room in the Shadow Temple" } }, + { RG_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, { "door to the Falling Spikes room in the Shadow Temple", "door to the Falling Spikes room in the Shadow Temple", "door to the Falling Spikes room in the Shadow Temple" } }, + { RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, { "room with Invisible Spikes in the Shadow Temple", "room with Invisible Spikes in the Shadow Temple", "room with Invisible Spikes in the Shadow Temple" } }, { RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, { "Invisible Scythes room in the Shadow Temple", "Invisible Scythes room in the Shadow Temple", "Invisible Scythes room in the Shadow Temple" } }, { RG_WATER_TRIAL_MQ_SILVER_RUPEE, { "Water Trial in Ganon's Castle", "Water Trial in Ganon's Castle", "Water Trial in Ganon's Castle" } }, - { RG_SHADOW_TRIAL_MQ_SILVER_RUPEE, { "Shadow Trial in Ganon's Castle", "Shadow Trial in Ganon's Castle", "Shadow Trial in Ganon's Castle" } } + { RG_SHADOW_TRIAL_MQ_SILVER_RUPEE, { "Shadow Trial in Ganon's Castle", "Shadow Trial in Ganon's Castle", "Shadow Trial in Ganon's Castle" } }, + { RG_FIRE_TRIAL_MQ_SILVER_RUPEE, { "Fire Trial in Ganon's Castle", "Fire Trial in Ganon's Castle", "Fire Trial in Ganon's Castle" } }, }; SilverRupees::SilverRupees() { diff --git a/soh/soh/Enhancements/randomizer/static_data.h b/soh/soh/Enhancements/randomizer/static_data.h index 6604e992317..ef32a8aec21 100644 --- a/soh/soh/Enhancements/randomizer/static_data.h +++ b/soh/soh/Enhancements/randomizer/static_data.h @@ -9,6 +9,7 @@ namespace Rando { struct Position{ SceneID scene; + RandomizerCheckQuest quest; Vec3f pos; }; From c1d56a7d3d527ce206ce19a315f374bcb3ec135f Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sat, 30 Mar 2024 15:09:58 -0400 Subject: [PATCH 022/108] Adds RCQUEST to the Position struct --- soh/soh/Enhancements/randomizer/draw.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/draw.cpp b/soh/soh/Enhancements/randomizer/draw.cpp index f8e5337d007..05055230c4b 100644 --- a/soh/soh/Enhancements/randomizer/draw.cpp +++ b/soh/soh/Enhancements/randomizer/draw.cpp @@ -525,7 +525,7 @@ extern "C" void Randomizer_DrawFishingPoleGI(PlayState* play, GetItemEntry* getI extern "C" void Randomizer_DrawSilverRupee(PlayState* play, GetItemEntry* getItemEntry) { OPEN_DISPS(play->state.gfxCtx); Color_RGB8 silverRupeeColor = - CVarGetColor24("gCosmetics.Consumable_SilverRupee.Value", Color_RGB8(255, 255, 255)); + CVarGetColor24("gCosmetics.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); From cc4771b4548a59c3dcee67550a9ac1bf18a2e7a6 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sat, 30 Mar 2024 17:03:37 -0400 Subject: [PATCH 023/108] Changes a few of the longer names --- .../hint_list/hint_list_exclude_dungeon.cpp | 4 +-- .../randomizer/3drando/item_pool.cpp | 4 +-- .../location_access/locacc_spirit_temple.cpp | 20 ++++++------- soh/soh/Enhancements/randomizer/dungeon.cpp | 24 +++++++-------- soh/soh/Enhancements/randomizer/item_list.cpp | 8 ++--- .../Enhancements/randomizer/location_list.cpp | 22 +++++++------- .../Enhancements/randomizer/randomizerTypes.h | 28 ++++++++--------- .../Enhancements/randomizer/randomizer_inf.h | 20 ++++++------- .../Enhancements/randomizer/silver_rupee.cpp | 30 +++++++++---------- 9 files changed, 80 insertions(+), 80 deletions(-) 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 358f2e3b4fe..1c1ba21caaa 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 @@ -1152,11 +1152,11 @@ void HintTable_Init_Exclude_Dungeon() { }); //TODO: Translate - hintTable[RHT_SPIRIT_CHILD_GATE_SILVER_RUPEE] = HintText::Exclude({ + hintTable[RHT_SPIRIT_GATE_SILVER_RUPEE] = HintText::Exclude({ //obscure text Text{"a #gate# in the Spirit Temple guards"} }); - hintTable[RHT_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE] = HintText::Exclude({ + hintTable[RHT_SPIRIT_BEAMOS_SILVER_RUPEE] = HintText::Exclude({ //obscure text Text{"#Beamos and blocks# in the Spirit Temple guard"} }); diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index 306333c37f1..404a3140975 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -1083,8 +1083,8 @@ void GenerateItemPool() { silversToAdd.push_back(RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE); } if (ctx->GetDungeon(Rando::SPIRIT_TEMPLE)->IsVanilla()) { - silversToAdd.push_back(RG_SPIRIT_CHILD_GATE_SILVER_RUPEE); - silversToAdd.push_back(RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE); + silversToAdd.push_back(RG_SPIRIT_GATE_SILVER_RUPEE); + silversToAdd.push_back(RG_SPIRIT_BEAMOS_SILVER_RUPEE); silversToAdd.push_back(RG_SPIRIT_BOULDER_SILVER_RUPEE); } if (ctx->GetDungeon(Rando::SHADOW_TEMPLE)->IsVanilla()) { diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp index 0bbe1d04f77..37845be47f2 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp @@ -32,11 +32,11 @@ void AreaTable_Init_SpiritTemple() { }, { //Locations LocationAccess(RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, {[]{return (logic->Boomerang || logic->Slingshot || (logic->HasBombchus && randoCtx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives || ((logic->Nuts || logic->Boomerang) && (logic->Sticks || logic->KokiriSword || logic->Slingshot)));}}), - LocationAccess(RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_1, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ - LocationAccess(RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_2, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ - LocationAccess(RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_3, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ - LocationAccess(RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_4, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ - LocationAccess(RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_5, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SPIRIT_GATE_SILVER_RUPEE_1, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SPIRIT_GATE_SILVER_RUPEE_2, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SPIRIT_GATE_SILVER_RUPEE_3, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SPIRIT_GATE_SILVER_RUPEE_4, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SPIRIT_GATE_SILVER_RUPEE_5, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ LocationAccess(RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, {[]{return (logic->Boomerang || logic->Slingshot || (logic->HasBombchus && randoCtx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives || ((logic->Nuts || logic->Boomerang) && (logic->Sticks || logic->KokiriSword || logic->Slingshot))) && (logic->Sticks || logic->CanUse(RG_DINS_FIRE));}}), LocationAccess(RC_SPIRIT_TEMPLE_GS_METAL_FENCE, {[]{return (logic->Boomerang || logic->Slingshot || (logic->HasBombchus && randoCtx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives || ((logic->Nuts || logic->Boomerang) && (logic->Sticks || logic->KokiriSword || logic->Slingshot)));}}), }, { @@ -52,11 +52,11 @@ void AreaTable_Init_SpiritTemple() { (logic->CanTakeDamage && (logic->CanJumpslash || logic->HasProjectile(HasProjectileAge::Child))) || (logic->IsChild && logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && logic->HasProjectile(HasProjectileAge::Child)) || ((logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && randoCtx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && randoCtx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF))) && logic->CanUse(RG_SILVER_GAUNTLETS) && (logic->HasProjectile(HasProjectileAge::Adult) || (logic->CanTakeDamage && logic->CanJumpslash)));}}), - LocationAccess(RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_1, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ - LocationAccess(RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_2, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ - LocationAccess(RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_3, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ - LocationAccess(RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_4, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ - LocationAccess(RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_5, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SPIRIT_BEAMOS_SILVER_RUPEE_1, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SPIRIT_BEAMOS_SILVER_RUPEE_2, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SPIRIT_BEAMOS_SILVER_RUPEE_3, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SPIRIT_BEAMOS_SILVER_RUPEE_4, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SPIRIT_BEAMOS_SILVER_RUPEE_5, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ }, { //Exits Entrance(RR_SPIRIT_TEMPLE_CENTRAL_CHAMBER, {[]{return logic->HasExplosives || (randoCtx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS));}}), diff --git a/soh/soh/Enhancements/randomizer/dungeon.cpp b/soh/soh/Enhancements/randomizer/dungeon.cpp index 5ed2fce1995..d961c0f2d90 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/dungeon.cpp @@ -436,9 +436,9 @@ Dungeons::Dungeons() { dungeonList[SPIRIT_TEMPLE] = DungeonInfo("Spirit Temple", RHT_SPIRIT_TEMPLE, RG_SPIRIT_TEMPLE_MAP, RG_SPIRIT_TEMPLE_COMPASS, RG_SPIRIT_TEMPLE_SMALL_KEY, RG_SPIRIT_TEMPLE_KEY_RING, RG_SPIRIT_TEMPLE_BOSS_KEY, { - RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, + RG_SPIRIT_BEAMOS_SILVER_RUPEE, RG_SPIRIT_BOULDER_SILVER_RUPEE, - RG_SPIRIT_CHILD_GATE_SILVER_RUPEE, + RG_SPIRIT_GATE_SILVER_RUPEE, }, { RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE, }, RA_SPIRIT_TEMPLE, 5, 7, @@ -466,16 +466,16 @@ Dungeons::Dungeons() { RC_SPIRIT_TEMPLE_GS_LOBBY, RC_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, RC_SPIRIT_TEMPLE_GS_METAL_FENCE, - RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_1, - RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_2, - RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_3, - RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_4, - RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_5, - RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_1, - RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_2, - RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_3, - RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_4, - RC_SPIRIT_CHILD_BLOCK_PUSH_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, diff --git a/soh/soh/Enhancements/randomizer/item_list.cpp b/soh/soh/Enhancements/randomizer/item_list.cpp index ad952f054bd..34c1cf46c4e 100644 --- a/soh/soh/Enhancements/randomizer/item_list.cpp +++ b/soh/soh/Enhancements/randomizer/item_list.cpp @@ -303,10 +303,10 @@ void Rando::StaticData::InitItemTable() { 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 Toilet Room Silver Rupee", "GTG Whirlpool Room Silver Rupee", "GTG Whirlpool Room Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_GERUDO_TRAINING_GROUNDS_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_CHILD_GATE_SILVER_RUPEE] = Item(RG_SPIRIT_CHILD_GATE_SILVER_RUPEE, Text{ "Spirit Temple Child Gate Room Silver Rupee", "Spirit Temple Child Gate Room Silver Rupee", "Spirit Temple Child Gate Room Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_SPIRIT_TEMPLE_SILVER_RUPEE, RG_SPIRIT_CHILD_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_CHILD_GATE_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); - itemTable[RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE] = Item(RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, Text{ "Spirit Temple Child Block Pushing Room Silver Rupee", "Spirit Temple Child Block Pushing Room Silver Rupee", "Spirit Temple Child Block Pushing Room Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_SPIRIT_TEMPLE_SILVER_RUPEE, RG_SPIRIT_CHILD_BLOCK_PUSH_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_CHILD_BLOCK_PUSH_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_SPIRIT_GATE_SILVER_RUPEE] = Item(RG_SPIRIT_GATE_SILVER_RUPEE, Text{ "Spirit Temple Child Gate Room Silver Rupee", "Spirit Temple Child Gate Room Silver Rupee", "Spirit Temple Child Gate Room Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, 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 Child Block Pushing Room Silver Rupee", "Spirit Temple Child Block Pushing Room Silver Rupee", "Spirit Temple Child Block Pushing Room Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, 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->noVariable, 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->noVariable, 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); diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index e56d958b521..55ebe5746b0 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -1550,17 +1550,17 @@ void Rando::StaticData::InitLocationTable() { 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, 0, 0x0, "Whirlpool Room Silver Rupee 4", "GTG Whirlpool Room Silver Rupee 4", RHT_GERUDO_TRAINING_GROUND_TOILET_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Whirlpool Room Silver Rupee 5", "GTG Whirlpool Room Silver Rupee 5", RHT_GERUDO_TRAINING_GROUND_TOILET_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_5)); - locationTable[RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_1] = Location::Base(RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_1, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Gate Silver Rupee 1", "Spirit Temple Child Gate Silver Rupee 1", RHT_SPIRIT_CHILD_GATE_SILVER_RUPEE, RG_SPIRIT_CHILD_GATE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_GATE_SILVER_RUPEE_1)); - locationTable[RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_2] = Location::Base(RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_2, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Gate Silver Rupee 2", "Spirit Temple Child Gate Silver Rupee 2", RHT_SPIRIT_CHILD_GATE_SILVER_RUPEE, RG_SPIRIT_CHILD_GATE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_GATE_SILVER_RUPEE_2)); - locationTable[RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_3] = Location::Base(RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_3, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Gate Silver Rupee 3", "Spirit Temple Child Gate Silver Rupee 3", RHT_SPIRIT_CHILD_GATE_SILVER_RUPEE, RG_SPIRIT_CHILD_GATE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_GATE_SILVER_RUPEE_3)); - locationTable[RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_4] = Location::Base(RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_4, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Gate Silver Rupee 4", "Spirit Temple Child Gate Silver Rupee 4", RHT_SPIRIT_CHILD_GATE_SILVER_RUPEE, RG_SPIRIT_CHILD_GATE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_GATE_SILVER_RUPEE_4)); - locationTable[RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_5] = Location::Base(RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_5, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Gate Silver Rupee 5", "Spirit Temple Child Gate Silver Rupee 5", RHT_SPIRIT_CHILD_GATE_SILVER_RUPEE, RG_SPIRIT_CHILD_GATE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_GATE_SILVER_RUPEE_5)); - - locationTable[RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_1] = Location::Base(RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_1, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Block Pushing Silver Rupee 1", "Spirit Child Block Pushing Silver Rupee 1", RHT_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_1)); - locationTable[RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_2] = Location::Base(RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_2, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Block Pushing Silver Rupee 2", "Spirit Child Block Pushing Silver Rupee 2", RHT_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_2)); - locationTable[RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_3] = Location::Base(RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_3, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Block Pushing Silver Rupee 3", "Spirit Child Block Pushing Silver Rupee 3", RHT_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_3)); - locationTable[RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_4] = Location::Base(RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_4, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Block Pushing Silver Rupee 4", "Spirit Child Block Pushing Silver Rupee 4", RHT_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_4)); - locationTable[RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_5] = Location::Base(RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_5, RCQUEST_VANILLA, RCTYPE_SILVER_RUPEE, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_G_SWITCH, SCENE_SPIRIT_TEMPLE, 0, 0x0, "Child Block Pushing Silver Rupee 5", "Spirit Child Block Pushing Silver Rupee 5", RHT_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_CHILD_BLOCK_PUSH_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, 0, 0x0, "Child Gate Silver Rupee 1", "Spirit Temple Child Gate Silver Rupee 1", RHT_SPIRIT_GATE_SILVER_RUPEE, RG_SPIRIT_GATE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Child Gate Silver Rupee 2", "Spirit Temple Child Gate Silver Rupee 2", RHT_SPIRIT_GATE_SILVER_RUPEE, RG_SPIRIT_GATE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Child Gate Silver Rupee 3", "Spirit Temple Child Gate Silver Rupee 3", RHT_SPIRIT_GATE_SILVER_RUPEE, RG_SPIRIT_GATE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Child Gate Silver Rupee 4", "Spirit Temple Child Gate Silver Rupee 4", RHT_SPIRIT_GATE_SILVER_RUPEE, RG_SPIRIT_GATE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Child Gate Silver Rupee 5", "Spirit Temple Child Gate Silver Rupee 5", RHT_SPIRIT_GATE_SILVER_RUPEE, RG_SPIRIT_GATE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Beamos Room Silver Rupee 1", "Spirit Beamos Room Silver Rupee 1", RHT_SPIRIT_BEAMOS_SILVER_RUPEE, RG_SPIRIT_BEAMOS_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Beamos Room Silver Rupee 2", "Spirit Beamos Room Silver Rupee 2", RHT_SPIRIT_BEAMOS_SILVER_RUPEE, RG_SPIRIT_BEAMOS_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Beamos Room Silver Rupee 3", "Spirit Beamos Room Silver Rupee 3", RHT_SPIRIT_BEAMOS_SILVER_RUPEE, RG_SPIRIT_BEAMOS_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Beamos Room Silver Rupee 4", "Spirit Beamos Room Silver Rupee 4", RHT_SPIRIT_BEAMOS_SILVER_RUPEE, RG_SPIRIT_BEAMOS_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Beamos Room Silver Rupee 5", "Spirit Beamos Room Silver Rupee 5", RHT_SPIRIT_BEAMOS_SILVER_RUPEE, RG_SPIRIT_BEAMOS_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Boulder Room Silver Rupee 1", "Spirit Boulder Room Silver Rupee 1", RHT_SPIRIT_BOULDER_SILVER_RUPEE, RG_SPIRIT_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Boulder Room Silver Rupee 2", "Spirit Boulder Room Silver Rupee 2", RHT_SPIRIT_BOULDER_SILVER_RUPEE, RG_SPIRIT_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, RAND_INF_SPIRIT_BOULDER_SILVER_RUPEE_2)); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 7019c70c3ef..ed0bd7e81a1 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1327,16 +1327,16 @@ typedef enum { RC_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, RC_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, RC_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, - RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_1, - RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_2, - RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_3, - RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_4, - RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_5, - RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_1, - RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_2, - RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_3, - RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_4, - RC_SPIRIT_CHILD_BLOCK_PUSH_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, @@ -2116,8 +2116,8 @@ typedef enum { RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, - RG_SPIRIT_CHILD_GATE_SILVER_RUPEE, - RG_SPIRIT_CHILD_BLOCK_PUSH_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, @@ -3156,8 +3156,8 @@ typedef enum { RHT_GERUDO_TRAINING_GROUND_BOULDER_SILVER_RUPEE, RHT_GERUDO_TRAINING_GROUND_LAVA_SILVER_RUPEE, RHT_GERUDO_TRAINING_GROUND_TOILET_SILVER_RUPEE, - RHT_SPIRIT_CHILD_GATE_SILVER_RUPEE, - RHT_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, + RHT_SPIRIT_GATE_SILVER_RUPEE, + RHT_SPIRIT_BEAMOS_SILVER_RUPEE, RHT_SPIRIT_BOULDER_SILVER_RUPEE, RHT_SHADOW_SPINNING_SCYTHE_SILVER_RUPEE, RHT_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index 60fd2366cbf..4a9b53445ea 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -296,16 +296,16 @@ typedef enum { RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_3, RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_4, RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_5, - RAND_INF_SPIRIT_CHILD_GATE_SILVER_RUPEE_1, - RAND_INF_SPIRIT_CHILD_GATE_SILVER_RUPEE_2, - RAND_INF_SPIRIT_CHILD_GATE_SILVER_RUPEE_3, - RAND_INF_SPIRIT_CHILD_GATE_SILVER_RUPEE_4, - RAND_INF_SPIRIT_CHILD_GATE_SILVER_RUPEE_5, - RAND_INF_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_1, - RAND_INF_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_2, - RAND_INF_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_3, - RAND_INF_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_4, - RAND_INF_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_5, + RAND_INF_SPIRIT_GATE_SILVER_RUPEE_1, + RAND_INF_SPIRIT_GATE_SILVER_RUPEE_2, + RAND_INF_SPIRIT_GATE_SILVER_RUPEE_3, + RAND_INF_SPIRIT_GATE_SILVER_RUPEE_4, + RAND_INF_SPIRIT_GATE_SILVER_RUPEE_5, + RAND_INF_SPIRIT_BEAMOS_SILVER_RUPEE_1, + RAND_INF_SPIRIT_BEAMOS_SILVER_RUPEE_2, + RAND_INF_SPIRIT_BEAMOS_SILVER_RUPEE_3, + RAND_INF_SPIRIT_BEAMOS_SILVER_RUPEE_4, + RAND_INF_SPIRIT_BEAMOS_SILVER_RUPEE_5, RAND_INF_SPIRIT_BOULDER_SILVER_RUPEE_1, RAND_INF_SPIRIT_BOULDER_SILVER_RUPEE_2, RAND_INF_SPIRIT_BOULDER_SILVER_RUPEE_3, diff --git a/soh/soh/Enhancements/randomizer/silver_rupee.cpp b/soh/soh/Enhancements/randomizer/silver_rupee.cpp index 84032a55d8d..5aec18ae7c0 100644 --- a/soh/soh/Enhancements/randomizer/silver_rupee.cpp +++ b/soh/soh/Enhancements/randomizer/silver_rupee.cpp @@ -12,8 +12,8 @@ namespace Rando { { { 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_CHILD_GATE_SILVER_RUPEE }, - { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, 330 }, RG_SPIRIT_CHILD_BLOCK_PUSH_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 }, @@ -68,16 +68,16 @@ namespace Rando { { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_VANILLA, { 2453.0f, -890.0f, -1612.0f } }, RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_3 }, { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_VANILLA, { 2497.0f, -605.0f, -1465.0f } }, RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_4 }, { { SCENE_GERUDO_TRAINING_GROUND, RCQUEST_VANILLA, { 2308.0f, -961.0f, -1464.0f } }, RC_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_5 }, - { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { -335.0f, 30.0f, -1409.0f } }, RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_1 }, - { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { -347.0f, 229.0f, -1075.0f } }, RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_2 }, - { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { -511.0f, 50.0f, -1075.0f } }, RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_3 }, - { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { -672.0f, 50.0f, -1075.0f } }, RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_4 }, - { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { -766.0f, 229.0f, -1075.0f } }, RC_SPIRIT_CHILD_GATE_SILVER_RUPEE_5 }, - { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { -984.0f, 923.0f, -450.0f } }, RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_1 }, - { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { -1123.0f, 923.0f, 428.0f } }, RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_2 }, - { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { -1275.0f, 922.0f, -247.0f } }, RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_3 }, - { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { -1433.0f, 913.0f, -283.0f } }, RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_4 }, - { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { -1836.0f, 923.0f, -446.0f } }, RC_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE_5 }, + { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { -335.0f, 30.0f, -1409.0f } }, RC_SPIRIT_GATE_SILVER_RUPEE_1 }, + { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { -347.0f, 229.0f, -1075.0f } }, RC_SPIRIT_GATE_SILVER_RUPEE_2 }, + { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { -511.0f, 50.0f, -1075.0f } }, RC_SPIRIT_GATE_SILVER_RUPEE_3 }, + { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { -672.0f, 50.0f, -1075.0f } }, RC_SPIRIT_GATE_SILVER_RUPEE_4 }, + { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { -766.0f, 229.0f, -1075.0f } }, RC_SPIRIT_GATE_SILVER_RUPEE_5 }, + { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { -984.0f, 923.0f, -450.0f } }, RC_SPIRIT_BEAMOS_SILVER_RUPEE_1 }, + { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { -1123.0f, 923.0f, 428.0f } }, RC_SPIRIT_BEAMOS_SILVER_RUPEE_2 }, + { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { -1275.0f, 922.0f, -247.0f } }, RC_SPIRIT_BEAMOS_SILVER_RUPEE_3 }, + { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { -1433.0f, 913.0f, -283.0f } }, RC_SPIRIT_BEAMOS_SILVER_RUPEE_4 }, + { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { -1836.0f, 923.0f, -446.0f } }, RC_SPIRIT_BEAMOS_SILVER_RUPEE_5 }, { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { 1573.0f, -33.0f, -920.0f } }, RC_SPIRIT_BOULDER_SILVER_RUPEE_1 }, { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { 1856.0f, -33.0f, -1219.0f } }, RC_SPIRIT_BOULDER_SILVER_RUPEE_2 }, { { SCENE_SPIRIT_TEMPLE, RCQUEST_VANILLA, { 1856.0f, -33.0f, -944.0f } }, RC_SPIRIT_BOULDER_SILVER_RUPEE_3 }, @@ -198,8 +198,8 @@ namespace Rando { { RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, { "Boulder Maze in the Gerudo Training Grounds", "Boulder Maze in the Gerudo Training Grounds", "Boulder Maze in the Gerudo Training Grounds" } }, { RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, { "Lava room in the Gerudo Training Grounds", "Lava room in the Gerudo Training Grounds", "Lava room in the Gerudo Training Grounds" } }, { RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, { "Whirlpool room in the Gerudo Training Grounds", "Whirlpool room in the Gerudo Training Grounds", "Whirlpool room in the Gerudo Training Grounds" } }, - { RG_SPIRIT_CHILD_GATE_SILVER_RUPEE, { "Child-side Gate room in the Spirit Temple", "Child-side Gate room in the Spirit Temple", "Child-side Gate room in the Spirit Temple" } }, - { RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE, { "Child-side Block Pushing room in the Spirit Temple", "Child-side Block Pushing room in the Spirit Temple", "Child-side Block Pushing room in the Spirit Temple" } }, + { RG_SPIRIT_GATE_SILVER_RUPEE, { "Gate room in the Spirit Temple", "Gate room in the Spirit Temple", "Gate room in the Spirit Temple" } }, + { RG_SPIRIT_BEAMOS_SILVER_RUPEE, { "Beamos room in the Spirit Temple", "Beamos room in the Spirit Temple", "Beamos room in the Spirit Temple" } }, { RG_SPIRIT_BOULDER_SILVER_RUPEE, { "Boulder room in the Spirit Temple", "Boulder room in the Spirit Temple", "Boulder room in the Spirit Temple" } }, { RG_SHADOW_SCYTHE_SILVER_RUPEE, { "Spinning Scythes room in the Shadow Temple", "Spinning Scythes room in the Shadow Temple", "Spinning Scythes room in the Shadow Temple" } }, { RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, { "door to the Falling Spikes room in the Shadow Temple", "door to the Falling Spikes room in the Shadow Temple", "door to the Falling Spikes room in the Shadow Temple" } }, @@ -231,7 +231,7 @@ namespace Rando { SilverRupeesInfo(5, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE), SilverRupeesInfo(5, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE), SilverRupeesInfo(5, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE), - SilverRupeesInfo(5, RG_SPIRIT_CHILD_BLOCK_PUSH_SILVER_RUPEE), + SilverRupeesInfo(5, RG_SPIRIT_BEAMOS_SILVER_RUPEE), SilverRupeesInfo(5, RG_SPIRIT_BOULDER_SILVER_RUPEE), SilverRupeesInfo(5, RG_SHADOW_SCYTHE_SILVER_RUPEE), SilverRupeesInfo(5, RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE), From 76b778a529932c1b173ea851379449caf70a60d0 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sat, 30 Mar 2024 17:35:49 -0400 Subject: [PATCH 024/108] Shows all of the silver rupee flags in the save editor --- .../Enhancements/debugger/debugSaveEditor.h | 154 +++++++++++++++++- 1 file changed, 152 insertions(+), 2 deletions(-) diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.h b/soh/soh/Enhancements/debugger/debugSaveEditor.h index b0650bfa0fd..740d23c2a3c 100644 --- a/soh/soh/Enhancements/debugger/debugSaveEditor.h +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.h @@ -348,7 +348,7 @@ const std::vector flagTables = { { 0x24, "Market Crowd Text Randomizer" }, { 0x30, "Entered the Market" }, } }, - { "Randomizer Inf Flags", RANDOMIZER_INF, 16, { + { "Randomizer Inf Flags", RANDOMIZER_INF, 25, { { RAND_INF_DUNGEONS_DONE_DEKU_TREE, "DUNGEONS_DONE_DEKU_TREE" }, { RAND_INF_DUNGEONS_DONE_DODONGOS_CAVERN, "DUNGEONS_DONE_DODONGOS_CAVERN" }, { RAND_INF_DUNGEONS_DONE_JABU_JABUS_BELLY, "DUNGEONS_DONE_JABU_JABUS_BELLY" }, @@ -607,7 +607,157 @@ const std::vector flagTables = { { RAND_INF_ZD_FISH_2, "RAND_INF_ZD_FISH_2" }, { RAND_INF_ZD_FISH_3, "RAND_INF_ZD_FISH_3" }, { RAND_INF_ZD_FISH_4, "RAND_INF_ZD_FISH_4" }, - { RAND_INF_ZD_FISH_5, "RAND_INF_ZD_FISH_5" } + { RAND_INF_ZD_FISH_5, "RAND_INF_ZD_FISH_5" }, + { RAND_INF_BOTTOM_OF_THE_WELL_SILVER_RUPEE_1, "RAND_INF_BOTTOM_OF_THE_WELL_SILVER_RUPEE_1" }, + { RAND_INF_BOTTOM_OF_THE_WELL_SILVER_RUPEE_2, "RAND_INF_BOTTOM_OF_THE_WELL_SILVER_RUPEE_2" }, + { RAND_INF_BOTTOM_OF_THE_WELL_SILVER_RUPEE_3, "RAND_INF_BOTTOM_OF_THE_WELL_SILVER_RUPEE_3" }, + { RAND_INF_BOTTOM_OF_THE_WELL_SILVER_RUPEE_4, "RAND_INF_BOTTOM_OF_THE_WELL_SILVER_RUPEE_4" }, + { RAND_INF_BOTTOM_OF_THE_WELL_SILVER_RUPEE_5, "RAND_INF_BOTTOM_OF_THE_WELL_SILVER_RUPEE_5" }, + { RAND_INF_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_1, "RAND_INF_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_1" }, + { RAND_INF_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_2, "RAND_INF_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_2" }, + { RAND_INF_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_3, "RAND_INF_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_3" }, + { RAND_INF_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_4, "RAND_INF_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_4" }, + { RAND_INF_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_5, "RAND_INF_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE_5" }, + { RAND_INF_ICE_CAVERN_SLIDING_SILVER_RUPEE_1, "RAND_INF_ICE_CAVERN_SLIDING_SILVER_RUPEE_1" }, + { RAND_INF_ICE_CAVERN_SLIDING_SILVER_RUPEE_2, "RAND_INF_ICE_CAVERN_SLIDING_SILVER_RUPEE_2" }, + { RAND_INF_ICE_CAVERN_SLIDING_SILVER_RUPEE_3, "RAND_INF_ICE_CAVERN_SLIDING_SILVER_RUPEE_3" }, + { RAND_INF_ICE_CAVERN_SLIDING_SILVER_RUPEE_4, "RAND_INF_ICE_CAVERN_SLIDING_SILVER_RUPEE_4" }, + { RAND_INF_ICE_CAVERN_SLIDING_SILVER_RUPEE_5, "RAND_INF_ICE_CAVERN_SLIDING_SILVER_RUPEE_5" }, + { RAND_INF_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_1, "RAND_INF_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_1" }, + { RAND_INF_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_2, "RAND_INF_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_2" }, + { RAND_INF_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_3, "RAND_INF_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_3" }, + { RAND_INF_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_4, "RAND_INF_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_4" }, + { RAND_INF_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_5, "RAND_INF_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE_5" }, + { RAND_INF_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_1, "RAND_INF_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_1" }, + { RAND_INF_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_2, "RAND_INF_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_2" }, + { RAND_INF_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_3, "RAND_INF_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_3" }, + { RAND_INF_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_4, "RAND_INF_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_4" }, + { RAND_INF_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_5, "RAND_INF_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_5" }, + { RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_1, "RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_1" }, + { RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_2, "RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_2" }, + { RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_3, "RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_3" }, + { RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_4, "RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_4" }, + { RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_5, "RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_5" }, + { RAND_INF_SPIRIT_GATE_SILVER_RUPEE_1, "RAND_INF_SPIRIT_GATE_SILVER_RUPEE_1" }, + { RAND_INF_SPIRIT_GATE_SILVER_RUPEE_2, "RAND_INF_SPIRIT_GATE_SILVER_RUPEE_2" }, + { RAND_INF_SPIRIT_GATE_SILVER_RUPEE_3, "RAND_INF_SPIRIT_GATE_SILVER_RUPEE_3" }, + { RAND_INF_SPIRIT_GATE_SILVER_RUPEE_4, "RAND_INF_SPIRIT_GATE_SILVER_RUPEE_4" }, + { RAND_INF_SPIRIT_GATE_SILVER_RUPEE_5, "RAND_INF_SPIRIT_GATE_SILVER_RUPEE_5" }, + { RAND_INF_SPIRIT_BEAMOS_SILVER_RUPEE_1, "RAND_INF_SPIRIT_BEAMOS_SILVER_RUPEE_1" }, + { RAND_INF_SPIRIT_BEAMOS_SILVER_RUPEE_2, "RAND_INF_SPIRIT_BEAMOS_SILVER_RUPEE_2" }, + { RAND_INF_SPIRIT_BEAMOS_SILVER_RUPEE_3, "RAND_INF_SPIRIT_BEAMOS_SILVER_RUPEE_3" }, + { RAND_INF_SPIRIT_BEAMOS_SILVER_RUPEE_4, "RAND_INF_SPIRIT_BEAMOS_SILVER_RUPEE_4" }, + { RAND_INF_SPIRIT_BEAMOS_SILVER_RUPEE_5, "RAND_INF_SPIRIT_BEAMOS_SILVER_RUPEE_5" }, + { RAND_INF_SPIRIT_BOULDER_SILVER_RUPEE_1, "RAND_INF_SPIRIT_BOULDER_SILVER_RUPEE_1" }, + { RAND_INF_SPIRIT_BOULDER_SILVER_RUPEE_2, "RAND_INF_SPIRIT_BOULDER_SILVER_RUPEE_2" }, + { RAND_INF_SPIRIT_BOULDER_SILVER_RUPEE_3, "RAND_INF_SPIRIT_BOULDER_SILVER_RUPEE_3" }, + { RAND_INF_SPIRIT_BOULDER_SILVER_RUPEE_4, "RAND_INF_SPIRIT_BOULDER_SILVER_RUPEE_4" }, + { RAND_INF_SPIRIT_BOULDER_SILVER_RUPEE_5, "RAND_INF_SPIRIT_BOULDER_SILVER_RUPEE_5" }, + { RAND_INF_SHADOW_SCYTHE_SILVER_RUPEE_1, "RAND_INF_SHADOW_SCYTHE_SILVER_RUPEE_1" }, + { RAND_INF_SHADOW_SCYTHE_SILVER_RUPEE_2, "RAND_INF_SHADOW_SCYTHE_SILVER_RUPEE_2" }, + { RAND_INF_SHADOW_SCYTHE_SILVER_RUPEE_3, "RAND_INF_SHADOW_SCYTHE_SILVER_RUPEE_3" }, + { RAND_INF_SHADOW_SCYTHE_SILVER_RUPEE_4, "RAND_INF_SHADOW_SCYTHE_SILVER_RUPEE_4" }, + { RAND_INF_SHADOW_SCYTHE_SILVER_RUPEE_5, "RAND_INF_SHADOW_SCYTHE_SILVER_RUPEE_5" }, + { RAND_INF_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_1, "RAND_INF_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_1" }, + { RAND_INF_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_2, "RAND_INF_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_2" }, + { RAND_INF_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_3, "RAND_INF_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_3" }, + { RAND_INF_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_4, "RAND_INF_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_4" }, + { RAND_INF_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_5, "RAND_INF_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_5" }, + { RAND_INF_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_1, "RAND_INF_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_1" }, + { RAND_INF_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_2, "RAND_INF_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_2" }, + { RAND_INF_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_3, "RAND_INF_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_3" }, + { RAND_INF_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_4, "RAND_INF_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_4" }, + { RAND_INF_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_5, "RAND_INF_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE_5" }, + { RAND_INF_FOREST_TRIAL_SILVER_RUPEE_1, "RAND_INF_FOREST_TRIAL_SILVER_RUPEE_1" }, + { RAND_INF_FOREST_TRIAL_SILVER_RUPEE_2, "RAND_INF_FOREST_TRIAL_SILVER_RUPEE_2" }, + { RAND_INF_FOREST_TRIAL_SILVER_RUPEE_3, "RAND_INF_FOREST_TRIAL_SILVER_RUPEE_3" }, + { RAND_INF_FOREST_TRIAL_SILVER_RUPEE_4, "RAND_INF_FOREST_TRIAL_SILVER_RUPEE_4" }, + { RAND_INF_FOREST_TRIAL_SILVER_RUPEE_5, "RAND_INF_FOREST_TRIAL_SILVER_RUPEE_5" }, + { RAND_INF_FIRE_TRIAL_SILVER_RUPEE_1, "RAND_INF_FIRE_TRIAL_SILVER_RUPEE_1" }, + { RAND_INF_FIRE_TRIAL_SILVER_RUPEE_2, "RAND_INF_FIRE_TRIAL_SILVER_RUPEE_2" }, + { RAND_INF_FIRE_TRIAL_SILVER_RUPEE_3, "RAND_INF_FIRE_TRIAL_SILVER_RUPEE_3" }, + { RAND_INF_FIRE_TRIAL_SILVER_RUPEE_4, "RAND_INF_FIRE_TRIAL_SILVER_RUPEE_4" }, + { RAND_INF_FIRE_TRIAL_SILVER_RUPEE_5, "RAND_INF_FIRE_TRIAL_SILVER_RUPEE_5" }, + { RAND_INF_LIGHT_TRIAL_SILVER_RUPEE_1, "RAND_INF_LIGHT_TRIAL_SILVER_RUPEE_1" }, + { RAND_INF_LIGHT_TRIAL_SILVER_RUPEE_2, "RAND_INF_LIGHT_TRIAL_SILVER_RUPEE_2" }, + { RAND_INF_LIGHT_TRIAL_SILVER_RUPEE_3, "RAND_INF_LIGHT_TRIAL_SILVER_RUPEE_3" }, + { RAND_INF_LIGHT_TRIAL_SILVER_RUPEE_4, "RAND_INF_LIGHT_TRIAL_SILVER_RUPEE_4" }, + { RAND_INF_LIGHT_TRIAL_SILVER_RUPEE_5, "RAND_INF_LIGHT_TRIAL_SILVER_RUPEE_5" }, + { RAND_INF_SPIRIT_TRIAL_SILVER_RUPEE_1, "RAND_INF_SPIRIT_TRIAL_SILVER_RUPEE_1" }, + { RAND_INF_SPIRIT_TRIAL_SILVER_RUPEE_2, "RAND_INF_SPIRIT_TRIAL_SILVER_RUPEE_2" }, + { RAND_INF_SPIRIT_TRIAL_SILVER_RUPEE_3, "RAND_INF_SPIRIT_TRIAL_SILVER_RUPEE_3" }, + { RAND_INF_SPIRIT_TRIAL_SILVER_RUPEE_4, "RAND_INF_SPIRIT_TRIAL_SILVER_RUPEE_4" }, + { RAND_INF_SPIRIT_TRIAL_SILVER_RUPEE_5, "RAND_INF_SPIRIT_TRIAL_SILVER_RUPEE_5" }, + { RAND_INF_DODONGOS_CAVERN_MQ_SILVER_RUPEE_1, "RAND_INF_DODONGOS_CAVERN_MQ_SILVER_RUPEE_1" }, + { RAND_INF_DODONGOS_CAVERN_MQ_SILVER_RUPEE_2, "RAND_INF_DODONGOS_CAVERN_MQ_SILVER_RUPEE_2" }, + { RAND_INF_DODONGOS_CAVERN_MQ_SILVER_RUPEE_3, "RAND_INF_DODONGOS_CAVERN_MQ_SILVER_RUPEE_3" }, + { RAND_INF_DODONGOS_CAVERN_MQ_SILVER_RUPEE_4, "RAND_INF_DODONGOS_CAVERN_MQ_SILVER_RUPEE_4" }, + { RAND_INF_DODONGOS_CAVERN_MQ_SILVER_RUPEE_5, "RAND_INF_DODONGOS_CAVERN_MQ_SILVER_RUPEE_5" }, + { RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_1, "RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_1" }, + { RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_2, "RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_2" }, + { RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_3, "RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_3" }, + { RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_4, "RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_4" }, + { RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_5, "RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_5" }, + { RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_1, "RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_1" }, + { RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_2, "RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_2" }, + { RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_3, "RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_3" }, + { RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_4, "RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_4" }, + { RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_5, "RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_5" }, + { RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_6, "RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_6" }, + { RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE_1, "RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE_1" }, + { RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE_2, "RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE_2" }, + { RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE_3, "RAND_INF_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE_3" }, + { RAND_INF_SPIRIT_MQ_LOBBY_SILVER_RUPEE_1, "RAND_INF_SPIRIT_MQ_LOBBY_SILVER_RUPEE_1" }, + { RAND_INF_SPIRIT_MQ_LOBBY_SILVER_RUPEE_2, "RAND_INF_SPIRIT_MQ_LOBBY_SILVER_RUPEE_2" }, + { RAND_INF_SPIRIT_MQ_LOBBY_SILVER_RUPEE_3, "RAND_INF_SPIRIT_MQ_LOBBY_SILVER_RUPEE_3" }, + { RAND_INF_SPIRIT_MQ_LOBBY_SILVER_RUPEE_4, "RAND_INF_SPIRIT_MQ_LOBBY_SILVER_RUPEE_4" }, + { RAND_INF_SPIRIT_MQ_LOBBY_SILVER_RUPEE_5, "RAND_INF_SPIRIT_MQ_LOBBY_SILVER_RUPEE_5" }, + { RAND_INF_SHADOW_MQ_SCYTHE_SILVER_RUPEE_1, "RAND_INF_SHADOW_MQ_SCYTHE_SILVER_RUPEE_1" }, + { RAND_INF_SHADOW_MQ_SCYTHE_SILVER_RUPEE_2, "RAND_INF_SHADOW_MQ_SCYTHE_SILVER_RUPEE_2" }, + { RAND_INF_SHADOW_MQ_SCYTHE_SILVER_RUPEE_3, "RAND_INF_SHADOW_MQ_SCYTHE_SILVER_RUPEE_3" }, + { RAND_INF_SHADOW_MQ_SCYTHE_SILVER_RUPEE_4, "RAND_INF_SHADOW_MQ_SCYTHE_SILVER_RUPEE_4" }, + { RAND_INF_SHADOW_MQ_SCYTHE_SILVER_RUPEE_5, "RAND_INF_SHADOW_MQ_SCYTHE_SILVER_RUPEE_5" }, + { RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_1, "RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_1" }, + { RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_2, "RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_2" }, + { RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_3, "RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_3" }, + { RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_4, "RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_4" }, + { RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_5, "RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_5" }, + { RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_6, "RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_6" }, + { RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_7, "RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_7" }, + { RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_8, "RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_8" }, + { RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_9, "RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_9" }, + { RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_10, "RAND_INF_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_10" }, + { RAND_INF_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_1, "RAND_INF_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_1" }, + { RAND_INF_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_2, "RAND_INF_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_2" }, + { RAND_INF_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_3, "RAND_INF_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_3" }, + { RAND_INF_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_4, "RAND_INF_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_4" }, + { RAND_INF_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_5, "RAND_INF_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_5" }, + { RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_1, "RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_1" }, + { RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_2, "RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_2" }, + { RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_3, "RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_3" }, + { RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_4, "RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_4" }, + { RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_5, "RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_5" }, + { RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_6, "RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_6" }, + { RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_7, "RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_7" }, + { RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_8, "RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_8" }, + { RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_9, "RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_9" }, + { RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_10, "RAND_INF_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_10" }, + { RAND_INF_FIRE_TRIAL_MQ_SILVER_RUPEE_1, "RAND_INF_FIRE_TRIAL_MQ_SILVER_RUPEE_1" }, + { RAND_INF_FIRE_TRIAL_MQ_SILVER_RUPEE_2, "RAND_INF_FIRE_TRIAL_MQ_SILVER_RUPEE_2" }, + { RAND_INF_FIRE_TRIAL_MQ_SILVER_RUPEE_3, "RAND_INF_FIRE_TRIAL_MQ_SILVER_RUPEE_3" }, + { RAND_INF_FIRE_TRIAL_MQ_SILVER_RUPEE_4, "RAND_INF_FIRE_TRIAL_MQ_SILVER_RUPEE_4" }, + { RAND_INF_FIRE_TRIAL_MQ_SILVER_RUPEE_5, "RAND_INF_FIRE_TRIAL_MQ_SILVER_RUPEE_5" }, + { RAND_INF_WATER_TRIAL_MQ_SILVER_RUPEE_1, "RAND_INF_WATER_TRIAL_MQ_SILVER_RUPEE_1" }, + { RAND_INF_WATER_TRIAL_MQ_SILVER_RUPEE_2, "RAND_INF_WATER_TRIAL_MQ_SILVER_RUPEE_2" }, + { RAND_INF_WATER_TRIAL_MQ_SILVER_RUPEE_3, "RAND_INF_WATER_TRIAL_MQ_SILVER_RUPEE_3" }, + { RAND_INF_WATER_TRIAL_MQ_SILVER_RUPEE_4, "RAND_INF_WATER_TRIAL_MQ_SILVER_RUPEE_4" }, + { RAND_INF_WATER_TRIAL_MQ_SILVER_RUPEE_5, "RAND_INF_WATER_TRIAL_MQ_SILVER_RUPEE_5" }, + { RAND_INF_SHADOW_TRIAL_MQ_SILVER_RUPEE_1, "RAND_INF_SHADOW_TRIAL_MQ_SILVER_RUPEE_1" }, + { RAND_INF_SHADOW_TRIAL_MQ_SILVER_RUPEE_2, "RAND_INF_SHADOW_TRIAL_MQ_SILVER_RUPEE_2" }, + { RAND_INF_SHADOW_TRIAL_MQ_SILVER_RUPEE_3, "RAND_INF_SHADOW_TRIAL_MQ_SILVER_RUPEE_3" }, + { RAND_INF_SHADOW_TRIAL_MQ_SILVER_RUPEE_4, "RAND_INF_SHADOW_TRIAL_MQ_SILVER_RUPEE_4" }, + { RAND_INF_SHADOW_TRIAL_MQ_SILVER_RUPEE_5, "RAND_INF_SHADOW_TRIAL_MQ_SILVER_RUPEE_5" }, + { RAND_INF_MAGICAL_SILVER_RUPEE, "RAND_INF_MAGICAL_SILVER_RUPEE" } } }, }; From 4a25a07a72ba21fabe83a398c242f1c5ff434926 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Wed, 10 Apr 2024 14:09:10 -0400 Subject: [PATCH 025/108] Adds remaining code for Master Quest Rupees to work --- soh/soh/Enhancements/mods.cpp | 5 +- .../randomizer/3drando/item_pool.cpp | 15 ++++ .../locacc_dodongos_cavern.cpp | 5 ++ .../location_access/locacc_ganons_castle.cpp | 19 ++++- .../locacc_gerudo_training_grounds.cpp | 14 ++++ .../location_access/locacc_shadow_temple.cpp | 30 +++++++ .../location_access/locacc_spirit_temple.cpp | 5 ++ soh/soh/Enhancements/randomizer/item_list.cpp | 24 ++++++ .../Enhancements/randomizer/location_list.cpp | 81 +++++++++++++++++++ .../Enhancements/randomizer/randomizerTypes.h | 1 + .../Enhancements/randomizer/randomizer_inf.h | 1 + .../Enhancements/randomizer/silver_rupee.cpp | 2 +- soh/soh/Enhancements/randomizer/static_data.h | 2 +- 13 files changed, 200 insertions(+), 4 deletions(-) diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index 9091dbab278..f954d6b6031 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -1206,7 +1206,10 @@ void RegisterSilverRupeeShuffle() { silverRupee->actionFunc = EnGSwitch_Randomizer_SilverRupeeIdle; silverRupee->actor.draw = EnGSwitch_Randomizer_Draw; } else if (silverRupee->type == ENGSWITCH_SILVER_TRACKER) { - Rando::Identifier randoIdentifier = { static_cast(gPlayState->sceneNum), RCQUEST_VANILLA, actor->params }; + Rando::Identifier randoIdentifier = { + static_cast(gPlayState->sceneNum), + ResourceMgr_IsSceneMasterQuest(gPlayState->sceneNum) ? RCQUEST_MQ : RCQUEST_VANILLA, actor->params + }; silverRupee->rg = Rando::StaticData::silverTrackerMap.at(randoIdentifier); if ((OTRGlobals::Instance->gRandoContext->GetSilverRupees()->GetInfo(silverRupee->rg).GetCollected() >= silverRupee->silverCount) || Flags_GetRandomizerInf(RAND_INF_MAGICAL_SILVER_RUPEE)) { diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index 404a3140975..ad8faff3bcd 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -1081,22 +1081,37 @@ void GenerateItemPool() { 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->GetSilverRupees()->GetInfo(rgid).GetTotal()); diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_dodongos_cavern.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_dodongos_cavern.cpp index 9c7202b685e..b9f199f830f 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_dodongos_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_dodongos_cavern.cpp @@ -233,6 +233,11 @@ void AreaTable_Init_DodongosCavern() { LocationAccess(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, {[]{return logic->CanStunDeku;}}), LocationAccess(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, {[]{return logic->CanStunDeku;}}), LocationAccess(RC_DODONGOS_CAVERN_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_1, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_2, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_3, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_4, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_DODONGOS_CAVERN_MQ_SILVER_RUPEE_5, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ }, { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_LOWER_RIGHT_SIDE, {[]{return Here(RR_DODONGOS_CAVERN_MQ_LOBBY, []{return logic->CanBlastOrSmash || (((logic->IsChild && logic->CanUse(RG_STICKS)) || logic->CanUse(RG_DINS_FIRE)) && logic->CanTakeDamage);});}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp index cd67bd635f7..7e45a6dc16d 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp @@ -190,7 +190,14 @@ void AreaTable_Init_GanonsCastle() { //Events EventAccess(&logic->FireTrialClear, {[]{return logic->CanUse(RG_GORON_TUNIC) && logic->CanUse(RG_GOLDEN_GAUNTLETS) && logic->CanUse(RG_LIGHT_ARROWS) && (logic->CanUse(RG_LONGSHOT) || logic->HoverBoots || (randoCtx->GetTrickOption(RT_GANON_MQ_FIRE_TRIAL) && logic->CanUse(RG_HOOKSHOT)));}}), //Trick: logic->CanUse(RG_GORON_TUNIC) && logic->CanUse(RG_GOLDEN_GAUNTLETS) && logic->CanUse(RG_LIGHT_ARROWS) && (logic->CanUse(RG_LONGSHOT) || logic->HoverBoots || (LogicFireTrialMQ && logic->CanUse(RG_HOOKSHOT))) - }, {}, {}); + }, { + // Locations + LocationAccess(RC_FIRE_TRIAL_MQ_SILVER_RUPEE_1, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_FIRE_TRIAL_MQ_SILVER_RUPEE_2, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_FIRE_TRIAL_MQ_SILVER_RUPEE_3, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_FIRE_TRIAL_MQ_SILVER_RUPEE_4, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_FIRE_TRIAL_MQ_SILVER_RUPEE_5, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + }, {}); areaTable[RR_GANONS_CASTLE_MQ_WATER_TRIAL] = Area("Ganon's Castle MQ Water Trial", "Ganons Castle", RA_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { //Events @@ -199,6 +206,11 @@ void AreaTable_Init_GanonsCastle() { }, { //Locations LocationAccess(RC_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, {[]{return logic->BlueFire;}}), + LocationAccess(RC_WATER_TRIAL_MQ_SILVER_RUPEE_1, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_WATER_TRIAL_MQ_SILVER_RUPEE_2, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_WATER_TRIAL_MQ_SILVER_RUPEE_3, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_WATER_TRIAL_MQ_SILVER_RUPEE_4, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_WATER_TRIAL_MQ_SILVER_RUPEE_5, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ }, {}); areaTable[RR_GANONS_CASTLE_MQ_SHADOW_TRIAL] = Area("Ganon's Castle MQ Shadow Trial", "Ganons Castle", RA_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { @@ -210,6 +222,11 @@ void AreaTable_Init_GanonsCastle() { LocationAccess(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST, {[]{return logic->IsAdult && ((logic->Bow && (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS))) || (logic->CanUse(RG_HOVER_BOOTS) && (randoCtx->GetTrickOption(RT_LENS_GANON_MQ) || logic->CanUse(RG_LENS_OF_TRUTH)) && (logic->HasExplosives || logic->GoronBracelet || logic->CanUse(RG_DINS_FIRE))));}}), LocationAccess(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, {[]{return logic->IsAdult && logic->Bow && (randoCtx->GetTrickOption(RT_LENS_GANON_MQ) || logic->CanUse(RG_LENS_OF_TRUTH)) && (logic->HoverBoots || (logic->Hookshot && (logic->HasFireSource || randoCtx->GetTrickOption(RT_GANON_MQ_SHADOW_TRIAL))));}}), //Trick: logic->IsAdult && logic->Bow && (LogicLensCastleMQ || logic->CanUse(RG_LENS_OF_TRUTH)) && (logic->HoverBoots || (logic->Hookshot && (logic->HasFireSource || LogicShadowTrialMQ))) + LocationAccess(RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_1, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_2, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_3, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_4, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_TRIAL_MQ_SILVER_RUPEE_5, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ }, {}); areaTable[RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL] = Area("Ganon's Castle MQ Spirit Castle", "Ganons Castle", RA_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_training_grounds.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_training_grounds.cpp index 5b1bd748060..72cfe6d1cbd 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_training_grounds.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_training_grounds.cpp @@ -158,6 +158,9 @@ void AreaTable_Init_GerudoTrainingGrounds() { areaTable[RR_GERUDO_TRAINING_GROUNDS_MQ_UNDERWATER] = Area("Gerudo Training Grounds MQ Underwater", "Gerudo Training Grounds", RA_GERUDO_TRAINING_GROUND, NO_DAY_NIGHT_CYCLE, {}, { //Locations LocationAccess(RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, {[]{return logic->HasFireSource && logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24 && logic->CanTakeDamage;}}), + LocationAccess(RC_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE_1, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE_2, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE_3, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ }, {}); areaTable[RR_GERUDO_TRAINING_GROUNDS_MQ_LEFT_SIDE] = Area("Gerudo Training Grounds MQ Left Side", "Gerudo Training Grounds", RA_GERUDO_TRAINING_GROUND, NO_DAY_NIGHT_CYCLE, {}, { @@ -176,6 +179,11 @@ void AreaTable_Init_GerudoTrainingGrounds() { //Locations LocationAccess(RC_GERUDO_TRAINING_GROUND_MQ_BEFORE_HEAVY_BLOCK_CHEST, {[]{return logic->IsAdult && (logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD));}}), LocationAccess(RC_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST, {[]{return logic->CanUse(RG_SILVER_GAUNTLETS) && (logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD));}}), + LocationAccess(RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_1, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_2, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_3, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_4, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE_5, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ }, { //Exits Entrance(RR_GERUDO_TRAINING_GROUNDS_MQ_BACK_AREAS, {[]{return logic->IsAdult && (logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD)) && (randoCtx->GetTrickOption(RT_LENS_GTG_MQ) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->BlueFire && (logic->CanUse(RG_SONG_OF_TIME) || (randoCtx->GetTrickOption(RT_GTG_FAKE_WALL) && logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS)));}}), @@ -198,6 +206,12 @@ void AreaTable_Init_GerudoTrainingGrounds() { LocationAccess(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_CENTRAL_CHEST, {[]{return true;}}), LocationAccess(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_SIDE_CHEST, {[]{return true;}}), LocationAccess(RC_GERUDO_TRAINING_GROUND_MQ_ICE_ARROWS_CHEST, {[]{return logic->SmallKeys(RR_GERUDO_TRAINING_GROUNDS, 3);}}), + LocationAccess(RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_1, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_2, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_3, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_4, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_5, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE_6, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ }, { //Exits Entrance(RR_GERUDO_TRAINING_GROUNDS_MQ_UNDERWATER, {[]{return logic->IsAdult && (logic->CanUse(RG_LONGSHOT) || (logic->CanUse(RG_HOOKSHOT) && logic->Bow));}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp index 6c82a8517af..12e16fd43e8 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp @@ -124,6 +124,11 @@ void AreaTable_Init_ShadowTemple() { LocationAccess(RC_SHADOW_TEMPLE_MQ_MAP_CHEST, {[]{return logic->CanAdultAttack || logic->Nuts;}}), LocationAccess(RC_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, {[]{return logic->CanJumpslash;}}), LocationAccess(RC_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, {[]{return logic->CanAdultAttack || logic->Nuts;}}), + LocationAccess(RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_1, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_2, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_3, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_4, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_MQ_SCYTHE_SILVER_RUPEE_5, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ }, { //Exits Entrance(RR_SHADOW_TEMPLE_MQ_UPPER_HUGE_PIT, {[]{return logic->HasExplosives && logic->SmallKeys(RR_SHADOW_TEMPLE, 2);}}), @@ -135,6 +140,16 @@ void AreaTable_Init_ShadowTemple() { //Trick: logic->CanUse(RG_SONG_OF_TIME) || (LogicShadowMQInvisibleBlades && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_OHKO)) LocationAccess(RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST, {[]{return logic->CanUse(RG_SONG_OF_TIME) || (randoCtx->GetTrickOption(RT_SHADOW_MQ_INVISIBLE_BLADES) && randoCtx->GetOption(RSK_DAMAGE_MULTIPLIER).IsNot(RO_DAMAGE_MULTIPLIER_OHKO));}}), //Trick: logic->CanUse(RG_SONG_OF_TIME) || (LogicShadowMQInvisibleBlades && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_OHKO)) + LocationAccess(RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_1, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_2, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_3, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_4, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_5, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_6, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_7, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_8, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_9, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_10, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ }, { //Exits Entrance(RR_SHADOW_TEMPLE_MQ_LOWER_HUGE_PIT, {[]{return logic->HasFireSource || randoCtx->GetTrickOption(RT_SHADOW_MQ_HUGE_PIT);}}), @@ -143,11 +158,26 @@ void AreaTable_Init_ShadowTemple() { areaTable[RR_SHADOW_TEMPLE_MQ_LOWER_HUGE_PIT] = Area("Shadow Temple MQ Lower Huge Pit", "Shadow Temple", RA_SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations + LocationAccess(RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_1, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_2, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_3, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_4, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_5, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ LocationAccess(RC_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, {[]{return logic->IsAdult && logic->CanUse(RG_LONGSHOT);}}), LocationAccess(RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST, {[]{return true;}}), LocationAccess(RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST, {[]{return (randoCtx->GetTrickOption(RT_SHADOW_UMBRELLA) && logic->HoverBoots) || logic->GoronBracelet;}}), LocationAccess(RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST, {[]{return (randoCtx->GetTrickOption(RT_SHADOW_UMBRELLA) && logic->HoverBoots) || logic->GoronBracelet;}}), LocationAccess(RC_SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST, {[]{return logic->CanJumpslash && logic->HoverBoots && logic->SmallKeys(RR_SHADOW_TEMPLE, 3) && ((randoCtx->GetTrickOption(RT_LENS_SHADOW_MQ) && randoCtx->GetTrickOption(RT_LENS_SHADOW_MQ_PLATFORM)) || logic->CanUse(RG_LENS_OF_TRUTH));}}), + LocationAccess(RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_1, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_2, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_3, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_4, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_5, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_6, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_7, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_8, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_9, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE_10, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ LocationAccess(RC_SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST, {[]{return (logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD)) && logic->HoverBoots && logic->SmallKeys(RR_SHADOW_TEMPLE, 3) && logic->Hookshot && ((randoCtx->GetTrickOption(RT_LENS_SHADOW_MQ) && randoCtx->GetTrickOption(RT_LENS_SHADOW_MQ_INVISIBLE_BLADES) && randoCtx->GetTrickOption(RT_LENS_SHADOW_MQ_PLATFORM)) || logic->CanUse(RG_LENS_OF_TRUTH));}}), LocationAccess(RC_SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM, {[]{return logic->Hookshot || (randoCtx->GetTrickOption(RT_SHADOW_UMBRELLA_GS) && logic->HoverBoots);}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp index 37845be47f2..b14868e2af6 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp @@ -162,6 +162,11 @@ void AreaTable_Init_SpiritTemple() { LocationAccess(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST, {[]{return true;}}), LocationAccess(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST, {[]{return Here(RR_SPIRIT_TEMPLE_MQ_LOBBY, []{return logic->CanBlastOrSmash;}) && ((logic->IsChild && logic->CanUse(RG_FAIRY_SLINGSHOT)) || (logic->IsAdult && logic->CanUse(RG_FAIRY_BOW)));}}), LocationAccess(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST, {[]{return logic->HasBombchus || (logic->IsAdult && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT))) || (logic->IsChild && (logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_BOOMERANG)));}}), + LocationAccess(RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_1, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_2, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_3, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_4, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_SPIRIT_MQ_LOBBY_SILVER_RUPEE_5, {[]{ return true; }}), /*TODO: Silver Rupee Logic*/ }, { //Exits Entrance(RR_SPIRIT_TEMPLE_ENTRYWAY, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/item_list.cpp b/soh/soh/Enhancements/randomizer/item_list.cpp index 34c1cf46c4e..5a2347821b8 100644 --- a/soh/soh/Enhancements/randomizer/item_list.cpp +++ b/soh/soh/Enhancements/randomizer/item_list.cpp @@ -323,6 +323,30 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_SPIRIT_TRIAL_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); itemTable[RG_LIGHT_TRIAL_SILVER_RUPEE] = Item(RG_LIGHT_TRIAL_SILVER_RUPEE, Text{ "Light Trial Silver Rupee", "Light Trial Silver Rupee", "Light Trial Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, 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->noVariable, 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->noVariable, 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->noVariable, 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 Outside Falling Spikes Silver Rupee", "Shadow Temple MQ Outside Falling Spikes Silver Rupee", "Shadow Temple MQ Outside Falling Spikes Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, 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->noVariable, 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->noVariable, 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{ "Gerudo Training Grounds MQ Boulder Maze Silver Rupee", "Gerudo Training Grounds MQ Boulder Maze Silver Rupee", "Gerudo Training Grounds MQ Boulder Maze Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_GERUDO_TRAINING_GROUNDS_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{ "Gerudo Training Grounds MQ Lava Room Silver Rupee", "Gerudo Training Grounds MQ Lava Room Silver Rupee", "Gerudo Training Grounds MQ Lava Room Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_GERUDO_TRAINING_GROUNDS_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{ "Gerudo Training Grounds MQ Whirlpool Room Silver Rupee", "Gerudo Training Grounds MQ Whirlpool Room Silver Rupee", "Gerudo Training Grounds MQ Whirlpool Room Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_GERUDO_TRAINING_GROUNDS_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{ "Fire Trial MQ Silver Rupee", "Fire Trial MQ Silver Rupee", "Fire Trial MQ Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, 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{ "Water Trial MQ Silver Rupee", "Water Trial MQ Silver Rupee", "Water Trial MQ Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, 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{ "Shadow Trial MQ Silver Rupee", "Shadow Trial MQ Silver Rupee", "Shadow Trial MQ Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, 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_MAGICAL_SILVER_RUPEE] = Item(RG_MAGICAL_SILVER_RUPEE, Text{ "Magical Silver Rupee", "Magical Silver Rupee", "Magical Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_MAGICAL_SILVER_RUPEE, RG_MAGICAL_SILVER_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_SILVER_RUPEE, MOD_RANDOMIZER); itemTable[RG_MAGICAL_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 55ebe5746b0..264b4fc2d16 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -1610,6 +1610,87 @@ void Rando::StaticData::InitLocationTable() { 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, 0, 0x0, "Light Trial Silver Rupee 4", "Inside Ganon's Castle Light Trial Silver Rupee 4", RHT_LIGHT_TRIAL_SILVER_RUPEE, RG_LIGHT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Light Trial Silver Rupee 5", "Inside Ganon's Castle Light Trial Silver Rupee 5", RHT_LIGHT_TRIAL_SILVER_RUPEE, RG_LIGHT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Silver Rupee 1", "Dodongo's Cavern Silver Rupee 1", RHT_DODONGOS_CAVERN_SILVER_RUPEE, RG_DODONGOS_CAVERN_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_DODONGOS_CAVERN, 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, 0, 0x0, "Silver Rupee 2", "Dodongo's Cavern Silver Rupee 2", RHT_DODONGOS_CAVERN_SILVER_RUPEE, RG_DODONGOS_CAVERN_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_DODONGOS_CAVERN, 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, 0, 0x0, "Silver Rupee 3", "Dodongo's Cavern Silver Rupee 3", RHT_DODONGOS_CAVERN_SILVER_RUPEE, RG_DODONGOS_CAVERN_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_DODONGOS_CAVERN, 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, 0, 0x0, "Silver Rupee 4", "Dodongo's Cavern Silver Rupee 4", RHT_DODONGOS_CAVERN_SILVER_RUPEE, RG_DODONGOS_CAVERN_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_DODONGOS_CAVERN, 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, 0, 0x0, "Silver Rupee 5", "Dodongo's Cavern Silver Rupee 5", RHT_DODONGOS_CAVERN_SILVER_RUPEE, RG_DODONGOS_CAVERN_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_DODONGOS_CAVERN, 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, 0, 0x0, "Spinning Scythe Silver Rupee 1", "Shadow Temple MQ Spinning Scythe Silver Rupee 1", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Spinning Scythe Silver Rupee 2", "Shadow Temple MQ Spinning Scythe Silver Rupee 2", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Spinning Scythe Silver Rupee 3", "Shadow Temple MQ Spinning Scythe Silver Rupee 3", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Spinning Scythe Silver Rupee 4", "Shadow Temple MQ Spinning Scythe Silver Rupee 4", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Spinning Scythe Silver Rupee 5", "Shadow Temple MQ Spinning Scythe Silver Rupee 5", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Scythe Silver Rupee 1", "Shadow Temple MQ Invisible Scythe Silver Rupee 1", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Scythe Silver Rupee 2", "Shadow Temple MQ Invisible Scythe Silver Rupee 2", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Scythe Silver Rupee 3", "Shadow Temple MQ Invisible Scythe Silver Rupee 3", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Scythe Silver Rupee 4", "Shadow Temple MQ Invisible Scythe Silver Rupee 4", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Scythe Silver Rupee 5", "Shadow Temple MQ Invisible Scythe Silver Rupee 5", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Scythe Silver Rupee 6", "Shadow Temple MQ Invisible Scythe Silver Rupee 6", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Scythe Silver Rupee 7", "Shadow Temple MQ Invisible Scythe Silver Rupee 7", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Scythe Silver Rupee 8", "Shadow Temple MQ Invisible Scythe Silver Rupee 8", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Scythe Silver Rupee 9", "Shadow Temple MQ Invisible Scythe Silver Rupee 9", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Scythe Silver Rupee 10", "Shadow Temple MQ Invisible Scythe Silver Rupee 10", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Outside Spike Rain Silver Rupee 1", "Shadow Temple MQ Outside Spike Rain Silver Rupee 1", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Outside Spike Rain Silver Rupee 2", "Shadow Temple MQ Outside Spike Rain Silver Rupee 2", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, RAND_INF_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_2)); + 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, 0, 0x0, "Outside Spike Rain Silver Rupee 3", "Shadow Temple MQ Outside Spike Rain Silver Rupee 3", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Outside Spike Rain Silver Rupee 4", "Shadow Temple MQ Outside Spike Rain Silver Rupee 4", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, RAND_INF_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_4)); + 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, 0, 0x0, "Outside Spike Rain Silver Rupee 5", "Shadow Temple MQ Outside Spike Rain Silver Rupee 5", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Silver Rupee 1", "Shadow Temple MQ Invisible Spikes Silver Rupee 1", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Silver Rupee 2", "Shadow Temple MQ Invisible Spikes Silver Rupee 2", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Silver Rupee 3", "Shadow Temple MQ Invisible Spikes Silver Rupee 3", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Silver Rupee 4", "Shadow Temple MQ Invisible Spikes Silver Rupee 4", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Silver Rupee 5", "Shadow Temple MQ Invisible Spikes Silver Rupee 5", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Silver Rupee 6", "Shadow Temple MQ Invisible Spikes Silver Rupee 6", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Silver Rupee 7", "Shadow Temple MQ Invisible Spikes Silver Rupee 7", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Silver Rupee 8", "Shadow Temple MQ Invisible Spikes Silver Rupee 8", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Silver Rupee 9", "Shadow Temple MQ Invisible Spikes Silver Rupee 9", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Silver Rupee 10", "Shadow Temple MQ Invisible Spikes Silver Rupee 10", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Lobby Silver Rupee 1", "Spirit Temple MQ Lobby Silver Rupee 1", RHT_SPIRIT_TEMPLE_SILVER_RUPEE, RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Lobby Silver Rupee 2", "Spirit Temple MQ Lobby Silver Rupee 2", RHT_SPIRIT_TEMPLE_SILVER_RUPEE, RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Lobby Silver Rupee 3", "Spirit Temple MQ Lobby Silver Rupee 3", RHT_SPIRIT_TEMPLE_SILVER_RUPEE, RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Lobby Silver Rupee 4", "Spirit Temple MQ Lobby Silver Rupee 4", RHT_SPIRIT_TEMPLE_SILVER_RUPEE, RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Lobby Silver Rupee 5", "Spirit Temple MQ Lobby Silver Rupee 5", RHT_SPIRIT_TEMPLE_SILVER_RUPEE, RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Boulder Maze Silver Rupee 1", "Gerduo Training Grounds MQ Boulder Maze Silver Rupee 1", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Boulder Maze Silver Rupee 2", "Gerduo Training Grounds MQ Boulder Maze Silver Rupee 2", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Boulder Maze Silver Rupee 3", "Gerduo Training Grounds MQ Boulder Maze Silver Rupee 3", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Boulder Maze Silver Rupee 4", "Gerduo Training Grounds MQ Boulder Maze Silver Rupee 4", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Boulder Maze Silver Rupee 5", "Gerduo Training Grounds MQ Boulder Maze Silver Rupee 5", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Lava Room Silver Rupee 1", "Gerduo Training Grounds MQ Lava Room Silver Rupee 1", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Lava Room Silver Rupee 2", "Gerduo Training Grounds MQ Lava Room Silver Rupee 2", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Lava Room Silver Rupee 3", "Gerduo Training Grounds MQ Lava Room Silver Rupee 3", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Lava Room Silver Rupee 4", "Gerduo Training Grounds MQ Lava Room Silver Rupee 4", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Lava Room Silver Rupee 5", "Gerduo Training Grounds MQ Lava Room Silver Rupee 5", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Lava Room Silver Rupee 6", "Gerduo Training Grounds MQ Lava Room Silver Rupee 6", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Toilet Room Silver Rupee 1", "Gerduo Training Grounds MQ Toilet Room Silver Rupee 1", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Toilet Room Silver Rupee 2", "Gerduo Training Grounds MQ Toilet Room Silver Rupee 2", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Toilet Room Silver Rupee 3", "Gerduo Training Grounds MQ Toilet Room Silver Rupee 3", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Fire Trial MQ Silver Rupee 1", "Ganon's Castle Fire Trial MQ Silver Rupee 1", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_FIRE_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Fire Trial MQ Silver Rupee 2", "Ganon's Castle Fire Trial MQ Silver Rupee 2", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_FIRE_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Fire Trial MQ Silver Rupee 3", "Ganon's Castle Fire Trial MQ Silver Rupee 3", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_FIRE_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Fire Trial MQ Silver Rupee 4", "Ganon's Castle Fire Trial MQ Silver Rupee 4", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_FIRE_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Fire Trial MQ Silver Rupee 5", "Ganon's Castle Fire Trial MQ Silver Rupee 5", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_FIRE_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Water Trial MQ Silver Rupee 1", "Ganon's Castle Water Trial MQ Silver Rupee 1", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_WATER_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Water Trial MQ Silver Rupee 2", "Ganon's Castle Water Trial MQ Silver Rupee 2", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_WATER_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Water Trial MQ Silver Rupee 3", "Ganon's Castle Water Trial MQ Silver Rupee 3", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_WATER_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Water Trial MQ Silver Rupee 4", "Ganon's Castle Water Trial MQ Silver Rupee 4", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_WATER_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Water Trial MQ Silver Rupee 5", "Ganon's Castle Water Trial MQ Silver Rupee 5", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_WATER_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Shadow Trial MQ Silver Rupee 1", "Ganon's Castle Shadow Trial MQ Silver Rupee 1", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_SHADOW_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Shadow Trial MQ Silver Rupee 2", "Ganon's Castle Shadow Trial MQ Silver Rupee 2", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_SHADOW_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Shadow Trial MQ Silver Rupee 3", "Ganon's Castle Shadow Trial MQ Silver Rupee 3", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_SHADOW_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Shadow Trial MQ Silver Rupee 4", "Ganon's Castle Shadow Trial MQ Silver Rupee 4", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_SHADOW_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Shadow Trial MQ Silver Rupee 5", "Ganon's Castle Shadow Trial MQ Silver Rupee 5", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_SHADOW_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, RAND_INF_SHADOW_TRIAL_MQ_SILVER_RUPEE_5)); + // Gossip Stones // RandomizerCheck Randomizer Check Quest Area Scene Params Flag Short Name Spoiler name Categories locationTable[RC_DMC_GOSSIP_STONE] = Location::HintStone(RC_DMC_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 14341, 0x05, "Gossip Stone", "DMC Gossip Stone", {}); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index ed0bd7e81a1..74b0e5d4233 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -3166,6 +3166,7 @@ typedef enum { RHT_FIRE_TRIAL_SILVER_RUPEE, RHT_SPIRIT_TRIAL_SILVER_RUPEE, RHT_LIGHT_TRIAL_SILVER_RUPEE, + RHT_DODONGOS_CAVERN_SILVER_RUPEE, // TODO: MQ Silver Rupees // Items RHT_KOKIRI_SWORD, diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index 4a9b53445ea..ebbc5c50a18 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -291,6 +291,7 @@ typedef enum { RAND_INF_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_3, RAND_INF_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_4, RAND_INF_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_5, + RAND_INF_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE_6, RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_1, RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_2, RAND_INF_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE_3, diff --git a/soh/soh/Enhancements/randomizer/silver_rupee.cpp b/soh/soh/Enhancements/randomizer/silver_rupee.cpp index 5aec18ae7c0..90391b032db 100644 --- a/soh/soh/Enhancements/randomizer/silver_rupee.cpp +++ b/soh/soh/Enhancements/randomizer/silver_rupee.cpp @@ -147,7 +147,7 @@ namespace Rando { { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 5637.0f, -1143.0f, 2134.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_2 }, { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 5601.0f, -1143.0f, 1898.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_3 }, { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 5489.0f, -1143.0f, 2476.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_4 }, - { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 5466.0f, -1143.0f, 2234.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_5 }, + { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 5466.0f, -1143.0f, 2243.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_5 }, { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 5404.0f, -1143.0f, 1977.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_6 }, { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 5270.0f, -1143.0f, 2453.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_7 }, { { SCENE_SHADOW_TEMPLE, RCQUEST_MQ, { 5217.0f, -1143.0f, 1852.0f } }, RC_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE_8 }, diff --git a/soh/soh/Enhancements/randomizer/static_data.h b/soh/soh/Enhancements/randomizer/static_data.h index ef32a8aec21..7bf5b86c594 100644 --- a/soh/soh/Enhancements/randomizer/static_data.h +++ b/soh/soh/Enhancements/randomizer/static_data.h @@ -59,7 +59,7 @@ namespace std { template<> struct hash { inline size_t operator()(const Rando::Position& pos) const { - return hash{}(pos.scene) ^ hash{}(pos.pos.x) ^ hash{}(pos.pos.y) ^ hash{}(pos.pos.z); + return hash{}(pos.scene) ^ hash{}(pos.quest) ^ hash{}(pos.pos.x) ^ hash{}(pos.pos.y) ^ hash{}(pos.pos.z); } }; From f02cb56d0cbb94867f3a939373b4987b4d58f4ee Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Tue, 16 Apr 2024 19:44:53 -0400 Subject: [PATCH 026/108] Fix bug with uncollected silver rupees getting killed when room is cleared. --- soh/soh/Enhancements/mods.cpp | 4 ++++ soh/src/overlays/actors/ovl_En_G_Switch/z_en_g_switch.h | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index f954d6b6031..8e0fae2e138 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -1194,6 +1194,10 @@ void RegisterSilverRupeeShuffle() { if (actor->id == ACTOR_EN_G_SWITCH) { auto* silverRupee = reinterpret_cast(actor); if (silverRupee->type == ENGSWITCH_SILVER_RUPEE) { + // Override any Actor_Kill calls from the vanilla silver rupee init function. + silverRupee->actor.update = EnGSwitch_Update; + silverRupee->actor.flags = ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED; + Actor_SetScale(&silverRupee->actor, 0.03f); Rando::Position randoPos = {static_cast(gPlayState->sceneNum), ResourceMgr_IsSceneMasterQuest(gPlayState->sceneNum) ? RCQUEST_MQ : RCQUEST_VANILLA, actor->world.pos}; silverRupee->rc = Rando::StaticData::silverRupeeMap.at(randoPos); Rando::Location* loc = Rando::StaticData::GetLocation(silverRupee->rc); diff --git a/soh/src/overlays/actors/ovl_En_G_Switch/z_en_g_switch.h b/soh/src/overlays/actors/ovl_En_G_Switch/z_en_g_switch.h index 53a3251165f..a160c7f749a 100644 --- a/soh/src/overlays/actors/ovl_En_G_Switch/z_en_g_switch.h +++ b/soh/src/overlays/actors/ovl_En_G_Switch/z_en_g_switch.h @@ -8,6 +8,14 @@ struct EnGSwitch; typedef void (*EnGSwitchActionFunc)(struct EnGSwitch*, PlayState*); +#ifdef __cplusplus +extern "C" { +#endif +void EnGSwitch_Update(Actor* thisx, PlayState* play); +#ifdef __cplusplus +} +#endif + typedef enum { /* 0 */ GSWITCH_NONE, /* 1 */ GSWITCH_APPEAR, From 7876d9e91d9675801bd5033ba32fa5e6830c68e9 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Tue, 16 Apr 2024 20:07:44 -0400 Subject: [PATCH 027/108] Fix save bleed bug with Silver Rupee Counts. --- soh/soh/Enhancements/randomizer/3drando/playthrough.cpp | 1 + soh/soh/Enhancements/randomizer/context.cpp | 5 +++++ soh/soh/Enhancements/randomizer/context.h | 1 + 3 files changed, 7 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/3drando/playthrough.cpp b/soh/soh/Enhancements/randomizer/3drando/playthrough.cpp index 7aef15aa56e..2ff82efe048 100644 --- a/soh/soh/Enhancements/randomizer/3drando/playthrough.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/playthrough.cpp @@ -23,6 +23,7 @@ int Playthrough_Init(uint32_t seed, std::set excludedLocations, CustomMessages::ClearMessages(); ctx->ItemReset(); ctx->HintReset(); + ctx->SilverRupeeReset(); ctx->GetLogic()->Reset(); Areas::AccessReset(); diff --git a/soh/soh/Enhancements/randomizer/context.cpp b/soh/soh/Enhancements/randomizer/context.cpp index 36bc1bc5ccf..7c13c18a10a 100644 --- a/soh/soh/Enhancements/randomizer/context.cpp +++ b/soh/soh/Enhancements/randomizer/context.cpp @@ -279,6 +279,11 @@ void Context::HintReset() { } } +void Context::SilverRupeeReset() { + mSilverRupees.reset(); + mSilverRupees = std::make_shared(); +} + void Context::CreateItemOverrides() { SPDLOG_DEBUG("NOW CREATING OVERRIDES\n\n"); for (RandomizerCheck locKey : allLocations) { diff --git a/soh/soh/Enhancements/randomizer/context.h b/soh/soh/Enhancements/randomizer/context.h index bbf10aab0b2..a2f2bae5999 100644 --- a/soh/soh/Enhancements/randomizer/context.h +++ b/soh/soh/Enhancements/randomizer/context.h @@ -58,6 +58,7 @@ class Context { void ClearItemLocations(); void ItemReset(); void HintReset(); + void SilverRupeeReset(); void CreateItemOverrides(); bool IsSeedGenerated() const; void SetSeedGenerated(bool seedGenerated = true); From 039f4fe627021b233a6565c046f4b133ae458cb3 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 14 Jul 2024 21:55:31 -0400 Subject: [PATCH 028/108] Fix post-merge-conflict-resolution build errors. --- .../custom-message/CustomMessageManager.h | 4 +- .../hint_list/hint_list_exclude_dungeon.cpp | 21 +- .../3drando/hint_list/hint_list_item.cpp | 44 +-- .../Enhancements/randomizer/3drando/hints.cpp | 3 +- soh/soh/Enhancements/randomizer/location.h | 2 - .../Enhancements/randomizer/location_list.cpp | 352 +++++++++--------- soh/soh/Enhancements/randomizer/settings.cpp | 2 +- .../Enhancements/randomizer/silver_rupee.cpp | 2 +- .../Enhancements/randomizer/silver_rupee.h | 2 +- 9 files changed, 216 insertions(+), 216 deletions(-) diff --git a/soh/soh/Enhancements/custom-message/CustomMessageManager.h b/soh/soh/Enhancements/custom-message/CustomMessageManager.h index 2c797e52735..eb9347db312 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageManager.h +++ b/soh/soh/Enhancements/custom-message/CustomMessageManager.h @@ -11,7 +11,7 @@ #undef MESSAGE_END -#define QM_WHITE "\x00"s +#define QM_WHITE "\x00" #define QM_RED "\x41" #define QM_GREEN "\x42" #define QM_BLUE "\x43" @@ -20,7 +20,7 @@ #define QM_YELLOW "\x46" #define QM_BLACK "\x47" -#define HS_HORSE_ARCHERY "\x00"s //HS_HBA is an enum already +#define HS_HORSE_ARCHERY "\x00" //HS_HBA is an enum already typedef enum { MF_FORMATTED, 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 43e5c65c1ef..eeb08bdce2f 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 @@ -1441,8 +1441,8 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, una #Skulltula flotante# del Templo de las Sombras otorga #[[1]]#. //TODO: Translate hintTextTable[RHT_SHADOW_SPINNING_SCYTHE_SILVER_RUPEE] = HintText(CustomMessage("a #spinning scythe# guards", {QM_RED})); - hintTable[RHT_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE] = HintText(CustomMessage("a #Beamos and Spike Trap# in the Shadow Temple guard", {QM_RED})); - hintTable[RHT_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE] = HintText(CustomMessage("#invisible spikes# guard", {QM_RED})); + hintTextTable[RHT_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE] = HintText(CustomMessage("a #Beamos and Spike Trap# in the Shadow Temple guard", {QM_RED})); + hintTextTable[RHT_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE] = HintText(CustomMessage("#invisible spikes# guard", {QM_RED})); // TODO: End Translation /*-------------------------- @@ -1640,7 +1640,7 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, una #Skulltula tras un ardiente hielo# otorga #[[1]]#. // TODO: Translate - hintTable[RHT_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE] = HintText(CustomMessage("#spinning ice# guards", {QM_RED})); + hintTextTable[RHT_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE] = HintText(CustomMessage("#spinning ice# guards", {QM_RED})); /*-------------------------- | GERUDO TRAINING GROUNDS | @@ -1821,9 +1821,9 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, una #hazaña de fuerza# premia a las bandidas con #[[1]]#. // TODO: Translate - hintTable[RHT_GERUDO_TRAINING_GROUND_BOULDER_SILVER_RUPEE] = HintText(CustomMessage("a #boulder maze# in the Gerudo Training Grounds guards", {QM_RED})); - hintTable[RHT_GERUDO_TRAINING_GROUND_LAVA_SILVER_RUPEE] = HintText(CustomMessage("a #fiery trial# in the Gerudo Training Grounds guards", {QM_RED})); - hintTable[RHT_GERUDO_TRAINING_GROUND_TOILET_SILVER_RUPEE] = HintText(CustomMessage("a #swirly trial# in the Gerudo Training Grounds guards", {QM_RED})); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_BOULDER_SILVER_RUPEE] = HintText(CustomMessage("a #boulder maze# in the Gerudo Training Grounds guards", {QM_RED})); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_LAVA_SILVER_RUPEE] = HintText(CustomMessage("a #fiery trial# in the Gerudo Training Grounds guards", {QM_RED})); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_TOILET_SILVER_RUPEE] = HintText(CustomMessage("a #swirly trial# in the Gerudo Training Grounds guards", {QM_RED})); //TODO: End Translation /*-------------------------- @@ -2019,12 +2019,13 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th /*french*/ "Selon moi, les #pestes Mojo dans le Château de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. - hintTable[RHT_FOREST_TRIAL_SILVER_RUPEE] = HintText(CustomMessage("the #test of the wilds# holds", /*german*/"", /*french*/"l'#épreuve des bois# contient", {QM_RED})); + hintTextTable[RHT_FOREST_TRIAL_SILVER_RUPEE] = HintText(CustomMessage("the #test of the wilds# holds", /*german*/"", /*french*/"l'#épreuve des bois# contient", {QM_RED})); // /*spanish*/"la #prueba de la naturaleza# brinda" //TODO: Translate - hintTable[RHT_FIRE_TRIAL_SILVER_RUPEE] = HintText(CustomMessage("the #test of flames# holds", {QM_RED})); - hintTable[RHT_SPIRIT_TRIAL_SILVER_RUPEE] = HintText(CustomMessage("the #test of the sands# holds", /*german*/"" /*french*/"l'#épreuve des sables# contient", {QM_RED})); + hintTextTable[RHT_FIRE_TRIAL_SILVER_RUPEE] = HintText(CustomMessage("the #test of flames# holds", {QM_RED})); + hintTextTable[RHT_SPIRIT_TRIAL_SILVER_RUPEE] = HintText(CustomMessage("the #test of the sands# holds", /*german*/"" /*french*/"l'#épreuve des sables# contient", {QM_RED})); // /*spanish*/"la #prueba de las arenas# brinda" - hintTable[RHT_LIGHT_TRIAL_SILVER_RUPEE] = HintText(CustomMessage("the #test of radiance# holds", /*german*/"", /*french*/"l'#épreuve du ciel# contient", {QM_RED})); + hintTextTable[RHT_LIGHT_TRIAL_SILVER_RUPEE] = HintText(CustomMessage("the #test of radiance# holds", /*german*/"", /*french*/"l'#épreuve du ciel# contient", {QM_RED})); // /*spanish*/"la #prueba del resplandor# brinda" } +} 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 1586c24c1be..9736aa53ba6 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 @@ -2031,38 +2031,38 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a low tone", /*german*/"", /*french*/"une tonalité basse")}); // /*spanish*/un tono bajo - hintTable[RHT_OCARINA_C_LEFT_BUTTON] = HintText::Item({ - //obscure text - Text{"a leftward tone", /*french*/"une tonalité vers la gauche", /*spanish*/"un tono hacia la izquierda"}, - }, { + hintTextTable[RHT_OCARINA_C_LEFT_BUTTON] = HintText(CustomMessage("a leftward tone", /*german*/"", /*french*/"une tonalité vers la gauche"), + /*spanish "un tono hacia la izquierda" */ + { //ambiguous text - Text{"something melodic", /*french*/"quelque chose de mélodieux", /*spanish*/"algo melódico"} + CustomMessage("something melodic", /*german*/"", /*french*/"quelque chose de mélodieux") + ///*spanish*/"algo melódico" }, { //clear text - Text{"an Ocarina C Left Button", /*french*/"la Touche C-Gauche de l'Ocarina", /*spanish*/"un botón C izquierdo de Ocarina"}} - ); + CustomMessage("an Ocarina C Left Button", /*german*/"", /*french*/"la Touche C-Gauche de l'Ocarina")}); + // /*spanish*/"un botón C izquierdo de Ocarina" - hintTable[RHT_OCARINA_C_RIGHT_BUTTON] = HintText::Item({ - //obscure text - Text{"a rightward tone", /*french*/"une tonalité vers la droite", /*spanish*/"un tono hacia la derecha"}, - }, { + hintTextTable[RHT_OCARINA_C_RIGHT_BUTTON] = HintText(CustomMessage("a rightward tone", /*german*/"", /*french*/"une tonalité vers la droite"), + ///*spanish*/"un tono hacia la derecha" + { //ambiguous text - Text{"something melodic", /*french*/"quelque chose de mélodieux", /*spanish*/"algo melódico"} + CustomMessage("something melodic", /*german*/"", /*french*/"quelque chose de mélodieux") + ///*spanish*/"algo melódico" }, { //clear text - Text{"an Ocarina C Right Button", /*french*/"la Touche C-Droit de l'Ocarina", /*spanish*/"un botón C derecho de Ocarina"}} - ); + CustomMessage("an Ocarina C Right Button", /*german*/"", /*french*/"la Touche C-Droit de l'Ocarina")}); + ///*spanish*/"un botón C derecho de Ocarina" - hintTable[RHT_FISHING_POLE] = HintText::Item({ - //obscure text - Text{"a fish-puller", /*french*/"(canne à pêche)", /*spanish*/"(caña de pescar)"}, - }, { + hintTextTable[RHT_FISHING_POLE] = HintText(CustomMessage("a fish-puller", /*german*/"", /*french*/"(canne à pêche)"), + ///*spanish*/"(caña de pescar)" + { //ambiguous text - Text{"the pond owner's property", /*french*/"(canne à pêche)", /*spanish*/"(caña de pescar)"}, - }, + CustomMessage("the pond owner's property", /*german*/"", /*french*/"(canne à pêche)") + ///*spanish*/"(caña de pescar)", + }, { //clear text - Text{"a fishing pole", /*french*/"canne à pêche", /*spanish*/"caña de pescar"} - ); + CustomMessage("a fishing pole", /*german*/"", /*french*/"canne à pêche")}); + ///*spanish*/"caña de pescar"} hintTextTable[RHT_EPONA] = HintText(CustomMessage("Epona", /*german*/"", /*french*/"Epona"), // /*spanish*/a Epona diff --git a/soh/soh/Enhancements/randomizer/3drando/hints.cpp b/soh/soh/Enhancements/randomizer/3drando/hints.cpp index 0067f97d201..f5af885e3b8 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hints.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hints.cpp @@ -5,6 +5,7 @@ #include "spoiler_log.hpp" #include "fill.hpp" #include "../trial.h" +#include "../dungeon.h" #include "../entrance.h" #include "z64item.h" #include @@ -436,7 +437,7 @@ Text AutoFormatHintText(const Text& unformattedHintText, const std::vector dungeonInfoData; +std::array dungeonInfoData; Text childAltarText; Text adultAltarText; diff --git a/soh/soh/Enhancements/randomizer/location.h b/soh/soh/Enhancements/randomizer/location.h index 95f08d42b11..62a96ded1a9 100644 --- a/soh/soh/Enhancements/randomizer/location.h +++ b/soh/soh/Enhancements/randomizer/location.h @@ -18,10 +18,8 @@ class SpoilerCollectionCheck { SpoilerCollectionCheckType type = SPOILER_CHK_NONE; uint8_t scene = 0; uint16_t flag = 0; - uint16_t flag = 0; SpoilerCollectionCheck() = default; - SpoilerCollectionCheck(const SpoilerCollectionCheckType type_, const uint8_t scene_, const uint16_t flag_) SpoilerCollectionCheck(const SpoilerCollectionCheckType type_, const uint8_t scene_, const uint16_t flag_) : type(type_), scene(scene_), flag(flag_) { } diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 5e46a035851..8195612587f 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -1515,182 +1515,182 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_ZD_FISH_5] = Location::Base(RC_ZD_FISH_5, RCQUEST_BOTH, RCTYPE_FISH, RCAREA_ZORAS_DOMAIN, ACTOR_EN_FISH, SCENE_ZORAS_DOMAIN, -1 ^ 4, 0x00, "Fish 5", RHT_ZD_FISH, RG_FISH, { Category::cFish }, SpoilerCollectionCheck::Fish(0xFF, SCENE_ZORAS_DOMAIN), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); // Silver Rupees - 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,0, 0x0, "Spinning Blades Silver Rupee 1", "Ice Cavern Spinning Blades Silver Rupee 1", RHT_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Spinning Blades Silver Rupee 2", "Ice Cavern Spinning Blades Silver Rupee 2", RHT_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Spinning Blades Silver Rupee 3", "Ice Cavern Spinning Blades Silver Rupee 3", RHT_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Spinning Blades Silver Rupee 4", "Ice Cavern Spinning Blades Silver Rupee 4", RHT_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Spinning Blades Silver Rupee 5", "Ice Cavern Spinning Blades Silver Rupee 5", RHT_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Sliding Puzzle Silver Rupee 1", "Ice Cavern Sliding Puzzle Silver Rupee 1", RHT_ICE_CAVERN_SLIDING_SILVER_RUPEE, RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Sliding Puzzle Silver Rupee 2", "Ice Cavern Sliding Puzzle Silver Rupee 2", RHT_ICE_CAVERN_SLIDING_SILVER_RUPEE, RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Sliding Puzzle Silver Rupee 3", "Ice Cavern Sliding Puzzle Silver Rupee 3", RHT_ICE_CAVERN_SLIDING_SILVER_RUPEE, RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Sliding Puzzle Silver Rupee 4", "Ice Cavern Sliding Puzzle Silver Rupee 4", RHT_ICE_CAVERN_SLIDING_SILVER_RUPEE, RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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,0, 0x0, "Sliding Puzzle Silver Rupee 5", "Ice Cavern Sliding Puzzle Silver Rupee 5", RHT_ICE_CAVERN_SLIDING_SILVER_RUPEE, RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_ICE_CAVERN, 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, 0, 0x0, "Bottom of the Well Basement Silver Rupee 1", "Bottom of the Well Basement Silver Rupee 1", RHT_BOTTOM_OF_THE_WELL_BASEMENT_SILVER_RUPEE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_BOTTOM_OF_THE_WELL, 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, 0, 0x0, "Bottom of the Well Basement Silver Rupee 2", "Bottom of the Well Basement Silver Rupee 2", RHT_BOTTOM_OF_THE_WELL_BASEMENT_SILVER_RUPEE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_BOTTOM_OF_THE_WELL, 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, 0, 0x0, "Bottom of the Well Basement Silver Rupee 3", "Bottom of the Well Basement Silver Rupee 3", RHT_BOTTOM_OF_THE_WELL_BASEMENT_SILVER_RUPEE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_BOTTOM_OF_THE_WELL, 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, 0, 0x0, "Bottom of the Well Basement Silver Rupee 4", "Bottom of the Well Basement Silver Rupee 4", RHT_BOTTOM_OF_THE_WELL_BASEMENT_SILVER_RUPEE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_BOTTOM_OF_THE_WELL, 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, 0, 0x0, "Bottom of the Well Basement Silver Rupee 5", "Bottom of the Well Basement Silver Rupee 5", RHT_BOTTOM_OF_THE_WELL_BASEMENT_SILVER_RUPEE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_BOTTOM_OF_THE_WELL, 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, 0, 0x0, "Boulder Maze Silver Rupee 1", "GTG Boulder Maze Silver Rupee 1", RHT_GERUDO_TRAINING_GROUND_BOULDER_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Boulder Maze Silver Rupee 2", "GTG Boulder Maze Silver Rupee 2", RHT_GERUDO_TRAINING_GROUND_BOULDER_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Boulder Maze Silver Rupee 3", "GTG Boulder Maze Silver Rupee 3", RHT_GERUDO_TRAINING_GROUND_BOULDER_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Boulder Maze Silver Rupee 4", "GTG Boulder Maze Silver Rupee 4", RHT_GERUDO_TRAINING_GROUND_BOULDER_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Boulder Maze Silver Rupee 5", "GTG Boulder Maze Silver Rupee 5", RHT_GERUDO_TRAINING_GROUND_BOULDER_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Lava Room Silver Rupee 1", "GTG Lava Room Silver Rupee 1", RHT_GERUDO_TRAINING_GROUND_LAVA_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Lava Room Silver Rupee 2", "GTG Lava Room Silver Rupee 2", RHT_GERUDO_TRAINING_GROUND_LAVA_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Lava Room Silver Rupee 3", "GTG Lava Room Silver Rupee 3", RHT_GERUDO_TRAINING_GROUND_LAVA_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Lava Room Silver Rupee 4", "GTG Lava Room Silver Rupee 4", RHT_GERUDO_TRAINING_GROUND_LAVA_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Lava Room Silver Rupee 5", "GTG Lava Room Silver Rupee 5", RHT_GERUDO_TRAINING_GROUND_LAVA_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Whirlpool Room Silver Rupee 1", "GTG Whirlpool Room Silver Rupee 1", RHT_GERUDO_TRAINING_GROUND_TOILET_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Whirlpool Room Silver Rupee 2", "GTG Whirlpool Room Silver Rupee 2", RHT_GERUDO_TRAINING_GROUND_TOILET_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Whirlpool Room Silver Rupee 3", "GTG Whirlpool Room Silver Rupee 3", RHT_GERUDO_TRAINING_GROUND_TOILET_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Whirlpool Room Silver Rupee 4", "GTG Whirlpool Room Silver Rupee 4", RHT_GERUDO_TRAINING_GROUND_TOILET_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Whirlpool Room Silver Rupee 5", "GTG Whirlpool Room Silver Rupee 5", RHT_GERUDO_TRAINING_GROUND_TOILET_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Child Gate Silver Rupee 1", "Spirit Temple Child Gate Silver Rupee 1", RHT_SPIRIT_GATE_SILVER_RUPEE, RG_SPIRIT_GATE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Child Gate Silver Rupee 2", "Spirit Temple Child Gate Silver Rupee 2", RHT_SPIRIT_GATE_SILVER_RUPEE, RG_SPIRIT_GATE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Child Gate Silver Rupee 3", "Spirit Temple Child Gate Silver Rupee 3", RHT_SPIRIT_GATE_SILVER_RUPEE, RG_SPIRIT_GATE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Child Gate Silver Rupee 4", "Spirit Temple Child Gate Silver Rupee 4", RHT_SPIRIT_GATE_SILVER_RUPEE, RG_SPIRIT_GATE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Child Gate Silver Rupee 5", "Spirit Temple Child Gate Silver Rupee 5", RHT_SPIRIT_GATE_SILVER_RUPEE, RG_SPIRIT_GATE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Beamos Room Silver Rupee 1", "Spirit Beamos Room Silver Rupee 1", RHT_SPIRIT_BEAMOS_SILVER_RUPEE, RG_SPIRIT_BEAMOS_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Beamos Room Silver Rupee 2", "Spirit Beamos Room Silver Rupee 2", RHT_SPIRIT_BEAMOS_SILVER_RUPEE, RG_SPIRIT_BEAMOS_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Beamos Room Silver Rupee 3", "Spirit Beamos Room Silver Rupee 3", RHT_SPIRIT_BEAMOS_SILVER_RUPEE, RG_SPIRIT_BEAMOS_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Beamos Room Silver Rupee 4", "Spirit Beamos Room Silver Rupee 4", RHT_SPIRIT_BEAMOS_SILVER_RUPEE, RG_SPIRIT_BEAMOS_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Beamos Room Silver Rupee 5", "Spirit Beamos Room Silver Rupee 5", RHT_SPIRIT_BEAMOS_SILVER_RUPEE, RG_SPIRIT_BEAMOS_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Boulder Room Silver Rupee 1", "Spirit Boulder Room Silver Rupee 1", RHT_SPIRIT_BOULDER_SILVER_RUPEE, RG_SPIRIT_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Boulder Room Silver Rupee 2", "Spirit Boulder Room Silver Rupee 2", RHT_SPIRIT_BOULDER_SILVER_RUPEE, RG_SPIRIT_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Boulder Room Silver Rupee 3", "Spirit Boulder Room Silver Rupee 3", RHT_SPIRIT_BOULDER_SILVER_RUPEE, RG_SPIRIT_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Boulder Room Silver Rupee 4", "Spirit Boulder Room Silver Rupee 4", RHT_SPIRIT_BOULDER_SILVER_RUPEE, RG_SPIRIT_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Boulder Room Silver Rupee 5", "Spirit Boulder Room Silver Rupee 5", RHT_SPIRIT_BOULDER_SILVER_RUPEE, RG_SPIRIT_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Spinning Scythe Silver Rupee 1", "Shadow Spinning Scythe Silver Rupee 1", RHT_SHADOW_SPINNING_SCYTHE_SILVER_RUPEE, RG_SHADOW_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Spinning Scythe Silver Rupee 2", "Shadow Spinning Scythe Silver Rupee 2", RHT_SHADOW_SPINNING_SCYTHE_SILVER_RUPEE, RG_SHADOW_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Spinning Scythe Silver Rupee 3", "Shadow Spinning Scythe Silver Rupee 3", RHT_SHADOW_SPINNING_SCYTHE_SILVER_RUPEE, RG_SHADOW_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Spinning Scythe Silver Rupee 4", "Shadow Spinning Scythe Silver Rupee 4", RHT_SHADOW_SPINNING_SCYTHE_SILVER_RUPEE, RG_SHADOW_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Spinning Scythe Silver Rupee 5", "Shadow Spinning Scythe Silver Rupee 5", RHT_SHADOW_SPINNING_SCYTHE_SILVER_RUPEE, RG_SHADOW_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Outside Spike Rain Room Silver Rupee 1", "Shadow Outside Spike Rain Room Silver Rupee 1", RHT_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Outside Spike Rain Room Silver Rupee 2", "Shadow Outside Spike Rain Room Silver Rupee 2", RHT_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Outside Spike Rain Room Silver Rupee 3", "Shadow Outside Spike Rain Room Silver Rupee 3", RHT_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Outside Spike Rain Room Silver Rupee 4", "Shadow Outside Spike Rain Room Silver Rupee 4", RHT_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Outside Spike Rain Room Silver Rupee 5", "Shadow Outside Spike Rain Room Silver Rupee 5", RHT_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Room Silver Rupee 1", "Shadow Invisible Spikes Room Silver Rupee 1", RHT_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Room Silver Rupee 2", "Shadow Invisible Spikes Room Silver Rupee 2", RHT_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Room Silver Rupee 3", "Shadow Invisible Spikes Room Silver Rupee 3", RHT_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Room Silver Rupee 4", "Shadow Invisible Spikes Room Silver Rupee 4", RHT_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Room Silver Rupee 5", "Shadow Invisible Spikes Room Silver Rupee 5", RHT_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Forest Trial Silver Rupee 1", "Inside Ganon's Castle Forest Trial Silver Rupee 1", RHT_FOREST_TRIAL_SILVER_RUPEE, RG_FOREST_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Forest Trial Silver Rupee 2", "Inside Ganon's Castle Forest Trial Silver Rupee 2", RHT_FOREST_TRIAL_SILVER_RUPEE, RG_FOREST_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Forest Trial Silver Rupee 3", "Inside Ganon's Castle Forest Trial Silver Rupee 3", RHT_FOREST_TRIAL_SILVER_RUPEE, RG_FOREST_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Forest Trial Silver Rupee 4", "Inside Ganon's Castle Forest Trial Silver Rupee 4", RHT_FOREST_TRIAL_SILVER_RUPEE, RG_FOREST_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Forest Trial Silver Rupee 5", "Inside Ganon's Castle Forest Trial Silver Rupee 5", RHT_FOREST_TRIAL_SILVER_RUPEE, RG_FOREST_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Fire Trial Silver Rupee 1", "Inside Ganon's Castle Fire Trial Silver Rupee 1", RHT_FIRE_TRIAL_SILVER_RUPEE, RG_FIRE_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Fire Trial Silver Rupee 2", "Inside Ganon's Castle Fire Trial Silver Rupee 2", RHT_FIRE_TRIAL_SILVER_RUPEE, RG_FIRE_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Fire Trial Silver Rupee 3", "Inside Ganon's Castle Fire Trial Silver Rupee 3", RHT_FIRE_TRIAL_SILVER_RUPEE, RG_FIRE_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Fire Trial Silver Rupee 4", "Inside Ganon's Castle Fire Trial Silver Rupee 4", RHT_FIRE_TRIAL_SILVER_RUPEE, RG_FIRE_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Fire Trial Silver Rupee 5", "Inside Ganon's Castle Fire Trial Silver Rupee 5", RHT_FIRE_TRIAL_SILVER_RUPEE, RG_FIRE_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Spirit Trial Silver Rupee 1", "Inside Ganon's Castle Spirit Trial Silver Rupee 1", RHT_SPIRIT_TRIAL_SILVER_RUPEE, RG_SPIRIT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Spirit Trial Silver Rupee 2", "Inside Ganon's Castle Spirit Trial Silver Rupee 2", RHT_SPIRIT_TRIAL_SILVER_RUPEE, RG_SPIRIT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Spirit Trial Silver Rupee 3", "Inside Ganon's Castle Spirit Trial Silver Rupee 3", RHT_SPIRIT_TRIAL_SILVER_RUPEE, RG_SPIRIT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Spirit Trial Silver Rupee 4", "Inside Ganon's Castle Spirit Trial Silver Rupee 4", RHT_SPIRIT_TRIAL_SILVER_RUPEE, RG_SPIRIT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Spirit Trial Silver Rupee 5", "Inside Ganon's Castle Spirit Trial Silver Rupee 5", RHT_SPIRIT_TRIAL_SILVER_RUPEE, RG_SPIRIT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Light Trial Silver Rupee 1", "Inside Ganon's Castle Light Trial Silver Rupee 1", RHT_LIGHT_TRIAL_SILVER_RUPEE, RG_LIGHT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Light Trial Silver Rupee 2", "Inside Ganon's Castle Light Trial Silver Rupee 2", RHT_LIGHT_TRIAL_SILVER_RUPEE, RG_LIGHT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Light Trial Silver Rupee 3", "Inside Ganon's Castle Light Trial Silver Rupee 3", RHT_LIGHT_TRIAL_SILVER_RUPEE, RG_LIGHT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Light Trial Silver Rupee 4", "Inside Ganon's Castle Light Trial Silver Rupee 4", RHT_LIGHT_TRIAL_SILVER_RUPEE, RG_LIGHT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Light Trial Silver Rupee 5", "Inside Ganon's Castle Light Trial Silver Rupee 5", RHT_LIGHT_TRIAL_SILVER_RUPEE, RG_LIGHT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Silver Rupee 1", "Dodongo's Cavern Silver Rupee 1", RHT_DODONGOS_CAVERN_SILVER_RUPEE, RG_DODONGOS_CAVERN_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_DODONGOS_CAVERN, 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, 0, 0x0, "Silver Rupee 2", "Dodongo's Cavern Silver Rupee 2", RHT_DODONGOS_CAVERN_SILVER_RUPEE, RG_DODONGOS_CAVERN_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_DODONGOS_CAVERN, 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, 0, 0x0, "Silver Rupee 3", "Dodongo's Cavern Silver Rupee 3", RHT_DODONGOS_CAVERN_SILVER_RUPEE, RG_DODONGOS_CAVERN_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_DODONGOS_CAVERN, 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, 0, 0x0, "Silver Rupee 4", "Dodongo's Cavern Silver Rupee 4", RHT_DODONGOS_CAVERN_SILVER_RUPEE, RG_DODONGOS_CAVERN_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_DODONGOS_CAVERN, 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, 0, 0x0, "Silver Rupee 5", "Dodongo's Cavern Silver Rupee 5", RHT_DODONGOS_CAVERN_SILVER_RUPEE, RG_DODONGOS_CAVERN_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_DODONGOS_CAVERN, 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, 0, 0x0, "Spinning Scythe Silver Rupee 1", "Shadow Temple MQ Spinning Scythe Silver Rupee 1", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Spinning Scythe Silver Rupee 2", "Shadow Temple MQ Spinning Scythe Silver Rupee 2", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Spinning Scythe Silver Rupee 3", "Shadow Temple MQ Spinning Scythe Silver Rupee 3", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Spinning Scythe Silver Rupee 4", "Shadow Temple MQ Spinning Scythe Silver Rupee 4", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Spinning Scythe Silver Rupee 5", "Shadow Temple MQ Spinning Scythe Silver Rupee 5", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Scythe Silver Rupee 1", "Shadow Temple MQ Invisible Scythe Silver Rupee 1", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Scythe Silver Rupee 2", "Shadow Temple MQ Invisible Scythe Silver Rupee 2", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Scythe Silver Rupee 3", "Shadow Temple MQ Invisible Scythe Silver Rupee 3", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Scythe Silver Rupee 4", "Shadow Temple MQ Invisible Scythe Silver Rupee 4", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Scythe Silver Rupee 5", "Shadow Temple MQ Invisible Scythe Silver Rupee 5", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Scythe Silver Rupee 6", "Shadow Temple MQ Invisible Scythe Silver Rupee 6", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Scythe Silver Rupee 7", "Shadow Temple MQ Invisible Scythe Silver Rupee 7", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Scythe Silver Rupee 8", "Shadow Temple MQ Invisible Scythe Silver Rupee 8", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Scythe Silver Rupee 9", "Shadow Temple MQ Invisible Scythe Silver Rupee 9", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Scythe Silver Rupee 10", "Shadow Temple MQ Invisible Scythe Silver Rupee 10", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Outside Spike Rain Silver Rupee 1", "Shadow Temple MQ Outside Spike Rain Silver Rupee 1", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Outside Spike Rain Silver Rupee 2", "Shadow Temple MQ Outside Spike Rain Silver Rupee 2", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, RAND_INF_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_2)); - 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, 0, 0x0, "Outside Spike Rain Silver Rupee 3", "Shadow Temple MQ Outside Spike Rain Silver Rupee 3", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Outside Spike Rain Silver Rupee 4", "Shadow Temple MQ Outside Spike Rain Silver Rupee 4", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, RAND_INF_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_4)); - 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, 0, 0x0, "Outside Spike Rain Silver Rupee 5", "Shadow Temple MQ Outside Spike Rain Silver Rupee 5", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Silver Rupee 1", "Shadow Temple MQ Invisible Spikes Silver Rupee 1", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Silver Rupee 2", "Shadow Temple MQ Invisible Spikes Silver Rupee 2", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Silver Rupee 3", "Shadow Temple MQ Invisible Spikes Silver Rupee 3", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Silver Rupee 4", "Shadow Temple MQ Invisible Spikes Silver Rupee 4", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Silver Rupee 5", "Shadow Temple MQ Invisible Spikes Silver Rupee 5", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Silver Rupee 6", "Shadow Temple MQ Invisible Spikes Silver Rupee 6", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Silver Rupee 7", "Shadow Temple MQ Invisible Spikes Silver Rupee 7", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Silver Rupee 8", "Shadow Temple MQ Invisible Spikes Silver Rupee 8", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Silver Rupee 9", "Shadow Temple MQ Invisible Spikes Silver Rupee 9", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Invisible Spikes Silver Rupee 10", "Shadow Temple MQ Invisible Spikes Silver Rupee 10", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SHADOW_TEMPLE, 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, 0, 0x0, "Lobby Silver Rupee 1", "Spirit Temple MQ Lobby Silver Rupee 1", RHT_SPIRIT_TEMPLE_SILVER_RUPEE, RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Lobby Silver Rupee 2", "Spirit Temple MQ Lobby Silver Rupee 2", RHT_SPIRIT_TEMPLE_SILVER_RUPEE, RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Lobby Silver Rupee 3", "Spirit Temple MQ Lobby Silver Rupee 3", RHT_SPIRIT_TEMPLE_SILVER_RUPEE, RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Lobby Silver Rupee 4", "Spirit Temple MQ Lobby Silver Rupee 4", RHT_SPIRIT_TEMPLE_SILVER_RUPEE, RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Lobby Silver Rupee 5", "Spirit Temple MQ Lobby Silver Rupee 5", RHT_SPIRIT_TEMPLE_SILVER_RUPEE, RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_SPIRIT_TEMPLE, 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, 0, 0x0, "Boulder Maze Silver Rupee 1", "Gerduo Training Grounds MQ Boulder Maze Silver Rupee 1", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Boulder Maze Silver Rupee 2", "Gerduo Training Grounds MQ Boulder Maze Silver Rupee 2", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Boulder Maze Silver Rupee 3", "Gerduo Training Grounds MQ Boulder Maze Silver Rupee 3", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Boulder Maze Silver Rupee 4", "Gerduo Training Grounds MQ Boulder Maze Silver Rupee 4", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Boulder Maze Silver Rupee 5", "Gerduo Training Grounds MQ Boulder Maze Silver Rupee 5", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Lava Room Silver Rupee 1", "Gerduo Training Grounds MQ Lava Room Silver Rupee 1", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Lava Room Silver Rupee 2", "Gerduo Training Grounds MQ Lava Room Silver Rupee 2", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Lava Room Silver Rupee 3", "Gerduo Training Grounds MQ Lava Room Silver Rupee 3", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Lava Room Silver Rupee 4", "Gerduo Training Grounds MQ Lava Room Silver Rupee 4", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Lava Room Silver Rupee 5", "Gerduo Training Grounds MQ Lava Room Silver Rupee 5", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Lava Room Silver Rupee 6", "Gerduo Training Grounds MQ Lava Room Silver Rupee 6", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Toilet Room Silver Rupee 1", "Gerduo Training Grounds MQ Toilet Room Silver Rupee 1", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Toilet Room Silver Rupee 2", "Gerduo Training Grounds MQ Toilet Room Silver Rupee 2", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Toilet Room Silver Rupee 3", "Gerduo Training Grounds MQ Toilet Room Silver Rupee 3", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_GERUDO_TRAINING_GROUND, 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, 0, 0x0, "Fire Trial MQ Silver Rupee 1", "Ganon's Castle Fire Trial MQ Silver Rupee 1", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_FIRE_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Fire Trial MQ Silver Rupee 2", "Ganon's Castle Fire Trial MQ Silver Rupee 2", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_FIRE_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Fire Trial MQ Silver Rupee 3", "Ganon's Castle Fire Trial MQ Silver Rupee 3", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_FIRE_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Fire Trial MQ Silver Rupee 4", "Ganon's Castle Fire Trial MQ Silver Rupee 4", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_FIRE_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Fire Trial MQ Silver Rupee 5", "Ganon's Castle Fire Trial MQ Silver Rupee 5", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_FIRE_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Water Trial MQ Silver Rupee 1", "Ganon's Castle Water Trial MQ Silver Rupee 1", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_WATER_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Water Trial MQ Silver Rupee 2", "Ganon's Castle Water Trial MQ Silver Rupee 2", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_WATER_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Water Trial MQ Silver Rupee 3", "Ganon's Castle Water Trial MQ Silver Rupee 3", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_WATER_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Water Trial MQ Silver Rupee 4", "Ganon's Castle Water Trial MQ Silver Rupee 4", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_WATER_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Water Trial MQ Silver Rupee 5", "Ganon's Castle Water Trial MQ Silver Rupee 5", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_WATER_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Shadow Trial MQ Silver Rupee 1", "Ganon's Castle Shadow Trial MQ Silver Rupee 1", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_SHADOW_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Shadow Trial MQ Silver Rupee 2", "Ganon's Castle Shadow Trial MQ Silver Rupee 2", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_SHADOW_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Shadow Trial MQ Silver Rupee 3", "Ganon's Castle Shadow Trial MQ Silver Rupee 3", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_SHADOW_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Shadow Trial MQ Silver Rupee 4", "Ganon's Castle Shadow Trial MQ Silver Rupee 4", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_SHADOW_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, 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, 0, 0x0, "Shadow Trial MQ Silver Rupee 5", "Ganon's Castle Shadow Trial MQ Silver Rupee 5", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_SHADOW_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(SCENE_INSIDE_GANONS_CASTLE, RAND_INF_SHADOW_TRIAL_MQ_SILVER_RUPEE_5)); + 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,0, 0x0, "Spinning Blades Silver Rupee 1", "Ice Cavern Spinning Blades Silver Rupee 1", RHT_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, {Category::cSilverRupee}, 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,0, 0x0, "Spinning Blades Silver Rupee 2", "Ice Cavern Spinning Blades Silver Rupee 2", RHT_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, {Category::cSilverRupee}, 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,0, 0x0, "Spinning Blades Silver Rupee 3", "Ice Cavern Spinning Blades Silver Rupee 3", RHT_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, {Category::cSilverRupee}, 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,0, 0x0, "Spinning Blades Silver Rupee 4", "Ice Cavern Spinning Blades Silver Rupee 4", RHT_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, {Category::cSilverRupee}, 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,0, 0x0, "Spinning Blades Silver Rupee 5", "Ice Cavern Spinning Blades Silver Rupee 5", RHT_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, {Category::cSilverRupee}, 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,0, 0x0, "Sliding Puzzle Silver Rupee 1", "Ice Cavern Sliding Puzzle Silver Rupee 1", RHT_ICE_CAVERN_SLIDING_SILVER_RUPEE, RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, {Category::cSilverRupee}, 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,0, 0x0, "Sliding Puzzle Silver Rupee 2", "Ice Cavern Sliding Puzzle Silver Rupee 2", RHT_ICE_CAVERN_SLIDING_SILVER_RUPEE, RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, {Category::cSilverRupee}, 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,0, 0x0, "Sliding Puzzle Silver Rupee 3", "Ice Cavern Sliding Puzzle Silver Rupee 3", RHT_ICE_CAVERN_SLIDING_SILVER_RUPEE, RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, {Category::cSilverRupee}, 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,0, 0x0, "Sliding Puzzle Silver Rupee 4", "Ice Cavern Sliding Puzzle Silver Rupee 4", RHT_ICE_CAVERN_SLIDING_SILVER_RUPEE, RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, {Category::cSilverRupee}, 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,0, 0x0, "Sliding Puzzle Silver Rupee 5", "Ice Cavern Sliding Puzzle Silver Rupee 5", RHT_ICE_CAVERN_SLIDING_SILVER_RUPEE, RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Bottom of the Well Basement Silver Rupee 1", "Bottom of the Well Basement Silver Rupee 1", RHT_BOTTOM_OF_THE_WELL_BASEMENT_SILVER_RUPEE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Bottom of the Well Basement Silver Rupee 2", "Bottom of the Well Basement Silver Rupee 2", RHT_BOTTOM_OF_THE_WELL_BASEMENT_SILVER_RUPEE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Bottom of the Well Basement Silver Rupee 3", "Bottom of the Well Basement Silver Rupee 3", RHT_BOTTOM_OF_THE_WELL_BASEMENT_SILVER_RUPEE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Bottom of the Well Basement Silver Rupee 4", "Bottom of the Well Basement Silver Rupee 4", RHT_BOTTOM_OF_THE_WELL_BASEMENT_SILVER_RUPEE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Bottom of the Well Basement Silver Rupee 5", "Bottom of the Well Basement Silver Rupee 5", RHT_BOTTOM_OF_THE_WELL_BASEMENT_SILVER_RUPEE, RG_BOTTOM_OF_THE_WELL_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Boulder Maze Silver Rupee 1", "GTG Boulder Maze Silver Rupee 1", RHT_GERUDO_TRAINING_GROUND_BOULDER_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Boulder Maze Silver Rupee 2", "GTG Boulder Maze Silver Rupee 2", RHT_GERUDO_TRAINING_GROUND_BOULDER_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Boulder Maze Silver Rupee 3", "GTG Boulder Maze Silver Rupee 3", RHT_GERUDO_TRAINING_GROUND_BOULDER_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Boulder Maze Silver Rupee 4", "GTG Boulder Maze Silver Rupee 4", RHT_GERUDO_TRAINING_GROUND_BOULDER_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Boulder Maze Silver Rupee 5", "GTG Boulder Maze Silver Rupee 5", RHT_GERUDO_TRAINING_GROUND_BOULDER_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Lava Room Silver Rupee 1", "GTG Lava Room Silver Rupee 1", RHT_GERUDO_TRAINING_GROUND_LAVA_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Lava Room Silver Rupee 2", "GTG Lava Room Silver Rupee 2", RHT_GERUDO_TRAINING_GROUND_LAVA_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Lava Room Silver Rupee 3", "GTG Lava Room Silver Rupee 3", RHT_GERUDO_TRAINING_GROUND_LAVA_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Lava Room Silver Rupee 4", "GTG Lava Room Silver Rupee 4", RHT_GERUDO_TRAINING_GROUND_LAVA_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Lava Room Silver Rupee 5", "GTG Lava Room Silver Rupee 5", RHT_GERUDO_TRAINING_GROUND_LAVA_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Whirlpool Room Silver Rupee 1", "GTG Whirlpool Room Silver Rupee 1", RHT_GERUDO_TRAINING_GROUND_TOILET_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Whirlpool Room Silver Rupee 2", "GTG Whirlpool Room Silver Rupee 2", RHT_GERUDO_TRAINING_GROUND_TOILET_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Whirlpool Room Silver Rupee 3", "GTG Whirlpool Room Silver Rupee 3", RHT_GERUDO_TRAINING_GROUND_TOILET_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Whirlpool Room Silver Rupee 4", "GTG Whirlpool Room Silver Rupee 4", RHT_GERUDO_TRAINING_GROUND_TOILET_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Whirlpool Room Silver Rupee 5", "GTG Whirlpool Room Silver Rupee 5", RHT_GERUDO_TRAINING_GROUND_TOILET_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Child Gate Silver Rupee 1", "Spirit Temple Child Gate Silver Rupee 1", RHT_SPIRIT_GATE_SILVER_RUPEE, RG_SPIRIT_GATE_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Child Gate Silver Rupee 2", "Spirit Temple Child Gate Silver Rupee 2", RHT_SPIRIT_GATE_SILVER_RUPEE, RG_SPIRIT_GATE_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Child Gate Silver Rupee 3", "Spirit Temple Child Gate Silver Rupee 3", RHT_SPIRIT_GATE_SILVER_RUPEE, RG_SPIRIT_GATE_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Child Gate Silver Rupee 4", "Spirit Temple Child Gate Silver Rupee 4", RHT_SPIRIT_GATE_SILVER_RUPEE, RG_SPIRIT_GATE_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Child Gate Silver Rupee 5", "Spirit Temple Child Gate Silver Rupee 5", RHT_SPIRIT_GATE_SILVER_RUPEE, RG_SPIRIT_GATE_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Beamos Room Silver Rupee 1", "Spirit Beamos Room Silver Rupee 1", RHT_SPIRIT_BEAMOS_SILVER_RUPEE, RG_SPIRIT_BEAMOS_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Beamos Room Silver Rupee 2", "Spirit Beamos Room Silver Rupee 2", RHT_SPIRIT_BEAMOS_SILVER_RUPEE, RG_SPIRIT_BEAMOS_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Beamos Room Silver Rupee 3", "Spirit Beamos Room Silver Rupee 3", RHT_SPIRIT_BEAMOS_SILVER_RUPEE, RG_SPIRIT_BEAMOS_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Beamos Room Silver Rupee 4", "Spirit Beamos Room Silver Rupee 4", RHT_SPIRIT_BEAMOS_SILVER_RUPEE, RG_SPIRIT_BEAMOS_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Beamos Room Silver Rupee 5", "Spirit Beamos Room Silver Rupee 5", RHT_SPIRIT_BEAMOS_SILVER_RUPEE, RG_SPIRIT_BEAMOS_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Boulder Room Silver Rupee 1", "Spirit Boulder Room Silver Rupee 1", RHT_SPIRIT_BOULDER_SILVER_RUPEE, RG_SPIRIT_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Boulder Room Silver Rupee 2", "Spirit Boulder Room Silver Rupee 2", RHT_SPIRIT_BOULDER_SILVER_RUPEE, RG_SPIRIT_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Boulder Room Silver Rupee 3", "Spirit Boulder Room Silver Rupee 3", RHT_SPIRIT_BOULDER_SILVER_RUPEE, RG_SPIRIT_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Boulder Room Silver Rupee 4", "Spirit Boulder Room Silver Rupee 4", RHT_SPIRIT_BOULDER_SILVER_RUPEE, RG_SPIRIT_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Boulder Room Silver Rupee 5", "Spirit Boulder Room Silver Rupee 5", RHT_SPIRIT_BOULDER_SILVER_RUPEE, RG_SPIRIT_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Spinning Scythe Silver Rupee 1", "Shadow Spinning Scythe Silver Rupee 1", RHT_SHADOW_SPINNING_SCYTHE_SILVER_RUPEE, RG_SHADOW_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Spinning Scythe Silver Rupee 2", "Shadow Spinning Scythe Silver Rupee 2", RHT_SHADOW_SPINNING_SCYTHE_SILVER_RUPEE, RG_SHADOW_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Spinning Scythe Silver Rupee 3", "Shadow Spinning Scythe Silver Rupee 3", RHT_SHADOW_SPINNING_SCYTHE_SILVER_RUPEE, RG_SHADOW_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Spinning Scythe Silver Rupee 4", "Shadow Spinning Scythe Silver Rupee 4", RHT_SHADOW_SPINNING_SCYTHE_SILVER_RUPEE, RG_SHADOW_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Spinning Scythe Silver Rupee 5", "Shadow Spinning Scythe Silver Rupee 5", RHT_SHADOW_SPINNING_SCYTHE_SILVER_RUPEE, RG_SHADOW_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Outside Spike Rain Room Silver Rupee 1", "Shadow Outside Spike Rain Room Silver Rupee 1", RHT_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Outside Spike Rain Room Silver Rupee 2", "Shadow Outside Spike Rain Room Silver Rupee 2", RHT_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Outside Spike Rain Room Silver Rupee 3", "Shadow Outside Spike Rain Room Silver Rupee 3", RHT_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Outside Spike Rain Room Silver Rupee 4", "Shadow Outside Spike Rain Room Silver Rupee 4", RHT_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Outside Spike Rain Room Silver Rupee 5", "Shadow Outside Spike Rain Room Silver Rupee 5", RHT_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Invisible Spikes Room Silver Rupee 1", "Shadow Invisible Spikes Room Silver Rupee 1", RHT_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Invisible Spikes Room Silver Rupee 2", "Shadow Invisible Spikes Room Silver Rupee 2", RHT_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Invisible Spikes Room Silver Rupee 3", "Shadow Invisible Spikes Room Silver Rupee 3", RHT_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Invisible Spikes Room Silver Rupee 4", "Shadow Invisible Spikes Room Silver Rupee 4", RHT_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Invisible Spikes Room Silver Rupee 5", "Shadow Invisible Spikes Room Silver Rupee 5", RHT_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, RG_SHADOW_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Forest Trial Silver Rupee 1", "Inside Ganon's Castle Forest Trial Silver Rupee 1", RHT_FOREST_TRIAL_SILVER_RUPEE, RG_FOREST_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Forest Trial Silver Rupee 2", "Inside Ganon's Castle Forest Trial Silver Rupee 2", RHT_FOREST_TRIAL_SILVER_RUPEE, RG_FOREST_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Forest Trial Silver Rupee 3", "Inside Ganon's Castle Forest Trial Silver Rupee 3", RHT_FOREST_TRIAL_SILVER_RUPEE, RG_FOREST_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Forest Trial Silver Rupee 4", "Inside Ganon's Castle Forest Trial Silver Rupee 4", RHT_FOREST_TRIAL_SILVER_RUPEE, RG_FOREST_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Forest Trial Silver Rupee 5", "Inside Ganon's Castle Forest Trial Silver Rupee 5", RHT_FOREST_TRIAL_SILVER_RUPEE, RG_FOREST_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Fire Trial Silver Rupee 1", "Inside Ganon's Castle Fire Trial Silver Rupee 1", RHT_FIRE_TRIAL_SILVER_RUPEE, RG_FIRE_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Fire Trial Silver Rupee 2", "Inside Ganon's Castle Fire Trial Silver Rupee 2", RHT_FIRE_TRIAL_SILVER_RUPEE, RG_FIRE_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Fire Trial Silver Rupee 3", "Inside Ganon's Castle Fire Trial Silver Rupee 3", RHT_FIRE_TRIAL_SILVER_RUPEE, RG_FIRE_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Fire Trial Silver Rupee 4", "Inside Ganon's Castle Fire Trial Silver Rupee 4", RHT_FIRE_TRIAL_SILVER_RUPEE, RG_FIRE_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Fire Trial Silver Rupee 5", "Inside Ganon's Castle Fire Trial Silver Rupee 5", RHT_FIRE_TRIAL_SILVER_RUPEE, RG_FIRE_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Spirit Trial Silver Rupee 1", "Inside Ganon's Castle Spirit Trial Silver Rupee 1", RHT_SPIRIT_TRIAL_SILVER_RUPEE, RG_SPIRIT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Spirit Trial Silver Rupee 2", "Inside Ganon's Castle Spirit Trial Silver Rupee 2", RHT_SPIRIT_TRIAL_SILVER_RUPEE, RG_SPIRIT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Spirit Trial Silver Rupee 3", "Inside Ganon's Castle Spirit Trial Silver Rupee 3", RHT_SPIRIT_TRIAL_SILVER_RUPEE, RG_SPIRIT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Spirit Trial Silver Rupee 4", "Inside Ganon's Castle Spirit Trial Silver Rupee 4", RHT_SPIRIT_TRIAL_SILVER_RUPEE, RG_SPIRIT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Spirit Trial Silver Rupee 5", "Inside Ganon's Castle Spirit Trial Silver Rupee 5", RHT_SPIRIT_TRIAL_SILVER_RUPEE, RG_SPIRIT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Light Trial Silver Rupee 1", "Inside Ganon's Castle Light Trial Silver Rupee 1", RHT_LIGHT_TRIAL_SILVER_RUPEE, RG_LIGHT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Light Trial Silver Rupee 2", "Inside Ganon's Castle Light Trial Silver Rupee 2", RHT_LIGHT_TRIAL_SILVER_RUPEE, RG_LIGHT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Light Trial Silver Rupee 3", "Inside Ganon's Castle Light Trial Silver Rupee 3", RHT_LIGHT_TRIAL_SILVER_RUPEE, RG_LIGHT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Light Trial Silver Rupee 4", "Inside Ganon's Castle Light Trial Silver Rupee 4", RHT_LIGHT_TRIAL_SILVER_RUPEE, RG_LIGHT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Light Trial Silver Rupee 5", "Inside Ganon's Castle Light Trial Silver Rupee 5", RHT_LIGHT_TRIAL_SILVER_RUPEE, RG_LIGHT_TRIAL_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Silver Rupee 1", "Dodongo's Cavern Silver Rupee 1", RHT_DODONGOS_CAVERN_SILVER_RUPEE, RG_DODONGOS_CAVERN_MQ_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Silver Rupee 2", "Dodongo's Cavern Silver Rupee 2", RHT_DODONGOS_CAVERN_SILVER_RUPEE, RG_DODONGOS_CAVERN_MQ_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Silver Rupee 3", "Dodongo's Cavern Silver Rupee 3", RHT_DODONGOS_CAVERN_SILVER_RUPEE, RG_DODONGOS_CAVERN_MQ_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Silver Rupee 4", "Dodongo's Cavern Silver Rupee 4", RHT_DODONGOS_CAVERN_SILVER_RUPEE, RG_DODONGOS_CAVERN_MQ_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Silver Rupee 5", "Dodongo's Cavern Silver Rupee 5", RHT_DODONGOS_CAVERN_SILVER_RUPEE, RG_DODONGOS_CAVERN_MQ_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Spinning Scythe Silver Rupee 1", "Shadow Temple MQ Spinning Scythe Silver Rupee 1", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Spinning Scythe Silver Rupee 2", "Shadow Temple MQ Spinning Scythe Silver Rupee 2", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Spinning Scythe Silver Rupee 3", "Shadow Temple MQ Spinning Scythe Silver Rupee 3", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Spinning Scythe Silver Rupee 4", "Shadow Temple MQ Spinning Scythe Silver Rupee 4", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Spinning Scythe Silver Rupee 5", "Shadow Temple MQ Spinning Scythe Silver Rupee 5", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Invisible Scythe Silver Rupee 1", "Shadow Temple MQ Invisible Scythe Silver Rupee 1", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Invisible Scythe Silver Rupee 2", "Shadow Temple MQ Invisible Scythe Silver Rupee 2", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Invisible Scythe Silver Rupee 3", "Shadow Temple MQ Invisible Scythe Silver Rupee 3", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Invisible Scythe Silver Rupee 4", "Shadow Temple MQ Invisible Scythe Silver Rupee 4", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Invisible Scythe Silver Rupee 5", "Shadow Temple MQ Invisible Scythe Silver Rupee 5", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Invisible Scythe Silver Rupee 6", "Shadow Temple MQ Invisible Scythe Silver Rupee 6", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Invisible Scythe Silver Rupee 7", "Shadow Temple MQ Invisible Scythe Silver Rupee 7", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Invisible Scythe Silver Rupee 8", "Shadow Temple MQ Invisible Scythe Silver Rupee 8", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Invisible Scythe Silver Rupee 9", "Shadow Temple MQ Invisible Scythe Silver Rupee 9", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Invisible Scythe Silver Rupee 10", "Shadow Temple MQ Invisible Scythe Silver Rupee 10", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SCYTHE_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Outside Spike Rain Silver Rupee 1", "Shadow Temple MQ Outside Spike Rain Silver Rupee 1", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Outside Spike Rain Silver Rupee 2", "Shadow Temple MQ Outside Spike Rain Silver Rupee 2", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_2)); + 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, 0, 0x0, "Outside Spike Rain Silver Rupee 3", "Shadow Temple MQ Outside Spike Rain Silver Rupee 3", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Outside Spike Rain Silver Rupee 4", "Shadow Temple MQ Outside Spike Rain Silver Rupee 4", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE_4)); + 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, 0, 0x0, "Outside Spike Rain Silver Rupee 5", "Shadow Temple MQ Outside Spike Rain Silver Rupee 5", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Invisible Spikes Silver Rupee 1", "Shadow Temple MQ Invisible Spikes Silver Rupee 1", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Invisible Spikes Silver Rupee 2", "Shadow Temple MQ Invisible Spikes Silver Rupee 2", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Invisible Spikes Silver Rupee 3", "Shadow Temple MQ Invisible Spikes Silver Rupee 3", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Invisible Spikes Silver Rupee 4", "Shadow Temple MQ Invisible Spikes Silver Rupee 4", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Invisible Spikes Silver Rupee 5", "Shadow Temple MQ Invisible Spikes Silver Rupee 5", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Invisible Spikes Silver Rupee 6", "Shadow Temple MQ Invisible Spikes Silver Rupee 6", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Invisible Spikes Silver Rupee 7", "Shadow Temple MQ Invisible Spikes Silver Rupee 7", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Invisible Spikes Silver Rupee 8", "Shadow Temple MQ Invisible Spikes Silver Rupee 8", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Invisible Spikes Silver Rupee 9", "Shadow Temple MQ Invisible Spikes Silver Rupee 9", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Invisible Spikes Silver Rupee 10", "Shadow Temple MQ Invisible Spikes Silver Rupee 10", RHT_SHADOW_TEMPLE_SILVER_RUPEE, RG_SHADOW_MQ_INVISIBLE_SPIKES_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Lobby Silver Rupee 1", "Spirit Temple MQ Lobby Silver Rupee 1", RHT_SPIRIT_TEMPLE_SILVER_RUPEE, RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Lobby Silver Rupee 2", "Spirit Temple MQ Lobby Silver Rupee 2", RHT_SPIRIT_TEMPLE_SILVER_RUPEE, RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Lobby Silver Rupee 3", "Spirit Temple MQ Lobby Silver Rupee 3", RHT_SPIRIT_TEMPLE_SILVER_RUPEE, RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Lobby Silver Rupee 4", "Spirit Temple MQ Lobby Silver Rupee 4", RHT_SPIRIT_TEMPLE_SILVER_RUPEE, RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Lobby Silver Rupee 5", "Spirit Temple MQ Lobby Silver Rupee 5", RHT_SPIRIT_TEMPLE_SILVER_RUPEE, RG_SPIRIT_MQ_LOBBY_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Boulder Maze Silver Rupee 1", "Gerduo Training Grounds MQ Boulder Maze Silver Rupee 1", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Boulder Maze Silver Rupee 2", "Gerduo Training Grounds MQ Boulder Maze Silver Rupee 2", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Boulder Maze Silver Rupee 3", "Gerduo Training Grounds MQ Boulder Maze Silver Rupee 3", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Boulder Maze Silver Rupee 4", "Gerduo Training Grounds MQ Boulder Maze Silver Rupee 4", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Boulder Maze Silver Rupee 5", "Gerduo Training Grounds MQ Boulder Maze Silver Rupee 5", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Lava Room Silver Rupee 1", "Gerduo Training Grounds MQ Lava Room Silver Rupee 1", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Lava Room Silver Rupee 2", "Gerduo Training Grounds MQ Lava Room Silver Rupee 2", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Lava Room Silver Rupee 3", "Gerduo Training Grounds MQ Lava Room Silver Rupee 3", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Lava Room Silver Rupee 4", "Gerduo Training Grounds MQ Lava Room Silver Rupee 4", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Lava Room Silver Rupee 5", "Gerduo Training Grounds MQ Lava Room Silver Rupee 5", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Lava Room Silver Rupee 6", "Gerduo Training Grounds MQ Lava Room Silver Rupee 6", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_LAVA_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Toilet Room Silver Rupee 1", "Gerduo Training Grounds MQ Toilet Room Silver Rupee 1", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Toilet Room Silver Rupee 2", "Gerduo Training Grounds MQ Toilet Room Silver Rupee 2", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Toilet Room Silver Rupee 3", "Gerduo Training Grounds MQ Toilet Room Silver Rupee 3", RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE, RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Fire Trial MQ Silver Rupee 1", "Ganon's Castle Fire Trial MQ Silver Rupee 1", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_FIRE_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Fire Trial MQ Silver Rupee 2", "Ganon's Castle Fire Trial MQ Silver Rupee 2", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_FIRE_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Fire Trial MQ Silver Rupee 3", "Ganon's Castle Fire Trial MQ Silver Rupee 3", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_FIRE_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Fire Trial MQ Silver Rupee 4", "Ganon's Castle Fire Trial MQ Silver Rupee 4", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_FIRE_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Fire Trial MQ Silver Rupee 5", "Ganon's Castle Fire Trial MQ Silver Rupee 5", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_FIRE_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Water Trial MQ Silver Rupee 1", "Ganon's Castle Water Trial MQ Silver Rupee 1", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_WATER_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Water Trial MQ Silver Rupee 2", "Ganon's Castle Water Trial MQ Silver Rupee 2", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_WATER_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Water Trial MQ Silver Rupee 3", "Ganon's Castle Water Trial MQ Silver Rupee 3", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_WATER_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Water Trial MQ Silver Rupee 4", "Ganon's Castle Water Trial MQ Silver Rupee 4", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_WATER_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Water Trial MQ Silver Rupee 5", "Ganon's Castle Water Trial MQ Silver Rupee 5", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_WATER_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Shadow Trial MQ Silver Rupee 1", "Ganon's Castle Shadow Trial MQ Silver Rupee 1", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_SHADOW_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Shadow Trial MQ Silver Rupee 2", "Ganon's Castle Shadow Trial MQ Silver Rupee 2", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_SHADOW_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Shadow Trial MQ Silver Rupee 3", "Ganon's Castle Shadow Trial MQ Silver Rupee 3", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_SHADOW_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Shadow Trial MQ Silver Rupee 4", "Ganon's Castle Shadow Trial MQ Silver Rupee 4", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_SHADOW_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, 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, 0, 0x0, "Shadow Trial MQ Silver Rupee 5", "Ganon's Castle Shadow Trial MQ Silver Rupee 5", RHT_GANONS_CASTLE_SILVER_RUPEE, RG_SHADOW_TRIAL_MQ_SILVER_RUPEE, {Category::cSilverRupee}, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TRIAL_MQ_SILVER_RUPEE_5)); // Gossip Stones locationTable[RC_DMC_GOSSIP_STONE] = Location::HintStone(RC_DMC_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 14341, 0x05, "Gossip Stone", {}); diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index 77ad3db3958..966d7e21b70 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -127,7 +127,7 @@ void Settings::CreateOptions() { mOptions[RSK_KEYSANITY] = Option::U8("Small Keys", {"Start With", "Vanilla", "Own Dungeon", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("Keysanity"), mOptionDescriptions[RSK_KEYSANITY], WidgetType::Combobox, RO_DUNGEON_ITEM_LOC_OWN_DUNGEON); mOptions[RSK_GERUDO_KEYS] = Option::U8("Gerudo Fortress Keys", {"Vanilla", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("GerudoKeys"), mOptionDescriptions[RSK_GERUDO_KEYS], WidgetType::Combobox, RO_GERUDO_KEYS_VANILLA); mOptions[RSK_BOSS_KEYSANITY] = Option::U8("Boss Keys", {"Start With", "Vanilla", "Own Dungeon", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("BossKeysanity"), mOptionDescriptions[RSK_BOSS_KEYSANITY], WidgetType::Combobox, RO_DUNGEON_ITEM_LOC_OWN_DUNGEON); - mOptions[RSK_SHUFFLE_SILVER_RUPEES] = Option::U8("Silver Rupees", {"Vanilla", "Own Dungeon", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("SilverRupeeShuffle)", mOptionDescriptions[RSK_SHUFFLE_SILVER_RUPEES], WidgetType::Combobox, RO_SILVER_SHUFFLE_VANILLA); + mOptions[RSK_SHUFFLE_SILVER_RUPEES] = Option::U8("Silver Rupees", {"Vanilla", "Own Dungeon", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("SilverRupeeShuffle"), mOptionDescriptions[RSK_SHUFFLE_SILVER_RUPEES], WidgetType::Combobox, RO_SILVER_SHUFFLE_VANILLA); mOptions[RSK_MAGICAL_SILVER_RUPEE] = Option::Bool("Magical Silver Rupee", CVAR_RANDOMIZER_SETTING("MagicalSilverRupee"), mOptionDescriptions[RSK_MAGICAL_SILVER_RUPEE]); mOptions[RSK_GANONS_BOSS_KEY] = Option::U8("Ganon's Boss Key", {"Vanilla", "Own Dungeon", "Start With", "Any Dungeon", "Overworld", "Anywhere", "LACS-Vanilla", "LACS-Stones", "LACS-Medallions", "LACS-Rewards", "LACS-Dungeons", "LACS-Tokens", "Triforce Hunt"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleGanonBossKey"), mOptionDescriptions[RSK_GANONS_BOSS_KEY], WidgetType::Combobox, RO_GANON_BOSS_KEY_VANILLA); mOptions[RSK_LACS_STONE_COUNT] = Option::U8("Stone Count", {NumOpts(0, 4)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("LacsStoneCount"), "", WidgetType::Slider, 3, true); diff --git a/soh/soh/Enhancements/randomizer/silver_rupee.cpp b/soh/soh/Enhancements/randomizer/silver_rupee.cpp index 90391b032db..69b54d0c8d5 100644 --- a/soh/soh/Enhancements/randomizer/silver_rupee.cpp +++ b/soh/soh/Enhancements/randomizer/silver_rupee.cpp @@ -278,7 +278,7 @@ namespace Rando { u16 roomNameKey = /*(rgid >= RG_SILVER_RUPEE_POUCH_FIRST) ? (rgid - RG_SILVER_RUPEE_POUCH_FIRST) + RG_SILVER_RUPEE_FIRST :*/ rgid; Text locationNames = mSilverRupeeRoomNames[(RandomizerGet)roomNameKey]; - messageEntry.Replace("{{location}}", locationNames.english.c_str(), locationNames.german.c_str(), locationNames.french.c_str()); + messageEntry.Replace("{{location}}", CustomMessage(locationNames.english.c_str(), locationNames.german.c_str(), locationNames.french.c_str())); return messageEntry; } diff --git a/soh/soh/Enhancements/randomizer/silver_rupee.h b/soh/soh/Enhancements/randomizer/silver_rupee.h index 1b73aaa4981..dd29d9cad54 100644 --- a/soh/soh/Enhancements/randomizer/silver_rupee.h +++ b/soh/soh/Enhancements/randomizer/silver_rupee.h @@ -32,7 +32,7 @@ namespace Rando { SilverRupeesInfo& GetInfo(RandomizerGet rgid); size_t GetInfoListSize(); void ResetAll(); - static CustomMessage GetSilverRupeeMessage(u16 rgid); + static CustomMessage GetSilverRupeeMessage(uint16_t rgid); private: std::array mSilverRupees; static std::unordered_map mSilverRupeeRoomNames; From 5e56877d6fcb76e2ccdc272fa562a383302621a3 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Mon, 15 Jul 2024 19:03:19 -0400 Subject: [PATCH 029/108] Fix text issue with silver rupee text --- soh/soh/Enhancements/randomizer/silver_rupee.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/silver_rupee.cpp b/soh/soh/Enhancements/randomizer/silver_rupee.cpp index 69b54d0c8d5..e8d472b00d8 100644 --- a/soh/soh/Enhancements/randomizer/silver_rupee.cpp +++ b/soh/soh/Enhancements/randomizer/silver_rupee.cpp @@ -268,7 +268,7 @@ namespace Rando { if (complete) { messageEntry.Replace("{{count_text}}", "That's all of them"); } else { - messageEntry.Replace("{{count_text}}", "You have collected %g{{count}}%w of them so far"); + messageEntry.Replace("{{count_text}}", CustomMessage("You have collected #{{count}}# of them so far", {QM_GREEN})); messageEntry.Replace("{{count}}", std::to_string(srCount)); } }/* else if (rgid >= RG_SILVER_RUPEE_POUCH_FIRST && rgid <= RG_SILVER_RUPEE_POUCH_LAST) { From 783c1835ad7bcaeb79310ad336cbc60b5542968d Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Wed, 17 Jul 2024 17:41:36 -0400 Subject: [PATCH 030/108] Fix ice trap models --- soh/soh/Enhancements/mods.cpp | 2 +- .../randomizer/actors/z_en_g_switch_rando.c | 54 +++++++++---------- .../actors/ovl_En_G_Switch/z_en_g_switch.h | 2 +- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index a7406e1b10d..d647c993bf1 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -1208,7 +1208,7 @@ void RegisterSilverRupeeShuffle() { Actor_Kill(actor); } silverRupee->rg = OTRGlobals::Instance->gRandoContext->GetItemLocation(silverRupee->rc)->GetPlacedRandomizerGet(); - silverRupee->giEntry = OTRGlobals::Instance->gRandoContext->GetItemLocation(silverRupee->rc)->GetPlacedItem().GetGIEntry().get(); + silverRupee->giEntry = OTRGlobals::Instance->gRandoContext->GetFinalGIEntry(silverRupee->rc, true, GI_NONE); silverRupee->actionFunc = EnGSwitch_Randomizer_SilverRupeeIdle; silverRupee->actor.draw = EnGSwitch_Randomizer_Draw; } else if (silverRupee->type == ENGSWITCH_SILVER_TRACKER) { diff --git a/soh/soh/Enhancements/randomizer/actors/z_en_g_switch_rando.c b/soh/soh/Enhancements/randomizer/actors/z_en_g_switch_rando.c index 872796c4f81..2681f89b391 100644 --- a/soh/soh/Enhancements/randomizer/actors/z_en_g_switch_rando.c +++ b/soh/soh/Enhancements/randomizer/actors/z_en_g_switch_rando.c @@ -8,22 +8,22 @@ void EnGSwitch_Randomizer_SilverRupeeIdle(EnGSwitch* self, PlayState* play) { self->actor.shape.rot.y += 0x800; if (self->actor.xyzDistToPlayerSq < 900.0f) { if (IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_SILVER_RUPEES) != RO_SILVER_SHUFFLE_VANILLA) { - player->getItemEntry = *self->giEntry; + // player->getItemEntry = *self->giEntry; - if (self->giEntry->getItemId == RG_ICE_TRAP) { - Message_StartTextbox(play, 0xF8, NULL); - } else { - Message_StartTextbox(play, self->giEntry->textId, NULL); - } - if (self->giEntry->modIndex == MOD_NONE) { - // RANDOTOD: Move this into Item_Give() or some other more central location - if (self->giEntry->getItemId == GI_SWORD_BGS) { - gSaveContext.bgsFlag = true; - } - Item_Give(play, self->giEntry->itemId); - } else if (self->giEntry->modIndex == MOD_RANDOMIZER && self->giEntry->getItemId != RG_ICE_TRAP) { - Randomizer_Item_Give(play, *self->giEntry); - } + // if (self->giEntry->getItemId == RG_ICE_TRAP) { + // Message_StartTextbox(play, 0xF8, NULL); + // } else { + // Message_StartTextbox(play, self->giEntry->textId, NULL); + // } + // if (self->giEntry->modIndex == MOD_NONE) { + // // RANDOTOD: Move this into Item_Give() or some other more central location + // if (self->giEntry->getItemId == GI_SWORD_BGS) { + // gSaveContext.bgsFlag = true; + // } + // Item_Give(play, self->giEntry->itemId); + // } else if (self->giEntry->modIndex == MOD_RANDOMIZER && self->giEntry->getItemId != RG_ICE_TRAP) { + // Randomizer_Item_Give(play, *self->giEntry); + // } Flags_SetRandomizerInf(self->randInfFlag); // if ((!CVarGetInteger("gSkulltulaFreeze", 0) || self->giEntry->itemId != ITEM_SKULL_TOKEN) && // self->giEntry->getItemId != RG_ICE_TRAP) { @@ -34,18 +34,18 @@ void EnGSwitch_Randomizer_SilverRupeeIdle(EnGSwitch* self, PlayState* play) { // player->actor.freezeTimer = 10; // } - if (IS_RANDO) { - if (self->giEntry->getItemId != RG_ICE_TRAP) { - Audio_PlayFanfare_Rando(*self->giEntry); - } else { - gSaveContext.pendingIceTrapCount++; - Audio_PlayFanfare(NA_BGM_SMALL_ITEM_GET); - } - } else { - Audio_PlayFanfare(NA_BGM_SMALL_ITEM_GET); - } + // if (IS_RANDO) { + // if (self->giEntry->getItemId != RG_ICE_TRAP) { + // Audio_PlayFanfare_Rando(*self->giEntry); + // } else { + // gSaveContext.pendingIceTrapCount++; + // Audio_PlayFanfare(NA_BGM_SMALL_ITEM_GET); + // } + // } else { + // Audio_PlayFanfare(NA_BGM_SMALL_ITEM_GET); + // } - player->getItemEntry = (GetItemEntry)GET_ITEM_NONE; + // player->getItemEntry = (GetItemEntry)GET_ITEM_NONE; self->killTimer = 0; self->actionFunc = EnGSwitch_Kill; } @@ -58,7 +58,7 @@ void EnGSwitch_Randomizer_SilverRupeeIdle(EnGSwitch* self, PlayState* play) { this->type == ENGSWITCH_SILVER_RUPEE) { OPEN_DISPS(play->state.gfxCtx); Matrix_Scale(17.5f, 17.5f, 17.5f, MTXMODE_APPLY); - GetItemEntry_Draw(play, *this->giEntry); + GetItemEntry_Draw(play, this->giEntry); CLOSE_DISPS(play->state.gfxCtx); } } diff --git a/soh/src/overlays/actors/ovl_En_G_Switch/z_en_g_switch.h b/soh/src/overlays/actors/ovl_En_G_Switch/z_en_g_switch.h index a160c7f749a..0375d8536b7 100644 --- a/soh/src/overlays/actors/ovl_En_G_Switch/z_en_g_switch.h +++ b/soh/src/overlays/actors/ovl_En_G_Switch/z_en_g_switch.h @@ -67,7 +67,7 @@ typedef struct EnGSwitch { // #region SOH [Randomizer] /* */ RandomizerCheck rc; /* */ RandomizerGet rg; - /* */ GetItemEntry* giEntry; + /* */ GetItemEntry giEntry; /* */ RandomizerInf randInfFlag; } EnGSwitch; // size = 0x12F8 From ed92bb7e45923867b0c0add646076bba01a3d9d8 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Wed, 7 Aug 2024 17:57:16 -0700 Subject: [PATCH 031/108] Enable freestanding items other than heart pieces and keys --- soh/include/z64actor.h | 1 - .../Enhancements/randomizer/hook_handlers.cpp | 21 ++++++++++++++----- soh/src/code/z_en_item00.c | 8 ------- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/soh/include/z64actor.h b/soh/include/z64actor.h index 156f1d6797d..04ad59fd731 100644 --- a/soh/include/z64actor.h +++ b/soh/include/z64actor.h @@ -290,7 +290,6 @@ typedef struct EnItem00 { /* 0x15C */ f32 scale; /* 0x160 */ ColliderCylinder collider; // #region SOH [Randomizer] - GetItemEntry randoGiEntry; RandomizerCheck randoCheck; RandomizerInf randoInf; /* */ s16 ogParams; diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index d5737d33da4..52d10832474 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -662,13 +662,24 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void break; case VB_ITEM00_DESPAWN: { EnItem00* item00 = static_cast(optionalArg); - if (item00->actor.params == ITEM00_HEART_PIECE || item00->actor.params == ITEM00_SMALL_KEY) { - RandomizerCheck rc = OTRGlobals::Instance->gRandomizer->GetCheckFromActor(item00->actor.id, gPlayState->sceneNum, item00->ogParams); - if (rc != RC_UNKNOWN_CHECK) { + item00->randoInf = RAND_INF_MAX; + item00->randoCheck = RC_UNKNOWN_CHECK; + + auto pos = item00->actor.world.pos; + uint32_t params = item00->collectibleFlag ? item00->ogParams : TWO_ACTOR_PARAMS((int32_t)pos.x, (int32_t)pos.z); + Rando::Location* loc = OTRGlobals::Instance->gRandomizer->GetCheckObjectFromActor(item00->actor.id, gPlayState->sceneNum, params); + + if (loc && loc->GetRandomizerCheck() != RC_UNKNOWN_CHECK) { + // Spawn vanilla item if collected and renewable + if (loc->GetCollectionCheck().type != SPOILER_CHK_RANDOMIZER_INF || !Rando::Context::GetInstance()->GetItemLocation(loc->GetRandomizerCheck())->HasObtained()) { + item00->randoCheck = loc->GetRandomizerCheck(); + item00->itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(loc->GetRandomizerCheck(), true); item00->actor.params = ITEM00_SOH_DUMMY; - item00->itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(rc, true, (GetItemID)Rando::StaticData::GetLocation(rc)->GetVanillaItem()); item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem; - *should = Rando::Context::GetInstance()->GetItemLocation(rc)->HasObtained(); + if (loc->GetCollectionCheck().type == SPOILER_CHK_RANDOMIZER_INF) { + item00->randoInf = loc->GetCollectionCheck().flag; + } + *should = Rando::Context::GetInstance()->GetItemLocation(loc->GetRandomizerCheck())->HasObtained(); } } else if (item00->actor.params == ITEM00_SOH_GIVE_ITEM_ENTRY || item00->actor.params == ITEM00_SOH_GIVE_ITEM_ENTRY_GI) { GetItemEntry itemEntry = randomizerQueuedItemEntry; diff --git a/soh/src/code/z_en_item00.c b/soh/src/code/z_en_item00.c index 8e30f462a74..71bca21d37d 100644 --- a/soh/src/code/z_en_item00.c +++ b/soh/src/code/z_en_item00.c @@ -349,7 +349,6 @@ void EnItem00_Init(Actor* thisx, PlayState* play) { f32 yOffset = 980.0f; f32 shadowScale = 6.0f; s32 getItemId = GI_NONE; - this->randoGiEntry = (GetItemEntry)GET_ITEM_NONE; this->randoCheck = (RandomizerCheck)RC_UNKNOWN_CHECK; this->itemEntry = (GetItemEntry)GET_ITEM_NONE; s16 spawnParam8000 = this->actor.params & 0x8000; @@ -492,13 +491,6 @@ void EnItem00_Init(Actor* thisx, PlayState* play) { this->actor.shape.shadowAlpha = 180; this->actor.focus.pos = this->actor.world.pos; this->getItemId = GI_NONE; - this->randoCheck = Randomizer_GetCheckFromActor(this->actor.id, play->sceneNum, this->ogParams); - this->randoInf = RAND_INF_MAX; - - if (IS_RANDO && this->randoCheck != RC_UNKNOWN_CHECK) { - this->randoGiEntry = Randomizer_GetItemFromKnownCheck(this->randoCheck, getItemId); - this->randoGiEntry.getItemFrom = ITEM_FROM_FREESTANDING; - } if (!spawnParam8000) { EnItem00_SetupAction(this, func_8001DFC8); From edcf8597362f6a6d5abbbc5e007ccbdfef479bbc Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Wed, 7 Aug 2024 18:23:21 -0700 Subject: [PATCH 032/108] Add option to disable freestanding rupee & heart shuffle --- soh/soh/Enhancements/randomizer/hook_handlers.cpp | 2 +- soh/soh/Enhancements/randomizer/option_descriptions.cpp | 4 ++++ soh/soh/Enhancements/randomizer/randomizerTypes.h | 1 + soh/soh/Enhancements/randomizer/settings.cpp | 1 + 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index 52d10832474..a2816a15cf8 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -669,7 +669,7 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void uint32_t params = item00->collectibleFlag ? item00->ogParams : TWO_ACTOR_PARAMS((int32_t)pos.x, (int32_t)pos.z); Rando::Location* loc = OTRGlobals::Instance->gRandomizer->GetCheckObjectFromActor(item00->actor.id, gPlayState->sceneNum, params); - if (loc && loc->GetRandomizerCheck() != RC_UNKNOWN_CHECK) { + if (loc && loc->GetRandomizerCheck() != RC_UNKNOWN_CHECK && (RAND_GET_OPTION(RSK_SHUFFLE_FREESTANDING) || item00->actor.params == ITEM00_HEART_PIECE || item00->actor.params == ITEM00_SMALL_KEY)) { // Spawn vanilla item if collected and renewable if (loc->GetCollectionCheck().type != SPOILER_CHK_RANDOMIZER_INF || !Rando::Context::GetInstance()->GetItemLocation(loc->GetRandomizerCheck())->HasObtained()) { item00->randoCheck = loc->GetRandomizerCheck(); diff --git a/soh/soh/Enhancements/randomizer/option_descriptions.cpp b/soh/soh/Enhancements/randomizer/option_descriptions.cpp index 36c27064267..a956fac0170 100644 --- a/soh/soh/Enhancements/randomizer/option_descriptions.cpp +++ b/soh/soh/Enhancements/randomizer/option_descriptions.cpp @@ -336,6 +336,10 @@ void Settings::CreateOptionDescriptions() { "have collected all 100 Gold Skulltula Tokens.\n" "\n" "You can still talk to him multiple times to get Huge Rupees."; + mOptionDescriptions[RSK_SHUFFLE_FREESTANDING] = + "Freestanding rupees & hearts are shuffles to random items.\n" + "\n" + "Freestanding heart pieces and small keys are already shuffled by default."; mOptionDescriptions[RSK_SHUFFLE_DUNGEON_REWARDS] = "Shuffles the location of spiritual stones and medallions.\n" "\n" diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 6162b3341d2..a88fca1ad19 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -3890,6 +3890,7 @@ typedef enum { RSK_SKELETON_KEY, RSK_SHUFFLE_DEKU_STICK_BAG, RSK_SHUFFLE_DEKU_NUT_BAG, + RSK_SHUFFLE_FREESTANDING, RSK_MAX } RandomizerSettingKey; diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index f3f860800bc..2df23d7f019 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -122,6 +122,7 @@ void Settings::CreateOptions() { mOptions[RSK_SHUFFLE_BOSS_SOULS] = Option::U8("Shuffle Boss Souls", {"Off", "On", "On + Ganon"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleBossSouls"), mOptionDescriptions[RSK_SHUFFLE_BOSS_SOULS], WidgetType::Combobox); mOptions[RSK_SHUFFLE_DEKU_STICK_BAG] = Option::Bool("Shuffle Deku Stick Bag", CVAR_RANDOMIZER_SETTING("ShuffleDekuStickBag"), mOptionDescriptions[RSK_SHUFFLE_DEKU_STICK_BAG], IMFLAG_SEPARATOR_BOTTOM, WidgetType::Checkbox, RO_GENERIC_OFF); mOptions[RSK_SHUFFLE_DEKU_NUT_BAG] = Option::Bool("Shuffle Deku Nut Bag", CVAR_RANDOMIZER_SETTING("ShuffleDekuNutBag"), mOptionDescriptions[RSK_SHUFFLE_DEKU_NUT_BAG], IMFLAG_SEPARATOR_BOTTOM, WidgetType::Checkbox, RO_GENERIC_OFF); + mOptions[RSK_SHUFFLE_FREESTANDING] = Option::Bool("Shuffle Freestanding Items", CVAR_RANDOMIZER_SETTING("ShuffleFreestanding"), mOptionDescriptions[RSK_SHUFFLE_FREESTANDING], IMFLAG_SEPARATOR_BOTTOM, WidgetType::Checkbox, RO_GENERIC_OFF); mOptions[RSK_FISHSANITY] = Option::U8("Fishsanity", {"Off", "Shuffle only Hyrule Loach", "Shuffle Fishing Pond", "Shuffle Overworld Fish", "Shuffle Both"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("Fishsanity"), mOptionDescriptions[RSK_FISHSANITY], WidgetType::Combobox, RO_FISHSANITY_OFF); mOptions[RSK_FISHSANITY_POND_COUNT] = Option::U8("Pond Fish Count", {NumOpts(0,17,1)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("FishsanityPondCount"), mOptionDescriptions[RSK_FISHSANITY_POND_COUNT], WidgetType::Slider, 0, true, IMFLAG_NONE); mOptions[RSK_FISHSANITY_AGE_SPLIT] = Option::Bool("Pond Age Split", CVAR_RANDOMIZER_SETTING("FishsanityAgeSplit"), mOptionDescriptions[RSK_FISHSANITY_AGE_SPLIT]); From a535f591830c5319bf3c50ab6b27ab98ab0a10a7 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Wed, 7 Aug 2024 21:36:03 -0700 Subject: [PATCH 033/108] Add items to pool --- soh/soh/Enhancements/randomizer/3drando/category.hpp | 1 + soh/soh/Enhancements/randomizer/3drando/item_pool.cpp | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/3drando/category.hpp b/soh/soh/Enhancements/randomizer/3drando/category.hpp index 22522789cfd..5d263173e58 100644 --- a/soh/soh/Enhancements/randomizer/3drando/category.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/category.hpp @@ -19,6 +19,7 @@ enum class Category { cVanillaCompass, cAdultTrade, cBeehive, + cFreestanding, }; enum class OptionCategory { diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index fd78f1843e1..a35d619fe7c 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -1210,6 +1210,15 @@ void GenerateItemPool() { PlaceVanillaDekuScrubItems(); } + for (RandomizerCheck loc : ctx->GetLocations(ctx->allLocations, Category::cFreestanding)) { + RandomizerGet vanillaItem = Rando::StaticData::GetLocation(loc)->GetVanillaItem(); + if (ctx->GetOption(RSK_SHUFFLE_FREESTANDING)) { + AddItemToMainPool(vanillaItem); + } else { + ctx->PlaceItemInLocation(loc, vanillaItem, false, true); + } + } + AddItemsToPool(ItemPool, alwaysItems); AddItemsToPool(ItemPool, dungeonRewards); From fb8e2bd5f2f36771d4d9571eaa66e55e9b69f9a0 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Wed, 7 Aug 2024 22:18:54 -0700 Subject: [PATCH 034/108] Actually add shuffle setting --- soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp | 2 ++ soh/soh/Enhancements/randomizer/settings.cpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp index c40031e74a9..a6c3e3acb9d 100644 --- a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp @@ -142,6 +142,8 @@ void WriteIngameSpoilerLog() { (ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_FAST) && loc->IsCategory(Category::cVanillaGFSmallKey) && loc->GetHintKey() != RHT_GF_NORTH_F1_CARPENTER)) { continue; + } else if (!ctx->GetOption(RSK_SHUFFLE_FREESTANDING) && loc->IsCategory(Category::cFreestanding)) { + continue; } // Copy at most 51 chars from the name and location name to avoid issues with names that don't fit on screen diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index 2df23d7f019..c7548d3e5b1 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -670,6 +670,7 @@ void Settings::CreateOptions() { &mOptions[RSK_SHUFFLE_FISHING_POLE], &mOptions[RSK_SHUFFLE_DEKU_STICK_BAG], &mOptions[RSK_SHUFFLE_DEKU_NUT_BAG], + &mOptions[RSK_SHUFFLE_FREESTANDING], }, false, WidgetContainerType::COLUMN); mOptionGroups[RSG_SHUFFLE_NPCS_IMGUI] = OptionGroup::SubGroup("Shuffle NPCs & Merchants", { &mOptions[RSK_SHOPSANITY], @@ -902,6 +903,7 @@ void Settings::CreateOptions() { &mOptions[RSK_SHUFFLE_BOSS_SOULS], &mOptions[RSK_SHUFFLE_DEKU_STICK_BAG], &mOptions[RSK_SHUFFLE_DEKU_NUT_BAG], + &mOptions[RSK_SHUFFLE_FREESTANDING], }); mOptionGroups[RSG_SHUFFLE_DUNGEON_ITEMS] = OptionGroup("Shuffle Dungeon Items", { &mOptions[RSK_SHUFFLE_MAPANDCOMPASS], From 9c3827eea4cddd8976586b6d90084dad24f12b1d Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Wed, 7 Aug 2024 22:19:46 -0700 Subject: [PATCH 035/108] Define overworld locations --- soh/include/z64save.h | 2 +- .../Enhancements/randomizer/location_list.cpp | 113 ++++++++++++++++ .../Enhancements/randomizer/randomizerTypes.h | 127 ++++++++++++++++++ .../Enhancements/randomizer/randomizer_inf.h | 95 +++++++++++++ 4 files changed, 336 insertions(+), 1 deletion(-) diff --git a/soh/include/z64save.h b/soh/include/z64save.h index 617c2acf526..71b39a44033 100644 --- a/soh/include/z64save.h +++ b/soh/include/z64save.h @@ -283,7 +283,7 @@ typedef struct { // #endregion // #region SOH [Randomizer] // Upstream TODO: Move these to their own struct or name to more obviously specific to Randomizer - /* */ u16 randomizerInf[17]; + /* */ u16 randomizerInf[(RC_MAX + 15) / 16]; /* */ u8 mqDungeonCount; /* */ u16 adultTradeItems; /* */ u8 triforcePiecesCollected; diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index ad09e683d2d..7ecba2e3ed7 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -1515,6 +1515,119 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_ZD_FISH_4] = Location::Base(RC_ZD_FISH_4, RCQUEST_BOTH, RCTYPE_FISH, RCAREA_ZORAS_DOMAIN, ACTOR_EN_FISH, SCENE_ZORAS_DOMAIN, -1 ^ 3, 0x00, "Fish 4", RHT_ZD_FISH, RG_FISH, { Category::cFish }, SpoilerCollectionCheck::Fish(0xFF, SCENE_ZORAS_DOMAIN), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); locationTable[RC_ZD_FISH_5] = Location::Base(RC_ZD_FISH_5, RCQUEST_BOTH, RCTYPE_FISH, RCAREA_ZORAS_DOMAIN, ACTOR_EN_FISH, SCENE_ZORAS_DOMAIN, -1 ^ 4, 0x00, "Fish 5", RHT_ZD_FISH, RG_FISH, { Category::cFish }, SpoilerCollectionCheck::Fish(0xFF, SCENE_ZORAS_DOMAIN), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + // Freestanding Hearts and Rupees + locationTable[RC_KF_BOULDER_RUPEE_2] = Location::Collectable(RC_KF_BOULDER_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, 0x0E01, 0x0E, "Boulder Maze Second Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_BOULDER_RUPEE_1] = Location::Collectable(RC_KF_BOULDER_RUPEE_1, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, 0x0F01, 0x0F, "Boulder Maze First Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_BRIDGE_RUPEE] = Location::Collectable(RC_KF_BRIDGE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, 0x1101, 0x11, "Bridge Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_BEHIND_MIDOS_RUPEE] = Location::Collectable(RC_KF_BEHIND_MIDOS_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, 0x1201, 0x12, "Behind Mido's House Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_SARIAS_ROOF_WEST_HEART] = Location::Collectable(RC_KF_SARIAS_ROOF_WEST_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, 0x1C03, 0x1C, "Saria's Roof West Heart", RHT_KOKIRI_FOREST_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_SARIAS_ROOF_EAST_HEART] = Location::Collectable(RC_KF_SARIAS_ROOF_EAST_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, 0x1D03, 0x1D, "Saria's Roof East Heart", RHT_KOKIRI_FOREST_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_SARIAS_ROOF_NORTH_HEART] = Location::Collectable(RC_KF_SARIAS_ROOF_NORTH_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, 0x1E03, 0x1E, "Saria's Roof North Heart", RHT_KOKIRI_FOREST_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_SOUTH_GRASS_WEST_RUPEE] = Location::Collectable(RC_KF_SOUTH_GRASS_WEST_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, 0x2400, 0x24, "South Grass West Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_SOUTH_GRASS_WEST_RUPEE), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_NORTH_GRASS_WEST_RUPEE] = Location::Collectable(RC_KF_NORTH_GRASS_WEST_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, 0x2500, 0x25, "North Grass West Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_NORTH_GRASS_WEST_RUPEE), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_NORTH_GRASS_EAST_RUPEE] = Location::Collectable(RC_KF_NORTH_GRASS_EAST_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, 0x2600, 0x26, "North Grass East Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_NORTH_GRASS_EAST_RUPEE), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_SOUTH_GRASS_EAST_RUPEE] = Location::Collectable(RC_KF_SOUTH_GRASS_EAST_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, 0x2700, 0x27, "South Grass East Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_SOUTH_GRASS_EAST_RUPEE), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_SARIAS_TOP_LEFT_HEART] = Location::Collectable(RC_KF_SARIAS_TOP_LEFT_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_SARIAS_HOUSE, 0x3803, 0x38, "Saria's House Top Left Heart", RHT_SARIAS_HOUSE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_SARIAS_TOP_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_SARIAS_TOP_RIGHT_HEART] = Location::Collectable(RC_KF_SARIAS_TOP_RIGHT_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_SARIAS_HOUSE, 0x3903, 0x39, "Saria's House Top Right Heart", RHT_SARIAS_HOUSE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_SARIAS_TOP_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_SARIAS_BOTTOM_LEFT_HEART] = Location::Collectable(RC_KF_SARIAS_BOTTOM_LEFT_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_SARIAS_HOUSE, 0x3A03, 0x3A, "Saria's House Bottom Left Heart", RHT_SARIAS_HOUSE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_SARIAS_BOTTOM_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_SARIAS_BOTTOM_RIGHT_HEART] = Location::Collectable(RC_KF_SARIAS_BOTTOM_RIGHT_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_SARIAS_HOUSE, 0x3B03, 0x3B, "Saria's House Bottom Right Heart", RHT_SARIAS_HOUSE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_SARIAS_BOTTOM_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + + locationTable[RC_KF_BEAN_RUPEE_1] = Location::Collectable(RC_KF_BEAN_RUPEE_1, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(1269, -528), 0, "Bean Platform Rupee 1", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_RUPEE_1), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_BEAN_RUPEE_2] = Location::Collectable(RC_KF_BEAN_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(1269, -567), 0, "Bean Platform Rupee 2", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_RUPEE_2), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_BEAN_RUPEE_3] = Location::Collectable(RC_KF_BEAN_RUPEE_3, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(1304, -588), 0, "Bean Platform Rupee 3", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_RUPEE_3), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_BEAN_RUPEE_4] = Location::Collectable(RC_KF_BEAN_RUPEE_4, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(1338, -567), 0, "Bean Platform Rupee 4", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_RUPEE_4), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_BEAN_RUPEE_5] = Location::Collectable(RC_KF_BEAN_RUPEE_5, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(1338, -528), 0, "Bean Platform Rupee 5", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_RUPEE_5), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_BEAN_RUPEE_6] = Location::Collectable(RC_KF_BEAN_RUPEE_6, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(1304, -508), 0, "Bean Platform Rupee 6", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_RUPEE_6), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_BEAN_RED_RUPEE] = Location::Collectable(RC_KF_BEAN_RED_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(1304, -548), 0, "Bean Platform Red Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_RED_RUPEE), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + + locationTable[RC_LW_BOULDER_RUPEE] = Location::Collectable(RC_LW_BOULDER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x1301, 0x13, "Boulder Rupee", RHT_LOST_WOODS_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_SHORTCUT_RUPEE_1] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_1, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3400, 0x34, "Underwater Shortcut Rupee 1", RHT_LOST_WOODS_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_1), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_SHORTCUT_RUPEE_2] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3500, 0x35, "Underwater Shortcut Rupee 2", RHT_LOST_WOODS_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_2), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_SHORTCUT_RUPEE_3] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_3, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3600, 0x36, "Underwater Shortcut Rupee 3", RHT_LOST_WOODS_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_3), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_SHORTCUT_RUPEE_4] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_4, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3700, 0x37, "Underwater Shortcut Rupee 4", RHT_LOST_WOODS_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_4), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_SHORTCUT_RUPEE_5] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_5, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3900, 0x39, "Underwater Shortcut Rupee 5", RHT_LOST_WOODS_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_5), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_SHORTCUT_RUPEE_6] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_6, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3A00, 0x3A, "Underwater Shortcut Rupee 6", RHT_LOST_WOODS_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_6), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_SHORTCUT_RUPEE_7] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_7, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3B00, 0x3B, "Underwater Shortcut Rupee 7", RHT_LOST_WOODS_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_7), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_SHORTCUT_RUPEE_8] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_8, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3C00, 0x3C, "Underwater Shortcut Rupee 8", RHT_LOST_WOODS_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_8), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + + locationTable[RC_LH_FRONT_RUPEE] = Location::Collectable(RC_LH_FRONT_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LAKE_HYLIA, ACTOR_EN_ITEM00, SCENE_LAKE_HYLIA, 0x2000, 0x20, "Underwater Front Rupee", RHT_LAKE_HYLIA_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_FRONT_RUPEE), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[RC_LH_MIDDLE_RUPEE] = Location::Collectable(RC_LH_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LAKE_HYLIA, ACTOR_EN_ITEM00, SCENE_LAKE_HYLIA, 0x2100, 0x21, "Underwater Middle Rupee", RHT_LAKE_HYLIA_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_MIDDLE_RUPEE), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[RC_LH_BACK_RUPEE] = Location::Collectable(RC_LH_BACK_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LAKE_HYLIA, ACTOR_EN_ITEM00, SCENE_LAKE_HYLIA, 0x2200, 0x22, "Underwater Back Rupee", RHT_LAKE_HYLIA_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_BACK_RUPEE), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[RC_LH_LAB_FRONT_RUPEE] = Location::Collectable(RC_LH_LAB_FRONT_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LAKE_HYLIA, ACTOR_EN_ITEM00, SCENE_LAKESIDE_LABORATORY, 0x0102, 0x01, "Lab Front Rupee", RHT_LABORATORY_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[RC_LH_LAB_LEFT_RUPEE] = Location::Collectable(RC_LH_LAB_LEFT_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LAKE_HYLIA, ACTOR_EN_ITEM00, SCENE_LAKESIDE_LABORATORY, 0x0202, 0x02, "Lab Left Rupee", RHT_LABORATORY_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[RC_LH_LAB_RIGHT_RUPEE] = Location::Collectable(RC_LH_LAB_RIGHT_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LAKE_HYLIA, ACTOR_EN_ITEM00, SCENE_LAKESIDE_LABORATORY, 0x0302, 0x03, "Lab Right Rupee", RHT_LABORATORY_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + + locationTable[RC_GRAVEYARD_DAMPE_RACE_RUPEE_1] = Location::Collectable(RC_GRAVEYARD_DAMPE_RACE_RUPEE_1, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, 0x3800, 0x38, "Dampe's Grave Rupee 1", RHT_DAMPES_GRAVE_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_1), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_DAMPE_RACE_RUPEE_2] = Location::Collectable(RC_GRAVEYARD_DAMPE_RACE_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, 0x3900, 0x39, "Dampe's Grave Rupee 2", RHT_DAMPES_GRAVE_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_2), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_DAMPE_RACE_RUPEE_3] = Location::Collectable(RC_GRAVEYARD_DAMPE_RACE_RUPEE_3, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, 0x3A00, 0x3A, "Dampe's Grave Rupee 3", RHT_DAMPES_GRAVE_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_3), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_DAMPE_RACE_RUPEE_4] = Location::Collectable(RC_GRAVEYARD_DAMPE_RACE_RUPEE_4, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, 0x3B00, 0x3B, "Dampe's Grave Rupee 4", RHT_DAMPES_GRAVE_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_4), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_DAMPE_RACE_RUPEE_5] = Location::Collectable(RC_GRAVEYARD_DAMPE_RACE_RUPEE_5, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, 0x3C00, 0x3C, "Dampe's Grave Rupee 5", RHT_DAMPES_GRAVE_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_5), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_DAMPE_RACE_RUPEE_6] = Location::Collectable(RC_GRAVEYARD_DAMPE_RACE_RUPEE_6, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, 0x3D00, 0x3D, "Dampe's Grave Rupee 6", RHT_DAMPES_GRAVE_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_6), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_DAMPE_RACE_RUPEE_7] = Location::Collectable(RC_GRAVEYARD_DAMPE_RACE_RUPEE_7, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, 0x3E00, 0x3E, "Dampe's Grave Rupee 7", RHT_DAMPES_GRAVE_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_7), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_DAMPE_RACE_RUPEE_8] = Location::Collectable(RC_GRAVEYARD_DAMPE_RACE_RUPEE_8, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, 0x3F00, 0x3F, "Dampe's Grave Rupee 8", RHT_DAMPES_GRAVE_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_8), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + + locationTable[RC_GV_OCTOROK_GROTTO_FRONT_LEFT_BLUE_RUPEE] = Location::Collectable(RC_GV_OCTOROK_GROTTO_FRONT_LEFT_BLUE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GERUDO_VALLEY, ACTOR_EN_ITEM00, SCENE_GROTTOS, 0x3801, 0x38, "Octorok Grotto Front Left Blue Rupee", RHT_GERUDO_VALLEY_GROTTO_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_BLUE_RUPEE), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GV_OCTOROK_GROTTO_BACK_BLUE_RUPEE] = Location::Collectable(RC_GV_OCTOROK_GROTTO_BACK_BLUE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GERUDO_VALLEY, ACTOR_EN_ITEM00, SCENE_GROTTOS, 0x3901, 0x39, "Octorok Grotto Back Blue Rupee", RHT_GERUDO_VALLEY_GROTTO_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_OCTOROK_GROTTO_BACK_BLUE_RUPEE), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GV_OCTOROK_GROTTO_FRONT_RIGHT_BLUE_RUPEE] = Location::Collectable(RC_GV_OCTOROK_GROTTO_FRONT_RIGHT_BLUE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GERUDO_VALLEY, ACTOR_EN_ITEM00, SCENE_GROTTOS, 0x3A01, 0x3A, "Octorok Grotto Front Right Blue Rupee", RHT_GERUDO_VALLEY_GROTTO_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_BLUE_RUPEE), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GV_OCTOROK_GROTTO_FRONT_LEFT_GREEN_RUPEE] = Location::Collectable(RC_GV_OCTOROK_GROTTO_FRONT_LEFT_GREEN_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GERUDO_VALLEY, ACTOR_EN_ITEM00, SCENE_GROTTOS, 0x3B00, 0x3B, "Octorok Grotto Front Left Green Rupee", RHT_GERUDO_VALLEY_GROTTO_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_GREEN_RUPEE), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GV_OCTOROK_GROTTO_FRONT_RIGHT_GREEN_RUPEE] = Location::Collectable(RC_GV_OCTOROK_GROTTO_FRONT_RIGHT_GREEN_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GERUDO_VALLEY, ACTOR_EN_ITEM00, SCENE_GROTTOS, 0x3C00, 0x3C, "Octorok Grotto Front Right Green Rupee", RHT_GERUDO_VALLEY_GROTTO_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_GREEN_RUPEE), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GV_OCTOROK_GROTTO_BACK_LEFT_GREEN_RUPEE] = Location::Collectable(RC_GV_OCTOROK_GROTTO_BACK_LEFT_GREEN_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GERUDO_VALLEY, ACTOR_EN_ITEM00, SCENE_GROTTOS, 0x3D00, 0x3D, "Octorok Grotto Back Left Green Rupee", RHT_GERUDO_VALLEY_GROTTO_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_OCTOROK_GROTTO_BACK_LEFT_GREEN_RUPEE), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GV_OCTOROK_GROTTO_BACK_RIGHT_GREEN_RUPEE] = Location::Collectable(RC_GV_OCTOROK_GROTTO_BACK_RIGHT_GREEN_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GERUDO_VALLEY, ACTOR_EN_ITEM00, SCENE_GROTTOS, 0x3E00, 0x3E, "Octorok Grotto Back Right Green Rupee", RHT_GERUDO_VALLEY_GROTTO_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_OCTOROK_GROTTO_BACK_RIGHT_GREEN_RUPEE), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GV_OCTOROK_GROTTO_RED_RUPEE] = Location::Collectable(RC_GV_OCTOROK_GROTTO_RED_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GERUDO_VALLEY, ACTOR_EN_ITEM00, SCENE_GROTTOS, 0x3F02, 0x3F, "Octorok Grotto Red Rupee", RHT_GERUDO_VALLEY_GROTTO_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_OCTOROK_GROTTO_RED_RUPEE), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + + locationTable[RC_DMT_RED_RUPEE] = Location::Collectable(RC_DMT_RED_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_TRAIL, 0x0A02, 0x0A, "Red Rupee Under Boulder", RHT_DEATH_MOUNTAIN_TRAIL_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_BLUE_RUPEE] = Location::Collectable(RC_DMT_BLUE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_TRAIL, 0x0701, 0x07, "Blue Rupee Under Boulder", RHT_DEATH_MOUNTAIN_TRAIL_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_COW_GROTTO_LEFT_HEART] = Location::Collectable(RC_DMT_COW_GROTTO_LEFT_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, 0x2803, 0x28, "Cow Grotto Left Heart", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_COW_GROTTO_MIDDLE_LEFT_HEART] = Location::Collectable(RC_DMT_COW_GROTTO_MIDDLE_LEFT_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, 0x2903, 0x29, "Cow Grotto Middle Left Heart", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_MIDDLE_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_COW_GROTTO_MIDDLE_RIGHT_HEART] = Location::Collectable(RC_DMT_COW_GROTTO_MIDDLE_RIGHT_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, 0x2A03, 0x2A, "Cow Grotto Middle Right Heart", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_MIDDLE_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_COW_GROTTO_RIGHT_HEART] = Location::Collectable(RC_DMT_COW_GROTTO_RIGHT_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, 0x2B03, 0x2B, "Cow Grotto Right Heart", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_COW_GROTTO_RUPEE_1] = Location::Collectable(RC_DMT_COW_GROTTO_RUPEE_1, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2390, -100), 0, "Cow Grotto Rupee 1", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_RUPEE_1), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_COW_GROTTO_RUPEE_2] = Location::Collectable(RC_DMT_COW_GROTTO_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2390, -139), 0, "Cow Grotto Rupee 2", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_RUPEE_2), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_COW_GROTTO_RUPEE_3] = Location::Collectable(RC_DMT_COW_GROTTO_RUPEE_3, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2425, -160), 0, "Cow Grotto Rupee 3", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_RUPEE_3), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_COW_GROTTO_RUPEE_4] = Location::Collectable(RC_DMT_COW_GROTTO_RUPEE_4, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2459, -139), 0, "Cow Grotto Rupee 4", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_RUPEE_4), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_COW_GROTTO_RUPEE_5] = Location::Collectable(RC_DMT_COW_GROTTO_RUPEE_5, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2459, -100), 0, "Cow Grotto Rupee 5", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_RUPEE_5), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_COW_GROTTO_RUPEE_6] = Location::Collectable(RC_DMT_COW_GROTTO_RUPEE_6, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2425, -80), 0, "Cow Grotto Rupee 6", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_RUPEE_6), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_COW_GROTTO_RED_RUPEE] = Location::Collectable(RC_DMT_COW_GROTTO_RED_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2425, -120), 0, "Cow Grotto Red Rupee", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_RED_RUPEE), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + + locationTable[RC_DMC_NEAR_PLATFORM_RED_RUPEE] = Location::Collectable(RC_DMC_NEAR_PLATFORM_RED_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, 0x2002, 0x20, "Near Warp Platform Red Rupee", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_NEAR_PLATFORM_RED_RUPEE), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_MIDDLE_PLATFORM_RED_RUPEE] = Location::Collectable(RC_DMC_MIDDLE_PLATFORM_RED_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, 0x2102, 0x21, "Middle Platform Red Rupee", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_MIDDLE_PLATFORM_RED_RUPEE), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_1] = Location::Collectable(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_1, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, 0x2201, 0x22, "Middle Platform Blue Rupee 1", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_1), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_2] = Location::Collectable(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, 0x2301, 0x23, "Middle Platform Blue Rupee 2", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_2), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_3] = Location::Collectable(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_3, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, 0x2401, 0x24, "Middle Platform Blue Rupee 3", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_3), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_4] = Location::Collectable(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_4, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, 0x2501, 0x25, "Middle Platform Blue Rupee 4", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_4), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_5] = Location::Collectable(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_5, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, 0x2601, 0x26, "Middle Platform Blue Rupee 5", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_5), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_6] = Location::Collectable(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_6, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, 0x2701, 0x27, "Middle Platform Blue Rupee 6", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_6), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_1] = Location::Collectable(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_1, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1087, 454), 0, "Distant Platform Rupee 1", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_1), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_2] = Location::Collectable(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1087, 415), 0, "Distant Platform Rupee 2", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_2), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_3] = Location::Collectable(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_3, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1122, 395), 0, "Distant Platform Rupee 3", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_3), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_4] = Location::Collectable(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_4, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1156, 415), 0, "Distant Platform Rupee 4", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_4), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_5] = Location::Collectable(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_5, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1156, 454), 0, "Distant Platform Rupee 5", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_5), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_6] = Location::Collectable(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_6, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1122, 475), 0, "Distant Platform Rupee 6", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_6), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_DISTANT_PLATFORM_RED_RUPEE] = Location::Collectable(RC_DMC_DISTANT_PLATFORM_RED_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1122, 435), 0, "Distant Platform Red Rupee", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_DISTANT_PLATFORM_RED_RUPEE), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + + locationTable[RC_ZR_BENEATH_WATERFALL_LEFT_RUPEE] = Location::Collectable(RC_ZR_BENEATH_WATERFALL_LEFT_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_RIVER, ACTOR_EN_ITEM00, SCENE_ZORAS_RIVER, 0x2002, 0x20, "Beneath Domain Red Left Rupee", RHT_ZORAS_RIVER_WATERFALL_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BENEATH_WATERFALL_LEFT_RUPEE), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_ZR_BENEATH_WATERFALL_MIDDLE_LEFT_RUPEE] = Location::Collectable(RC_ZR_BENEATH_WATERFALL_MIDDLE_LEFT_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_RIVER, ACTOR_EN_ITEM00, SCENE_ZORAS_RIVER, 0x2102, 0x21, "Beneath Domain Red Middle Left Rupee", RHT_ZORAS_RIVER_WATERFALL_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_LEFT_RUPEE), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_ZR_BENEATH_WATERFALL_MIDDLE_RIGHT_RUPEE] = Location::Collectable(RC_ZR_BENEATH_WATERFALL_MIDDLE_RIGHT_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_RIVER, ACTOR_EN_ITEM00, SCENE_ZORAS_RIVER, 0x2202, 0x22, "Beneath Domain Red Middle Right Rupee", RHT_ZORAS_RIVER_WATERFALL_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_RIGHT_RUPEE), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_ZR_BENEATH_WATERFALL_RIGHT_RUPEE] = Location::Collectable(RC_ZR_BENEATH_WATERFALL_RIGHT_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_RIVER, ACTOR_EN_ITEM00, SCENE_ZORAS_RIVER, 0x2302, 0x23, "Beneath Domain Red Right Rupee", RHT_ZORAS_RIVER_WATERFALL_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BENEATH_WATERFALL_RIGHT_RUPEE), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + + locationTable[RC_ZF_BOTTOM_NORTH_INNER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTH_INNER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2000, 0x20, "Bottom North Inner Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTH_INNER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_NORTHEAST_INNER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHEAST_INNER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2100, 0x21, "Bottom Northeast Inner Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHEAST_INNER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2200, 0x22, "Bottom Southeast Inner Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_SOUTH_INNER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTH_INNER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2300, 0x23, "Bottom South Inner Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTH_INNER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2400, 0x24, "Bottom Southwest Inner Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHWEST_INNER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_NORTHWEST_INNER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHWEST_INNER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2500, 0x25, "Bottom Northwest Inner Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHWEST_INNER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_NORTH_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTH_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2600, 0x26, "Bottom North Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTH_MIDDLE_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2700, 0x27, "Bottom Northeast Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2800, 0x28, "Bottom Southeast Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2900, 0x29, "Bottom South Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2A00, 0x2A, "Bottom Southwest Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2B00, 0x2B, "Bottom Northwest Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_NORTH_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTH_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2C00, 0x2C, "Bottom North Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTH_OUTER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2D00, 0x2D, "Bottom Northeast Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2E00, 0x2E, "Bottom Southeast Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_SOUTH_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTH_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2F00, 0x2F, "Bottom South Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTH_OUTER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x3000, 0x30, "Bottom Southwest Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x3100, 0x31, "Bottom Northwest Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); // Gossip Stones locationTable[RC_DMC_GOSSIP_STONE] = Location::HintStone(RC_DMC_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 14341, 0x05, "Gossip Stone", {}); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index a88fca1ad19..73c090381ca 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -278,6 +278,7 @@ typedef enum { RCTYPE_OCARINA, // Ocarina locations RCTYPE_BEEHIVE, // Beehives RCTYPE_FISH, + RCTYPE_FREESTANDING, // Freestanding rupees and hearts } RandomizerCheckType; typedef enum { RCQUEST_VANILLA, RCQUEST_MQ, RCQUEST_BOTH } RandomizerCheckQuest; @@ -1656,6 +1657,109 @@ typedef enum { RC_ZD_FISH_3, RC_ZD_FISH_4, RC_ZD_FISH_5, + RC_KF_BOULDER_RUPEE_1, + RC_KF_BOULDER_RUPEE_2, + RC_KF_BRIDGE_RUPEE, + RC_KF_BEHIND_MIDOS_RUPEE, + RC_KF_SARIAS_ROOF_WEST_HEART, + RC_KF_SARIAS_ROOF_EAST_HEART, + RC_KF_SARIAS_ROOF_NORTH_HEART, + RC_KF_SOUTH_GRASS_WEST_RUPEE, + RC_KF_NORTH_GRASS_WEST_RUPEE, + RC_KF_NORTH_GRASS_EAST_RUPEE, + RC_KF_SOUTH_GRASS_EAST_RUPEE, + RC_KF_SARIAS_TOP_LEFT_HEART, + RC_KF_SARIAS_TOP_RIGHT_HEART, + RC_KF_SARIAS_BOTTOM_LEFT_HEART, + RC_KF_SARIAS_BOTTOM_RIGHT_HEART, + RC_KF_BEAN_RUPEE_1, + RC_KF_BEAN_RUPEE_2, + RC_KF_BEAN_RUPEE_3, + RC_KF_BEAN_RUPEE_4, + RC_KF_BEAN_RUPEE_5, + RC_KF_BEAN_RUPEE_6, + RC_KF_BEAN_RED_RUPEE, + RC_LW_BOULDER_RUPEE, + RC_LW_SHORTCUT_RUPEE_1, + RC_LW_SHORTCUT_RUPEE_2, + RC_LW_SHORTCUT_RUPEE_3, + RC_LW_SHORTCUT_RUPEE_4, + RC_LW_SHORTCUT_RUPEE_5, + RC_LW_SHORTCUT_RUPEE_6, + RC_LW_SHORTCUT_RUPEE_7, + RC_LW_SHORTCUT_RUPEE_8, + RC_LH_FRONT_RUPEE, + RC_LH_MIDDLE_RUPEE, + RC_LH_BACK_RUPEE, + RC_LH_LAB_FRONT_RUPEE, + RC_LH_LAB_LEFT_RUPEE, + RC_LH_LAB_RIGHT_RUPEE, + RC_GRAVEYARD_DAMPE_RACE_RUPEE_1, + RC_GRAVEYARD_DAMPE_RACE_RUPEE_2, + RC_GRAVEYARD_DAMPE_RACE_RUPEE_3, + RC_GRAVEYARD_DAMPE_RACE_RUPEE_4, + RC_GRAVEYARD_DAMPE_RACE_RUPEE_5, + RC_GRAVEYARD_DAMPE_RACE_RUPEE_6, + RC_GRAVEYARD_DAMPE_RACE_RUPEE_7, + RC_GRAVEYARD_DAMPE_RACE_RUPEE_8, + RC_GV_OCTOROK_GROTTO_FRONT_LEFT_BLUE_RUPEE, + RC_GV_OCTOROK_GROTTO_FRONT_RIGHT_BLUE_RUPEE, + RC_GV_OCTOROK_GROTTO_BACK_BLUE_RUPEE, + RC_GV_OCTOROK_GROTTO_FRONT_LEFT_GREEN_RUPEE, + RC_GV_OCTOROK_GROTTO_FRONT_RIGHT_GREEN_RUPEE, + RC_GV_OCTOROK_GROTTO_BACK_LEFT_GREEN_RUPEE, + RC_GV_OCTOROK_GROTTO_BACK_RIGHT_GREEN_RUPEE, + RC_GV_OCTOROK_GROTTO_RED_RUPEE, + RC_DMT_BLUE_RUPEE, + RC_DMT_RED_RUPEE, + RC_DMT_COW_GROTTO_LEFT_HEART, + RC_DMT_COW_GROTTO_MIDDLE_LEFT_HEART, + RC_DMT_COW_GROTTO_MIDDLE_RIGHT_HEART, + RC_DMT_COW_GROTTO_RIGHT_HEART, + RC_DMT_COW_GROTTO_RUPEE_1, + RC_DMT_COW_GROTTO_RUPEE_2, + RC_DMT_COW_GROTTO_RUPEE_3, + RC_DMT_COW_GROTTO_RUPEE_4, + RC_DMT_COW_GROTTO_RUPEE_5, + RC_DMT_COW_GROTTO_RUPEE_6, + RC_DMT_COW_GROTTO_RED_RUPEE, + RC_DMC_NEAR_PLATFORM_RED_RUPEE, + RC_DMC_MIDDLE_PLATFORM_RED_RUPEE, + RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_1, + RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_2, + RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_3, + RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_4, + RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_5, + RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_6, + RC_DMC_DISTANT_PLATFORM_RED_RUPEE, + RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_1, + RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_2, + RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_3, + RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_4, + RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_5, + RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_6, + RC_ZR_BENEATH_WATERFALL_LEFT_RUPEE, + RC_ZR_BENEATH_WATERFALL_MIDDLE_LEFT_RUPEE, + RC_ZR_BENEATH_WATERFALL_MIDDLE_RIGHT_RUPEE, + RC_ZR_BENEATH_WATERFALL_RIGHT_RUPEE, + RC_ZF_BOTTOM_NORTH_INNER_RUPEE, + RC_ZF_BOTTOM_NORTHEAST_INNER_RUPEE, + RC_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE, + RC_ZF_BOTTOM_SOUTH_INNER_RUPEE, + RC_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE, + RC_ZF_BOTTOM_NORTHWEST_INNER_RUPEE, + RC_ZF_BOTTOM_NORTH_MIDDLE_RUPEE, + RC_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE, + RC_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE, + RC_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE, + RC_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE, + RC_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE, + RC_ZF_BOTTOM_NORTH_OUTER_RUPEE, + RC_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE, + RC_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE, + RC_ZF_BOTTOM_SOUTH_OUTER_RUPEE, + RC_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE, + RC_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE, RC_MAX } RandomizerCheck; @@ -3643,6 +3747,29 @@ typedef enum { RHT_YOUR_POCKET, RHT_DUNGEON_ORDINARY, RHT_DUNGEON_MASTERFUL, + // Shuffle Rupees & Hearts + RHT_KOKIRI_FOREST_RUPEE, + RHT_KOKIRI_FOREST_HEART, + RHT_SARIAS_HOUSE_HEART, + RHT_LOST_WOODS_RUPEE, + RHT_LAKE_HYLIA_RUPEE, + RHT_LABORATORY_RUPEE, + RHT_DAMPES_GRAVE_RUPEE, + RHT_GERUDO_VALLEY_GROTTO_RUPEE, + RHT_DEATH_MOUNTAIN_TRAIL_RUPEE, + RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_HEART, + RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_RUPEE, + RHT_DEATH_MOUNTAIN_CRATER_RUPEE, + RHT_ZORAS_RIVER_WATERFALL_RUPEE, + RHT_ZORAS_FOUNTAIN_RUPEE, + RHT_DEKU_TREE_HEART, + RHT_DODONGOS_CAVERN_HEART, + RHT_JABU_JABU_RUPEE, + RHT_FOREST_TEMPLE_HEART, + RHT_FIRE_TEMPLE_HEART, + RHT_SHADOW_TEMPLE_HEART, + RHT_BOTTOM_OF_THE_WELL_HEART, + RHT_GANONS_CASTLE_HEART, RHT_MAX } RandomizerHintTextKey; diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index 20aab303209..20c9ade5381 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -306,6 +306,101 @@ typedef enum { RAND_INF_CHILD_TRADES_MASK_ZORA, RAND_INF_CHILD_TRADES_MASK_GERUDO, RAND_INF_CHILD_TRADES_MASK_TRUTH, + + RAND_INF_KF_SOUTH_GRASS_WEST_RUPEE, + RAND_INF_KF_NORTH_GRASS_WEST_RUPEE, + RAND_INF_KF_NORTH_GRASS_EAST_RUPEE, + RAND_INF_KF_SOUTH_GRASS_EAST_RUPEE, + RAND_INF_KF_SARIAS_TOP_LEFT_HEART, + RAND_INF_KF_SARIAS_TOP_RIGHT_HEART, + RAND_INF_KF_SARIAS_BOTTOM_LEFT_HEART, + RAND_INF_KF_SARIAS_BOTTOM_RIGHT_HEART, + RAND_INF_KF_BEAN_RUPEE_1, + RAND_INF_KF_BEAN_RUPEE_2, + RAND_INF_KF_BEAN_RUPEE_3, + RAND_INF_KF_BEAN_RUPEE_4, + RAND_INF_KF_BEAN_RUPEE_5, + RAND_INF_KF_BEAN_RUPEE_6, + RAND_INF_KF_BEAN_RED_RUPEE, + RAND_INF_LW_SHORTCUT_RUPEE_1, + RAND_INF_LW_SHORTCUT_RUPEE_2, + RAND_INF_LW_SHORTCUT_RUPEE_3, + RAND_INF_LW_SHORTCUT_RUPEE_4, + RAND_INF_LW_SHORTCUT_RUPEE_5, + RAND_INF_LW_SHORTCUT_RUPEE_6, + RAND_INF_LW_SHORTCUT_RUPEE_7, + RAND_INF_LW_SHORTCUT_RUPEE_8, + RAND_INF_LH_FRONT_RUPEE, + RAND_INF_LH_MIDDLE_RUPEE, + RAND_INF_LH_BACK_RUPEE, + RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_1, + RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_2, + RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_3, + RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_4, + RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_5, + RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_6, + RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_7, + RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_8, + + RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_BLUE_RUPEE, + RAND_INF_GV_OCTOROK_GROTTO_BACK_BLUE_RUPEE, + RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_BLUE_RUPEE, + RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_GREEN_RUPEE, + RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_GREEN_RUPEE, + RAND_INF_GV_OCTOROK_GROTTO_BACK_LEFT_GREEN_RUPEE, + RAND_INF_GV_OCTOROK_GROTTO_BACK_RIGHT_GREEN_RUPEE, + RAND_INF_GV_OCTOROK_GROTTO_RED_RUPEE, + + RAND_INF_DMT_BLUE_RUPEE, + RAND_INF_DMT_COW_GROTTO_LEFT_HEART, + RAND_INF_DMT_COW_GROTTO_MIDDLE_LEFT_HEART, + RAND_INF_DMT_COW_GROTTO_MIDDLE_RIGHT_HEART, + RAND_INF_DMT_COW_GROTTO_RIGHT_HEART, + RAND_INF_DMT_COW_GROTTO_RUPEE_1, + RAND_INF_DMT_COW_GROTTO_RUPEE_2, + RAND_INF_DMT_COW_GROTTO_RUPEE_3, + RAND_INF_DMT_COW_GROTTO_RUPEE_4, + RAND_INF_DMT_COW_GROTTO_RUPEE_5, + RAND_INF_DMT_COW_GROTTO_RUPEE_6, + RAND_INF_DMT_COW_GROTTO_RED_RUPEE, + RAND_INF_DMC_NEAR_PLATFORM_RED_RUPEE, + RAND_INF_DMC_MIDDLE_PLATFORM_RED_RUPEE, + RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_1, + RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_2, + RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_3, + RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_4, + RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_5, + RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_6, + RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_1, + RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_2, + RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_3, + RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_4, + RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_5, + RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_6, + RAND_INF_DMC_DISTANT_PLATFORM_RED_RUPEE, + + RAND_INF_ZR_BENEATH_WATERFALL_LEFT_RUPEE, + RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_LEFT_RUPEE, + RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_RIGHT_RUPEE, + RAND_INF_ZR_BENEATH_WATERFALL_RIGHT_RUPEE, + RAND_INF_ZF_BOTTOM_NORTH_INNER_RUPEE, + RAND_INF_ZF_BOTTOM_NORTHEAST_INNER_RUPEE, + RAND_INF_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE, + RAND_INF_ZF_BOTTOM_SOUTH_INNER_RUPEE, + RAND_INF_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE, + RAND_INF_ZF_BOTTOM_NORTHWEST_INNER_RUPEE, + RAND_INF_ZF_BOTTOM_NORTH_MIDDLE_RUPEE, + RAND_INF_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE, + RAND_INF_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE, + RAND_INF_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE, + RAND_INF_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE, + RAND_INF_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE, + RAND_INF_ZF_BOTTOM_NORTH_OUTER_RUPEE, + RAND_INF_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE, + RAND_INF_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE, + RAND_INF_ZF_BOTTOM_SOUTH_OUTER_RUPEE, + RAND_INF_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE, + RAND_INF_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE, // If you add anything to this list, you need to update the size of randomizerInf in z64save.h to be ceil(RAND_INF_MAX / 16) RAND_INF_MAX, From f5bf04570be033cf459f065e46039ae0dfb138ad Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Wed, 7 Aug 2024 22:39:20 -0700 Subject: [PATCH 036/108] Add logic for overworld freestanding checks --- .../location_access/locacc_gerudo_valley.cpp | 12 +- .../location_access/locacc_hyrule_field.cpp | 12 +- .../location_access/locacc_kakariko.cpp | 8 ++ .../location_access/locacc_lost_woods.cpp | 41 ++++++- .../location_access/locacc_zoras_domain.cpp | 66 +++++++---- .../Enhancements/randomizer/location_list.cpp | 104 ++++++++++++++++++ 6 files changed, 211 insertions(+), 32 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp index 554003434a6..d421d17afd3 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp @@ -78,7 +78,17 @@ void AreaTable_Init_GerudoValley() { Entrance(RR_GV_FORTRESS_SIDE, {[]{return true;}}), }); - areaTable[RR_GV_OCTOROK_GROTTO] = Area("GV Octorok Grotto", "GV Octorok Grotto", RA_NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GV_OCTOROK_GROTTO] = Area("GV Octorok Grotto", "GV Octorok Grotto", RA_NONE, NO_DAY_NIGHT_CYCLE, {}, { + //Locations + LOCATION(RC_GV_OCTOROK_GROTTO_FRONT_LEFT_BLUE_RUPEE, logic->HasItem(RG_BRONZE_SCALE)), + LOCATION(RC_GV_OCTOROK_GROTTO_FRONT_RIGHT_BLUE_RUPEE, logic->HasItem(RG_BRONZE_SCALE)), + LOCATION(RC_GV_OCTOROK_GROTTO_BACK_BLUE_RUPEE, logic->HasItem(RG_BRONZE_SCALE)), + LOCATION(RC_GV_OCTOROK_GROTTO_FRONT_LEFT_GREEN_RUPEE, logic->HasItem(RG_BRONZE_SCALE)), + LOCATION(RC_GV_OCTOROK_GROTTO_FRONT_RIGHT_GREEN_RUPEE, logic->HasItem(RG_BRONZE_SCALE)), + LOCATION(RC_GV_OCTOROK_GROTTO_BACK_LEFT_GREEN_RUPEE, logic->HasItem(RG_BRONZE_SCALE)), + LOCATION(RC_GV_OCTOROK_GROTTO_BACK_RIGHT_GREEN_RUPEE, logic->HasItem(RG_BRONZE_SCALE)), + LOCATION(RC_GV_OCTOROK_GROTTO_RED_RUPEE, logic->HasItem(RG_BRONZE_SCALE)), + }, { //Exits Entrance(RR_GV_GROTTO_LEDGE, {[]{return true;}}), }); diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp index 860b90e8b80..2e48a59b087 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp @@ -126,6 +126,9 @@ void AreaTable_Init_HyruleField() { LOCATION(RC_LH_GS_LAB_WALL, logic->IsChild && (logic->HookshotOrBoomerang || (randoCtx->GetTrickOption(RT_LH_LAB_WALL_GS) && logic->CanJumpslash)) && logic->AtNight && logic->CanGetNightTimeGS), LOCATION(RC_LH_GS_SMALL_ISLAND, logic->IsChild && logic->CanChildAttack && logic->AtNight && logic->CanGetNightTimeGS), LOCATION(RC_LH_GS_TREE, logic->IsAdult && logic->CanUse(RG_LONGSHOT) && logic->AtNight && logic->CanGetNightTimeGS), + LOCATION(RC_LH_FRONT_RUPEE, logic->IsChild && logic->HasItem(RG_BRONZE_SCALE)), + LOCATION(RC_LH_MIDDLE_RUPEE, logic->IsChild && (logic->HasItem(RG_SILVER_SCALE) || logic->CanUse(RG_IRON_BOOTS))), + LOCATION(RC_LH_BACK_RUPEE, logic->IsChild && (logic->HasItem(RG_SILVER_SCALE) || logic->CanUse(RG_IRON_BOOTS))), LOCATION(RC_LH_LAB_GOSSIP_STONE, true), LOCATION(RC_LH_SOUTHEAST_GOSSIP_STONE, true), LOCATION(RC_LH_SOUTHWEST_GOSSIP_STONE, true), @@ -156,9 +159,12 @@ void AreaTable_Init_HyruleField() { EventAccess(&logic->EyedropsAccess, {[]{return logic->EyedropsAccess || (logic->IsAdult && (logic->EyeballFrogAccess || (logic->EyeballFrog && logic->DisableTradeRevert)));}}), }, { //Locations - LOCATION(RC_LH_LAB_DIVE, logic->ProgressiveScale >= 2 || (randoCtx->GetTrickOption(RT_LH_LAB_DIVING) && logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT))), - LOCATION(RC_LH_TRADE_FROG, logic->IsAdult && logic->EyeballFrog), - LOCATION(RC_LH_GS_LAB_CRATE, logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT)), + LOCATION(RC_LH_LAB_DIVE, logic->ProgressiveScale >= 2 || (randoCtx->GetTrickOption(RT_LH_LAB_DIVING) && logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT))), + LOCATION(RC_LH_TRADE_FROG, logic->IsAdult && logic->EyeballFrog), + LOCATION(RC_LH_GS_LAB_CRATE, logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT)), + LOCATION(RC_LH_LAB_FRONT_RUPEE, logic->CanUse(RG_IRON_BOOTS) || logic->HasItem(RG_GOLDEN_SCALE)), + LOCATION(RC_LH_LAB_LEFT_RUPEE, logic->CanUse(RG_IRON_BOOTS) || logic->HasItem(RG_GOLDEN_SCALE)), + LOCATION(RC_LH_LAB_RIGHT_RUPEE, logic->CanUse(RG_IRON_BOOTS) || logic->HasItem(RG_GOLDEN_SCALE)), }, { //Exits Entrance(RR_LAKE_HYLIA, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp index 708163784e2..2c20d212ed8 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp @@ -262,6 +262,14 @@ void AreaTable_Init_Kakariko() { //Locations LOCATION(RC_GRAVEYARD_HOOKSHOT_CHEST, true), LOCATION(RC_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, logic->IsAdult || randoCtx->GetTrickOption(RT_GY_CHILD_DAMPE_RACE_POH)), + LOCATION(RC_GRAVEYARD_DAMPE_RACE_RUPEE_1, true), + LOCATION(RC_GRAVEYARD_DAMPE_RACE_RUPEE_2, true), + LOCATION(RC_GRAVEYARD_DAMPE_RACE_RUPEE_3, true), + LOCATION(RC_GRAVEYARD_DAMPE_RACE_RUPEE_4, true), + LOCATION(RC_GRAVEYARD_DAMPE_RACE_RUPEE_5, true), + LOCATION(RC_GRAVEYARD_DAMPE_RACE_RUPEE_6, true), + LOCATION(RC_GRAVEYARD_DAMPE_RACE_RUPEE_7, true), + LOCATION(RC_GRAVEYARD_DAMPE_RACE_RUPEE_8, true), }, { //Exits Entrance(RR_THE_GRAVEYARD, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp index 2f9732b461a..4a278652550 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp @@ -11,11 +11,26 @@ void AreaTable_Init_LostWoods() { EventAccess(&logic->ShowedMidoSwordAndShield, {[]{return logic->ShowedMidoSwordAndShield || (logic->IsChild && logic->KokiriSword && logic->DekuShield);}}), }, { //Locations - LOCATION(RC_KF_KOKIRI_SWORD_CHEST, logic->IsChild), - LOCATION(RC_KF_GS_KNOW_IT_ALL_HOUSE, logic->IsChild && logic->CanChildAttack && logic->AtNight && (/*TODO: HasNightStart ||*/ logic->CanLeaveForest || logic->CanUse(RG_SUNS_SONG)) && logic->CanGetNightTimeGS), - LOCATION(RC_KF_GS_BEAN_PATCH, logic->CanPlantBugs && logic->CanChildAttack), - LOCATION(RC_KF_GS_HOUSE_OF_TWINS, logic->IsAdult && logic->AtNight && (logic->HookshotOrBoomerang || (randoCtx->GetTrickOption(RT_KF_ADULT_GS) && logic->CanUse(RG_HOVER_BOOTS))) && logic->CanGetNightTimeGS), - LOCATION(RC_KF_GOSSIP_STONE, true), + LOCATION(RC_KF_KOKIRI_SWORD_CHEST, logic->IsChild), + LOCATION(RC_KF_GS_KNOW_IT_ALL_HOUSE, logic->IsChild && logic->CanChildAttack && logic->AtNight && (/*TODO: HasNightStart ||*/ logic->CanLeaveForest || logic->CanUse(RG_SUNS_SONG)) && logic->CanGetNightTimeGS), + LOCATION(RC_KF_GS_BEAN_PATCH, logic->CanPlantBugs && logic->CanChildAttack), + LOCATION(RC_KF_GS_HOUSE_OF_TWINS, logic->IsAdult && logic->AtNight && (logic->HookshotOrBoomerang || (randoCtx->GetTrickOption(RT_KF_ADULT_GS) && logic->CanUse(RG_HOVER_BOOTS))) && logic->CanGetNightTimeGS), + LOCATION(RC_KF_BRIDGE_RUPEE, logic->IsChild), + LOCATION(RC_KF_BEHIND_MIDOS_RUPEE, logic->IsChild), + LOCATION(RC_KF_SOUTH_GRASS_WEST_RUPEE, logic->IsChild), + LOCATION(RC_KF_SOUTH_GRASS_EAST_RUPEE, logic->IsChild), + LOCATION(RC_KF_NORTH_GRASS_WEST_RUPEE, logic->IsChild), + LOCATION(RC_KF_NORTH_GRASS_EAST_RUPEE, logic->IsChild), + LOCATION(RC_KF_BOULDER_RUPEE_1, logic->IsChild), + LOCATION(RC_KF_BOULDER_RUPEE_2, logic->IsChild), + LOCATION(RC_KF_BEAN_RUPEE_1, logic->IsAdult && (CanPlantBean(RR_KOKIRI_FOREST) || logic->CanUse(RG_HOVER_BOOTS))), + LOCATION(RC_KF_BEAN_RUPEE_2, logic->IsAdult && (CanPlantBean(RR_KOKIRI_FOREST) || logic->CanUse(RG_HOVER_BOOTS))), + LOCATION(RC_KF_BEAN_RUPEE_3, logic->IsAdult && (CanPlantBean(RR_KOKIRI_FOREST) || logic->CanUse(RG_HOVER_BOOTS))), + LOCATION(RC_KF_BEAN_RUPEE_4, logic->IsAdult && (CanPlantBean(RR_KOKIRI_FOREST) || logic->CanUse(RG_HOVER_BOOTS))), + LOCATION(RC_KF_BEAN_RUPEE_5, logic->IsAdult && (CanPlantBean(RR_KOKIRI_FOREST) || logic->CanUse(RG_HOVER_BOOTS))), + LOCATION(RC_KF_BEAN_RUPEE_6, logic->IsAdult && (CanPlantBean(RR_KOKIRI_FOREST) || logic->CanUse(RG_HOVER_BOOTS))), + LOCATION(RC_KF_BEAN_RED_RUPEE, logic->IsAdult && (CanPlantBean(RR_KOKIRI_FOREST) || logic->CanUse(RG_HOVER_BOOTS))), + LOCATION(RC_KF_GOSSIP_STONE, true), }, { //Exits Entrance(RR_KF_LINKS_HOUSE, {[]{return true;}}), @@ -64,7 +79,13 @@ void AreaTable_Init_LostWoods() { Entrance(RR_KOKIRI_FOREST, {[]{return true;}}), }); - areaTable[RR_KF_SARIAS_HOUSE] = Area("KF Saria's House", "KF Saria's House", RA_NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_KF_SARIAS_HOUSE] = Area("KF Saria's House", "KF Saria's House", RA_NONE, NO_DAY_NIGHT_CYCLE, {}, { + //Locations + LOCATION(RC_KF_SARIAS_TOP_LEFT_HEART, true), + LOCATION(RC_KF_SARIAS_TOP_RIGHT_HEART, true), + LOCATION(RC_KF_SARIAS_BOTTOM_LEFT_HEART, true), + LOCATION(RC_KF_SARIAS_BOTTOM_RIGHT_HEART, true), + }, { //Exits Entrance(RR_KOKIRI_FOREST, {[]{return true;}}), }); @@ -135,6 +156,14 @@ void AreaTable_Init_LostWoods() { LOCATION(RC_LW_TARGET_IN_WOODS, logic->IsChild && logic->CanUse(RG_FAIRY_SLINGSHOT)), LOCATION(RC_LW_DEKU_SCRUB_NEAR_BRIDGE, logic->IsChild && logic->CanStunDeku), LOCATION(RC_LW_GS_BEAN_PATCH_NEAR_BRIDGE, logic->CanPlantBugs && logic->CanChildAttack), + LOCATION(RC_LW_SHORTCUT_RUPEE_1, logic->IsChild && logic->HasItem(RG_SILVER_SCALE)), + LOCATION(RC_LW_SHORTCUT_RUPEE_2, logic->IsChild && logic->HasItem(RG_SILVER_SCALE)), + LOCATION(RC_LW_SHORTCUT_RUPEE_3, logic->IsChild && logic->HasItem(RG_SILVER_SCALE)), + LOCATION(RC_LW_SHORTCUT_RUPEE_4, logic->IsChild && logic->HasItem(RG_SILVER_SCALE)), + LOCATION(RC_LW_SHORTCUT_RUPEE_5, logic->IsChild && logic->HasItem(RG_SILVER_SCALE)), + LOCATION(RC_LW_SHORTCUT_RUPEE_6, logic->IsChild && logic->HasItem(RG_SILVER_SCALE)), + LOCATION(RC_LW_SHORTCUT_RUPEE_7, logic->IsChild && logic->HasItem(RG_SILVER_SCALE)), + LOCATION(RC_LW_SHORTCUT_RUPEE_8, logic->IsChild && logic->HasItem(RG_SILVER_SCALE)), LOCATION(RC_LW_GOSSIP_STONE, true), }, { //Exits diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp index 2344c13a80b..3e4480cb6c7 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp @@ -21,21 +21,25 @@ void AreaTable_Init_ZorasDomain() { EventAccess(&logic->BugShrub, {[]{return logic->BugShrub || logic->CanCutShrubs;}}), }, { //Locations - LOCATION(RC_ZR_MAGIC_BEAN_SALESMAN, logic->ChildsWallet && logic->IsChild), - LOCATION(RC_ZR_FROGS_OCARINA_GAME, logic->IsChild && logic->CanUse(RG_ZELDAS_LULLABY) && logic->CanUse(RG_SARIAS_SONG) && logic->CanUse(RG_SUNS_SONG) && logic->CanUse(RG_EPONAS_SONG) && logic->CanUse(RG_SONG_OF_TIME) && logic->CanUse(RG_SONG_OF_STORMS)), - LOCATION(RC_ZR_FROGS_IN_THE_RAIN, logic->IsChild && logic->CanUse(RG_SONG_OF_STORMS)), - LOCATION(RC_ZR_FROGS_ZELDAS_LULLABY, logic->IsChild && logic->CanUse(RG_ZELDAS_LULLABY)), - LOCATION(RC_ZR_FROGS_EPONAS_SONG, logic->IsChild && logic->CanUse(RG_EPONAS_SONG)), - LOCATION(RC_ZR_FROGS_SARIAS_SONG, logic->IsChild && logic->CanUse(RG_SARIAS_SONG)), - LOCATION(RC_ZR_FROGS_SUNS_SONG, logic->IsChild && logic->CanUse(RG_SUNS_SONG)), - LOCATION(RC_ZR_FROGS_SONG_OF_TIME, logic->IsChild && logic->CanUse(RG_SONG_OF_TIME)), - LOCATION(RC_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, logic->IsChild || logic->CanUse(RG_HOVER_BOOTS) || (logic->IsAdult && randoCtx->GetTrickOption(RT_ZR_LOWER))), - LOCATION(RC_ZR_NEAR_DOMAIN_FREESTANDING_POH, logic->IsChild || logic->CanUse(RG_HOVER_BOOTS) || (logic->IsAdult && randoCtx->GetTrickOption(RT_ZR_UPPER))), - LOCATION(RC_ZR_GS_LADDER, logic->IsChild && logic->AtNight && logic->CanChildAttack && logic->CanGetNightTimeGS), - LOCATION(RC_ZR_GS_NEAR_RAISED_GROTTOS, logic->IsAdult && logic->HookshotOrBoomerang && logic->AtNight && logic->CanGetNightTimeGS), - LOCATION(RC_ZR_GS_ABOVE_BRIDGE, logic->IsAdult && logic->CanUse(RG_HOOKSHOT) && logic->AtNight && logic->CanGetNightTimeGS), - LOCATION(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, true), - LOCATION(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, true), + LOCATION(RC_ZR_MAGIC_BEAN_SALESMAN, logic->ChildsWallet && logic->IsChild), + LOCATION(RC_ZR_FROGS_OCARINA_GAME, logic->IsChild && logic->CanUse(RG_ZELDAS_LULLABY) && logic->CanUse(RG_SARIAS_SONG) && logic->CanUse(RG_SUNS_SONG) && logic->CanUse(RG_EPONAS_SONG) && logic->CanUse(RG_SONG_OF_TIME) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_ZR_FROGS_IN_THE_RAIN, logic->IsChild && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_ZR_FROGS_ZELDAS_LULLABY, logic->IsChild && logic->CanUse(RG_ZELDAS_LULLABY)), + LOCATION(RC_ZR_FROGS_EPONAS_SONG, logic->IsChild && logic->CanUse(RG_EPONAS_SONG)), + LOCATION(RC_ZR_FROGS_SARIAS_SONG, logic->IsChild && logic->CanUse(RG_SARIAS_SONG)), + LOCATION(RC_ZR_FROGS_SUNS_SONG, logic->IsChild && logic->CanUse(RG_SUNS_SONG)), + LOCATION(RC_ZR_FROGS_SONG_OF_TIME, logic->IsChild && logic->CanUse(RG_SONG_OF_TIME)), + LOCATION(RC_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, logic->IsChild || logic->CanUse(RG_HOVER_BOOTS) || (logic->IsAdult && randoCtx->GetTrickOption(RT_ZR_LOWER))), + LOCATION(RC_ZR_NEAR_DOMAIN_FREESTANDING_POH, logic->IsChild || logic->CanUse(RG_HOVER_BOOTS) || (logic->IsAdult && randoCtx->GetTrickOption(RT_ZR_UPPER))), + LOCATION(RC_ZR_GS_LADDER, logic->IsChild && logic->AtNight && logic->CanChildAttack && logic->CanGetNightTimeGS), + LOCATION(RC_ZR_GS_NEAR_RAISED_GROTTOS, logic->IsAdult && logic->HookshotOrBoomerang && logic->AtNight && logic->CanGetNightTimeGS), + LOCATION(RC_ZR_GS_ABOVE_BRIDGE, logic->IsAdult && logic->CanUse(RG_HOOKSHOT) && logic->AtNight && logic->CanGetNightTimeGS), + LOCATION(RC_ZR_BENEATH_WATERFALL_LEFT_RUPEE, logic->IsAdult), + LOCATION(RC_ZR_BENEATH_WATERFALL_MIDDLE_LEFT_RUPEE, logic->IsAdult), + LOCATION(RC_ZR_BENEATH_WATERFALL_MIDDLE_RIGHT_RUPEE, logic->IsAdult), + LOCATION(RC_ZR_BENEATH_WATERFALL_RIGHT_RUPEE, logic->IsAdult), + LOCATION(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, true), + LOCATION(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, true), }, { //Exits Entrance(RR_ZR_FRONT, {[]{return true;}}), @@ -153,13 +157,31 @@ void AreaTable_Init_ZorasDomain() { EventAccess(&logic->ButterflyFairy, {[]{return logic->ButterflyFairy || (logic->CanUse(RG_STICKS) && logic->AtDay);}}), }, { //Locations - LOCATION(RC_ZF_ICEBERC_FREESTANDING_POH, logic->IsAdult), - LOCATION(RC_ZF_BOTTOM_FREESTANDING_POH, logic->IsAdult && logic->IronBoots && logic->WaterTimer >= 24), - LOCATION(RC_ZF_GS_TREE, logic->IsChild), - LOCATION(RC_ZF_GS_ABOVE_THE_LOG, logic->IsChild && logic->HookshotOrBoomerang && logic->AtNight && logic->CanGetNightTimeGS), - LOCATION(RC_ZF_GS_HIDDEN_CAVE, logic->CanUse(RG_SILVER_GAUNTLETS) && logic->CanBlastOrSmash && logic->HookshotOrBoomerang && logic->IsAdult && logic->AtNight && logic->CanGetNightTimeGS), - LOCATION(RC_ZF_FAIRY_GOSSIP_STONE, true), - LOCATION(RC_ZF_JABU_GOSSIP_STONE, true), + LOCATION(RC_ZF_ICEBERC_FREESTANDING_POH, logic->IsAdult), + LOCATION(RC_ZF_BOTTOM_FREESTANDING_POH, logic->IsAdult && logic->IronBoots && logic->WaterTimer >= 24), + LOCATION(RC_ZF_GS_TREE, logic->IsChild), + LOCATION(RC_ZF_GS_ABOVE_THE_LOG, logic->IsChild && logic->HookshotOrBoomerang && logic->AtNight && logic->CanGetNightTimeGS), + LOCATION(RC_ZF_GS_HIDDEN_CAVE, logic->CanUse(RG_SILVER_GAUNTLETS) && logic->CanBlastOrSmash && logic->HookshotOrBoomerang && logic->IsAdult && logic->AtNight && logic->CanGetNightTimeGS), + LOCATION(RC_ZF_BOTTOM_NORTH_INNER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_NORTHEAST_INNER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_SOUTH_INNER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_NORTHWEST_INNER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_NORTHWEST_INNER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_NORTH_MIDDLE_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_NORTH_OUTER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_SOUTH_OUTER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_FAIRY_GOSSIP_STONE, true), + LOCATION(RC_ZF_JABU_GOSSIP_STONE, true), }, { //Exits Entrance(RR_ZD_BEHIND_KING_ZORA, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 7ecba2e3ed7..693273ba96b 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -505,6 +505,110 @@ std::vector Rando::StaticData::overworldLocations = { RC_LH_GROTTO_BEEHIVE, RC_GV_DEKU_SCRUB_GROTTO_BEEHIVE, RC_COLOSSUS_GROTTO_BEEHIVE, + + RC_KF_BOULDER_RUPEE_2, + RC_KF_BOULDER_RUPEE_1, + RC_KF_BRIDGE_RUPEE, + RC_KF_BEHIND_MIDOS_RUPEE, + RC_KF_SARIAS_ROOF_WEST_HEART, + RC_KF_SARIAS_ROOF_EAST_HEART, + RC_KF_SARIAS_ROOF_NORTH_HEART, + RC_KF_SOUTH_GRASS_WEST_RUPEE, + RC_KF_NORTH_GRASS_WEST_RUPEE, + RC_KF_NORTH_GRASS_EAST_RUPEE, + RC_KF_SOUTH_GRASS_EAST_RUPEE, + RC_KF_SARIAS_TOP_LEFT_HEART, + RC_KF_SARIAS_TOP_RIGHT_HEART, + RC_KF_SARIAS_BOTTOM_LEFT_HEART, + RC_KF_SARIAS_BOTTOM_RIGHT_HEART, + RC_KF_BEAN_RUPEE_1, + RC_KF_BEAN_RUPEE_2, + RC_KF_BEAN_RUPEE_3, + RC_KF_BEAN_RUPEE_4, + RC_KF_BEAN_RUPEE_5, + RC_KF_BEAN_RUPEE_6, + RC_KF_BEAN_RED_RUPEE, + RC_LW_BOULDER_RUPEE, + RC_LW_SHORTCUT_RUPEE_1, + RC_LW_SHORTCUT_RUPEE_2, + RC_LW_SHORTCUT_RUPEE_3, + RC_LW_SHORTCUT_RUPEE_4, + RC_LW_SHORTCUT_RUPEE_5, + RC_LW_SHORTCUT_RUPEE_6, + RC_LW_SHORTCUT_RUPEE_7, + RC_LW_SHORTCUT_RUPEE_8, + RC_LH_FRONT_RUPEE, + RC_LH_MIDDLE_RUPEE, + RC_LH_BACK_RUPEE, + RC_LH_LAB_FRONT_RUPEE, + RC_LH_LAB_LEFT_RUPEE, + RC_LH_LAB_RIGHT_RUPEE, + RC_GRAVEYARD_DAMPE_RACE_RUPEE_1, + RC_GRAVEYARD_DAMPE_RACE_RUPEE_2, + RC_GRAVEYARD_DAMPE_RACE_RUPEE_3, + RC_GRAVEYARD_DAMPE_RACE_RUPEE_4, + RC_GRAVEYARD_DAMPE_RACE_RUPEE_5, + RC_GRAVEYARD_DAMPE_RACE_RUPEE_6, + RC_GRAVEYARD_DAMPE_RACE_RUPEE_7, + RC_GRAVEYARD_DAMPE_RACE_RUPEE_8, + RC_GV_OCTOROK_GROTTO_FRONT_LEFT_BLUE_RUPEE, + RC_GV_OCTOROK_GROTTO_BACK_BLUE_RUPEE, + RC_GV_OCTOROK_GROTTO_FRONT_RIGHT_BLUE_RUPEE, + RC_GV_OCTOROK_GROTTO_FRONT_LEFT_GREEN_RUPEE, + RC_GV_OCTOROK_GROTTO_FRONT_RIGHT_GREEN_RUPEE, + RC_GV_OCTOROK_GROTTO_BACK_LEFT_GREEN_RUPEE, + RC_GV_OCTOROK_GROTTO_BACK_RIGHT_GREEN_RUPEE, + RC_GV_OCTOROK_GROTTO_RED_RUPEE, + RC_DMT_RED_RUPEE, + RC_DMT_BLUE_RUPEE, + RC_DMT_COW_GROTTO_LEFT_HEART, + RC_DMT_COW_GROTTO_MIDDLE_LEFT_HEART, + RC_DMT_COW_GROTTO_MIDDLE_RIGHT_HEART, + RC_DMT_COW_GROTTO_RIGHT_HEART, + RC_DMT_COW_GROTTO_RUPEE_1, + RC_DMT_COW_GROTTO_RUPEE_2, + RC_DMT_COW_GROTTO_RUPEE_3, + RC_DMT_COW_GROTTO_RUPEE_4, + RC_DMT_COW_GROTTO_RUPEE_5, + RC_DMT_COW_GROTTO_RUPEE_6, + RC_DMT_COW_GROTTO_RED_RUPEE, + RC_DMC_NEAR_PLATFORM_RED_RUPEE, + RC_DMC_MIDDLE_PLATFORM_RED_RUPEE, + RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_1, + RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_2, + RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_3, + RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_4, + RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_5, + RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_6, + RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_1, + RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_2, + RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_3, + RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_4, + RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_5, + RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_6, + RC_DMC_DISTANT_PLATFORM_RED_RUPEE, + RC_ZR_BENEATH_WATERFALL_LEFT_RUPEE, + RC_ZR_BENEATH_WATERFALL_MIDDLE_LEFT_RUPEE, + RC_ZR_BENEATH_WATERFALL_MIDDLE_RIGHT_RUPEE, + RC_ZR_BENEATH_WATERFALL_RIGHT_RUPEE, + RC_ZF_BOTTOM_NORTH_INNER_RUPEE, + RC_ZF_BOTTOM_NORTHEAST_INNER_RUPEE, + RC_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE, + RC_ZF_BOTTOM_SOUTH_INNER_RUPEE, + RC_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE, + RC_ZF_BOTTOM_NORTHWEST_INNER_RUPEE, + RC_ZF_BOTTOM_NORTH_MIDDLE_RUPEE, + RC_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE, + RC_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE, + RC_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE, + RC_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE, + RC_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE, + RC_ZF_BOTTOM_NORTH_OUTER_RUPEE, + RC_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE, + RC_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE, + RC_ZF_BOTTOM_SOUTH_OUTER_RUPEE, + RC_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE, + RC_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE, }; std::vector Rando::StaticData::gossipStoneLocations = { From 0cac9ca4ec1d479a880b85ef2761be7f0748da71 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 8 Aug 2024 01:10:55 -0700 Subject: [PATCH 037/108] Add freestanding items for child dungeons. --- .../randomizer/3drando/item_pool.cpp | 32 ++++++++++++++----- .../location_access/locacc_deku_tree.cpp | 26 +++++++++++---- .../locacc_dodongos_cavern.cpp | 14 ++++++-- .../locacc_jabujabus_belly.cpp | 5 +++ soh/soh/Enhancements/randomizer/dungeon.cpp | 23 +++++++++++++ .../Enhancements/randomizer/location_list.cpp | 28 ++++++++++++++++ .../Enhancements/randomizer/randomizerTypes.h | 24 ++++++++++++++ .../Enhancements/randomizer/randomizer_inf.h | 19 +++++++++++ 8 files changed, 155 insertions(+), 16 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index a35d619fe7c..01827c0cd37 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -618,6 +618,29 @@ static void PlaceVanillaOverworldFish() { } } +static void PlaceFreestandingItems() { + auto ctx = Rando::Context::GetInstance(); + for (RandomizerCheck loc : ctx->GetLocations(Rando::StaticData::overworldLocations, Category::cFreestanding)) { + RandomizerGet vanillaItem = Rando::StaticData::GetLocation(loc)->GetVanillaItem(); + if (ctx->GetOption(RSK_SHUFFLE_FREESTANDING)) { + AddItemToMainPool(vanillaItem); + } else { + ctx->PlaceItemInLocation(loc, vanillaItem, false, true); + } + } + + for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { + for (RandomizerCheck loc : ctx->GetLocations(dungeon->GetDungeonLocations(), Category::cFreestanding)) { + RandomizerGet vanillaItem = Rando::StaticData::GetLocation(loc)->GetVanillaItem(); + if (ctx->GetOption(RSK_SHUFFLE_FREESTANDING)) { + AddItemToMainPool(vanillaItem); + } else { + ctx->PlaceItemInLocation(loc, vanillaItem, false, true); + } + } + } +} + static void SetScarceItemPool() { ReplaceMaxItem(RG_PROGRESSIVE_BOMBCHUS, 3); ReplaceMaxItem(RG_BOMBCHU_5, 1); @@ -1210,14 +1233,7 @@ void GenerateItemPool() { PlaceVanillaDekuScrubItems(); } - for (RandomizerCheck loc : ctx->GetLocations(ctx->allLocations, Category::cFreestanding)) { - RandomizerGet vanillaItem = Rando::StaticData::GetLocation(loc)->GetVanillaItem(); - if (ctx->GetOption(RSK_SHUFFLE_FREESTANDING)) { - AddItemToMainPool(vanillaItem); - } else { - ctx->PlaceItemInLocation(loc, vanillaItem, false, true); - } - } + PlaceFreestandingItems(); AddItemsToPool(ItemPool, alwaysItems); AddItemsToPool(ItemPool, dungeonRewards); diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_deku_tree.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_deku_tree.cpp index dd7c665f735..6833a0d099f 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_deku_tree.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_deku_tree.cpp @@ -25,7 +25,9 @@ void AreaTable_Init_DekuTree() { EventAccess(&logic->DekuBabaNuts, {[]{return logic->DekuBabaNuts || (logic->CanJumpslash || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_MEGATON_HAMMER) || logic->HasExplosives || logic->CanUse(RG_DINS_FIRE));}}), }, { //Locations - LOCATION(RC_DEKU_TREE_MAP_CHEST, true), + LOCATION(RC_DEKU_TREE_MAP_CHEST, true), + LOCATION(RC_DEKU_TREE_LOBBY_LOWER_HEART, true), + LOCATION(RC_DEKU_TREE_LOBBY_UPPER_HEART, logic->CanChildAttack || logic->CanAdultAttack), }, { //Exits Entrance(RR_DEKU_TREE_ENTRYWAY, {[]{return true;}}), @@ -144,7 +146,11 @@ void AreaTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_OUTSIDE_BOSS_ROOM, {[]{return Here(RR_DEKU_TREE_BASEMENT_UPPER, []{return logic->HasFireSourceWithTorch || (randoCtx->GetTrickOption(RT_DEKU_B1_BOW_WEBS) && logic->IsAdult && logic->CanUse(RG_FAIRY_BOW));});}}), }); - areaTable[RR_DEKU_TREE_OUTSIDE_BOSS_ROOM] = Area("Deku Tree Outside Boss Room", "Deku Tree", RA_DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DEKU_TREE_OUTSIDE_BOSS_ROOM] = Area("Deku Tree Outside Boss Room", "Deku Tree", RA_DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, { + LOCATION(RC_DEKU_TREE_BEFORE_BOSS_LEFT_HEART, logic->HasItem(RG_BRONZE_SCALE)), + LOCATION(RC_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART, logic->HasItem(RG_BRONZE_SCALE)), + LOCATION(RC_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART, logic->HasItem(RG_BRONZE_SCALE)), + }, { //Exits Entrance(RR_DEKU_TREE_BASEMENT_UPPER, {[]{return true;}}), Entrance(RR_DEKU_TREE_BOSS_ENTRYWAY, {[]{return (logic->Swim || Here(RR_DEKU_TREE_OUTSIDE_BOSS_ROOM, []{return logic->CanUse(RG_IRON_BOOTS);})) && Here(RR_DEKU_TREE_OUTSIDE_BOSS_ROOM, []{return logic->HasShield;});}}), @@ -166,6 +172,9 @@ void AreaTable_Init_DekuTree() { LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, logic->HasFireSourceWithTorch || (logic->IsAdult && logic->CanUse(RG_FAIRY_BOW))), LOCATION(RC_DEKU_TREE_MQ_BASEMENT_CHEST, logic->HasFireSourceWithTorch || (logic->IsAdult && logic->CanUse(RG_FAIRY_BOW))), LOCATION(RC_DEKU_TREE_MQ_GS_LOBBY, logic->CanAdultAttack || logic->CanChildAttack), + LOCATION(RC_DEKU_TREE_MQ_LOBBY_HEART, true), + LOCATION(RC_DEKU_TREE_MQ_DEKU_BABA_HEART, logic->HasFireSourceWithTorch || (logic->IsAdult && logic->CanUse(RG_FAIRY_BOW))), + LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART, true), }, { //Exits Entrance(RR_DEKU_TREE_ENTRYWAY, {[]{return true;}}), @@ -178,11 +187,13 @@ void AreaTable_Init_DekuTree() { areaTable[RR_DEKU_TREE_MQ_COMPASS_ROOM] = Area("Deku Tree MQ Compass Room", "Deku Tree", RA_DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_DEKU_TREE_MQ_COMPASS_CHEST, true), - LOCATION(RC_DEKU_TREE_MQ_GS_COMPASS_ROOM, logic->HookshotOrBoomerang && + LOCATION(RC_DEKU_TREE_MQ_COMPASS_CHEST, true), + LOCATION(RC_DEKU_TREE_MQ_GS_COMPASS_ROOM, logic->HookshotOrBoomerang && Here(RR_DEKU_TREE_MQ_COMPASS_ROOM, []{return logic->HasBombchus || (logic->Bombs && (logic->CanUse(RG_SONG_OF_TIME) || logic->IsAdult)) || (logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER) && (logic->CanUse(RG_SONG_OF_TIME) || randoCtx->GetTrickOption(RT_DEKU_MQ_COMPASS_GS)));})), + LOCATION(RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART, logic->HasBombchus || (logic->Bombs && (logic->CanUse(RG_SONG_OF_TIME) || logic->IsAdult)) || + (logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER) && (logic->CanUse(RG_SONG_OF_TIME) || randoCtx->GetTrickOption(RT_DEKU_MQ_COMPASS_GS)))), }, { //Exits Entrance(RR_DEKU_TREE_MQ_LOBBY, {[]{return true;}}), @@ -232,8 +243,11 @@ void AreaTable_Init_DekuTree() { }); areaTable[RR_DEKU_TREE_MQ_OUTSIDE_BOSS_ROOM] = - Area("Deku Tree MQ Outside Boss Room", "Deku Tree", RA_DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, {}, - { + Area("Deku Tree MQ Outside Boss Room", "Deku Tree", RA_DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, { + LOCATION(RC_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART, logic->HasItem(RG_BRONZE_SCALE)), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART, logic->HasItem(RG_BRONZE_SCALE)), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART, logic->HasItem(RG_BRONZE_SCALE)), + }, { // Exits Entrance(RR_DEKU_TREE_MQ_BASEMENT_LEDGE, {[]{ return true; }}), Entrance(RR_DEKU_TREE_BOSS_ENTRYWAY, {[]{return (logic->Swim || Here(RR_DEKU_TREE_MQ_BASEMENT_LEDGE, []{return logic->CanUse(RG_IRON_BOOTS);})) && Here(RR_DEKU_TREE_MQ_BASEMENT_LEDGE, [] { return logic->HasShield; }); } }), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_dodongos_cavern.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_dodongos_cavern.cpp index 7cb2dbf0aa7..7f244b9981c 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_dodongos_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_dodongos_cavern.cpp @@ -74,7 +74,10 @@ void AreaTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_LOWER_LIZALFOS, {[]{return true;}}), }); - areaTable[RR_DODONGOS_CAVERN_LOWER_LIZALFOS] = Area("Dodongos Cavern Lower Lizalfos", "Dodongos Cavern", RA_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DODONGOS_CAVERN_LOWER_LIZALFOS] = Area("Dodongos Cavern Lower Lizalfos", "Dodongos Cavern", RA_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { + //Locations + LOCATION(RC_DODONGOS_CAVERN_LOWER_LIZALFOS_HEART, true), + }, { //Exits Entrance(RR_DODONGOS_CAVERN_NEAR_LOWER_LIZALFOS, {[]{return Here(RR_DODONGOS_CAVERN_LOWER_LIZALFOS, []{return logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_MEGATON_HAMMER) || logic->HasExplosives;});}}), @@ -131,6 +134,7 @@ void AreaTable_Init_DodongosCavern() { areaTable[RR_DODONGOS_CAVERN_BOMB_ROOM_LOWER] = Area("Dodongos Cavern Bomb Room Lower", "Dodongos Cavern", RA_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, true), + LOCATION(RC_DODONGOS_CAVERN_BLADE_ROOM_HEART, true), }, { //Exits Entrance(RR_DODONGOS_CAVERN_2F_SIDE_ROOM, {[]{return Here(RR_DODONGOS_CAVERN_BOMB_ROOM_LOWER, []{return logic->CanBlastOrSmash || (randoCtx->GetTrickOption(RT_DC_SCRUB_ROOM) && logic->GoronBracelet);});}}), @@ -153,7 +157,11 @@ void AreaTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_UPPER_LIZALFOS, {[]{return logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW) || randoCtx->GetTrickOption(RT_DC_SLINGSHOT_SKIP);}}), }); - areaTable[RR_DODONGOS_CAVERN_UPPER_LIZALFOS] = Area("Dodongos Cavern Upper Lizalfos", "Dodongos Cavern", RA_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DODONGOS_CAVERN_UPPER_LIZALFOS] = Area("Dodongos Cavern Upper Lizalfos", "Dodongos Cavern", RA_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { + //Locations + LOCATION(RC_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART, true), + LOCATION(RC_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART, true), + }, { //Exits Entrance(RR_DODONGOS_CAVERN_LOWER_LIZALFOS, {[]{return true;}}), Entrance(RR_DODONGOS_CAVERN_FIRST_SLINGSHOT_ROOM, {[]{return Here(RR_DODONGOS_CAVERN_LOWER_LIZALFOS, []{return logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || @@ -226,6 +234,7 @@ void AreaTable_Init_DodongosCavern() { LOCATION(RC_DODONGOS_CAVERN_MQ_COMPASS_CHEST, logic->CanAdultAttack || logic->CanChildAttack || logic->Nuts), LOCATION(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, (logic->IsChild && logic->CanUse(RG_STICKS)) || logic->HasFireSource), LOCATION(RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST, logic->CanBlastOrSmash || (logic->IsChild && logic->CanUse(RG_STICKS)) || logic->CanUse(RG_DINS_FIRE) || (logic->IsAdult && (randoCtx->GetTrickOption(RT_DC_JUMP) || logic->HoverBoots || logic->Hookshot))), + LOCATION(RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_HEART, logic->CanBlastOrSmash || (logic->IsChild && logic->CanUse(RG_STICKS)) || logic->CanUse(RG_DINS_FIRE) || (logic->IsAdult && (randoCtx->GetTrickOption(RT_DC_JUMP) || logic->HoverBoots || logic->Hookshot))), LOCATION(RC_DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, logic->CanUse(RG_SONG_OF_TIME) && (logic->CanChildAttack || logic->CanAdultAttack)), LOCATION(RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, (logic->IsChild && logic->CanUse(RG_STICKS)) || logic->HasFireSource), LOCATION(RC_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, logic->CanBlastOrSmash), @@ -245,6 +254,7 @@ void AreaTable_Init_DodongosCavern() { areaTable[RR_DODONGOS_CAVERN_MQ_LOWER_RIGHT_SIDE] = Area("Dodongos Cavern MQ Lower Right Side", "Dodongos Cavern", RA_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, logic->CanStunDeku), + LOCATION(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_HEART, true), }, { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_BOMB_BAG_AREA, {[]{return (Here(RR_DODONGOS_CAVERN_MQ_LOWER_RIGHT_SIDE, []{return logic->IsAdult && logic->CanUse(RG_FAIRY_BOW);}) || logic->GoronBracelet || diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_jabujabus_belly.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_jabujabus_belly.cpp index 2e4b881644b..120abfdf3c5 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_jabujabus_belly.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_jabujabus_belly.cpp @@ -183,6 +183,11 @@ void AreaTable_Init_JabuJabusBelly() { LOCATION(RC_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, true), LOCATION(RC_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_MEGATON_HAMMER) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_STICKS) || logic->Bombs), LOCATION(RC_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, logic->CanUse(RG_SONG_OF_TIME) || (randoCtx->GetTrickOption(RT_JABU_MQ_SOT_GS) && logic->IsChild && logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_1, true), + LOCATION(RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_2, true), + LOCATION(RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_1, logic->HasItem(RG_GOLDEN_SCALE)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_2, logic->HasItem(RG_SILVER_SCALE)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_3, logic->HasItem(RG_BRONZE_SCALE)), //Trick: logic->CanUse(RG_SONG_OF_TIME) || (LogicJabuMQSoTGS && logic->IsChild && logic->CanUse(RG_BOOMERANG)) }, { //Exits diff --git a/soh/soh/Enhancements/randomizer/dungeon.cpp b/soh/soh/Enhancements/randomizer/dungeon.cpp index 0f799b03646..7d756ce105e 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/dungeon.cpp @@ -175,6 +175,11 @@ Dungeons::Dungeons() { RC_DEKU_TREE_GS_BASEMENT_GATE, RC_DEKU_TREE_GS_BASEMENT_VINES, RC_DEKU_TREE_GS_COMPASS_ROOM, + RC_DEKU_TREE_LOBBY_LOWER_HEART, + RC_DEKU_TREE_LOBBY_UPPER_HEART, + RC_DEKU_TREE_BEFORE_BOSS_LEFT_HEART, + RC_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART, + RC_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART, }, { // MQ Locations @@ -190,6 +195,13 @@ Dungeons::Dungeons() { RC_DEKU_TREE_MQ_GS_COMPASS_ROOM, RC_DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, RC_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, + RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART, + RC_DEKU_TREE_MQ_DEKU_BABA_HEART, + RC_DEKU_TREE_MQ_LOBBY_HEART, + RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART, + RC_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART, + RC_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART, + RC_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART, }, {}, { @@ -215,6 +227,10 @@ Dungeons::Dungeons() { RC_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, RC_DODONGOS_CAVERN_GS_BACK_ROOM, RC_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, + RC_DODONGOS_CAVERN_LOWER_LIZALFOS_HEART, + RC_DODONGOS_CAVERN_BLADE_ROOM_HEART, + RC_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART, + RC_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART, }, { // MQ Locations @@ -233,6 +249,8 @@ Dungeons::Dungeons() { RC_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, RC_DODONGOS_CAVERN_MQ_GS_BACK_AREA, + RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_HEART, + RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_HEART, }, {}, { @@ -272,6 +290,11 @@ Dungeons::Dungeons() { RC_JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, RC_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, RC_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, + RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_1, + RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_2, + RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_3, + RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_1, + RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_2, }, {}, { diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 693273ba96b..dd7c04a545f 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -1733,6 +1733,34 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x3000, 0x30, "Bottom Southwest Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); locationTable[RC_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x3100, 0x31, "Bottom Northwest Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_DEKU_TREE_LOBBY_LOWER_HEART] = Location::Collectable(RC_DEKU_TREE_LOBBY_LOWER_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x2C03, 0x2C, "Lobby Lower Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_LOWER_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[RC_DEKU_TREE_LOBBY_UPPER_HEART] = Location::Collectable(RC_DEKU_TREE_LOBBY_UPPER_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x2D03, 0x2D, "Lobby Upper Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_UPPER_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[RC_DEKU_TREE_BEFORE_BOSS_LEFT_HEART] = Location::Collectable(RC_DEKU_TREE_BEFORE_BOSS_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x2E03, 0x2E, "Final Room Left Front Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BEFORE_BOSS_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[RC_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART] = Location::Collectable(RC_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x3003, 0x30, "Final Room Left Back Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[RC_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART] = Location::Collectable(RC_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x3103, 0x31, "Final Room Right Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + + locationTable[RC_DODONGOS_CAVERN_LOWER_LIZALFOS_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_LOWER_LIZALFOS_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_DODONGOS_CAVERN, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, 0x1803, 0x18, "Lower Lizalfos Room Lavafall Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_DODONGOS_CAVERN_BLADE_ROOM_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_BLADE_ROOM_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_DODONGOS_CAVERN, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, 0x3003, 0x30, "Blade Room Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BLADE_ROOM_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_DODONGOS_CAVERN, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, 0x2503, 0x25, "Upper Lizalfos Room Left Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_DODONGOS_CAVERN, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, 0x2403, 0x24, "Upper Lizalfos Room Right Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + + locationTable[RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x2203, 0x22, "MQ Compass Room Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_COMPASS_ROOM_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[RC_DEKU_TREE_MQ_DEKU_BABA_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_DEKU_BABA_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x2303, 0x23, "MQ Deku Baba Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_DEKU_BABA_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[RC_DEKU_TREE_MQ_LOBBY_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_LOBBY_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x2403, 0x24, "MQ Lobby Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x2603, 0x26, "MQ Slingshot Room Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[RC_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x2E03, 0x2E, "MQ Final Room Left Front Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[RC_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x3003, 0x30, "MQ Final Room Left Back Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[RC_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x3103, 0x31, "MQ Final Room Right Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + + locationTable[RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_DODONGOS_CAVERN, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, 0x1803, 0x18, "MQ Lizalfos Room Lavafall Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_DODONGOS_CAVERN, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, 0x3003, 0x30, "MQ Torch Room Invisible Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + + locationTable[RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_1] = Location::Collectable(RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_1, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_ITEM00, SCENE_JABU_JABU, 0x0100, 0x01, "MQ Lift Room Underwater Rupee 1", RHT_JABU_JABU_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_2] = Location::Collectable(RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_2, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_ITEM00, SCENE_JABU_JABU, 0x0200, 0x02, "MQ Lift Room Underwater Rupee 2", RHT_JABU_JABU_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_3] = Location::Collectable(RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_3, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_ITEM00, SCENE_JABU_JABU, 0x0300, 0x03, "MQ Lift Room Underwater Rupee 3", RHT_JABU_JABU_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_1] = Location::Collectable(RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_1, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_ITEM00, SCENE_JABU_JABU, 0x2703, 0x27, "MQ Lift Room Heart 1", RHT_JABU_JABU_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_1), SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_2] = Location::Collectable(RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_2, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_ITEM00, SCENE_JABU_JABU, 0x2803, 0x28, "MQ Lift Room Heart 2", RHT_JABU_JABU_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_2), SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + // Gossip Stones locationTable[RC_DMC_GOSSIP_STONE] = Location::HintStone(RC_DMC_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 14341, 0x05, "Gossip Stone", {}); locationTable[RC_DMT_GOSSIP_STONE] = Location::HintStone(RC_DMT_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 14340, 0x04, "Gossip Stone", {}); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 73c090381ca..32152ed7e27 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1760,6 +1760,29 @@ typedef enum { RC_ZF_BOTTOM_SOUTH_OUTER_RUPEE, RC_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE, RC_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE, + RC_DEKU_TREE_LOBBY_LOWER_HEART, + RC_DEKU_TREE_LOBBY_UPPER_HEART, + RC_DEKU_TREE_BEFORE_BOSS_LEFT_HEART, + RC_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART, + RC_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART, + RC_DODONGOS_CAVERN_LOWER_LIZALFOS_HEART, + RC_DODONGOS_CAVERN_BLADE_ROOM_HEART, + RC_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART, + RC_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART, + RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART, + RC_DEKU_TREE_MQ_DEKU_BABA_HEART, + RC_DEKU_TREE_MQ_LOBBY_HEART, + RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART, + RC_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART, + RC_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART, + RC_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART, + RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_HEART, + RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_HEART, + RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_1, + RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_2, + RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_3, + RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_1, + RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_2, RC_MAX } RandomizerCheck; @@ -3765,6 +3788,7 @@ typedef enum { RHT_DEKU_TREE_HEART, RHT_DODONGOS_CAVERN_HEART, RHT_JABU_JABU_RUPEE, + RHT_JABU_JABU_HEART, RHT_FOREST_TEMPLE_HEART, RHT_FIRE_TEMPLE_HEART, RHT_SHADOW_TEMPLE_HEART, diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index 20c9ade5381..8fbd66850ba 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -401,6 +401,25 @@ typedef enum { RAND_INF_ZF_BOTTOM_SOUTH_OUTER_RUPEE, RAND_INF_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE, RAND_INF_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE, + + RAND_INF_DEKU_TREE_LOBBY_LOWER_HEART, + RAND_INF_DEKU_TREE_LOBBY_UPPER_HEART, + RAND_INF_DEKU_TREE_BEFORE_BOSS_LEFT_HEART, + RAND_INF_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART, + RAND_INF_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART, + RAND_INF_DODONGOS_CAVERN_BLADE_ROOM_HEART, + RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART, + RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART, + RAND_INF_DEKU_TREE_MQ_COMPASS_ROOM_HEART, + RAND_INF_DEKU_TREE_MQ_DEKU_BABA_HEART, + RAND_INF_DEKU_TREE_MQ_LOBBY_HEART, + RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART, + RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART, + RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART, + RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART, + RAND_INF_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_HEART, + RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_1, + RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_2, // If you add anything to this list, you need to update the size of randomizerInf in z64save.h to be ceil(RAND_INF_MAX / 16) RAND_INF_MAX, From 4b7b341d18f41243025729086131299e426bdd2c Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Fri, 9 Aug 2024 11:53:22 -0400 Subject: [PATCH 038/108] Fix some post-merge issues --- soh/soh/Enhancements/randomizer/item_list.cpp | 58 +++++++++---------- .../Enhancements/randomizer/silver_rupee.cpp | 2 +- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/item_list.cpp b/soh/soh/Enhancements/randomizer/item_list.cpp index bdbd27aa470..bcbd3c762c0 100644 --- a/soh/soh/Enhancements/randomizer/item_list.cpp +++ b/soh/soh/Enhancements/randomizer/item_list.cpp @@ -308,63 +308,63 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_TRIFORCE] = Item(RG_TRIFORCE, Text{ "Triforce", "Triforce", "Triforce" }, ITEMTYPE_EVENT, RG_TRIFORCE, false, LOGIC_NONE, RHT_NONE); itemTable[RG_HINT] = Item(RG_HINT, Text{ "Hint", "Indice", "Hinweis" }, ITEMTYPE_EVENT, RG_HINT, false, LOGIC_NONE, RHT_NONE); - itemTable[RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE] = Item(RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, Text{ "Ice Cavern Spinning Blades Room Silver Rupee", "Ice Cavern Spinning Blades Room Silver Rupee", "Ice Cavern Spinning Blades Room Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, 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] = Item(RG_ICE_CAVERN_SPINNING_BLADES_SILVER_RUPEE, Text{ "Ice Cavern Spinning Blades Room Silver Rupee", "Ice Cavern Spinning Blades Room Silver Rupee", "Ice Cavern Spinning Blades Room 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 Room Silver Rupee", "Ice Cavern Block Sliding Room Silver Rupee", "Ice Cavern Block Sliding Room Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, 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] = Item(RG_ICE_CAVERN_SLIDING_SILVER_RUPEE, Text{ "Ice Cavern Block Sliding Room Silver Rupee", "Ice Cavern Block Sliding Room Silver Rupee", "Ice Cavern Block Sliding Room 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->noVariable, 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] = 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 Boudler Maze Silver Rupee", "GTG Boulder Maze Silver Rupee", "GTG Boulder Maze Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_GERUDO_TRAINING_GROUNDS_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] = Item(RG_GERUDO_TRAINING_GROUNDS_BOULDER_SILVER_RUPEE, Text{ "GTG Boudler Maze Silver Rupee", "GTG Boulder Maze Silver Rupee", "GTG Boulder Maze Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, LOGIC_NONE, RHT_GERUDO_TRAINING_GROUNDS_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->noVariable, RHT_GERUDO_TRAINING_GROUNDS_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] = 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_GROUNDS_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 Toilet Room Silver Rupee", "GTG Whirlpool Room Silver Rupee", "GTG Whirlpool Room Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_GERUDO_TRAINING_GROUNDS_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] = Item(RG_GERUDO_TRAINING_GROUNDS_TOILET_SILVER_RUPEE, Text{ "GTG Toilet Room Silver Rupee", "GTG Whirlpool Room Silver Rupee", "GTG Whirlpool Room Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, LOGIC_NONE, RHT_GERUDO_TRAINING_GROUNDS_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 Room Silver Rupee", "Spirit Temple Child Gate Room Silver Rupee", "Spirit Temple Child Gate Room Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, 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] = Item(RG_SPIRIT_GATE_SILVER_RUPEE, Text{ "Spirit Temple Child Gate Room Silver Rupee", "Spirit Temple Child Gate Room Silver Rupee", "Spirit Temple Child Gate Room 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 Child Block Pushing Room Silver Rupee", "Spirit Temple Child Block Pushing Room Silver Rupee", "Spirit Temple Child Block Pushing Room Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, 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] = Item(RG_SPIRIT_BEAMOS_SILVER_RUPEE, Text{ "Spirit Temple Child Block Pushing Room Silver Rupee", "Spirit Temple Child Block Pushing Room Silver Rupee", "Spirit Temple Child Block Pushing 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->noVariable, 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] = 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->noVariable, 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] = 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 Outside Falling Spikes Room Silver Rupee", "Shadow Temple Outside Falling Spikes Room Silver Rupee", "Shadow Temple Outside Falling Spikes Room Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, 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] = Item(RG_SHADOW_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, Text{ "Shadow Temple Outside Falling Spikes Room Silver Rupee", "Shadow Temple Outside Falling Spikes Room Silver Rupee", "Shadow Temple Outside Falling Spikes Room 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->noVariable, 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] = 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{ "Forest Trial Silver Rupee", "Forest Trial Silver Rupee", "Forest Trial Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, 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] = Item(RG_FOREST_TRIAL_SILVER_RUPEE, Text{ "Forest Trial Silver Rupee", "Forest Trial Silver Rupee", "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{ "Fire Trial Silver Rupee", "Fire Trial Silver Rupee", "Fire Trial Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, 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] = Item(RG_FIRE_TRIAL_SILVER_RUPEE, Text{ "Fire Trial Silver Rupee", "Fire Trial Silver Rupee", "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{ "Spirit Trial Silver Rupee", "Spirit Trial Silver Rupee", "Spirit Trial Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, 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] = Item(RG_SPIRIT_TRIAL_SILVER_RUPEE, Text{ "Spirit Trial Silver Rupee", "Spirit Trial Silver Rupee", "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{ "Light Trial Silver Rupee", "Light Trial Silver Rupee", "Light Trial Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, 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] = Item(RG_LIGHT_TRIAL_SILVER_RUPEE, Text{ "Light Trial Silver Rupee", "Light Trial Silver Rupee", "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->noVariable, 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] = 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->noVariable, 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] = 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->noVariable, 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] = 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 Outside Falling Spikes Silver Rupee", "Shadow Temple MQ Outside Falling Spikes Silver Rupee", "Shadow Temple MQ Outside Falling Spikes Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, 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] = Item(RG_SHADOW_MQ_OUTSIDE_SPIKE_RAIN_SILVER_RUPEE, Text{ "Shadow Temple MQ Outside Falling Spikes Silver Rupee", "Shadow Temple MQ Outside Falling Spikes Silver Rupee", "Shadow Temple MQ Outside 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->noVariable, 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] = 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->noVariable, 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] = 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{ "Gerudo Training Grounds MQ Boulder Maze Silver Rupee", "Gerudo Training Grounds MQ Boulder Maze Silver Rupee", "Gerudo Training Grounds MQ Boulder Maze Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_GERUDO_TRAINING_GROUNDS_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] = Item(RG_GERUDO_TRAINING_GROUNDS_MQ_BOULDER_SILVER_RUPEE, Text{ "Gerudo Training Grounds MQ Boulder Maze Silver Rupee", "Gerudo Training Grounds MQ Boulder Maze Silver Rupee", "Gerudo Training Grounds MQ Boulder Maze Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, LOGIC_NONE, RHT_GERUDO_TRAINING_GROUNDS_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{ "Gerudo Training Grounds MQ Lava Room Silver Rupee", "Gerudo Training Grounds MQ Lava Room Silver Rupee", "Gerudo Training Grounds MQ Lava Room Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_GERUDO_TRAINING_GROUNDS_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] = Item(RG_GERUDO_TRAINING_GROUNDS_MQ_LAVA_SILVER_RUPEE, Text{ "Gerudo Training Grounds MQ Lava Room Silver Rupee", "Gerudo Training Grounds MQ Lava Room Silver Rupee", "Gerudo Training Grounds MQ Lava Room Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, LOGIC_NONE, RHT_GERUDO_TRAINING_GROUNDS_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{ "Gerudo Training Grounds MQ Whirlpool Room Silver Rupee", "Gerudo Training Grounds MQ Whirlpool Room Silver Rupee", "Gerudo Training Grounds MQ Whirlpool Room Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_GERUDO_TRAINING_GROUNDS_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] = Item(RG_GERUDO_TRAINING_GROUNDS_MQ_TOILET_SILVER_RUPEE, Text{ "Gerudo Training Grounds MQ Whirlpool Room Silver Rupee", "Gerudo Training Grounds MQ Whirlpool Room Silver Rupee", "Gerudo Training Grounds MQ Whirlpool Room Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, LOGIC_NONE, RHT_GERUDO_TRAINING_GROUNDS_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{ "Fire Trial MQ Silver Rupee", "Fire Trial MQ Silver Rupee", "Fire Trial MQ Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, 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] = Item(RG_FIRE_TRIAL_MQ_SILVER_RUPEE, Text{ "Fire Trial MQ Silver Rupee", "Fire Trial MQ Silver Rupee", "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{ "Water Trial MQ Silver Rupee", "Water Trial MQ Silver Rupee", "Water Trial MQ Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, 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] = Item(RG_WATER_TRIAL_MQ_SILVER_RUPEE, Text{ "Water Trial MQ Silver Rupee", "Water Trial MQ Silver Rupee", "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{ "Shadow Trial MQ Silver Rupee", "Shadow Trial MQ Silver Rupee", "Shadow Trial MQ Silver Rupee"}, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, 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] = Item(RG_SHADOW_TRIAL_MQ_SILVER_RUPEE, Text{ "Shadow Trial MQ Silver Rupee", "Shadow Trial MQ Silver Rupee", "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_MAGICAL_SILVER_RUPEE] = Item(RG_MAGICAL_SILVER_RUPEE, Text{ "Magical Silver Rupee", "Magical Silver Rupee", "Magical Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, &logic->noVariable, RHT_MAGICAL_SILVER_RUPEE, RG_MAGICAL_SILVER_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_SILVER_RUPEE, MOD_RANDOMIZER); + itemTable[RG_MAGICAL_SILVER_RUPEE] = Item(RG_MAGICAL_SILVER_RUPEE, Text{ "Magical Silver Rupee", "Magical Silver Rupee", "Magical Silver Rupee" }, ITEMTYPE_SILVERRUPEE, 0, true, LOGIC_NONE, RHT_MAGICAL_SILVER_RUPEE, RG_MAGICAL_SILVER_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_SILVER_RUPEE, MOD_RANDOMIZER); itemTable[RG_MAGICAL_SILVER_RUPEE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); // Individual stages of progressive items (only here for GetItemEntry purposes, not for use in seed gen) diff --git a/soh/soh/Enhancements/randomizer/silver_rupee.cpp b/soh/soh/Enhancements/randomizer/silver_rupee.cpp index e8d472b00d8..6257058323f 100644 --- a/soh/soh/Enhancements/randomizer/silver_rupee.cpp +++ b/soh/soh/Enhancements/randomizer/silver_rupee.cpp @@ -256,7 +256,7 @@ namespace Rando { }; } - CustomMessage SilverRupees::GetSilverRupeeMessage(u16 rgid) { + CustomMessage SilverRupees::GetSilverRupeeMessage(uint16_t rgid) { CustomMessage messageEntry; if (rgid >= RG_SILVER_RUPEE_FIRST && rgid <= RG_SILVER_RUPEE_LAST) { messageEntry = From 6c09f188672bc4839c9ed9658e75a4a276b03827 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Fri, 9 Aug 2024 15:36:11 -0400 Subject: [PATCH 039/108] Improve formatting of Silver Rupee GetItem messages. --- soh/soh/Enhancements/randomizer/randomizer.cpp | 6 +++--- soh/soh/Enhancements/randomizer/silver_rupee.cpp | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 346b8c9966a..de920b3cd55 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -2641,9 +2641,9 @@ void CreateGetItemMessages(const std::array* messageEntries) //TODO: AI Translated Text, get translation from native speaker. customMessageManager->CreateMessage( Randomizer::getItemMessageTableID, RG_SILVER_RUPEE_FIRST, - CustomMessage("You got a %cSilver Rupee%w for the&%g{{location}}%w!&{{count_text}}!", - "Du hast eine %cSilberne Rupie%w für die&%g{{location}}%w!{{count_text}}!", - "Vous avez reçu une %cRoupie d'Argent%w pour le&%g{{location}}%w!{{count_text}}!", + CustomMessage("You got a %cSilver Rupee%w for the %g{{location}}%w! {{count_text}}!", + "Du hast eine %cSilberne Rupie%w für die %g{{location}}%w!{{count_text}}!", + "Vous avez reçu une %cRoupie d'Argent%w pour le %g{{location}}%w!{{count_text}}!", TEXTBOX_TYPE_BLUE, TEXTBOX_POS_BOTTOM)); // Special Case for Silver Rupee Pouches // customMessageManager->CreateMessage(Randomizer::getItemMessageTableID, RG_SILVER_RUPEE_POUCH_FIRST, diff --git a/soh/soh/Enhancements/randomizer/silver_rupee.cpp b/soh/soh/Enhancements/randomizer/silver_rupee.cpp index 6257058323f..2273a5a9a5b 100644 --- a/soh/soh/Enhancements/randomizer/silver_rupee.cpp +++ b/soh/soh/Enhancements/randomizer/silver_rupee.cpp @@ -279,6 +279,7 @@ namespace Rando { /*(rgid >= RG_SILVER_RUPEE_POUCH_FIRST) ? (rgid - RG_SILVER_RUPEE_POUCH_FIRST) + RG_SILVER_RUPEE_FIRST :*/ rgid; Text locationNames = mSilverRupeeRoomNames[(RandomizerGet)roomNameKey]; messageEntry.Replace("{{location}}", CustomMessage(locationNames.english.c_str(), locationNames.german.c_str(), locationNames.french.c_str())); + messageEntry.AutoFormat(); return messageEntry; } From 169580e570f73dbc96955fc25a6eef705262a80b Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Mon, 12 Aug 2024 23:54:18 -0700 Subject: [PATCH 040/108] Add checks for Ice Cavern and Bottom of the Well --- .../locacc_bottom_of_the_well.cpp | 14 ++++++++++ .../location_access/locacc_ice_cavern.cpp | 7 +++++ soh/soh/Enhancements/randomizer/dungeon.cpp | 21 +++++++++++++++ .../Enhancements/randomizer/location_list.cpp | 26 ++++++++++++++++++- .../Enhancements/randomizer/randomizerTypes.h | 24 +++++++++++++++++ .../Enhancements/randomizer/randomizer_inf.h | 16 ++++++++++++ 6 files changed, 107 insertions(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_bottom_of_the_well.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_bottom_of_the_well.cpp index 4f5ab4086b6..0b9509d9ca6 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_bottom_of_the_well.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_bottom_of_the_well.cpp @@ -42,6 +42,13 @@ void AreaTable_Init_BottomOfTheWell() { LOCATION(RC_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, logic->Boomerang && (randoCtx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->SmallKeys(RR_BOTTOM_OF_THE_WELL, 3)), LOCATION(RC_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, logic->Boomerang && (randoCtx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->SmallKeys(RR_BOTTOM_OF_THE_WELL, 3)), LOCATION(RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, logic->SmallKeys(RR_BOTTOM_OF_THE_WELL, 3) && (randoCtx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->Boomerang), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE, randoCtx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH)), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE, randoCtx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH)), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE, randoCtx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH)), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_RIGHT_RUPEE, randoCtx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH)), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_RIGHT_RUPEE, randoCtx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH)), + LOCATION(RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_FRONT_LEFT_HEART, (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_ZELDAS_LULLABY)) && logic->Sticks || logic->CanUse(RG_DINS_FIRE)), + LOCATION(RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART, (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_ZELDAS_LULLABY)) && logic->Sticks || logic->CanUse(RG_DINS_FIRE)), }, { //Exits Entrance(RR_BOTTOM_OF_THE_WELL_ENTRYWAY, {[]{return true;}}), @@ -62,6 +69,13 @@ void AreaTable_Init_BottomOfTheWell() { //Trick: logic->HasExplosives || (LogicBotWMQDeadHandKey && logic->Boomerang) LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, logic->CanChildAttack), LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, logic->CanChildAttack && logic->SmallKeys(RR_BOTTOM_OF_THE_WELL, 2)), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, logic->HasExplosives), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, logic->HasExplosives), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART, true), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART, true), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART, true), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, logic->SmallKeys(RR_BOTTOM_OF_THE_WELL, 2)), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_MIDDLE_LEFT_HEART, logic->SmallKeys(RR_BOTTOM_OF_THE_WELL, 2)), }, { //Exits Entrance(RR_BOTTOM_OF_THE_WELL_ENTRYWAY, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ice_cavern.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ice_cavern.cpp index 7f5873ba17a..26e216c7163 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ice_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ice_cavern.cpp @@ -38,6 +38,13 @@ void AreaTable_Init_IceCavern() { LOCATION(RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, logic->HookshotOrBoomerang), LOCATION(RC_ICE_CAVERN_GS_HEART_PIECE_ROOM, logic->BlueFire && logic->HookshotOrBoomerang), LOCATION(RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, logic->BlueFire && (logic->HookshotOrBoomerang || (randoCtx->GetTrickOption(RT_ICE_BLOCK_GS) && logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS)))), + LOCATION(RC_ICE_CAVERN_LOBBY_RUPEE, logic->BlueFire), + LOCATION(RC_ICE_CAVERN_MAP_ROOM_LEFT_HEART, logic->IsAdult), + LOCATION(RC_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART, logic->IsAdult), + LOCATION(RC_ICE_CAVERN_MAP_ROOM_RIGHT_HEART, logic->IsAdult), + LOCATION(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1, logic->BlueFire && logic->CanUse(RG_SONG_OF_TIME)), + LOCATION(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2, logic->BlueFire && logic->CanUse(RG_SONG_OF_TIME)), + LOCATION(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3, logic->BlueFire && logic->CanUse(RG_SONG_OF_TIME)), }, {}); } diff --git a/soh/soh/Enhancements/randomizer/dungeon.cpp b/soh/soh/Enhancements/randomizer/dungeon.cpp index 7d756ce105e..f11a0e55689 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/dungeon.cpp @@ -594,6 +594,13 @@ Dungeons::Dungeons() { RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, RC_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, RC_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, + RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE, + RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE, + RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE, + RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_RIGHT_RUPEE, + RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_RIGHT_RUPEE, + RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_FRONT_LEFT_HEART, + RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART, }, { // MQ Locations @@ -605,6 +612,13 @@ Dungeons::Dungeons() { RC_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, RC_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, RC_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM, + RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, + RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, + RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, + RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_MIDDLE_LEFT_HEART, + RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART, + RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART, + RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART, }, {}, {}); dungeonList[ICE_CAVERN] = DungeonInfo("Ice Cavern", RHT_ICE_CAVERN, RG_ICE_CAVERN_MAP, RG_ICE_CAVERN_COMPASS, @@ -618,6 +632,13 @@ Dungeons::Dungeons() { RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, RC_ICE_CAVERN_GS_HEART_PIECE_ROOM, + RC_ICE_CAVERN_LOBBY_RUPEE, + RC_ICE_CAVERN_MAP_ROOM_LEFT_HEART, + RC_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART, + RC_ICE_CAVERN_MAP_ROOM_RIGHT_HEART, + RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1, + RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2, + RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3, }, { // MQ Locations diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index dd7c04a545f..62cdb42c15e 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -1741,9 +1741,25 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_DODONGOS_CAVERN_LOWER_LIZALFOS_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_LOWER_LIZALFOS_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_DODONGOS_CAVERN, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, 0x1803, 0x18, "Lower Lizalfos Room Lavafall Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); locationTable[RC_DODONGOS_CAVERN_BLADE_ROOM_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_BLADE_ROOM_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_DODONGOS_CAVERN, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, 0x3003, 0x30, "Blade Room Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BLADE_ROOM_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[RC_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_DODONGOS_CAVERN, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, 0x2503, 0x25, "Upper Lizalfos Room Left Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_DODONGOS_CAVERN, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, 0x2503, 0x25, "Upper Lizalfos Room Left Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); locationTable[RC_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_DODONGOS_CAVERN, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, 0x2403, 0x24, "Upper Lizalfos Room Right Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x0501, 0x05, "Basement Platform Left Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x0601, 0x06, "Basement Platform Back Left Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x0201, 0x02, "Basement Platform Middle Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_RIGHT_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_RIGHT_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x0301, 0x03, "Basement Platform Back Right Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_RIGHT_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_RIGHT_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x0401, 0x04, "Basement Platform Right Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_FRONT_LEFT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_FRONT_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x1F03, 0x1F, "Coffin Room Front Left Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x2003, 0x20, "Coffin Room Middle Right Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + + locationTable[RC_ICE_CAVERN_LOBBY_RUPEE] = Location::Collectable(RC_ICE_CAVERN_LOBBY_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_ICE_CAVERN, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, 0x2101, 0x21, "Lobby Rupee", RHT_ICE_CAVERN_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_LOBBY_RUPEE), SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[RC_ICE_CAVERN_MAP_ROOM_LEFT_HEART] = Location::Collectable(RC_ICE_CAVERN_MAP_ROOM_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_ICE_CAVERN, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, 0x2203, 0x22, "Map Room Left Heart", RHT_ICE_CAVERN_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MAP_ROOM_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[RC_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART] = Location::Collectable(RC_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_ICE_CAVERN, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, 0x2303, 0x23, "Map Room Middle Heart", RHT_ICE_CAVERN_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[RC_ICE_CAVERN_MAP_ROOM_RIGHT_HEART] = Location::Collectable(RC_ICE_CAVERN_MAP_ROOM_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_ICE_CAVERN, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, 0x2403, 0x21, "Map Room Right Heart", RHT_ICE_CAVERN_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MAP_ROOM_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1] = Location::Collectable(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_ICE_CAVERN, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, 0x2E02, 0x2E, "Sliding Block Room Rupee 1", RHT_ICE_CAVERN_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1), SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2] = Location::Collectable(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_ICE_CAVERN, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, 0x2F02, 0x2F, "Sliding Block Room Rupee 2", RHT_ICE_CAVERN_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2), SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3] = Location::Collectable(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_ICE_CAVERN, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, 0x3002, 0x30, "Sliding Block Room Rupee 3", RHT_ICE_CAVERN_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3), SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x2203, 0x22, "MQ Compass Room Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_COMPASS_ROOM_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); locationTable[RC_DEKU_TREE_MQ_DEKU_BABA_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_DEKU_BABA_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x2303, 0x23, "MQ Deku Baba Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_DEKU_BABA_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); locationTable[RC_DEKU_TREE_MQ_LOBBY_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_LOBBY_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x2403, 0x24, "MQ Lobby Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); @@ -1761,6 +1777,14 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_1] = Location::Collectable(RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_1, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_ITEM00, SCENE_JABU_JABU, 0x2703, 0x27, "MQ Lift Room Heart 1", RHT_JABU_JABU_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_1), SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); locationTable[RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_2] = Location::Collectable(RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_2, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_ITEM00, SCENE_JABU_JABU, 0x2803, 0x28, "MQ Lift Room Heart 2", RHT_JABU_JABU_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_2), SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x2003, 0x22, "MQ Coffin Room Front Right Invisible Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x2103, 0x21, "MQ Bomb Alcove Left Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x2203, 0x22, "MQ Bomb Alcove Right Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_MIDDLE_LEFT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_MIDDLE_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x2303, 0x23, "MQ Coffin Room Middle Left Invisible Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_MIDDLE_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x3C03, 0x3C, "MQ Basement Hallway Front Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x3D03, 0x3D, "MQ Basement Hallway Left Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x3E03, 0x3E, "MQ Basement Hallway Right Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + // Gossip Stones locationTable[RC_DMC_GOSSIP_STONE] = Location::HintStone(RC_DMC_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 14341, 0x05, "Gossip Stone", {}); locationTable[RC_DMT_GOSSIP_STONE] = Location::HintStone(RC_DMT_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 14340, 0x04, "Gossip Stone", {}); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 32152ed7e27..2fa52f434b8 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1769,6 +1769,20 @@ typedef enum { RC_DODONGOS_CAVERN_BLADE_ROOM_HEART, RC_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART, RC_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART, + RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE, + RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE, + RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE, + RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_RIGHT_RUPEE, + RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_RIGHT_RUPEE, + RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_FRONT_LEFT_HEART, + RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART, + RC_ICE_CAVERN_LOBBY_RUPEE, + RC_ICE_CAVERN_MAP_ROOM_LEFT_HEART, + RC_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART, + RC_ICE_CAVERN_MAP_ROOM_RIGHT_HEART, + RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1, + RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2, + RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3, RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART, RC_DEKU_TREE_MQ_DEKU_BABA_HEART, RC_DEKU_TREE_MQ_LOBBY_HEART, @@ -1783,6 +1797,13 @@ typedef enum { RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_3, RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_1, RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_2, + RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, + RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, + RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, + RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_MIDDLE_LEFT_HEART, + RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART, + RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART, + RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART, RC_MAX } RandomizerCheck; @@ -3793,6 +3814,9 @@ typedef enum { RHT_FIRE_TEMPLE_HEART, RHT_SHADOW_TEMPLE_HEART, RHT_BOTTOM_OF_THE_WELL_HEART, + RHT_BOTTOM_OF_THE_WELL_RUPEE, + RHT_ICE_CAVERN_HEART, + RHT_ICE_CAVERN_RUPEE, RHT_GANONS_CASTLE_HEART, RHT_MAX } RandomizerHintTextKey; diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index 8fbd66850ba..de0ef0202b6 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -410,6 +410,15 @@ typedef enum { RAND_INF_DODONGOS_CAVERN_BLADE_ROOM_HEART, RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART, RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART, + RAND_INF_ICE_CAVERN_LOBBY_RUPEE, + RAND_INF_ICE_CAVERN_MAP_ROOM_LEFT_HEART, + RAND_INF_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART, + RAND_INF_ICE_CAVERN_MAP_ROOM_RIGHT_HEART, + RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1, + RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2, + RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3, + RAND_INF_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART, + RAND_INF_DEKU_TREE_MQ_COMPASS_ROOM_HEART, RAND_INF_DEKU_TREE_MQ_DEKU_BABA_HEART, RAND_INF_DEKU_TREE_MQ_LOBBY_HEART, @@ -420,6 +429,13 @@ typedef enum { RAND_INF_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_HEART, RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_1, RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_2, + RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, + RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, + RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, + RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_MIDDLE_LEFT_HEART, + RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART, + RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART, + RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART, // If you add anything to this list, you need to update the size of randomizerInf in z64save.h to be ceil(RAND_INF_MAX / 16) RAND_INF_MAX, From ae172445f37d3c634990027bb8d5bcb12c7bcc0b Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Tue, 13 Aug 2024 19:34:18 -0700 Subject: [PATCH 041/108] Add checks for Forest Temple and Gerudo Training Grounds --- .../location_access/locacc_forest_temple.cpp | 12 +++++++++++- .../locacc_gerudo_training_grounds.cpp | 2 ++ soh/soh/Enhancements/randomizer/dungeon.cpp | 12 ++++++++++++ soh/soh/Enhancements/randomizer/location_list.cpp | 15 +++++++++++++++ soh/soh/Enhancements/randomizer/randomizerTypes.h | 14 ++++++++++++++ soh/soh/Enhancements/randomizer/randomizer_inf.h | 12 ++++++++++++ soh/soh/Enhancements/randomizer/settings.cpp | 1 + 7 files changed, 67 insertions(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_forest_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_forest_temple.cpp index 959c192eaad..df53062cc06 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_forest_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_forest_temple.cpp @@ -77,6 +77,8 @@ void AreaTable_Init_ForestTemple() { }, { //Locations LOCATION(RC_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, logic->CanUse(RG_LONGSHOT) || Here(RR_FOREST_TEMPLE_NW_OUTDOORS_UPPER, []{return logic->HookshotOrBoomerang;})), + LOCATION(RC_FOREST_TEMPLE_COURTYARD_RIGHT_HEART, HasAccessTo(RR_FOREST_TEMPLE_NW_OUTDOORS_UPPER) || (logic->CanUse(RG_BOOMERANG) && randoCtx->GetTrickOption(RT_FOREST_OUTDOORS_HEARTS_BOOMERANG))), + LOCATION(RC_FOREST_TEMPLE_COURTYARD_LEFT_HEART, HasAccessTo(RR_FOREST_TEMPLE_NW_OUTDOORS_UPPER) || (logic->CanUse(RG_BOOMERANG) && randoCtx->GetTrickOption(RT_FOREST_OUTDOORS_HEARTS_BOOMERANG))), }, { //Exits Entrance(RR_FOREST_TEMPLE_LOBBY, {[]{return logic->CanUse(RG_SONG_OF_TIME);}}), @@ -136,7 +138,9 @@ void AreaTable_Init_ForestTemple() { areaTable[RR_FOREST_TEMPLE_SEWER] = Area("Forest Temple Sewer", "Forest Temple", RA_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_FOREST_TEMPLE_WELL_CHEST, HasAccessTo(RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER)), + LOCATION(RC_FOREST_TEMPLE_WELL_CHEST, HasAccessTo(RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER)), + LOCATION(RC_FOREST_TEMPLE_WELL_WEST_HEART, HasAccessTo(RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER) || logic->CanUse(RG_IRON_BOOTS)), + LOCATION(RC_FOREST_TEMPLE_WELL_EAST_HEART, HasAccessTo(RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER) || logic->CanUse(RG_IRON_BOOTS)), }, { //Exits Entrance(RR_FOREST_TEMPLE_NW_OUTDOORS_LOWER, {[]{return true;}}), @@ -328,6 +332,9 @@ void AreaTable_Init_ForestTemple() { areaTable[RR_FOREST_TEMPLE_MQ_NW_OUTDOORS] = Area("Forest Temple MQ NW Outdoors", "Forest Temple", RA_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, logic->CanAdultAttack || logic->CanChildAttack), + LOCATION(RC_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART, HasAccessTo(RR_FOREST_TEMPLE_MQ_OUTDOOR_LEDGE) || (logic->CanUse(RG_BOOMERANG) && randoCtx->GetTrickOption(RT_FOREST_OUTDOORS_HEARTS_BOOMERANG))), + LOCATION(RC_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART, HasAccessTo(RR_FOREST_TEMPLE_MQ_OUTDOOR_LEDGE) || (logic->CanUse(RG_BOOMERANG) && randoCtx->GetTrickOption(RT_FOREST_OUTDOORS_HEARTS_BOOMERANG))), + LOCATION(RC_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART, HasAccessTo(RR_FOREST_TEMPLE_MQ_OUTDOOR_LEDGE) || (logic->CanUse(RG_BOOMERANG) && randoCtx->GetTrickOption(RT_FOREST_OUTDOORS_HEARTS_BOOMERANG))), }, { //Exits Entrance(RR_FOREST_TEMPLE_MQ_NE_OUTDOORS, {[]{return (logic->IsAdult && (logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_LONGSHOT) || (randoCtx->GetTrickOption(RT_FOREST_MQ_WELL_SWIM) && logic->CanUse(RG_HOOKSHOT)))) || logic->ProgressiveScale >= 2;}}), @@ -344,6 +351,9 @@ void AreaTable_Init_ForestTemple() { LOCATION(RC_FOREST_TEMPLE_MQ_WELL_CHEST, (logic->IsAdult && logic->CanUse(RG_FAIRY_BOW)) || (logic->IsChild && logic->CanUse(RG_FAIRY_SLINGSHOT))), LOCATION(RC_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, logic->HookshotOrBoomerang || (logic->IsAdult && logic->CanUse(RG_FIRE_ARROWS) && (logic->CanUse(RG_SONG_OF_TIME) || (logic->CanUse(RG_HOVER_BOOTS) && randoCtx->GetTrickOption(RT_FOREST_DOORFRAME))))), LOCATION(RC_FOREST_TEMPLE_MQ_GS_WELL, (logic->IsAdult && ((logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT)) || logic->CanUse(RG_FAIRY_BOW))) || (logic->IsChild && logic->CanUse(RG_FAIRY_SLINGSHOT))), + LOCATION(RC_FOREST_TEMPLE_MQ_WELL_WEST_HEART, logic->CanUse(RG_IRON_BOOTS) || (logic->IsAdult && logic->CanUse(RG_FAIRY_BOW)) || (logic->IsChild && logic->CanUse(RG_FAIRY_SLINGSHOT))), + LOCATION(RC_FOREST_TEMPLE_MQ_WELL_MIDDLE_HEART, logic->CanUse(RG_IRON_BOOTS) || (logic->IsAdult && logic->CanUse(RG_FAIRY_BOW)) || (logic->IsChild && logic->CanUse(RG_FAIRY_SLINGSHOT))), + LOCATION(RC_FOREST_TEMPLE_MQ_WELL_EAST_HEART, logic->CanUse(RG_IRON_BOOTS) || (logic->IsAdult && logic->CanUse(RG_FAIRY_BOW)) || (logic->IsChild && logic->CanUse(RG_FAIRY_SLINGSHOT))), }, { //Exits Entrance(RR_FOREST_TEMPLE_MQ_OUTDOORS_TOP_LEDGES, {[]{return logic->IsAdult && logic->CanUse(RG_HOOKSHOT) && (logic->CanUse(RG_LONGSHOT) || logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_SONG_OF_TIME));}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_training_grounds.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_training_grounds.cpp index c0a2ab2bc16..ed5595f8b24 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_training_grounds.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_training_grounds.cpp @@ -25,6 +25,8 @@ void AreaTable_Init_GerudoTrainingGrounds() { LOCATION(RC_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST, logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT)), LOCATION(RC_GERUDO_TRAINING_GROUND_STALFOS_CHEST, logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD)), LOCATION(RC_GERUDO_TRAINING_GROUND_BEAMOS_CHEST, logic->HasExplosives && (logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD))), + LOCATION(RC_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART, true), + LOCATION(RC_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART, true), }, { //Exits Entrance(RR_GERUDO_TRAINING_GROUNDS_ENTRYWAY, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/dungeon.cpp b/soh/soh/Enhancements/randomizer/dungeon.cpp index f11a0e55689..8ab1e04d4bd 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/dungeon.cpp @@ -325,6 +325,10 @@ Dungeons::Dungeons() { RC_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, RC_FOREST_TEMPLE_GS_LOBBY, RC_FOREST_TEMPLE_GS_BASEMENT, + RC_FOREST_TEMPLE_COURTYARD_RIGHT_HEART, + RC_FOREST_TEMPLE_COURTYARD_LEFT_HEART, + RC_FOREST_TEMPLE_WELL_WEST_HEART, + RC_FOREST_TEMPLE_WELL_EAST_HEART, }, { // MQ Locations @@ -345,6 +349,12 @@ Dungeons::Dungeons() { RC_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, RC_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, RC_FOREST_TEMPLE_MQ_GS_WELL, + RC_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART, + RC_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART, + RC_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART, + RC_FOREST_TEMPLE_MQ_WELL_WEST_HEART, + RC_FOREST_TEMPLE_MQ_WELL_MIDDLE_HEART, + RC_FOREST_TEMPLE_MQ_WELL_EAST_HEART, }, {}, { @@ -682,6 +692,8 @@ Dungeons::Dungeons() { RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST, RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST, RC_GERUDO_TRAINING_GROUND_FREESTANDING_KEY, + RC_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART, + RC_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART, }, { // MQ Locations diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 62cdb42c15e..392e85f5981 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -1744,6 +1744,11 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_DODONGOS_CAVERN, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, 0x2503, 0x25, "Upper Lizalfos Room Left Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); locationTable[RC_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_DODONGOS_CAVERN, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, 0x2403, 0x24, "Upper Lizalfos Room Right Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_FOREST_TEMPLE_COURTYARD_RIGHT_HEART] = Location::Collectable(RC_FOREST_TEMPLE_COURTYARD_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x2D03, 0x2D, "West Courtyard Right Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_COURTYARD_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[RC_FOREST_TEMPLE_COURTYARD_LEFT_HEART] = Location::Collectable(RC_FOREST_TEMPLE_COURTYARD_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x2E03, 0x2E, "West Courtyard Left Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_COURTYARD_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[RC_FOREST_TEMPLE_WELL_WEST_HEART] = Location::Collectable(RC_FOREST_TEMPLE_WELL_WEST_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x2F03, 0x2F, "Well East Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_WELL_WEST_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[RC_FOREST_TEMPLE_WELL_EAST_HEART] = Location::Collectable(RC_FOREST_TEMPLE_WELL_EAST_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x3003, 0x30, "Well West Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_WELL_EAST_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x0501, 0x05, "Basement Platform Left Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x0601, 0x06, "Basement Platform Back Left Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x0201, 0x02, "Basement Platform Middle Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); @@ -1760,6 +1765,9 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2] = Location::Collectable(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_ICE_CAVERN, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, 0x2F02, 0x2F, "Sliding Block Room Rupee 2", RHT_ICE_CAVERN_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2), SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); locationTable[RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3] = Location::Collectable(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_ICE_CAVERN, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, 0x3002, 0x30, "Sliding Block Room Rupee 3", RHT_ICE_CAVERN_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3), SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[RC_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART] = Location::Collectable(RC_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, 0x2203, 0x22, "Beamos South Heart", RHT_GERUDO_TRAINING_GROUNDS_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART), SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[RC_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART] = Location::Collectable(RC_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, 0x2303, 0x23, "Beamos East Heart", RHT_GERUDO_TRAINING_GROUNDS_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART), SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x2203, 0x22, "MQ Compass Room Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_COMPASS_ROOM_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); locationTable[RC_DEKU_TREE_MQ_DEKU_BABA_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_DEKU_BABA_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x2303, 0x23, "MQ Deku Baba Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_DEKU_BABA_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); locationTable[RC_DEKU_TREE_MQ_LOBBY_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_LOBBY_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x2403, 0x24, "MQ Lobby Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); @@ -1777,6 +1785,13 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_1] = Location::Collectable(RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_1, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_ITEM00, SCENE_JABU_JABU, 0x2703, 0x27, "MQ Lift Room Heart 1", RHT_JABU_JABU_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_1), SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); locationTable[RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_2] = Location::Collectable(RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_2, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_ITEM00, SCENE_JABU_JABU, 0x2803, 0x28, "MQ Lift Room Heart 2", RHT_JABU_JABU_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_2), SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[RC_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x2D03, 0x2D, "MQ West Courtyard Right Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x2E03, 0x2E, "MQ West Courtyard Middle Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x2F03, 0x2F, "MQ West Courtyard Left Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_FOREST_TEMPLE_MQ_WELL_WEST_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_WELL_WEST_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x3803, 0x38, "MQ Well Middle Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_WELL_MQ_WEST_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_FOREST_TEMPLE_MQ_WELL_MIDDLE_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_WELL_MIDDLE_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x3903, 0x39, "MQ Well West Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_WELL_MQ_MIDDLE_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_FOREST_TEMPLE_MQ_WELL_EAST_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_WELL_EAST_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x3A03, 0x3A, "MQ Well East Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_WELL_MQ_EAST_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x2003, 0x22, "MQ Coffin Room Front Right Invisible Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x2103, 0x21, "MQ Bomb Alcove Left Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x2203, 0x22, "MQ Bomb Alcove Right Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 2fa52f434b8..568f4bd4c02 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1769,6 +1769,10 @@ typedef enum { RC_DODONGOS_CAVERN_BLADE_ROOM_HEART, RC_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART, RC_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART, + RC_FOREST_TEMPLE_COURTYARD_RIGHT_HEART, + RC_FOREST_TEMPLE_COURTYARD_LEFT_HEART, + RC_FOREST_TEMPLE_WELL_WEST_HEART, + RC_FOREST_TEMPLE_WELL_EAST_HEART, RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE, RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE, RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE, @@ -1783,6 +1787,8 @@ typedef enum { RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1, RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2, RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3, + RC_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART, + RC_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART, RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART, RC_DEKU_TREE_MQ_DEKU_BABA_HEART, RC_DEKU_TREE_MQ_LOBBY_HEART, @@ -1797,6 +1803,12 @@ typedef enum { RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_3, RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_1, RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_2, + RC_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART, + RC_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART, + RC_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART, + RC_FOREST_TEMPLE_MQ_WELL_WEST_HEART, + RC_FOREST_TEMPLE_MQ_WELL_MIDDLE_HEART, + RC_FOREST_TEMPLE_MQ_WELL_EAST_HEART, RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, @@ -1904,6 +1916,7 @@ typedef enum { RT_FOREST_OUTDOORS_LEDGE, RT_FOREST_DOORFRAME, RT_FOREST_OUTSIDE_BACKDOOR, + RT_FOREST_OUTDOORS_HEARTS_BOOMERANG, RT_FOREST_MQ_WELL_SWIM, RT_FOREST_MQ_BLOCK_PUZZLE, RT_FOREST_MQ_JS_HALLWAY_SWITCH, @@ -3817,6 +3830,7 @@ typedef enum { RHT_BOTTOM_OF_THE_WELL_RUPEE, RHT_ICE_CAVERN_HEART, RHT_ICE_CAVERN_RUPEE, + RHT_GERUDO_TRAINING_GROUNDS_HEART, RHT_GANONS_CASTLE_HEART, RHT_MAX } RandomizerHintTextKey; diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index de0ef0202b6..a8ada3df7a4 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -410,6 +410,10 @@ typedef enum { RAND_INF_DODONGOS_CAVERN_BLADE_ROOM_HEART, RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART, RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART, + RAND_INF_FOREST_TEMPLE_COURTYARD_RIGHT_HEART, + RAND_INF_FOREST_TEMPLE_COURTYARD_LEFT_HEART, + RAND_INF_FOREST_TEMPLE_WELL_WEST_HEART, + RAND_INF_FOREST_TEMPLE_WELL_EAST_HEART, RAND_INF_ICE_CAVERN_LOBBY_RUPEE, RAND_INF_ICE_CAVERN_MAP_ROOM_LEFT_HEART, RAND_INF_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART, @@ -418,6 +422,8 @@ typedef enum { RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2, RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3, RAND_INF_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART, + RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART, + RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART, RAND_INF_DEKU_TREE_MQ_COMPASS_ROOM_HEART, RAND_INF_DEKU_TREE_MQ_DEKU_BABA_HEART, @@ -429,6 +435,12 @@ typedef enum { RAND_INF_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_HEART, RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_1, RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_2, + RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART, + RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART, + RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART, + RAND_INF_FOREST_TEMPLE_WELL_MQ_WEST_HEART, + RAND_INF_FOREST_TEMPLE_WELL_MQ_MIDDLE_HEART, + RAND_INF_FOREST_TEMPLE_WELL_MQ_EAST_HEART, RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index c7548d3e5b1..6fe181619d0 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -326,6 +326,7 @@ void Settings::CreateOptions() { mTrickOptions[RT_FOREST_OUTDOORS_LEDGE] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_FOREST_TEMPLE, {Tricks::Tag::NOVICE}, false, "Forest Temple NE Outdoors Ledge with Hover Boots", "With precise Hover Boots movement you can fall down to this ledge from upper balconies. If done precisely enough, it is not necessary to take fall damage. In MQ, this skips a Longshot requirement. In Vanilla, this can skip a Hookshot requirement in entrance randomizer."); mTrickOptions[RT_FOREST_DOORFRAME] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_FOREST_TEMPLE, {Tricks::Tag::ADVANCED}, false, "Forest Temple East Courtyard Door Frame with Hover Boots", "A precise Hover Boots movement from the upper balconies in this courtyard can be used to get on top of the door frame. Applies to both Vanilla and Master Quest. In Vanilla, from on top the door frame you can summon Pierre, allowing you to access the falling ceiling room early. In Master Quest, this allows you to obtain the GS on the door frame as adult without Hookshot or Song of Time."); mTrickOptions[RT_FOREST_OUTSIDE_BACKDOOR] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_FOREST_TEMPLE, {Tricks::Tag::ADVANCED}, false, "Forest Temple Outside Backdoor with Jump Slash", "A jump slash recoil can be used to reach the ledge in the block puzzle room that leads to the west courtyard. This skips a potential Hover Boots requirement in vanilla, and it can sometimes apply in MQ as well. This trick can be performed as both ages."); + mTrickOptions[RT_FOREST_OUTDOORS_HEARTS_BOOMERANG] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_FOREST_TEMPLE, {Tricks::Tag::NOVICE}, false, "Forest Temple Outside Hearts with Boomerang", "A well aimed boomerang from the water's edge can reach the hearts from ground level. If unable to swim, you can back away from the water while the boomerang is returning so the hearts land on the ground."); mTrickOptions[RT_FOREST_MQ_WELL_SWIM] = TrickOption::LogicTrick(RCQUEST_MQ, RA_FOREST_TEMPLE, {Tricks::Tag::ADVANCED}, false, "Swim Through Forest Temple MQ Well with Hookshot", "Shoot the vines in the well as low and as far to the right as possible, and then immediately swim under the ceiling to the right. This can only be required if Forest Temple is in its Master Quest form."); mTrickOptions[RT_FOREST_MQ_BLOCK_PUZZLE] = TrickOption::LogicTrick(RCQUEST_MQ, RA_FOREST_TEMPLE, {Tricks::Tag::NOVICE}, false, "Skip Forest Temple MQ Block Puzzle with Bombchu", "Send the Bombchu straight up the center of the wall directly to the left upon entering the room."); mTrickOptions[RT_FOREST_MQ_JS_HALLWAY_SWITCH] = TrickOption::LogicTrick(RCQUEST_MQ, RA_FOREST_TEMPLE, {Tricks::Tag::NOVICE}, false, "Forest Temple MQ Twisted Hallway Switch with Jump Slash", "The switch to twist the hallway can be hit with a jump slash through the glass block. To get in front of the switch, either use the Hover Boots or hit the shortcut switch at the top of the room and jump from the glass blocks that spawn. Sticks can be used as child, but the Kokiri Sword is too short to reach through the glass."); From 2a58e47754ebcd13f02728d35ecf544035834bd1 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Tue, 13 Aug 2024 23:35:36 -0700 Subject: [PATCH 042/108] Add checks for Fire Temple and Water Temple --- .../location_access/locacc_fire_temple.cpp | 21 +++++++++++++--- .../location_access/locacc_water_temple.cpp | 8 ++++-- soh/soh/Enhancements/randomizer/dungeon.cpp | 16 ++++++++++++ .../Enhancements/randomizer/location_list.cpp | 25 ++++++++++++++++--- .../Enhancements/randomizer/randomizerTypes.h | 17 +++++++++++++ .../Enhancements/randomizer/randomizer_inf.h | 16 ++++++++++++ 6 files changed, 95 insertions(+), 8 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp index b3c2e5387d1..531d911a178 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp @@ -123,7 +123,12 @@ void AreaTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_BIG_LAVA_ROOM, {[]{return true;}}), }); - areaTable[RR_FIRE_TEMPLE_FIRE_PILLAR_ROOM] = Area("Fire Temple Fire Pillar Room", "Fire Temple", RA_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_FIRE_PILLAR_ROOM] = Area("Fire Temple Fire Pillar Room", "Fire Temple", RA_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + //Locations + LOCATION(RC_FIRE_TEMPLE_FIRE_PILLAR_LEFT_HEART, logic->FireTimer >= 56), + LOCATION(RC_FIRE_TEMPLE_FIRE_PILLAR_RIGHT_HEART, logic->FireTimer >= 56), + LOCATION(RC_FIRE_TEMPLE_FIRE_PILLAR_BACK_HEART, logic->FireTimer >= 56), + }, { //Exits Entrance(RR_FIRE_TEMPLE_BIG_LAVA_ROOM, {[]{return logic->SmallKeys(RR_FIRE_TEMPLE, 3);}}), Entrance(RR_FIRE_TEMPLE_SHORTCUT_ROOM, {[]{return logic->FireTimer >= 56 && logic->SmallKeys(RR_FIRE_TEMPLE, 4);}}), @@ -165,7 +170,12 @@ void AreaTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_BOULDER_MAZE_LOWER, {[]{return true;}}), }); - areaTable[RR_FIRE_TEMPLE_EAST_CENTRAL_ROOM] = Area("Fire Temple East Central Room", "Fire Temple", RA_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_EAST_CENTRAL_ROOM] = Area("Fire Temple East Central Room", "Fire Temple", RA_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + //Locations + LOCATION(RC_FIRE_TEMPLE_EAST_CENTRAL_LEFT_HEART, true), + LOCATION(RC_FIRE_TEMPLE_EAST_CENTRAL_RIGHT_HEART, true), + LOCATION(RC_FIRE_TEMPLE_EAST_CENTRAL_MIDDLE_HEART, true), + }, { //Exits Entrance(RR_FIRE_TEMPLE_BIG_LAVA_ROOM, {[]{return logic->CanTakeDamage;}}), Entrance(RR_FIRE_TEMPLE_BOULDER_MAZE_LOWER, {[]{return logic->SmallKeys(RR_FIRE_TEMPLE, 5, 8);}}), @@ -173,7 +183,12 @@ void AreaTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MAP_AREA, {[]{return logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW);}}), }); - areaTable[RR_FIRE_TEMPLE_FIRE_WALL_CHASE] = Area("Fire Temple Fire Wall Chase", "Fire Temple", RA_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_FIRE_WALL_CHASE] = Area("Fire Temple Fire Wall Chase", "Fire Temple", RA_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + //Locations + LOCATION(RC_FIRE_TEMPLE_FIRE_WALL_EAST_HEART, logic->FireTimer >= 24 && (logic->IsAdult || logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_FIRE_TEMPLE_FIRE_WALL_WEST_HEART, logic->FireTimer >= 24 && (logic->IsAdult || logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_FIRE_TEMPLE_FIRE_WALL_EXIT_HEART, logic->FireTimer >= 24), + }, { //Exits Entrance(RR_FIRE_TEMPLE_EAST_CENTRAL_ROOM, {[]{return logic->FireTimer >= 24 && logic->SmallKeys(RR_FIRE_TEMPLE, 6, 8);}}), Entrance(RR_FIRE_TEMPLE_MAP_AREA, {[]{return logic->IsAdult;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_water_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_water_temple.cpp index 2534ebef352..9259eba642b 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_water_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_water_temple.cpp @@ -230,8 +230,12 @@ void AreaTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_RIVER] = Area("Water Temple River", "Water Temple", RA_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_RIVER_CHEST, (logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW)) && (logic->IsAdult || logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_HOOKSHOT))), - LOCATION(RC_WATER_TEMPLE_GS_RIVER, (logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT)) || (randoCtx->GetTrickOption(RT_WATER_RIVER_GS) && logic->CanUse(RG_LONGSHOT))), + LOCATION(RC_WATER_TEMPLE_RIVER_CHEST, (logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW)) && (logic->IsAdult || logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_HOOKSHOT))), + LOCATION(RC_WATER_TEMPLE_GS_RIVER, (logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT)) || (randoCtx->GetTrickOption(RT_WATER_RIVER_GS) && logic->CanUse(RG_LONGSHOT))), + LOCATION(RC_WATER_TEMPLE_RIVER_HEART_1, true), + LOCATION(RC_WATER_TEMPLE_RIVER_HEART_2, true), + LOCATION(RC_WATER_TEMPLE_RIVER_HEART_3, true), + LOCATION(RC_WATER_TEMPLE_RIVER_HEART_4, true), }, { //Exits Entrance(RR_WATER_TEMPLE_DRAGON_ROOM, {[]{return (logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW)) && (logic->IsAdult || logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_HOOKSHOT));}}), diff --git a/soh/soh/Enhancements/randomizer/dungeon.cpp b/soh/soh/Enhancements/randomizer/dungeon.cpp index 8ab1e04d4bd..c9393615077 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/dungeon.cpp @@ -386,6 +386,15 @@ Dungeons::Dungeons() { RC_FIRE_TEMPLE_GS_BOULDER_MAZE, RC_FIRE_TEMPLE_GS_SCARECROW_TOP, RC_FIRE_TEMPLE_GS_SCARECROW_CLIMB, + RC_FIRE_TEMPLE_FIRE_PILLAR_LEFT_HEART, + RC_FIRE_TEMPLE_FIRE_PILLAR_RIGHT_HEART, + RC_FIRE_TEMPLE_FIRE_PILLAR_BACK_HEART, + RC_FIRE_TEMPLE_EAST_CENTRAL_LEFT_HEART, + RC_FIRE_TEMPLE_EAST_CENTRAL_RIGHT_HEART, + RC_FIRE_TEMPLE_EAST_CENTRAL_MIDDLE_HEART, + RC_FIRE_TEMPLE_FIRE_WALL_EAST_HEART, + RC_FIRE_TEMPLE_FIRE_WALL_WEST_HEART, + RC_FIRE_TEMPLE_FIRE_WALL_EXIT_HEART, }, { // MQ Locations @@ -406,6 +415,9 @@ Dungeons::Dungeons() { RC_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, RC_FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE, + RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART, + RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART, + RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART, }, {}, { @@ -433,6 +445,10 @@ Dungeons::Dungeons() { RC_WATER_TEMPLE_GS_CENTRAL_PILLAR, RC_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST, RC_WATER_TEMPLE_GS_RIVER, + RC_WATER_TEMPLE_RIVER_HEART_1, + RC_WATER_TEMPLE_RIVER_HEART_2, + RC_WATER_TEMPLE_RIVER_HEART_3, + RC_WATER_TEMPLE_RIVER_HEART_4, }, { // MQ Locations diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 392e85f5981..9567964f82e 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -1749,6 +1749,21 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_FOREST_TEMPLE_WELL_WEST_HEART] = Location::Collectable(RC_FOREST_TEMPLE_WELL_WEST_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x2F03, 0x2F, "Well East Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_WELL_WEST_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); locationTable[RC_FOREST_TEMPLE_WELL_EAST_HEART] = Location::Collectable(RC_FOREST_TEMPLE_WELL_EAST_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x3003, 0x30, "Well West Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_WELL_EAST_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[RC_FIRE_TEMPLE_FIRE_PILLAR_LEFT_HEART] = Location::Collectable(RC_FIRE_TEMPLE_FIRE_PILLAR_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_FIRE_TEMPLE, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, 0x2F03, 0x2F, "Fire Pillar Room Left Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_FIRE_TEMPLE_FIRE_PILLAR_RIGHT_HEART] = Location::Collectable(RC_FIRE_TEMPLE_FIRE_PILLAR_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_FIRE_TEMPLE, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, 0x3003, 0x30, "Fire Pillar Room Right Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_FIRE_TEMPLE_FIRE_PILLAR_BACK_HEART] = Location::Collectable(RC_FIRE_TEMPLE_FIRE_PILLAR_BACK_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_FIRE_TEMPLE, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, 0x3403, 0x34, "Fire Pillar Room Back Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_BACK_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_FIRE_TEMPLE_EAST_CENTRAL_LEFT_HEART] = Location::Collectable(RC_FIRE_TEMPLE_EAST_CENTRAL_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_FIRE_TEMPLE, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, 0x3703, 0x37, "East Central Room Left Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_FIRE_TEMPLE_EAST_CENTRAL_RIGHT_HEART] = Location::Collectable(RC_FIRE_TEMPLE_EAST_CENTRAL_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_FIRE_TEMPLE, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, 0x3503, 0x35, "East Central Room Right Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_FIRE_TEMPLE_EAST_CENTRAL_MIDDLE_HEART] = Location::Collectable(RC_FIRE_TEMPLE_EAST_CENTRAL_MIDDLE_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_FIRE_TEMPLE, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, 0x3603, 0x36, "East Central Room Middle Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_MIDDLE_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_FIRE_TEMPLE_FIRE_WALL_EAST_HEART] = Location::Collectable(RC_FIRE_TEMPLE_FIRE_WALL_EAST_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_FIRE_TEMPLE, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, 0x3203, 0x32, "Fire Wall Chase East Pillar Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FIRE_WALL_EAST_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_FIRE_TEMPLE_FIRE_WALL_WEST_HEART] = Location::Collectable(RC_FIRE_TEMPLE_FIRE_WALL_WEST_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_FIRE_TEMPLE, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, 0x3103, 0x31, "Fire Wall Chase West Pillar Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FIRE_WALL_WEST_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_FIRE_TEMPLE_FIRE_WALL_EXIT_HEART] = Location::Collectable(RC_FIRE_TEMPLE_FIRE_WALL_EXIT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_FIRE_TEMPLE, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, 0x3303, 0x33, "Fire Wall Chase Exit Platform Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FIRE_WALL_EXIT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + + locationTable[RC_WATER_TEMPLE_RIVER_HEART_1] = Location::Collectable(RC_WATER_TEMPLE_RIVER_HEART_1, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_WATER_TEMPLE, ACTOR_EN_ITEM00, SCENE_WATER_TEMPLE, 0x2A03, 0x2A, "River Heart 1", RHT_WATER_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_RIVER_HEART_1), SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[RC_WATER_TEMPLE_RIVER_HEART_2] = Location::Collectable(RC_WATER_TEMPLE_RIVER_HEART_2, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_WATER_TEMPLE, ACTOR_EN_ITEM00, SCENE_WATER_TEMPLE, 0x2D03, 0x2D, "River Heart 2", RHT_WATER_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_RIVER_HEART_2), SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[RC_WATER_TEMPLE_RIVER_HEART_3] = Location::Collectable(RC_WATER_TEMPLE_RIVER_HEART_3, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_WATER_TEMPLE, ACTOR_EN_ITEM00, SCENE_WATER_TEMPLE, 0x3203, 0x32, "River Heart 2", RHT_WATER_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_RIVER_HEART_3), SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[RC_WATER_TEMPLE_RIVER_HEART_4] = Location::Collectable(RC_WATER_TEMPLE_RIVER_HEART_4, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_WATER_TEMPLE, ACTOR_EN_ITEM00, SCENE_WATER_TEMPLE, 0x3403, 0x34, "River Heart 3", RHT_WATER_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_RIVER_HEART_4), SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x0501, 0x05, "Basement Platform Left Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x0601, 0x06, "Basement Platform Back Left Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x0201, 0x02, "Basement Platform Middle Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); @@ -1788,9 +1803,13 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x2D03, 0x2D, "MQ West Courtyard Right Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x2E03, 0x2E, "MQ West Courtyard Middle Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x2F03, 0x2F, "MQ West Courtyard Left Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[RC_FOREST_TEMPLE_MQ_WELL_WEST_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_WELL_WEST_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x3803, 0x38, "MQ Well Middle Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_WELL_MQ_WEST_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[RC_FOREST_TEMPLE_MQ_WELL_MIDDLE_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_WELL_MIDDLE_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x3903, 0x39, "MQ Well West Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_WELL_MQ_MIDDLE_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[RC_FOREST_TEMPLE_MQ_WELL_EAST_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_WELL_EAST_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x3A03, 0x3A, "MQ Well East Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_WELL_MQ_EAST_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_FOREST_TEMPLE_MQ_WELL_WEST_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_WELL_WEST_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x3803, 0x38, "MQ Well Middle Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_WELL_MQ_WEST_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_FOREST_TEMPLE_MQ_WELL_MIDDLE_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_WELL_MIDDLE_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x3903, 0x39, "MQ Well West Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_WELL_MQ_MIDDLE_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_FOREST_TEMPLE_MQ_WELL_EAST_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_WELL_EAST_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x3A03, 0x3A, "MQ Well East Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_WELL_MQ_EAST_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + + locationTable[RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART] = Location::Collectable(RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FIRE_TEMPLE, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, 0x2F03, 0x2F, "MQ Fire Pillar Room Left Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART] = Location::Collectable(RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FIRE_TEMPLE, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, 0x3403, 0x34, "MQ Fire Pillar Room Right Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART] = Location::Collectable(RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FIRE_TEMPLE, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, 0x3003, 0x30, "MQ Fire Pillar Room Lower Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); locationTable[RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x2003, 0x22, "MQ Coffin Room Front Right Invisible Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x2103, 0x21, "MQ Bomb Alcove Left Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 568f4bd4c02..7ae21b6aee8 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1773,6 +1773,19 @@ typedef enum { RC_FOREST_TEMPLE_COURTYARD_LEFT_HEART, RC_FOREST_TEMPLE_WELL_WEST_HEART, RC_FOREST_TEMPLE_WELL_EAST_HEART, + RC_FIRE_TEMPLE_FIRE_PILLAR_LEFT_HEART, + RC_FIRE_TEMPLE_FIRE_PILLAR_RIGHT_HEART, + RC_FIRE_TEMPLE_FIRE_PILLAR_BACK_HEART, + RC_FIRE_TEMPLE_EAST_CENTRAL_LEFT_HEART, + RC_FIRE_TEMPLE_EAST_CENTRAL_RIGHT_HEART, + RC_FIRE_TEMPLE_EAST_CENTRAL_MIDDLE_HEART, + RC_FIRE_TEMPLE_FIRE_WALL_EAST_HEART, + RC_FIRE_TEMPLE_FIRE_WALL_WEST_HEART, + RC_FIRE_TEMPLE_FIRE_WALL_EXIT_HEART, + RC_WATER_TEMPLE_RIVER_HEART_1, + RC_WATER_TEMPLE_RIVER_HEART_2, + RC_WATER_TEMPLE_RIVER_HEART_3, + RC_WATER_TEMPLE_RIVER_HEART_4, RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE, RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE, RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE, @@ -1809,6 +1822,9 @@ typedef enum { RC_FOREST_TEMPLE_MQ_WELL_WEST_HEART, RC_FOREST_TEMPLE_MQ_WELL_MIDDLE_HEART, RC_FOREST_TEMPLE_MQ_WELL_EAST_HEART, + RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART, + RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART, + RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART, RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, @@ -3825,6 +3841,7 @@ typedef enum { RHT_JABU_JABU_HEART, RHT_FOREST_TEMPLE_HEART, RHT_FIRE_TEMPLE_HEART, + RHT_WATER_TEMPLE_HEART, RHT_SHADOW_TEMPLE_HEART, RHT_BOTTOM_OF_THE_WELL_HEART, RHT_BOTTOM_OF_THE_WELL_RUPEE, diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index a8ada3df7a4..ddcfb2b9fd3 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -414,6 +414,19 @@ typedef enum { RAND_INF_FOREST_TEMPLE_COURTYARD_LEFT_HEART, RAND_INF_FOREST_TEMPLE_WELL_WEST_HEART, RAND_INF_FOREST_TEMPLE_WELL_EAST_HEART, + RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_LEFT_HEART, + RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_RIGHT_HEART, + RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_BACK_HEART, + RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_LEFT_HEART, + RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_RIGHT_HEART, + RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_MIDDLE_HEART, + RAND_INF_FIRE_TEMPLE_FIRE_WALL_EAST_HEART, + RAND_INF_FIRE_TEMPLE_FIRE_WALL_WEST_HEART, + RAND_INF_FIRE_TEMPLE_FIRE_WALL_EXIT_HEART, + RAND_INF_WATER_TEMPLE_RIVER_HEART_1, + RAND_INF_WATER_TEMPLE_RIVER_HEART_2, + RAND_INF_WATER_TEMPLE_RIVER_HEART_3, + RAND_INF_WATER_TEMPLE_RIVER_HEART_4, RAND_INF_ICE_CAVERN_LOBBY_RUPEE, RAND_INF_ICE_CAVERN_MAP_ROOM_LEFT_HEART, RAND_INF_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART, @@ -441,6 +454,9 @@ typedef enum { RAND_INF_FOREST_TEMPLE_WELL_MQ_WEST_HEART, RAND_INF_FOREST_TEMPLE_WELL_MQ_MIDDLE_HEART, RAND_INF_FOREST_TEMPLE_WELL_MQ_EAST_HEART, + RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART, + RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART, + RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART, RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, From 2f463c19cca17efd21777621396994f72f615dfe Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Wed, 14 Aug 2024 22:56:51 -0700 Subject: [PATCH 043/108] Add Shadow Temple checks This does not include the spinning pots rupees, even though they're included with freestanding rupees in the N64 randomizer as they would require dedicated overrides for the code for the pots in question. --- .../location_access/locacc_shadow_temple.cpp | 22 +++++++++++++++---- .../Enhancements/randomizer/location_list.cpp | 16 ++++++++++++++ .../Enhancements/randomizer/randomizerTypes.h | 14 ++++++++++++ .../Enhancements/randomizer/randomizer_inf.h | 14 ++++++++++++ 4 files changed, 62 insertions(+), 4 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp index b95262ab31f..34fb4af3cd7 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp @@ -58,6 +58,8 @@ void AreaTable_Init_ShadowTemple() { LOCATION(RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, logic->CanJumpslash), LOCATION(RC_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, logic->Hookshot || (randoCtx->GetTrickOption(RT_SHADOW_UMBRELLA_GS) && logic->HoverBoots)), LOCATION(RC_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, logic->SmallKeys(RR_SHADOW_TEMPLE, 2, 3) && ((randoCtx->GetTrickOption(RT_LENS_SHADOW_PLATFORM) && randoCtx->GetTrickOption(RT_LENS_SHADOW)) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->Hookshot), + LOCATION(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_LEFT_HEART, (logic->CanUse(RG_SONG_OF_TIME) && logic->IsAdult) || logic->CanUse(RG_BOOMERANG)), + LOCATION(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART, (logic->CanUse(RG_SONG_OF_TIME) && logic->IsAdult) || logic->CanUse(RG_BOOMERANG)), }, { //Exits Entrance(RR_SHADOW_TEMPLE_WIND_TUNNEL, {[]{return ((randoCtx->GetTrickOption(RT_LENS_SHADOW_PLATFORM) && randoCtx->GetTrickOption(RT_LENS_SHADOW)) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->Hookshot && logic->SmallKeys(RR_SHADOW_TEMPLE, 3, 4);}}), @@ -69,6 +71,8 @@ void AreaTable_Init_ShadowTemple() { LOCATION(RC_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, logic->CanJumpslash), LOCATION(RC_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, true), LOCATION(RC_SHADOW_TEMPLE_GS_NEAR_SHIP, logic->CanUse(RG_LONGSHOT) && logic->SmallKeys(RR_SHADOW_TEMPLE, 4, 5)), + LOCATION(RC_SHADOW_TEMPLE_SCARECROW_NORTH_HEART, logic->CanUse(RG_DISTANT_SCARECROW) && logic->SmallKeys(RR_SHADOW_TEMPLE, 4, 5)), + LOCATION(RC_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART, logic->CanUse(RG_DISTANT_SCARECROW) && logic->SmallKeys(RR_SHADOW_TEMPLE, 4, 5)), }, { //Exits Entrance(RR_SHADOW_TEMPLE_BEYOND_BOAT, {[]{return logic->CanJumpslash && logic->CanUse(RG_ZELDAS_LULLABY) && logic->SmallKeys(RR_SHADOW_TEMPLE, 4, 5);}}), @@ -76,10 +80,13 @@ void AreaTable_Init_ShadowTemple() { areaTable[RR_SHADOW_TEMPLE_BEYOND_BOAT] = Area("Shadow Temple Beyond Boat", "Shadow Temple", RA_SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, logic->CanUse(RG_DINS_FIRE)), - LOCATION(RC_SHADOW_TEMPLE_BOSS_KEY_CHEST, logic->CanUse(RG_DINS_FIRE)), - LOCATION(RC_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, logic->CanJumpslash), - LOCATION(RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, logic->CanAdultAttack), + LOCATION(RC_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, logic->CanUse(RG_DINS_FIRE)), + LOCATION(RC_SHADOW_TEMPLE_BOSS_KEY_CHEST, logic->CanUse(RG_DINS_FIRE)), + LOCATION(RC_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, logic->CanJumpslash), + LOCATION(RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, logic->CanAdultAttack), + LOCATION(RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART, logic->CanUse(RG_DISTANT_SCARECROW)), + LOCATION(RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART, logic->CanUse(RG_DISTANT_SCARECROW)), + LOCATION(RC_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART, (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_DISTANT_SCARECROW) || (randoCtx->GetTrickOption(RT_SHADOW_STATUE) && logic->HasBombchus)) && logic->CanUse(RG_SONG_OF_TIME) || (logic->CanUse(RG_DISTANT_SCARECROW) && logic->CanUse(RG_HOVER_BOOTS))), }, { //Exits Entrance(RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, {[]{return (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_DISTANT_SCARECROW) || (randoCtx->GetTrickOption(RT_SHADOW_STATUE) && logic->HasBombchus)) && logic->SmallKeys(RR_SHADOW_TEMPLE, 5) && logic->CanUse(RG_HOVER_BOOTS) && logic->BossKeyShadowTemple;}}) @@ -120,6 +127,8 @@ void AreaTable_Init_ShadowTemple() { //Trick: logic->CanUse(RG_SONG_OF_TIME) || (LogicShadowMQInvisibleBlades && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_OHKO)) LOCATION(RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST, logic->CanUse(RG_SONG_OF_TIME) || (randoCtx->GetTrickOption(RT_SHADOW_MQ_INVISIBLE_BLADES) && randoCtx->GetOption(RSK_DAMAGE_MULTIPLIER).IsNot(RO_DAMAGE_MULTIPLIER_OHKO))), //Trick: logic->CanUse(RG_SONG_OF_TIME) || (LogicShadowMQInvisibleBlades && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_OHKO)) + LOCATION(RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_LEFT_HEART, (logic->CanUse(RG_SONG_OF_TIME) && logic->IsAdult) || logic->CanUse(RG_BOOMERANG)), + LOCATION(RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_RIGHT_HEART, (logic->CanUse(RG_SONG_OF_TIME) && logic->IsAdult) || logic->CanUse(RG_BOOMERANG)), }, { //Exits Entrance(RR_SHADOW_TEMPLE_MQ_LOWER_HUGE_PIT, {[]{return logic->HasFireSource || randoCtx->GetTrickOption(RT_SHADOW_MQ_HUGE_PIT);}}), @@ -151,6 +160,8 @@ void AreaTable_Init_ShadowTemple() { LOCATION(RC_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST, true), LOCATION(RC_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, true), LOCATION(RC_SHADOW_TEMPLE_MQ_GS_AFTER_WIND, true), + LOCATION(RC_SHADOW_TEMPLE_MQ_SCARECROW_NORTH_HEART, logic->CanUse(RG_DISTANT_SCARECROW) && logic->SmallKeys(RR_SHADOW_TEMPLE, 5)), + LOCATION(RC_SHADOW_TEMPLE_MQ_SCARECROW_SOUTH_HEART, logic->CanUse(RG_DISTANT_SCARECROW) && logic->SmallKeys(RR_SHADOW_TEMPLE, 5)), }, { //Exits Entrance(RR_SHADOW_TEMPLE_MQ_BEYOND_BOAT, {[]{return logic->CanUse(RG_ZELDAS_LULLABY) && logic->SmallKeys(RR_SHADOW_TEMPLE, 5);}}), @@ -160,6 +171,9 @@ void AreaTable_Init_ShadowTemple() { //Locations LOCATION(RC_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, true), LOCATION(RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, logic->Bow || (randoCtx->GetTrickOption(RT_SHADOW_STATUE) && logic->HasBombchus)), + LOCATION(RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART, logic->CanUse(RG_SONG_OF_TIME) && logic->CanUse(RG_FAIRY_BOW) && logic->CanUse(RG_LONGSHOT)), + LOCATION(RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART, logic->CanUse(RG_SONG_OF_TIME) && logic->CanUse(RG_FAIRY_BOW) && logic->CanUse(RG_LONGSHOT)), + LOCATION(RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART, (logic->CanUse(RG_FAIRY_BOW) || (randoCtx->GetTrickOption(RT_SHADOW_STATUE) && logic->HasBombchus)) && logic->CanUse(RG_SONG_OF_TIME)), }, { //Exits Entrance(RR_SHADOW_TEMPLE_MQ_INVISIBLE_MAZE, {[]{return logic->Bow && logic->CanUse(RG_SONG_OF_TIME) && logic->IsAdult && logic->CanUse(RG_LONGSHOT);}}), diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 9567964f82e..960b34c7a35 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -1764,6 +1764,14 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_WATER_TEMPLE_RIVER_HEART_3] = Location::Collectable(RC_WATER_TEMPLE_RIVER_HEART_3, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_WATER_TEMPLE, ACTOR_EN_ITEM00, SCENE_WATER_TEMPLE, 0x3203, 0x32, "River Heart 2", RHT_WATER_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_RIVER_HEART_3), SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); locationTable[RC_WATER_TEMPLE_RIVER_HEART_4] = Location::Collectable(RC_WATER_TEMPLE_RIVER_HEART_4, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_WATER_TEMPLE, ACTOR_EN_ITEM00, SCENE_WATER_TEMPLE, 0x3403, 0x34, "River Heart 3", RHT_WATER_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_RIVER_HEART_4), SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_INVISIBLE_BLADES_LEFT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x2003, 0x20, "Invisible Blades Left Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x2103, 0x21, "Invisible Blades Right Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_SCARECROW_NORTH_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_SCARECROW_NORTH_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x2203, 0x22, "Scarecrow Near Ship North Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_SCARECROW_NORTH_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x2303, 0x23, "Scarecrow Near Ship South Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x3A03, 0x3A, "After Ship Upper Left Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x3903, 0x39, "After Ship Upper Right Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x3C03, 0x3C, "After Ship Lower Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x0501, 0x05, "Basement Platform Left Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x0601, 0x06, "Basement Platform Back Left Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x0201, 0x02, "Basement Platform Middle Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); @@ -1811,6 +1819,14 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART] = Location::Collectable(RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FIRE_TEMPLE, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, 0x3403, 0x34, "MQ Fire Pillar Room Right Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); locationTable[RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART] = Location::Collectable(RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FIRE_TEMPLE, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, 0x3003, 0x30, "MQ Fire Pillar Room Lower Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_LEFT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x2003, 0x20, "MQ Invisible Blades Left Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_RIGHT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x2103, 0x21, "MQ Invisible Blades Right Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_MQ_SCARECROW_NORTH_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_MQ_SCARECROW_NORTH_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x2203, 0x22, "MQ Scarecrow Near Ship North Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_NORTH_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_MQ_SCARECROW_SOUTH_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_MQ_SCARECROW_SOUTH_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x2303, 0x23, "MQ Scarecrow Near Ship South Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_SOUTH_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x3A03, 0x3A, "MQ After Ship Upper Left Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x3903, 0x39, "MQ After Ship Upper Right Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x3C03, 0x3C, "MQ After Ship Lower Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x2003, 0x22, "MQ Coffin Room Front Right Invisible Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x2103, 0x21, "MQ Bomb Alcove Left Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x2203, 0x22, "MQ Bomb Alcove Right Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 7ae21b6aee8..db869473f7f 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1786,6 +1786,13 @@ typedef enum { RC_WATER_TEMPLE_RIVER_HEART_2, RC_WATER_TEMPLE_RIVER_HEART_3, RC_WATER_TEMPLE_RIVER_HEART_4, + RC_SHADOW_TEMPLE_INVISIBLE_BLADES_LEFT_HEART, + RC_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART, + RC_SHADOW_TEMPLE_SCARECROW_NORTH_HEART, + RC_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART, + RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART, + RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART, + RC_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART, RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE, RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE, RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE, @@ -1825,6 +1832,13 @@ typedef enum { RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART, RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART, RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART, + RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_LEFT_HEART, + RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_RIGHT_HEART, + RC_SHADOW_TEMPLE_MQ_SCARECROW_NORTH_HEART, + RC_SHADOW_TEMPLE_MQ_SCARECROW_SOUTH_HEART, + RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART, + RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART, + RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART, RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index ddcfb2b9fd3..a0d46d8fced 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -427,6 +427,13 @@ typedef enum { RAND_INF_WATER_TEMPLE_RIVER_HEART_2, RAND_INF_WATER_TEMPLE_RIVER_HEART_3, RAND_INF_WATER_TEMPLE_RIVER_HEART_4, + RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_LEFT_HEART, + RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART, + RAND_INF_SHADOW_TEMPLE_SCARECROW_NORTH_HEART, + RAND_INF_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART, + RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART, + RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART, + RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART, RAND_INF_ICE_CAVERN_LOBBY_RUPEE, RAND_INF_ICE_CAVERN_MAP_ROOM_LEFT_HEART, RAND_INF_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART, @@ -457,6 +464,13 @@ typedef enum { RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART, RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART, RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART, + RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_LEFT_HEART, + RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_RIGHT_HEART, + RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_NORTH_HEART, + RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_SOUTH_HEART, + RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART, + RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART, + RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART, RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, From ead0bba6887e85b04708a14cea8661b3856047b7 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 15 Aug 2024 00:38:51 -0700 Subject: [PATCH 044/108] Define Spirit Temple and Ganon's Castle hearts --- .../location_access/locacc_ganons_castle.cpp | 10 ++++++++- .../location_access/locacc_spirit_temple.cpp | 2 ++ .../Enhancements/randomizer/location_list.cpp | 21 +++++++++++++++---- .../Enhancements/randomizer/randomizerTypes.h | 11 ++++++++++ .../Enhancements/randomizer/randomizer_inf.h | 8 +++++++ 5 files changed, 47 insertions(+), 5 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp index b00630e27e9..6ca88bdaa1b 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp @@ -63,7 +63,10 @@ void AreaTable_Init_GanonsCastle() { areaTable[RR_GANONS_CASTLE_FIRE_TRIAL] = Area("Ganon's Castle Fire Trial", "Ganon's Castle", RA_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->FireTrialClear, {[]{return logic->CanUse(RG_GORON_TUNIC) && logic->CanUse(RG_GOLDEN_GAUNTLETS) && logic->CanUse(RG_LIGHT_ARROWS) && logic->CanUse(RG_LONGSHOT);}}), - }, {}, {}); + }, { + //Locations + LOCATION(RC_GANONS_CASTLE_FIRE_TRIAL_HEART, logic->CanUse(RG_GORON_TUNIC)), + }, {}); areaTable[RR_GANONS_CASTLE_WATER_TRIAL] = Area("Ganon's Castle Water Trial", "Ganon's Castle", RA_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { //Events @@ -83,6 +86,9 @@ void AreaTable_Init_GanonsCastle() { //Locations LOCATION(RC_GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST, logic->CanUse(RG_FIRE_ARROWS) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_SONG_OF_TIME) || logic->IsChild), LOCATION(RC_GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST, logic->CanUse(RG_FIRE_ARROWS) || (logic->CanUse(RG_LONGSHOT) && (logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_DINS_FIRE)))), + LOCATION(RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_1, (logic->FireArrows && (randoCtx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH))) || (logic->CanUse(RG_LONGSHOT) && (logic->CanUse(RG_HOVER_BOOTS) || (logic->DinsFire && (randoCtx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH)))))), + LOCATION(RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_2, (logic->FireArrows && (randoCtx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH))) || (logic->CanUse(RG_LONGSHOT) && (logic->CanUse(RG_HOVER_BOOTS) || (logic->DinsFire && (randoCtx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH)))))), + LOCATION(RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_3, (logic->FireArrows && (randoCtx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH))) || (logic->CanUse(RG_LONGSHOT) && (logic->CanUse(RG_HOVER_BOOTS) || (logic->DinsFire && (randoCtx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH)))))), }, {}); areaTable[RR_GANONS_CASTLE_SPIRIT_TRIAL] = Area("Ganon's Castle Spirit Trial", "Ganon's Castle", RA_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { @@ -93,6 +99,7 @@ void AreaTable_Init_GanonsCastle() { //Locations LOCATION(RC_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, (randoCtx->GetTrickOption(RT_GANON_SPIRIT_TRIAL_HOOKSHOT) || logic->CanUse(RG_HOOKSHOT)) && logic->CanJumpslash), LOCATION(RC_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, (randoCtx->GetTrickOption(RT_GANON_SPIRIT_TRIAL_HOOKSHOT) || logic->CanUse(RG_HOOKSHOT)) && logic->HasBombchus && (randoCtx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH))), + LOCATION(RC_GANONS_CASTLE_SPIRIT_TRIAL_HEART, true), }, {}); areaTable[RR_GANONS_CASTLE_LIGHT_TRIAL] = Area("Ganon's Castle Light Trial", "Ganon's Castle", RA_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { @@ -178,6 +185,7 @@ void AreaTable_Init_GanonsCastle() { }, { //Locations LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, logic->BlueFire), + LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_HEART, logic->BlueFire), }, {}); areaTable[RR_GANONS_CASTLE_MQ_SHADOW_TRIAL] = Area("Ganon's Castle MQ Shadow Trial", "Ganons Castle", RA_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp index 92716469e30..175dcff42ad 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp @@ -124,6 +124,8 @@ void AreaTable_Init_SpiritTemple() { //Locations LOCATION(RC_SPIRIT_TEMPLE_BOSS_KEY_CHEST, logic->CanUse(RG_ZELDAS_LULLABY) && ((logic->CanTakeDamage && randoCtx->GetTrickOption(RT_FLAMING_CHESTS)) || (logic->Bow && logic->Hookshot))), LOCATION(RC_SPIRIT_TEMPLE_TOPMOST_CHEST, (logic->MirrorShield && logic->CanAdultAttack) || (randoCtx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS))), + LOCATION(RC_SPIRIT_TEMPLE_ADULT_CLIMB_LEFT_HEART, logic->CanUse(RG_HOOKSHOT)), + LOCATION(RC_SPIRIT_TEMPLE_ADULT_CLIMB_RIGHT_HEART, logic->CanUse(RG_HOOKSHOT)), }, { //Exits Entrance(RR_SPIRIT_TEMPLE_INSIDE_STATUE_HEAD, {[]{return logic->MirrorShield && logic->HasExplosives && logic->Hookshot;}}), diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 960b34c7a35..9212a48deaa 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -1768,9 +1768,12 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x2103, 0x21, "Invisible Blades Right Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); locationTable[RC_SHADOW_TEMPLE_SCARECROW_NORTH_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_SCARECROW_NORTH_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x2203, 0x22, "Scarecrow Near Ship North Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_SCARECROW_NORTH_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); locationTable[RC_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x2303, 0x23, "Scarecrow Near Ship South Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x3A03, 0x3A, "After Ship Upper Left Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x3903, 0x39, "After Ship Upper Right Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[RC_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x3C03, 0x3C, "After Ship Lower Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x3A03, 0x3A, "After Ship Upper Left Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x3903, 0x39, "After Ship Upper Right Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x3C03, 0x3C, "After Ship Lower Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + + locationTable[RC_SPIRIT_TEMPLE_ADULT_CLIMB_LEFT_HEART] = Location::Collectable(RC_SPIRIT_TEMPLE_ADULT_CLIMB_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, 0x0103, 0x01, "Adult Climb Left Heart", RHT_SPIRIT_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_ADULT_CLIMB_RIGHT_HEART] = Location::Collectable(RC_SPIRIT_TEMPLE_ADULT_CLIMB_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, 0x0203, 0x02, "Adult Climb Right Heart", RHT_SPIRIT_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x0501, 0x05, "Basement Platform Left Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x0601, 0x06, "Basement Platform Back Left Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); @@ -1789,7 +1792,13 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3] = Location::Collectable(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_ICE_CAVERN, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, 0x3002, 0x30, "Sliding Block Room Rupee 3", RHT_ICE_CAVERN_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3), SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); locationTable[RC_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART] = Location::Collectable(RC_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, 0x2203, 0x22, "Beamos South Heart", RHT_GERUDO_TRAINING_GROUNDS_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART), SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[RC_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART] = Location::Collectable(RC_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, 0x2303, 0x23, "Beamos East Heart", RHT_GERUDO_TRAINING_GROUNDS_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART), SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[RC_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART] = Location::Collectable(RC_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, 0x2303, 0x23, "Beamos East Heart", RHT_GERUDO_TRAINING_GROUNDS_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART), SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + + locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_1] = Location::Collectable(RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_1, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_GANONS_CASTLE, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, 0x2103, 0x21, "Shadow Trial Heart 1", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_1), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_2] = Location::Collectable(RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_2, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_GANONS_CASTLE, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, 0x2203, 0x22, "Shadow Trial Heart 2", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_2), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_3] = Location::Collectable(RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_3, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_GANONS_CASTLE, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, 0x2303, 0x23, "Shadow Trial Heart 3", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_3), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_FIRE_TRIAL_HEART] = Location::Collectable(RC_GANONS_CASTLE_FIRE_TRIAL_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_GANONS_CASTLE, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, 0x2403, 0x24, "Fire Trial Heart", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_FIRE_TRIAL_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_SPIRIT_TRIAL_HEART] = Location::Collectable(RC_GANONS_CASTLE_SPIRIT_TRIAL_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_GANONS_CASTLE, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, 0x2603, 0x26, "Spirit Trial Heart", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); locationTable[RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x2203, 0x22, "MQ Compass Room Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_COMPASS_ROOM_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); locationTable[RC_DEKU_TREE_MQ_DEKU_BABA_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_DEKU_BABA_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x2303, 0x23, "MQ Deku Baba Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_DEKU_BABA_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); @@ -1835,6 +1844,10 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x3D03, 0x3D, "MQ Basement Hallway Left Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x3E03, 0x3E, "MQ Basement Hallway Right Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_HEART] = Location::Collectable(RC_GANONS_CASTLE_MQ_WATER_TRIAL_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_GANONS_CASTLE, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, 0x3F03, 0x3F, "MQ Water Trial Heart", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART] = Location::Collectable(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_GANONS_CASTLE, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, 0x3E03, 0x3E, "MQ Light Trial Right Heart", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART] = Location::Collectable(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_GANONS_CASTLE, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, 0x3D03, 0x3D, "MQ Light Trial Left Heart", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + // Gossip Stones locationTable[RC_DMC_GOSSIP_STONE] = Location::HintStone(RC_DMC_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 14341, 0x05, "Gossip Stone", {}); locationTable[RC_DMT_GOSSIP_STONE] = Location::HintStone(RC_DMT_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 14340, 0x04, "Gossip Stone", {}); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index db869473f7f..db46731b0df 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1793,6 +1793,8 @@ typedef enum { RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART, RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART, RC_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART, + RC_SPIRIT_TEMPLE_ADULT_CLIMB_LEFT_HEART, + RC_SPIRIT_TEMPLE_ADULT_CLIMB_RIGHT_HEART, RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE, RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE, RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE, @@ -1809,6 +1811,11 @@ typedef enum { RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3, RC_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART, RC_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART, + RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_1, + RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_2, + RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_3, + RC_GANONS_CASTLE_FIRE_TRIAL_HEART, + RC_GANONS_CASTLE_SPIRIT_TRIAL_HEART, RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART, RC_DEKU_TREE_MQ_DEKU_BABA_HEART, RC_DEKU_TREE_MQ_LOBBY_HEART, @@ -1846,6 +1853,9 @@ typedef enum { RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART, RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART, RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART, + RC_GANONS_CASTLE_MQ_WATER_TRIAL_HEART, + RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART, + RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART, RC_MAX } RandomizerCheck; @@ -3857,6 +3867,7 @@ typedef enum { RHT_FIRE_TEMPLE_HEART, RHT_WATER_TEMPLE_HEART, RHT_SHADOW_TEMPLE_HEART, + RHT_SPIRIT_TEMPLE_HEART, RHT_BOTTOM_OF_THE_WELL_HEART, RHT_BOTTOM_OF_THE_WELL_RUPEE, RHT_ICE_CAVERN_HEART, diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index a0d46d8fced..9e6a24b04fd 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -444,6 +444,11 @@ typedef enum { RAND_INF_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART, RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART, RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART, + RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_1, + RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_2, + RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_3, + RAND_INF_GANONS_CASTLE_FIRE_TRIAL_HEART, + RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_HEART, RAND_INF_DEKU_TREE_MQ_COMPASS_ROOM_HEART, RAND_INF_DEKU_TREE_MQ_DEKU_BABA_HEART, @@ -478,6 +483,9 @@ typedef enum { RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART, RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART, RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART, + RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_HEART, + RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART, + RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART, // If you add anything to this list, you need to update the size of randomizerInf in z64save.h to be ceil(RAND_INF_MAX / 16) RAND_INF_MAX, From f8c438ebb2c6b063724ca7c4bacda8ad5fa8a544 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 15 Aug 2024 00:46:29 -0700 Subject: [PATCH 045/108] Add remaining checks to dungeon definitions --- soh/soh/Enhancements/randomizer/dungeon.cpp | 24 +++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/dungeon.cpp b/soh/soh/Enhancements/randomizer/dungeon.cpp index c9393615077..a9304ce9f2e 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/dungeon.cpp @@ -497,6 +497,8 @@ Dungeons::Dungeons() { RC_SPIRIT_TEMPLE_GS_LOBBY, RC_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, RC_SPIRIT_TEMPLE_GS_METAL_FENCE, + RC_SPIRIT_TEMPLE_ADULT_CLIMB_LEFT_HEART, + RC_SPIRIT_TEMPLE_ADULT_CLIMB_RIGHT_HEART, }, { // MQ Locations @@ -563,6 +565,13 @@ Dungeons::Dungeons() { RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, RC_SHADOW_TEMPLE_GS_NEAR_SHIP, + RC_SHADOW_TEMPLE_INVISIBLE_BLADES_LEFT_HEART, + RC_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART, + RC_SHADOW_TEMPLE_SCARECROW_NORTH_HEART, + RC_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART, + RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART, + RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART, + RC_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART, }, { // MQ Locations @@ -591,6 +600,13 @@ Dungeons::Dungeons() { RC_SHADOW_TEMPLE_MQ_GS_AFTER_WIND, RC_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, + RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_LEFT_HEART, + RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_RIGHT_HEART, + RC_SHADOW_TEMPLE_MQ_SCARECROW_NORTH_HEART, + RC_SHADOW_TEMPLE_MQ_SCARECROW_SOUTH_HEART, + RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART, + RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART, + RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART, }, {}, { @@ -756,6 +772,11 @@ Dungeons::Dungeons() { RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT, + RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_1, + RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_2, + RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_3, + RC_GANONS_CASTLE_FIRE_TRIAL_HEART, + RC_GANONS_CASTLE_SPIRIT_TRIAL_HEART, }, { // MQ Locations @@ -777,6 +798,9 @@ Dungeons::Dungeons() { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, + RC_GANONS_CASTLE_MQ_WATER_TRIAL_HEART, + RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART, + RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART, }, { // Shared Locations From 00b8c8694e69505da342959d52519b53c7c92fb8 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 15 Aug 2024 01:57:12 -0700 Subject: [PATCH 046/108] Fix missing logic --- .../location_access/locacc_death_mountain.cpp | 37 +++++++++++++++++++ .../location_access/locacc_lost_woods.cpp | 4 ++ .../location_access/locacc_zoras_domain.cpp | 6 +-- .../Enhancements/randomizer/randomizerTypes.h | 1 + 4 files changed, 45 insertions(+), 3 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp index 6627c2286e1..e3ef7982d11 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp @@ -15,6 +15,8 @@ void AreaTable_Init_DeathMountain() { LOCATION(RC_DMT_GS_BEAN_PATCH, logic->CanPlantBugs && (logic->HasExplosives || logic->GoronBracelet || (randoCtx->GetTrickOption(RT_DMT_SOIL_GS) && (logic->CanTakeDamage || logic->CanUse(RG_HOVER_BOOTS)) && logic->CanUse(RG_BOOMERANG)))), LOCATION(RC_DMT_GS_NEAR_KAK, logic->CanBlastOrSmash), LOCATION(RC_DMT_GS_ABOVE_DODONGOS_CAVERN, logic->IsAdult && logic->AtNight && (logic->CanUse(RG_MEGATON_HAMMER) || (randoCtx->GetTrickOption(RT_DMT_HOOKSHOT_LOWER_GS) && logic->CanUse(RG_HOOKSHOT)) || (randoCtx->GetTrickOption(RT_DMT_BEAN_LOWER_GS) && CanPlantBean(RR_DEATH_MOUNTAIN_TRAIL)) || (randoCtx->GetTrickOption(RT_DMT_HOVERS_LOWER_GS) && logic->CanUse(RG_HOVER_BOOTS)) || randoCtx->GetTrickOption(RT_DMT_JS_LOWER_GS)) && logic->CanGetNightTimeGS), + LOCATION(RC_DMT_BLUE_RUPEE, logic->IsChild && logic->CanBlastOrSmash), + LOCATION(RC_DMT_RED_RUPEE, logic->IsChild && logic->CanBlastOrSmash), }, { //Exits Entrance(RR_KAK_BEHIND_GATE, {[]{return true;}}), @@ -54,6 +56,17 @@ void AreaTable_Init_DeathMountain() { //Locations LOCATION(RC_DMT_COW_GROTTO_COW, logic->CanUse(RG_EPONAS_SONG)), LOCATION(RC_DMT_COW_GROTTO_BEEHIVE, logic->CanBreakLowerBeehives), + LOCATION(RC_DMT_COW_GROTTO_LEFT_HEART, true), + LOCATION(RC_DMT_COW_GROTTO_MIDDLE_LEFT_HEART, true), + LOCATION(RC_DMT_COW_GROTTO_MIDDLE_RIGHT_HEART, true), + LOCATION(RC_DMT_COW_GROTTO_RIGHT_HEART, true), + LOCATION(RC_DMT_COW_GROTTO_RUPEE_1, true), + LOCATION(RC_DMT_COW_GROTTO_RUPEE_2, true), + LOCATION(RC_DMT_COW_GROTTO_RUPEE_3, true), + LOCATION(RC_DMT_COW_GROTTO_RUPEE_4, true), + LOCATION(RC_DMT_COW_GROTTO_RUPEE_5, true), + LOCATION(RC_DMT_COW_GROTTO_RUPEE_6, true), + LOCATION(RC_DMT_COW_GROTTO_RED_RUPEE, true), }, { //Exits Entrance(RR_DEATH_MOUNTAIN_SUMMIT, {[]{return true;}}), @@ -185,6 +198,7 @@ void AreaTable_Init_DeathMountain() { Entrance(RR_DMC_LADDER_AREA_NEARBY, {[]{return logic->FireTimer >= 16 || logic->Hearts >= 3;}}), Entrance(RR_DMC_CENTRAL_NEARBY, {[]{return logic->IsAdult && logic->CanUse(RG_GORON_TUNIC) && logic->CanUse(RG_DISTANT_SCARECROW) && ((logic->EffectiveHealth > 2) || (logic->Fairy && randoCtx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).IsNot(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF)) || logic->CanUse(RG_NAYRUS_LOVE));}}), Entrance(RR_DMC_LOWER_NEARBY, {[]{return false;}}), + Entrance(RR_DMC_DISTANT_PLATFORM, {[]{return (logic->FireTimer >= 48 && logic->Hearts >= 2) || logic->Hearts >= 3;}}), }); areaTable[RR_DMC_LADDER_AREA_NEARBY] = Area("DMC Ladder Area Nearby", "Death Mountain Crater", RA_DEATH_MOUNTAIN_CRATER, NO_DAY_NIGHT_CYCLE, {}, { @@ -227,12 +241,21 @@ void AreaTable_Init_DeathMountain() { }, { //Locations LOCATION(RC_DMC_GS_BEAN_PATCH, (logic->FireTimer >= 8 || logic->Hearts >= 3) && logic->CanPlantBugs && logic->CanChildAttack), + LOCATION(RC_DMC_NEAR_PLATFORM_RED_RUPEE, logic->IsChild), + LOCATION(RC_DMC_MIDDLE_PLATFORM_RED_RUPEE, logic->IsChild && (logic->FireTimer >= 8 || logic->Hearts >= 3)), + LOCATION(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_1, logic->IsChild && (logic->FireTimer >= 8 || logic->Hearts >= 3)), + LOCATION(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_2, logic->IsChild && (logic->FireTimer >= 8 || logic->Hearts >= 3)), + LOCATION(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_3, logic->IsChild && (logic->FireTimer >= 8 || logic->Hearts >= 3)), + LOCATION(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_4, logic->IsChild && (logic->FireTimer >= 8 || logic->Hearts >= 3)), + LOCATION(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_5, logic->IsChild && (logic->FireTimer >= 8 || logic->Hearts >= 3)), + LOCATION(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_6, logic->IsChild && (logic->FireTimer >= 8 || logic->Hearts >= 3)), }, { //Exits Entrance(RR_DMC_CENTRAL_NEARBY, {[]{return true;}}), Entrance(RR_DMC_LOWER_NEARBY, {[]{return (logic->IsAdult && CanPlantBean(RR_DMC_CENTRAL_LOCAL)) || logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_HOOKSHOT);}}), Entrance(RR_DMC_UPPER_NEARBY, {[]{return logic->IsAdult && CanPlantBean(RR_DMC_CENTRAL_LOCAL);}}), Entrance(RR_FIRE_TEMPLE_ENTRYWAY, {[]{return (logic->IsChild && logic->Hearts >= 3 && randoCtx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).IsNot(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF)) || (logic->IsAdult && logic->FireTimer >= 24);}}), + Entrance(RR_DMC_DISTANT_PLATFORM, {[]{return logic->FireTimer >= 48 && logic->DistantScarecrow;}}), }); areaTable[RR_DMC_GREAT_FAIRY_FOUNTAIN] = Area("DMC Great Fairy Fountain", "DMC Great Fairy Fountain", RA_NONE, NO_DAY_NIGHT_CYCLE, {}, { @@ -265,4 +288,18 @@ void AreaTable_Init_DeathMountain() { //Exits Entrance(RR_DMC_LOWER_LOCAL, {[]{return true;}}), }); + + areaTable[RR_DMC_DISTANT_PLATFORM] = Area("DMC Distant Platform", "Death Mountain Crater", RA_DEATH_MOUNTAIN_CRATER, NO_DAY_NIGHT_CYCLE, {}, { + //Locations + LOCATION(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_1, true), + LOCATION(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_2, true), + LOCATION(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_3, true), + LOCATION(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_4, true), + LOCATION(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_5, true), + LOCATION(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_6, true), + LOCATION(RC_DMC_DISTANT_PLATFORM_RED_RUPEE, true), + }, { + //Exits + Entrance(RR_DMC_CENTRAL_LOCAL, {[]{return logic->DistantScarecrow;}}), + }); } diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp index 4a278652550..82ef02f56ff 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp @@ -30,6 +30,9 @@ void AreaTable_Init_LostWoods() { LOCATION(RC_KF_BEAN_RUPEE_5, logic->IsAdult && (CanPlantBean(RR_KOKIRI_FOREST) || logic->CanUse(RG_HOVER_BOOTS))), LOCATION(RC_KF_BEAN_RUPEE_6, logic->IsAdult && (CanPlantBean(RR_KOKIRI_FOREST) || logic->CanUse(RG_HOVER_BOOTS))), LOCATION(RC_KF_BEAN_RED_RUPEE, logic->IsAdult && (CanPlantBean(RR_KOKIRI_FOREST) || logic->CanUse(RG_HOVER_BOOTS))), + LOCATION(RC_KF_SARIAS_ROOF_WEST_HEART, logic->IsChild), + LOCATION(RC_KF_SARIAS_ROOF_EAST_HEART, logic->IsChild), + LOCATION(RC_KF_SARIAS_ROOF_NORTH_HEART, logic->IsChild), LOCATION(RC_KF_GOSSIP_STONE, true), }, { //Exits @@ -184,6 +187,7 @@ void AreaTable_Init_LostWoods() { LOCATION(RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, logic->IsChild && logic->CanStunDeku), LOCATION(RC_LW_GS_ABOVE_THEATER, logic->IsAdult && logic->AtNight && ((CanPlantBean(RR_LW_BEYOND_MIDO) && logic->CanAdultAttack) || (randoCtx->GetTrickOption(RT_LW_GS_BEAN) && logic->CanUse(RG_HOOKSHOT) && (logic->CanUse(RG_LONGSHOT) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->HasBombchus || logic->CanUse(RG_DINS_FIRE)))) && logic->CanGetNightTimeGS), LOCATION(RC_LW_GS_BEAN_PATCH_NEAR_THEATER, logic->CanPlantBugs && (logic->CanChildAttack || (randoCtx->GetOption(RSK_SHUFFLE_SCRUBS).Is(RO_SCRUBS_OFF) && logic->DekuShield))), + LOCATION(RC_LW_BOULDER_RUPEE, logic->CanBlastOrSmash), }, { //Exits Entrance(RR_LW_FOREST_EXIT, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp index 3e4480cb6c7..e01193a13be 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp @@ -166,19 +166,19 @@ void AreaTable_Init_ZorasDomain() { LOCATION(RC_ZF_BOTTOM_NORTHEAST_INNER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), LOCATION(RC_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), LOCATION(RC_ZF_BOTTOM_SOUTH_INNER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), - LOCATION(RC_ZF_BOTTOM_NORTHWEST_INNER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), LOCATION(RC_ZF_BOTTOM_NORTHWEST_INNER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), LOCATION(RC_ZF_BOTTOM_NORTH_MIDDLE_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), LOCATION(RC_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), LOCATION(RC_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), LOCATION(RC_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), - LOCATION(RC_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), LOCATION(RC_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), LOCATION(RC_ZF_BOTTOM_NORTH_OUTER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), LOCATION(RC_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), LOCATION(RC_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), LOCATION(RC_ZF_BOTTOM_SOUTH_OUTER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), - LOCATION(RC_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), LOCATION(RC_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), LOCATION(RC_ZF_FAIRY_GOSSIP_STONE, true), LOCATION(RC_ZF_JABU_GOSSIP_STONE, true), diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index db46731b0df..06aeda7760b 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -461,6 +461,7 @@ typedef enum { RR_DMC_UPPER_GROTTO, RR_DMC_HAMMER_GROTTO, RR_DMC_GREAT_FAIRY_FOUNTAIN, + RR_DMC_DISTANT_PLATFORM, RR_ZR_FRONT, RR_ZORAS_RIVER, RR_ZR_BEHIND_WATERFALL, From 066004abb55eee1289dc8579b4ab3561bade9719 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 15 Aug 2024 21:05:36 -0700 Subject: [PATCH 047/108] Add freestanding checks to Save Flags Editor --- soh/include/z64save.h | 2 +- .../Enhancements/debugger/debugSaveEditor.h | 177 +++++++++++++++++- 2 files changed, 177 insertions(+), 2 deletions(-) diff --git a/soh/include/z64save.h b/soh/include/z64save.h index 71b39a44033..64fe0b07f90 100644 --- a/soh/include/z64save.h +++ b/soh/include/z64save.h @@ -283,7 +283,7 @@ typedef struct { // #endregion // #region SOH [Randomizer] // Upstream TODO: Move these to their own struct or name to more obviously specific to Randomizer - /* */ u16 randomizerInf[(RC_MAX + 15) / 16]; + /* */ u16 randomizerInf[(RAND_INF_MAX + 15) / 16]; /* */ u8 mqDungeonCount; /* */ u16 adultTradeItems; /* */ u8 triforcePiecesCollected; diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.h b/soh/soh/Enhancements/debugger/debugSaveEditor.h index c3e01b657cd..620e126243b 100644 --- a/soh/soh/Enhancements/debugger/debugSaveEditor.h +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.h @@ -348,7 +348,7 @@ const std::vector flagTables = { { 0x24, "Market Crowd Text Randomizer" }, { 0x30, "Entered the Market" }, } }, - { "Randomizer Inf Flags", RANDOMIZER_INF, 16, { + { "Randomizer Inf Flags", RANDOMIZER_INF, (RAND_INF_MAX + 15) / 16, { { RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE, "DUNGEONS_DONE_SPIRIT_TEMPLE" }, { RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE, "DUNGEONS_DONE_SHADOW_TEMPLE" }, @@ -620,6 +620,181 @@ const std::vector flagTables = { { RAND_INF_ZF_GREAT_FAIRY_REWARD, "RAND_INF_ZF_GREAT_FAIRY_REWARD" }, { RAND_INF_COLOSSUS_GREAT_FAIRY_REWARD, "RAND_INF_COLOSSUS_GREAT_FAIRY_REWARD" }, { RAND_INF_OGC_GREAT_FAIRY_REWARD, "RAND_INF_OGC_GREAT_FAIRY_REWARD" }, + + { RAND_INF_KF_SOUTH_GRASS_WEST_RUPEE, "RAND_INF_KF_SOUTH_GRASS_WEST_RUPEE" }, + { RAND_INF_KF_NORTH_GRASS_WEST_RUPEE, "RAND_INF_KF_NORTH_GRASS_WEST_RUPEE" }, + { RAND_INF_KF_NORTH_GRASS_EAST_RUPEE, "RAND_INF_KF_NORTH_GRASS_EAST_RUPEE" }, + { RAND_INF_KF_SOUTH_GRASS_EAST_RUPEE, "RAND_INF_KF_SOUTH_GRASS_EAST_RUPEE" }, + { RAND_INF_KF_SARIAS_TOP_LEFT_HEART, "RAND_INF_KF_SARIAS_TOP_LEFT_HEART" }, + { RAND_INF_KF_SARIAS_TOP_RIGHT_HEART, "RAND_INF_KF_SARIAS_TOP_RIGHT_HEART" }, + { RAND_INF_KF_SARIAS_BOTTOM_LEFT_HEART, "RAND_INF_KF_SARIAS_BOTTOM_LEFT_HEART" }, + { RAND_INF_KF_SARIAS_BOTTOM_RIGHT_HEART, "RAND_INF_KF_SARIAS_BOTTOM_RIGHT_HEART" }, + { RAND_INF_KF_BEAN_RUPEE_1, "RAND_INF_KF_BEAN_RUPEE_1" }, + { RAND_INF_KF_BEAN_RUPEE_2, "RAND_INF_KF_BEAN_RUPEE_2" }, + { RAND_INF_KF_BEAN_RUPEE_3, "RAND_INF_KF_BEAN_RUPEE_3" }, + { RAND_INF_KF_BEAN_RUPEE_4, "RAND_INF_KF_BEAN_RUPEE_4" }, + { RAND_INF_KF_BEAN_RUPEE_5, "RAND_INF_KF_BEAN_RUPEE_5" }, + { RAND_INF_KF_BEAN_RUPEE_6, "RAND_INF_KF_BEAN_RUPEE_6" }, + { RAND_INF_KF_BEAN_RED_RUPEE, "RAND_INF_KF_BEAN_RED_RUPEE" }, + { RAND_INF_LW_SHORTCUT_RUPEE_1, "RAND_INF_LW_SHORTCUT_RUPEE_1" }, + { RAND_INF_LW_SHORTCUT_RUPEE_2, "RAND_INF_LW_SHORTCUT_RUPEE_2" }, + { RAND_INF_LW_SHORTCUT_RUPEE_3, "RAND_INF_LW_SHORTCUT_RUPEE_3" }, + { RAND_INF_LW_SHORTCUT_RUPEE_4, "RAND_INF_LW_SHORTCUT_RUPEE_4" }, + { RAND_INF_LW_SHORTCUT_RUPEE_5, "RAND_INF_LW_SHORTCUT_RUPEE_5" }, + { RAND_INF_LW_SHORTCUT_RUPEE_6, "RAND_INF_LW_SHORTCUT_RUPEE_6" }, + { RAND_INF_LW_SHORTCUT_RUPEE_7, "RAND_INF_LW_SHORTCUT_RUPEE_7" }, + { RAND_INF_LW_SHORTCUT_RUPEE_8, "RAND_INF_LW_SHORTCUT_RUPEE_8" }, + { RAND_INF_LH_FRONT_RUPEE, "RAND_INF_LH_FRONT_RUPEE" }, + { RAND_INF_LH_MIDDLE_RUPEE, "RAND_INF_LH_MIDDLE_RUPEE" }, + { RAND_INF_LH_BACK_RUPEE, "RAND_INF_LH_BACK_RUPEE" }, + { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_1, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_1" }, + { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_2, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_2" }, + { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_3, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_3" }, + { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_4, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_4" }, + { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_5, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_5" }, + { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_6, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_6" }, + { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_7, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_7" }, + { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_8, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_8" }, + { RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_BLUE_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_BLUE_RUPEE" }, + { RAND_INF_GV_OCTOROK_GROTTO_BACK_BLUE_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_BACK_BLUE_RUPEE" }, + { RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_BLUE_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_BLUE_RUPEE" }, + { RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_GREEN_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_GREEN_RUPEE" }, + { RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_GREEN_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_GREEN_RUPEE" }, + { RAND_INF_GV_OCTOROK_GROTTO_BACK_LEFT_GREEN_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_BACK_LEFT_GREEN_RUPEE" }, + { RAND_INF_GV_OCTOROK_GROTTO_BACK_RIGHT_GREEN_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_BACK_RIGHT_GREEN_RUPEE" }, + { RAND_INF_GV_OCTOROK_GROTTO_RED_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_RED_RUPEE" }, + { RAND_INF_DMT_BLUE_RUPEE, "RAND_INF_DMT_BLUE_RUPEE" }, + { RAND_INF_DMT_COW_GROTTO_LEFT_HEART, "RAND_INF_DMT_COW_GROTTO_LEFT_HEART" }, + { RAND_INF_DMT_COW_GROTTO_MIDDLE_LEFT_HEART, "RAND_INF_DMT_COW_GROTTO_MIDDLE_LEFT_HEART" }, + { RAND_INF_DMT_COW_GROTTO_MIDDLE_RIGHT_HEART, "RAND_INF_DMT_COW_GROTTO_MIDDLE_RIGHT_HEART" }, + { RAND_INF_DMT_COW_GROTTO_RIGHT_HEART, "RAND_INF_DMT_COW_GROTTO_RIGHT_HEART" }, + { RAND_INF_DMT_COW_GROTTO_RUPEE_1, "RAND_INF_DMT_COW_GROTTO_RUPEE_1" }, + { RAND_INF_DMT_COW_GROTTO_RUPEE_2, "RAND_INF_DMT_COW_GROTTO_RUPEE_2" }, + { RAND_INF_DMT_COW_GROTTO_RUPEE_3, "RAND_INF_DMT_COW_GROTTO_RUPEE_3" }, + { RAND_INF_DMT_COW_GROTTO_RUPEE_4, "RAND_INF_DMT_COW_GROTTO_RUPEE_4" }, + { RAND_INF_DMT_COW_GROTTO_RUPEE_5, "RAND_INF_DMT_COW_GROTTO_RUPEE_5" }, + { RAND_INF_DMT_COW_GROTTO_RUPEE_6, "RAND_INF_DMT_COW_GROTTO_RUPEE_6" }, + { RAND_INF_DMT_COW_GROTTO_RED_RUPEE, "RAND_INF_DMT_COW_GROTTO_RED_RUPEE" }, + { RAND_INF_DMC_NEAR_PLATFORM_RED_RUPEE, "RAND_INF_DMC_NEAR_PLATFORM_RED_RUPEE" }, + { RAND_INF_DMC_MIDDLE_PLATFORM_RED_RUPEE, "RAND_INF_DMC_MIDDLE_PLATFORM_RED_RUPEE" }, + { RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_1, "RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_1" }, + { RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_2, "RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_2" }, + { RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_3, "RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_3" }, + { RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_4, "RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_4" }, + { RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_5, "RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_5" }, + { RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_6, "RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_6" }, + { RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_1, "RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_1" }, + { RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_2, "RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_2" }, + { RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_3, "RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_3" }, + { RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_4, "RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_4" }, + { RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_5, "RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_5" }, + { RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_6, "RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_6" }, + { RAND_INF_DMC_DISTANT_PLATFORM_RED_RUPEE, "RAND_INF_DMC_DISTANT_PLATFORM_RED_RUPEE" }, + { RAND_INF_ZR_BENEATH_WATERFALL_LEFT_RUPEE, "RAND_INF_ZR_BENEATH_WATERFALL_LEFT_RUPEE" }, + { RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_LEFT_RUPEE, "RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_LEFT_RUPEE" }, + { RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_RIGHT_RUPEE, "RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_RIGHT_RUPEE" }, + { RAND_INF_ZR_BENEATH_WATERFALL_RIGHT_RUPEE, "RAND_INF_ZR_BENEATH_WATERFALL_RIGHT_RUPEE" }, + { RAND_INF_ZF_BOTTOM_NORTH_INNER_RUPEE, "RAND_INF_ZF_BOTTOM_NORTH_INNER_RUPEE" }, + { RAND_INF_ZF_BOTTOM_NORTHEAST_INNER_RUPEE, "RAND_INF_ZF_BOTTOM_NORTHEAST_INNER_RUPEE" }, + { RAND_INF_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE" }, + { RAND_INF_ZF_BOTTOM_SOUTH_INNER_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTH_INNER_RUPEE" }, + { RAND_INF_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE" }, + { RAND_INF_ZF_BOTTOM_NORTHWEST_INNER_RUPEE, "RAND_INF_ZF_BOTTOM_NORTHWEST_INNER_RUPEE" }, + { RAND_INF_ZF_BOTTOM_NORTH_MIDDLE_RUPEE, "RAND_INF_ZF_BOTTOM_NORTH_MIDDLE_RUPEE" }, + { RAND_INF_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE, "RAND_INF_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE" }, + { RAND_INF_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE" }, + { RAND_INF_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE" }, + { RAND_INF_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE" }, + { RAND_INF_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE, "RAND_INF_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE" }, + { RAND_INF_ZF_BOTTOM_NORTH_OUTER_RUPEE, "RAND_INF_ZF_BOTTOM_NORTH_OUTER_RUPEE" }, + { RAND_INF_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE, "RAND_INF_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE" }, + { RAND_INF_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE" }, + { RAND_INF_ZF_BOTTOM_SOUTH_OUTER_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTH_OUTER_RUPEE" }, + { RAND_INF_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE" }, + { RAND_INF_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE, "RAND_INF_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE" }, + { RAND_INF_DEKU_TREE_LOBBY_LOWER_HEART, "RAND_INF_DEKU_TREE_LOBBY_LOWER_HEART" }, + { RAND_INF_DEKU_TREE_LOBBY_UPPER_HEART, "RAND_INF_DEKU_TREE_LOBBY_UPPER_HEART" }, + { RAND_INF_DEKU_TREE_BEFORE_BOSS_LEFT_HEART, "RAND_INF_DEKU_TREE_BEFORE_BOSS_LEFT_HEART" }, + { RAND_INF_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART, "RAND_INF_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART" }, + { RAND_INF_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART, "RAND_INF_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART" }, + { RAND_INF_DODONGOS_CAVERN_BLADE_ROOM_HEART, "RAND_INF_DODONGOS_CAVERN_BLADE_ROOM_HEART" }, + { RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART, "RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART" }, + { RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART, "RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART" }, + { RAND_INF_FOREST_TEMPLE_COURTYARD_RIGHT_HEART, "RAND_INF_FOREST_TEMPLE_COURTYARD_RIGHT_HEART" }, + { RAND_INF_FOREST_TEMPLE_COURTYARD_LEFT_HEART, "RAND_INF_FOREST_TEMPLE_COURTYARD_LEFT_HEART" }, + { RAND_INF_FOREST_TEMPLE_WELL_WEST_HEART, "RAND_INF_FOREST_TEMPLE_WELL_WEST_HEART" }, + { RAND_INF_FOREST_TEMPLE_WELL_EAST_HEART, "RAND_INF_FOREST_TEMPLE_WELL_EAST_HEART" }, + { RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_LEFT_HEART, "RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_LEFT_HEART" }, + { RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_RIGHT_HEART, "RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_RIGHT_HEART" }, + { RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_BACK_HEART, "RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_BACK_HEART" }, + { RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_LEFT_HEART, "RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_LEFT_HEART" }, + { RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_RIGHT_HEART, "RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_RIGHT_HEART" }, + { RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_MIDDLE_HEART, "RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_MIDDLE_HEART" }, + { RAND_INF_FIRE_TEMPLE_FIRE_WALL_EAST_HEART, "RAND_INF_FIRE_TEMPLE_FIRE_WALL_EAST_HEART" }, + { RAND_INF_FIRE_TEMPLE_FIRE_WALL_WEST_HEART, "RAND_INF_FIRE_TEMPLE_FIRE_WALL_WEST_HEART" }, + { RAND_INF_FIRE_TEMPLE_FIRE_WALL_EXIT_HEART, "RAND_INF_FIRE_TEMPLE_FIRE_WALL_EXIT_HEART" }, + { RAND_INF_WATER_TEMPLE_RIVER_HEART_1, "RAND_INF_WATER_TEMPLE_RIVER_HEART_1" }, + { RAND_INF_WATER_TEMPLE_RIVER_HEART_2, "RAND_INF_WATER_TEMPLE_RIVER_HEART_2" }, + { RAND_INF_WATER_TEMPLE_RIVER_HEART_3, "RAND_INF_WATER_TEMPLE_RIVER_HEART_3" }, + { RAND_INF_WATER_TEMPLE_RIVER_HEART_4, "RAND_INF_WATER_TEMPLE_RIVER_HEART_4" }, + { RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_LEFT_HEART, "RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_LEFT_HEART" }, + { RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART, "RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART" }, + { RAND_INF_SHADOW_TEMPLE_SCARECROW_NORTH_HEART, "RAND_INF_SHADOW_TEMPLE_SCARECROW_NORTH_HEART" }, + { RAND_INF_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART, "RAND_INF_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART" }, + { RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART, "RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART" }, + { RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART, "RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART" }, + { RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART, "RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART" }, + { RAND_INF_ICE_CAVERN_LOBBY_RUPEE, "RAND_INF_ICE_CAVERN_LOBBY_RUPEE" }, + { RAND_INF_ICE_CAVERN_MAP_ROOM_LEFT_HEART, "RAND_INF_ICE_CAVERN_MAP_ROOM_LEFT_HEART" }, + { RAND_INF_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART, "RAND_INF_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART" }, + { RAND_INF_ICE_CAVERN_MAP_ROOM_RIGHT_HEART, "RAND_INF_ICE_CAVERN_MAP_ROOM_RIGHT_HEART" }, + { RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1, "RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1" }, + { RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2, "RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2" }, + { RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3, "RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3" }, + { RAND_INF_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART, "RAND_INF_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART" }, + { RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART, "RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART" }, + { RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART, "RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART" }, + { RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_1, "RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_1" }, + { RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_2, "RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_2" }, + { RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_3, "RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_3" }, + { RAND_INF_GANONS_CASTLE_FIRE_TRIAL_HEART, "RAND_INF_GANONS_CASTLE_FIRE_TRIAL_HEART" }, + { RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_HEART, "RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_HEART" }, + { RAND_INF_DEKU_TREE_MQ_COMPASS_ROOM_HEART, "RAND_INF_DEKU_TREE_MQ_COMPASS_ROOM_HEART" }, + { RAND_INF_DEKU_TREE_MQ_DEKU_BABA_HEART, "RAND_INF_DEKU_TREE_MQ_DEKU_BABA_HEART" }, + { RAND_INF_DEKU_TREE_MQ_LOBBY_HEART, "RAND_INF_DEKU_TREE_MQ_LOBBY_HEART" }, + { RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART, "RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART" }, + { RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART, "RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART" }, + { RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART, "RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART" }, + { RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART, "RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART" }, + { RAND_INF_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_HEART, "RAND_INF_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_HEART" }, + { RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_1, "RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_1" }, + { RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_2, "RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_2" }, + { RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART, "RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART" }, + { RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART, "RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART" }, + { RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART, "RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART" }, + { RAND_INF_FOREST_TEMPLE_WELL_MQ_WEST_HEART, "RAND_INF_FOREST_TEMPLE_WELL_MQ_WEST_HEART" }, + { RAND_INF_FOREST_TEMPLE_WELL_MQ_MIDDLE_HEART, "RAND_INF_FOREST_TEMPLE_WELL_MQ_MIDDLE_HEART" }, + { RAND_INF_FOREST_TEMPLE_WELL_MQ_EAST_HEART, "RAND_INF_FOREST_TEMPLE_WELL_MQ_EAST_HEART" }, + { RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART" }, + { RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART" }, + { RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART" }, + { RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_LEFT_HEART, "RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_LEFT_HEART" }, + { RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_RIGHT_HEART, "RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_RIGHT_HEART" }, + { RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_NORTH_HEART, "RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_NORTH_HEART" }, + { RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_SOUTH_HEART, "RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_SOUTH_HEART" }, + { RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART, "RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART" }, + { RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART, "RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART" }, + { RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART, "RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART" }, + { RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART" }, + { RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART" }, + { RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART" }, + { RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_MIDDLE_LEFT_HEART, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_MIDDLE_LEFT_HEART" }, + { RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART" }, + { RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART" }, + { RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART" }, + { RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_HEART, "RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_HEART" }, + { RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART, "RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART" }, + { RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART, "RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART" }, } }, }; From 7affcb4b4462d787f85712eb652e0381d8a03ee8 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 15 Aug 2024 22:49:27 -0700 Subject: [PATCH 048/108] Fix flags for Zora Fountain underwater rupees --- soh/soh/Enhancements/randomizer/location_list.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 9212a48deaa..67dc83eda6f 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -1718,19 +1718,19 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_ZF_BOTTOM_NORTHEAST_INNER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHEAST_INNER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2100, 0x21, "Bottom Northeast Inner Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHEAST_INNER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); locationTable[RC_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2200, 0x22, "Bottom Southeast Inner Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); locationTable[RC_ZF_BOTTOM_SOUTH_INNER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTH_INNER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2300, 0x23, "Bottom South Inner Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTH_INNER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[RC_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2400, 0x24, "Bottom Southwest Inner Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHWEST_INNER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2400, 0x24, "Bottom Southwest Inner Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); locationTable[RC_ZF_BOTTOM_NORTHWEST_INNER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHWEST_INNER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2500, 0x25, "Bottom Northwest Inner Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHWEST_INNER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); locationTable[RC_ZF_BOTTOM_NORTH_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTH_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2600, 0x26, "Bottom North Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTH_MIDDLE_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); locationTable[RC_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2700, 0x27, "Bottom Northeast Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); locationTable[RC_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2800, 0x28, "Bottom Southeast Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); locationTable[RC_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2900, 0x29, "Bottom South Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[RC_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2A00, 0x2A, "Bottom Southwest Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2A00, 0x2A, "Bottom Southwest Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); locationTable[RC_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2B00, 0x2B, "Bottom Northwest Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); locationTable[RC_ZF_BOTTOM_NORTH_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTH_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2C00, 0x2C, "Bottom North Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTH_OUTER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); locationTable[RC_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2D00, 0x2D, "Bottom Northeast Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); locationTable[RC_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2E00, 0x2E, "Bottom Southeast Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); locationTable[RC_ZF_BOTTOM_SOUTH_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTH_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2F00, 0x2F, "Bottom South Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTH_OUTER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[RC_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x3000, 0x30, "Bottom Southwest Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x3000, 0x30, "Bottom Southwest Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); locationTable[RC_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x3100, 0x31, "Bottom Northwest Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); locationTable[RC_DEKU_TREE_LOBBY_LOWER_HEART] = Location::Collectable(RC_DEKU_TREE_LOBBY_LOWER_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x2C03, 0x2C, "Lobby Lower Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_LOWER_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); From 0075f26abd8026e823bcd91296537e473554dcb5 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 15 Aug 2024 23:35:34 -0700 Subject: [PATCH 049/108] Add option to enable freestanding shuffle for either dungeons or overworld --- .../randomizer/3drando/item_pool.cpp | 5 ++-- .../randomizer/randomizer_check_tracker.cpp | 30 +++++++++++++++++++ soh/soh/Enhancements/randomizer/settings.cpp | 2 +- 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index 01827c0cd37..a3afc41e746 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -620,9 +620,10 @@ static void PlaceVanillaOverworldFish() { static void PlaceFreestandingItems() { auto ctx = Rando::Context::GetInstance(); + auto option = ctx->GetOption(RSK_SHUFFLE_FREESTANDING); for (RandomizerCheck loc : ctx->GetLocations(Rando::StaticData::overworldLocations, Category::cFreestanding)) { RandomizerGet vanillaItem = Rando::StaticData::GetLocation(loc)->GetVanillaItem(); - if (ctx->GetOption(RSK_SHUFFLE_FREESTANDING)) { + if (option.Is(RO_TOKENSANITY_OVERWORLD) || option.Is(RO_TOKENSANITY_ALL)) { AddItemToMainPool(vanillaItem); } else { ctx->PlaceItemInLocation(loc, vanillaItem, false, true); @@ -632,7 +633,7 @@ static void PlaceFreestandingItems() { for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { for (RandomizerCheck loc : ctx->GetLocations(dungeon->GetDungeonLocations(), Category::cFreestanding)) { RandomizerGet vanillaItem = Rando::StaticData::GetLocation(loc)->GetVanillaItem(); - if (ctx->GetOption(RSK_SHUFFLE_FREESTANDING)) { + if (option.Is(RO_TOKENSANITY_DUNGEONS) || option.Is(RO_TOKENSANITY_ALL)) { AddItemToMainPool(vanillaItem); } else { ctx->PlaceItemInLocation(loc, vanillaItem, false, true); diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index de46a449630..dbd46e31411 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -62,6 +62,8 @@ bool showScrubs; bool showMerchants; bool showBeehives; bool showCows; +bool showOverworldFreestanding; +bool showDungeonFreestanding; bool showAdultTrade; bool showKokiriSword; bool showMasterSword; @@ -1249,6 +1251,30 @@ void LoadSettings() { fishsanityMode = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY); fishsanityPondCount = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY_POND_COUNT); fishsanityAgeSplit = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY_AGE_SPLIT); + + if (IS_RANDO) { + switch (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_FREESTANDING)) { + case RO_TOKENSANITY_ALL: + showOverworldFreestanding = true; + showDungeonFreestanding = true; + break; + case RO_TOKENSANITY_OVERWORLD: + showOverworldFreestanding = true; + showDungeonFreestanding = false; + break; + case RO_TOKENSANITY_DUNGEONS: + showOverworldFreestanding = false; + showDungeonFreestanding = true; + break; + default: + showOverworldFreestanding = false; + showDungeonFreestanding = false; + break; + } + } else { // Vanilla + showOverworldFreestanding = false; + showDungeonFreestanding = true; + } } bool IsCheckShuffled(RandomizerCheck rc) { @@ -1284,6 +1310,10 @@ bool IsCheckShuffled(RandomizerCheck rc) { ) && (loc->GetRCType() != RCTYPE_COW || showCows) && (loc->GetRCType() != RCTYPE_FISH || OTRGlobals::Instance->gRandoContext->GetFishsanity()->GetFishLocationIncluded(loc)) && + (loc->GetRCType() != RCTYPE_FREESTANDING || + (showOverworldFreestanding && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || + (showDungeonFreestanding && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea())) + ) && (loc->GetRCType() != RCTYPE_ADULT_TRADE || showAdultTrade || rc == RC_KAK_ANJU_AS_ADULT || // adult trade checks that are always shuffled diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index 6fe181619d0..4208b121117 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -122,7 +122,7 @@ void Settings::CreateOptions() { mOptions[RSK_SHUFFLE_BOSS_SOULS] = Option::U8("Shuffle Boss Souls", {"Off", "On", "On + Ganon"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleBossSouls"), mOptionDescriptions[RSK_SHUFFLE_BOSS_SOULS], WidgetType::Combobox); mOptions[RSK_SHUFFLE_DEKU_STICK_BAG] = Option::Bool("Shuffle Deku Stick Bag", CVAR_RANDOMIZER_SETTING("ShuffleDekuStickBag"), mOptionDescriptions[RSK_SHUFFLE_DEKU_STICK_BAG], IMFLAG_SEPARATOR_BOTTOM, WidgetType::Checkbox, RO_GENERIC_OFF); mOptions[RSK_SHUFFLE_DEKU_NUT_BAG] = Option::Bool("Shuffle Deku Nut Bag", CVAR_RANDOMIZER_SETTING("ShuffleDekuNutBag"), mOptionDescriptions[RSK_SHUFFLE_DEKU_NUT_BAG], IMFLAG_SEPARATOR_BOTTOM, WidgetType::Checkbox, RO_GENERIC_OFF); - mOptions[RSK_SHUFFLE_FREESTANDING] = Option::Bool("Shuffle Freestanding Items", CVAR_RANDOMIZER_SETTING("ShuffleFreestanding"), mOptionDescriptions[RSK_SHUFFLE_FREESTANDING], IMFLAG_SEPARATOR_BOTTOM, WidgetType::Checkbox, RO_GENERIC_OFF); + mOptions[RSK_SHUFFLE_FREESTANDING] = Option::U8("Shuffle Freestanding Items", {"Off", "Dungeons", "Overworld", "All Items"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleFreestanding"), mOptionDescriptions[RSK_SHUFFLE_FREESTANDING], WidgetType::Combobox, RO_TOKENSANITY_OFF); mOptions[RSK_FISHSANITY] = Option::U8("Fishsanity", {"Off", "Shuffle only Hyrule Loach", "Shuffle Fishing Pond", "Shuffle Overworld Fish", "Shuffle Both"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("Fishsanity"), mOptionDescriptions[RSK_FISHSANITY], WidgetType::Combobox, RO_FISHSANITY_OFF); mOptions[RSK_FISHSANITY_POND_COUNT] = Option::U8("Pond Fish Count", {NumOpts(0,17,1)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("FishsanityPondCount"), mOptionDescriptions[RSK_FISHSANITY_POND_COUNT], WidgetType::Slider, 0, true, IMFLAG_NONE); mOptions[RSK_FISHSANITY_AGE_SPLIT] = Option::Bool("Pond Age Split", CVAR_RANDOMIZER_SETTING("FishsanityAgeSplit"), mOptionDescriptions[RSK_FISHSANITY_AGE_SPLIT]); From 6dfb5c7ed0679f682872efdec18cd5bb01f9eff1 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Fri, 16 Aug 2024 15:04:56 -0700 Subject: [PATCH 050/108] Add missing MQ checks and fix mac & windows compile error --- soh/soh/Enhancements/randomizer/3drando/item_pool.cpp | 2 +- .../randomizer/3drando/location_access/locacc_fire_temple.cpp | 3 +++ .../3drando/location_access/locacc_ganons_castle.cpp | 2 ++ soh/soh/Enhancements/randomizer/hook_handlers.cpp | 2 +- 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index a3afc41e746..0d121781ac5 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -633,7 +633,7 @@ static void PlaceFreestandingItems() { for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { for (RandomizerCheck loc : ctx->GetLocations(dungeon->GetDungeonLocations(), Category::cFreestanding)) { RandomizerGet vanillaItem = Rando::StaticData::GetLocation(loc)->GetVanillaItem(); - if (option.Is(RO_TOKENSANITY_DUNGEONS) || option.Is(RO_TOKENSANITY_ALL)) { + if (option.Is(RO_TOKENSANITY_DUNGEONS) || option.Is(RO_TOKENSANITY_ALL)) { AddItemToMainPool(vanillaItem); } else { ctx->PlaceItemInLocation(loc, vanillaItem, false, true); diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp index 531d911a178..94c7dfa4f6c 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp @@ -361,6 +361,9 @@ void AreaTable_Init_FireTemple() { LOCATION(RC_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, logic->HasFireSource && logic->HasExplosives && logic->IsAdult && (logic->CanUse(RG_HOOKSHOT) || randoCtx->GetTrickOption(RT_FIRE_MQ_BLOCKED_CHEST))), //Trick: logic->HasFireSource && logic->HasExplosives && logic->IsAdult && (logic->CanUse(RG_HOOKSHOT) || LogicFireMQBlockedChest) LOCATION(RC_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, true), + LOCATION(RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART, logic->CanUse(RG_GORON_TUNIC) && logic->SmallKeys(RR_FIRE_TEMPLE, 1)), + LOCATION(RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART, logic->CanUse(RG_GORON_TUNIC) && logic->SmallKeys(RR_FIRE_TEMPLE, 1)), + LOCATION(RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART, logic->CanUse(RG_GORON_TUNIC) && logic->SmallKeys(RR_FIRE_TEMPLE, 1)), }, { //Exits Entrance(RR_FIRE_TEMPLE_MQ_LOWER_MAZE, {[]{return logic->IsAdult && logic->CanUse(RG_GORON_TUNIC) && logic->SmallKeys(RR_FIRE_TEMPLE, 2) && (logic->HasFireSource || (randoCtx->GetTrickOption(RT_FIRE_MQ_CLIMB) && logic->HoverBoots));}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp index 6ca88bdaa1b..5a5d4b25df9 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp @@ -220,6 +220,8 @@ void AreaTable_Init_GanonsCastle() { }, { //Locations LOCATION(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, (logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_BIGGORON_SWORD)) && logic->CanUse(RG_ZELDAS_LULLABY)), + LOCATION(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART, (logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_BIGGORON_SWORD)) && logic->SmallKeys(RR_GANONS_CASTLE, 2)), + LOCATION(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART, (logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_BIGGORON_SWORD)) && logic->SmallKeys(RR_GANONS_CASTLE, 2)), }, {}); } } diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index a2816a15cf8..91a97c9fc1e 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -677,7 +677,7 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void item00->actor.params = ITEM00_SOH_DUMMY; item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem; if (loc->GetCollectionCheck().type == SPOILER_CHK_RANDOMIZER_INF) { - item00->randoInf = loc->GetCollectionCheck().flag; + item00->randoInf = static_cast(loc->GetCollectionCheck().flag); } *should = Rando::Context::GetInstance()->GetItemLocation(loc->GetRandomizerCheck())->HasObtained(); } From bcc10ea028537c13b67d3ac2306e8df0d8c43adb Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Fri, 16 Aug 2024 16:10:34 -0700 Subject: [PATCH 051/108] Improve description and add hint text --- .../hint_list/hint_list_exclude_dungeon.cpp | 62 +++++++++++++++++++ .../hint_list/hint_list_exclude_overworld.cpp | 60 ++++++++++++++++++ .../Enhancements/randomizer/location_list.cpp | 16 ++--- .../randomizer/option_descriptions.cpp | 14 +++-- .../Enhancements/randomizer/randomizerTypes.h | 1 + 5 files changed, 141 insertions(+), 12 deletions(-) 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 b86b8f33e15..4531d49783f 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 @@ -117,6 +117,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*french*/ "Selon moi, la #peste Mojo dans l'Arbre Mojo# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #deku del Gran Árbol Deku# vende #[[1]]#. + hintTextTable[RHT_DEKU_TREE_HEART] = HintText(CustomMessage("They say that a #heart in the Deku Tree# hides #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + /*-------------------------- | DODONGOS CAVERN | ---------------------------*/ @@ -275,6 +279,10 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The /*french*/ "Selon moi, la #peste Mojo au coeur de la Caverne Dodongo# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #deku custodiado por Lizalfos# vende #[[1]]#. + hintTextTable[RHT_DODONGOS_CAVERN_HEART] = HintText(CustomMessage("They say that a #heart in Dodongo's Cavern# hides #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + /*-------------------------- | JABU JABUS BELLY | ---------------------------*/ @@ -421,6 +429,15 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The /*german*/ "", /*french*/ "Selon moi, la #peste Mojo dans le ventre du gardien# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #deku dentro de cierta deidad# vende #[[1]]#. + + hintTextTable[RHT_JABU_JABU_RUPEE] = HintText(CustomMessage("They say that #underwater in Jabu-Jabu's Belly# lies #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_JABU_JABU_HEART] = HintText(CustomMessage("They say that near a #central lift in Jabu-Jabu's Belly# lies #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + /*-------------------------- | FOREST TEMPLE | ---------------------------*/ @@ -643,6 +660,10 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The /*french*/ "Selon moi, une #Skulltula au fond du Puits du Temple de la Forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #vaciar el pozo# del Templo del Bosque desvela una Skulltula que otorga #[[1]]#. + hintTextTable[RHT_FOREST_TEMPLE_HEART] = HintText(CustomMessage("They say that a #heart in the Forest Temple# hides #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + /*-------------------------- | FIRE TEMPLE | ---------------------------*/ @@ -831,6 +852,10 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa /*french*/ "Selon moi, une #Skulltula près du labyrinthe enflammé du Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula junto a un ardiente laberinto# otorga #[[1]]#. + hintTextTable[RHT_FIRE_TEMPLE_HEART] = HintText(CustomMessage("They say that a #heart in the Fire Temple# hides #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + /*-------------------------- | WATER TEMPLE | ---------------------------*/ @@ -958,6 +983,10 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa /*french*/ "Selon moi, une #Skulltula au dessus de la rivière du Temple de l'Eau# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula sobre un río# del Templo del Agua otorga #[[1]]#. + hintTextTable[RHT_WATER_TEMPLE_HEART] = HintText(CustomMessage("They say that in a #river in the Water Temple# lies #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + /*-------------------------- | SPIRIT TEMPLE | ---------------------------*/ @@ -1191,6 +1220,10 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa /*french*/ "Selon moi, une #Skulltula sur une paroi de verre du Temple de l'Esprit# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #sobre una plataforma de cristal# yace una Skulltula que otorga #[[1]]#. + hintTextTable[RHT_SPIRIT_TEMPLE_HEART] = HintText(CustomMessage("They say that on a #small platform# in the Spirit Temple lies #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + /*-------------------------- | SHADOW TEMPLE | ---------------------------*/ @@ -1434,6 +1467,10 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th /*french*/ "Selon moi, une #Skulltula près du repère du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula flotante# del Templo de las Sombras otorga #[[1]]#. + hintTextTable[RHT_SHADOW_TEMPLE_HEART] = HintText(CustomMessage("They say that a #heart in the Shadow Temple# hides #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + /*-------------------------- | BOTTOM OF THE WELL | ---------------------------*/ @@ -1552,6 +1589,14 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th /*french*/ "Selon moi, une #Skulltula embarrée dans la crypte au fonds du Puits# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula encerrada en una cripta# del pozo otorga #[[1]]#. + hintTextTable[RHT_BOTTOM_OF_THE_WELL_HEART] = HintText(CustomMessage("They say that a #heart within the well# hides #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_BOTTOM_OF_THE_WELL_RUPEE] = HintText(CustomMessage("They say that a #hidden path through the floor# the well# leads to #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + /*-------------------------- | ICE CAVERN | ---------------------------*/ @@ -1625,6 +1670,14 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th /*french*/ "Selon moi, une #Skulltula figée dans la glace rouge# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula tras un ardiente hielo# otorga #[[1]]#. + hintTextTable[RHT_ICE_CAVERN_HEART] = HintText(CustomMessage("They say that atop on a #frozen pillar# lies #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_ICE_CAVERN_RUPEE] = HintText(CustomMessage("They say that a #rupee in a frozen cavern# hides #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + /*-------------------------- | GERUDO TRAINING GROUNDS | ---------------------------*/ @@ -1803,6 +1856,10 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th /*french*/ "Selon moi, #derrière un bloc argent# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #hazaña de fuerza# premia a las bandidas con #[[1]]#. + hintTextTable[RHT_GERUDO_TRAINING_GROUNDS_HEART] = HintText(CustomMessage("They say that a watching a #trial with Dinalfos# is #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + /*-------------------------- | GANONS CASTLE | ---------------------------*/ @@ -1995,5 +2052,10 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th /*german*/ "", /*french*/ "Selon moi, les #pestes Mojo dans le Château de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. + + hintTextTable[RHT_GANONS_CASTLE_HEART] = HintText(CustomMessage("They say that a #heart in Ganon's Castle# hides #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + } } diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp index 570101b4e00..21df002bdaf 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp @@ -1487,5 +1487,65 @@ void StaticData::HintTable_Init_Exclude_Overworld() { /*german*/ "", /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #colmena detrás del rey de los zoras# esconde #[[1]]#. + hintTextTable[RHT_KOKIRI_FOREST_RUPEE] = HintText(CustomMessage("They say that a rupee in a #tranquil forest# hides #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + // /*spanish*/ + hintTextTable[RHT_KOKIRI_FOREST_HEART] = HintText(CustomMessage("They say that a heart in a #tranquil forest# hides #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + // /*spanish*/ + hintTextTable[RHT_SARIAS_HOUSE_HEART] = HintText(CustomMessage("They say that a heart in a #dear friend's home# hides #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + // /*spanish*/ + hintTextTable[RHT_LOST_WOODS_RUPEE] = HintText(CustomMessage("They say that under a #boulder in the woods# lies #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + // /*spanish*/ + hintTextTable[RHT_LOST_WOODS_SHORTCUT_RUPEE] = HintText(CustomMessage("They say that in a #pool of water in the woods# lies #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + // /*spanish*/ + hintTextTable[RHT_LAKE_HYLIA_RUPEE] = HintText(CustomMessage("They say that just off the #coast of a lake# lies #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + // /*spanish*/ + hintTextTable[RHT_LABORATORY_RUPEE] = HintText(CustomMessage("They say that at the #bottom of a tank# lies #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + // /*spanish*/ + hintTextTable[RHT_DAMPES_GRAVE_RUPEE] = HintText(CustomMessage("They say that within a #quick-footed spirit's grave# lies #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + // /*spanish*/ + hintTextTable[RHT_GERUDO_VALLEY_GROTTO_RUPEE] = HintText(CustomMessage("They say that an Octarok in an #underground spring# guards #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + // /*spanish*/ + hintTextTable[RHT_DEATH_MOUNTAIN_TRAIL_RUPEE] = HintText(CustomMessage("They say that beneath a boulder on a #mountain's cliffside# lies #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + // /*spanish*/ + hintTextTable[RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_HEART] = HintText(CustomMessage("They say that accompanying a #cow in a small cave# is #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + // /*spanish*/ + hintTextTable[RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_RUPEE] = HintText(CustomMessage("They say that accompanying a #cow in a small cave# is #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + // /*spanish*/ + hintTextTable[RHT_DEATH_MOUNTAIN_CRATER_RUPEE] = HintText(CustomMessage("They say that on a #small platform suspended above lava# lies #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + // /*spanish*/ + hintTextTable[RHT_ZORAS_RIVER_WATERFALL_RUPEE] = HintText(CustomMessage("They say that beneath a #waterfall feeding a narrow river# lies #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + // /*spanish*/ + hintTextTable[RHT_ZORAS_FOUNTAIN_RUPEE] = HintText(CustomMessage("They say that at the bottom of a #partially-frozen spring# lies #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + // /*spanish*/ } } \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 67dc83eda6f..efe16dbe294 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -1645,14 +1645,14 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_KF_BEAN_RED_RUPEE] = Location::Collectable(RC_KF_BEAN_RED_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(1304, -548), 0, "Bean Platform Red Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_RED_RUPEE), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); locationTable[RC_LW_BOULDER_RUPEE] = Location::Collectable(RC_LW_BOULDER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x1301, 0x13, "Boulder Rupee", RHT_LOST_WOODS_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[RC_LW_SHORTCUT_RUPEE_1] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_1, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3400, 0x34, "Underwater Shortcut Rupee 1", RHT_LOST_WOODS_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_1), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[RC_LW_SHORTCUT_RUPEE_2] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3500, 0x35, "Underwater Shortcut Rupee 2", RHT_LOST_WOODS_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_2), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[RC_LW_SHORTCUT_RUPEE_3] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_3, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3600, 0x36, "Underwater Shortcut Rupee 3", RHT_LOST_WOODS_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_3), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[RC_LW_SHORTCUT_RUPEE_4] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_4, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3700, 0x37, "Underwater Shortcut Rupee 4", RHT_LOST_WOODS_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_4), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[RC_LW_SHORTCUT_RUPEE_5] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_5, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3900, 0x39, "Underwater Shortcut Rupee 5", RHT_LOST_WOODS_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_5), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[RC_LW_SHORTCUT_RUPEE_6] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_6, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3A00, 0x3A, "Underwater Shortcut Rupee 6", RHT_LOST_WOODS_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_6), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[RC_LW_SHORTCUT_RUPEE_7] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_7, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3B00, 0x3B, "Underwater Shortcut Rupee 7", RHT_LOST_WOODS_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_7), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[RC_LW_SHORTCUT_RUPEE_8] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_8, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3C00, 0x3C, "Underwater Shortcut Rupee 8", RHT_LOST_WOODS_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_8), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_SHORTCUT_RUPEE_1] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_1, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3400, 0x34, "Underwater Shortcut Rupee 1", RHT_LOST_WOODS_SHORTCUT_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_1), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_SHORTCUT_RUPEE_2] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3500, 0x35, "Underwater Shortcut Rupee 2", RHT_LOST_WOODS_SHORTCUT_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_2), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_SHORTCUT_RUPEE_3] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_3, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3600, 0x36, "Underwater Shortcut Rupee 3", RHT_LOST_WOODS_SHORTCUT_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_3), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_SHORTCUT_RUPEE_4] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_4, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3700, 0x37, "Underwater Shortcut Rupee 4", RHT_LOST_WOODS_SHORTCUT_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_4), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_SHORTCUT_RUPEE_5] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_5, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3900, 0x39, "Underwater Shortcut Rupee 5", RHT_LOST_WOODS_SHORTCUT_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_5), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_SHORTCUT_RUPEE_6] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_6, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3A00, 0x3A, "Underwater Shortcut Rupee 6", RHT_LOST_WOODS_SHORTCUT_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_6), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_SHORTCUT_RUPEE_7] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_7, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3B00, 0x3B, "Underwater Shortcut Rupee 7", RHT_LOST_WOODS_SHORTCUT_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_7), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_SHORTCUT_RUPEE_8] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_8, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3C00, 0x3C, "Underwater Shortcut Rupee 8", RHT_LOST_WOODS_SHORTCUT_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_8), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); locationTable[RC_LH_FRONT_RUPEE] = Location::Collectable(RC_LH_FRONT_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LAKE_HYLIA, ACTOR_EN_ITEM00, SCENE_LAKE_HYLIA, 0x2000, 0x20, "Underwater Front Rupee", RHT_LAKE_HYLIA_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_FRONT_RUPEE), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); locationTable[RC_LH_MIDDLE_RUPEE] = Location::Collectable(RC_LH_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LAKE_HYLIA, ACTOR_EN_ITEM00, SCENE_LAKE_HYLIA, 0x2100, 0x21, "Underwater Middle Rupee", RHT_LAKE_HYLIA_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_MIDDLE_RUPEE), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); diff --git a/soh/soh/Enhancements/randomizer/option_descriptions.cpp b/soh/soh/Enhancements/randomizer/option_descriptions.cpp index a956fac0170..73969417d82 100644 --- a/soh/soh/Enhancements/randomizer/option_descriptions.cpp +++ b/soh/soh/Enhancements/randomizer/option_descriptions.cpp @@ -336,10 +336,16 @@ void Settings::CreateOptionDescriptions() { "have collected all 100 Gold Skulltula Tokens.\n" "\n" "You can still talk to him multiple times to get Huge Rupees."; - mOptionDescriptions[RSK_SHUFFLE_FREESTANDING] = - "Freestanding rupees & hearts are shuffles to random items.\n" - "\n" - "Freestanding heart pieces and small keys are already shuffled by default."; + mOptionDescriptions[RSK_SHUFFLE_FREESTANDING] = "Freestanding rupees & hearts are shuffles to random items. " + "Freestanding heart pieces and small keys are already shuffled by default.\n" + "\n" + "Off - freestanding rupees & hearts will not be shuffled.\n" + "\n" + "Dungeons - Only freestanding rupees & hearts that are within dungeons.\n" + "\n" + "Overworld - Only freestanding rupees & hearts that are outside of dungeons.\n" + "\n" + "All Items - Shuffle all freestanding rupees & hearts."; mOptionDescriptions[RSK_SHUFFLE_DUNGEON_REWARDS] = "Shuffles the location of spiritual stones and medallions.\n" "\n" diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 06aeda7760b..8ec30ede4fd 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -3850,6 +3850,7 @@ typedef enum { RHT_KOKIRI_FOREST_HEART, RHT_SARIAS_HOUSE_HEART, RHT_LOST_WOODS_RUPEE, + RHT_LOST_WOODS_SHORTCUT_RUPEE, RHT_LAKE_HYLIA_RUPEE, RHT_LABORATORY_RUPEE, RHT_DAMPES_GRAVE_RUPEE, From 298cec252fae037651725ce12572a9261a57d33b Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Sat, 17 Aug 2024 20:21:09 -0700 Subject: [PATCH 052/108] Update logic for Bombchu fixes --- .../3drando/location_access/locacc_bottom_of_the_well.cpp | 4 ++-- .../randomizer/3drando/location_access/locacc_deku_tree.cpp | 2 +- .../3drando/location_access/locacc_shadow_temple.cpp | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_bottom_of_the_well.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_bottom_of_the_well.cpp index bf05425b5ad..6cd3fcb64b1 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_bottom_of_the_well.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_bottom_of_the_well.cpp @@ -47,8 +47,8 @@ void AreaTable_Init_BottomOfTheWell() { LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE, randoCtx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH)), LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_RIGHT_RUPEE, randoCtx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH)), LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_RIGHT_RUPEE, randoCtx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH)), - LOCATION(RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_FRONT_LEFT_HEART, (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_ZELDAS_LULLABY)) && logic->Sticks || logic->CanUse(RG_DINS_FIRE)), - LOCATION(RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART, (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_ZELDAS_LULLABY)) && logic->Sticks || logic->CanUse(RG_DINS_FIRE)), + LOCATION(RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_FRONT_LEFT_HEART, (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_ZELDAS_LULLABY)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_DINS_FIRE))), + LOCATION(RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART, (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_ZELDAS_LULLABY)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_DINS_FIRE))), }, { //Exits Entrance(RR_BOTTOM_OF_THE_WELL_ENTRYWAY, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_deku_tree.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_deku_tree.cpp index ec75c75c2f4..1642a9c61cb 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_deku_tree.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_deku_tree.cpp @@ -192,7 +192,7 @@ void AreaTable_Init_DekuTree() { Here(RR_DEKU_TREE_MQ_COMPASS_ROOM, []{return logic->CanUse(RG_BOMBCHU_5) || (logic->Bombs && (logic->CanUse(RG_SONG_OF_TIME) || logic->IsAdult)) || (logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER) && (logic->CanUse(RG_SONG_OF_TIME) || randoCtx->GetTrickOption(RT_DEKU_MQ_COMPASS_GS)));})), - LOCATION(RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART, logic->HasBombchus || (logic->Bombs && (logic->CanUse(RG_SONG_OF_TIME) || logic->IsAdult)) || + LOCATION(RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART, logic->CanUse(RG_BOMBCHU_5) || (logic->Bombs && (logic->CanUse(RG_SONG_OF_TIME) || logic->IsAdult)) || (logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER) && (logic->CanUse(RG_SONG_OF_TIME) || randoCtx->GetTrickOption(RT_DEKU_MQ_COMPASS_GS)))), }, { //Exits diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp index fe75ecc8c83..d26270840d5 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp @@ -86,7 +86,7 @@ void AreaTable_Init_ShadowTemple() { LOCATION(RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, logic->CanAdultAttack), LOCATION(RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART, logic->CanUse(RG_DISTANT_SCARECROW)), LOCATION(RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART, logic->CanUse(RG_DISTANT_SCARECROW)), - LOCATION(RC_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART, (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_DISTANT_SCARECROW) || (randoCtx->GetTrickOption(RT_SHADOW_STATUE) && logic->HasBombchus)) && logic->CanUse(RG_SONG_OF_TIME) || (logic->CanUse(RG_DISTANT_SCARECROW) && logic->CanUse(RG_HOVER_BOOTS))), + LOCATION(RC_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART, (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_DISTANT_SCARECROW) || (randoCtx->GetTrickOption(RT_SHADOW_STATUE) && logic->CanUse(RG_BOMBCHU_5))) && logic->CanUse(RG_SONG_OF_TIME) || (logic->CanUse(RG_DISTANT_SCARECROW) && logic->CanUse(RG_HOVER_BOOTS))), }, { //Exits Entrance(RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, {[]{return (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_DISTANT_SCARECROW) || (randoCtx->GetTrickOption(RT_SHADOW_STATUE) && logic->CanUse(RG_BOMBCHU_5))) && logic->SmallKeys(RR_SHADOW_TEMPLE, 5) && logic->CanUse(RG_HOVER_BOOTS) && logic->BossKeyShadowTemple;}}) @@ -173,7 +173,7 @@ void AreaTable_Init_ShadowTemple() { LOCATION(RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, logic->Bow || (randoCtx->GetTrickOption(RT_SHADOW_STATUE) && logic->CanUse(RG_BOMBCHU_5))), LOCATION(RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART, logic->CanUse(RG_SONG_OF_TIME) && logic->CanUse(RG_FAIRY_BOW) && logic->CanUse(RG_LONGSHOT)), LOCATION(RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART, logic->CanUse(RG_SONG_OF_TIME) && logic->CanUse(RG_FAIRY_BOW) && logic->CanUse(RG_LONGSHOT)), - LOCATION(RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART, (logic->CanUse(RG_FAIRY_BOW) || (randoCtx->GetTrickOption(RT_SHADOW_STATUE) && logic->HasBombchus)) && logic->CanUse(RG_SONG_OF_TIME)), + LOCATION(RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART, (logic->CanUse(RG_FAIRY_BOW) || (randoCtx->GetTrickOption(RT_SHADOW_STATUE) && logic->CanUse(RG_BOMBCHU_5))) && logic->CanUse(RG_SONG_OF_TIME)), }, { //Exits Entrance(RR_SHADOW_TEMPLE_MQ_INVISIBLE_MAZE, {[]{return logic->Bow && logic->CanUse(RG_SONG_OF_TIME) && logic->IsAdult && logic->CanUse(RG_LONGSHOT);}}), From 01245ae81ce2752b3c74f66b60a135d00ee70d26 Mon Sep 17 00:00:00 2001 From: Archez Date: Sun, 18 Aug 2024 15:25:21 -0400 Subject: [PATCH 053/108] Bump LUS (#4301) * bump lus * remove undeclared methods --- libultraship | 2 +- soh/soh/Enhancements/controls/InputViewer.h | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/libultraship b/libultraship index 31e9b009f94..92bce011545 160000 --- a/libultraship +++ b/libultraship @@ -1 +1 @@ -Subproject commit 31e9b009f94e7074a847c7954926cba354cd7c72 +Subproject commit 92bce01154589080e534c3c143913a196e161f02 diff --git a/soh/soh/Enhancements/controls/InputViewer.h b/soh/soh/Enhancements/controls/InputViewer.h index 3e1e9c98798..b4d6413e16a 100644 --- a/soh/soh/Enhancements/controls/InputViewer.h +++ b/soh/soh/Enhancements/controls/InputViewer.h @@ -28,8 +28,6 @@ class InputViewer : public Ship::GuiWindow { InputViewer(); ~InputViewer(); - void Draw(); - private: void RenderButton(std::string btn, std::string btnOutline, int state, ImVec2 size, int outlineMode); }; @@ -44,6 +42,4 @@ class InputViewerSettingsWindow : public Ship::GuiWindow { InputViewerSettingsWindow(); ~InputViewerSettingsWindow(); - - void Draw(); }; From 1e9092c871b2211e7903f4850275220c584ba5d7 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Fri, 23 Aug 2024 02:07:35 -0700 Subject: [PATCH 054/108] Add missing Spirit Temple MQ hearts --- .../3drando/hint_list/hint_list_exclude_dungeon.cpp | 4 ++++ .../3drando/location_access/locacc_spirit_temple.cpp | 2 ++ soh/soh/Enhancements/randomizer/dungeon.cpp | 2 ++ soh/soh/Enhancements/randomizer/location_list.cpp | 3 +++ soh/soh/Enhancements/randomizer/randomizerTypes.h | 3 +++ soh/soh/Enhancements/randomizer/randomizer_inf.h | 2 ++ 6 files changed, 16 insertions(+) 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 5cd7c266cdb..ab4be795696 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 @@ -1224,6 +1224,10 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa /*german*/ "", /*french*/ "", {QM_RED, QM_GREEN})); + hintTextTable[RHT_SPIRIT_TEMPLE_MQ_HEART] = HintText(CustomMessage("They say that guarded by a #ring of flame# in the Spirit Temple is #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + /*-------------------------- | SHADOW TEMPLE | ---------------------------*/ diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp index 5b55c1c92d3..550473fbed2 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp @@ -159,6 +159,8 @@ void AreaTable_Init_SpiritTemple() { LOCATION(RC_SPIRIT_TEMPLE_MQ_MAP_CHEST, logic->KokiriSword || logic->Bombs), LOCATION(RC_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, logic->CanUse(RG_BOMBCHU_5) && logic->SmallKeys(RR_SPIRIT_TEMPLE, 7) && logic->Slingshot && (logic->CanUse(RG_DINS_FIRE) || (Here(RR_SPIRIT_TEMPLE_MQ_ADULT, []{return logic->IsAdult && (logic->CanUse(RG_FIRE_ARROWS) || (randoCtx->GetTrickOption(RT_SPIRIT_MQ_FROZEN_EYE) && logic->CanUse(RG_FAIRY_BOW) && logic->CanUse(RG_SONG_OF_TIME)));})))), //Trick: logic->CanUse(RG_BOMBCHU_5) && logic->SmallKeys(RR_SPIRIT_TEMPLE, 7) && logic->Slingshot && (logic->CanUse(RG_DINS_FIRE) || (SPIRIT_TEMPLE_MQ_ADULT.Adult() && logic->IsAdult && (logic->CanUse(RG_FIRE_ARROWS) || (LogicSpiritMQFrozenEye && logic->CanUse(RG_FAIRY_BOW) && logic->CanUse(RG_SONG_OF_TIME))))) + LOCATION(RC_SPIRIT_TEMPLE_MQ_CHILD_LEFT_HEART, logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW)), + LOCATION(RC_SPIRIT_TEMPLE_MQ_CHILD_RIGHT_HEART, logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW)), }, { //Exits Entrance(RR_SPIRIT_TEMPLE_MQ_SHARED, {[]{return logic->CanUse(RG_BOMBCHU_5) && logic->SmallKeys(RR_SPIRIT_TEMPLE, 2);}}), diff --git a/soh/soh/Enhancements/randomizer/dungeon.cpp b/soh/soh/Enhancements/randomizer/dungeon.cpp index a9304ce9f2e..d0011ed1dcd 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/dungeon.cpp @@ -527,6 +527,8 @@ Dungeons::Dungeons() { RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, RC_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM, + RC_SPIRIT_TEMPLE_MQ_CHILD_LEFT_HEART, + RC_SPIRIT_TEMPLE_MQ_CHILD_RIGHT_HEART, }, { // Shared Locations diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 7fa087ebf82..8f20dc6a64e 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -1834,6 +1834,9 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x3903, 0x39, "MQ After Ship Upper Right Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); locationTable[RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x3C03, 0x3C, "MQ After Ship Lower Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_LEFT_HEART] = Location::Collectable(RC_SPIRIT_TEMPLE_MQ_CHILD_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, 0x2C03, 0x2C, "MQ Child Early Left Heart", RHT_SPIRIT_TEMPLE_MQ_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_RIGHT_HEART] = Location::Collectable(RC_SPIRIT_TEMPLE_MQ_CHILD_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, 0x2E03, 0x2E, "MQ Child Early Right Heart", RHT_SPIRIT_TEMPLE_MQ_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x2003, 0x22, "MQ Coffin Room Front Right Invisible Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x2103, 0x21, "MQ Bomb Alcove Left Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x2203, 0x22, "MQ Bomb Alcove Right Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index c2ec014864f..5cba899235a 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1842,6 +1842,8 @@ typedef enum { RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART, RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART, RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART, + RC_SPIRIT_TEMPLE_MQ_CHILD_LEFT_HEART, + RC_SPIRIT_TEMPLE_MQ_CHILD_RIGHT_HEART, RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, @@ -3863,6 +3865,7 @@ typedef enum { RHT_WATER_TEMPLE_HEART, RHT_SHADOW_TEMPLE_HEART, RHT_SPIRIT_TEMPLE_HEART, + RHT_SPIRIT_TEMPLE_MQ_HEART, RHT_BOTTOM_OF_THE_WELL_HEART, RHT_BOTTOM_OF_THE_WELL_RUPEE, RHT_ICE_CAVERN_HEART, diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index 9e6a24b04fd..cf873519aee 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -476,6 +476,8 @@ typedef enum { RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART, RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART, RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART, + RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_LEFT_HEART, + RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_RIGHT_HEART, RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, From e07fc59e55bf8041f0c752708acf0f8851b1d9aa Mon Sep 17 00:00:00 2001 From: Pepe20129 <72659707+Pepe20129@users.noreply.github.com> Date: Fri, 23 Aug 2024 16:17:45 +0200 Subject: [PATCH 055/108] Add git info to title screen & gameplay stats (#4053) * Add git info to title screen & gameplay stats * Change the branch criteria to starting with `develop` * Update z_title.c * Change the branch criteria to not having a tag * Always show both when not a release build * Only show build version in tagged releases --- CMakeLists.txt | 31 +++++++++++++++++++ soh/include/variables.h | 5 ++- soh/soh/CrashHandlerExt.cpp | 2 ++ soh/soh/Enhancements/gameplaystats.cpp | 8 ++++- .../randomizer/3drando/spoiler_log.cpp | 2 ++ soh/soh/OTRGlobals.cpp | 2 +- soh/src/boot/build.c.in | 4 +++ .../overlays/gamestates/ovl_title/z_title.c | 21 +++++++++++-- 8 files changed, 70 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2d200a2d771..64975a34b22 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,37 @@ include(CMake/lus-cvars.cmake) set(PROJECT_BUILD_NAME "MacReady Golf" CACHE STRING "" FORCE) set(PROJECT_TEAM "github.com/harbourmasters" CACHE STRING "" FORCE) +execute_process( + COMMAND git branch --show-current + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_BRANCH + OUTPUT_STRIP_TRAILING_WHITESPACE +) + +set(CMAKE_PROJECT_GIT_BRANCH "${GIT_BRANCH}" CACHE STRING "Git branch" FORCE) + +execute_process( + COMMAND git rev-parse HEAD + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_COMMIT_HASH + OUTPUT_STRIP_TRAILING_WHITESPACE +) + +set(CMAKE_PROJECT_GIT_COMMIT_HASH "${GIT_COMMIT_HASH}" CACHE STRING "Git commit hash" FORCE) + +execute_process( + COMMAND git describe --tags --abbrev=0 --exact-match HEAD + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_COMMIT_TAG + OUTPUT_STRIP_TRAILING_WHITESPACE +) + +if(NOT GIT_COMMIT_TAG) + set(GIT_COMMIT_TAG "" CACHE STRING "Git commit tag" FORCE) +endif() + +set(CMAKE_PROJECT_GIT_COMMIT_TAG "${GIT_COMMIT_TAG}" CACHE STRING "Git commit tag" FORCE) + set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT soh) add_compile_options($<$:/MP>) add_compile_options($<$:/utf-8>) diff --git a/soh/include/variables.h b/soh/include/variables.h index 2c226f2c6b9..692d1b2f82e 100644 --- a/soh/include/variables.h +++ b/soh/include/variables.h @@ -49,7 +49,10 @@ extern "C" extern u16 gBuildVersionMajor; extern u16 gBuildVersionMinor; extern u16 gBuildVersionPatch; - extern u8 gBuildTeam[]; + extern u8 gGitBranch[]; + extern u8 gGitCommitHash[]; + extern u8 gGitCommitTag[]; + extern u8 gBuildTeam[]; extern u8 gBuildDate[]; extern u8 gBuildMakeOption[]; extern OSMesgQueue gPiMgrCmdQ; diff --git a/soh/soh/CrashHandlerExt.cpp b/soh/soh/CrashHandlerExt.cpp index 14f0714ffa9..c4a535f1216 100644 --- a/soh/soh/CrashHandlerExt.cpp +++ b/soh/soh/CrashHandlerExt.cpp @@ -69,6 +69,8 @@ extern "C" void CrashHandler_PrintSohData(char* buffer, size_t* pos) { char intCharBuffer[16]; append_line(buffer, pos, "Build Information:"); WRITE_VAR_LINE(buffer, pos, "Game Version: ", (const char*)gBuildVersion); + WRITE_VAR_LINE(buffer, pos, "Git Branch: ", (const char*)gGitBranch); + WRITE_VAR_LINE(buffer, pos, "Git Commit: ", (const char*)gGitCommitHash); WRITE_VAR_LINE(buffer, pos, "Build Date: ", (const char*)gBuildDate); if (gPlayState != nullptr) { diff --git a/soh/soh/Enhancements/gameplaystats.cpp b/soh/soh/Enhancements/gameplaystats.cpp index 61eb88a6f16..93cb672e3f3 100644 --- a/soh/soh/Enhancements/gameplaystats.cpp +++ b/soh/soh/Enhancements/gameplaystats.cpp @@ -437,7 +437,13 @@ void DrawGameplayStatsHeader() { ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, { 4.0f, 4.0f }); ImGui::BeginTable("gameplayStatsHeader", 1, ImGuiTableFlags_BordersOuter); ImGui::TableSetupColumn("stat", ImGuiTableColumnFlags_WidthStretch); - GameplayStatsRow("Build Version:", (char*) gBuildVersion); + //if tag is empty (not a release build) + if (gGitCommitTag[0] == 0) { + GameplayStatsRow("Git Branch:", (char*)gGitBranch); + GameplayStatsRow("Git Commit Hash:", (char*)gGitCommitHash); + } else { + GameplayStatsRow("Build Version:", (char*)gBuildVersion); + } if (gSaveContext.sohStats.rtaTiming) { GameplayStatsRow("Total Time (RTA):", formatTimestampGameplayStat(GAMEPLAYSTAT_TOTAL_TIME), gSaveContext.sohStats.gameComplete ? COLOR_GREEN : COLOR_WHITE); } else { diff --git a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp index 23599627336..d03c735e6c2 100644 --- a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp @@ -864,6 +864,8 @@ const char* SpoilerLog_Write(int language) { jsonData.clear(); jsonData["version"] = (char*) gBuildVersion; + jsonData["git_branch"] = (char*) gGitBranch; + jsonData["git_commit"] = (char*) gGitCommitHash; jsonData["seed"] = Settings::seedString; jsonData["finalSeed"] = Settings::seed; diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 456e07eaa0c..6e41eb7a8a8 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -340,7 +340,7 @@ OTRGlobals::OTRGlobals() { context->InitAudio(); - SPDLOG_INFO("Starting Ship of Harkinian version {}", (char*)gBuildVersion); + SPDLOG_INFO("Starting Ship of Harkinian version {} (Branch: {} | Commit: {})", (char*)gBuildVersion, (char*)gGitBranch, (char*)gGitCommitHash); auto loader = context->GetResourceManager()->GetResourceLoader(); loader->RegisterResourceFactory(std::make_shared(), RESOURCE_FORMAT_BINARY, "Texture", static_cast(LUS::ResourceType::Texture), 0); diff --git a/soh/src/boot/build.c.in b/soh/src/boot/build.c.in index 4d6a07ce66b..4467d04c819 100644 --- a/soh/src/boot/build.c.in +++ b/soh/src/boot/build.c.in @@ -5,6 +5,10 @@ const u16 gBuildVersionMajor = @CMAKE_PROJECT_VERSION_MAJOR@; const u16 gBuildVersionMinor = @CMAKE_PROJECT_VERSION_MINOR@; const u16 gBuildVersionPatch = @CMAKE_PROJECT_VERSION_PATCH@; +const char gGitBranch[] = "@CMAKE_PROJECT_GIT_BRANCH@"; +const char gGitCommitHash[] = "@CMAKE_PROJECT_GIT_COMMIT_HASH@"; +const char gGitCommitTag[] = "@CMAKE_PROJECT_GIT_COMMIT_TAG@"; + const char gBuildTeam[] = "@PROJECT_TEAM@"; const char gBuildDate[] = __DATE__ " " __TIME__; const char gBuildMakeOption[] = ""; diff --git a/soh/src/overlays/gamestates/ovl_title/z_title.c b/soh/src/overlays/gamestates/ovl_title/z_title.c index 51d0ac62b3a..8893d9d5f5c 100644 --- a/soh/src/overlays/gamestates/ovl_title/z_title.c +++ b/soh/src/overlays/gamestates/ovl_title/z_title.c @@ -13,6 +13,7 @@ #include #include #include +#include #include "time.h" @@ -30,8 +31,24 @@ void Title_PrintBuildInfo(Gfx** gfxp) { GfxPrint_Open(&printer, g); GfxPrint_SetColor(&printer, 131, 154, 255, 255); - GfxPrint_SetPos(&printer, 1, 25); - GfxPrint_Printf(&printer, "%s", gBuildVersion); + //if tag is empty (not a release build) + bool showGitInfo = gGitCommitTag[0] == 0; + + if (showGitInfo) { + GfxPrint_SetPos(&printer, 1, 24); + GfxPrint_Printf(&printer, "Git Branch: %s", gGitBranch); + + //truncate the commit to 7 characters + char gGitCommitHashTruncated[8]; + strncpy(gGitCommitHashTruncated, gGitCommitHash, 7); + gGitCommitHashTruncated[7] = 0; + + GfxPrint_SetPos(&printer, 1, 25); + GfxPrint_Printf(&printer, "Git Commit: %s", gGitCommitHashTruncated); + } else { + GfxPrint_SetPos(&printer, 1, 25); + GfxPrint_Printf(&printer, "%s", gBuildVersion); + } GfxPrint_SetPos(&printer, 1, 26); GfxPrint_Printf(&printer, "%s", gBuildDate); From 5819cd438347ead2a1b2efa343032d226d07c369 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Wed, 28 Aug 2024 16:58:02 -0700 Subject: [PATCH 056/108] Add missing settings entries --- soh/soh/Enhancements/randomizer/settings.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index 4208b121117..9bf91a30a1a 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -1080,6 +1080,7 @@ void Settings::CreateOptions() { &mOptions[RSK_SHUFFLE_SCRUBS], &mOptions[RSK_SHUFFLE_BEEHIVES], &mOptions[RSK_SHUFFLE_COWS], + &mOptions[RSK_SHUFFLE_FREESTANDING], &mOptions[RSK_SHUFFLE_MAGIC_BEANS], &mOptions[RSK_SHUFFLE_MERCHANTS], &mOptions[RSK_SHUFFLE_FROG_SONG_RUPEES], @@ -1123,6 +1124,7 @@ void Settings::CreateOptions() { { "Shuffle Settings:Beehive Shuffle", RSK_SHUFFLE_BEEHIVES }, { "Shuffle Settings:Shuffle Cows", RSK_SHUFFLE_COWS }, { "Shuffle Settings:Tokensanity", RSK_SHUFFLE_TOKENS }, + { "Shuffle Settings:Freestanding Shuffle", RSK_SHUFFLE_FREESTANDING }, { "Shuffle Settings:Shuffle Ocarinas", RSK_SHUFFLE_OCARINA }, { "Shuffle Settings:Shuffle Ocarina Buttons", RSK_SHUFFLE_OCARINA_BUTTONS }, { "Shuffle Settings:Shuffle Swim", RSK_SHUFFLE_SWIM }, @@ -2349,6 +2351,17 @@ void Settings::ParseJson(nlohmann::json spoilerFileJson) { mOptions[index].SetSelectedIndex(RO_SCRUBS_RANDOM); } break; + case RSK_SHUFFLE_FREESTANDING: + if (it.value() == "Off") { + mOptions[index].SetSelectedIndex(RO_TOKENSANITY_OFF); + } else if (it.value() == "Overworld") { + mOptions[index].SetSelectedIndex(RO_TOKENSANITY_OVERWORLD); + } else if (it.value() == "Dungeons") { + mOptions[index].SetSelectedIndex(RO_TOKENSANITY_DUNGEONS); + } else if (it.value() == "All Items") { + mOptions[index].SetSelectedIndex(RO_TOKENSANITY_ALL); + } + break; case RSK_SHUFFLE_FISHING_POLE: case RSK_FISHSANITY_AGE_SPLIT: case RSK_FISHING_POLE_HINT: From b50d14defafa04e7201b606c776f41e20d8312a6 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 29 Aug 2024 13:20:20 -0700 Subject: [PATCH 057/108] Actually add Forest Temple trick to the tricks menu. --- soh/soh/Enhancements/randomizer/settings.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index 9bf91a30a1a..2c4b5bedf45 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -507,6 +507,7 @@ void Settings::CreateOptions() { &mTrickOptions[RT_FOREST_OUTDOORS_LEDGE], &mTrickOptions[RT_FOREST_DOORFRAME], &mTrickOptions[RT_FOREST_OUTSIDE_BACKDOOR], + &mTrickOptions[RT_FOREST_OUTDOORS_HEARTS_BOOMERANG], &mTrickOptions[RT_FOREST_MQ_WELL_SWIM], &mTrickOptions[RT_FOREST_MQ_BLOCK_PUZZLE], &mTrickOptions[RT_FOREST_MQ_JS_HALLWAY_SWITCH], From 48663d74ac50fbe941986e21fa3aae4c74047e11 Mon Sep 17 00:00:00 2001 From: Malkierian Date: Fri, 30 Aug 2024 08:28:09 -0700 Subject: [PATCH 058/108] Change Recommended VS build tools from 142 to 143 (#4315) * Changed references for VS build tools 142 to 143 to reflect current state of development. * Remove VS 2019. --- docs/BUILDING.md | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/docs/BUILDING.md b/docs/BUILDING.md index eb5a6a3365c..471a493ac64 100644 --- a/docs/BUILDING.md +++ b/docs/BUILDING.md @@ -6,7 +6,7 @@ Requires: * At least 8GB of RAM (machines with 4GB have seen complier failures) * Visual Studio 2022 Community Edition with the C++ feature set * One of the Windows SDKs that comes with Visual Studio, for example the current Windows 10 version 10.0.19041.0 - * The `MSVC v142 - VS 2019 C++ build tools` component of Visual Studio + * The `MSVC v143 - VS 2022 C++ build tools` component of Visual Studio * Python 3 (can be installed manually or as part of Visual Studio) * Git (can be installed manually or as part of Visual Studio) * Cmake (can be installed via chocolatey or manually) @@ -14,12 +14,9 @@ Requires: During installation, check the "Desktop development with C++" feature set: ![image](https://user-images.githubusercontent.com/30329717/183511274-d11aceea-7900-46ec-acb6-3f2cc110021a.png) -Doing so should also check one of the Windows SDKs by default. Then, in the installation details in the right-hand column, make sure you also check the v142 toolset. +Doing so should also check one of the Windows SDKs by default. Then, in the installation details in the right-hand column, make sure you also check the v143 toolset. This is often done by default. -You can also find the v142 toolset by searching through the individual components tab: - -![image](https://user-images.githubusercontent.com/30329717/183521169-ead6a73b-a1bf-4e99-aab8-441746d8f08e.png) -While you're there, you can also install Python 3 and Git if needed. +It is recommended that you install Python and Git standalone, the install process in VS Installer has given some issues in the past. 1. Clone the Ship of Harkinian repository @@ -33,9 +30,7 @@ _Note: Instructions assume using powershell_ cd Shipwright # Setup cmake project -& 'C:\Program Files\CMake\bin\cmake' -S . -B "build/x64" -G "Visual Studio 17 2022" -T v142 -A x64 # -DCMAKE_BUILD_TYPE:STRING=Release (if you're packaging) -# or for VS2019 -& 'C:\Program Files\CMake\bin\cmake' -S . -B "build/x64" -G "Visual Studio 16 2019" -T v142 -A x64 +& 'C:\Program Files\CMake\bin\cmake' -S . -B "build/x64" -G "Visual Studio 17 2022" -T v143 -A x64 # -DCMAKE_BUILD_TYPE:STRING=Release (if you're packaging) # Extract assets & generate OTR (run this anytime you need to regenerate OTR) & 'C:\Program Files\CMake\bin\cmake.exe' --build .\build\x64 --target ExtractAssets # --config Release (if you're packaging) # Compile project @@ -60,9 +55,7 @@ With the cmake build system you have two options for working on the project: To develop using Visual Studio you only need to use cmake to generate the solution file: ```powershell # Generates Ship.sln at `build/x64` for Visual Studio 2022 -& 'C:\Program Files\CMake\bin\cmake' -S . -B "build/x64" -G "Visual Studio 17 2022" -T v142 -A x64 -# or for Visual Studio 2019 -& 'C:\Program Files\CMake\bin\cmake' -S . -B "build/x64" -G "Visual Studio 16 2019" -T v142 -A x64 +& 'C:\Program Files\CMake\bin\cmake' -S . -B "build/x64" -G "Visual Studio 17 2022" -T v143 -A x64 ``` #### Visual Studio Code or another editor From 1f85420625f4254ae23c6eff86cd5d946c314c42 Mon Sep 17 00:00:00 2001 From: Extloga <141232749+Extloga@users.noreply.github.com> Date: Mon, 2 Sep 2024 16:32:38 +0200 Subject: [PATCH 059/108] Additions for the German translation in two files (#4304) * Additions for the German translation in hint_list_exclude_dungeon.cpp * Additions for the German translation in hint_list_exclude_overworld.cpp --- .../hint_list/hint_list_exclude_dungeon.cpp | 566 +++++++++--------- .../hint_list/hint_list_exclude_overworld.cpp | 535 +++++++++-------- 2 files changed, 552 insertions(+), 549 deletions(-) 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 99659838b34..c2117c4eb38 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 @@ -33,7 +33,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ Según dicen, los #salientes del Gran Árbol Deku# conducen a #[[1]]#. hintTextTable[RHT_DEKU_TREE_BASEMENT_CHEST] = HintText(CustomMessage("They say that #webs in the Deku Tree# hide #[[1]]#.", - /*german*/ "Man erzählt sich, daß #Spinnweben im Deku-Baum# #[[1]]# verstecken würden.", + /*german*/ "Man erzählt sich, daß #Spinnweben im Deku-Baum# #[[1]]# verbergen würden.", /*french*/ "Selon moi, les #toiles dans l'Arbre Mojo# cachent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, entre #telarañas del Gran Árbol Deku# yace #[[1]]#. @@ -58,7 +58,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ Según dicen, los #salientes del Gran Árbol Deku# conducen a #[[1]]#. hintTextTable[RHT_DEKU_TREE_MQ_BASEMENT_CHEST] = HintText(CustomMessage("They say that #webs in the Deku Tree# hide #[[1]]#.", - /*german*/ "Man erzählt sich, daß #Spinnweben im Deku-Baum# #[[1]]# verstecken würden.", + /*german*/ "Man erzählt sich, daß #Spinnweben im Deku-Baum# #[[1]]# verbergen würden.", /*french*/ "Selon moi, les #toiles dans l'Arbre Mojo# cachent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, entre #telarañas del Gran Árbol Deku# yace #[[1]]#. @@ -309,7 +309,7 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, cierta #roca rodeada de vacas# esconde #[[1]]#. {}, { CustomMessage("They say that #pop rocks# hide #[[1]]#.", - /*german*/ "Man erzählt sich, daß #Knallfelsen# #[[1]]# verstecken würden.", + /*german*/ "Man erzählt sich, daß #Knallfelsen# #[[1]]# verbergen würden.", /*french*/ "Selon moi, des #pierres aux reins# cachent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, #cepillarse los dientes con explosivos# revela #[[1]]#. CustomMessage("They say that an #explosive palate# holds #[[1]]#.", @@ -358,7 +358,7 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, unos #stingers engullidos por Jabu-Jabu# guardan #[[1]]#. {}, { CustomMessage("They say that a school of #stingers swallowed by a deity# guard #[[1]]#.", - /*german*/ "Man erzählt sich, daß von #Jabu-Jabu verschluckte Rochen# #[[1]]# bewachen würden.", + /*german*/ "Man erzählt sich, daß von #einer Gottheit verschluckte Rochen# #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #raies avallées par le gardien# protègent #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, unos #stingers engullidos por cierta deidad# guardan #[[1]]#. @@ -585,61 +585,61 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, en una #sala con otro punto de vista# se esconde #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_PHANTOM_GANON_HEART] = HintText(CustomMessage("They say that #Phantom Ganon# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Phantom-Ganon# #[[1]]# besäße.", /*french*/ "Selon moi, #Ganon Spectral# possède #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, #Ganon Fantasma# porta #[[1]]#. {}, { CustomMessage("They say that the #Evil Spirit from Beyond# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #böse Geist aus dem Jenseits# #[[1]]# besäße.", /*french*/ "Selon moi, l'#esprit maléfique de l'au-delà# possède #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, el #espíritu maligno de ultratumba# porta #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD] = HintText(CustomMessage("They say that a #spider on a small island# in the Forest Temple holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne auf einer kleinen Insel# im Waldtempel #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur l'îlot du Temple de la Forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula sobre una pequeña isla# del Templo del Bosque otorga #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_GS_FIRST_ROOM] = HintText(CustomMessage("They say that a #spider high on a wall of vines# in the Forest Temple holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne hoch auf einer Wand aus Reben# im Waldtempel #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur un mur de vignes du Temple de la Forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula en lo alto de una pared de cepas# del Templo del Bosque otorga #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD] = HintText(CustomMessage("They say that #stone columns# lead to a spider in the Forest Temple hiding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Säulen aus Stein# zu einer Spinne im Waldtempel führen, welche #[[1]]# verstecke.", /*french*/ "Selon moi, une #Skulltula haut perchée dans le jardin du Temple de la Forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, unas #columnas del Templo del Bosque# conducen a una Skulltula que otorga #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_GS_LOBBY] = HintText(CustomMessage("They say that a #spider among ghosts# in the Forest Temple guards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne inmitten von Geistern# im Waldtempel #[[1]]# bewache.", /*french*/ "Selon moi, une #Skulltula dans la grande salle du Temple de la Forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula rodeada de fantasmas# del Templo del Bosque otorga #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_GS_BASEMENT] = HintText(CustomMessage("They say that a #spider within revolving walls# in the Forest Temple holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne inmitten drehender Wände# im Waldtempel #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula derrière les murs pivotants du Temple de la Forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula entre paredes giratorias# del Templo del Bosque otorga #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY] = HintText(CustomMessage("They say that an #ivy-hidden spider# in the Forest Temple hoards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #unter Efeu versteckte Spinne# im Waldtempel #[[1]]# horte.", /*french*/ "Selon moi, une #Skulltula près de l'entrée du Temple de la Forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula escondida entre cepas# del Templo del Bosque otorga #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM] = HintText(CustomMessage("They say that a #spider in a hidden nook# within the Forest Temple holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne in einem versteckten Winkel# im Waldtempel #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula dans un recoin caché du Temple de la Forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula en una esquina oculta# del Templo del Bosque otorga #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD] = HintText(CustomMessage("They say that a #spider on an arch# in the Forest Temple holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne auf einem Bogen# im Waldtempel #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur une arche du Temple de la Forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula sobre un arco# del Templo del Bosque otorga #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD] = HintText(CustomMessage("They say that a #spider on a ledge# in the Forest Temple holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne auf einem Vorsprung# im Waldtempel #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula dans le jardin du Temple de la Forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula en un borde# del Templo del Bosque otorga #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_MQ_GS_WELL] = HintText(CustomMessage("They say that #draining a well# in Forest Temple uncovers a spider with #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Entleeren eines Brunnens# im Waldtempel eine Spinne mit #[[1]]# enthülle.", /*french*/ "Selon moi, une #Skulltula au fond du Puits du Temple de la Forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #vaciar el pozo# del Templo del Bosque desvela una Skulltula que otorga #[[1]]#. @@ -647,187 +647,187 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The | FIRE TEMPLE | ---------------------------*/ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They say that #near a dragon# is #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #nahe eines Drachens# #[[1]]# sei.", /*french*/ "Selon moi, #près d'un dragon# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #cerca de un dragón# yace #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_FLARE_DANCER_CHEST] = HintText(CustomMessage("They say that the #Flare Dancer behind a totem# guards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Flammenderwische hinter einem Totem# #[[1]]# bewachen würden.", /*french*/ "Selon moi, le #Danse-Flamme derrière un totem# protège #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #Bailafuego tras unos tótems# esconde #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that a #prison beyond a totem# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Gefängnis jenseits eines Totems# #[[1]]# enthielte.", /*french*/ "Selon moi, la #prison derrière un totem# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, en una #prisión tras unos tótems# yace #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST] = HintText(CustomMessage("They say that #explosives over a lava pit# unveil #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Explosives über einem Lavastrom# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, des #explosifs dans un lac de lave# révèlent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #explosivos en un mar de llamas# revelan #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST] = HintText(CustomMessage("They say that a #Goron trapped near lava# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #nahe der Lava gefangene Gorone# #[[1]]# besäße.", /*french*/ "Selon moi, le #Goron emprisonné près de la lave# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #goron atrapado cerca de un mar de llamas# guarda #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST] = HintText(CustomMessage("They say that a #Goron at the end of a maze# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Gorone am Ende eines Labyrinths# #[[1]]# besäße.", /*french*/ "Selon moi, le #Goron dans le labyrinthe# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #goron al final de un laberinto# guarda #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST] = HintText(CustomMessage("They say that a #Goron above a maze# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Gorone oberhalb eines Labyrinths# #[[1]]# besäße.", /*french*/ "Selon moi, le #Goron au dessus du labyrinthe# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #goron sobre un laberinto# guarda #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST] = HintText(CustomMessage("They say that a #Goron hidden near a maze# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #nahe eines Labyrinths versteckter Gorone# #[[1]]# besäße.", /*french*/ "Selon moi, le #Goron caché près du labyrinthe# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #goron escondido tras un laberinto# guarda #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST] = HintText(CustomMessage("They say that a #blocked path# in Fire Temple holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #blockierter Pfad# im Feuertempel #[[1]]# enthielte.", /*french*/ "Selon moi, un #sol fragile dans le Temple du Feu# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, en un #camino bloqueado# del Templo del Fuego yace #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say that a #caged chest# in the Fire Temple hoards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #eingesperrte Truhe# im Feuertempel #[[1]]# enthielte.", /*french*/ "Selon moi, un #coffre emprisonné# dans le Temple du Feu contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #cofre entre rejas# del Templo del Fuego contiene #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_COMPASS_CHEST] = HintText(CustomMessage("They say that a #chest in a fiery maze# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Truhe in einem feurigen Labyrinth# #[[1]]# enthielte.", /*french*/ "Selon moi, un #coffre dans un labyrinthe enflammé# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #cofre de un ardiente laberinto# contiene #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_HIGHEST_GORON_CHEST] = HintText(CustomMessage("They say that a #Goron atop the Fire Temple# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Gorone auf der Spitze des Feuertempels# #[[1]]# besäße.", /*french*/ "Selon moi, le #Goron au sommet du Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #goron en lo alto del Templo del Fuego# guarda #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST] = HintText(CustomMessage("They say that #near a dragon# is #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #nahe eines Drachens# #[[1]]# sei.", /*french*/ "Selon moi, #près d'un dragon# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #cerca de un dragón# yace #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST] = HintText(CustomMessage("They say that the #Flare Dancer in the depths of the Fire Temple# guards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Flammenderwische in den Tiefen des Feuertempels# #[[1]]# bewachen würden.", /*french*/ "Selon moi, le #Danse-Flamme au coeur du volcan# a #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, el #Bailafuego en lo profundo del Templo del Fuego# esconde #[[1]]#. {}, { CustomMessage("They say that the #Flare Dancer in the depths of a volcano# guards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Flammenderwische in den Tiefen eines Vulkans# #[[1]]# bewachen würden.", /*french*/ "Selon moi, le #Danse-Flamme au coeur du volcan# a #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, el #Bailafuego en lo profundo del volcán# esconde #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_COMPASS_CHEST] = HintText(CustomMessage("They say that a #blocked path# in Fire Temple holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #blockierter Pfad# im Feuertempel #[[1]]# enthielte.", /*french*/ "Selon moi, le #chemin scellé# dans le Temple du Feu contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, en un #camino bloqueado# del Templo del Fuego yace #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST] = HintText(CustomMessage("They say that #crates in a maze# contain #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Kisten in einem Labyrinth# #[[1]]# enthielten.", /*french*/ "Selon moi, des #boîtes dans le labyrinthe# contiennent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #cajas de un laberinto# contienen #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST] = HintText(CustomMessage("They say that #crates in a maze# contain #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Kisten in einem Labyrinth #[[1]]# enthielten.", /*french*/ "Selon moi, des #boîtes dans le labyrinthe# contiennent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #cajas de un laberinto# contienen #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST] = HintText(CustomMessage("They say that a #falling slug# in the Fire Temple guards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #fallende Schnecke# im Feuertempel #[[1]]# bewache.", /*french*/ "Selon moi, la #limace tombante# dans le Temple du Feu protège #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #babosa del techo# del Templo del Fuego guarda #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_MAP_CHEST] = HintText(CustomMessage("They say that using a #hammer in the depths of the Fire Temple# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Benutzung eines #Hammers in den Tiefen des Feuertempels# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, frapper du #marteau au coeur du volcan# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, usar el #martillo en lo profundo del Templo del Fuego# revela #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that #illuminating a lava pit# reveals the path to #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Illumination einer Lavagrube# den Pfad zu #[[1]]# enthülle.", /*french*/ "Selon moi, #éclairer le lac de lave# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #iluminar un mar de llamas# revela #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST] = HintText(CustomMessage("They say that #explosives over a lava pit# unveil #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Explosives oberhalb einer Lavagrube# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, des #explosifs dans un lac de lave# révèlent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #explosivos en un mar de llamas# revelan #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST] = HintText(CustomMessage("They say that a #Goron hidden near a maze# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #nahe eines Labyrinths versteckter Gorone# #[[1]]# besäße.", /*french*/ "Selon moi, le #Goron caché près du labyrinthe# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #goron cerca de un laberinto# guarda #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_FREESTANDING_KEY] = HintText(CustomMessage("They say that hidden #beneath a block of stone# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß versteckt #unter einem Steinblock# #[[1]]# läge.", /*french*/ "Selon moi, caché #derrière un bloc de pierre# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #bajo unos bloques de piedra# yace #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_VOLVAGIA_HEART] = HintText(CustomMessage("They say that #Volvagia# holds #[[1]]#.", - /*german*/ "", - /*french*/ "Selon moi, #Volvagia# possède #[[1]]#.", {QM_RED, QM_GREEN}), + /*german*/ "Man erzählt sich, daß #Volvagia# #[[1]]# besäße.", + /*french*/ "Selon moi, #Volcania# possède #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, #Volvagia# porta #[[1]]#. {}, { CustomMessage("They say that the #Subterranean Lava Dragon# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #subterrane Lavadrache# #[[1]]# besäße.", /*french*/ "Selon moi, le #dragon des profondeurs# possède #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, el #dragón de lava subterráneo# porta #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM] = HintText(CustomMessage("They say that #eight tiles of malice# guard a spider holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #acht Kacheln der Arglist# eine Spinne bewachen würden, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula protégée par huit tuiles dans le Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #ocho baldosas de maldad# custodian una Skulltula que otorga #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_GS_BOSS_KEY_LOOP] = HintText(CustomMessage("They say that #five tiles of malice# guard a spider holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #fünf Kacheln der Arglist# eine Spinne bewachen würden, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula protégée par cinq tuiles dans le Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #cinco baldosas de maldad# custodian una Skulltula que otorga #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_GS_BOULDER_MAZE] = HintText(CustomMessage("They say that #explosives in a maze# unveil a spider hiding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Explosives in einem Labyrinth# eine Spinne enthüllen würde, welche #[[1]]# verstecke.", /*french*/ "Selon moi, une #Skulltula derrière un mur fragile du Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #explosivos en un laberinto# desvelan una Skulltula que otorga #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_GS_SCARECROW_TOP] = HintText(CustomMessage("They say that a #spider-friendly scarecrow# atop the Fire Temple hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #spinnenfreundliche Vogelscheuche# auf der Spitze des Feuertempels #[[1]]# verstecke.", /*french*/ "Selon moi, une #Skulltula repérée par l'épouvantail du Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, un #espantapájaros del Templo del Fuego# custodia una Skulltula que otorga #[[1]]#. {}, { CustomMessage("They say that a #spider-friendly scarecrow# atop a volcano hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #spinnenfreundliche Vogelscheuche# auf der Spitze eines Vulkans #[[1]]# verstecke.", /*french*/ "Selon moi, une #Skulltula repérée par l'épouvantail du volcan# a #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, un #espantapájaros en lo alto de un volcán# custodia una Skulltula que otorga #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_GS_SCARECROW_CLIMB] = HintText(CustomMessage("They say that a #spider-friendly scarecrow# atop the Fire Temple hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #spinnenfreundliche Vogelscheuche# auf der der Spitze des Feuertempels #[[1]]# verstecke.", /*french*/ "Selon moi, une #Skulltula repérée par l'épouvantail du Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, un #espantapájaros del Templo del Fuego# custodia una Skulltula que otorga #[[1]]#. {}, { CustomMessage("They say that a #spider-friendly scarecrow# atop a volcano hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #spinnenfreundliche Vogelscheuche# auf der Spitze eines Vulkans #[[1]]# verstecke.", /*french*/ "Selon moi, une #Skulltula repérée par l'épouvantail du volcan# a #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, un #espantapájaros en lo alto de un volcán# custodia una Skulltula que otorga #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE] = HintText(CustomMessage("They say that a #spider above a fiery maze# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne oberhalb eines feurigen Labyrinths #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula au dessus du labyrinthe enflammé du Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula sobre un ardiente laberinto# otorga #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER] = HintText(CustomMessage("They say that a #spider within a fiery maze# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne innerhalb eines feurigen Labyrinths# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula dans le labyrinthe enflammé du Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula en el interior de un ardiente laberinto# otorga #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR] = HintText(CustomMessage("They say that a #Goron trapped near lava# befriended a spider with #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #nahe der Lava gefangener Gorone# sich mit einer Spinne angefreundet hat, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula emprisonnée près du lac de lave du Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula amiga de un Goron atrapado junto a la lava# otorga #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM] = HintText(CustomMessage("They say that a #spider beside a fiery maze# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne neben einem feurigen Labyrinth# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula près du labyrinthe enflammé du Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula junto a un ardiente laberinto# otorga #[[1]]#. @@ -835,126 +835,126 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa | WATER TEMPLE | ---------------------------*/ hintTextTable[RHT_WATER_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say that #rolling spikes# in the Water Temple surround #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #rollende Stacheln# im Wassertempel #[[1]]# umgeben würden.", /*french*/ "Selon moi, des #Spikes# dans le Temple de l'Eau entourent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, unas #rodantes púas# del Templo del Agua guardan #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_COMPASS_CHEST] = HintText(CustomMessage("They say that #roaming stingers in the Water Temple# guard #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #umherstreifende Rochen im Wassertempel# #[[1]]# bewachen würden.", /*french*/ "Selon moi, des #raies dans le Temple de l'Eau# protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, unos #errantes stingers# del Templo del Agua guardan #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_TORCHES_CHEST] = HintText(CustomMessage("They say that #fire in the Water Temple# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Feuer im Wassertempel# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, des #flammes dans le Temple de l'Eau# révèlent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #fuego en el Templo del Agua# revela #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_DRAGON_CHEST] = HintText(CustomMessage("They say that a #serpent's prize# in the Water Temple is #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #Preis einer Schlange# im Wassertempel #[[1]]# sei.", /*french*/ "Selon moi, la #récompense du dragon submergé# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #escamado premio# del Templo del Agua se trata de #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST] = HintText(CustomMessage("They say that #blinding an eye# in the Water Temple leads to #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Erblinden eines Auges# im Wassertempel zu #[[1]]# führe.", /*french*/ "Selon moi, #l'oeil# du Temple de l'Eau voit #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #cegar un ojo# del Templo del Agua conduce a #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_CENTRAL_PILLAR_CHEST] = HintText(CustomMessage("They say that in the #depths of the Water Temple# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß in den #Tiefen des Wassertempels# #[[1]]# läge.", /*french*/ "Selon moi, le #coeur du Temple de l'Eau# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, en las #profundidades del Templo del Agua# yace #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_CRACKED_WALL_CHEST] = HintText(CustomMessage("They say that #through a crack# in the Water Temple is #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #in einem Spalt# im Wassertempel #[[1]]# sei.", /*french*/ "Selon moi, le #mur fragile# du Temple de l'Eau cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, tras una #agrietada pared# del Templo del Agua yace #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_LONGSHOT_CHEST] = HintText(CustomMessage("They say that #Dark Link# guards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #schwarze Link# #[[1]]# bewache.", /*french*/ "Selon moi, l'#Ombre de @# protège #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, #@ Oscuro# guarda #[[1]]#. {}, { CustomMessage("They say that #facing yourself# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Konfrontation mit einem Selbst# #[[1]]# offenbare.", /*french*/ "Selon moi, se #vaincre soi-même# révèle #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, #luchar contra ti mismo# revela #[[1]]#. CustomMessage("They say that a #dark reflection# of yourself guards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #dunkle Reflektion# von einem Selbst #[[1]]# bewache.", /*french*/ "Selon moi, son #propre reflet# cache #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, el #oscuro reflejo de ti mismo# guarda #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST] = HintText(CustomMessage("They say that in the #depths of the Water Temple# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß in den #Tiefen des Wassertempels# #[[1]]# läge.", /*french*/ "Selon moi, le #coeur du Temple de l'Eau# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, en las #profundidades del Templo del Agua# yace #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_MQ_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that fire in the Water Temple unlocks a #vast gate# revealing a chest with #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß Feuer im Wassertempel ein #großes Tor# entschlüssele, welches eine Truhe mit #[[1]]# offenbare.", /*french*/ "Selon moi, des #flammes au coeur du Temple de l'Eau# révèlent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el fuego en el Templo del Agua alza una #gran valla# con #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_MQ_LONGSHOT_CHEST] = HintText(CustomMessage("They say that #through a crack# in the Water Temple is #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #in einem Spalt# im Wassertempel #[[1]]# sei.", /*french*/ "Selon moi, le #mur fragile# du Temple de l'Eau cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, tras una #agrietada pared# del Templo del Agua yace #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_MQ_COMPASS_CHEST] = HintText(CustomMessage("They say that #fire in the Water Temple# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Feuer im Wassertempel# #[[1]]# offenbare.", /*french*/ "Selon moi, des #flammes dans le Temple de l'Eau# révèlent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #fuego en el Templo del Agua# revela #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_MQ_MAP_CHEST] = HintText(CustomMessage("They say that #sparring soldiers# in the Water Temple guard #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #sich duellierende Soldaten# im Wassertempel #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #soldats du Temple de l'Eau# protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #acabar con unos soldados# del Templo del Agua revela #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_MORPHA_HEART] = HintText(CustomMessage("They say that #Morpha# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Morpha# #[[1]]# besäße.", /*french*/ "Selon moi, #Morpha# possède #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, #Morpha# porta #[[1]]#. {}, { CustomMessage("They say that the #Giant Aquatic Amoeba# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #gigantische aquatische Amöbe# #[[1]]# besäße.", /*french*/ "Selon moi, l'#amibe aquatique géante# possède #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, la #ameba acuática gigante# porta #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM] = HintText(CustomMessage("They say that a #spider over a waterfall# in the Water Temple holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne über einem Wasserfall# im Wassertempel #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula au dessus d'une cascade du Temple de l'Eau# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula tras una cascada# del Templo del Agua otorga #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_GS_CENTRAL_PILLAR] = HintText(CustomMessage("They say that a #spider in the center of the Water Temple# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne im Zentrum des Wassertempels# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula au centre du Temple de l'Eau# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula en el centro del Templo del Agua# otorga #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that a spider protected by #rolling boulders in the Water Temple# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine Spinne, welche von #rollenden Felsbrocken im Wassertempel# geschützt werde, #[[1]]# verstecke.", /*french*/ "Selon moi, une #Skulltula derrière les rochers roulants du Temple de l'Eau# a #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, una #Skulltula protegida por rocas rodantes# del Templo del Agua otorga #[[1]]#. {}, { CustomMessage("They say that a spider protected by #rolling boulders under the lake# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine Spinne, welche von #rollenden Felsbrocken unterhalb eines Flusses# geschützt werde, #[[1]]# verstecke.", /*french*/ "Selon moi, une #Skulltula derrière les rochers roulants sous le lac# a #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, una #Skulltula protegida por rocas rodantes# bajo el lago otorga #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_GS_RIVER] = HintText(CustomMessage("They say that a #spider over a river# in the Water Temple holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne über einem Fluß# im Wassertempel #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula au dessus de la rivière du Temple de l'Eau# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula sobre un río# del Templo del Agua otorga #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH] = HintText(CustomMessage("They say that #beyond a pit of lizards# is a spider holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #jenseits einer Reptiliengrube# eine Spinne sei, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula près des lézards du Temple de l'Eau# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #más allá de un pozo de reptiles# una Skulltula otorga #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY] = HintText(CustomMessage("They say that #lizards guard a spider# in the Water Temple with #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #eine von Reptilien bewachte Spinne# im Wassertempel #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula dans les couloirs croisés du Temple de l'Eau# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, unos #reptiles custodian una Skulltula# del Templo del Agua que otorga #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_MQ_GS_RIVER] = HintText(CustomMessage("They say that a #spider over a river# in the Water Temple holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne oberhalb eines Flusses# im Wassertempel #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula au dessus de la rivière du Temple de l'Eau# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula sobre un río# del Templo del Agua otorga #[[1]]#. @@ -962,232 +962,232 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa | SPIRIT TEMPLE | ---------------------------*/ hintTextTable[RHT_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST] = HintText(CustomMessage("They say that a child conquers a #skull in green fire# in the Spirit Temple to reach #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein Kind einen #Schädel in grünem Feuer# im Geistertempel erobere, um #[[1]]# zu erreichen.", /*french*/ "Selon moi, le #crâne au halo vert dans le colosse# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el joven que #baje el puente# del Templo del Espíritu encontrará #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST] = HintText(CustomMessage("They say that a child can find a #caged chest# in the Spirit Temple with #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein Kind eine #gefangene Truhe# im Geistertempel finden könne, welche #[[1]]# enthielte.", /*french*/ "Selon moi, le #coffre embarré dans le colosse# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un joven puede encontrar un #cofre entre rejas# del Templo del Espíritu con #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_COMPASS_CHEST] = HintText(CustomMessage("They say that #across a pit of sand# in the Spirit Temple lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #jenseits einer Sandgrube# im Geistertempel #[[1]]# läge.", /*french*/ "Selon moi, le #trou sableux dans le colosse# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, tras un #pozo de arena# del Templo del Espíritu yace #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST] = HintText(CustomMessage("They say that #dodging boulders to collect silver rupees# in the Spirit Temple yields #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Ausweichen von Felsbrocken um silberne Rubine zu sammeln# im Geistertempel #[[1]]# einbrächte.", /*french*/ "Selon moi, les #pièces argentées entourées de rochers dans le colosse# révèlent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #esquivar rocas y conseguir plateadas rupias# en el Templo del Espíritu conduce a #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST] = HintText(CustomMessage("They say that a #shadow circling reflected light# in the Spirit Temple guards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #reflektierendes Licht umzirkelnder Schatten# im Geistertempel #[[1]]# bewachen würde.", /*french*/ "Selon moi, l'#ombre près d'un miroir# protège #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #círculo de reflectante luz# del Templo del Espíritu guarda #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST] = HintText(CustomMessage("They say that a #shadow circling reflected light# in the Spirit Temple guards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #reflektierendes Licht umzirkelnder Schatten# im Geistertempel #[[1]]# bewachen würde.", /*french*/ "Selon moi, l'#ombre près d'un miroir# protège #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #círculo de reflectante luz# del Templo del Espíritu guarda #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say that #before a giant statue# in the Spirit Temple lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #vor einer riesigen Statue# im Geistertempel #[[1]]# läge.", /*french*/ "Selon moi, #devant la statue# dans le colosse gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #ante una gran estatua# del Templo del Espíritu aguarda #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST] = HintText(CustomMessage("They say that #lizards in the Spirit Temple# guard #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Reptilien im Geistertempel# #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #lézards dans le colosse# protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #reptiles del Templo del Espíritu# guardan #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST] = HintText(CustomMessage("They say that #lizards in the Spirit Temple# guard #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Reptilien im Geistertempel# #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #lézards dans le colosse# protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #reptiles del Templo del Espíritu# guardan #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST] = HintText(CustomMessage("They say that #torchlight among Beamos# in the Spirit Temple reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Fackellicht inmitten von Strahlzyklopen# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, les #torches autour des Sentinelles# éclairent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #antorchas junto a Beamos# del Templo del Espíritu revelan #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST] = HintText(CustomMessage("They say that a #statue in the Spirit Temple# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Statue im Geistertempel# #[[1]]# hielte.", /*french*/ "Selon moi, la #statue dans le colosse# tient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #estatua del Templo del Espíritu# esconde #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST] = HintText(CustomMessage("They say that on a #ledge by a statue# in the Spirit Temple rests #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß auf einem #Vorsprung einer Statue# im Geistertempel #[[1]]# ruhe.", /*french*/ "Selon moi, #haut perché près de la statue# dans le colosse gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, al #borde de una estatua# del Templo del Espíritu yace #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST] = HintText(CustomMessage("They say that those who #show the light among statues# in the Spirit Temple find #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß jene, welche #das Licht inmitten von Statuen# im Geistertempel zeigen würden, #[[1]]# fänden.", /*french*/ "Selon moi, le #soleil près des statues# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, aquellos que #iluminen ante las estatuas# del Templo del Espíritu encontrarán #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth in the Spirit Temple# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Auge der Wahrheit im Geistertempel# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, le #trésor invisible près du Hache-Viande# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #Ojo de la Verdad# en el Templo del Espíritu revela #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth in the Spirit Temple# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Auge der Wahrheit im Geistertempel# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, le #trésor invisible près du Hache-Viande# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #Ojo de la Verdad# en el Templo del Espíritu revela #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that a #chest engulfed in flame# in the Spirit Temple holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #von Flammen eingehüllte Truhe# im Geistertempel #[[1]]# enthielte.", /*french*/ "Selon moi, le #coffre enflammé dans le colosse# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #cofre rodeado de llamas# del Templo del Espíritu contiene #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_TOPMOST_CHEST] = HintText(CustomMessage("They say that those who #show the light above the Colossus# find #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß jene, welche #das Licht auf dem Koloss# zeigen würden, #[[1]]# fänden.", /*french*/ "Selon moi, le #soleil au sommet du colosse# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, aquellos que #iluminen en lo alto del Coloso# encontrarán #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST] = HintText(CustomMessage("They say that #lying unguarded# in the Spirit Temple is #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #unbewacht liegend# im Geistertempel #[[1]]# sei.", /*french*/ "Selon moi, dans #l'entrée du colosse# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, en la #entrada del Templo del Espíritu# yace #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST] = HintText(CustomMessage("They say that a #switch in a pillar# within the Spirit Temple drops #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Schalter in einer Säule# innerhalb des Geistertempels #[[1]]# erbringe.", /*french*/ "Selon moi, l'#interrupteur dans un pilier# du colosse cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #interruptor de un pilar# del Templo del Espíritu revela #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST] = HintText(CustomMessage("They say that #collecting rupees through a water jet# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Sammeln von Rubin durch einen Wasserstrom# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, les #pièces argentées dans le jet d'eau# du colosse révèlent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #hacerte con rupias tras un géiser# revela #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST] = HintText(CustomMessage("They say that an #eye blinded by stone# within the Spirit Temple conceals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #durch einen Stein erblindetes Auge# im Geistertempel #[[1]]# verberge.", /*french*/ "Selon moi, #l'oeil derrière le rocher# dans le colosse voit #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #cegar a un ojo# del Templo del Espíritu revela #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_MAP_CHEST] = HintText(CustomMessage("They say that surrounded by #fire and wrappings# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß umgeben von #Feuer umhüllt# #[[1]]# läge.", /*french*/ "Selon moi, près des #pierres tombales dans le colosse# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, rodeado de #fuego y vendas# yace #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST] = HintText(CustomMessage("They say that a child defeats a #gauntlet of monsters# within the Spirit Temple to find #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein Kind eine #Herausforderung von Monstern# innerhalb des Geistertempels bewältige und #[[1]]# fände.", /*french*/ "Selon moi, l'enfant qui vainc #plusieurs monstres# dans le colosse trouvera #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el joven que derrote #unos monstruos# del Templo del Espíritu encontrará #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST] = HintText(CustomMessage("They say that #explosive sunlight# within the Spirit Temple uncovers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #explosives Sonnenlicht# innerhalb des Geistertempels #[[1]]# enthüllen würde.", /*french*/ "Selon moi, le #rayon de lumière explosif dans le colosse# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #explosiva luz solar# del Templo del Espíritu revela #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST] = HintText(CustomMessage("They say that #trapped by falling enemies# within the Spirit Temple is #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß sich #gefangen von fallenden Feinden# im Geistertempel #[[1]]# befände.", /*french*/ "Selon moi, des #ennemis tombants# dans le colosse protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #rodeado de enemigos del cielo# del Templo del Espíritu yace #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_COMPASS_CHEST] = HintText(CustomMessage("They say that #blinding the colossus# unveils #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Erblinden des Kolosses# #[[1]]# offenbare.", /*french*/ "Selon moi, #l'oeil dans le colosse# voit #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #cegar al coloso# revela #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST] = HintText(CustomMessage("They say that a #royal melody awakens the colossus# to reveal #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #königliche Melodie den Koloss erwecke# und #[[1]]# enthüllen würde.", /*french*/ "Selon moi, la #mélodie royale éveille le colosse# et révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #melodía real que despierte al coloso# revelará #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth# finds the colossus's hidden #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Auge der Wahrheit# des Kolosses verborgene #[[1]]# fände.", /*french*/ "Selon moi, #l'oeil de vérité# verra dans le colosse #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #Ojo de la Verdad# en el Templo del Espíritu encontrará #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST] = HintText(CustomMessage("They say that #the old hide what the young find# to reveal #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #der Alte verstecke, was der Junge finde# und #[[1]]# enthüllt würde.", /*french*/ "Selon moi, l'#oeil dans le trou du bloc argent# dans le colosse voit #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #adulto esconde lo que el joven anhela#, revelando #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST] = HintText(CustomMessage("They say that #sunlight in a maze of fire# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Sonnenlicht in einem Labyrinth aus Feuer# #[[1]]# verstecke.", /*french*/ "Selon moi, #la lumière dans le labyrinthe de feu# du colosse révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #luz solar de un ígneo laberinto# esconde #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST] = HintText(CustomMessage("They say that #across a pit of sand# in the Spirit Temple lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #jenseits einer Sandgrube# im Geistertempel #[[1]]# läge.", /*french*/ "Selon moi, le #trou sableux# dans le colosse a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #a través del pozo de arena# del Templo del Espíritu yace #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST] = HintText(CustomMessage("They say that where #temporal stone blocks the path# within the Spirit Temple lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß wo #zeitlicher Stein den Pfad blockiere# im Geistertempel #[[1]]# läge.", /*french*/ "Selon moi, les #pierres temporelles# dans le colosse cachent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, donde los #bloques temporales bloquean# en el Templo del Espíritu yace #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST] = HintText(CustomMessage("They say that a #chest of double purpose# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Truhe mit doppeltem Zweck# #[[1]]# enthielte.", /*french*/ "Selon moi, le #coffre à usage double# du colosse contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #cofre de doble uso# contiene #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that a #temporal stone blocks the light# leading to #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #zeitlicher Stein das Licht blockiere#, was zu #[[1]]# führe.", /*french*/ "Selon moi, la #pierre temporelle# le colosse fait ombre sur #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #bloque temporal bloquea la luz# que conduce a #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST] = HintText(CustomMessage("They say that those who #show the light above the Colossus# find #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß jene, welche #das Licht auf dem Koloss# zeigen würden, #[[1]]# fänden.", /*french*/ "Selon moi, le trésor invisible #au sommet du colosse# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, aquellos que #revelen la luz sobre el Coloso# encontrarán #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_TWINROVA_HEART] = HintText(CustomMessage("They say that #Twinrova# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Twinrova# #[[1]]# besäße.", /*french*/ "Selon moi, #Twinrova# possède #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, #Birova# porta #[[1]]#. {}, { CustomMessage("They say that the #Sorceress Sisters# hold #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Hexenschwestern# #[[1]]# besäßen.", /*french*/ "Selon moi, #les sorcières jumelles# possède #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, las #hermanas hechiceras# portan #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM] = HintText(CustomMessage("They say that a spider in the #hall of a knight# guards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine Spinne in der #Halle eines Ritters# #[[1]]# bewache.", /*french*/ "Selon moi, une #Skulltula au dessus d'un escalier du Temple de l'Esprit# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula en el salón de un guerrero# otorga #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_GS_BOULDER_ROOM] = HintText(CustomMessage("They say that a #spider behind a temporal stone# in the Spirit Temple yields #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne hinter einem zeitlichen Stein# im Geistertempel #[[1]]# einbrächte.", /*french*/ "Selon moi, une #Skulltula derrière une pierre temporelle du Temple de l'Esprit# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula tras un bloque temporal# del Templo del Espíritu otorga #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_GS_LOBBY] = HintText(CustomMessage("They say that a #spider beside a statue# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne neben einer Statue# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula dans la grande salle du Temple de l'Esprit# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula junto a una estatua# del Templo del Espíritu otorga #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM] = HintText(CustomMessage("They say that a #spider at the top of a deep shaft# in the Spirit Temple holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne auf der Spitze eines tiefen Stiels# im Geistertempel #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula près d'un mur d'escalade du Temple de l'Esprit# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula en lo alto de un gran hueco# del Templo del Espíritu otorga #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_GS_METAL_FENCE] = HintText(CustomMessage("They say that a child defeats a #spider among bats# in the Spirit Temple to gain #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein Kind #eine Spinne inmitten von Fledermäusen# im Geistertempel besiege und #[[1]]# erhielte.", /*french*/ "Selon moi, une #Skulltula sur le grillage du Temple de l'Esprit# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el joven que derrote la #Skulltula entre murciélagos# del Templo del Espíritu hallará #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM] = HintText(CustomMessage("They say that #above a pit of sand# in the Spirit Temple hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß sich #oberhalb einer Sandgrube# im Geistertempel #[[1]]# verstecke.", /*french*/ "Selon moi, une #Skulltula au dessus du trou sableux du Temple de l'Esprit# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula sobre un pozo de arena# del Templo del Espíritu otorga #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST] = HintText(CustomMessage("They say that a spider in the #hall of a knight# guards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine Spinne in der #Halle eines Ritters# #[[1]]# bewache.", /*french*/ "Selon moi, une #Skulltula dans la salle aux neuf trônes du Temple de l'Esprit# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula en el salón de un guerrero# otorga #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH] = HintText(CustomMessage("They say that a spider in the #hall of a knight# guards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine Spinne in der #Halle eines Ritters# #[[1]]# bewache.", /*french*/ "Selon moi, une #Skulltula dans la salle aux neuf trônes du Temple de l'Esprit# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula en el salón de un guerrero# otorga #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM] = HintText(CustomMessage("They say that #upon a web of glass# in the Spirit Temple sits a spider holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #auf einer Webe aus Glas# im Geistertempel eine Spinne säße, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur une paroi de verre du Temple de l'Esprit# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #sobre una plataforma de cristal# yace una Skulltula que otorga #[[1]]#. @@ -1195,242 +1195,242 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa | SHADOW TEMPLE | ---------------------------*/ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth# pierces a hall of faces to reveal #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Auge der Wahrheit# eine Halle der Gesichter durchdränge und #[[1]]# offenbaren würde.", /*french*/ "Selon moi, l'#oeil de vérité# voit dans les couloirs du Temple de l'Ombre #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #Ojo de la Verdad# descubrirá un pasillo de facetas con #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_HOVER_BOOTS_CHEST] = HintText(CustomMessage("They say that #Dead Hand in the Shadow Temple# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #tote Hand im Schattentempel# #[[1]]# hielte.", /*french*/ "Selon moi, le #Poigneur dans le Temple de l'Ombre# cache #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, la #Mano Muerta del Templo de las Sombras# guarda #[[1]]#. {}, { CustomMessage("They say that a #nether dweller in the Shadow Temple# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Bewohner der Unterwelt im Schattentempel# #[[1]]# besäße.", /*french*/ "Selon moi, le #spectre du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, un #temido morador del Templo de las Sombras# guarda #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_COMPASS_CHEST] = HintText(CustomMessage("They say that #mummies revealed by the Eye of Truth# guard #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #durch das Auge der Wahrheit offenbarte Mumien# #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #Gibdos dans les couloirs# du Temple de l'Ombre protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #momias reveladas por el Ojo de la Verdad# guardan #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST] = HintText(CustomMessage("They say that #spinning scythes# protect #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #rotierende Sensen# #[[1]]# schützen würden.", /*french*/ "Selon moi, les #faucheurs danseurs# du Temple de l'Ombre protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #giratorias guadañas# protegen #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST] = HintText(CustomMessage("They say that #invisible blades# guard #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #unsichtbare Klingen# #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #faucheurs invisibles# du Temple de l'Ombre protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #hojas invisibles# guardan #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST] = HintText(CustomMessage("They say that #invisible blades# guard #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #unsichtbare Klingen# #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #faucheurs invisibles# du Temple de l'Ombre protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #hojas invisibles# guardan #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST] = HintText(CustomMessage("They say that #falling spikes# block the path to #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #fallende Stacheln# den Pfad zu #[[1]]# blockieren würden.", /*french*/ "Selon moi, la #pluie de clous# surplombe #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #pinchos de un techo# conducen a #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST] = HintText(CustomMessage("They say that #falling spikes# block the path to #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #fallende Stacheln# den Pfad zu #[[1]]# blockieren würden.", /*french*/ "Selon moi, la #pluie de clous# surplombe #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #pinchos de un techo# conducen a #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST] = HintText(CustomMessage("They say that #falling spikes# block the path to #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #fallende Stacheln# den Pfad zu #[[1]]# blockieren würden.", /*french*/ "Selon moi, la #pluie de clous# surplombe #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #pinchos de un techo# conducen a #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST] = HintText(CustomMessage("They say that the #dead roam among invisible spikes# guarding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #herumschweifende Tote inmitten von unsichtbaren Stacheln# #[[1]]# bewachen würden.", /*french*/ "Selon moi, #parmi les clous invisibles# du Temple de l'Ombre se cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #muertos que vagan por pinchos invisibles# protegen #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_WIND_HINT_CHEST] = HintText(CustomMessage("They say that an #invisible chest guarded by the dead# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #von Toten bewachte unsichtbare Truhe# #[[1]]# enthielte.", /*french*/ "Selon moi, le #trésor invisible du cul-de-sac# du Temple de l'Ombre contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #cofre invisible custodiado por los del más allá# contiene #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST] = HintText(CustomMessage("They say that #mummies guarding a ferry# hide #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #eine Fähre bewachende Mumien# #[[1]]# verstecken würden.", /*french*/ "Selon moi, les #Gibdos qui bloquent le traversier# cachent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #momias que protegen un navío# esconden #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST] = HintText(CustomMessage("They say that #mummies guarding a ferry# hide #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #eine Fähre bewachende Mumien# #[[1]]# verstecken würden.", /*french*/ "Selon moi, les #Gibdos qui bloquent le traversier# cachent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #momias que protegen un navío# esconden #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST] = HintText(CustomMessage("They say that #walls consumed by a ball of fire# reveal #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #von einem Feuerball verschlungende Wände# #[[1]]# offenbaren würden.", /*french*/ "Selon moi, le #piège de bois# du Temple de l'Ombre cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #paredes consumidas por una esfera ígnea# revelan #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that #walls consumed by a ball of fire# reveal #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #von einem Feuerball verschlungende Wände# #[[1]]# offenbaren würden.", /*french*/ "Selon moi, le #piège de bois# du Temple de l'Ombre cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #paredes consumidas por una esfera ígnea# revelan #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_FREESTANDING_KEY] = HintText(CustomMessage("They say that #inside a burning skull# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #innerhalb eines brennenden Schädels# #[[1]]# läge.", /*french*/ "Selon moi, #dans un crâne enflammé# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, en el #interior de una calavera en llamas# aguarda #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_COMPASS_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth# pierces a hall of faces to reveal #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Auge der Wahrheit# eine Halle der Gesichter durchdränge und #[[1]]# offenbaren würde.", /*french*/ "Selon moi, l'#oeil de vérité# voit dans les couloirs du Temple de l'Ombre #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #Ojo de la Verdad# descubre un pasillo de facetas con #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST] = HintText(CustomMessage("They say that #Dead Hand in the Shadow Temple# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #tote Hand im Schattentempel# #[[1]]# hielte.", /*french*/ "Selon moi, le #Poigneur dans le Temple de l'Ombre# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #Mano Muerta del Templo de las Sombras# guarda #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST] = HintText(CustomMessage("They say that #mummies revealed by the Eye of Truth# guard #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #durch das Auge der Wahrheit offenbarte Mumien# #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #Gibdos dans les couloirs# du Temple de l'Ombre protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #momias reveladas por el Ojo de la Verdad# guardan #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_MAP_CHEST] = HintText(CustomMessage("They say that #spinning scythes# protect #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #rotierende Sensen# #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #faucheurs danseurs# du Temple de l'Ombre protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #giratorias guadañas# protegen #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST] = HintText(CustomMessage("They say that #collecting rupees in a vast cavern# with the Shadow Temple unveils #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Sammeln von Rubinen in einer riesigen Kaverne# im Schattentempel #[[1]]# offenbaren würde.", /*french*/ "Selon moi, les #pièces argentées dans le Temple de l'Ombre# révèlent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, hacerte con las #rupias en una gran caverna# del Templo de las Sombras revela #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST] = HintText(CustomMessage("They say that #falling spikes# block the path to #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #fallende Stachel# den Pfad zu #[[1]]# blockieren würden.", /*french*/ "Selon moi, la #pluie de clous# surplombe #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #pinchos de un techo# conducen a #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST] = HintText(CustomMessage("They say that #falling spikes# block the path to #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #fallende Stachel# den Pfad zu #[[1]]# blockieren würden.", /*french*/ "Selon moi, la #pluie de clous# surplombe #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #pinchos de un techo# conducen a #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST] = HintText(CustomMessage("They say that #falling spikes# block the path to #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #fallende Stachel# den Pfad zu #[[1]]# blockieren würden.", /*french*/ "Selon moi, la #pluie de clous# surplombe #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #pinchos de un techo# conducen a #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST] = HintText(CustomMessage("They say that the #dead roam among invisible spikes# guarding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #herumschweifende Tote inmitten von unsichtbaren Stacheln# #[[1]]# bewachen würden.", /*french*/ "Selon moi, #parmi les clous invisibles# du Temple de l'Ombre se cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #muertos que vagan por pinchos invisibles# protegen #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that #walls consumed by a ball of fire# reveal #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #von einem Feuerball verschlungende Wände# #[[1]]# offenbaren würden.", /*french*/ "Selon moi, le #piège de bois# du Temple de l'Ombre cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #paredes consumidas por una esfera ígnea# revelan #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST] = HintText(CustomMessage("They say that #walls consumed by a ball of fire# reveal #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #von einem Feuerball verschlungende Wände# #[[1]]# offenbaren würden.", /*french*/ "Selon moi, le #piège de bois# du Temple de l'Ombre cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #paredes consumidas por una esfera ígnea# revelan #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST] = HintText(CustomMessage("They say that near an #empty pedestal# within the Shadow Temple lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß nahe einem #leeren Sockel# im Schattentempel #[[1]]# läge.", /*french*/ "Selon moi, #près d'un pédestal vide du Temple de l'Ombre# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, cerca de un #vacío pedestal# del Templo de las Sombras yace #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST] = HintText(CustomMessage("They say that #invisible blades# guard #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #unsichtbare Klingen# #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #faucheurs invisibles# du Temple de l'Ombre protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, unas #hojas invisibles# guardan #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST] = HintText(CustomMessage("They say that #invisible blades# guard #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #unsichtbare Klingen# #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #faucheurs invisibles# du Temple de l'Ombre protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, unas #hojas invisibles# guardan #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_WIND_HINT_CHEST] = HintText(CustomMessage("They say that an #invisible chest guarded by the dead# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #von Toten bewachte unsichtbare Truhe# #[[1]]# enthielte.", /*french*/ "Selon moi, le #trésor invisible du cul-de-sac# du Temple de l'Ombre contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #cofre invisible custodiado por los del más allá# contiene #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST] = HintText(CustomMessage("They say that #mummies guarding a ferry# hide #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #eine Fähre bewachende Mumien# #[[1]]# verstecken würden.", /*french*/ "Selon moi, les #Gibdos qui bloquent le traversier# cachent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #momias que protegen un navío# esconden #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST] = HintText(CustomMessage("They say that #mummies guarding a ferry# hide #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #eine Fähre bewachende Mumien# #[[1]]# verstecken würden.", /*french*/ "Selon moi, les #Gibdos qui bloquent le traversier# cachent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #momias que protegen un navío# esconden #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST] = HintText(CustomMessage("They say that #caged near a ship# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #in der Nähe eines Schiffes eingesperrt# #[[1]]# läge.", /*french*/ "Selon moi, #dans une cage près du traversier# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #entre rejas al lado de un navío# yace #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_FREESTANDING_KEY] = HintText(CustomMessage("They say that #behind three burning skulls# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #hinter drei brennenden Schädeln# #[[1]]# läge.", /*french*/ "Selon moi, #derrière trois crânes enflammés# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, tras #tres ardientes calaveras# yace #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_BONGO_BONGO_HEART] = HintText(CustomMessage("They say that #Bongo Bongo# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Bongo Bongo# #[[1]]# besäße.", /*french*/ "Selon moi, #Bongo Bongo# possède #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, #Bongo Bongo# porta #[[1]]#. {}, { CustomMessage("They say that the #Phantom Shadow Beast# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Phantomschattenbiest# #[[1]]# besäße.", /*french*/ "Selon moi, le #monstre de l'ombre# possède #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, la #alimaña oscura espectral# porta #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT] = HintText(CustomMessage("They say that #beyond a burning skull# lies a spider with #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #jenseits eines brennenden Schädels# eine Spinne läge, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula derrière un crâne enflammé du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #tras una ardiente calavera# yace una Skulltula que otorga #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM] = HintText(CustomMessage("They say that a #spider beyond falling spikes# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne jenseits fallender Stacheln# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula au delà de la pluie de clous du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula tras los pinchos del techo# otorga #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT] = HintText(CustomMessage("They say that #beyond three burning skulls# lies a spider with #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #jenseits drei brennender Schädel# eine Spinne läge, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula derrière trois crânes enflammés du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #tras tres ardientes calaveras# yace una Skulltula que otorga #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM] = HintText(CustomMessage("They say that a spider guarded by #invisible blades# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine Spinne von #unsichtbaren Klingen# bewacht werde und #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula protégée par les faucheurs invisibles du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula custodiada por hojas invisibles# otorga #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_GS_NEAR_SHIP] = HintText(CustomMessage("They say that a spider near a #docked ship# hoards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine Spinne nahe eines #geankerten Schiffs# #[[1]]# horte.", /*french*/ "Selon moi, une #Skulltula près du traversier du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula cercana a un navío# otorga #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM] = HintText(CustomMessage("They say that a #spider beyond falling spikes# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne jenseits fallender Stacheln# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula au delà de la pluie de clous du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula tras los pinchos del techo# otorga #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM] = HintText(CustomMessage("They say that a #spider amidst roaring winds# in the Shadow Temple holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne inmitten stürmischer Winde# im Schattentempel #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula près des vents du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula entre ventarrones# del Templo de las Sombras otorga #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_GS_AFTER_WIND] = HintText(CustomMessage("They say that a #spider beneath gruesome debris# in the Shadow Temple hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne unterhalb grauenvoller Trümmer# im Schattentempel #[[1]]# verstecke.", /*french*/ "Selon moi, une #Skulltula sous des débris du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula bajo unos horripilantes escombros# del Templo de las Sombras otorga #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP] = HintText(CustomMessage("They say that a #fallen statue# reveals a spider with #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #fallende Statue# eine Spinne enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula près de la statue écroulée du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #estatua caída# revelará una Skulltula que otorgue #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS] = HintText(CustomMessage("They say that a #suspended spider# guards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #hängende Spinne# #[[1]]# bewache.", /*french*/ "Selon moi, une #Skulltula près du repère du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula flotante# del Templo de las Sombras otorga #[[1]]#. @@ -1438,117 +1438,117 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th | BOTTOM OF THE WELL | ---------------------------*/ hintTextTable[RHT_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth in the well# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Auge der Wahrheit im Brunnen# #[[1]]# offenbare.", /*french*/ "Selon moi, l'#oeil de vérité dans le Puits# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #Ojo de la Verdad en el pozo# revela #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST] = HintText(CustomMessage("They say that #gruesome debris# in the well hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #grauenvolle Trümmer# im Brunnen #[[1]]# verbergen würden.", /*french*/ "Selon moi, des #débris dans le Puits# cachent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, unos #horripilantes escombros# del pozo esconden #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth in the well# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Auge der Wahrheit im Brunnen# #[[1]]# offenbare.", /*french*/ "Selon moi, l'#oeil de vérité dans le Puits# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #Ojo de la Verdad en el pozo# revela #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_COMPASS_CHEST] = HintText(CustomMessage("They say that a #hidden entrance to a cage# in the well leads to #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #verborgener Eingang zu einem Käfig# im Brunnen zu #[[1]]# führe.", /*french*/ "Selon moi, dans un #chemin caché dans le Puits# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #entrada oculta de una celda# del pozo conduce a #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST] = HintText(CustomMessage("They say that a #spider guarding a cage# in the well protects #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #einen Käfig schützende Spinne# im Brunnen #[[1]]# schütze.", /*french*/ "Selon moi, l'#araignée dans la cage du Puits# protège #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #araña protegiendo una celda# del pozo guarda #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST] = HintText(CustomMessage("They say that #gruesome debris# in the well hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #grauenvolle Trümmer# im Brunnen #[[1]]# verbergen würde.", /*french*/ "Selon moi, des #débris dans le Puits# cachent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, unos #horripilantes escombros# del pozo esconden #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_INVISIBLE_CHEST] = HintText(CustomMessage("They say that #Dead Hand's invisible secret# is #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #unsichtbare Geheimnis der toten Hand# #[[1]]# sei.", /*french*/ "Selon moi, le #trésor invisible du Poigneur# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #secreto invisible de la Mano Muerta# esconde #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST] = HintText(CustomMessage("They say that a #royal melody in the well# uncovers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #königliche Melodie im Brunnen# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, la #mélodie royale révèle dans le Puits# #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #melodía real en el pozo# revela #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST] = HintText(CustomMessage("They say that a #royal melody in the well# uncovers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #königliche Melodie im Brunnen# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, la #mélodie royale révèle dans le Puits# #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #melodía real en el pozo# revela #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_MAP_CHEST] = HintText(CustomMessage("They say that in the #depths of the well# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß in den #Tiefen des Brunnens# #[[1]]# läge.", /*french*/ "Selon moi, #dans le coeur du Puits# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, en las #profundidades del pozo# yace #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST] = HintText(CustomMessage("They say that #perilous pits# in the well guard the path to #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #gefährliche Gruben# im Brunnen den Pfad zu #[[1]]# bewachen würden.", /*french*/ "Selon moi, #trois trous# dans le Puits protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #peligrosos fosos# del pozo conducen a #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST] = HintText(CustomMessage("They say that #locked in a cage# in the well lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #in einem Käfig eingeschlossen# im Brunnen #[[1]]# läge.", /*french*/ "Selon moi, #dans une cage# du Puits gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #entre rejas# en el pozo yace #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_FREESTANDING_KEY] = HintText(CustomMessage("They say that #inside a coffin# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #in einem Sarg# #[[1]]# verborgen läge.", /*french*/ "Selon moi, dans #un cercueil# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, en el #interior de un ataúd# yace #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_MAP_CHEST] = HintText(CustomMessage("They say that a #royal melody in the well# uncovers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #königliche Melodie im Brunnen# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, la #mélodie royale révèle dans le Puits# #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #melodía real en el pozo# revela #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST] = HintText(CustomMessage("They say that an #army of the dead# in the well guards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Armee der Toten# im Brunnen #[[1]]# bewachen würde.", /*french*/ "Selon moi, l'#armée des morts# dans le Puits protège #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #ejército del más allá# del pozo guarda #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY] = HintText(CustomMessage("They say that #Dead Hand's explosive secret# is #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #explosive Geheimnis der toten Hand# #[[1]]# sei.", /*french*/ "Selon moi, le #secret explosif du Poigneur# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #explosivo secreto de la Mano Muerta# esconde #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY] = HintText(CustomMessage("They say that an #invisible path in the well# leads to #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #unsichtbarer Pfad im Brunnen# zu #[[1]]# führe.", /*french*/ "Selon moi, dans un #chemin caché dans le Puits# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #camino invisible del pozo# conduce a #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE] = HintText(CustomMessage("They say that a #spider locked in a cage# in the well holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #in einem Käfig eingeschlossene Spinne# im Brunnen #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula dans une cage au fonds du Puits# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula enjaulada# del pozo otorga #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM] = HintText(CustomMessage("They say that an #invisible path in the well# leads to #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #unsichtbarer Pfad im Brunnen# zu #[[1]]# führe.", /*french*/ "Selon moi, une #Skulltula dans le chemin invisible au fonds du Puits# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #camino invisible del pozo# conduce a una Skulltula que otorga #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM] = HintText(CustomMessage("They say that a #spider locked in a crypt# within the well guards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #in einer Krypta eingeschlossene Spinne# im Brunnen #[[1]]# bewache.", /*french*/ "Selon moi, une #Skulltula embarrée dans la crypte au fonds du Puits# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula encerrada en una cripta# del pozo otorga #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT] = HintText(CustomMessage("They say that a #gauntlet of invisible spiders# protects #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Herausforderung unsichtbarer Spinnen# #[[1]]# bewache.", /*french*/ "Selon moi, une #Skulltula protégée par les araignées invisibles au fonds du Puits# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, unas #arañas invisibles# custodian una Skulltula que otorga #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM] = HintText(CustomMessage("They say that a #spider crawling near the dead# in the well holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #nahe der Toten kriechende Spinne# im Brunnen #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula près des cercueils au fonds du Puits# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula junto a los muertos# del pozo otorga #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM] = HintText(CustomMessage("They say that a #spider locked in a crypt# within the well guards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #in einer Krypta eingeschlossene Spinne# im Brunnen #[[1]]# bewache.", /*french*/ "Selon moi, une #Skulltula embarrée dans la crypte au fonds du Puits# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula encerrada en una cripta# del pozo otorga #[[1]]#. @@ -1556,72 +1556,72 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th | ICE CAVERN | ---------------------------*/ hintTextTable[RHT_ICE_CAVERN_MAP_CHEST] = HintText(CustomMessage("They say that #winds of ice# surround #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Eiswinde# #[[1]]# umgeben würden.", /*french*/ "Selon moi, #figé dans la glace rouge# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #heladas borrascas# rodean #[[1]]#. hintTextTable[RHT_ICE_CAVERN_COMPASS_CHEST] = HintText(CustomMessage("They say that a #wall of ice# protects #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Eiswand# #[[1]]# schütze.", /*french*/ "Selon moi, #un mur de glace rouge# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #gélida pared# protege #[[1]]#. hintTextTable[RHT_ICE_CAVERN_IRON_BOOTS_CHEST] = HintText(CustomMessage("They say that a #monster in a frozen cavern# guards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Monster in einer gefrorenen Kaverne# #[[1]]# bewache.", /*french*/ "Selon moi, le #monstre de la caverne de glace# protège #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #monstruo de una helada caverna# guarda #[[1]]#. hintTextTable[RHT_ICE_CAVERN_FREESTANDING_POH] = HintText(CustomMessage("They say that a #wall of ice# protects #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Eiswand# #[[1]]# schütze.", /*french*/ "Selon moi, un #mur de glace rouge# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #gélida pared# protege #[[1]]#. hintTextTable[RHT_ICE_CAVERN_MQ_IRON_BOOTS_CHEST] = HintText(CustomMessage("They say that a #monster in a frozen cavern# guards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Monster in einer gefrorenen Kaverne# #[[1]]# bewache.", /*french*/ "Selon moi, le #monstre de la caverne de glace# protège #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #monstruo de una helada caverna# guarda #[[1]]#. hintTextTable[RHT_ICE_CAVERN_MQ_COMPASS_CHEST] = HintText(CustomMessage("They say that #winds of ice# surround #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Eiswinde# #[[1]]# umgeben würden.", /*french*/ "Selon moi, #entouré de vent glacial# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #heladas borrascas# rodean #[[1]]#. hintTextTable[RHT_ICE_CAVERN_MQ_MAP_CHEST] = HintText(CustomMessage("They say that a #wall of ice# protects #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Eiswand# #[[1]]# schütze.", /*french*/ "Selon moi, #un mur de glace rouge# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #gélida pared# protege #[[1]]#. hintTextTable[RHT_ICE_CAVERN_MQ_FREESTANDING_POH] = HintText(CustomMessage("They say that #winds of ice# surround #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Eiswinde# #[[1]]# umgeben würden.", /*french*/ "Selon moi, #entouré de vent glacial# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #heladas borrascas# rodean #[[1]]#. hintTextTable[RHT_ICE_CAVERN_GS_PUSH_BLOCK_ROOM] = HintText(CustomMessage("They say that a #spider above icy pits# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne oberhalb eisiger Gruben# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula au dessus d'un goufre glacial# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula sobre gélidos vacíos# otorga #[[1]]#. hintTextTable[RHT_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM] = HintText(CustomMessage("They say that #spinning ice# guards a spider holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #rotierendes Eis# eine Spinne beschütze, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula près de deux lames de glace# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, unos #témpanos giratorios# custodian una Skulltula que otorga #[[1]]#. hintTextTable[RHT_ICE_CAVERN_GS_HEART_PIECE_ROOM] = HintText(CustomMessage("They say that a #spider behind a wall of ice# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne hinter einer Eiswand# #[[1]]# verstecke.", /*french*/ "Selon moi, une #Skulltula derrière un mur de glace# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula tras una gélida pared# otorga #[[1]]#. hintTextTable[RHT_ICE_CAVERN_MQ_GS_SCARECROW] = HintText(CustomMessage("They say that a #spider above icy pits# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne oberhalb eisiger Gruben# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula au dessus d'un goufre glacial# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula sobre gélidos vacíos# otorga #[[1]]#. hintTextTable[RHT_ICE_CAVERN_MQ_GS_ICE_BLOCK] = HintText(CustomMessage("They say that a #web of ice# surrounds a spider with #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Webe aus Eis# eine Spinne umgebe, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula protégée d'une toile glacée# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #gélida red# rodea a una Skulltula que otorga #[[1]]#. hintTextTable[RHT_ICE_CAVERN_MQ_GS_RED_ICE] = HintText(CustomMessage("They say that a #spider in fiery ice# hoards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne in feurigem Eis# #[[1]]# horte.", /*french*/ "Selon moi, une #Skulltula figée dans la glace rouge# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula tras un ardiente hielo# otorga #[[1]]#. @@ -1629,177 +1629,177 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th | GERUDO TRAINING GROUNDS | ---------------------------*/ hintTextTable[RHT_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST] = HintText(CustomMessage("They say that a #blinded eye in the Gerudo Training Grounds# drops #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #erblindetes Auge in der Gerudo-Trainingsarena# #[[1]]# fallen ließe.", /*french*/ "Selon moi, l'#Oeil dans le Gymnase Gerudo# voit #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #cegar un ojo en el Centro de Instrucción Gerudo# revela #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST] = HintText(CustomMessage("They say that a #blinded eye in the Gerudo Training Grounds# drops #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #erblindetes Auge in der Gerudo-Trainingsarena# #[[1]]# fallen ließe.", /*french*/ "Selon moi, l'#Oeil dans le Gymnase Gerudo# voit #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #cegar un ojo en el Centro de Instrucción Gerudo# revela #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_STALFOS_CHEST] = HintText(CustomMessage("They say that #soldiers walking on shifting sands# in the Gerudo Training Grounds guard #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #auf veränderlichen Sanden laufende Soldaten# in der Gerudo-Trainingsarena #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #squelettes# du Gymnase Gerudo protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #soldados en resbaladizas arenas# del Centro de Instrucción Gerudo protegen #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_BEAMOS_CHEST] = HintText(CustomMessage("They say that #reptilian warriors# in the Gerudo Training Grounds protect #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #reptilienartige Krieger# in der Gerudo-Trainingsarena #[[1]]# schützen würden.", /*french*/ "Selon moi, les #lézards# dans le Gymnase Gerudo protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #unos escamosos guerreros# del Centro de Instrucción Gerudo protegen #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_HIDDEN_CEILING_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth# in the Gerudo Training Grounds reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Auge der Wahrheit# in der Gerudo-Trainingsarena #[[1]]# enthülle.", /*french*/ "Selon moi, #bien caché# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #Ojo de la Verdad# en el Centro de Instrucción Gerudo revela #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MAZE_PATH_FIRST_CHEST] = HintText(CustomMessage("They say that the first prize of #the thieves' training# is #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der erste Preis des #Diebestrainings# #[[1]]# sei.", /*french*/ "Selon moi, le #premier trésor du Gymnase Gerudo# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el primer premio de la #instrucción bandida# se trata de #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MAZE_PATH_SECOND_CHEST] = HintText(CustomMessage("They say that the second prize of #the thieves' training# is #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der zweite Preis des #Diebestrainings# #[[1]]# sei.", /*french*/ "Selon moi, le #deuxième trésor du Gymnase Gerudo# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el segundo premio de la #instrucción bandida# se trata de #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MAZE_PATH_THIRD_CHEST] = HintText(CustomMessage("They say that the third prize of #the thieves' training# is #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der dritte Preis des #Diebestrainings# #[[1]]# sei.", /*french*/ "Selon moi, le #troisième trésor du Gymnase Gerudo# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el tercer premio de la #instrucción bandida# se trata de #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MAZE_RIGHT_CENTRAL_CHEST] = HintText(CustomMessage("They say that the #Song of Time# in the Gerudo Training Grounds leads to #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Hymne der Zeit# in der Gerudo-Trainingsarena zu #[[1]]# führe.", /*french*/ "Selon moi, le #chant du temps# révèle dans le Gymnase Gerudo #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #Canción del Tiempo# en el Centro de Instrucción Gerudo conduce a #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST] = HintText(CustomMessage("They say that the #Song of Time# in the Gerudo Training Grounds leads to #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Hymne der Zeit# in der Gerudo-Trainingsarena zu #[[1]]# führe.", /*french*/ "Selon moi, le #chant du temps# révèle dans le Gymnase Gerudo #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #Canción del Tiempo# en el Centro de Instrucción Gerudo conduce a #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST] = HintText(CustomMessage("They say that #fiery foes# in the Gerudo Training Grounds guard #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #feurige Feinde# in der Gerudo-Trainingsarena #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #limaces de feu# du Gymnase Gerudo protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, unos #flamígeros enemigos# del Centro de Instrucción Gerudo guardan #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_HAMMER_ROOM_SWITCH_CHEST] = HintText(CustomMessage("They say that #engulfed in flame# where thieves train lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #von Flammen umschlungen# wo Diebe trainieren #[[1]]# läge.", /*french*/ "Selon moi, le #trésor enflammé# du Gymnase Gerudo est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, donde entrenan las bandidas #entre llamas# yace #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_EYE_STATUE_CHEST] = HintText(CustomMessage("They say that thieves #blind four faces# to find #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß Diebe #vier Gesichter erblinden# würden und #[[1]]# fänden.", /*french*/ "Selon moi, l'#épreuve d'archerie# du Gymnase Gerudo donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las bandidas #ciegan cuatro bustos# para hallar #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_NEAR_SCARECROW_CHEST] = HintText(CustomMessage("They say that thieves #blind four faces# to find #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß Diebe #vier Gesichter erblinden# würden und #[[1]]# fänden.", /*french*/ "Selon moi, l'#épreuve d'archerie# du Gymnase Gerudo donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las bandidas #ciegan cuatro bustos# para hallar #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST] = HintText(CustomMessage("They say that #before a block of silver# thieves can find #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #vor einem Block aus Silber# Diebe #[[1]]# finden könnten.", /*french*/ "Selon moi, #près d'un bloc argent# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #ante un plateado bloque# las bandidas hallan #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FIRST_CHEST] = HintText(CustomMessage("They say that a #feat of strength# rewards thieves with #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Meisterstück der Stärke# Diebe mit #[[1]]# belohnen würde.", /*french*/ "Selon moi, #derrière un bloc argent# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #hazaña de fuerza# premia a las bandidas con #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_SECOND_CHEST] = HintText(CustomMessage("They say that a #feat of strength# rewards thieves with #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Meisterstück der Stärke# Diebe mit #[[1]]# belohnen würde.", /*french*/ "Selon moi, #derrière un bloc argent# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #hazaña de fuerza# premia a las bandidas con #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST] = HintText(CustomMessage("They say that a #feat of strength# rewards thieves with #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Meisterstück der Stärke# Diebe mit #[[1]]# belohnen würde.", /*french*/ "Selon moi, #derrière un bloc argent# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #hazaña de fuerza# premia a las bandidas con #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST] = HintText(CustomMessage("They say that a #feat of strength# rewards thieves with #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Meisterstück der Stärke# Diebe mit #[[1]]# belohnen würde.", /*french*/ "Selon moi, #derrière un bloc argent# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #hazaña de fuerza# premia a las bandidas con #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_FREESTANDING_KEY] = HintText(CustomMessage("They say that the #Song of Time# in the Gerudo Training Grounds leads to #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Hymne der Zeit# in der Gerudo-Trainingsarena zu #[[1]]# führe.", /*french*/ "Selon moi, le #chant du temps# révèle dans le Gymnase Gerudo #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #Canción del Tiempo# en el Centro de Instrucción Gerudo conduce a #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_CHEST] = HintText(CustomMessage("They say that #thieves prepare for training# with #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß sich #Diebe auf das Training vorbereiteten# mit #[[1]]#.", /*french*/ "Selon moi, dans #l'entrée du Gymnase Gerudo# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #bandidas se instruyen# con #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_CHEST] = HintText(CustomMessage("They say that #thieves prepare for training# with #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß sich #Diebe auf das Training vorbereiteten# mit #[[1]]#.", /*french*/ "Selon moi, dans #l'entrée du Gymnase Gerudo# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #bandidas se instruyen# con #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST] = HintText(CustomMessage("They say that #soldiers walking on shifting sands# in the Gerudo Training Grounds guard #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #auf veränderlichen Sanden laufende Soldaten# in der Gerudo-Trainingsarena #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #squelettes# du Gymnase Gerudo protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #soldados en resbaladizas arenas# del Centro de Instrucción Gerudo protegen #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_BEFORE_HEAVY_BLOCK_CHEST] = HintText(CustomMessage("They say that #before a block of silver# thieves can find #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #vor einem Block aus Silber# Diebe #[[1]]# finden könnten.", /*french*/ "Selon moi, #près d'un bloc argent# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #ante un plateado bloque# las bandidas hallan #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_EYE_STATUE_CHEST] = HintText(CustomMessage("They say that thieves #blind four faces# to find #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß Diebe #vier Gesichter erblinden# würden und #[[1]]# fänden.", /*french*/ "Selon moi, l'#épreuve d'archerie# du Gymnase Gerudo donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las bandidas #ciegan cuatro bustos# para hallar #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_FLAME_CIRCLE_CHEST] = HintText(CustomMessage("They say that #engulfed in flame# where thieves train lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #von Flammen umschlungen# wo Diebe trainieren #[[1]]# läge.", /*french*/ "Selon moi, le #trésor enflammé# du Gymnase Gerudo est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, donde entrenan las bandidas #entre llamas# yace #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_SECOND_IRON_KNUCKLE_CHEST] = HintText(CustomMessage("They say that #fiery foes# in the Gerudo Training Grounds guard #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #feurige Feinde# in der Gerudo-Trainingsarena #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #ennemis de feu# du Gymnase Gerudo protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, unos #flamígeros enemigos# del Centro de Instrucción Gerudo guardan #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST] = HintText(CustomMessage("They say that #reptilian warriors# in the Gerudo Training Grounds protect #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #reptilienartige Krieger# in der Gerudo-Trainingsarena #[[1]]# schützen würden.", /*french*/ "Selon moi, les #lézards# dans le Gymnase Gerudo protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #unos escamosos guerreros# del Centro de Instrucción Gerudo protegen #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_CENTRAL_CHEST] = HintText(CustomMessage("They say that a #path of fire# leads thieves to #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #Pfad des Feuers# Diebe zu #[[1]]# führe.", /*french*/ "Selon moi, dans le #chemin enflammé# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #camino de fuego# conduce a las bandidas a #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_FIRST_CHEST] = HintText(CustomMessage("They say that the first prize of #the thieves' training# is #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der erste Preis des #Diebestrainings# #[[1]]# sei.", /*french*/ "Selon moi, le #premier trésor du Gymnase Gerudo# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el primer premio de la #instrucción bandida# se trata de #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_SIDE_CHEST] = HintText(CustomMessage("They say that a #path of fire# leads thieves to #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #Pfad des Feuers# Diebe zu #[[1]]# führe.", /*french*/ "Selon moi, dans le #chemin enflammé# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #camino de fuego# conduce a las bandidas a #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST] = HintText(CustomMessage("They say that the third prize of #the thieves' training# is #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der dritte Preis des #Diebestrainings# #[[1]]# sei.", /*french*/ "Selon moi, le #troisième trésor du Gymnase Gerudo# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el tercer premio de la #instrucción bandida# se trata de #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_SECOND_CHEST] = HintText(CustomMessage("They say that the second prize of #the thieves' training# is #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der zweite Preis des #Diebestrainings# #[[1]]# sei.", /*french*/ "Selon moi, le #deuxième trésor du Gymnase Gerudo# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el segundo premio de la #instrucción bandida# se trata de #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth# in the Gerudo Training Grounds reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Auge der Wahrheit# in der Gerudo-Trainingsarena #[[1]]# enthülle.", /*french*/ "Selon moi, #bien caché# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #Ojo de la Verdad# en el Centro de Instrucción Gerudo revela #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST] = HintText(CustomMessage("They say that a #feat of strength# rewards thieves with #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Meisterstück der Stärke# Diebe mit #[[1]]# belohnen würde.", /*french*/ "Selon moi, #derrière un bloc argent# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #hazaña de fuerza# premia a las bandidas con #[[1]]#. @@ -1807,192 +1807,192 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th | GANONS CASTLE | ---------------------------*/ hintTextTable[RHT_GANONS_TOWER_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that the #Evil King# hoards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #böse König# #[[1]]# horte.", /*french*/ "Selon moi, le #Roi du Mal# possède #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #Rey del Mal# acapara #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_FOREST_TRIAL_CHEST] = HintText(CustomMessage("They say that the #test of the wilds# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Prüfung der Wildnis# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve des bois# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #prueba de la naturaleza# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST] = HintText(CustomMessage("They say that the #test of the seas# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Prüfung der Meere# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve des mers# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #prueba del mar# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST] = HintText(CustomMessage("They say that the #test of the seas# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Prüfung der Meere# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve des mers# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #prueba del mar# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST] = HintText(CustomMessage("They say that #music in the test of darkness# unveils #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Musik in der Prüfung des Dunkelheit# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, la #musique dans l'épreuve des ténèbres# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #música en la prueba de la oscuridad# revela #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST] = HintText(CustomMessage("They say that #light in the test of darkness# unveils #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Licht in der Prüfung der Dunkelheit# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, la #lumière dans l'épreuve des ténèbres# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #luz en la prueba de la oscuridad# revela #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST] = HintText(CustomMessage("They say that the #test of the sands# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Prüfung der Sande# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve des sables# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #prueba de las arenas# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST] = HintText(CustomMessage("They say that the #test of the sands# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Prüfung der Sande# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve des sables# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #prueba de las arenas# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST] = HintText(CustomMessage("They say that the #test of radiance# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Prüfung des Glanzes# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve du ciel# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #prueba del resplandor# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST] = HintText(CustomMessage("They say that the #test of radiance# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Prüfung des Glanzes# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve du ciel# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #prueba del resplandor# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST] = HintText(CustomMessage("They say that the #test of radiance# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Prüfung des Glanzes# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve du ciel# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #prueba del resplandor# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST] = HintText(CustomMessage("They say that the #test of radiance# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Prüfung des Glanzes# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve du ciel# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #prueba del resplandor# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST] = HintText(CustomMessage("They say that the #test of radiance# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Prüfung des Glanzes# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve du ciel# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #prueba del resplandor# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST] = HintText(CustomMessage("They say that the #test of radiance# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Prüfung des Glanzes# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve du ciel# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #prueba del resplandor# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST] = HintText(CustomMessage("They say that the #test of radiance# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Prüfung des Glanzes# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve du ciel# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #prueba del resplandor# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST] = HintText(CustomMessage("They say that #music in the test of radiance# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Musik in der Prüfung des Glanzes# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, la #musique dans l'épreuve du ciel# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #música en la prueba del resplandor# revela #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST] = HintText(CustomMessage("They say that the #test of the seas# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Prüfung der Meere# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve des mers# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #prueba del mar# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST] = HintText(CustomMessage("They say that the #test of the wilds# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Prüfung der Wildnis# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve des bois# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #prueba de la naturaleza# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST] = HintText(CustomMessage("They say that the #test of the wilds# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Prüfung der Wildnis# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve des bois# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #prueba de la naturaleza# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST] = HintText(CustomMessage("They say that #music in the test of radiance# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Musik in der Prüfung des Glanzes# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, la #musique dans l'épreuve du ciel# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #música en la prueba del resplandor# revela #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST] = HintText(CustomMessage("They say that the #test of darkness# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Prüfung der Dunkelheit# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve des ténèbres# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #prueba de la oscuridad# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST] = HintText(CustomMessage("They say that the #test of darkness# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Prüfung der Dunkelheit# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve des ténèbres# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #prueba de la oscuridad# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST] = HintText(CustomMessage("They say that #reflected light in the test of the sands# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #reflektiertes Licht in der Prüfung der Sande# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, le #soleil dans l'épreuve des sables# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #reflejar la luz en la prueba de las arenas# revela #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST] = HintText(CustomMessage("They say that #reflected light in the test of the sands# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #reflektiertes Licht in der Prüfung der Sande# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, le #soleil dans l'épreuve des sables# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #reflejar la luz en la prueba de las arenas# revela #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST] = HintText(CustomMessage("They say that #reflected light in the test of the sands# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #reflektiertes Licht in der Prüfung der Sande# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, le #soleil dans l'épreuve des sables# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #reflejar la luz en la prueba de las arenas# revela #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST] = HintText(CustomMessage("They say that #reflected light in the test of the sands# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #reflektiertes Licht in der Prüfung der Sande# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, le #soleil dans l'épreuve des sables# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #reflejar la luz en la prueba de las arenas# revela #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST] = HintText(CustomMessage("They say that #reflected light in the test of the sands# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #reflektiertes Licht in der Prüfung der Sande# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, le #soleil dans l'épreuve des sables# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #reflejar la luz en la prueba de las arenas# revela #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST] = HintText(CustomMessage("They say that #reflected light in the test of the sands# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #reflektiertes Licht in der Prüfung der Sande# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, le #soleil dans l'épreuve des sables# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #reflejar la luz en la prueba de las arenas# revela #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY] = HintText(CustomMessage("They say that the #test of the wilds# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Prüfung der Wildnis# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve des bois# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #prueba de la naturaleza# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT] = HintText(CustomMessage("They say that #scrubs in Ganon's Castle# sell #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Dekus in Ganons Schloß# #[[1]]# verkaufen würden.", /*french*/ "Selon moi, les #pestes Mojo dans le Château de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT] = HintText(CustomMessage("They say that #scrubs in Ganon's Castle# sell #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Dekus in Ganons Schloß# #[[1]]# verkaufen würden.", /*french*/ "Selon moi, les #pestes Mojo dans le Château de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_DEKU_SCRUB_RIGHT] = HintText(CustomMessage("They say that #scrubs in Ganon's Castle# sell #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Dekus in Ganons Schloß# #[[1]]# verkaufen würden.", /*french*/ "Selon moi, les #pestes Mojo dans le Château de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_DEKU_SCRUB_LEFT] = HintText(CustomMessage("They say that #scrubs in Ganon's Castle# sell #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Dekus in Ganons Schloß# #[[1]]# verkaufen würden.", /*french*/ "Selon moi, les #pestes Mojo dans le Château de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT] = HintText(CustomMessage("They say that #scrubs in Ganon's Castle# sell #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Dekus in Ganons Schloß# #[[1]]# verkaufen würden.", /*french*/ "Selon moi, les #pestes Mojo dans le Château de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT] = HintText(CustomMessage("They say that #scrubs in Ganon's Castle# sell #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Dekus in Ganons Schloß# #[[1]]# verkaufen würden.", /*french*/ "Selon moi, les #pestes Mojo dans le Château de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER] = HintText(CustomMessage("They say that #scrubs in Ganon's Castle# sell #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Dekus in Ganons Schloß# #[[1]]# verkaufen würden.", /*french*/ "Selon moi, les #pestes Mojo dans le Château de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT] = HintText(CustomMessage("They say that #scrubs in Ganon's Castle# sell #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Dekus in Ganons Schloß# #[[1]]# verkaufen würden.", /*french*/ "Selon moi, les #pestes Mojo dans le Château de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT] = HintText(CustomMessage("They say that #scrubs in Ganon's Castle# sell #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Dekus in Ganons Schloß# #[[1]]# verkaufen würden.", /*french*/ "Selon moi, les #pestes Mojo dans le Château de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. } diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp index 84c74da8735..a467c18b513 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp @@ -171,1320 +171,1323 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, bajo un #hoyo de un laberinto forestal# yace #[[1]]#. hintTextTable[RHT_DMT_STORMS_GROTTO_CHEST] = HintText(CustomMessage("They say that #hole flooded with rain on a mountain# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #durch Regen geflutetes Loch auf einem Berg# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte inondée de pluie sur la montagne# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, bajo un #hoyo de una montaña inundado de lluvia# yace #[[1]]#. hintTextTable[RHT_DMT_STORMS_GROTTO_FISH] = HintText(CustomMessage("They say that #fish in a hole flooded with rain on a mountain# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Fisch in einem durch Regen geflutetes Loch auf einem Berg# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte inondée de pluie sur la montagne# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, bajo un #hoyo de una montaña inundado de lluvia# yace #[[1]]#. hintTextTable[RHT_DMC_UPPER_GROTTO_CHEST] = HintText(CustomMessage("They say that a #hole in a volcano# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Loch in einem Vulkan# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte dans le volcan# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, bajo el #hoyo de un volcán# yace #[[1]]#. hintTextTable[RHT_DMC_UPPER_GROTTO_FISH] = HintText(CustomMessage("They say that a #fish in a hole in a volcano# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Fisch in einem Loch in einem Vulkan# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte dans le volcan# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, bajo el #hoyo de un volcán# yace #[[1]]#. hintTextTable[RHT_TOT_MASTER_SWORD] = HintText(CustomMessage("They say that a #pedestal in a temple# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß sich auf einem #Podest in einem Tempel# #[[1]]# befände.", /*french*/ "Selon moi, un #piédestal dans un temple# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #pedestal en un templo# sostiene #[[1]]#. hintTextTable[RHT_TOT_LIGHT_ARROWS_CUTSCENE] = HintText(CustomMessage("They say that the #final gift of a princess# is #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #letzte Geschenk einer Prinzessin# #[[1]]# sei.", /*french*/ "Selon moi, le #cadeau d'adieu de la princesse# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #obsequio final de la princesa# se trata de #[[1]]#. hintTextTable[RHT_LW_GIFT_FROM_SARIA] = HintText(CustomMessage("They say that #Saria's Gift# is #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Salias Geschenk# #[[1]]# sei.", /*french*/ "Selon moi, le #cadeau de Saria# est #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, el #regalo de Saria# se trata de #[[1]]#. {}, { CustomMessage("They say that a #potato hoarder# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Kartoffelhortender# #[[1]]# besäße.", /*french*/ "Selon moi, le #panini mélodieux# est en fait #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, cierta #jovencita verde# concede #[[1]]#. CustomMessage("They say that a rooty tooty #flutey cutey# gifts #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #musikalische Kartoffel# #[[1]]# schenke.", /*french*/ "Selon moi, la #patate musicale# est en fait #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, una #gran amiga# concede #[[1]]#. hintTextTable[RHT_ZF_GREAT_FAIRY_REWARD] = HintText(CustomMessage("They say that the #fairy of winds# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Fee der Winde# #[[1]]# besäße.", /*french*/ "Selon moi, la #fée du vent# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #hada del viento# brinda #[[1]]#. hintTextTable[RHT_HC_GREAT_FAIRY_REWARD] = HintText(CustomMessage("They say that the #fairy of fire# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Fee des Feuers# #[[1]]# besäße.", /*french*/ "Selon moi, la #fée du feu# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #hada del fuego# brinda #[[1]]#. hintTextTable[RHT_COLOSSUS_GREAT_FAIRY_REWARD] = HintText(CustomMessage("They say that the #fairy of love# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Fee der Liebe# #[[1]]# besäße.", /*french*/ "Selon moi, la #fée de l'amour# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #hada del amor# brinda #[[1]]#. hintTextTable[RHT_DMT_GREAT_FAIRY_REWARD] = HintText(CustomMessage("They say that a #magical fairy# gifts #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #magische Fee# #[[1]]# schenke.", /*french*/ "Selon moi, la #fée de la magie# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #hada mágica# brinda #[[1]]#. hintTextTable[RHT_DMC_GREAT_FAIRY_REWARD] = HintText(CustomMessage("They say that a #magical fairy# gifts #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #magische Fee# #[[1]]# schenke.", /*french*/ "Selon moi, la #fée de la magie# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #hada mágica# brinda #[[1]]#. hintTextTable[RHT_OGC_GREAT_FAIRY_REWARD] = HintText(CustomMessage("They say that the #fairy of strength# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Fee der Stärke# #[[1]]# besäße.", /*french*/ "Selon moi, la #fée de la force# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #hada de la fuerza# brinda #[[1]]#. hintTextTable[RHT_SONG_FROM_IMPA] = HintText(CustomMessage("They say that #deep in a castle#, Impa teaches #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #tief in einem Schloß#, Impa #[[1]]# lehre.", /*french*/ "Selon moi, #la gardienne de la princesse# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, en el #jardín del castillo Impa enseña# #[[1]]#. hintTextTable[RHT_SONG_FROM_MALON] = HintText(CustomMessage("They say that #a farm girl# sings #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Mädchen des Landes# #[[1]]# singe.", /*french*/ "Selon moi, la #fillette de la ferme# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #chica rupestre# canta #[[1]]#. hintTextTable[RHT_SONG_FROM_SARIA] = HintText(CustomMessage("They say that #deep in the forest#, Saria teaches #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #tief im Wald#, Salia #[[1]]# lehre.", /*french*/ "Selon moi, la #fille de la forêt# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, al #fondo del bosque# Saria enseña #[[1]]#. hintTextTable[RHT_SONG_FROM_WINDMILL] = HintText(CustomMessage("They say that a man #in a windmill# is obsessed with #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein Mann #in einer Windmühle# von #[[1]]# besessen sei.", /*french*/ "Selon moi, l'#homme du moulin# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #hombre del molino# está obsesionado con #[[1]]#. hintTextTable[RHT_HC_MALON_EGG] = HintText(CustomMessage("They say that a #girl looking for her father# gives #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #nach ihrem Vater suchenden Mädchen# #[[1]]# gäbe.", /*french*/ "Selon moi, la #fillette qui cherche son père# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #chica en busca de su padre# otorga #[[1]]#. hintTextTable[RHT_HC_ZELDAS_LETTER] = HintText(CustomMessage("They say that a #princess in a castle# gifts #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Prinzessin in einem Schloß# #[[1]]# schenke.", /*french*/ "Selon moi, la #princesse dans le château# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #princesa de un castillo# otorga #[[1]]#. hintTextTable[RHT_ZD_DIVING_MINIGAME] = HintText(CustomMessage("They say that those who #dive for Zora rupees# will find #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß jene, welche nach den #Rubinen der Zora tauchen# #[[1]]# fänden.", /*french*/ "Selon moi, ceux qui #plongent pour des rubis Zora# trouveront #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, aquellos que se #sumergan por las rupias zora# encontrarán #[[1]]#. {}, { CustomMessage("They say that an #unsustainable business model# gifts #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #unwirtschaftliches Geschäftsmodell# #[[1]]# schenke.", /*french*/ "Selon moi, le #mauvais modèle d'affaires# donne #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, un #mal modelo de negocio# premia con #[[1]]#. hintTextTable[RHT_LH_CHILD_FISHING] = HintText(CustomMessage("They say that #fishing in youth# bestows #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Fischen in der Jugend# #[[1]]# verleihe.", /*french*/ "Selon moi, #pêcher dans sa jeunesse# promet #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #pescar en la juventud# conduce a #[[1]]#. hintTextTable[RHT_LH_POND_FISH] = HintText(CustomMessage("They say that #hitting the pond# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Fischen im Teich# #[[1]]# enthülle.", /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_LH_HYRULE_LOACH] = HintText(CustomMessage("They say that #fishing the hyrule loach# will give you #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Fischen der hylianischen Schmerle# #[[1]]# einbrächte.", /*french*/ "Selon moi, !!! #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, si #pescas a la Locha de Hyrule# encontrarás #[[1]]#. {}, { CustomMessage("They say that #fishing the legend# bestows #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Fischen der Legende# #[[1]]# verleihe.", /*french*/ "Selon moi, !!! #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, #pescar a la leyenda# conduce a #[[1]]#. hintTextTable[RHT_LH_ADULT_FISHING] = HintText(CustomMessage("They say that #fishing in maturity# bestows #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Fischen im Alter# #[[1]]# verleihe.", /*french*/ "Selon moi, #pêcher dans sa maturité# promet #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #pescar en la madurez# conduce a #[[1]]#. hintTextTable[RHT_LH_LAB_DIVE] = HintText(CustomMessage("They say that a #diving experiment# is rewarded with #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Tauchexperiment# mit #[[1]]# belohnt würde.", /*french*/ "Selon moi, l'#expérience de plongée# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #bucear para un experimento# se premia con #[[1]]#. // RANDOTODO: needs translation - hintTextTable[RHT_ZD_FISH] = HintText(CustomMessage("They say that a #fish by a waterfall# hoards #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_ZD_FISH] = HintText(CustomMessage("They say that a #fish by a waterfall# hoards #[[1]]#.", + /*german*/ "Man erzählt sich, daß ein #Fisch nahe eines Wasserfalls# #[[1]]# horte.", + /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #[[1]]#. hintTextTable[RHT_GC_ROLLING_GORON_AS_ADULT] = HintText(CustomMessage("They say that #reassuring a young Goron# is rewarded with #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Beruhigen eines jungen Goronen# mit #[[1]]# belohnt würde.", /*french*/ "Selon moi, #rassurer un jeune Goron# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, #calmar a un joven Goron# otorga #[[1]]#. {}, { CustomMessage("They say that #comforting yourself# provides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Ermutigung von einem Selbst# #[[1]]# einbrächte.", /*french*/ "Selon moi, se #réconforter soi-même# donne #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, #confrontarte a ti mismo# otorga #[[1]]#. hintTextTable[RHT_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE] = HintText(CustomMessage("They say that the #first explosive prize# is #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #erste explosive Preis# #[[1]]# sei.", /*french*/ "Selon moi, le #premier prix explosif# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #primer premio explosivo# se trata de #[[1]]#. hintTextTable[RHT_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE] = HintText(CustomMessage("They say that the #second explosive prize# is #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #zweite explosive Preis# #[[1]]# sei.", /*french*/ "Selon moi, le #deuxième prix explosif# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #segundo premio explosivo# se trata de #[[1]]#. hintTextTable[RHT_MARKET_LOST_DOG] = HintText(CustomMessage("They say that #rescuing Richard the Dog# is rewarded with #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Rettung des Hundes Richard# mit #[[1]]# belohnt würde.", /*french*/ "Selon moi, #retrouver Kiki le chien# promet #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, #rescatar al perrito Ricardo# conduce a #[[1]]#. {}, { CustomMessage("They say that #puppy lovers# will find #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Welpenliebhaber# #[[1]]# fänden.", /*french*/ "Selon moi, les #amoureux canins# trouveront #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, los #amantes caninos# encontrarán #[[1]]#. hintTextTable[RHT_LW_OCARINA_MEMORY_GAME] = HintText(CustomMessage("They say that #playing an Ocarina in Lost Woods# is rewarded with #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Spielen der Okarina in den verlorenen Wäldern# mit #[[1]]# belohnt würde.", /*french*/ "Selon moi, #jouer l'ocarina dans les Bois Perdus# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, #tocar la ocarina en el Bosque Perdido# otorga #[[1]]#. {}, { CustomMessage("They say that the prize for a #game of Simon Says# is #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der Preis für eine Partie #Simon sagt# #[[1]]# sei.", /*french*/ "Selon moi, la #récompense de Jean Dit# est #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, #repetir ciertas melodías# otorga #[[1]]#. CustomMessage("They say that a #child sing-a-long# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #jungen Flötisten# #[[1]]# besäßen.", /*french*/ "Selon moi, les #jeunes flûtistes# donnent #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, #tocar junto a otros# otorga #[[1]]#. hintTextTable[RHT_KAK_10_GOLD_SKULLTULA_REWARD] = HintText(CustomMessage("They say that slaying #10 Gold Skulltulas# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das Besiegen von #10 Goldenen Skulltulas# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, détruire #10 Skulltulas d'or# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, #exterminar 10 skulltulas doradas# revela #[[1]]#. {}, { CustomMessage("They say that #10 bug badges# rewards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #10 Käferabzeichen# mit #[[1]]# belohnt würde.", /*french*/ "Selon moi, #10 écussons# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, #10 medallas de insectos# otorgan #[[1]]#. CustomMessage("They say that #10 spider souls# yields #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #10 Spinnenseelen# #[[1]]# einbrächten.", /*french*/ "Selon moi, #10 âmes# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, #10 almas de araña# otorgan #[[1]]#. CustomMessage("They say that #10 auriferous arachnids# lead to #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #10 goldhaltige Arachniden# zu #[[1]]# führen würden.", /*french*/ "Selon moi, #10 arachnides aurifères# donnent #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, #10 arácnidos auríferos# otorgan #[[1]]#. hintTextTable[RHT_KAK_MAN_ON_ROOF] = HintText(CustomMessage("They say that a #rooftop wanderer# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Dachwanderer# #[[1]]# besäße.", /*french*/ "Selon moi, une #rencontre sur un toit# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #alguien sobre un tejado# otorga #[[1]]#. hintTextTable[RHT_ZR_MAGIC_BEAN_SALESMAN] = HintText(CustomMessage("They say that a #bean seller# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Bohnenverkäufer# #[[1]]# offeriere.", /*french*/ "Selon moi, le #marchand de haricots magiques# vend en fait #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, el #vendedor de judías# ofrece #[[1]]#. {}, { CustomMessage("They say that a seller of #colorful crops# has #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein Verkäufer #bunter Ernte# #[[1]]# besäße.", /*french*/ "Selon moi, le #marchand de légumes# vend #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, el vendedor de un #colorido cultivo# ofrece #[[1]]#. hintTextTable[RHT_ZR_FROGS_IN_THE_RAIN] = HintText(CustomMessage("They say that #frogs in a storm# gift #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Frösche im Sturm# #[[1]]# schenken würden.", /*french*/ "Selon moi, #des grenouilles mouillées# donnent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #ancas bajo la tormenta# otorgan #[[1]]#. hintTextTable[RHT_ZR_FROGS_ZELDAS_LULLABY] = HintText(CustomMessage("They say that after hearing #Zelda's Lullaby, the frogs# gift #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Frösche nach dem Hören von Zeldas Wiegenlied# #[[1]]# schenken würden.", /*french*/ "Selon moi, à l'écoute de #la berceuse de Zelda, les grenouilles# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, después de escuchar #la Nana de Zelda, las ranas# regalan #[[1]]#. {}, { CustomMessage("They say that #sleepy frogs# gift #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #schläfrige Frösche# #[[1]]# schenken würden.", /*french*/ "Selon moi, #les grenouilles somnolentes# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, las #ranas somnolientas# regalan #[[1]]#. CustomMessage("They say that #the Froggish Tenor in the back-left# gifts #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #der froschige Tenor hinten links# #[[1]]# schenke.", /*french*/ "Selon moi, #le ténor grenouillesque au fond à gauche# donne #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, el #Sapo Tenore al fondo, a la izquierda#, regala #[[1]]#. hintTextTable[RHT_ZR_FROGS_EPONAS_SONG] = HintText(CustomMessage("They say that after hearing #Epona's Song, the frogs# gift #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Frösche nach dem Hören von Eponas Lied# #[[1]]# schenken würden.", /*french*/ "Selon moi, à l'écoute du #chant d'Epona, les grenouilles# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, después de escuchar #la Canción de Epona, las ranas# regalan #[[1]]#. {}, { CustomMessage("They say that #equine frogs# gift #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #pferdeartige Frösche# #[[1]]# schenken würden.", /*french*/ "Selon moi, #les grenouilles équestres# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, las #ranas equinas# regalan #[[1]]#. CustomMessage("They say that #the Froggish Tenor in the back-right# gifts #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #der froschige Tenor hinten rechts# #[[1]]# schenke.", /*french*/ "Selon moi, #le ténor grenouillesque au fond à droite# donne #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, el #Sapo Tenore al fondo, a la derecha#, regala #[[1]]#. hintTextTable[RHT_ZR_FROGS_SARIAS_SONG] = HintText(CustomMessage("They say that after hearing #Saria's Song, the frogs# gift #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Frösche nach dem Hören von Salias Lied# #[[1]]# schenken würden.", /*french*/ "Selon moi, à l'écoute du #chant de Saria, les grenouilles# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, después de escuchar #la Canción de Saria, las ranas# regalan #[[1]]#. {}, { CustomMessage("They say that #sylvan frogs# gift #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #waldige Frösche# #[[1]]# schenken würden.", /*french*/ "Selon moi, #les grenouilles sylvestres# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, las #ranas silvestres# regalan #[[1]]#. CustomMessage("They say that #the Froggish Tenor in the center# gifts #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #der froschige Tenor im Zentrum# #[[1]]# schenke.", /*french*/ "Selon moi, #le ténor grenouillesque dans le centre# donne #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, el #Sapo Tenore en el centro# regala #[[1]]#. hintTextTable[RHT_ZR_FROGS_SUNS_SONG] = HintText(CustomMessage("They say that after hearing #the Sun's Song, the frogs# gift #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Frösche nach dem Hören der Hymne der Sonne# #[[1]]# schenken würden.", /*french*/ "Selon moi, à l'écoute du #chant du soleil, les grenouilles# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, después de escuchar #la Canción del Sol, las ranas# regalan #[[1]]#. {}, { CustomMessage("They say that #enlightened frogs# gift #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #erleuchtete Frösche# #[[1]]# schenken würden.", /*french*/ "Selon moi, #les grenouilles éclairées# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, las #ranas alumbradas# regalan #[[1]]#. CustomMessage("They say that #the Froggish Tenor in the front-left# gifts #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #der froschige Tenor vorne links# #[[1]]# schenke.", /*french*/ "Selon moi, #le ténor grenouillesque à l'avant gauche# donne #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, el #Sapo Tenore al frente, a la izquierda#, regala #[[1]]#. hintTextTable[RHT_ZR_FROGS_SONG_OF_TIME] = HintText(CustomMessage("They say that after hearing #the Song of Time, the frogs# gift #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Frösche nach dem Hören der Hymne der Zeit# #[[1]]# schenken würden.", /*french*/ "Selon moi, à l'écoute du #chant du temps, les grenouilles# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, después de escuchar #la Canción del tiempo, las ranas# regalan #[[1]]#. {}, { CustomMessage("They say that #time-traveling frogs# gift #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #zeitreisende Frösche# #[[1]]# schenken würden.", /*french*/ "Selon moi, #les grenouilles voyageuses dans le temps# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, las #ranas viajeras del tiempo# regalan #[[1]]#. CustomMessage("They say that #the Froggish Tenor in the front-right# gifts #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #der froschige Tenor vorne rechts# #[[1]]# schenke.", /*french*/ "Selon moi, #le ténor grenouillesque à l'avant droite# donne #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, el #Sapo Tenore al frente, a la derecha#, regala #[[1]]#. hintTextTable[RHT_GF_HBA_1000_POINTS] = HintText(CustomMessage("They say that scoring 1000 in #horseback archery# grants #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das Erzielen von 1000 Punkten beim #Pferdebogenschießen# #[[1]]# einbrächte.", /*french*/ "Selon moi, obtenir 1000 points dans l'#archerie équestre# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, conseguir 1000 puntos en el #tiro con arco a caballo# premia #[[1]]#. hintTextTable[RHT_MARKET_SHOOTING_GALLERY_REWARD] = HintText(CustomMessage("They say that #shooting in youth# grants #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Schießen in der Jugend# #[[1]]# einbrächte.", /*french*/ "Selon moi, #faire du tir dans sa jeunesse# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #disparar en la juventud# otorga #[[1]]#. hintTextTable[RHT_KAK_SHOOTING_GALLERY_REWARD] = HintText(CustomMessage("They say that #shooting in maturity# grants #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Schießen im Alter# #[[1]]# einbrächte.", /*french*/ "Selon moi, #faire du tir dans sa maturité# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #disparar en la madurez# otorga #[[1]]#. hintTextTable[RHT_LW_TARGET_IN_WOODS] = HintText(CustomMessage("They say that shooting a #target in the woods# grants #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das Abschießen eines #Zieles in den Wäldern# #[[1]]# einbrächte.", /*french*/ "Selon moi, #tirer une cible dans les bois# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, disparar a un #blanco forestal# brinda #[[1]]#. hintTextTable[RHT_KAK_ANJU_AS_ADULT] = HintText(CustomMessage("They say that a #chicken caretaker# offers adults #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Hühnchenpfleger# Erwachsenen #[[1]]# anböte.", /*french*/ "Selon moi, devenir un #éleveur de Cocottes# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #cuidadora de emplumados# le ofrece a los mayores #[[1]]#. hintTextTable[RHT_LLR_TALONS_CHICKENS] = HintText(CustomMessage("They say that #finding Super Cuccos# is rewarded with #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Finden von Superhühnchen# mit #[[1]]# belohnt würde.", /*french*/ "Selon moi, #trouver des Super Cocottes# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #hallar los supercucos# conduce a #[[1]]#. hintTextTable[RHT_GC_ROLLING_GORON_AS_CHILD] = HintText(CustomMessage("They say that the prize offered by a #large rolling Goron# is #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der angebotene Preis eines #großen rollenden Goronen# #[[1]]# sei.", /*french*/ "Selon moi, la récompense d'un #gros Goron roulant# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #gran Goron rodante# otorga #[[1]]#. hintTextTable[RHT_LH_UNDERWATER_ITEM] = HintText(CustomMessage("They say that the #sunken treasure in a lake# is #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #versunkene Schatz in einem See# #[[1]]# sei.", /*french*/ "Selon moi, le #trésor au fond du lac# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #tesoro hundido del lago# se trata de #[[1]]#. hintTextTable[RHT_GF_GERUDO_MEMBERSHIP_CARD] = HintText(CustomMessage("They say that #rescuing captured carpenters# is rewarded with #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Retten gefangener Zimmerleute# mit #[[1]]# belohnt würde.", /*french*/ "Selon moi, #secourir les charpentiers capturés# assure #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #rescatar los apresados carpinteros# se premia con #[[1]]#. hintTextTable[RHT_WASTELAND_BOMBCHU_SALESMAN] = HintText(CustomMessage("They say that a #carpet guru# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Teppichguru# #[[1]]# verkaufe.", /*french*/ "Selon moi, #un marchand du désert# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #genio de una alfombra# vende #[[1]]#. hintTextTable[RHT_GC_MEDIGORON] = HintText(CustomMessage("They say that #Medigoron# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Medigoron# #[[1]]# verkaufe.", /*french*/ "Selon moi, #Medigoron# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #Medigoron# vende #[[1]]#. hintTextTable[RHT_KAK_GRANNYS_SHOP] = HintText(CustomMessage("They say that the #potion shop lady# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Dame des Hexenladens# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #dame du magasin de potion# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #señora de la tienda de pociones# vende #[[1]]#. hintTextTable[RHT_KAK_IMPAS_HOUSE_FREESTANDING_POH] = HintText(CustomMessage("They say that #imprisoned in a house# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #eingesperrt in einem Haus# #[[1]]# läge.", /*french*/ "Selon moi, #encagé dans une maison# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #en una casa entre rejas# yace #[[1]]#. hintTextTable[RHT_HF_TEKTITE_GROTTO_FREESTANDING_POH] = HintText(CustomMessage("They say that #deep underwater in a hole# is #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #tief unter Wasser in einem Loch# #[[1]]# sei.", /*french*/ "Selon moi, #dans les profondeurs d'une grotte# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #en lo hondo bajo un hoyo# yace #[[1]]#. hintTextTable[RHT_KAK_WINDMILL_FREESTANDING_POH] = HintText(CustomMessage("They say that on a #windmill ledge# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß auf einem #Vorsprung in einer Windmühle# #[[1]]# läge.", /*french*/ "Selon moi, #haut perché dans le moulin# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, al #borde de un molino# yace #[[1]]#. hintTextTable[RHT_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH] = HintText(CustomMessage("They say that #dead Dampe's second# prize is #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #zweite Preis des toten Boris# #[[1]]# sei.", /*french*/ "Selon moi, la #deuxième course d'Igor# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, el segundo premio de #la carrera de Dampé# se trata de #[[1]]#. {}, { CustomMessage("They say that #racing a ghost# leads to #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Rennen gegen einen Geist# zu #[[1]]# führen würde.", /*french*/ "Selon moi, le défi du #revenant rapide# donne #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, #perseguir a un fantasma# conduce a #[[1]]#. hintTextTable[RHT_LLR_FREESTANDING_POH] = HintText(CustomMessage("They say that in a #ranch silo# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß in einem #ländlichen Silo# #[[1]]# läge.", /*french*/ "Selon moi, #dans l'entrepôt de la ferme# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, en un #granero rupestre# yace #[[1]]#. hintTextTable[RHT_GRAVEYARD_FREESTANDING_POH] = HintText(CustomMessage("They say that a #crate in a graveyard# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Kiste auf einem Friedhof# #[[1]]# verberge.", /*french*/ "Selon moi, #la boîte dans le Cimetière# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, bajo la #caja de un cementerio# yace #[[1]]#. hintTextTable[RHT_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR] = HintText(CustomMessage("They say that a #gravekeeper digs up# #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Grabpfleger# #[[1]]# ausgrabe.", /*french*/ "Selon moi, #le jeu du fossoyeur# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, cierto #sepultero desentierra# #[[1]]#. hintTextTable[RHT_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH] = HintText(CustomMessage("They say that on top of a #pillar in a river# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß auf der Spitze einer #Säule in einem Fluß# #[[1]]# läge.", /*french*/ "Selon moi, #sur un pilier au dessus du fleuve# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, en lo alto del #pilar de un río# yace #[[1]]#. hintTextTable[RHT_ZR_NEAR_DOMAIN_FREESTANDING_POH] = HintText(CustomMessage("They say that on a #river ledge by a waterfall# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß auf einem #Vorsprung von einem Fluß nahe eines Wasserfalls# #[[1]]# läge.", /*french*/ "Selon moi, #sur la falaise au dessus du fleuve# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, al borde de #la entrada a una cascada# yace #[[1]]#. hintTextTable[RHT_LH_FREESTANDING_POH] = HintText(CustomMessage("They say that high on a #lab rooftop# one can find #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß man auf dem #Dach eines Laboratoriums# #[[1]]# finden könne.", /*french*/ "Selon moi, #la tour d'observation du lac# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, en lo #alto de un laboratorio# yace #[[1]]#. hintTextTable[RHT_ZF_ICEBERG_FREESTANDING_POH] = HintText(CustomMessage("They say that #floating on ice# is #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß sich schwebend auf Eis #[[1]]# befände.", /*french*/ "Selon moi, #gisant sur la glace# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #flotando sobre hielo# yace #[[1]]#. hintTextTable[RHT_GV_WATERFALL_FREESTANDING_POH] = HintText(CustomMessage("They say that behind a #valley waterfall# is #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß hinter einem #Wasserfall in einem Tal# #[[1]]# sei.", /*french*/ "Selon moi, #derrière la cascade du désert# se cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, tras una #desierta cascada# yace #[[1]]#. hintTextTable[RHT_GV_CRATE_FREESTANDING_POH] = HintText(CustomMessage("They say that a #crate in a valley# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Kiste in einem Tal# #[[1]]# verberge.", /*french*/ "Selon moi, la #boîte dans la vallée# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, bajo la #caja de un valle# yace #[[1]]#. hintTextTable[RHT_COLOSSUS_FREESTANDING_POH] = HintText(CustomMessage("They say that on top of an #arch of stone# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß auf der Spitze eines #Steinbogens# #[[1]]# läge.", /*french*/ "Selon moi, #gisant sur une arche de pierre# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, en lo alto de un #arco de piedra# yace #[[1]]#. hintTextTable[RHT_DMT_FREESTANDING_POH] = HintText(CustomMessage("They say that above a #mountain cavern entrance# is #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß oberhalb eines #Berghöhleneingangs# #[[1]]# sei.", /*french*/ "Selon moi, gisant #au dessus de la caverne montagneuse# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, en lo alto de la #entrada de una cueva en la montaña# yace #[[1]]#. hintTextTable[RHT_DMC_WALL_FREESTANDING_POH] = HintText(CustomMessage("They say that nestled in a #volcanic wall# is #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß in einem #vulkanischen Alkoven# #[[1]]# sei.", /*french*/ "Selon moi, dans une #alcove volcanique# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, entre unas #murallas volcánicas# yace #[[1]]#. hintTextTable[RHT_DMC_VOLCANO_FREESTANDING_POH] = HintText(CustomMessage("They say that obscured by #volcanic ash# is #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #[[1]]# von #Vulkanasche# verdeckt sei.", /*french*/ "Selon moi, #recouvert de cendres volcaniques# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, bajo la #ceniza volcánica# yace #[[1]]#. hintTextTable[RHT_GF_NORTH_F1_CARPENTER] = HintText(CustomMessage("They say that #defeating Gerudo guards# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Besiegen der Gerudo-Wachen# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, les #geôliers Gerudo# détiennent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #derrotar a las guardas Gerudo# revela #[[1]]#. hintTextTable[RHT_GF_NORTH_F2_CARPENTER] = HintText(CustomMessage("They say that #defeating Gerudo guards# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Besiegen der Gerudo-Wachen# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, les #geôliers Gerudo# détiennent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #derrotar a las guardas Gerudo# revela #[[1]]#. hintTextTable[RHT_GF_SOUTH_F1_CARPENTER] = HintText(CustomMessage("They say that #defeating Gerudo guards# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Besiegen der Gerudo-Wachen# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, les #geôliers Gerudo# détiennent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #derrotar a las guardas Gerudo# revela #[[1]]#. hintTextTable[RHT_GF_SOUTH_F2_CARPENTER] = HintText(CustomMessage("They say that #defeating Gerudo guards# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Besiegen der Gerudo-Wachen# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, les #geôliers Gerudo# détiennent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #derrotar a las guardas Gerudo# revela #[[1]]#. hintTextTable[RHT_HF_GS_NEAR_KAK_GROTTO] = HintText(CustomMessage("They say that a #spider-guarded spider in a hole# hoards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #spinnenbewachte Spinne in einem Loch #[[1]]# horte.", /*french*/ "Selon moi, une #Skulltula dans un trou d'arachnides# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula custodiada por otra# de un hoyo otorga #[[1]]#. hintTextTable[RHT_LLR_GS_BACK_WALL] = HintText(CustomMessage("They say that night reveals a #spider in a ranch# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne auf einer Farm# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur la façade de la ferme# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche revela una #Skulltula del rancho# que otorga #[[1]]#. hintTextTable[RHT_LLR_GS_RAIN_SHED] = HintText(CustomMessage("They say that night reveals a #spider in a ranch# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne auf einer Farm# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur le mur de l'enclos# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche revela una #Skulltula del rancho# que otorga #[[1]]#. hintTextTable[RHT_LLR_GS_HOUSE_WINDOW] = HintText(CustomMessage("They say that night reveals a #spider in a ranch# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne auf einer Farm# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur la maison de ferme# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche revela una #Skulltula del rancho# que otorga #[[1]]#. hintTextTable[RHT_LLR_GS_TREE] = HintText(CustomMessage("They say that a spider hiding in a #ranch tree# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine in einem #Baum auf einer Farm# versteckte Spinne #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula dans l'arbre de la ferme# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una Skulltula escondida en el #árbol de un rancho# otorga #[[1]]#. hintTextTable[RHT_KF_GS_BEAN_PATCH] = HintText(CustomMessage("They say that a #spider buried in a forest# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #in einem Wald vergrabene Spinne# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula enterrée dans la forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula enterrada en un bosque# otorga #[[1]]#. hintTextTable[RHT_KF_GS_KNOW_IT_ALL_HOUSE] = HintText(CustomMessage("They say that night in the past reveals a #spider in a forest# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht in der Vergangenheit eine #Spinne in einem Wald# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula derrière une cabane de la forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche revela en el pasado una #Skulltula del bosque# que otorga #[[1]]#. hintTextTable[RHT_KF_GS_HOUSE_OF_TWINS] = HintText(CustomMessage("They say that night in the future reveals a #spider in a forest# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht in der Zukunft eine #Spinne in einem Wald# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur une cabane de la forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche revela en el futuro una #Skulltula del rancho# que otorga #[[1]]#. hintTextTable[RHT_LW_GS_BEAN_PATCH_NEAR_BRIDGE] = HintText(CustomMessage("They say that a #spider buried deep in a forest maze# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #tief in einem Waldlabyrinth vergrabene Spinne# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula enterrée dans les bois# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula enterrada en un laberinto forestal# otorga #[[1]]#. hintTextTable[RHT_LW_GS_BEAN_PATCH_NEAR_THEATER] = HintText(CustomMessage("They say that a #spider buried deep in a forest maze# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #tief in einem Waldlabyrinth vergrabene Spinne# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula enterrée dans les bois# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula enterrada en un laberinto forestal# otorga #[[1]]#. hintTextTable[RHT_LW_GS_ABOVE_THEATER] = HintText(CustomMessage("They say that night reveals a #spider deep in a forest maze# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne tief in einem Waldlabyrinth# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula haut perchée dans les bois# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche revela una #Skulltula del laberinto forestal# que otorga #[[1]]#. hintTextTable[RHT_SFM_GS] = HintText(CustomMessage("They say that night reveals a #spider in a forest meadow# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne auf einer Waldwiese# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula dans le sanctuaire des bois# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche revela una #Skulltula de la pradera del bosque# que otorga #[[1]]#. hintTextTable[RHT_OGC_GS] = HintText(CustomMessage("They say that a #spider outside a tyrant's tower# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne außerhalb eines Turms eines Tyrannen# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula parmi les ruines du château# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula a las afueras de la torre de un tirano# otorga #[[1]]#. hintTextTable[RHT_HC_GS_TREE] = HintText(CustomMessage("They say that a spider hiding in a #tree outside of a castle# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine in einem #Baum außerhalb von einem Schloß befindliche Spinne# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula dans l'arbre près du château# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una Skulltula escondida en el #árbol de las afueras de un castillo# otorga #[[1]]#. hintTextTable[RHT_MARKET_GS_GUARD_HOUSE] = HintText(CustomMessage("They say that a #spider in a guarded crate# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne in einer bewachten Kiste# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula dans une boîte en ville# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula bajo una custodiada caja# otorga #[[1]]#. hintTextTable[RHT_DMC_GS_BEAN_PATCH] = HintText(CustomMessage("They say that a #spider buried in a volcano# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #in einem Vulkan begrabene Spinne# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula enterrée dans un volcan# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula enterrada en un volcán# otorga #[[1]]#. hintTextTable[RHT_DMT_GS_BEAN_PATCH] = HintText(CustomMessage("They say that a #spider buried outside a cavern# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #außerhalb einer Höhle begrabene Spinne# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula enterrée près d'une caverne# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula enterrada a la entrada de una cueva# otorga #[[1]]#. hintTextTable[RHT_DMT_GS_NEAR_KAK] = HintText(CustomMessage("They say that a #spider hidden in a mountain nook# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #in einem Bergwinkel versteckte Spinne# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula cachée dans le flanc d'une montagne# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula oculta en el rincón de la montaña# otorga #[[1]]#. hintTextTable[RHT_DMT_GS_ABOVE_DODONGOS_CAVERN] = HintText(CustomMessage("They say that the hammer reveals a #spider on a mountain# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der Hammer eine #Spinne auf einem Berg# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula derrière un rocher massif près d'une caverne# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el martillo revela #una Skulltula de la montaña# que otorga #[[1]]#. hintTextTable[RHT_DMT_GS_FALLING_ROCKS_PATH] = HintText(CustomMessage("They say that the hammer reveals a #spider on a mountain# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der Hammer eine #Spinne auf einem Berg# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula derrière un rocher massif près du sommet d'un volcan# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el martillo revela #una Skulltula de la montaña# que otorga #[[1]]#. hintTextTable[RHT_GC_GS_CENTER_PLATFORM] = HintText(CustomMessage("They say that a #suspended spider# in Goron City holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #hängende Spinne# in Goronia #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula perchée dans le village Goron# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula suspendida# en la Ciudad Goron otorga #[[1]]#. hintTextTable[RHT_GC_GS_BOULDER_MAZE] = HintText(CustomMessage("They say that a spider in a #Goron City crate# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine Spinne in einer #Kiste in Goronia# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula dans une boîte du village Goron# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula bajo una caja# de la Ciudad Goron otorga #[[1]]#. hintTextTable[RHT_KAK_GS_HOUSE_UNDER_CONSTRUCTION] = HintText(CustomMessage("They say that night in the past reveals a #spider in a town# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht in der Vergangenheit eine #Spinne in einer Stadt# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula dans le chantier de construction# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche del pasado revela una #Skulltula del pueblo# que otorga #[[1]]#. hintTextTable[RHT_KAK_GS_SKULLTULA_HOUSE] = HintText(CustomMessage("They say that night in the past reveals a #spider in a town# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht in der Vergangenheit eine #Spinne in einer Stadt# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur une maison maudite# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche del pasado revela una #Skulltula del pueblo# que otorga #[[1]]#. hintTextTable[RHT_KAK_GS_GUARDS_HOUSE] = HintText(CustomMessage("They say that night in the past reveals a #spider in a town# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht in der Vergangenheit eine #Spinne in einer Stadt# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur une maison de village# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche del pasado revela una #Skulltula del pueblo# que otorga #[[1]]#. hintTextTable[RHT_KAK_GS_TREE] = HintText(CustomMessage("They say that night in the past reveals a #spider in a town# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht in der Vergangenheit eine #Spinne in einer Stadt# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula dans un arbre de village# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche del pasado revela una #Skulltula del pueblo# que otorga #[[1]]#. hintTextTable[RHT_KAK_GS_WATCHTOWER] = HintText(CustomMessage("They say that night in the past reveals a #spider in a town# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht in der Vergangenheit eine #Spinne in einer Stadt# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur une échelle dans un village# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche del pasado revela una #Skulltula del pueblo# que otorga #[[1]]#. hintTextTable[RHT_KAK_GS_ABOVE_IMPAS_HOUSE] = HintText(CustomMessage("They say that night in the future reveals a #spider in a town# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht in der Zukunft eine #Spinne in einer Stadt# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula au dessus d'une grande maison# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche del futuro revela una #Skulltula del pueblo# que otorga #[[1]]#. hintTextTable[RHT_GRAVEYARD_GS_WALL] = HintText(CustomMessage("They say that night reveals a #spider in a graveyard# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne auf einem Friedhof# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur une façade du Cimetière# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche revela una #Skulltula del cementerio# que otorga #[[1]]#. hintTextTable[RHT_GRAVEYARD_GS_BEAN_PATCH] = HintText(CustomMessage("They say that a #spider buried in a graveyard# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #auf einem Friedhof begrabene Spinne# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula enterrée dans le Cimetière# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula enterrada en el cementerio# otorga #[[1]]#. hintTextTable[RHT_ZR_GS_LADDER] = HintText(CustomMessage("They say that night in the past reveals a #spider in a river# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht in der Vergangenheit eine #Spinne in einem Fluß# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur une échelle près d'une cascade# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche del pasado revela una #Skulltula del río# que otorga #[[1]]#. hintTextTable[RHT_ZR_GS_TREE] = HintText(CustomMessage("They say that a spider hiding in a #tree by a river# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine in einem #Baum bei einem Fluß# versteckte Spinne #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula dans un arbre près du fleuve# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una Skulltula escondida en el #árbol de un río# otorga #[[1]]#. hintTextTable[RHT_ZR_GS_ABOVE_BRIDGE] = HintText(CustomMessage("They say that night in the future reveals a #spider in a river# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht in der Zukunft eine #Spinne in einem Fluß# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur une façade près d'une cascade# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche del futuro revela una #Skulltula del río# que otorga #[[1]]#. hintTextTable[RHT_ZR_GS_NEAR_RAISED_GROTTOS] = HintText(CustomMessage("They say that night in the future reveals a #spider in a river# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht in der Zukunft eine #Spinne in einem Fluß# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur une façade près d'une grotte du fleuve# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche del futuro revela una #Skulltula del río# que otorga #[[1]]#. hintTextTable[RHT_ZD_GS_FROZEN_WATERFALL] = HintText(CustomMessage("They say that night reveals a #spider by a frozen waterfall# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne bei einem gefrorenen Wasserfall# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula près d'une cascade gelée# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche revela una #Skulltula junto a una congelada cascada# que otorga #[[1]]#. hintTextTable[RHT_ZF_GS_ABOVE_THE_LOG] = HintText(CustomMessage("They say that night reveals a #spider near a deity# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne in der Nähe einer Gottheit# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula près du gardien aquatique# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche revela una #Skulltula junto a cierta deidad# que otorga #[[1]]#. hintTextTable[RHT_ZF_GS_TREE] = HintText(CustomMessage("They say that a spider hiding in a #tree near a deity# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine in einem #Baum in der Nähe einer Gottheit# versteckte Spinne #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula dans un arbre dans un réservoir# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una Skulltula escondida en el #árbol junto a cierta deidad# otorga #[[1]]#. hintTextTable[RHT_LH_GS_BEAN_PATCH] = HintText(CustomMessage("They say that a #spider buried by a lake# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #bei einem Fluß begrabene Spinne# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula enterrée près d'un lac# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula enterrada junto a un lago# otorga #[[1]]#. hintTextTable[RHT_LH_GS_SMALL_ISLAND] = HintText(CustomMessage("They say that night reveals a #spider by a lake# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne bei einem Fluß# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur un îlot du lac# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche revela una #Skulltula junto a un lago# que otorga #[[1]]#. hintTextTable[RHT_LH_GS_LAB_WALL] = HintText(CustomMessage("They say that night reveals a #spider by a lake# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne bei einem Fluß# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur le mur d'un centre de recherche# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche revela una #Skulltula junto a un lago# que otorga #[[1]]#. hintTextTable[RHT_LH_GS_LAB_CRATE] = HintText(CustomMessage("They say that a spider deed underwater in a #lab crate# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß einer Spinne in einer #Laborkiste# unter Wasser #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula dans une boîte au fond d'une cuve d'eau# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula bajo la sumergida caja de un laboratorio# otorga #[[1]]#. hintTextTable[RHT_LH_GS_TREE] = HintText(CustomMessage("They say that night reveals a #spider by a lake high in a tree# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne in einem Baum bei einem Fluß# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula dans un grand arbre du lac# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche revela #una Skulltula del lago sobre un árbol# que otorga #[[1]]#. hintTextTable[RHT_GV_GS_BEAN_PATCH] = HintText(CustomMessage("They say that a #spider buried in a valley# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #in einem Tal begrabene Spinne# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula enterré dans une vallée# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula enterrada en un valle# otorga #[[1]]#. hintTextTable[RHT_GV_GS_SMALL_BRIDGE] = HintText(CustomMessage("They say that night in the past reveals a #spider in a valley# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht in der Vergangenheit eine #Spinne in einem Tal# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula au dessus d'une petite cascade# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche del pasado revela una #Skulltula del valle# que otorga #[[1]]#. hintTextTable[RHT_GV_GS_PILLAR] = HintText(CustomMessage("They say that night in the future reveals a #spider in a valley# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht in der Zukunft eine #Spinne in einem Tal# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur une arche de pierre dans une vallée# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche del futuro revela una #Skulltula del valle# que otorga #[[1]]#. hintTextTable[RHT_GV_GS_BEHIND_TENT] = HintText(CustomMessage("They say that night in the future reveals a #spider in a valley# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht in der Zukunft eine #Spinne in einem Tal# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula derrière une tente# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche del futuro revela una #Skulltula del valle# que otorga #[[1]]#. hintTextTable[RHT_GF_GS_ARCHERY_RANGE] = HintText(CustomMessage("They say that night reveals a #spider in a fortress# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne in einer Festung# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur une cible de tir# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche revela una #Skulltula de una fortaleza# que otorga #[[1]]#. hintTextTable[RHT_GF_GS_TOP_FLOOR] = HintText(CustomMessage("They say that night reveals a #spider in a fortress# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne in einer Festung# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula au sommet d'une forteresse# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche revela una #Skulltula de una fortaleza# que otorga #[[1]]#. hintTextTable[RHT_COLOSSUS_GS_BEAN_PATCH] = HintText(CustomMessage("They say that a #spider buried in the desert# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #in der Wüste begrabene Spinne# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula enterrée au pied du colosse# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula enterrada en el desierto# otorga #[[1]]#. hintTextTable[RHT_COLOSSUS_GS_HILL] = HintText(CustomMessage("They say that night reveals a #spider deep in the desert# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne tief in der Wüste# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur une colline dans le désert# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche revela una #Skulltula en las profundidades del desierto# que otorga #[[1]]#. hintTextTable[RHT_COLOSSUS_GS_TREE] = HintText(CustomMessage("They say that night reveals a #spider deep in the desert# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne tief in der Wüste# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula dans un arbre du désert# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche revela una #Skulltula en las profundidades del desierto# que otorga #[[1]]#. hintTextTable[RHT_KF_SHOP_ITEM_1] = HintText(CustomMessage("They say that a #child shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #Inhaber des Kokiri-Ladens# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #boutique Kokiri# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #joven dependiente# vende #[[1]]#. hintTextTable[RHT_KF_SHOP_ITEM_2] = HintText(CustomMessage("They say that a #child shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #Inhaber des Kokiri-Ladens# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #boutique Kokiri# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #joven dependiente# vende #[[1]]#. hintTextTable[RHT_KF_SHOP_ITEM_3] = HintText(CustomMessage("They say that a #child shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #Inhaber des Kokiri-Ladens# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #boutique Kokiri# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #joven dependiente# vende #[[1]]#. hintTextTable[RHT_KF_SHOP_ITEM_4] = HintText(CustomMessage("They say that a #child shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #Inhaber des Kokiri-Ladens# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #boutique Kokiri# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #joven dependiente# vende #[[1]]#. hintTextTable[RHT_KF_SHOP_ITEM_5] = HintText(CustomMessage("They say that a #child shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #Inhaber des Kokiri-Ladens# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #boutique Kokiri# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #joven dependiente# vende #[[1]]#. hintTextTable[RHT_KF_SHOP_ITEM_6] = HintText(CustomMessage("They say that a #child shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #Inhaber des Kokiri-Ladens# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #boutique Kokiri# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #joven dependiente# vende #[[1]]#. hintTextTable[RHT_KF_SHOP_ITEM_7] = HintText(CustomMessage("They say that a #child shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #Inhaber des Kokiri-Ladens# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #boutique Kokiri# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #joven dependiente# vende #[[1]]#. hintTextTable[RHT_KF_SHOP_ITEM_8] = HintText(CustomMessage("They say that a #child shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #Inhaber des Kokiri-Ladens# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #boutique Kokiri# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #joven dependiente# vende #[[1]]#. hintTextTable[RHT_KAK_POTION_SHOP_ITEM_1] = HintText(CustomMessage("They say that the #Kakariko Potion Shop# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #Magie-Laden in Kakariko# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, la #tienda de pociones de Kakariko# ofrece #[[1]]#. {}, { CustomMessage("They say that a #potion seller# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Trankhändler# #[[1]]# anböte.", /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_KAK_POTION_SHOP_ITEM_2] = HintText(CustomMessage("They say that the #Kakariko Potion Shop# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #Magie-Laden in Kakariko# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, la #tienda de pociones de Kakariko# ofrece #[[1]]#. {}, { CustomMessage("They say that a #potion seller# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Trankhändler# #[[1]]# anböte.", /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_KAK_POTION_SHOP_ITEM_3] = HintText(CustomMessage("They say that the #Kakariko Potion Shop# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #Magie-Laden in Kakariko# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, la #tienda de pociones de Kakariko# ofrece #[[1]]#. {}, { CustomMessage("They say that a #potion seller# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Trankhändler# #[[1]]# anböte.", /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_KAK_POTION_SHOP_ITEM_4] = HintText(CustomMessage("They say that the #Kakariko Potion Shop# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #Magie-Laden in Kakariko# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, la #tienda de pociones de Kakariko# ofrece #[[1]]#. {}, { CustomMessage("They say that a #potion seller# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Trankhändler# #[[1]]# anböte.", /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_KAK_POTION_SHOP_ITEM_5] = HintText(CustomMessage("They say that the #Kakariko Potion Shop# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #Magie-Laden in Kakariko# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, la #tienda de pociones de Kakariko# ofrece #[[1]]#. {}, { CustomMessage("They say that a #potion seller# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Trankhändler# #[[1]]# anböte.", /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_KAK_POTION_SHOP_ITEM_6] = HintText(CustomMessage("They say that the #Kakariko Potion Shop# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #Magie-Laden in Kakariko# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, la #tienda de pociones de Kakariko# ofrece #[[1]]#. {}, { CustomMessage("They say that a #potion seller# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Trankhändler# #[[1]]# anböte.", /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_KAK_POTION_SHOP_ITEM_7] = HintText(CustomMessage("They say that the #Kakariko Potion Shop# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #Magie-Laden in Kakariko# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, la #tienda de pociones de Kakariko# ofrece #[[1]]#. {}, { CustomMessage("They say that a #potion seller# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Trankhändler# #[[1]]# anböte.", /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_KAK_POTION_SHOP_ITEM_8] = HintText(CustomMessage("They say that the #Kakariko Potion Shop# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #Magie-Laden in Kakariko# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, la #tienda de pociones de Kakariko# ofrece #[[1]]#. {}, { CustomMessage("They say that a #potion seller# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Trankhändler# #[[1]]# anböte.", /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_1] = HintText(CustomMessage("They say that a #Bombchu merchant# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krabbelminenhändler# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #marchand de Missiles# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #mercader de bombchus# vende #[[1]]#. hintTextTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_2] = HintText(CustomMessage("They say that a #Bombchu merchant# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krabbelminenhändler# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #marchand de Missiles# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #mercader de bombchus# vende #[[1]]#. hintTextTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_3] = HintText(CustomMessage("They say that a #Bombchu merchant# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krabbelminenhändler# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #marchand de Missiles# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #mercader de bombchus# vende #[[1]]#. hintTextTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_4] = HintText(CustomMessage("They say that a #Bombchu merchant# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krabbelminenhändler# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #marchand de Missiles# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #mercader de bombchus# vende #[[1]]#. hintTextTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_5] = HintText(CustomMessage("They say that a #Bombchu merchant# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krabbelminenhändler# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #marchand de Missiles# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #mercader de bombchus# vende #[[1]]#. hintTextTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_6] = HintText(CustomMessage("They say that a #Bombchu merchant# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krabbelminenhändler# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #marchand de Missiles# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #mercader de bombchus# vende #[[1]]#. hintTextTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_7] = HintText(CustomMessage("They say that a #Bombchu merchant# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krabbelminenhändler# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #marchand de Missiles# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #mercader de bombchus# vende #[[1]]#. hintTextTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_8] = HintText(CustomMessage("They say that a #Bombchu merchant# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krabbelminenhändler# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #marchand de Missiles# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #mercader de bombchus# vende #[[1]]#. hintTextTable[RHT_MARKET_POTION_SHOP_ITEM_1] = HintText(CustomMessage("They say that the #Market Potion Shop# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #Magie-Laden auf dem Markt# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire dans la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, la #tienda de pociones del mercado# ofrece #[[1]]#. {}, { CustomMessage("They say that a #potion seller# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Trankhändler# #[[1]]# anböte.", /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_MARKET_POTION_SHOP_ITEM_2] = HintText(CustomMessage("They say that the #Market Potion Shop# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #Magie-Laden auf dem Markt# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire dans la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, la #tienda de pociones del mercado# ofrece #[[1]]#. {}, { CustomMessage("They say that a #potion seller# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Trankhändler# #[[1]]# anböte.", /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_MARKET_POTION_SHOP_ITEM_3] = HintText(CustomMessage("They say that the #Market Potion Shop# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #Magie-Laden auf dem Markt# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire dans la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, la #tienda de pociones del mercado# ofrece #[[1]]#. {}, { CustomMessage("They say that a #potion seller# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Trankhändler# #[[1]]# anböte.", /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_MARKET_POTION_SHOP_ITEM_4] = HintText(CustomMessage("They say that the #Market Potion Shop# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #Magie-Laden auf dem Markt# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire dans la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, la #tienda de pociones del mercado# ofrece #[[1]]#. {}, { CustomMessage("They say that a #potion seller# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Trankhändler# #[[1]]# anböte.", /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_MARKET_POTION_SHOP_ITEM_5] = HintText(CustomMessage("They say that the #Market Potion Shop# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #Magie-Laden auf dem Markt# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire dans la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, la #tienda de pociones del mercado# ofrece #[[1]]#. {}, { CustomMessage("They say that a #potion seller# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Trankhändler# #[[1]]# anböte.", /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_MARKET_POTION_SHOP_ITEM_6] = HintText(CustomMessage("They say that the #Market Potion Shop# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #Magie-Laden auf dem Markt# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire dans la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, la #tienda de pociones del mercado# ofrece #[[1]]#. {}, { CustomMessage("They say that a #potion seller# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Trankhändler# #[[1]]# anböte.", /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_MARKET_POTION_SHOP_ITEM_7] = HintText(CustomMessage("They say that the #Market Potion Shop# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #Magie-Laden auf dem Markt# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire dans la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, la #tienda de pociones del mercado# ofrece #[[1]]#. {}, { CustomMessage("They say that a #potion seller# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Trankhändler# #[[1]]# anböte.", /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_MARKET_POTION_SHOP_ITEM_8] = HintText(CustomMessage("They say that the #Market Potion Shop# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #Magie-Laden auf dem Markt# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire dans la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, la #tienda de pociones del mercado# ofrece #[[1]]#. {}, { CustomMessage("They say that a #potion seller# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Trankhändler# #[[1]]# anböte.", /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_MARKET_BAZAAR_ITEM_1] = HintText(CustomMessage("They say that the #Market Bazaar# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß auf dem #Marktbasar# #[[1]]# angeboten würde.", /*french*/ "Selon moi, le #bazar de la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #bazar del mercado# ofrece #[[1]]#. hintTextTable[RHT_MARKET_BAZAAR_ITEM_2] = HintText(CustomMessage("They say that the #Market Bazaar# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß auf dem #Marktbasar# #[[1]]# angeboten würde.", /*french*/ "Selon moi, le #bazar de la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #bazar del mercado# ofrece #[[1]]#. hintTextTable[RHT_MARKET_BAZAAR_ITEM_3] = HintText(CustomMessage("They say that the #Market Bazaar# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß auf dem #Marktbasar# #[[1]]# angeboten würde.", /*french*/ "Selon moi, le #bazar de la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #bazar del mercado# ofrece #[[1]]#. hintTextTable[RHT_MARKET_BAZAAR_ITEM_4] = HintText(CustomMessage("They say that the #Market Bazaar# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß auf dem #Marktbasar# #[[1]]# angeboten würde.", /*french*/ "Selon moi, le #bazar de la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #bazar del mercado# ofrece #[[1]]#. hintTextTable[RHT_MARKET_BAZAAR_ITEM_5] = HintText(CustomMessage("They say that the #Market Bazaar# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß auf dem #Marktbasar# #[[1]]# angeboten würde.", /*french*/ "Selon moi, le #bazar de la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #bazar del mercado# ofrece #[[1]]#. hintTextTable[RHT_MARKET_BAZAAR_ITEM_6] = HintText(CustomMessage("They say that the #Market Bazaar# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß auf dem #Marktbasar# #[[1]]# angeboten würde.", /*french*/ "Selon moi, le #bazar de la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #bazar del mercado# ofrece #[[1]]#. hintTextTable[RHT_MARKET_BAZAAR_ITEM_7] = HintText(CustomMessage("They say that the #Market Bazaar# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß auf dem #Marktbasar# #[[1]]# angeboten würde.", /*french*/ "Selon moi, le #bazar de la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #bazar del mercado# ofrece #[[1]]#. hintTextTable[RHT_MARKET_BAZAAR_ITEM_8] = HintText(CustomMessage("They say that the #Market Bazaar# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß auf dem #Marktbasar# #[[1]]# angeboten würde.", /*french*/ "Selon moi, le #bazar de la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #bazar del mercado# ofrece #[[1]]#. hintTextTable[RHT_KAK_BAZAAR_ITEM_1] = HintText(CustomMessage("They say that the #Kakariko Bazaar# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß auf dem #Basar in Kakariko# #[[1]]# angeboten würde.", /*french*/ "Selon moi, le #bazar de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #bazar de Kakariko# ofrece #[[1]]#. hintTextTable[RHT_KAK_BAZAAR_ITEM_2] = HintText(CustomMessage("They say that the #Kakariko Bazaar# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß auf dem #Basar in Kakariko# #[[1]]# angeboten würde.", /*french*/ "Selon moi, le #bazar de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #bazar de Kakariko# ofrece #[[1]]#. hintTextTable[RHT_KAK_BAZAAR_ITEM_3] = HintText(CustomMessage("They say that the #Kakariko Bazaar# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß auf dem #Basar in Kakariko# #[[1]]# angeboten würde.", /*french*/ "Selon moi, le #bazar de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #bazar de Kakariko# ofrece #[[1]]#. hintTextTable[RHT_KAK_BAZAAR_ITEM_4] = HintText(CustomMessage("They say that the #Kakariko Bazaar# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß auf dem #Basar in Kakariko# #[[1]]# angeboten würde.", /*french*/ "Selon moi, le #bazar de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #bazar de Kakariko# ofrece #[[1]]#. hintTextTable[RHT_KAK_BAZAAR_ITEM_5] = HintText(CustomMessage("They say that the #Kakariko Bazaar# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß auf dem #Basar in Kakariko# #[[1]]# angeboten würde.", /*french*/ "Selon moi, le #bazar de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #bazar de Kakariko# ofrece #[[1]]#. hintTextTable[RHT_KAK_BAZAAR_ITEM_6] = HintText(CustomMessage("They say that the #Kakariko Bazaar# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß auf dem #Basar in Kakariko# #[[1]]# angeboten würde.", /*french*/ "Selon moi, le #bazar de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #bazar de Kakariko# ofrece #[[1]]#. hintTextTable[RHT_KAK_BAZAAR_ITEM_7] = HintText(CustomMessage("They say that the #Kakariko Bazaar# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß auf dem #Basar in Kakariko# #[[1]]# angeboten würde.", /*french*/ "Selon moi, le #bazar de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #bazar de Kakariko# ofrece #[[1]]#. hintTextTable[RHT_KAK_BAZAAR_ITEM_8] = HintText(CustomMessage("They say that the #Kakariko Bazaar# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß auf dem #Basar in Kakariko# #[[1]]# angeboten würde.", /*french*/ "Selon moi, le #bazar de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #bazar de Kakariko# ofrece #[[1]]#. hintTextTable[RHT_ZD_SHOP_ITEM_1] = HintText(CustomMessage("They say that a #Zora shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Händler der Zora# #[[1]]# verkaufen würde.", /*french*/ "Selon moi, la #boutique Zora# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #dependiente Zora# vende #[[1]]#. hintTextTable[RHT_ZD_SHOP_ITEM_2] = HintText(CustomMessage("They say that a #Zora shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Händler der Zora# #[[1]]# verkaufen würde.", /*french*/ "Selon moi, la #boutique Zora# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #dependiente Zora# vende #[[1]]#. hintTextTable[RHT_ZD_SHOP_ITEM_3] = HintText(CustomMessage("They say that a #Zora shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Händler der Zora# #[[1]]# verkaufen würde.", /*french*/ "Selon moi, la #boutique Zora# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #dependiente Zora# vende #[[1]]#. hintTextTable[RHT_ZD_SHOP_ITEM_4] = HintText(CustomMessage("They say that a #Zora shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Händler der Zora# #[[1]]# verkaufen würde.", /*french*/ "Selon moi, la #boutique Zora# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #dependiente Zora# vende #[[1]]#. hintTextTable[RHT_ZD_SHOP_ITEM_5] = HintText(CustomMessage("They say that a #Zora shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Händler der Zora# #[[1]]# verkaufen würde.", /*french*/ "Selon moi, la #boutique Zora# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #dependiente Zora# vende #[[1]]#. hintTextTable[RHT_ZD_SHOP_ITEM_6] = HintText(CustomMessage("They say that a #Zora shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Händler der Zora# #[[1]]# verkaufen würde.", /*french*/ "Selon moi, la #boutique Zora# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #dependiente Zora# vende #[[1]]#. hintTextTable[RHT_ZD_SHOP_ITEM_7] = HintText(CustomMessage("They say that a #Zora shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Händler der Zora# #[[1]]# verkaufen würde.", /*french*/ "Selon moi, la #boutique Zora# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #dependiente Zora# vende #[[1]]#. hintTextTable[RHT_ZD_SHOP_ITEM_8] = HintText(CustomMessage("They say that a #Zora shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Händler der Zora# #[[1]]# verkaufen würde.", /*french*/ "Selon moi, la #boutique Zora# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #dependiente Zora# vende #[[1]]#. hintTextTable[RHT_GC_SHOP_ITEM_1] = HintText(CustomMessage("They say that a #Goron shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Händler der Goronen# #[[1]]# verkaufen würde.", /*french*/ "Selon moi, la #boutique Goron# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #dependiente Goron# vende #[[1]]#. hintTextTable[RHT_GC_SHOP_ITEM_2] = HintText(CustomMessage("They say that a #Goron shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Händler der Goronen# #[[1]]# verkaufen würde.", /*french*/ "Selon moi, la #boutique Goron# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #dependiente Goron# vende #[[1]]#. hintTextTable[RHT_GC_SHOP_ITEM_3] = HintText(CustomMessage("They say that a #Goron shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Händler der Goronen# #[[1]]# verkaufen würde.", /*french*/ "Selon moi, la #boutique Goron# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #dependiente Goron# vende #[[1]]#. hintTextTable[RHT_GC_SHOP_ITEM_4] = HintText(CustomMessage("They say that a #Goron shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Händler der Goronen# #[[1]]# verkaufen würde.", /*french*/ "Selon moi, la #boutique Goron# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #dependiente Goron# vende #[[1]]#. hintTextTable[RHT_GC_SHOP_ITEM_5] = HintText(CustomMessage("They say that a #Goron shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Händler der Goronen# #[[1]]# verkaufen würde.", /*french*/ "Selon moi, la #boutique Goron# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #dependiente Goron# vende #[[1]]#. hintTextTable[RHT_GC_SHOP_ITEM_6] = HintText(CustomMessage("They say that a #Goron shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Händler der Goronen# #[[1]]# verkaufen würde.", /*french*/ "Selon moi, la #boutique Goron# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #dependiente Goron# vende #[[1]]#. hintTextTable[RHT_GC_SHOP_ITEM_7] = HintText(CustomMessage("They say that a #Goron shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Händler der Goronen# #[[1]]# verkaufen würde.", /*french*/ "Selon moi, la #boutique Goron# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #dependiente Goron# vende #[[1]]#. hintTextTable[RHT_GC_SHOP_ITEM_8] = HintText(CustomMessage("They say that a #Goron shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Händler der Goronen# #[[1]]# verkaufen würde.", /*french*/ "Selon moi, la #boutique Goron# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #dependiente Goron# vende #[[1]]#. hintTextTable[RHT_HF_DEKU_SCRUB_GROTTO] = HintText(CustomMessage("They say that a lonely #scrub in a hole# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #einsamer Deku in einem Loch# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #peste Mojo dans une grotte de la plaine# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #singular deku bajo un hoyo# de la llanura vende #[[1]]#. hintTextTable[RHT_LLR_DEKU_SCRUB_GROTTO_LEFT] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-Trio# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #trio de peste Mojo à la ferme# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #trío de dekus# de una granja venden #[[1]]#. hintTextTable[RHT_LLR_DEKU_SCRUB_GROTTO_RIGHT] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-Trio# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #trio de peste Mojo à la ferme# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #trío de dekus# de una granja venden #[[1]]#. hintTextTable[RHT_LLR_DEKU_SCRUB_GROTTO_CENTER] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-Trio# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #trio de peste Mojo à la ferme# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #trío de dekus# de una granja venden #[[1]]#. hintTextTable[RHT_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT] = HintText(CustomMessage("They say that a pair of #scrubs in the woods# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-Paar in den Wäldern# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo près du théâtre# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un par de #dekus del bosque# venden #[[1]]#. hintTextTable[RHT_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT] = HintText(CustomMessage("They say that a pair of #scrubs in the woods# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-Paar in den Wäldern# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo près du théâtre# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un par de #dekus del bosque# venden #[[1]]#. hintTextTable[RHT_LW_DEKU_SCRUB_NEAR_BRIDGE] = HintText(CustomMessage("They say that a #scrub by a bridge# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku bei einer Brücke# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #peste Mojo près du pont dans les bois# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #deku bajo un puente# del bosque venden #[[1]]#. hintTextTable[RHT_LW_DEKU_SCRUB_GROTTO_REAR] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-Paar im Untergrund# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo dans les sous-bois# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #par de dekus subterráneos# del bosque venden #[[1]]#. hintTextTable[RHT_LW_DEKU_SCRUB_GROTTO_FRONT] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-Paar im Untergrund# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo dans les sous-bois# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #par de dekus subterráneos# del bosque venden #[[1]]#. hintTextTable[RHT_SFM_DEKU_SCRUB_GROTTO_REAR] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-Paar im Untergrund# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo au cœur du sanctuaire sylvestre# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #par de dekus subterráneos# de la pradera sagrada venden #[[1]]#. hintTextTable[RHT_SFM_DEKU_SCRUB_GROTTO_FRONT] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-Paar im Untergrund# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo au cœur du sanctuaire sylvestre# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #par de dekus subterráneos# de la pradera sagrada venden #[[1]]#. hintTextTable[RHT_GC_DEKU_SCRUB_GROTTO_LEFT] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-Trio# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #trio de peste Mojo dans le village Goron# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #trío de dekus# de la Ciudad Goron venden #[[1]]#. hintTextTable[RHT_GC_DEKU_SCRUB_GROTTO_RIGHT] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-Trio# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #trio de peste Mojo dans le village Goron# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #trío de dekus# de la Ciudad Goron venden #[[1]]#. hintTextTable[RHT_GC_DEKU_SCRUB_GROTTO_CENTER] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-Trio# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #trio de peste Mojo dans le village Goron# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #trío de dekus# de la Ciudad Goron venden #[[1]]#. hintTextTable[RHT_DMC_DEKU_SCRUB_GROTTO_LEFT] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-Trio# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #trio de peste Mojo dans le volcan# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #trío de dekus# del volcán venden #[[1]]#. hintTextTable[RHT_DMC_DEKU_SCRUB_GROTTO_RIGHT] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-Trio# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #trio de peste Mojo dans le volcan# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #trío de dekus# del volcán venden #[[1]]#. hintTextTable[RHT_DMC_DEKU_SCRUB_GROTTO_CENTER] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-Trio# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #trio de peste Mojo dans le volcan# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #trío de dekus# del volcán venden #[[1]]#. hintTextTable[RHT_ZR_DEKU_SCRUB_GROTTO_REAR] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-Paar im Untergrund# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo près du fleuve# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #par de dekus subterráneos# del río venden #[[1]]#. hintTextTable[RHT_ZR_DEKU_SCRUB_GROTTO_FRONT] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-Paar im Untergrund# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo près du fleuve# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #par de dekus subterráneos# del río venden #[[1]]#. hintTextTable[RHT_LH_DEKU_SCRUB_GROTTO_LEFT] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-Trio# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #trio de peste Mojo près du lac# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #trío de dekus# del lago venden #[[1]]#. hintTextTable[RHT_LH_DEKU_SCRUB_GROTTO_RIGHT] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-Trio# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #trio de peste Mojo près du lac# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #trío de dekus# del lago venden #[[1]]#. hintTextTable[RHT_LH_DEKU_SCRUB_GROTTO_CENTER] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-Trio# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #trio de peste Mojo près du lac# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #trío de dekus# del lago venden #[[1]]#. hintTextTable[RHT_GV_DEKU_SCRUB_GROTTO_REAR] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-Paar im Untergrund# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo près de la vallée# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #par de dekus subterráneos# del valle venden #[[1]]#. hintTextTable[RHT_GV_DEKU_SCRUB_GROTTO_FRONT] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-Paar im Untergrund# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo près de la vallée# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #par de dekus subterráneos# del valle venden #[[1]]#. hintTextTable[RHT_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-Paar im Untergrund# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo dans le désert# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #par de dekus subterráneos# del desierto venden #[[1]]#. hintTextTable[RHT_COLOSSUS_DEKU_SCRUB_GROTTO_REAR] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-Paar im Untergrund# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo dans le désert# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #par de dekus subterráneos# del desierto venden #[[1]]#. hintTextTable[RHT_LLR_STABLES_LEFT_COW] = HintText(CustomMessage("They say that a #cow in a stable# gifts #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Kuh in einem Stall# #[[1]]# schenke.", /*french*/ "Selon moi, la #vache dans l'étable# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #vaca del establo# brinda #[[1]]#. hintTextTable[RHT_LLR_STABLES_RIGHT_COW] = HintText(CustomMessage("They say that a #cow in a stable# gifts #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Kuh in einem Stall# #[[1]]# schenke.", /*french*/ "Selon moi, la #vache dans l'étable# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #vaca del establo# brinda #[[1]]#. hintTextTable[RHT_LLR_TOWER_RIGHT_COW] = HintText(CustomMessage("They say that a #cow in a ranch silo# gifts #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Kuh in einem Silo# #[[1]]# schenke.", /*french*/ "Selon moi, la #vache dans le silo de la ferme# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #vaca del granero# brinda #[[1]]#. hintTextTable[RHT_LLR_TOWER_LEFT_COW] = HintText(CustomMessage("They say that a #cow in a ranch silo# gifts #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Kuh in einem Silo# #[[1]]# schenke.", /*french*/ "Selon moi, la #vache dans le silo de la ferme# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #vaca del granero# brinda #[[1]]#. hintTextTable[RHT_KAK_IMPAS_HOUSE_COW] = HintText(CustomMessage("They say that a #cow imprisoned in a house# protects #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #in einem Haus gefangene Kuh# #[[1]]# schütze.", /*french*/ "Selon moi, la #vache en cage# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #vaca enjaulada de una casa# brinda #[[1]]#. hintTextTable[RHT_DMT_COW_GROTTO_COW] = HintText(CustomMessage("They say that a #cow in a luxurious hole# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Kuh in einem luxuriösen Loch# #[[1]]# offeriere.", /*french*/ "Selon moi, la #vache dans une grotte luxueuse# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #vaca de un lujoso hoyo# brinda #[[1]]#. hintTextTable[RHT_BEEHIVE_CHEST_GROTTO] = HintText(CustomMessage("They say that a #beehive above a chest# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Bienenstock oberhalb einer Truhe# #[[1]]# verberge.", /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #colmena sobre un cofre# esconde #[[1]]#. hintTextTable[RHT_BEEHIVE_LONELY_SCRUB_GROTTO] = HintText(CustomMessage("They say that a #beehive above a lonely scrub# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Bienenstock oberhalb eines einsamen Deku# #[[1]]# verberge.", /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #colmena sobre un deku solitario# esconde #[[1]]#. hintTextTable[RHT_BEEHIVE_SCRUB_PAIR_GROTTO] = HintText(CustomMessage("They say that a #beehive above a pair of scrubs# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Bienenstock oberhalb eines Deku-Paars# #[[1]]# verberge.", /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #colmena sobre un par de dekus# esconde #[[1]]#. hintTextTable[RHT_BEEHIVE_SCRUB_TRIO_GROTTO] = HintText(CustomMessage("They say that a #beehive above a trio of scrubs# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Bienenstock oberhalb eines Deku-Trios# #[[1]]# verberge.", /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #colmena sobre un trío de dekus# esconde #[[1]]#. hintTextTable[RHT_BEEHIVE_COW_GROTTO] = HintText(CustomMessage("They say that a #beehive above a cow# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Bienenstock oberhalb einer Kuh# #[[1]]# verberge.", /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #colmena sobre una vaca# esconde #[[1]]#. hintTextTable[RHT_BEEHIVE_IN_FRONT_OF_KING_ZORA] = HintText(CustomMessage("They say that a #beehive in front of the king of the zoras# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Bienenstock vor dem Zora-König# #[[1]]# verberge.", /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #colmena delante del rey de los zoras# esconde #[[1]]#. hintTextTable[RHT_BEEHIVE_BEHIND_KING_ZORA] = HintText(CustomMessage("They say that a #beehive behind the king of the zoras# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Bienenstock hinter dem Zora-König# #[[1]]# verberge.", /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #colmena detrás del rey de los zoras# esconde #[[1]]#. } From 075b28cc8c6071dcf5ca06a2b4d03256f4837fb8 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Tue, 3 Sep 2024 22:12:25 -0700 Subject: [PATCH 060/108] Define VB for fairy group spawning --- soh/soh/Enhancements/game-interactor/GameInteractor.h | 3 +++ soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c | 9 ++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.h b/soh/soh/Enhancements/game-interactor/GameInteractor.h index 3523fa4057f..cc79a9a5208 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor.h @@ -413,6 +413,9 @@ typedef enum { // Vanilla condition: true VB_PHANTOM_GANON_DEATH_SCENE, VB_NABOORU_KNUCKLE_DEATH_SCENE, + + // Opt: *EnElf + VB_SPAWN_FAIRY_GROUP, } GIVanillaBehavior; #ifdef __cplusplus diff --git a/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c b/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c index f6f82f5c788..af16aa7b53e 100644 --- a/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c +++ b/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c @@ -7,6 +7,7 @@ #include "z_en_elf.h" #include "objects/gameplay_keep/gameplay_keep.h" #include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA) @@ -399,9 +400,11 @@ void EnElf_Init(Actor* thisx, PlayState* play) { EnElf_SetupAction(this, func_80A03604); func_80A01C38(this, 8); - for (i = 0; i < 8; i++) { - Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELF, thisx->world.pos.x, - thisx->world.pos.y - 30.0f, thisx->world.pos.z, 0, 0, 0, FAIRY_HEAL, true); + if (GameInteractor_Should(VB_SPAWN_FAIRY_GROUP, true, this)) { + for (i = 0; i < 8; i++) { + Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELF, thisx->world.pos.x, + thisx->world.pos.y - 30.0f, thisx->world.pos.z, 0, 0, 0, FAIRY_HEAL, true); + } } break; default: From a263d458bfc8d05f175d68a794b1738f677c5561 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Tue, 3 Sep 2024 23:14:54 -0700 Subject: [PATCH 061/108] Add skeleton of new files for fairy shuffle --- .../Enhancements/randomizer/fairy_shuffle.cpp | 20 +++++++++++++++++++ .../Enhancements/randomizer/fairy_shuffle.h | 4 ++++ 2 files changed, 24 insertions(+) create mode 100644 soh/soh/Enhancements/randomizer/fairy_shuffle.cpp create mode 100644 soh/soh/Enhancements/randomizer/fairy_shuffle.h diff --git a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp new file mode 100644 index 00000000000..a0851fe90e3 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp @@ -0,0 +1,20 @@ +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "fairy_shuffle.h" + +void FairyOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void* optionalArg) { + if (id == VB_SPAWN_FAIRY_GROUP) { + // TODO + } +} + +uint32_t onVanillaBehaviorHook = 0; + +void FairyRegisterHooks() { + onVanillaBehaviorHook = GameInteractor::Instance->RegisterGameHook(FairyOnVanillaBehaviorHandler); +} + +void FairyUnregisterHooks() { + GameInteractor::Instance->UnregisterGameHook(onVanillaBehaviorHook); + + onVanillaBehaviorHook = 0; +} \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/fairy_shuffle.h b/soh/soh/Enhancements/randomizer/fairy_shuffle.h new file mode 100644 index 00000000000..d7dc64e6255 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/fairy_shuffle.h @@ -0,0 +1,4 @@ +#include + +void FairyRegisterHooks(); +void FairyUnregisterHooks(); From 792515d7f3cdcbfd40a1fe09575af27f091dedf1 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Tue, 3 Sep 2024 23:26:43 -0700 Subject: [PATCH 062/108] Add option to enable/disable fairy shuffle --- soh/soh/Enhancements/randomizer/hook_handlers.cpp | 7 +++++++ soh/soh/Enhancements/randomizer/option_descriptions.cpp | 2 ++ soh/soh/Enhancements/randomizer/randomizerTypes.h | 1 + soh/soh/Enhancements/randomizer/settings.cpp | 6 ++++++ 4 files changed, 16 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index 4bd8da74259..673bdfe8c19 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -6,6 +6,7 @@ #include "soh/Enhancements/randomizer/dungeon.h" #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/Enhancements/randomizer/fairy_shuffle.h" extern "C" { #include "macros.h" @@ -1518,6 +1519,8 @@ void RandomizerRegisterHooks() { onSceneInitHook = 0; onActorInitHook = 0; + FairyUnregisterHooks(); + if (!IS_RANDO) return; onFlagSetHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnFlagSetHandler); @@ -1528,5 +1531,9 @@ void RandomizerRegisterHooks() { onVanillaBehaviorHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnVanillaBehaviorHandler); onSceneInitHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnSceneInitHandler); onActorInitHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnActorInitHandler); + + if (RAND_GET_OPTION(RSK_SHUFFLE_FAIRIES)) { + FairyRegisterHooks(); + } }); } diff --git a/soh/soh/Enhancements/randomizer/option_descriptions.cpp b/soh/soh/Enhancements/randomizer/option_descriptions.cpp index 597b46db605..4fe19320153 100644 --- a/soh/soh/Enhancements/randomizer/option_descriptions.cpp +++ b/soh/soh/Enhancements/randomizer/option_descriptions.cpp @@ -336,6 +336,8 @@ void Settings::CreateOptionDescriptions() { "have collected all 100 Gold Skulltula Tokens.\n" "\n" "You can still talk to him multiple times to get Huge Rupees."; + mOptionDescriptions[RSK_SHUFFLE_FAIRIES] = + "Shuffle fairy locations."; mOptionDescriptions[RSK_SHUFFLE_DUNGEON_REWARDS] = "Shuffles the location of spiritual stones and medallions.\n" "\n" diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 507ae5fec2b..eb2d8e73f8e 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -3883,6 +3883,7 @@ typedef enum { RSK_SKELETON_KEY, RSK_SHUFFLE_DEKU_STICK_BAG, RSK_SHUFFLE_DEKU_NUT_BAG, + RSK_SHUFFLE_FAIRIES, RSK_MAX } RandomizerSettingKey; diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index f3f860800bc..83e332f6027 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -125,6 +125,7 @@ void Settings::CreateOptions() { mOptions[RSK_FISHSANITY] = Option::U8("Fishsanity", {"Off", "Shuffle only Hyrule Loach", "Shuffle Fishing Pond", "Shuffle Overworld Fish", "Shuffle Both"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("Fishsanity"), mOptionDescriptions[RSK_FISHSANITY], WidgetType::Combobox, RO_FISHSANITY_OFF); mOptions[RSK_FISHSANITY_POND_COUNT] = Option::U8("Pond Fish Count", {NumOpts(0,17,1)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("FishsanityPondCount"), mOptionDescriptions[RSK_FISHSANITY_POND_COUNT], WidgetType::Slider, 0, true, IMFLAG_NONE); mOptions[RSK_FISHSANITY_AGE_SPLIT] = Option::Bool("Pond Age Split", CVAR_RANDOMIZER_SETTING("FishsanityAgeSplit"), mOptionDescriptions[RSK_FISHSANITY_AGE_SPLIT]); + mOptions[RSK_SHUFFLE_FAIRIES] = Option::Bool("Shuffle Fairies", CVAR_RANDOMIZER_SETTING("ShuffleFairies"), mOptionDescriptions[RSK_SHUFFLE_FAIRIES]); mOptions[RSK_SHUFFLE_MAPANDCOMPASS] = Option::U8("Maps/Compasses", {"Start With", "Vanilla", "Own Dungeon", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("StartingMapsCompasses"), mOptionDescriptions[RSK_SHUFFLE_MAPANDCOMPASS], WidgetType::Combobox, RO_DUNGEON_ITEM_LOC_OWN_DUNGEON); mOptions[RSK_KEYSANITY] = Option::U8("Small Keys", {"Start With", "Vanilla", "Own Dungeon", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("Keysanity"), mOptionDescriptions[RSK_KEYSANITY], WidgetType::Combobox, RO_DUNGEON_ITEM_LOC_OWN_DUNGEON); mOptions[RSK_GERUDO_KEYS] = Option::U8("Gerudo Fortress Keys", {"Vanilla", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("GerudoKeys"), mOptionDescriptions[RSK_GERUDO_KEYS], WidgetType::Combobox, RO_GERUDO_KEYS_VANILLA); @@ -686,6 +687,7 @@ void Settings::CreateOptions() { &mOptions[RSK_SHUFFLE_ADULT_TRADE], &mOptions[RSK_SHUFFLE_100_GS_REWARD], &mOptions[RSK_SHUFFLE_BOSS_SOULS], + &mOptions[RSK_SHUFFLE_FAIRIES], }, false, WidgetContainerType::COLUMN); mOptionGroups[RSG_SHUFFLE_DUNGEON_ITEMS_IMGUI] = OptionGroup::SubGroup("Shuffle Dungeon Items", { &mOptions[RSK_SHUFFLE_DUNGEON_REWARDS], @@ -901,6 +903,7 @@ void Settings::CreateOptions() { &mOptions[RSK_SHUFFLE_BOSS_SOULS], &mOptions[RSK_SHUFFLE_DEKU_STICK_BAG], &mOptions[RSK_SHUFFLE_DEKU_NUT_BAG], + &mOptions[RSK_SHUFFLE_FAIRIES], }); mOptionGroups[RSG_SHUFFLE_DUNGEON_ITEMS] = OptionGroup("Shuffle Dungeon Items", { &mOptions[RSK_SHUFFLE_MAPANDCOMPASS], @@ -1081,6 +1084,7 @@ void Settings::CreateOptions() { &mOptions[RSK_SHUFFLE_FROG_SONG_RUPEES], &mOptions[RSK_SHUFFLE_ADULT_TRADE], &mOptions[RSK_SHUFFLE_100_GS_REWARD], + &mOptions[RSK_SHUFFLE_FAIRIES], &mOptions[RSK_GOSSIP_STONE_HINTS], }; @@ -1134,6 +1138,7 @@ void Settings::CreateOptions() { { "Shuffle Settings:Shuffle Boss Souls", RSK_SHUFFLE_BOSS_SOULS }, { "Shuffle Settings:Shuffle Deku Stick Bag", RSK_SHUFFLE_DEKU_STICK_BAG }, { "Shuffle Settings:Shuffle Deku Nut Bag", RSK_SHUFFLE_DEKU_NUT_BAG }, + { "Shuffle Settings:Shuffle Fairies", RSK_SHUFFLE_FAIRIES }, { "Start with Deku Shield", RSK_STARTING_DEKU_SHIELD }, { "Start with Kokiri Sword", RSK_STARTING_KOKIRI_SWORD }, { "Start with Fairy Ocarina", RSK_STARTING_OCARINA }, @@ -2361,6 +2366,7 @@ void Settings::ParseJson(nlohmann::json spoilerFileJson) { case RSK_SHUFFLE_OCARINA_BUTTONS: case RSK_SHUFFLE_SWIM: case RSK_SHUFFLE_CHILD_WALLET: + case RSK_SHUFFLE_FAIRIES: case RSK_STARTING_DEKU_SHIELD: case RSK_STARTING_KOKIRI_SWORD: case RSK_STARTING_ZELDAS_LULLABY: From e655f2e77e49c64756ece79c2948ff92fcb4a3a4 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Wed, 4 Sep 2024 00:34:59 -0700 Subject: [PATCH 063/108] Add field to fairy entities to hold randomizer data --- soh/soh/Enhancements/randomizer/fairy_shuffle.cpp | 10 ++++++++++ soh/soh/Enhancements/randomizer/fairy_shuffle.h | 10 ++++++++++ soh/src/overlays/actors/ovl_En_Elf/z_en_elf.h | 4 ++++ 3 files changed, 24 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp index a0851fe90e3..031a3ad5bbf 100644 --- a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp +++ b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp @@ -1,5 +1,6 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "fairy_shuffle.h" +#include "src/overlays/actors/ovl_En_Elf/z_en_elf.h" void FairyOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void* optionalArg) { if (id == VB_SPAWN_FAIRY_GROUP) { @@ -7,14 +8,23 @@ void FairyOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void* opt } } +void FairyOnActorInitHandler(void* actorRef) { + EnElf* enElf = static_cast(actorRef); + enElf->sohFairyIdentity = { RAND_INF_MAX, GET_ITEM_NONE }; +} + uint32_t onVanillaBehaviorHook = 0; +uint32_t onActorInitHook = 0; void FairyRegisterHooks() { onVanillaBehaviorHook = GameInteractor::Instance->RegisterGameHook(FairyOnVanillaBehaviorHandler); + onActorInitHook = GameInteractor::Instance->RegisterGameHookForID(ACTOR_EN_ELF, FairyOnActorInitHandler); } void FairyUnregisterHooks() { GameInteractor::Instance->UnregisterGameHook(onVanillaBehaviorHook); + GameInteractor::Instance->UnregisterGameHookForID(onActorInitHook); onVanillaBehaviorHook = 0; + onActorInitHook = 0; } \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/fairy_shuffle.h b/soh/soh/Enhancements/randomizer/fairy_shuffle.h index d7dc64e6255..95640af9386 100644 --- a/soh/soh/Enhancements/randomizer/fairy_shuffle.h +++ b/soh/soh/Enhancements/randomizer/fairy_shuffle.h @@ -1,4 +1,14 @@ +#pragma once + #include +#include "soh/Enhancements/item-tables/ItemTableTypes.h" +#include "randomizer_inf.h" + +typedef struct FairyIdentity { + RandomizerInf randomizerInf; + GetItemEntry itemEntry; +} FairyIdentity; + void FairyRegisterHooks(); void FairyUnregisterHooks(); diff --git a/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.h b/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.h index 7f8e4c84ee0..61de10b6f5b 100644 --- a/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.h +++ b/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.h @@ -4,6 +4,7 @@ #include #include "global.h" #include "overlays/actors/ovl_Elf_Msg/z_elf_msg.h" +#include "soh/Enhancements/randomizer/fairy_shuffle.h" struct EnElf; @@ -42,6 +43,9 @@ typedef struct EnElf { /* 0x02C7 */ u8 unk_2C7; /* 0x02C8 */ EnElfUnkFunc func_2C8; /* 0x02CC */ EnElfActionFunc actionFunc; + // #region SOH [Randomizer] + /* */ FairyIdentity sohFairyIdentity; + // #endregion } EnElf; // size = 0x02D0 typedef enum { From 59222c8802e901c593e4fe9187e2368c02abe898 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Wed, 4 Sep 2024 23:05:54 -0700 Subject: [PATCH 064/108] Expose the current grotto id, or find it if not shuffled This is necessary since, unlike chest or scrub grottos, fairy fountains, lacking any elements that would normally differ between grottos, often have identical respawn data. This change enables fairy shuffle to correctly identify which fairy fountain was entered so it could load the right checks. --- soh/soh/Enhancements/randomizer/randomizer_grotto.c | 11 +++++++++++ soh/soh/Enhancements/randomizer/randomizer_grotto.h | 1 + 2 files changed, 12 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/randomizer_grotto.c b/soh/soh/Enhancements/randomizer/randomizer_grotto.c index ef532f670ad..aeaa3e9b6da 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_grotto.c +++ b/soh/soh/Enhancements/randomizer/randomizer_grotto.c @@ -332,3 +332,14 @@ s16 Grotto_GetRenamedGrottoIndexFromOriginal(s8 content, s8 scene) { return ENTRANCE_RANDO_GROTTO_LOAD_START; } + +s8 Grotto_CurrentGrotto() { + if (Randomizer_GetSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) || Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) || Randomizer_GetSettingValue(RSK_SHUFFLE_WARP_SONGS)) { + return grottoId; + } else { + s16 entrance = gSaveContext.respawn[RESPAWN_MODE_RETURN].entranceIndex; + s8 scene = gEntranceTable[entrance].scene; + s8 data = gSaveContext.respawn[RESPAWN_MODE_RETURN].data; + return Grotto_GetRenamedGrottoIndexFromOriginal(data, scene) & 0xFF; + } +} diff --git a/soh/soh/Enhancements/randomizer/randomizer_grotto.h b/soh/soh/Enhancements/randomizer/randomizer_grotto.h index 938c4c6d6ee..f124caeefc7 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_grotto.h +++ b/soh/soh/Enhancements/randomizer/randomizer_grotto.h @@ -31,5 +31,6 @@ void Grotto_ForceGrottoReturn(void); void Grotto_ForceRegularVoidOut(void); void Grotto_SanitizeEntranceType(void); s16 Grotto_GetRenamedGrottoIndexFromOriginal(s8 content, s8 scene); +s8 Grotto_CurrentGrotto(); #endif //_RANDO_GROTTO_H_ From 987f4cec78226db69a68c2c412a65e94c9ce81b2 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Wed, 4 Sep 2024 23:54:27 -0700 Subject: [PATCH 065/108] Initialise fairy groups if detected --- .../Enhancements/randomizer/fairy_shuffle.cpp | 40 +++++++++++++++---- .../randomizer/randomizer_grotto.h | 6 +++ 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp index 031a3ad5bbf..38edfb0baca 100644 --- a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp +++ b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp @@ -1,24 +1,50 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "fairy_shuffle.h" +#include "randomizer_grotto.h" +#include "draw.h" #include "src/overlays/actors/ovl_En_Elf/z_en_elf.h" + +void FairyDrawRandomizedItem(EnElf* enElf, PlayState* play) { + GetItemEntry randoGetItem = enElf->sohFairyIdentity.itemEntry; + if (CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MysteriousShuffle"), 0)) { + randoGetItem = GET_ITEM_MYSTERY; + } + func_8002ED80(&enElf->actor, play, 0); + EnItem00_CustomItemsParticles(&enElf->actor, play, randoGetItem); + GetItemEntry_Draw(play, randoGetItem); +} + void FairyOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void* optionalArg) { - if (id == VB_SPAWN_FAIRY_GROUP) { - // TODO - } + if (id == VB_SPAWN_FAIRY_GROUP) { + EnElf* enElf = static_cast(optionalArg); + s16 grottoId = (gPlayState->sceneNum == SCENE_FAIRYS_FOUNTAIN) ? Grotto_CurrentGrotto() : 0; + for (s16 index = 0; index < 8; index++) { + EnElf* newFairy = (EnElf*)Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_ELF, enElf->actor.world.pos.x, + enElf->actor.world.pos.y - 30.0f, enElf->actor.world.pos.z, 0, 0, 0, FAIRY_HEAL, true); + //EnElf* newFairy = newActor); + Rando::Location* location = OTRGlobals::Instance->gRandomizer->GetCheckObjectFromActor(ACTOR_EN_ELF, gPlayState->sceneNum, TWO_ACTOR_PARAMS(grottoId, index)); + if (location != NULL && location->GetRandomizerCheck() != RC_UNKNOWN_CHECK) { + GetItemEntry item = Rando::Context::GetInstance()->GetFinalGIEntry(location->GetRandomizerCheck(), true, GI_FAIRY); + newFairy->sohFairyIdentity = { static_cast(location->GetCollectionCheck().flag), item }; + newFairy->actor.draw = (ActorFunc)FairyDrawRandomizedItem; + } + } + *should = false; + } } void FairyOnActorInitHandler(void* actorRef) { - EnElf* enElf = static_cast(actorRef); - enElf->sohFairyIdentity = { RAND_INF_MAX, GET_ITEM_NONE }; + EnElf* enElf = static_cast(actorRef); + enElf->sohFairyIdentity = { RAND_INF_MAX, GET_ITEM_NONE }; } uint32_t onVanillaBehaviorHook = 0; uint32_t onActorInitHook = 0; void FairyRegisterHooks() { - onVanillaBehaviorHook = GameInteractor::Instance->RegisterGameHook(FairyOnVanillaBehaviorHandler); - onActorInitHook = GameInteractor::Instance->RegisterGameHookForID(ACTOR_EN_ELF, FairyOnActorInitHandler); + onVanillaBehaviorHook = GameInteractor::Instance->RegisterGameHook(FairyOnVanillaBehaviorHandler); + onActorInitHook = GameInteractor::Instance->RegisterGameHookForID(ACTOR_EN_ELF, FairyOnActorInitHandler); } void FairyUnregisterHooks() { diff --git a/soh/soh/Enhancements/randomizer/randomizer_grotto.h b/soh/soh/Enhancements/randomizer/randomizer_grotto.h index f124caeefc7..e12aa1482bb 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_grotto.h +++ b/soh/soh/Enhancements/randomizer/randomizer_grotto.h @@ -21,6 +21,9 @@ typedef struct { Vec3f pos; } GrottoReturnInfo; +#ifdef __cplusplus +extern "C" { +#endif void Grotto_InitExitAndLoadLists(void); void Grotto_SetExitOverride(s16 originalIndex, s16 overrideIndex); void Grotto_SetLoadOverride(s16 originalIndex, s16 overrideIndex); @@ -32,5 +35,8 @@ void Grotto_ForceRegularVoidOut(void); void Grotto_SanitizeEntranceType(void); s16 Grotto_GetRenamedGrottoIndexFromOriginal(s8 content, s8 scene); s8 Grotto_CurrentGrotto(); +#ifdef __cplusplus +}; +#endif #endif //_RANDO_GROTTO_H_ From d4f2c0d5d4555956cc683c04d52c4a2569f59a01 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 5 Sep 2024 00:54:23 -0700 Subject: [PATCH 066/108] Randomize first set of fairies --- soh/include/z64save.h | 2 +- .../randomizer/3drando/category.hpp | 1 + .../randomizer/3drando/item_pool.cpp | 11 +++++++ .../location_access/locacc_lost_woods.cpp | 12 +++++++- .../Enhancements/randomizer/fairy_shuffle.cpp | 8 +++-- soh/soh/Enhancements/randomizer/location.cpp | 9 ++++++ soh/soh/Enhancements/randomizer/location.h | 4 +++ .../Enhancements/randomizer/location_list.cpp | 29 +++++++++++++++++++ .../Enhancements/randomizer/randomizerTypes.h | 11 +++++++ .../Enhancements/randomizer/randomizer_inf.h | 9 ++++++ soh/soh/Enhancements/randomizer/static_data.h | 1 + 11 files changed, 92 insertions(+), 5 deletions(-) diff --git a/soh/include/z64save.h b/soh/include/z64save.h index 617c2acf526..64fe0b07f90 100644 --- a/soh/include/z64save.h +++ b/soh/include/z64save.h @@ -283,7 +283,7 @@ typedef struct { // #endregion // #region SOH [Randomizer] // Upstream TODO: Move these to their own struct or name to more obviously specific to Randomizer - /* */ u16 randomizerInf[17]; + /* */ u16 randomizerInf[(RAND_INF_MAX + 15) / 16]; /* */ u8 mqDungeonCount; /* */ u16 adultTradeItems; /* */ u8 triforcePiecesCollected; diff --git a/soh/soh/Enhancements/randomizer/3drando/category.hpp b/soh/soh/Enhancements/randomizer/3drando/category.hpp index 22522789cfd..69498004f70 100644 --- a/soh/soh/Enhancements/randomizer/3drando/category.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/category.hpp @@ -19,6 +19,7 @@ enum class Category { cVanillaCompass, cAdultTrade, cBeehive, + cFairy, }; enum class OptionCategory { diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index f7250e17ddf..3496965feaa 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -1165,6 +1165,17 @@ void GenerateItemPool() { AddItemsToPool(ItemPool, shopsanityRupees); //Shopsanity gets extra large rupees } + //Fairysanity + if (ctx->GetOption(RSK_SHUFFLE_FAIRIES)) { + for (auto rc : Rando::StaticData::overworldFairyLocations) { + AddItemToMainPool(GetJunkItem()); + } + } else { + for (auto rc : Rando::StaticData::overworldFairyLocations) { + ctx->PlaceItemInLocation(rc, GetJunkItem(), false, true); + } + } + //Scrubsanity if (ctx->GetOption(RSK_SHUFFLE_SCRUBS).IsNot(RO_SCRUBS_OFF)) { //Deku Tree diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp index 66c08590555..57e873d0fcf 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp @@ -224,7 +224,17 @@ void AreaTable_Init_LostWoods() { areaTable[RR_SFM_FAIRY_GROTTO] = Area("SFM Fairy Grotto", "SFM Fairy Grotto", RA_NONE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->FreeFairies, {[]{return true;}}), - }, {}, { + }, { + //Locations + LOCATION(RC_SFM_FAIRY_GROTTO_FAIRY_1, true), + LOCATION(RC_SFM_FAIRY_GROTTO_FAIRY_2, true), + LOCATION(RC_SFM_FAIRY_GROTTO_FAIRY_3, true), + LOCATION(RC_SFM_FAIRY_GROTTO_FAIRY_4, true), + LOCATION(RC_SFM_FAIRY_GROTTO_FAIRY_5, true), + LOCATION(RC_SFM_FAIRY_GROTTO_FAIRY_6, true), + LOCATION(RC_SFM_FAIRY_GROTTO_FAIRY_7, true), + LOCATION(RC_SFM_FAIRY_GROTTO_FAIRY_8, true), + }, { //Exits Entrance(RR_SACRED_FOREST_MEADOW, {[]{return true;}}), }); diff --git a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp index 38edfb0baca..32bb489445c 100644 --- a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp +++ b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp @@ -10,9 +10,11 @@ void FairyDrawRandomizedItem(EnElf* enElf, PlayState* play) { if (CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MysteriousShuffle"), 0)) { randoGetItem = GET_ITEM_MYSTERY; } - func_8002ED80(&enElf->actor, play, 0); + Matrix_Push(); + Matrix_Scale(37.5, 37.5, 37.5, MTXMODE_APPLY); EnItem00_CustomItemsParticles(&enElf->actor, play, randoGetItem); GetItemEntry_Draw(play, randoGetItem); + Matrix_Pop(); } void FairyOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void* optionalArg) { @@ -22,8 +24,8 @@ void FairyOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void* opt for (s16 index = 0; index < 8; index++) { EnElf* newFairy = (EnElf*)Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_ELF, enElf->actor.world.pos.x, enElf->actor.world.pos.y - 30.0f, enElf->actor.world.pos.z, 0, 0, 0, FAIRY_HEAL, true); - //EnElf* newFairy = newActor); - Rando::Location* location = OTRGlobals::Instance->gRandomizer->GetCheckObjectFromActor(ACTOR_EN_ELF, gPlayState->sceneNum, TWO_ACTOR_PARAMS(grottoId, index)); + int32_t params = (grottoId << 8) | index; + Rando::Location* location = OTRGlobals::Instance->gRandomizer->GetCheckObjectFromActor(ACTOR_EN_ELF, gPlayState->sceneNum, params); if (location != NULL && location->GetRandomizerCheck() != RC_UNKNOWN_CHECK) { GetItemEntry item = Rando::Context::GetInstance()->GetFinalGIEntry(location->GetRandomizerCheck(), true, GI_FAIRY); newFairy->sohFairyIdentity = { static_cast(location->GetCollectionCheck().flag), item }; diff --git a/soh/soh/Enhancements/randomizer/location.cpp b/soh/soh/Enhancements/randomizer/location.cpp index ddc9f7fc208..0d26311dac5 100644 --- a/soh/soh/Enhancements/randomizer/location.cpp +++ b/soh/soh/Enhancements/randomizer/location.cpp @@ -371,6 +371,15 @@ Rando::Location Rando::Location::Reward(RandomizerCheck rc, RandomizerCheckQuest isVanillaCompletion_, collectionCheck, collectionCheckGroup}; } +Rando::Location Rando::Location::Fairy(RandomizerCheck rc, RandomizerCheckQuest quest_, + RandomizerCheckArea area_, uint8_t scene_, + int32_t actorParams_, RandomizerInf flag_, std::string&& shortName_, + const RandomizerHintTextKey hintKey, SpoilerCollectionCheckGroup collectionCheckGroup) { + return {rc, quest_, RCTYPE_FAIRY, area_, LocationType::Base, ACTOR_EN_ELF, scene_, actorParams_, flag_, + std::move(shortName_), hintKey, RG_NONE, { Category::cFairy }, false, + SpoilerCollectionCheck(SPOILER_CHK_RANDOMIZER_INF, scene_, flag_), collectionCheckGroup}; +} + Rando::Location Rando::Location::OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, diff --git a/soh/soh/Enhancements/randomizer/location.h b/soh/soh/Enhancements/randomizer/location.h index bd7f69a8bbc..9fdb4f1a82b 100644 --- a/soh/soh/Enhancements/randomizer/location.h +++ b/soh/soh/Enhancements/randomizer/location.h @@ -350,6 +350,10 @@ class Location { std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup = GROUP_NO_GROUP, bool isVanillaCompletion_ = false); + static Location + Fairy(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, uint8_t scene_, int32_t actorParams_, + RandomizerInf flag, std::string&& shortName_, RandomizerHintTextKey hintKey, SpoilerCollectionCheckGroup collectionCheckGroup); + static Location OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, std::string&& shortName_, std::string&& spoilerName_, bool isVanillaCompletion_ = false); diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index dd31dae5c9d..4700c01f732 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -504,6 +504,15 @@ std::vector Rando::StaticData::overworldLocations = { RC_LH_GROTTO_BEEHIVE, RC_GV_DEKU_SCRUB_GROTTO_BEEHIVE, RC_COLOSSUS_GROTTO_BEEHIVE, + + RC_SFM_FAIRY_GROTTO_FAIRY_1, + RC_SFM_FAIRY_GROTTO_FAIRY_2, + RC_SFM_FAIRY_GROTTO_FAIRY_3, + RC_SFM_FAIRY_GROTTO_FAIRY_4, + RC_SFM_FAIRY_GROTTO_FAIRY_5, + RC_SFM_FAIRY_GROTTO_FAIRY_6, + RC_SFM_FAIRY_GROTTO_FAIRY_7, + RC_SFM_FAIRY_GROTTO_FAIRY_8, }; std::vector Rando::StaticData::gossipStoneLocations = { @@ -580,6 +589,17 @@ std::vector Rando::StaticData::overworldFishLocations = { RC_ZD_FISH_1, RC_ZD_FISH_2, RC_ZD_FISH_3, RC_ZD_FISH_4, RC_ZD_FISH_5 }; +std::vector Rando::StaticData::overworldFairyLocations = { + RC_SFM_FAIRY_GROTTO_FAIRY_1, + RC_SFM_FAIRY_GROTTO_FAIRY_2, + RC_SFM_FAIRY_GROTTO_FAIRY_3, + RC_SFM_FAIRY_GROTTO_FAIRY_4, + RC_SFM_FAIRY_GROTTO_FAIRY_5, + RC_SFM_FAIRY_GROTTO_FAIRY_6, + RC_SFM_FAIRY_GROTTO_FAIRY_7, + RC_SFM_FAIRY_GROTTO_FAIRY_8, +}; + typedef enum { DUNGEON_DEKU_TREE = 0, DUNGEON_DODONGOS_CAVERN, @@ -1513,6 +1533,15 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_ZD_FISH_4] = Location::Base(RC_ZD_FISH_4, RCQUEST_BOTH, RCTYPE_FISH, RCAREA_ZORAS_DOMAIN, ACTOR_EN_FISH, SCENE_ZORAS_DOMAIN, -1 ^ 3, 0x00, "Fish 4", RHT_ZD_FISH, RG_FISH, { Category::cFish }, SpoilerCollectionCheck::Fish(0xFF, SCENE_ZORAS_DOMAIN), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); locationTable[RC_ZD_FISH_5] = Location::Base(RC_ZD_FISH_5, RCQUEST_BOTH, RCTYPE_FISH, RCAREA_ZORAS_DOMAIN, ACTOR_EN_FISH, SCENE_ZORAS_DOMAIN, -1 ^ 4, 0x00, "Fish 5", RHT_ZD_FISH, RG_FISH, { Category::cFish }, SpoilerCollectionCheck::Fish(0xFF, SCENE_ZORAS_DOMAIN), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + // Fairies + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1800, RAND_INF_SFM_FAIRY_GROTTO_FAIRY_1, "Grotto Fairy 1", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1801, RAND_INF_SFM_FAIRY_GROTTO_FAIRY_2, "Grotto Fairy 2", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1802, RAND_INF_SFM_FAIRY_GROTTO_FAIRY_3, "Grotto Fairy 3", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1803, RAND_INF_SFM_FAIRY_GROTTO_FAIRY_4, "Grotto Fairy 4", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1804, RAND_INF_SFM_FAIRY_GROTTO_FAIRY_5, "Grotto Fairy 5", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1805, RAND_INF_SFM_FAIRY_GROTTO_FAIRY_6, "Grotto Fairy 6", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1806, RAND_INF_SFM_FAIRY_GROTTO_FAIRY_7, "Grotto Fairy 7", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1807, RAND_INF_SFM_FAIRY_GROTTO_FAIRY_8, "Grotto Fairy 8", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); // Gossip Stones locationTable[RC_DMC_GOSSIP_STONE] = Location::HintStone(RC_DMC_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 14341, 0x05, "Gossip Stone", {}); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index eb2d8e73f8e..45dbe146509 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -274,6 +274,7 @@ typedef enum { RCTYPE_OCARINA, // Ocarina locations RCTYPE_BEEHIVE, // Beehives RCTYPE_FISH, + RCTYPE_FAIRY, // Fairies } RandomizerCheckType; typedef enum { RCQUEST_VANILLA, RCQUEST_MQ, RCQUEST_BOTH } RandomizerCheckQuest; @@ -1651,6 +1652,14 @@ typedef enum { RC_ZD_FISH_3, RC_ZD_FISH_4, RC_ZD_FISH_5, + RC_SFM_FAIRY_GROTTO_FAIRY_1, + RC_SFM_FAIRY_GROTTO_FAIRY_2, + RC_SFM_FAIRY_GROTTO_FAIRY_3, + RC_SFM_FAIRY_GROTTO_FAIRY_4, + RC_SFM_FAIRY_GROTTO_FAIRY_5, + RC_SFM_FAIRY_GROTTO_FAIRY_6, + RC_SFM_FAIRY_GROTTO_FAIRY_7, + RC_SFM_FAIRY_GROTTO_FAIRY_8, RC_MAX } RandomizerCheck; @@ -3636,6 +3645,8 @@ typedef enum { RHT_YOUR_POCKET, RHT_DUNGEON_ORDINARY, RHT_DUNGEON_MASTERFUL, + // Fairy Shuffle + RHT_SFM_FAIRY_GROTTO_FAIRY, RHT_MAX } RandomizerHintTextKey; diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index 20aab303209..f56d19355c2 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -306,6 +306,15 @@ typedef enum { RAND_INF_CHILD_TRADES_MASK_ZORA, RAND_INF_CHILD_TRADES_MASK_GERUDO, RAND_INF_CHILD_TRADES_MASK_TRUTH, + + RAND_INF_SFM_FAIRY_GROTTO_FAIRY_1, + RAND_INF_SFM_FAIRY_GROTTO_FAIRY_2, + RAND_INF_SFM_FAIRY_GROTTO_FAIRY_3, + RAND_INF_SFM_FAIRY_GROTTO_FAIRY_4, + RAND_INF_SFM_FAIRY_GROTTO_FAIRY_5, + RAND_INF_SFM_FAIRY_GROTTO_FAIRY_6, + RAND_INF_SFM_FAIRY_GROTTO_FAIRY_7, + RAND_INF_SFM_FAIRY_GROTTO_FAIRY_8, // If you add anything to this list, you need to update the size of randomizerInf in z64save.h to be ceil(RAND_INF_MAX / 16) RAND_INF_MAX, diff --git a/soh/soh/Enhancements/randomizer/static_data.h b/soh/soh/Enhancements/randomizer/static_data.h index 44e1ff1ff84..919ce3f57d8 100644 --- a/soh/soh/Enhancements/randomizer/static_data.h +++ b/soh/soh/Enhancements/randomizer/static_data.h @@ -43,6 +43,7 @@ class StaticData { static std::vector staticHintLocations; static std::vector pondFishLocations; static std::vector overworldFishLocations; + static std::vector overworldFairyLocations; static std::array, 17> randomizerFishingPondFish; static std::unordered_map randomizerGrottoFishMap; static std::vector oldVerHintOrder; From 8d13e1d754eaa3250c93c629ab206cbdd89f270e Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 5 Sep 2024 01:09:07 -0700 Subject: [PATCH 067/108] Make randomized fairies collectible --- .../game-interactor/GameInteractor.h | 2 ++ .../Enhancements/randomizer/fairy_shuffle.cpp | 8 +++++++- soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c | 20 ++++++++++--------- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.h b/soh/soh/Enhancements/game-interactor/GameInteractor.h index cc79a9a5208..5c6cecc90d1 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor.h @@ -416,6 +416,8 @@ typedef enum { // Opt: *EnElf VB_SPAWN_FAIRY_GROUP, + // Opt: *EnElf + VB_FAIRY_HEAL, } GIVanillaBehavior; #ifdef __cplusplus diff --git a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp index 32bb489445c..44dbc58ef3d 100644 --- a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp +++ b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp @@ -26,13 +26,19 @@ void FairyOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void* opt enElf->actor.world.pos.y - 30.0f, enElf->actor.world.pos.z, 0, 0, 0, FAIRY_HEAL, true); int32_t params = (grottoId << 8) | index; Rando::Location* location = OTRGlobals::Instance->gRandomizer->GetCheckObjectFromActor(ACTOR_EN_ELF, gPlayState->sceneNum, params); - if (location != NULL && location->GetRandomizerCheck() != RC_UNKNOWN_CHECK) { + if (location != NULL && location->GetRandomizerCheck() != RC_UNKNOWN_CHECK && !Flags_GetRandomizerInf(location->GetCollectionCheck().flag)) { GetItemEntry item = Rando::Context::GetInstance()->GetFinalGIEntry(location->GetRandomizerCheck(), true, GI_FAIRY); newFairy->sohFairyIdentity = { static_cast(location->GetCollectionCheck().flag), item }; newFairy->actor.draw = (ActorFunc)FairyDrawRandomizedItem; } } *should = false; + } else if (id == VB_FAIRY_HEAL) { + EnElf* enElf = static_cast(optionalArg); + if (enElf->sohFairyIdentity.randomizerInf != RAND_INF_MAX) { + Flags_SetRandomizerInf(enElf->sohFairyIdentity.randomizerInf); + *should = false; + } } } diff --git a/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c b/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c index af16aa7b53e..32d1196f8a1 100644 --- a/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c +++ b/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c @@ -634,21 +634,23 @@ void func_80A0329C(EnElf* this, PlayState* play) { if ((heightDiff > 0.0f) && (heightDiff < 60.0f)) { if (!func_80A01F90(&this->actor.world.pos, &refActor->actor.world.pos, 10.0f)) { - if (CVarGetInteger(CVAR_ENHANCEMENT("FairyEffect"), 0) && !(this->fairyFlags & FAIRY_FLAG_BIG)) - { - if (CVarGetInteger(CVAR_ENHANCEMENT("FairyPercentRestore"), 0)) + if (GameInteractor_Should(VB_FAIRY_HEAL, true, this)) { + if (CVarGetInteger(CVAR_ENHANCEMENT("FairyEffect"), 0) && !(this->fairyFlags & FAIRY_FLAG_BIG)) { - Health_ChangeBy(play, (gSaveContext.healthCapacity * CVarGetInteger(CVAR_ENHANCEMENT("FairyHealth"), 100) / 100 + 15) / 16 * 16); + if (CVarGetInteger(CVAR_ENHANCEMENT("FairyPercentRestore"), 0)) + { + Health_ChangeBy(play, (gSaveContext.healthCapacity * CVarGetInteger(CVAR_ENHANCEMENT("FairyHealth"), 100) / 100 + 15) / 16 * 16); + } + else + { + Health_ChangeBy(play, CVarGetInteger(CVAR_ENHANCEMENT("FairyHealth"), 8) * 16); + } } else { - Health_ChangeBy(play, CVarGetInteger(CVAR_ENHANCEMENT("FairyHealth"), 8) * 16); + Health_ChangeBy(play, 128); } } - else - { - Health_ChangeBy(play, 128); - } if (this->fairyFlags & FAIRY_FLAG_BIG) { Magic_Fill(play); } From 3c9bc5f907d229e35780b349abef8f3b344bc76b Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 5 Sep 2024 01:26:38 -0700 Subject: [PATCH 068/108] VBify fairy healing customization --- soh/soh/Enhancements/mods.cpp | 24 +++++++++++++++++++ soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c | 16 +------------ 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index 8b3adca0f35..36b1a559420 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -34,6 +34,7 @@ #include "src/overlays/actors/ovl_Door_Shutter/z_door_shutter.h" #include "src/overlays/actors/ovl_Door_Gerudo/z_door_gerudo.h" #include "src/overlays/actors/ovl_En_Door/z_en_door.h" +#include "src/overlays/actors/ovl_En_Elf/z_en_elf.h" #include "objects/object_link_boy/object_link_boy.h" #include "objects/object_link_child/object_link_child.h" @@ -1778,6 +1779,28 @@ void RegisterSkeletonKey() { }); } +#define FAIRY_FLAG_BIG (1 << 9) +void RegisterFairyCustomization() { + GameInteractor::Instance->RegisterGameHookForID(VB_FAIRY_HEAL, [](GIVanillaBehavior id, bool* should, void* refActor) { + EnElf* enElf = static_cast(refActor); + // Don't trigger if fairy is shuffled + if (!IS_RANDO || !OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_FAIRIES) || enElf->sohFairyIdentity.randomizerInf == RAND_INF_MAX) { + if (CVarGetInteger(CVAR_ENHANCEMENT("FairyEffect"), 0) && !(enElf->fairyFlags & FAIRY_FLAG_BIG)) + { + if (CVarGetInteger(CVAR_ENHANCEMENT("FairyPercentRestore"), 0)) + { + Health_ChangeBy(gPlayState, (gSaveContext.healthCapacity * CVarGetInteger(CVAR_ENHANCEMENT("FairyHealth"), 100) / 100 + 15) / 16 * 16); + } + else + { + Health_ChangeBy(gPlayState, CVarGetInteger(CVAR_ENHANCEMENT("FairyHealth"), 8) * 16); + } + *should = false; + } + } + }); +} + void InitMods() { RandomizerRegisterHooks(); TimeSaverRegisterHooks(); @@ -1828,4 +1851,5 @@ void InitMods() { RegisterHurtContainerModeHandler(); RegisterPauseMenuHooks(); RegisterSkeletonKey(); + RegisterFairyCustomization(); } diff --git a/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c b/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c index 32d1196f8a1..9574b60e6ee 100644 --- a/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c +++ b/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c @@ -635,21 +635,7 @@ void func_80A0329C(EnElf* this, PlayState* play) { if ((heightDiff > 0.0f) && (heightDiff < 60.0f)) { if (!func_80A01F90(&this->actor.world.pos, &refActor->actor.world.pos, 10.0f)) { if (GameInteractor_Should(VB_FAIRY_HEAL, true, this)) { - if (CVarGetInteger(CVAR_ENHANCEMENT("FairyEffect"), 0) && !(this->fairyFlags & FAIRY_FLAG_BIG)) - { - if (CVarGetInteger(CVAR_ENHANCEMENT("FairyPercentRestore"), 0)) - { - Health_ChangeBy(play, (gSaveContext.healthCapacity * CVarGetInteger(CVAR_ENHANCEMENT("FairyHealth"), 100) / 100 + 15) / 16 * 16); - } - else - { - Health_ChangeBy(play, CVarGetInteger(CVAR_ENHANCEMENT("FairyHealth"), 8) * 16); - } - } - else - { - Health_ChangeBy(play, 128); - } + Health_ChangeBy(play, 128); } if (this->fairyFlags & FAIRY_FLAG_BIG) { Magic_Fill(play); From 0e5c64b4cfb371e38e8202fd42d83130be40adc4 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 5 Sep 2024 16:20:09 -0700 Subject: [PATCH 069/108] Add remaining grotto fairies --- .../location_access/locacc_gerudo_valley.cpp | 12 ++- .../location_access/locacc_hyrule_field.cpp | 12 ++- .../location_access/locacc_zoras_domain.cpp | 24 ++++- .../Enhancements/randomizer/location_list.cpp | 96 +++++++++++++++++++ .../Enhancements/randomizer/randomizerTypes.h | 36 +++++++ .../Enhancements/randomizer/randomizer_inf.h | 32 +++++++ 6 files changed, 208 insertions(+), 4 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp index 5913e2d3b37..a21cef7c2fb 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp @@ -130,7 +130,17 @@ void AreaTable_Init_GerudoValley() { areaTable[RR_GF_STORMS_GROTTO] = Area("GF Storms Grotto", "GF Storms Grotto", RA_NONE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->FreeFairies, {[]{return true;}}), - }, {}, { + }, { + //Locations + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_1, true), + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_2, true), + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_3, true), + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_4, true), + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_5, true), + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_6, true), + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_7, true), + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_8, true), + }, { //Exits Entrance(RR_GERUDO_FORTRESS, {[]{return true;}}), }); diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp index 860b90e8b80..2d6de46924f 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp @@ -88,7 +88,17 @@ void AreaTable_Init_HyruleField() { areaTable[RR_HF_FAIRY_GROTTO] = Area("HF Fairy Grotto", "HF Fairy Grotto", RA_NONE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->FreeFairies, {[]{return true;}}), - }, {}, { + }, { + //Locations + LOCATION(RC_HF_FAIRY_GROTTO_FAIRY_1, true), + LOCATION(RC_HF_FAIRY_GROTTO_FAIRY_2, true), + LOCATION(RC_HF_FAIRY_GROTTO_FAIRY_3, true), + LOCATION(RC_HF_FAIRY_GROTTO_FAIRY_4, true), + LOCATION(RC_HF_FAIRY_GROTTO_FAIRY_5, true), + LOCATION(RC_HF_FAIRY_GROTTO_FAIRY_6, true), + LOCATION(RC_HF_FAIRY_GROTTO_FAIRY_7, true), + LOCATION(RC_HF_FAIRY_GROTTO_FAIRY_8, true), + }, { //Exits Entrance(RR_HYRULE_FIELD, {[]{return true;}}), }); diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp index 49a76414718..a9be45b3a82 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp @@ -67,7 +67,17 @@ void AreaTable_Init_ZorasDomain() { areaTable[RR_ZR_FAIRY_GROTTO] = Area("ZR Fairy Grotto", "ZR Fairy Grotto", RA_NONE, NO_DAY_NIGHT_CYCLE, { //Event EventAccess(&logic->FreeFairies, {[]{return true;}}), - }, {}, { + }, { + //Locations + LOCATION(RC_ZR_FAIRY_GROTTO_FAIRY_1, true), + LOCATION(RC_ZR_FAIRY_GROTTO_FAIRY_2, true), + LOCATION(RC_ZR_FAIRY_GROTTO_FAIRY_3, true), + LOCATION(RC_ZR_FAIRY_GROTTO_FAIRY_4, true), + LOCATION(RC_ZR_FAIRY_GROTTO_FAIRY_5, true), + LOCATION(RC_ZR_FAIRY_GROTTO_FAIRY_6, true), + LOCATION(RC_ZR_FAIRY_GROTTO_FAIRY_7, true), + LOCATION(RC_ZR_FAIRY_GROTTO_FAIRY_8, true), + }, { //Exits Entrance(RR_ZORAS_RIVER, {[]{return true;}}), }); @@ -142,7 +152,17 @@ void AreaTable_Init_ZorasDomain() { areaTable[RR_ZD_STORMS_GROTTO] = Area("ZD Storms Grotto", "ZD Storms Grotto", RA_NONE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->FreeFairies, {[]{return true;}}), - }, {}, { + }, { + //Locations + LOCATION(RC_ZD_FAIRY_GROTTO_FAIRY_1, true), + LOCATION(RC_ZD_FAIRY_GROTTO_FAIRY_2, true), + LOCATION(RC_ZD_FAIRY_GROTTO_FAIRY_3, true), + LOCATION(RC_ZD_FAIRY_GROTTO_FAIRY_4, true), + LOCATION(RC_ZD_FAIRY_GROTTO_FAIRY_5, true), + LOCATION(RC_ZD_FAIRY_GROTTO_FAIRY_6, true), + LOCATION(RC_ZD_FAIRY_GROTTO_FAIRY_7, true), + LOCATION(RC_ZD_FAIRY_GROTTO_FAIRY_8, true), + }, { //Exits Entrance(RR_ZORAS_DOMAIN, {[]{return true;}}), }); diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 4700c01f732..5aef2eff27f 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -513,6 +513,38 @@ std::vector Rando::StaticData::overworldLocations = { RC_SFM_FAIRY_GROTTO_FAIRY_6, RC_SFM_FAIRY_GROTTO_FAIRY_7, RC_SFM_FAIRY_GROTTO_FAIRY_8, + RC_ZR_FAIRY_GROTTO_FAIRY_1, + RC_ZR_FAIRY_GROTTO_FAIRY_2, + RC_ZR_FAIRY_GROTTO_FAIRY_3, + RC_ZR_FAIRY_GROTTO_FAIRY_4, + RC_ZR_FAIRY_GROTTO_FAIRY_5, + RC_ZR_FAIRY_GROTTO_FAIRY_6, + RC_ZR_FAIRY_GROTTO_FAIRY_7, + RC_ZR_FAIRY_GROTTO_FAIRY_8, + RC_HF_FAIRY_GROTTO_FAIRY_1, + RC_HF_FAIRY_GROTTO_FAIRY_2, + RC_HF_FAIRY_GROTTO_FAIRY_3, + RC_HF_FAIRY_GROTTO_FAIRY_4, + RC_HF_FAIRY_GROTTO_FAIRY_5, + RC_HF_FAIRY_GROTTO_FAIRY_6, + RC_HF_FAIRY_GROTTO_FAIRY_7, + RC_HF_FAIRY_GROTTO_FAIRY_8, + RC_ZD_FAIRY_GROTTO_FAIRY_1, + RC_ZD_FAIRY_GROTTO_FAIRY_2, + RC_ZD_FAIRY_GROTTO_FAIRY_3, + RC_ZD_FAIRY_GROTTO_FAIRY_4, + RC_ZD_FAIRY_GROTTO_FAIRY_5, + RC_ZD_FAIRY_GROTTO_FAIRY_6, + RC_ZD_FAIRY_GROTTO_FAIRY_7, + RC_ZD_FAIRY_GROTTO_FAIRY_8, + RC_GF_FAIRY_GROTTO_FAIRY_1, + RC_GF_FAIRY_GROTTO_FAIRY_2, + RC_GF_FAIRY_GROTTO_FAIRY_3, + RC_GF_FAIRY_GROTTO_FAIRY_4, + RC_GF_FAIRY_GROTTO_FAIRY_5, + RC_GF_FAIRY_GROTTO_FAIRY_6, + RC_GF_FAIRY_GROTTO_FAIRY_7, + RC_GF_FAIRY_GROTTO_FAIRY_8, }; std::vector Rando::StaticData::gossipStoneLocations = { @@ -598,6 +630,38 @@ std::vector Rando::StaticData::overworldFairyLocations = { RC_SFM_FAIRY_GROTTO_FAIRY_6, RC_SFM_FAIRY_GROTTO_FAIRY_7, RC_SFM_FAIRY_GROTTO_FAIRY_8, + RC_ZR_FAIRY_GROTTO_FAIRY_1, + RC_ZR_FAIRY_GROTTO_FAIRY_2, + RC_ZR_FAIRY_GROTTO_FAIRY_3, + RC_ZR_FAIRY_GROTTO_FAIRY_4, + RC_ZR_FAIRY_GROTTO_FAIRY_5, + RC_ZR_FAIRY_GROTTO_FAIRY_6, + RC_ZR_FAIRY_GROTTO_FAIRY_7, + RC_ZR_FAIRY_GROTTO_FAIRY_8, + RC_HF_FAIRY_GROTTO_FAIRY_1, + RC_HF_FAIRY_GROTTO_FAIRY_2, + RC_HF_FAIRY_GROTTO_FAIRY_3, + RC_HF_FAIRY_GROTTO_FAIRY_4, + RC_HF_FAIRY_GROTTO_FAIRY_5, + RC_HF_FAIRY_GROTTO_FAIRY_6, + RC_HF_FAIRY_GROTTO_FAIRY_7, + RC_HF_FAIRY_GROTTO_FAIRY_8, + RC_ZD_FAIRY_GROTTO_FAIRY_1, + RC_ZD_FAIRY_GROTTO_FAIRY_2, + RC_ZD_FAIRY_GROTTO_FAIRY_3, + RC_ZD_FAIRY_GROTTO_FAIRY_4, + RC_ZD_FAIRY_GROTTO_FAIRY_5, + RC_ZD_FAIRY_GROTTO_FAIRY_6, + RC_ZD_FAIRY_GROTTO_FAIRY_7, + RC_ZD_FAIRY_GROTTO_FAIRY_8, + RC_GF_FAIRY_GROTTO_FAIRY_1, + RC_GF_FAIRY_GROTTO_FAIRY_2, + RC_GF_FAIRY_GROTTO_FAIRY_3, + RC_GF_FAIRY_GROTTO_FAIRY_4, + RC_GF_FAIRY_GROTTO_FAIRY_5, + RC_GF_FAIRY_GROTTO_FAIRY_6, + RC_GF_FAIRY_GROTTO_FAIRY_7, + RC_GF_FAIRY_GROTTO_FAIRY_8, }; typedef enum { @@ -1542,6 +1606,38 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1805, RAND_INF_SFM_FAIRY_GROTTO_FAIRY_6, "Grotto Fairy 6", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1806, RAND_INF_SFM_FAIRY_GROTTO_FAIRY_7, "Grotto Fairy 7", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1807, RAND_INF_SFM_FAIRY_GROTTO_FAIRY_8, "Grotto Fairy 8", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0300, RAND_INF_ZR_FAIRY_GROTTO_FAIRY_1, "Grotto Fairy 1", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0301, RAND_INF_ZR_FAIRY_GROTTO_FAIRY_2, "Grotto Fairy 2", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0302, RAND_INF_ZR_FAIRY_GROTTO_FAIRY_3, "Grotto Fairy 3", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0303, RAND_INF_ZR_FAIRY_GROTTO_FAIRY_4, "Grotto Fairy 4", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0304, RAND_INF_ZR_FAIRY_GROTTO_FAIRY_5, "Grotto Fairy 5", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0305, RAND_INF_ZR_FAIRY_GROTTO_FAIRY_6, "Grotto Fairy 6", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0306, RAND_INF_ZR_FAIRY_GROTTO_FAIRY_7, "Grotto Fairy 7", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0307, RAND_INF_ZR_FAIRY_GROTTO_FAIRY_8, "Grotto Fairy 8", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F00, RAND_INF_HF_FAIRY_GROTTO_FAIRY_1, "Grotto Fairy 1", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F01, RAND_INF_HF_FAIRY_GROTTO_FAIRY_2, "Grotto Fairy 2", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F02, RAND_INF_HF_FAIRY_GROTTO_FAIRY_3, "Grotto Fairy 3", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F03, RAND_INF_HF_FAIRY_GROTTO_FAIRY_4, "Grotto Fairy 4", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F04, RAND_INF_HF_FAIRY_GROTTO_FAIRY_5, "Grotto Fairy 5", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F05, RAND_INF_HF_FAIRY_GROTTO_FAIRY_6, "Grotto Fairy 6", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F06, RAND_INF_HF_FAIRY_GROTTO_FAIRY_7, "Grotto Fairy 7", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F07, RAND_INF_HF_FAIRY_GROTTO_FAIRY_8, "Grotto Fairy 8", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C00, RAND_INF_ZD_FAIRY_GROTTO_FAIRY_1, "Grotto Fairy 1", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C01, RAND_INF_ZD_FAIRY_GROTTO_FAIRY_2, "Grotto Fairy 2", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C02, RAND_INF_ZD_FAIRY_GROTTO_FAIRY_3, "Grotto Fairy 3", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C03, RAND_INF_ZD_FAIRY_GROTTO_FAIRY_4, "Grotto Fairy 4", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C04, RAND_INF_ZD_FAIRY_GROTTO_FAIRY_5, "Grotto Fairy 5", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C05, RAND_INF_ZD_FAIRY_GROTTO_FAIRY_6, "Grotto Fairy 6", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C06, RAND_INF_ZD_FAIRY_GROTTO_FAIRY_7, "Grotto Fairy 7", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C07, RAND_INF_ZD_FAIRY_GROTTO_FAIRY_8, "Grotto Fairy 8", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D00, RAND_INF_GF_FAIRY_GROTTO_FAIRY_1, "Grotto Fairy 1", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D01, RAND_INF_GF_FAIRY_GROTTO_FAIRY_2, "Grotto Fairy 2", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D02, RAND_INF_GF_FAIRY_GROTTO_FAIRY_3, "Grotto Fairy 3", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D03, RAND_INF_GF_FAIRY_GROTTO_FAIRY_4, "Grotto Fairy 4", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D04, RAND_INF_GF_FAIRY_GROTTO_FAIRY_5, "Grotto Fairy 5", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D05, RAND_INF_GF_FAIRY_GROTTO_FAIRY_6, "Grotto Fairy 6", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D06, RAND_INF_GF_FAIRY_GROTTO_FAIRY_7, "Grotto Fairy 7", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D07, RAND_INF_GF_FAIRY_GROTTO_FAIRY_8, "Grotto Fairy 8", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); // Gossip Stones locationTable[RC_DMC_GOSSIP_STONE] = Location::HintStone(RC_DMC_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 14341, 0x05, "Gossip Stone", {}); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 45dbe146509..87e378617bd 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1660,6 +1660,38 @@ typedef enum { RC_SFM_FAIRY_GROTTO_FAIRY_6, RC_SFM_FAIRY_GROTTO_FAIRY_7, RC_SFM_FAIRY_GROTTO_FAIRY_8, + RC_ZR_FAIRY_GROTTO_FAIRY_1, + RC_ZR_FAIRY_GROTTO_FAIRY_2, + RC_ZR_FAIRY_GROTTO_FAIRY_3, + RC_ZR_FAIRY_GROTTO_FAIRY_4, + RC_ZR_FAIRY_GROTTO_FAIRY_5, + RC_ZR_FAIRY_GROTTO_FAIRY_6, + RC_ZR_FAIRY_GROTTO_FAIRY_7, + RC_ZR_FAIRY_GROTTO_FAIRY_8, + RC_HF_FAIRY_GROTTO_FAIRY_1, + RC_HF_FAIRY_GROTTO_FAIRY_2, + RC_HF_FAIRY_GROTTO_FAIRY_3, + RC_HF_FAIRY_GROTTO_FAIRY_4, + RC_HF_FAIRY_GROTTO_FAIRY_5, + RC_HF_FAIRY_GROTTO_FAIRY_6, + RC_HF_FAIRY_GROTTO_FAIRY_7, + RC_HF_FAIRY_GROTTO_FAIRY_8, + RC_ZD_FAIRY_GROTTO_FAIRY_1, + RC_ZD_FAIRY_GROTTO_FAIRY_2, + RC_ZD_FAIRY_GROTTO_FAIRY_3, + RC_ZD_FAIRY_GROTTO_FAIRY_4, + RC_ZD_FAIRY_GROTTO_FAIRY_5, + RC_ZD_FAIRY_GROTTO_FAIRY_6, + RC_ZD_FAIRY_GROTTO_FAIRY_7, + RC_ZD_FAIRY_GROTTO_FAIRY_8, + RC_GF_FAIRY_GROTTO_FAIRY_1, + RC_GF_FAIRY_GROTTO_FAIRY_2, + RC_GF_FAIRY_GROTTO_FAIRY_3, + RC_GF_FAIRY_GROTTO_FAIRY_4, + RC_GF_FAIRY_GROTTO_FAIRY_5, + RC_GF_FAIRY_GROTTO_FAIRY_6, + RC_GF_FAIRY_GROTTO_FAIRY_7, + RC_GF_FAIRY_GROTTO_FAIRY_8, RC_MAX } RandomizerCheck; @@ -3647,6 +3679,10 @@ typedef enum { RHT_DUNGEON_MASTERFUL, // Fairy Shuffle RHT_SFM_FAIRY_GROTTO_FAIRY, + RHT_ZR_FAIRY_GROTTO_FAIRY, + RHT_HF_FAIRY_GROTTO_FAIRY, + RHT_ZD_FAIRY_GROTTO_FAIRY, + RHT_GF_FAIRY_GROTTO_FAIRY, RHT_MAX } RandomizerHintTextKey; diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index f56d19355c2..c778b7f53d4 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -315,6 +315,38 @@ typedef enum { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_6, RAND_INF_SFM_FAIRY_GROTTO_FAIRY_7, RAND_INF_SFM_FAIRY_GROTTO_FAIRY_8, + RAND_INF_ZR_FAIRY_GROTTO_FAIRY_1, + RAND_INF_ZR_FAIRY_GROTTO_FAIRY_2, + RAND_INF_ZR_FAIRY_GROTTO_FAIRY_3, + RAND_INF_ZR_FAIRY_GROTTO_FAIRY_4, + RAND_INF_ZR_FAIRY_GROTTO_FAIRY_5, + RAND_INF_ZR_FAIRY_GROTTO_FAIRY_6, + RAND_INF_ZR_FAIRY_GROTTO_FAIRY_7, + RAND_INF_ZR_FAIRY_GROTTO_FAIRY_8, + RAND_INF_HF_FAIRY_GROTTO_FAIRY_1, + RAND_INF_HF_FAIRY_GROTTO_FAIRY_2, + RAND_INF_HF_FAIRY_GROTTO_FAIRY_3, + RAND_INF_HF_FAIRY_GROTTO_FAIRY_4, + RAND_INF_HF_FAIRY_GROTTO_FAIRY_5, + RAND_INF_HF_FAIRY_GROTTO_FAIRY_6, + RAND_INF_HF_FAIRY_GROTTO_FAIRY_7, + RAND_INF_HF_FAIRY_GROTTO_FAIRY_8, + RAND_INF_ZD_FAIRY_GROTTO_FAIRY_1, + RAND_INF_ZD_FAIRY_GROTTO_FAIRY_2, + RAND_INF_ZD_FAIRY_GROTTO_FAIRY_3, + RAND_INF_ZD_FAIRY_GROTTO_FAIRY_4, + RAND_INF_ZD_FAIRY_GROTTO_FAIRY_5, + RAND_INF_ZD_FAIRY_GROTTO_FAIRY_6, + RAND_INF_ZD_FAIRY_GROTTO_FAIRY_7, + RAND_INF_ZD_FAIRY_GROTTO_FAIRY_8, + RAND_INF_GF_FAIRY_GROTTO_FAIRY_1, + RAND_INF_GF_FAIRY_GROTTO_FAIRY_2, + RAND_INF_GF_FAIRY_GROTTO_FAIRY_3, + RAND_INF_GF_FAIRY_GROTTO_FAIRY_4, + RAND_INF_GF_FAIRY_GROTTO_FAIRY_5, + RAND_INF_GF_FAIRY_GROTTO_FAIRY_6, + RAND_INF_GF_FAIRY_GROTTO_FAIRY_7, + RAND_INF_GF_FAIRY_GROTTO_FAIRY_8, // If you add anything to this list, you need to update the size of randomizerInf in z64save.h to be ceil(RAND_INF_MAX / 16) RAND_INF_MAX, From e1df53148724cc6b76dc2facc513b958cfa7ceff Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 5 Sep 2024 16:51:16 -0700 Subject: [PATCH 070/108] Add remaining fairy group spawns --- .../randomizer/3drando/item_pool.cpp | 23 +++++++++++ .../location_access/locacc_ganons_castle.cpp | 16 ++++++++ .../location_access/locacc_kakariko.cpp | 8 ++++ soh/soh/Enhancements/randomizer/dungeon.cpp | 16 ++++++++ .../Enhancements/randomizer/location_list.cpp | 41 +++++++++++++++++++ .../Enhancements/randomizer/randomizerTypes.h | 26 ++++++++++++ .../Enhancements/randomizer/randomizer_inf.h | 24 +++++++++++ 7 files changed, 154 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index 3496965feaa..5cd08230bf5 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -1170,10 +1170,33 @@ void GenerateItemPool() { for (auto rc : Rando::StaticData::overworldFairyLocations) { AddItemToMainPool(GetJunkItem()); } + // 8 extra for Ganon's Castle + for (int i = 0; i < 8; i++) { + AddItemToMainPool(GetJunkItem()); + } } else { for (auto rc : Rando::StaticData::overworldFairyLocations) { ctx->PlaceItemInLocation(rc, GetJunkItem(), false, true); } + if (ctx->GetDungeon(Rando::GANONS_CASTLE)->IsMQ()) { + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, GetJunkItem(), false, true); + } else { + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_1, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_2, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_3, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_4, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_5, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_6, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_7, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_8, GetJunkItem(), false, true); + } } //Scrubsanity diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp index 05249def11a..2888a4ed1ca 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp @@ -50,6 +50,14 @@ void AreaTable_Init_GanonsCastle() { LOCATION(RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, logic->CanStunDeku), LOCATION(RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT, logic->CanStunDeku), LOCATION(RC_GANONS_CASTLE_DEKU_SCRUB_LEFT, logic->CanStunDeku), + LOCATION(RC_GANONS_CASTLE_SCRUBS_FAIRY_1, true), + LOCATION(RC_GANONS_CASTLE_SCRUBS_FAIRY_2, true), + LOCATION(RC_GANONS_CASTLE_SCRUBS_FAIRY_3, true), + LOCATION(RC_GANONS_CASTLE_SCRUBS_FAIRY_4, true), + LOCATION(RC_GANONS_CASTLE_SCRUBS_FAIRY_5, true), + LOCATION(RC_GANONS_CASTLE_SCRUBS_FAIRY_6, true), + LOCATION(RC_GANONS_CASTLE_SCRUBS_FAIRY_7, true), + LOCATION(RC_GANONS_CASTLE_SCRUBS_FAIRY_8, true), }, {}); areaTable[RR_GANONS_CASTLE_FOREST_TRIAL] = Area("Ganon's Castle Forest Trial", "Ganon's Castle", RA_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { @@ -153,6 +161,14 @@ void AreaTable_Init_GanonsCastle() { LOCATION(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, logic->CanStunDeku), LOCATION(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, logic->CanStunDeku), LOCATION(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, logic->CanStunDeku), + LOCATION(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1, true), + LOCATION(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2, true), + LOCATION(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3, true), + LOCATION(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4, true), + LOCATION(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5, true), + LOCATION(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, true), + LOCATION(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, true), + LOCATION(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, true), }, {}); areaTable[RR_GANONS_CASTLE_MQ_FOREST_TRIAL] = Area("Ganon's Castle MQ Forest Trial", "Ganons Castle", RA_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp index b0452e41938..45fa4a1861c 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp @@ -232,6 +232,14 @@ void AreaTable_Init_Kakariko() { //Locations LOCATION(RC_GRAVEYARD_SHIELD_GRAVE_CHEST, true), //Free Fairies + LOCATION(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_1, logic->CanBlastOrSmash), + LOCATION(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_2, logic->CanBlastOrSmash), + LOCATION(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_3, logic->CanBlastOrSmash), + LOCATION(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_4, logic->CanBlastOrSmash), + LOCATION(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_5, logic->CanBlastOrSmash), + LOCATION(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_6, logic->CanBlastOrSmash), + LOCATION(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_7, logic->CanBlastOrSmash), + LOCATION(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_8, logic->CanBlastOrSmash), }, { //Exits Entrance(RR_THE_GRAVEYARD, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/dungeon.cpp b/soh/soh/Enhancements/randomizer/dungeon.cpp index 0f799b03646..efc1904070c 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/dungeon.cpp @@ -684,6 +684,14 @@ Dungeons::Dungeons() { RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT, + RC_GANONS_CASTLE_SCRUBS_FAIRY_1, + RC_GANONS_CASTLE_SCRUBS_FAIRY_2, + RC_GANONS_CASTLE_SCRUBS_FAIRY_3, + RC_GANONS_CASTLE_SCRUBS_FAIRY_4, + RC_GANONS_CASTLE_SCRUBS_FAIRY_5, + RC_GANONS_CASTLE_SCRUBS_FAIRY_6, + RC_GANONS_CASTLE_SCRUBS_FAIRY_7, + RC_GANONS_CASTLE_SCRUBS_FAIRY_8, }, { // MQ Locations @@ -705,6 +713,14 @@ Dungeons::Dungeons() { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, + RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1, + RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2, + RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3, + RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4, + RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5, + RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, + RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, + RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, }, { // Shared Locations diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 5aef2eff27f..e931591b417 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -545,6 +545,14 @@ std::vector Rando::StaticData::overworldLocations = { RC_GF_FAIRY_GROTTO_FAIRY_6, RC_GF_FAIRY_GROTTO_FAIRY_7, RC_GF_FAIRY_GROTTO_FAIRY_8, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_1, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_2, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_3, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_4, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_5, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_6, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_7, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_8, }; std::vector Rando::StaticData::gossipStoneLocations = { @@ -662,6 +670,14 @@ std::vector Rando::StaticData::overworldFairyLocations = { RC_GF_FAIRY_GROTTO_FAIRY_6, RC_GF_FAIRY_GROTTO_FAIRY_7, RC_GF_FAIRY_GROTTO_FAIRY_8, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_1, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_2, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_3, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_4, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_5, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_6, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_7, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_8, }; typedef enum { @@ -1639,6 +1655,31 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_GF_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D06, RAND_INF_GF_FAIRY_GROTTO_FAIRY_7, "Grotto Fairy 7", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); locationTable[RC_GF_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D07, RAND_INF_GF_FAIRY_GROTTO_FAIRY_8, "Grotto Fairy 8", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_1] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_1, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x00, RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_1, "Shield Grave Fairy 1", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_2] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_2, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x01, RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_2, "Shield Grave Fairy 2", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_3] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_3, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x02, RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_3, "Shield Grave Fairy 3", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_4] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_4, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x03, RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_4, "Shield Grave Fairy 4", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_5] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_5, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x04, RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_5, "Shield Grave Fairy 5", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_6] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_6, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x05, RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_6, "Shield Grave Fairy 6", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_7] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_7, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x06, RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_7, "Shield Grave Fairy 7", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_8] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_8, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x07, RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_8, "Shield Grave Fairy 8", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_1] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x00, RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_1, "Scrubs Fairy 1", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_2] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x01, RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_2, "Scrubs Fairy 2", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_3] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_3, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x02, RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_3, "Scrubs Fairy 3", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_4] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_4, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x03, RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_4, "Scrubs Fairy 4", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_5] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_5, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x04, RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_5, "Scrubs Fairy 5", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_6] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_6, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x05, RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_6, "Scrubs Fairy 6", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_7] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_7, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x06, RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_7, "Scrubs Fairy 7", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_8] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_8, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x07, RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_8, "Scrubs Fairy 8", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x00, RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1, "MQ Scrubs Fairy 1", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x01, RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2, "MQ Scrubs Fairy 2", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x02, RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3, "MQ Scrubs Fairy 3", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x03, RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4, "MQ Scrubs Fairy 4", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x04, RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5, "MQ Scrubs Fairy 5", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x05, RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, "MQ Scrubs Fairy 6", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x06, RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, "MQ Scrubs Fairy 7", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x07, RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, "MQ Scrubs Fairy 8", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + // Gossip Stones locationTable[RC_DMC_GOSSIP_STONE] = Location::HintStone(RC_DMC_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 14341, 0x05, "Gossip Stone", {}); locationTable[RC_DMT_GOSSIP_STONE] = Location::HintStone(RC_DMT_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 14340, 0x04, "Gossip Stone", {}); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 87e378617bd..d34a700e3b5 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1692,6 +1692,30 @@ typedef enum { RC_GF_FAIRY_GROTTO_FAIRY_6, RC_GF_FAIRY_GROTTO_FAIRY_7, RC_GF_FAIRY_GROTTO_FAIRY_8, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_1, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_2, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_3, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_4, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_5, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_6, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_7, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_8, + RC_GANONS_CASTLE_SCRUBS_FAIRY_1, + RC_GANONS_CASTLE_SCRUBS_FAIRY_2, + RC_GANONS_CASTLE_SCRUBS_FAIRY_3, + RC_GANONS_CASTLE_SCRUBS_FAIRY_4, + RC_GANONS_CASTLE_SCRUBS_FAIRY_5, + RC_GANONS_CASTLE_SCRUBS_FAIRY_6, + RC_GANONS_CASTLE_SCRUBS_FAIRY_7, + RC_GANONS_CASTLE_SCRUBS_FAIRY_8, + RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1, + RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2, + RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3, + RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4, + RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5, + RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, + RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, + RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, RC_MAX } RandomizerCheck; @@ -3683,6 +3707,8 @@ typedef enum { RHT_HF_FAIRY_GROTTO_FAIRY, RHT_ZD_FAIRY_GROTTO_FAIRY, RHT_GF_FAIRY_GROTTO_FAIRY, + RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, + RHT_GANONS_CASTLE_SCRUBS_FAIRY, RHT_MAX } RandomizerHintTextKey; diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index c778b7f53d4..e231a2a3179 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -347,6 +347,30 @@ typedef enum { RAND_INF_GF_FAIRY_GROTTO_FAIRY_6, RAND_INF_GF_FAIRY_GROTTO_FAIRY_7, RAND_INF_GF_FAIRY_GROTTO_FAIRY_8, + RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_1, + RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_2, + RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_3, + RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_4, + RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_5, + RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_6, + RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_7, + RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_8, + RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_1, + RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_2, + RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_3, + RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_4, + RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_5, + RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_6, + RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_7, + RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_8, + RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1, + RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2, + RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3, + RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4, + RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5, + RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, + RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, + RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, // If you add anything to this list, you need to update the size of randomizerInf in z64save.h to be ceil(RAND_INF_MAX / 16) RAND_INF_MAX, From e1d1557eec9696f010986d8d506cf007c7ade91a Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 5 Sep 2024 17:37:54 -0700 Subject: [PATCH 071/108] Override bean sprouts spawning fairies --- .../game-interactor/GameInteractor.h | 3 ++ .../Enhancements/randomizer/fairy_shuffle.cpp | 47 ++++++++++++++----- .../overlays/actors/ovl_Obj_Bean/z_obj_bean.c | 7 ++- 3 files changed, 42 insertions(+), 15 deletions(-) diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.h b/soh/soh/Enhancements/game-interactor/GameInteractor.h index 5c6cecc90d1..81db1ce640b 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor.h @@ -414,10 +414,13 @@ typedef enum { VB_PHANTOM_GANON_DEATH_SCENE, VB_NABOORU_KNUCKLE_DEATH_SCENE, + /*** Fairy Shuffle ***/ // Opt: *EnElf VB_SPAWN_FAIRY_GROUP, // Opt: *EnElf VB_FAIRY_HEAL, + // Opt: *ObjBean + VB_BEAN_SPAWN_FAIRIES, } GIVanillaBehavior; #ifdef __cplusplus diff --git a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp index 44dbc58ef3d..e65e3f75505 100644 --- a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp +++ b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp @@ -3,7 +3,9 @@ #include "randomizer_grotto.h" #include "draw.h" #include "src/overlays/actors/ovl_En_Elf/z_en_elf.h" +#include "src/overlays/actors/ovl_Obj_Bean/z_obj_bean.h" +#define FAIRY_FLAG_TIMED (1 << 8) void FairyDrawRandomizedItem(EnElf* enElf, PlayState* play) { GetItemEntry randoGetItem = enElf->sohFairyIdentity.itemEntry; @@ -17,28 +19,47 @@ void FairyDrawRandomizedItem(EnElf* enElf, PlayState* play) { Matrix_Pop(); } +bool FairyInitialise(EnElf* fairy, int32_t params) { + Rando::Location* location = OTRGlobals::Instance->gRandomizer->GetCheckObjectFromActor(ACTOR_EN_ELF, gPlayState->sceneNum, params); + RandomizerInf flag = static_cast(location->GetCollectionCheck().flag); + if (location->GetRandomizerCheck() != RC_UNKNOWN_CHECK && !Flags_GetRandomizerInf(flag)) { + GetItemEntry item = Rando::Context::GetInstance()->GetFinalGIEntry(location->GetRandomizerCheck(), true, GI_FAIRY); + fairy->sohFairyIdentity = { flag, item }; + fairy->actor.draw = (ActorFunc)FairyDrawRandomizedItem; + return true; + } else { + return false; + } +} + void FairyOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void* optionalArg) { - if (id == VB_SPAWN_FAIRY_GROUP) { + if (id == VB_FAIRY_HEAL) { + EnElf* enElf = static_cast(optionalArg); + if (enElf->sohFairyIdentity.randomizerInf != RAND_INF_MAX) { + Flags_SetRandomizerInf(enElf->sohFairyIdentity.randomizerInf); + *should = false; + } + } else if (id == VB_SPAWN_FAIRY_GROUP) { EnElf* enElf = static_cast(optionalArg); s16 grottoId = (gPlayState->sceneNum == SCENE_FAIRYS_FOUNTAIN) ? Grotto_CurrentGrotto() : 0; for (s16 index = 0; index < 8; index++) { EnElf* newFairy = (EnElf*)Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_ELF, enElf->actor.world.pos.x, enElf->actor.world.pos.y - 30.0f, enElf->actor.world.pos.z, 0, 0, 0, FAIRY_HEAL, true); - int32_t params = (grottoId << 8) | index; - Rando::Location* location = OTRGlobals::Instance->gRandomizer->GetCheckObjectFromActor(ACTOR_EN_ELF, gPlayState->sceneNum, params); - if (location != NULL && location->GetRandomizerCheck() != RC_UNKNOWN_CHECK && !Flags_GetRandomizerInf(location->GetCollectionCheck().flag)) { - GetItemEntry item = Rando::Context::GetInstance()->GetFinalGIEntry(location->GetRandomizerCheck(), true, GI_FAIRY); - newFairy->sohFairyIdentity = { static_cast(location->GetCollectionCheck().flag), item }; - newFairy->actor.draw = (ActorFunc)FairyDrawRandomizedItem; - } + + FairyInitialise(newFairy, (grottoId << 8) | index); } *should = false; - } else if (id == VB_FAIRY_HEAL) { - EnElf* enElf = static_cast(optionalArg); - if (enElf->sohFairyIdentity.randomizerInf != RAND_INF_MAX) { - Flags_SetRandomizerInf(enElf->sohFairyIdentity.randomizerInf); - *should = false; + } else if (id == VB_BEAN_SPAWN_FAIRIES) { + ObjBean* objBean = static_cast(optionalArg); + for (s16 index = 0; index < 3; index++) { + EnElf* newFairy = (EnElf*)Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_ELF, objBean->dyna.actor.world.pos.x, + objBean->dyna.actor.world.pos.y + 15.0f, objBean->dyna.actor.world.pos.z, 0, 0, 0, FAIRY_HEAL, true); + + if (!FairyInitialise(newFairy, ((objBean->dyna.actor.params & 0x3F) << 8) | index)) { + newFairy->fairyFlags |= FAIRY_FLAG_TIMED; + } } + *should = false; } } diff --git a/soh/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.c b/soh/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.c index c57eb7b1d39..a8e5fbcb295 100644 --- a/soh/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.c +++ b/soh/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.c @@ -8,6 +8,7 @@ #include "objects/object_mamenoki/object_mamenoki.h" #include "objects/gameplay_keep/gameplay_keep.h" #include "vt.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS ACTOR_FLAG_IGNORE_POINTLIGHTS @@ -701,8 +702,10 @@ void ObjBean_GrowWaterPhase3(ObjBean* this, PlayState* play) { itemDropPos.x = this->dyna.actor.world.pos.x; itemDropPos.y = this->dyna.actor.world.pos.y - 25.0f; itemDropPos.z = this->dyna.actor.world.pos.z; - for (i = 0; i < 3; i++) { - Item_DropCollectible(play, &itemDropPos, ITEM00_FLEXIBLE); + if (GameInteractor_Should(VB_BEAN_SPAWN_FAIRIES, true, this)) { + for (i = 0; i < 3; i++) { + Item_DropCollectible(play, &itemDropPos, ITEM00_FLEXIBLE); + } } this->stateFlags |= BEAN_STATE_BEEN_WATERED; Audio_PlayActorSound2(&this->dyna.actor, NA_SE_EV_BUTTERFRY_TO_FAIRY); From 96055ff54535b6ced247c593a6c297a5ad400436 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 5 Sep 2024 19:23:13 -0700 Subject: [PATCH 072/108] Define bean sprout fairy checks --- .../Enhancements/randomizer/location_list.cpp | 63 +++++++++++++++++++ .../Enhancements/randomizer/randomizerTypes.h | 40 ++++++++++++ .../Enhancements/randomizer/randomizer_inf.h | 31 +++++++++ 3 files changed, 134 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index e931591b417..8d0c484f4dd 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -553,6 +553,37 @@ std::vector Rando::StaticData::overworldLocations = { RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_6, RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_7, RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_8, + + RC_ZR_BEAN_SPROUT_FAIRY_1, + RC_ZR_BEAN_SPROUT_FAIRY_2, + RC_ZR_BEAN_SPROUT_FAIRY_3, + RC_KF_BEAN_SPROUT_FAIRY_1, + RC_KF_BEAN_SPROUT_FAIRY_2, + RC_KF_BEAN_SPROUT_FAIRY_3, + RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1, + RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2, + RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3, + RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1, + RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2, + RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3, + RC_LH_BEAN_SPROUT_FAIRY_1, + RC_LH_BEAN_SPROUT_FAIRY_2, + RC_LH_BEAN_SPROUT_FAIRY_3, + RC_GV_BEAN_SPROUT_FAIRY_1, + RC_GV_BEAN_SPROUT_FAIRY_2, + RC_GV_BEAN_SPROUT_FAIRY_3, + RC_COLOSSUS_BEAN_SPROUT_FAIRY_1, + RC_COLOSSUS_BEAN_SPROUT_FAIRY_2, + RC_COLOSSUS_BEAN_SPROUT_FAIRY_3, + RC_GRAVEYARD_BEAN_SPROUT_FAIRY_1, + RC_GRAVEYARD_BEAN_SPROUT_FAIRY_2, + RC_GRAVEYARD_BEAN_SPROUT_FAIRY_3, + RC_DMC_BEAN_SPROUT_FAIRY_1, + RC_DMC_BEAN_SPROUT_FAIRY_2, + RC_DMC_BEAN_SPROUT_FAIRY_3, + RC_DMT_BEAN_SPROUT_FAIRY_1, + RC_DMT_BEAN_SPROUT_FAIRY_2, + RC_DMT_BEAN_SPROUT_FAIRY_3, }; std::vector Rando::StaticData::gossipStoneLocations = { @@ -1680,6 +1711,38 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x06, RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, "MQ Scrubs Fairy 7", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x07, RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, "MQ Scrubs Fairy 8", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + + locationTable[RC_ZR_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_ZR_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 0x0300, RAND_INF_ZR_BEAN_SPROUT_FAIRY_1, "Bean Sprout Fairy 1", RHT_ZR_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZR_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_ZR_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 0x0301, RAND_INF_ZR_BEAN_SPROUT_FAIRY_2, "Bean Sprout Fairy 2", RHT_ZR_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZR_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_ZR_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 0x0302, RAND_INF_ZR_BEAN_SPROUT_FAIRY_3, "Bean Sprout Fairy 3", RHT_ZR_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_KF_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_KF_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, 0x0900, RAND_INF_KF_BEAN_SPROUT_FAIRY_1, "Bean Sprout Fairy 1", RHT_KF_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_KF_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, 0x0901, RAND_INF_KF_BEAN_SPROUT_FAIRY_2, "Bean Sprout Fairy 2", RHT_KF_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_KF_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, 0x0902, RAND_INF_KF_BEAN_SPROUT_FAIRY_3, "Bean Sprout Fairy 3", RHT_KF_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x0400, RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1, "Bean Sprout Near Bridge Fairy 1", RHT_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x0401, RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2, "Bean Sprout Near Bridge Fairy 2", RHT_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x0402, RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3, "Bean Sprout Near Bridge Fairy 3", RHT_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x1200, RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1, "Bean Sprout Near Theatre Fairy 1", RHT_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x1201, RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2, "Bean Sprout Near Theatre Fairy 2", RHT_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x1202, RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3, "Bean Sprout Near Theatre Fairy 3", RHT_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LH_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_LH_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 0x0100, RAND_INF_LH_BEAN_SPROUT_FAIRY_1, "Bean Sprout Fairy 1", RHT_LH_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[RC_LH_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_LH_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 0x0101, RAND_INF_LH_BEAN_SPROUT_FAIRY_2, "Bean Sprout Fairy 2", RHT_LH_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[RC_LH_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_LH_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 0x0102, RAND_INF_LH_BEAN_SPROUT_FAIRY_3, "Bean Sprout Fairy 3", RHT_LH_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[RC_GV_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_GV_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, 0x0300, RAND_INF_GV_BEAN_SPROUT_FAIRY_1, "Bean Sprout Fairy 1", RHT_GV_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GV_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_GV_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, 0x0301, RAND_INF_GV_BEAN_SPROUT_FAIRY_2, "Bean Sprout Fairy 2", RHT_GV_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GV_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_GV_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, 0x0302, RAND_INF_GV_BEAN_SPROUT_FAIRY_3, "Bean Sprout Fairy 3", RHT_GV_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_COLOSSUS_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_COLOSSUS_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x1800, RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_1, "Bean Sprout Fairy 1", RHT_COLOSSUS_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_COLOSSUS_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_COLOSSUS_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x1801, RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_2, "Bean Sprout Fairy 2", RHT_COLOSSUS_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_COLOSSUS_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_COLOSSUS_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x1802, RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_3, "Bean Sprout Fairy 3", RHT_COLOSSUS_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GRAVEYARD_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, 0x0300, RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_1, "Bean Sprout Fairy 1", RHT_GRAVEYARD_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, 0x0301, RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_2, "Bean Sprout Fairy 2", RHT_GRAVEYARD_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, 0x0302, RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_3, "Bean Sprout Fairy 3", RHT_GRAVEYARD_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_DMC_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_DMC_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 0x0300, RAND_INF_DMC_BEAN_SPROUT_FAIRY_1, "Bean Sprout Fairy 1", RHT_DMC_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_DMC_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 0x0301, RAND_INF_DMC_BEAN_SPROUT_FAIRY_2, "Bean Sprout Fairy 2", RHT_DMC_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_DMC_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 0x0302, RAND_INF_DMC_BEAN_SPROUT_FAIRY_3, "Bean Sprout Fairy 3", RHT_DMC_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_DMT_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 0x0600, RAND_INF_DMT_BEAN_SPROUT_FAIRY_1, "Bean Sprout Fairy 1", RHT_DMT_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_DMT_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 0x0601, RAND_INF_DMT_BEAN_SPROUT_FAIRY_2, "Bean Sprout Fairy 2", RHT_DMT_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_DMT_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 0x0602, RAND_INF_DMT_BEAN_SPROUT_FAIRY_3, "Bean Sprout Fairy 3", RHT_DMT_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + // Gossip Stones locationTable[RC_DMC_GOSSIP_STONE] = Location::HintStone(RC_DMC_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 14341, 0x05, "Gossip Stone", {}); locationTable[RC_DMT_GOSSIP_STONE] = Location::HintStone(RC_DMT_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 14340, 0x04, "Gossip Stone", {}); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index d34a700e3b5..bb1a37c9c94 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1716,6 +1716,36 @@ typedef enum { RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, + RC_ZR_BEAN_SPROUT_FAIRY_1, + RC_ZR_BEAN_SPROUT_FAIRY_2, + RC_ZR_BEAN_SPROUT_FAIRY_3, + RC_KF_BEAN_SPROUT_FAIRY_1, + RC_KF_BEAN_SPROUT_FAIRY_2, + RC_KF_BEAN_SPROUT_FAIRY_3, + RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1, + RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2, + RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3, + RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1, + RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2, + RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3, + RC_LH_BEAN_SPROUT_FAIRY_1, + RC_LH_BEAN_SPROUT_FAIRY_2, + RC_LH_BEAN_SPROUT_FAIRY_3, + RC_GV_BEAN_SPROUT_FAIRY_1, + RC_GV_BEAN_SPROUT_FAIRY_2, + RC_GV_BEAN_SPROUT_FAIRY_3, + RC_COLOSSUS_BEAN_SPROUT_FAIRY_1, + RC_COLOSSUS_BEAN_SPROUT_FAIRY_2, + RC_COLOSSUS_BEAN_SPROUT_FAIRY_3, + RC_GRAVEYARD_BEAN_SPROUT_FAIRY_1, + RC_GRAVEYARD_BEAN_SPROUT_FAIRY_2, + RC_GRAVEYARD_BEAN_SPROUT_FAIRY_3, + RC_DMC_BEAN_SPROUT_FAIRY_1, + RC_DMC_BEAN_SPROUT_FAIRY_2, + RC_DMC_BEAN_SPROUT_FAIRY_3, + RC_DMT_BEAN_SPROUT_FAIRY_1, + RC_DMT_BEAN_SPROUT_FAIRY_2, + RC_DMT_BEAN_SPROUT_FAIRY_3, RC_MAX } RandomizerCheck; @@ -3709,6 +3739,16 @@ typedef enum { RHT_GF_FAIRY_GROTTO_FAIRY, RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, RHT_GANONS_CASTLE_SCRUBS_FAIRY, + RHT_ZR_BEAN_SPROUT_FAIRY, + RHT_KF_BEAN_SPROUT_FAIRY, + RHT_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY, + RHT_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY, + RHT_LH_BEAN_SPROUT_FAIRY, + RHT_GV_BEAN_SPROUT_FAIRY, + RHT_COLOSSUS_BEAN_SPROUT_FAIRY, + RHT_GRAVEYARD_BEAN_SPROUT_FAIRY, + RHT_DMC_BEAN_SPROUT_FAIRY, + RHT_DMT_BEAN_SPROUT_FAIRY, RHT_MAX } RandomizerHintTextKey; diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index e231a2a3179..7b29cb13f88 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -371,6 +371,37 @@ typedef enum { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, + + RAND_INF_ZR_BEAN_SPROUT_FAIRY_1, + RAND_INF_ZR_BEAN_SPROUT_FAIRY_2, + RAND_INF_ZR_BEAN_SPROUT_FAIRY_3, + RAND_INF_KF_BEAN_SPROUT_FAIRY_1, + RAND_INF_KF_BEAN_SPROUT_FAIRY_2, + RAND_INF_KF_BEAN_SPROUT_FAIRY_3, + RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1, + RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2, + RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3, + RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1, + RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2, + RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3, + RAND_INF_LH_BEAN_SPROUT_FAIRY_1, + RAND_INF_LH_BEAN_SPROUT_FAIRY_2, + RAND_INF_LH_BEAN_SPROUT_FAIRY_3, + RAND_INF_GV_BEAN_SPROUT_FAIRY_1, + RAND_INF_GV_BEAN_SPROUT_FAIRY_2, + RAND_INF_GV_BEAN_SPROUT_FAIRY_3, + RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_1, + RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_2, + RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_3, + RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_1, + RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_2, + RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_3, + RAND_INF_DMC_BEAN_SPROUT_FAIRY_1, + RAND_INF_DMC_BEAN_SPROUT_FAIRY_2, + RAND_INF_DMC_BEAN_SPROUT_FAIRY_3, + RAND_INF_DMT_BEAN_SPROUT_FAIRY_1, + RAND_INF_DMT_BEAN_SPROUT_FAIRY_2, + RAND_INF_DMT_BEAN_SPROUT_FAIRY_3, // If you add anything to this list, you need to update the size of randomizerInf in z64save.h to be ceil(RAND_INF_MAX / 16) RAND_INF_MAX, From 41d10c328c5a69d4082e10bbcf5a849d257349c0 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 5 Sep 2024 19:33:20 -0700 Subject: [PATCH 073/108] Add HasItem and CanUse entries for magic beans. --- soh/soh/Enhancements/randomizer/logic.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp index edb17df0c88..c76119a1465 100644 --- a/soh/soh/Enhancements/randomizer/logic.cpp +++ b/soh/soh/Enhancements/randomizer/logic.cpp @@ -71,6 +71,8 @@ namespace Rando { return Scarecrow; case RG_DISTANT_SCARECROW: return DistantScarecrow; + case RG_MAGIC_BEAN: + return ctx->GetAmmo(ITEM_BEAN) > 0; case RG_KOKIRI_SWORD: case RG_DEKU_SHIELD: case RG_GORON_TUNIC: @@ -286,6 +288,8 @@ namespace Rando { return BombchuRefill && BombchusEnabled; case RG_RUTOS_LETTER: return IsChild; + case RG_MAGIC_BEAN: + return IsChild; // Adult Trade case RG_POCKET_EGG: @@ -463,7 +467,7 @@ namespace Rando { BuyArrow = GetInLogic(LOGIC_BUY_ARROW); BuyBomb = GetInLogic(LOGIC_BUY_BOMB); BuyMagicPotion = GetInLogic(LOGIC_BUY_MAGIC_POTION); - MagicBean = ctx->GetAmmo(ITEM_BEAN) > 0; + MagicBean = HasItem(RG_MAGIC_BEAN); RutosLetter = CanUse(RG_RUTOS_LETTER); Boomerang = CanUse(RG_BOOMERANG); DinsFire = CanUse(RG_DINS_FIRE); From 1598ce3273808a2269e181542b362e5ab6b55974 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 5 Sep 2024 19:46:16 -0700 Subject: [PATCH 074/108] Define logic for bean sprout fairies --- .../3drando/location_access/locacc_death_mountain.cpp | 6 ++++++ .../3drando/location_access/locacc_gerudo_valley.cpp | 6 ++++++ .../3drando/location_access/locacc_hyrule_field.cpp | 3 +++ .../3drando/location_access/locacc_kakariko.cpp | 3 +++ .../3drando/location_access/locacc_lost_woods.cpp | 9 +++++++++ .../3drando/location_access/locacc_zoras_domain.cpp | 3 +++ 6 files changed, 30 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp index 73284dbc8f5..3f8036cd4a5 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp @@ -15,6 +15,9 @@ void AreaTable_Init_DeathMountain() { LOCATION(RC_DMT_GS_BEAN_PATCH, logic->CanPlantBugs && (logic->HasExplosives || logic->GoronBracelet || (randoCtx->GetTrickOption(RT_DMT_SOIL_GS) && (logic->CanTakeDamage || logic->CanUse(RG_HOVER_BOOTS)) && logic->CanUse(RG_BOOMERANG)))), LOCATION(RC_DMT_GS_NEAR_KAK, logic->CanBlastOrSmash), LOCATION(RC_DMT_GS_ABOVE_DODONGOS_CAVERN, logic->IsAdult && logic->AtNight && (logic->CanUse(RG_MEGATON_HAMMER) || (randoCtx->GetTrickOption(RT_DMT_HOOKSHOT_LOWER_GS) && logic->CanUse(RG_HOOKSHOT)) || (randoCtx->GetTrickOption(RT_DMT_BEAN_LOWER_GS) && CanPlantBean(RR_DEATH_MOUNTAIN_TRAIL)) || (randoCtx->GetTrickOption(RT_DMT_HOVERS_LOWER_GS) && logic->CanUse(RG_HOVER_BOOTS)) || randoCtx->GetTrickOption(RT_DMT_JS_LOWER_GS)) && logic->CanGetNightTimeGS), + LOCATION(RC_DMT_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->HasExplosives || logic->HasItem(RG_GORONS_BRACELET))), + LOCATION(RC_DMT_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->HasExplosives || logic->HasItem(RG_GORONS_BRACELET))), + LOCATION(RC_DMT_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->HasExplosives || logic->HasItem(RG_GORONS_BRACELET))), }, { //Exits Entrance(RR_KAK_BEHIND_GATE, {[]{return true;}}), @@ -227,6 +230,9 @@ void AreaTable_Init_DeathMountain() { }, { //Locations LOCATION(RC_DMC_GS_BEAN_PATCH, (logic->FireTimer >= 8 || logic->Hearts >= 3) && logic->CanPlantBugs && logic->CanChildAttack), + LOCATION(RC_DMC_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->FireTimer >= 8 || logic->Hearts >= 3)), + LOCATION(RC_DMC_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->FireTimer >= 8 || logic->Hearts >= 3)), + LOCATION(RC_DMC_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->FireTimer >= 8 || logic->Hearts >= 3)), }, { //Exits Entrance(RR_DMC_CENTRAL_NEARBY, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp index a21cef7c2fb..57cb2286b01 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp @@ -29,6 +29,9 @@ void AreaTable_Init_GerudoValley() { LOCATION(RC_GV_GS_BEAN_PATCH, logic->CanPlantBugs && logic->CanChildAttack), LOCATION(RC_GV_COW, logic->IsChild && logic->CanUse(RG_EPONAS_SONG)), LOCATION(RC_GV_GOSSIP_STONE, true), + LOCATION(RC_GV_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_GV_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_GV_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), }, { //Exits Entrance(RR_GV_LOWER_STREAM, {[]{return true;}}), @@ -184,6 +187,9 @@ void AreaTable_Init_GerudoValley() { LOCATION(RC_COLOSSUS_GS_TREE, logic->IsAdult && logic->HookshotOrBoomerang && logic->AtNight && logic->CanGetNightTimeGS), LOCATION(RC_COLOSSUS_GS_HILL, logic->IsAdult && logic->AtNight && ((CanPlantBean(RR_DESERT_COLOSSUS) && logic->CanAdultAttack) || logic->CanUse(RG_LONGSHOT) || (randoCtx->GetTrickOption(RT_COLOSSUS_GS) && logic->CanUse(RG_HOOKSHOT))) && logic->CanGetNightTimeGS), LOCATION(RC_COLOSSUS_GOSSIP_STONE, true), + LOCATION(RC_COLOSSUS_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_COLOSSUS_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_COLOSSUS_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), }, { //Exits Entrance(RR_COLOSSUS_GREAT_FAIRY_FOUNTAIN, {[]{return logic->HasExplosives;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp index 2d6de46924f..352ed05696d 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp @@ -136,6 +136,9 @@ void AreaTable_Init_HyruleField() { LOCATION(RC_LH_GS_LAB_WALL, logic->IsChild && (logic->HookshotOrBoomerang || (randoCtx->GetTrickOption(RT_LH_LAB_WALL_GS) && logic->CanJumpslash)) && logic->AtNight && logic->CanGetNightTimeGS), LOCATION(RC_LH_GS_SMALL_ISLAND, logic->IsChild && logic->CanChildAttack && logic->AtNight && logic->CanGetNightTimeGS), LOCATION(RC_LH_GS_TREE, logic->IsAdult && logic->CanUse(RG_LONGSHOT) && logic->AtNight && logic->CanGetNightTimeGS), + LOCATION(RC_LH_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_LH_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_LH_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LH_LAB_GOSSIP_STONE, true), LOCATION(RC_LH_SOUTHEAST_GOSSIP_STONE, true), LOCATION(RC_LH_SOUTHWEST_GOSSIP_STONE, true), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp index 45fa4a1861c..5df1b9a5379 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp @@ -217,6 +217,9 @@ void AreaTable_Init_Kakariko() { LOCATION(RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, logic->ChildsWallet && logic->IsChild && logic->AtNight), //TODO: This needs to change LOCATION(RC_GRAVEYARD_GS_WALL, logic->IsChild && logic->HookshotOrBoomerang && logic->AtNight && logic->CanGetNightTimeGS), LOCATION(RC_GRAVEYARD_GS_BEAN_PATCH, logic->CanPlantBugs && logic->CanChildAttack), + LOCATION(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), }, { //Exits Entrance(RR_GRAVEYARD_SHIELD_GRAVE, {[]{return logic->IsAdult || logic->AtNight;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp index 57e873d0fcf..b9c07bfaea3 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp @@ -15,6 +15,9 @@ void AreaTable_Init_LostWoods() { LOCATION(RC_KF_GS_KNOW_IT_ALL_HOUSE, logic->IsChild && logic->CanChildAttack && logic->AtNight && (/*TODO: HasNightStart ||*/ logic->CanLeaveForest || logic->CanUse(RG_SUNS_SONG)) && logic->CanGetNightTimeGS), LOCATION(RC_KF_GS_BEAN_PATCH, logic->CanPlantBugs && logic->CanChildAttack), LOCATION(RC_KF_GS_HOUSE_OF_TWINS, logic->IsAdult && logic->AtNight && (logic->HookshotOrBoomerang || (randoCtx->GetTrickOption(RT_KF_ADULT_GS) && logic->CanUse(RG_HOVER_BOOTS))) && logic->CanGetNightTimeGS), + LOCATION(RC_KF_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_KF_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_KF_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_KF_GOSSIP_STONE, true), }, { //Exits @@ -135,6 +138,9 @@ void AreaTable_Init_LostWoods() { LOCATION(RC_LW_TARGET_IN_WOODS, logic->IsChild && logic->CanUse(RG_FAIRY_SLINGSHOT)), LOCATION(RC_LW_DEKU_SCRUB_NEAR_BRIDGE, logic->IsChild && logic->CanStunDeku), LOCATION(RC_LW_GS_BEAN_PATCH_NEAR_BRIDGE, logic->CanPlantBugs && logic->CanChildAttack), + LOCATION(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LW_GOSSIP_STONE, true), }, { //Exits @@ -155,6 +161,9 @@ void AreaTable_Init_LostWoods() { LOCATION(RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, logic->IsChild && logic->CanStunDeku), LOCATION(RC_LW_GS_ABOVE_THEATER, logic->IsAdult && logic->AtNight && ((CanPlantBean(RR_LW_BEYOND_MIDO) && logic->CanAdultAttack) || (randoCtx->GetTrickOption(RT_LW_GS_BEAN) && logic->CanUse(RG_HOOKSHOT) && (logic->CanUse(RG_LONGSHOT) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_BOMBCHU_5) || logic->CanUse(RG_DINS_FIRE)))) && logic->CanGetNightTimeGS), LOCATION(RC_LW_GS_BEAN_PATCH_NEAR_THEATER, logic->CanPlantBugs && (logic->CanChildAttack || (randoCtx->GetOption(RSK_SHUFFLE_SCRUBS).Is(RO_SCRUBS_OFF) && logic->DekuShield))), + LOCATION(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), }, { //Exits Entrance(RR_LW_FOREST_EXIT, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp index a9be45b3a82..61612395371 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp @@ -34,6 +34,9 @@ void AreaTable_Init_ZorasDomain() { LOCATION(RC_ZR_GS_LADDER, logic->IsChild && logic->AtNight && logic->CanChildAttack && logic->CanGetNightTimeGS), LOCATION(RC_ZR_GS_NEAR_RAISED_GROTTOS, logic->IsAdult && logic->HookshotOrBoomerang && logic->AtNight && logic->CanGetNightTimeGS), LOCATION(RC_ZR_GS_ABOVE_BRIDGE, logic->IsAdult && logic->CanUse(RG_HOOKSHOT) && logic->AtNight && logic->CanGetNightTimeGS), + LOCATION(RC_ZR_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_ZR_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_ZR_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, true), LOCATION(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, true), }, { From 12c4bb43378a30e77d883fed18af464ace4ed1f6 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 5 Sep 2024 23:25:13 -0700 Subject: [PATCH 075/108] Enabling looking up fairies by z coordinate --- soh/soh/Enhancements/randomizer/fairy_shuffle.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp index e65e3f75505..e55972905fa 100644 --- a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp +++ b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp @@ -6,6 +6,7 @@ #include "src/overlays/actors/ovl_Obj_Bean/z_obj_bean.h" #define FAIRY_FLAG_TIMED (1 << 8) +#define FAIRY_FLAG_BIG (1 << 9) void FairyDrawRandomizedItem(EnElf* enElf, PlayState* play) { GetItemEntry randoGetItem = enElf->sohFairyIdentity.itemEntry; @@ -66,6 +67,11 @@ void FairyOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void* opt void FairyOnActorInitHandler(void* actorRef) { EnElf* enElf = static_cast(actorRef); enElf->sohFairyIdentity = { RAND_INF_MAX, GET_ITEM_NONE }; + s16 grottoId = (gPlayState->sceneNum == SCENE_GROTTOS) ? Grotto_CurrentGrotto() : 0; + if (enElf->fairyFlags & FAIRY_FLAG_BIG) { + grottoId |= 0x8000; + } + FairyInitialise(enElf, TWO_ACTOR_PARAMS(grottoId, (s16)enElf->actor.home.pos.z)); } uint32_t onVanillaBehaviorHook = 0; From fb5e1bc530ea3147dfa76176c580457360ad16ba Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Fri, 6 Sep 2024 00:19:06 -0700 Subject: [PATCH 076/108] Add Temple of Time Gossip Stones Logic might look a little weird. While the Gossip Stones respond to Sun's Song, the scene transition takes priority, so the fairies aren't actually obtainable. Adult does not have day and night versions and is fully capable of acquiring the fairies with Sun's Song. Song of Time is similar, but rather than being dependant on age, it's dependant on the timesaver to switch ages anywhere with Song of Time. In this case, the fairies still spawn, but the age transition deletes them before giving the chance to collect them. While I could've chosen to ignore this and simply require the player to disable the enhancement before playing if it's their only option, I instead decided to accomodate the enhancement and require one of the other songs in order for the check to be in logic. --- .../location_access/locacc_castle_town.cpp | 8 ++++++ .../Enhancements/randomizer/fairy_shuffle.cpp | 14 +++++++--- .../Enhancements/randomizer/location_list.cpp | 27 ++++++++++++++++++- .../Enhancements/randomizer/randomizerTypes.h | 10 +++++++ .../Enhancements/randomizer/randomizer_inf.h | 9 +++++++ 5 files changed, 63 insertions(+), 5 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_castle_town.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_castle_town.cpp index e809beb5472..463590fc857 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_castle_town.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_castle_town.cpp @@ -38,6 +38,14 @@ void AreaTable_Init_CastleTown() { EventAccess(&logic->GossipStoneFairy, {[]{return logic->GossipStoneFairy || logic->CanSummonGossipFairyWithoutSuns;}}), }, { //Locations + LOCATION(RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, logic->CanUse(RG_ZELDAS_LULLABY) || logic->CanUse(RG_SARIAS_SONG) || logic->CanUse(RG_EPONAS_SONG) || (logic->CanUse(RG_SUNS_SONG) && logic->IsAdult)), + LOCATION(RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, logic->CanUse(RG_ZELDAS_LULLABY) || logic->CanUse(RG_SARIAS_SONG) || logic->CanUse(RG_EPONAS_SONG) || (logic->CanUse(RG_SUNS_SONG) && logic->IsAdult)), + LOCATION(RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, logic->CanUse(RG_ZELDAS_LULLABY) || logic->CanUse(RG_SARIAS_SONG) || logic->CanUse(RG_EPONAS_SONG) || (logic->CanUse(RG_SUNS_SONG) && logic->IsAdult)), + LOCATION(RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, logic->CanUse(RG_ZELDAS_LULLABY) || logic->CanUse(RG_SARIAS_SONG) || logic->CanUse(RG_EPONAS_SONG) || (logic->CanUse(RG_SUNS_SONG) && logic->IsAdult)), + LOCATION(RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_TOT_LEFTMOST_GOSSIP_STONE, true), LOCATION(RC_TOT_LEFT_CENTER_GOSSIP_STONE, true), LOCATION(RC_TOT_RIGHT_CENTER_GOSSIP_STONE, true), diff --git a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp index e55972905fa..7bb5cdbb080 100644 --- a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp +++ b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp @@ -21,7 +21,11 @@ void FairyDrawRandomizedItem(EnElf* enElf, PlayState* play) { } bool FairyInitialise(EnElf* fairy, int32_t params) { - Rando::Location* location = OTRGlobals::Instance->gRandomizer->GetCheckObjectFromActor(ACTOR_EN_ELF, gPlayState->sceneNum, params); + s16 sceneNum = gPlayState->sceneNum; + if (sceneNum == SCENE_TEMPLE_OF_TIME_EXTERIOR_NIGHT || sceneNum == SCENE_TEMPLE_OF_TIME_EXTERIOR_RUINS) { + sceneNum = SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY; + } + Rando::Location* location = OTRGlobals::Instance->gRandomizer->GetCheckObjectFromActor(ACTOR_EN_ELF, sceneNum, params); RandomizerInf flag = static_cast(location->GetCollectionCheck().flag); if (location->GetRandomizerCheck() != RC_UNKNOWN_CHECK && !Flags_GetRandomizerInf(flag)) { GetItemEntry item = Rando::Context::GetInstance()->GetFinalGIEntry(location->GetRandomizerCheck(), true, GI_FAIRY); @@ -67,11 +71,13 @@ void FairyOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void* opt void FairyOnActorInitHandler(void* actorRef) { EnElf* enElf = static_cast(actorRef); enElf->sohFairyIdentity = { RAND_INF_MAX, GET_ITEM_NONE }; - s16 grottoId = (gPlayState->sceneNum == SCENE_GROTTOS) ? Grotto_CurrentGrotto() : 0; + s16 params = (gPlayState->sceneNum == SCENE_GROTTOS) ? Grotto_CurrentGrotto() : 0; if (enElf->fairyFlags & FAIRY_FLAG_BIG) { - grottoId |= 0x8000; + params |= 0x8000; + } + if (FairyInitialise(enElf, TWO_ACTOR_PARAMS(params, (s16)enElf->actor.home.pos.z))) { + enElf->fairyFlags &= ~(FAIRY_FLAG_TIMED | FAIRY_FLAG_BIG); } - FairyInitialise(enElf, TWO_ACTOR_PARAMS(grottoId, (s16)enElf->actor.home.pos.z)); } uint32_t onVanillaBehaviorHook = 0; diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 8d0c484f4dd..57e226c6308 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -584,6 +584,15 @@ std::vector Rando::StaticData::overworldLocations = { RC_DMT_BEAN_SPROUT_FAIRY_1, RC_DMT_BEAN_SPROUT_FAIRY_2, RC_DMT_BEAN_SPROUT_FAIRY_3, + + RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, + RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, + RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, + RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG, + RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, + RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, + RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, + RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, }; std::vector Rando::StaticData::gossipStoneLocations = { @@ -709,6 +718,14 @@ std::vector Rando::StaticData::overworldFairyLocations = { RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_6, RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_7, RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_8, + RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, + RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, + RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, + RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG, + RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, + RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, + RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, + RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, }; typedef enum { @@ -1711,7 +1728,6 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x06, RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, "MQ Scrubs Fairy 7", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x07, RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, "MQ Scrubs Fairy 8", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[RC_ZR_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_ZR_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 0x0300, RAND_INF_ZR_BEAN_SPROUT_FAIRY_1, "Bean Sprout Fairy 1", RHT_ZR_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); locationTable[RC_ZR_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_ZR_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 0x0301, RAND_INF_ZR_BEAN_SPROUT_FAIRY_2, "Bean Sprout Fairy 2", RHT_ZR_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); locationTable[RC_ZR_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_ZR_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 0x0302, RAND_INF_ZR_BEAN_SPROUT_FAIRY_3, "Bean Sprout Fairy 3", RHT_ZR_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); @@ -1743,6 +1759,15 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_DMT_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_DMT_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 0x0601, RAND_INF_DMT_BEAN_SPROUT_FAIRY_2, "Bean Sprout Fairy 2", RHT_DMT_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); locationTable[RC_DMT_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_DMT_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 0x0602, RAND_INF_DMT_BEAN_SPROUT_FAIRY_3, "Bean Sprout Fairy 3", RHT_DMT_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -680), RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, "ToT Left Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x8000, -680), RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, "ToT Left Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -615), RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, "ToT Left Center Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x8000, -615), RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG, "ToT Left Center Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -550), RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, "ToT Right Center Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x8000, -550), RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, "ToT Right Center Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -485), RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, "ToT Right Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x8000, -485), RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, "ToT Right Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + // Gossip Stones locationTable[RC_DMC_GOSSIP_STONE] = Location::HintStone(RC_DMC_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 14341, 0x05, "Gossip Stone", {}); locationTable[RC_DMT_GOSSIP_STONE] = Location::HintStone(RC_DMT_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 14340, 0x04, "Gossip Stone", {}); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index bb1a37c9c94..3a0aecbd780 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1746,6 +1746,14 @@ typedef enum { RC_DMT_BEAN_SPROUT_FAIRY_1, RC_DMT_BEAN_SPROUT_FAIRY_2, RC_DMT_BEAN_SPROUT_FAIRY_3, + RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, + RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, + RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, + RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG, + RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, + RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, + RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, + RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, RC_MAX } RandomizerCheck; @@ -3749,6 +3757,8 @@ typedef enum { RHT_GRAVEYARD_BEAN_SPROUT_FAIRY, RHT_DMC_BEAN_SPROUT_FAIRY, RHT_DMT_BEAN_SPROUT_FAIRY, + RHT_TOT_GOSSIP_STONE_FAIRY, + RHT_TOT_GOSSIP_STONE_FAIRY_BIG, RHT_MAX } RandomizerHintTextKey; diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index 7b29cb13f88..dbea072c897 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -402,6 +402,15 @@ typedef enum { RAND_INF_DMT_BEAN_SPROUT_FAIRY_1, RAND_INF_DMT_BEAN_SPROUT_FAIRY_2, RAND_INF_DMT_BEAN_SPROUT_FAIRY_3, + + RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, + RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, + RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, + RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, + RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, // If you add anything to this list, you need to update the size of randomizerInf in z64save.h to be ceil(RAND_INF_MAX / 16) RAND_INF_MAX, From 3552242a27ca6e1afc628db65b167bf353496ff1 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Sat, 7 Sep 2024 02:01:46 -0700 Subject: [PATCH 077/108] Disable quick age change around gossip stones to simplify logic --- soh/soh/Enhancements/mods.cpp | 3 ++- .../3drando/location_access/locacc_castle_town.cpp | 8 ++++---- soh/soh/Enhancements/randomizer/logic.cpp | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index 36b1a559420..59d16053fd3 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -274,13 +274,14 @@ void RegisterOcarinaTimeTravel() { Actor* nearbyOcarinaSpot = Actor_FindNearby(gPlayState, player, ACTOR_EN_OKARINA_TAG, ACTORCAT_PROP, 120.0f); Actor* nearbyDoorOfTime = Actor_FindNearby(gPlayState, player, ACTOR_DOOR_TOKI, ACTORCAT_BG, 500.0f); Actor* nearbyFrogs = Actor_FindNearby(gPlayState, player, ACTOR_EN_FR, ACTORCAT_NPC, 300.0f); + Actor* nearbyGossipStone = Actor_FindNearby(gPlayState, player, ACTOR_EN_GS, ACTORCAT_NPC, 300.0f); uint8_t hasMasterSword = CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER); uint8_t hasOcarinaOfTime = (INV_CONTENT(ITEM_OCARINA_TIME) == ITEM_OCARINA_TIME); // If TimeTravel + Player have the Ocarina of Time + Have Master Sword + is in proper range // TODO: Once Swordless Adult is fixed: Remove the Master Sword check if (((CVarGetInteger(CVAR_ENHANCEMENT("TimeTravel"), 0) == 1 && hasOcarinaOfTime) || CVarGetInteger(CVAR_ENHANCEMENT("TimeTravel"), 0) == 2) && hasMasterSword && gPlayState->msgCtx.lastPlayedSong == OCARINA_SONG_TIME && !nearbyTimeBlockEmpty && !nearbyTimeBlock && - !nearbyOcarinaSpot && !nearbyFrogs) { + !nearbyOcarinaSpot && !nearbyFrogs && !nearbyGossipStone) { if (IS_RANDO) { CVarSetInteger(CVAR_GENERAL("SwitchTimeline"), 1); diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_castle_town.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_castle_town.cpp index 463590fc857..7200a3e0801 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_castle_town.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_castle_town.cpp @@ -38,13 +38,13 @@ void AreaTable_Init_CastleTown() { EventAccess(&logic->GossipStoneFairy, {[]{return logic->GossipStoneFairy || logic->CanSummonGossipFairyWithoutSuns;}}), }, { //Locations - LOCATION(RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, logic->CanUse(RG_ZELDAS_LULLABY) || logic->CanUse(RG_SARIAS_SONG) || logic->CanUse(RG_EPONAS_SONG) || (logic->CanUse(RG_SUNS_SONG) && logic->IsAdult)), + LOCATION(RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairyWithoutSuns || (logic->CanUse(RG_SUNS_SONG) && logic->IsAdult)), LOCATION(RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), - LOCATION(RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, logic->CanUse(RG_ZELDAS_LULLABY) || logic->CanUse(RG_SARIAS_SONG) || logic->CanUse(RG_EPONAS_SONG) || (logic->CanUse(RG_SUNS_SONG) && logic->IsAdult)), + LOCATION(RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairyWithoutSuns || (logic->CanUse(RG_SUNS_SONG) && logic->IsAdult)), LOCATION(RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), - LOCATION(RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, logic->CanUse(RG_ZELDAS_LULLABY) || logic->CanUse(RG_SARIAS_SONG) || logic->CanUse(RG_EPONAS_SONG) || (logic->CanUse(RG_SUNS_SONG) && logic->IsAdult)), + LOCATION(RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairyWithoutSuns || (logic->CanUse(RG_SUNS_SONG) && logic->IsAdult)), LOCATION(RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), - LOCATION(RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, logic->CanUse(RG_ZELDAS_LULLABY) || logic->CanUse(RG_SARIAS_SONG) || logic->CanUse(RG_EPONAS_SONG) || (logic->CanUse(RG_SUNS_SONG) && logic->IsAdult)), + LOCATION(RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairyWithoutSuns || (logic->CanUse(RG_SUNS_SONG) && logic->IsAdult)), LOCATION(RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_TOT_LEFTMOST_GOSSIP_STONE, true), LOCATION(RC_TOT_LEFT_CENTER_GOSSIP_STONE, true), diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp index c76119a1465..5d5302657d1 100644 --- a/soh/soh/Enhancements/randomizer/logic.cpp +++ b/soh/soh/Enhancements/randomizer/logic.cpp @@ -595,7 +595,7 @@ namespace Rando { CanLeaveForest = ctx->GetOption(RSK_FOREST).IsNot(RO_FOREST_CLOSED) || IsAdult || DekuTreeClear || ctx->GetOption(RSK_SHUFFLE_INTERIOR_ENTRANCES) || ctx->GetOption(RSK_SHUFFLE_OVERWORLD_ENTRANCES); CanPlantBugs = IsChild && CanUse(RG_BOTTLE_WITH_BUGS); CanRideEpona = IsAdult && Epona && CanUse(RG_EPONAS_SONG); - CanSummonGossipFairyWithoutSuns = CanUse(RG_ZELDAS_LULLABY) || CanUse(RG_EPONAS_SONG) || CanUse(RG_SONG_OF_TIME); + CanSummonGossipFairyWithoutSuns = CanUse(RG_ZELDAS_LULLABY) || CanUse(RG_EPONAS_SONG) || CanUse(RG_SARIAS_SONG) || CanUse(RG_SONG_OF_TIME); CanSummonGossipFairy = CanSummonGossipFairyWithoutSuns || CanUse(RG_SUNS_SONG); Hearts = ctx->GetSaveContext()->healthCapacity / 16; EffectiveHealth = ((Hearts << (2 + DoubleDefense)) >> Multiplier) + ((Hearts << (2 + DoubleDefense)) % (1 << Multiplier) > 0); //Number of half heart hits to die, ranges from 1 to 160 From 16da42ce731514f511073e4ddc3a8c0c77e515c7 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Sat, 7 Sep 2024 22:31:16 -0700 Subject: [PATCH 078/108] Add remaining gossip stone fairies --- .../Enhancements/randomizer/fairy_shuffle.cpp | 3 +- .../Enhancements/randomizer/location_list.cpp | 238 +++++++++++++++++- .../Enhancements/randomizer/randomizerTypes.h | 142 +++++++++++ .../Enhancements/randomizer/randomizer_inf.h | 74 ++++++ 4 files changed, 448 insertions(+), 9 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp index 7bb5cdbb080..ce82f65d37e 100644 --- a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp +++ b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp @@ -73,8 +73,9 @@ void FairyOnActorInitHandler(void* actorRef) { enElf->sohFairyIdentity = { RAND_INF_MAX, GET_ITEM_NONE }; s16 params = (gPlayState->sceneNum == SCENE_GROTTOS) ? Grotto_CurrentGrotto() : 0; if (enElf->fairyFlags & FAIRY_FLAG_BIG) { - params |= 0x8000; + params |= 0x1000; } + if (FairyInitialise(enElf, TWO_ACTOR_PARAMS(params, (s16)enElf->actor.home.pos.z))) { enElf->fairyFlags &= ~(FAIRY_FLAG_TIMED | FAIRY_FLAG_BIG); } diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 57e226c6308..d4b824bae94 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -593,6 +593,80 @@ std::vector Rando::StaticData::overworldLocations = { RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, + RC_DMC_GOSSIP_STONE_FAIRY, + RC_DMC_GOSSIP_STONE_FAIRY_BIG, + RC_DMT_GOSSIP_STONE_FAIRY, + RC_DMT_GOSSIP_STONE_FAIRY_BIG, + RC_COLOSSUS_GOSSIP_STONE_FAIRY, + RC_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, + RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, + RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, + RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, + RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, + RC_GV_GOSSIP_STONE_FAIRY, + RC_GV_GOSSIP_STONE_FAIRY_BIG, + RC_GC_MAZE_GOSSIP_STONE_FAIRY, + RC_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, + RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY, + RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, + RC_GRAVEYARD_GOSSIP_STONE_FAIRY, + RC_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG, + RC_HC_MALON_GOSSIP_STONE_FAIRY, + RC_HC_MALON_GOSSIP_STONE_FAIRY_BIG, + RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, + RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, + RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY, + RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY, + RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG, + RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY, + RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG, + RC_KF_GOSSIP_STONE_FAIRY, + RC_KF_GOSSIP_STONE_FAIRY_BIG, + RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY, + RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_LH_LAB_GOSSIP_STONE_FAIRY, + RC_LH_LAB_GOSSIP_STONE_FAIRY_BIG, + RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY, + RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, + RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, + RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, + RC_LW_GOSSIP_STONE_FAIRY, + RC_LW_GOSSIP_STONE_FAIRY_BIG, + RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY, + RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG, + RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY, + RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG, + RC_SFM_SARIA_GOSSIP_STONE_FAIRY, + RC_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, + RC_ZD_GOSSIP_STONE_FAIRY, + RC_ZD_GOSSIP_STONE_FAIRY_BIG, + RC_ZF_FAIRY_GOSSIP_STONE_FAIRY, + RC_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, + RC_ZF_JABU_GOSSIP_STONE_FAIRY, + RC_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, + RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, + RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, + RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY, + RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG, + RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY, + RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY, + RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY, + RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY, + RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY, + RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY, + RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY, + RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY, + RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, + RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, }; std::vector Rando::StaticData::gossipStoneLocations = { @@ -726,6 +800,80 @@ std::vector Rando::StaticData::overworldFairyLocations = { RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, + RC_DMC_GOSSIP_STONE_FAIRY, + RC_DMC_GOSSIP_STONE_FAIRY_BIG, + RC_DMT_GOSSIP_STONE_FAIRY, + RC_DMT_GOSSIP_STONE_FAIRY_BIG, + RC_COLOSSUS_GOSSIP_STONE_FAIRY, + RC_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, + RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, + RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, + RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, + RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, + RC_GV_GOSSIP_STONE_FAIRY, + RC_GV_GOSSIP_STONE_FAIRY_BIG, + RC_GC_MAZE_GOSSIP_STONE_FAIRY, + RC_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, + RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY, + RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, + RC_GRAVEYARD_GOSSIP_STONE_FAIRY, + RC_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG, + RC_HC_MALON_GOSSIP_STONE_FAIRY, + RC_HC_MALON_GOSSIP_STONE_FAIRY_BIG, + RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, + RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, + RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY, + RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY, + RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG, + RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY, + RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG, + RC_KF_GOSSIP_STONE_FAIRY, + RC_KF_GOSSIP_STONE_FAIRY_BIG, + RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY, + RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_LH_LAB_GOSSIP_STONE_FAIRY, + RC_LH_LAB_GOSSIP_STONE_FAIRY_BIG, + RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY, + RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, + RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, + RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, + RC_LW_GOSSIP_STONE_FAIRY, + RC_LW_GOSSIP_STONE_FAIRY_BIG, + RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY, + RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG, + RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY, + RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG, + RC_SFM_SARIA_GOSSIP_STONE_FAIRY, + RC_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, + RC_ZD_GOSSIP_STONE_FAIRY, + RC_ZD_GOSSIP_STONE_FAIRY_BIG, + RC_ZF_FAIRY_GOSSIP_STONE_FAIRY, + RC_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, + RC_ZF_JABU_GOSSIP_STONE_FAIRY, + RC_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, + RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, + RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, + RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY, + RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG, + RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY, + RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY, + RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY, + RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY, + RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY, + RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY, + RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY, + RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY, + RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, + RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, }; typedef enum { @@ -1759,14 +1907,88 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_DMT_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_DMT_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 0x0601, RAND_INF_DMT_BEAN_SPROUT_FAIRY_2, "Bean Sprout Fairy 2", RHT_DMT_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); locationTable[RC_DMT_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_DMT_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 0x0602, RAND_INF_DMT_BEAN_SPROUT_FAIRY_3, "Bean Sprout Fairy 3", RHT_DMT_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -680), RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, "ToT Left Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x8000, -680), RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, "ToT Left Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -615), RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, "ToT Left Center Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x8000, -615), RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG, "ToT Left Center Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -550), RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, "ToT Right Center Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x8000, -550), RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, "ToT Right Center Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -485), RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, "ToT Right Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x8000, -485), RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, "ToT Right Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -680), RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, "ToT Left Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x1000, -680), RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, "ToT Left Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -615), RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, "ToT Left Center Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x1000, -615), RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG, "ToT Left Center Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -550), RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, "ToT Right Center Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x1000, -550), RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, "ToT Right Center Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -485), RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, "ToT Right Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x1000, -485), RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, "ToT Right Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_DMC_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DMC_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS( 0, 1656), RAND_INF_DMC_GOSSIP_STONE_FAIRY, "Gossip Stone Fairy", RHT_DMC_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DMC_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(0x1000, 1656), RAND_INF_DMC_GOSSIP_STONE_FAIRY_BIG, "Gossip Stone Big Fairy", RHT_DMC_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DMT_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS( 0, -3935), RAND_INF_DMT_GOSSIP_STONE_FAIRY, "Gossip Stone Fairy", RHT_DMT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DMT_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(0x1000, -3935), RAND_INF_DMT_GOSSIP_STONE_FAIRY_BIG, "Gossip Stone Big Fairy", RHT_DMT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_COLOSSUS_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_COLOSSUS_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS( 0, 1320), RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY, "Gossip Stone Fairy", RHT_COLOSSUS_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_COLOSSUS_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS(0x1000, 1320), RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, "Gossip Stone Big Fairy", RHT_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS( 0, -1520), RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, "Gossip Stone Fairy", RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(0x1000, -1520), RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, "Gossip Stone Big Fairy", RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS( 0, -916), RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, "MQ Gossip Stone Fairy", RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(0x1000, -916), RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, "MQ Gossip Stone Big Fairy", RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_GV_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_GV_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS( 0, -2340), RAND_INF_GV_GOSSIP_STONE_FAIRY, "Gossip Stone Fairy", RHT_GV_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GV_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_GV_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(0x1000, -2340), RAND_INF_GV_GOSSIP_STONE_FAIRY_BIG, "Gossip Stone Big Fairy", RHT_GV_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GC_MAZE_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_GC_MAZE_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS( 0, -1265), RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY, "Maze Gossip Stone Fairy", RHT_GC_MAZE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[RC_GC_MAZE_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(0x1000, -1265), RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, "Maze Gossip Stone Big Fairy", RHT_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS( 0, 1496), RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY, "Medigoron Gossip Stone Fairy", RHT_GC_MEDIGORON_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(0x1000, 1496), RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, "Medigoron Gossip Stone Big Fairy", RHT_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[RC_GRAVEYARD_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_GRAVEYARD_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS( 0, -75), RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY, "Gossip Stone Fairy", RHT_GRAVEYARD_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(0x1000, -75), RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG, "Gossip Stone Big Fairy", RHT_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_HC_MALON_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HC_MALON_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS( 0, 3445), RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY, "Malon Gossip Stone Fairy", RHT_HC_MALON_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_HC_MALON_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HC_MALON_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(0x1000, 3445), RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY_BIG, "Malon Gossip Stone Big Fairy", RHT_HC_MALON_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS( 0, 1041), RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, "Rock Wall Gossip Stone Fairy", RHT_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(0x1000, 1041), RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, "Rock Wall Gossip Stone Big Fairy", RHT_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0xC, 735), RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY, "Storms Grotto Gossip Stone Fairy", RHT_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x100C, 735), RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, "Storms Grotto Gossip Stone Big Fairy", RHT_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS( 0, -2230), RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY, "Deku Tree Left Gossip Stone Fairy", RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(0x1000, -2230), RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG, "Deku Tree Left Gossip Stone Big Fairy", RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS( 0, -700), RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY, "Deku Tree Right Gossip Stone Fairy", RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(0x1000, -700), RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG, "Deku Tree Right Gossip Stone Big Fairy", RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KF_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS( 0, -1223), RAND_INF_KF_GOSSIP_STONE_FAIRY, "Gossip Stone Fairy", RHT_KF_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KF_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(0x1000, -1223), RAND_INF_KF_GOSSIP_STONE_FAIRY_BIG, "Gossip Stone Big Fairy", RHT_KF_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x1B, -236), RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY, "Storms Gossip Stone Fairy", RHT_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x101B, -236), RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, "Storms Gossip Stone Big Fairy", RHT_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_LH_LAB_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LH_LAB_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS( 0, 3212), RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY, "Lab Gossip Stone Fairy", RHT_LH_LAB_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[RC_LH_LAB_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LH_LAB_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(0x1000, 3212), RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY_BIG, "Lab Gossip Stone Big Fairy", RHT_LH_LAB_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS( 0, 8395), RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY, "Southeast Gossip Stone Fairy", RHT_LH_SOUTHEAST_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(0x1000, 8395), RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, "Southeast Gossip Stone Big Fairy", RHT_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS( 0, 7984), RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, "Southwest Gossip Stone Fairy", RHT_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(0x1000, 7984), RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, "Southwest Gossip Stone Big Fairy", RHT_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[RC_LW_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LW_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS( 0, 2300), RAND_INF_LW_GOSSIP_STONE_FAIRY, "Gossip Stone Fairy", RHT_LW_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LW_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(0x1000, 2300), RAND_INF_LW_GOSSIP_STONE_FAIRY_BIG, "Gossip Stone Big Fairy", RHT_LW_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS( 0, 1370), RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY, "Maze Lower Gossip Stone Fairy", RHT_SFM_MAZE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS(0x1000, 1370), RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG, "Maze Lower Gossip Stone Big Fairy", RHT_SFM_MAZE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS( 0, 740), RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY, "Maze Upper Gossip Stone Fairy", RHT_SFM_MAZE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS(0x1000, 740), RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG, "Maze Upper Gossip Stone Big Fairy", RHT_SFM_MAZE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_SFM_SARIA_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_SFM_SARIA_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS( 0, -2300), RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY, "Saria Gossip Stone Fairy", RHT_SFM_SARIA_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS(0x1000, -2300), RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, "Saria Gossip Stone Big Fairy", RHT_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_ZD_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZD_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS( 0, -1600), RAND_INF_ZD_GOSSIP_STONE_FAIRY, "Gossip Stone Fairy", RHT_ZD_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZD_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZD_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(0x1000, -1600), RAND_INF_ZD_GOSSIP_STONE_FAIRY_BIG, "Gossip Stone Big Fairy", RHT_ZD_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_FAIRY_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZF_FAIRY_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS( 0, 2205), RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY, "Fairy Gossip Stone Fairy", RHT_ZF_FAIRY_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(0x1000, 2205), RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, "Fairy Gossip Stone Big Fairy", RHT_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_JABU_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZF_JABU_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS( 0, -985), RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY, "Jabu Gossip Stone Fairy", RHT_ZF_JABU_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_JABU_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(0x1000, -985), RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, "Jabu Gossip Stone Big Fairy", RHT_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS( 0, -1070), RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, "Near Grottos Gossip Stone Fairy", RHT_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(0x1000, -1070), RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, "Near Grottos Gossip Stone Big Fairy", RHT_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS( 0, -1650), RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY, "Near Domain Gossip Stone Fairy", RHT_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(0x1000, -1650), RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG, "Near Domain Gossip Stone Big Fairy", RHT_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x11, -357), RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY, "Cow Grotto Gossip Stone Fairy", RHT_HF_COW_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1011, -357), RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG, "Cow Grotto Gossip Stone Big Fairy", RHT_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x10, -236), RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY, "Near Market Gossip Stone Fairy", RHT_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1010, -236), RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG, "Near Market Gossip Stone Big Fairy", RHT_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x14, -236), RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY, "Southeast Gossip Stone Fairy", RHT_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1014, -236), RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG, "Southeast Gossip Stone Big Fairy", RHT_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x13, -236), RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY, "Open Grotto Gossip Stone Fairy", RHT_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1013, -236), RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, "Open Grotto Gossip Stone Big Fairy", RHT_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0xA, -236), RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY, "Open Grotto Gossip Stone Fairy", RHT_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x100A, -236), RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, "Open Grotto Gossip Stone Big Fairy", RHT_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x4, -236), RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY, "Open Grotto Gossip Stone Fairy", RHT_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1004, -236), RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, "Open Grotto Gossip Stone Big Fairy", RHT_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x1A, -236), RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY, "Near Shortcuts Gossip Stone Fairy", RHT_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x101A, -236), RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG, "Near Shortcuts Gossip Stone Big Fairy", RHT_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x8, -236), RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY, "Storms Grotto Gossip Stone Fairy", RHT_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1008, -236), RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, "Storms Grotto Gossip Stone Big Fairy", RHT_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x6, -236), RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, "Upper Grotto Gossip Stone Fairy", RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1006, -236), RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, "Upper Grotto Gossip Stone Big Fairy", RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); // Gossip Stones locationTable[RC_DMC_GOSSIP_STONE] = Location::HintStone(RC_DMC_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 14341, 0x05, "Gossip Stone", {}); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 3a0aecbd780..c51ce459d66 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1754,6 +1754,80 @@ typedef enum { RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, + RC_DMC_GOSSIP_STONE_FAIRY, + RC_DMC_GOSSIP_STONE_FAIRY_BIG, + RC_DMT_GOSSIP_STONE_FAIRY, + RC_DMT_GOSSIP_STONE_FAIRY_BIG, + RC_COLOSSUS_GOSSIP_STONE_FAIRY, + RC_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, + RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, + RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, + RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, + RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, + RC_GV_GOSSIP_STONE_FAIRY, + RC_GV_GOSSIP_STONE_FAIRY_BIG, + RC_GC_MAZE_GOSSIP_STONE_FAIRY, + RC_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, + RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY, + RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, + RC_GRAVEYARD_GOSSIP_STONE_FAIRY, + RC_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG, + RC_HC_MALON_GOSSIP_STONE_FAIRY, + RC_HC_MALON_GOSSIP_STONE_FAIRY_BIG, + RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, + RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, + RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY, + RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY, + RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG, + RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY, + RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG, + RC_KF_GOSSIP_STONE_FAIRY, + RC_KF_GOSSIP_STONE_FAIRY_BIG, + RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY, + RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_LH_LAB_GOSSIP_STONE_FAIRY, + RC_LH_LAB_GOSSIP_STONE_FAIRY_BIG, + RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY, + RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, + RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, + RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, + RC_LW_GOSSIP_STONE_FAIRY, + RC_LW_GOSSIP_STONE_FAIRY_BIG, + RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY, + RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG, + RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY, + RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG, + RC_SFM_SARIA_GOSSIP_STONE_FAIRY, + RC_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, + RC_ZD_GOSSIP_STONE_FAIRY, + RC_ZD_GOSSIP_STONE_FAIRY_BIG, + RC_ZF_FAIRY_GOSSIP_STONE_FAIRY, + RC_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, + RC_ZF_JABU_GOSSIP_STONE_FAIRY, + RC_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, + RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, + RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, + RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY, + RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG, + RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY, + RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY, + RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY, + RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY, + RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY, + RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY, + RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY, + RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY, + RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, + RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, RC_MAX } RandomizerCheck; @@ -3759,6 +3833,74 @@ typedef enum { RHT_DMT_BEAN_SPROUT_FAIRY, RHT_TOT_GOSSIP_STONE_FAIRY, RHT_TOT_GOSSIP_STONE_FAIRY_BIG, + RHT_DMC_GOSSIP_STONE_FAIRY, + RHT_DMC_GOSSIP_STONE_FAIRY_BIG, + RHT_DMT_GOSSIP_STONE_FAIRY, + RHT_DMT_GOSSIP_STONE_FAIRY_BIG, + RHT_COLOSSUS_GOSSIP_STONE_FAIRY, + RHT_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, + RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, + RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, + RHT_GV_GOSSIP_STONE_FAIRY, + RHT_GV_GOSSIP_STONE_FAIRY_BIG, + RHT_GC_MAZE_GOSSIP_STONE_FAIRY, + RHT_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, + RHT_GC_MEDIGORON_GOSSIP_STONE_FAIRY, + RHT_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, + RHT_GRAVEYARD_GOSSIP_STONE_FAIRY, + RHT_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG, + RHT_HC_MALON_GOSSIP_STONE_FAIRY, + RHT_HC_MALON_GOSSIP_STONE_FAIRY_BIG, + RHT_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, + RHT_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, + RHT_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY, + RHT_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY, + RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY_BIG, + RHT_KF_GOSSIP_STONE_FAIRY, + RHT_KF_GOSSIP_STONE_FAIRY_BIG, + RHT_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY, + RHT_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RHT_LH_LAB_GOSSIP_STONE_FAIRY, + RHT_LH_LAB_GOSSIP_STONE_FAIRY_BIG, + RHT_LH_SOUTHEAST_GOSSIP_STONE_FAIRY, + RHT_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, + RHT_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, + RHT_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, + RHT_LW_GOSSIP_STONE_FAIRY, + RHT_LW_GOSSIP_STONE_FAIRY_BIG, + RHT_SFM_MAZE_GOSSIP_STONE_FAIRY, + RHT_SFM_MAZE_GOSSIP_STONE_FAIRY_BIG, + RHT_SFM_SARIA_GOSSIP_STONE_FAIRY, + RHT_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, + RHT_ZD_GOSSIP_STONE_FAIRY, + RHT_ZD_GOSSIP_STONE_FAIRY_BIG, + RHT_ZF_FAIRY_GOSSIP_STONE_FAIRY, + RHT_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, + RHT_ZF_JABU_GOSSIP_STONE_FAIRY, + RHT_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, + RHT_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, + RHT_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, + RHT_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY, + RHT_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG, + RHT_HF_COW_GROTTO_GOSSIP_STONE_FAIRY, + RHT_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RHT_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY, + RHT_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RHT_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY, + RHT_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RHT_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY, + RHT_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RHT_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY, + RHT_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RHT_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY, + RHT_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RHT_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY, + RHT_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RHT_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY, + RHT_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, + RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, RHT_MAX } RandomizerHintTextKey; diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index dbea072c897..ac27e933b6c 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -411,6 +411,80 @@ typedef enum { RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_DMC_GOSSIP_STONE_FAIRY, + RAND_INF_DMC_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_DMT_GOSSIP_STONE_FAIRY, + RAND_INF_DMT_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY, + RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, + RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, + RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_GV_GOSSIP_STONE_FAIRY, + RAND_INF_GV_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY, + RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY, + RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY, + RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY, + RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, + RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY, + RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY, + RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY, + RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_KF_GOSSIP_STONE_FAIRY, + RAND_INF_KF_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY, + RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY, + RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY, + RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, + RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_LW_GOSSIP_STONE_FAIRY, + RAND_INF_LW_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY, + RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY, + RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY, + RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_ZD_GOSSIP_STONE_FAIRY, + RAND_INF_ZD_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY, + RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY, + RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, + RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY, + RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY, + RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY, + RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY, + RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY, + RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY, + RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY, + RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY, + RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY, + RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, + RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, // If you add anything to this list, you need to update the size of randomizerInf in z64save.h to be ceil(RAND_INF_MAX / 16) RAND_INF_MAX, From 4e4fa63c97950d1085c30ab92dac484057b74a4c Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Sun, 8 Sep 2024 22:16:28 -0700 Subject: [PATCH 079/108] Finish gossip stone fairies --- .../randomizer/3drando/item_pool.cpp | 11 +++++++++-- .../location_access/locacc_castle_town.cpp | 6 ++++++ .../location_access/locacc_death_mountain.cpp | 12 ++++++++++++ .../location_access/locacc_dodongos_cavern.cpp | 4 ++++ .../location_access/locacc_gerudo_valley.cpp | 8 ++++++-- .../location_access/locacc_hyrule_field.cpp | 14 ++++++++++++++ .../location_access/locacc_kakariko.cpp | 4 ++++ .../location_access/locacc_lost_woods.cpp | 18 ++++++++++++++++++ .../location_access/locacc_zoras_domain.cpp | 12 ++++++++++++ soh/soh/Enhancements/randomizer/dungeon.cpp | 4 ++++ .../Enhancements/randomizer/location_list.cpp | 4 ---- soh/soh/Enhancements/randomizer/logic.cpp | 2 +- 12 files changed, 90 insertions(+), 9 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index 5cd08230bf5..4b82dfba84f 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -1170,8 +1170,8 @@ void GenerateItemPool() { for (auto rc : Rando::StaticData::overworldFairyLocations) { AddItemToMainPool(GetJunkItem()); } - // 8 extra for Ganon's Castle - for (int i = 0; i < 8; i++) { + // 8 extra for Ganon's Castle + 2 extra for Dodongo's Cavern + for (int i = 0; i < 10; i++) { AddItemToMainPool(GetJunkItem()); } } else { @@ -1197,6 +1197,13 @@ void GenerateItemPool() { ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_7, GetJunkItem(), false, true); ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_8, GetJunkItem(), false, true); } + if (ctx->GetDungeon(Rando::DODONGOS_CAVERN)->IsMQ()) { + ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, GetJunkItem(), false, true); + } else { + ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, GetJunkItem(), false, true); + } } //Scrubsanity diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_castle_town.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_castle_town.cpp index 7200a3e0801..ce175da71a4 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_castle_town.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_castle_town.cpp @@ -97,6 +97,10 @@ void AreaTable_Init_CastleTown() { //Locations LOCATION(RC_HC_MALON_EGG, true), LOCATION(RC_HC_GS_TREE, logic->CanChildAttack), + LOCATION(RC_HC_MALON_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_HC_MALON_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_HC_MALON_GOSSIP_STONE, true), LOCATION(RC_HC_ROCK_WALL_GOSSIP_STONE, true), }, { @@ -134,6 +138,8 @@ void AreaTable_Init_CastleTown() { }, { //Locations LOCATION(RC_HC_GS_STORMS_GROTTO, (logic->CanBlastOrSmash && logic->HookshotOrBoomerang) || (logic->Boomerang && randoCtx->GetTrickOption(RT_HC_STORMS_GS))), + LOCATION(RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY, logic->CanBlastOrSmash && logic->CanSummonGossipFairy), + LOCATION(RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, logic->CanBlastOrSmash && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_HC_STORMS_GROTTO_GOSSIP_STONE, logic->CanBlastOrSmash), }, { //Exits diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp index 3f8036cd4a5..68e47f03f2d 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp @@ -38,6 +38,8 @@ void AreaTable_Init_DeathMountain() { LOCATION(RC_DMT_TRADE_EYEDROPS, logic->IsAdult && logic->Eyedrops), LOCATION(RC_DMT_TRADE_CLAIM_CHECK, logic->IsAdult && logic->ClaimCheck), LOCATION(RC_DMT_GS_FALLING_ROCKS_PATH, logic->IsAdult && logic->AtNight && (logic->CanUse(RG_MEGATON_HAMMER) || randoCtx->GetTrickOption(RT_DMT_UPPER_GS)) && logic->CanGetNightTimeGS), + LOCATION(RC_DMT_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_DMT_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_DMT_GOSSIP_STONE, true), }, { //Exits @@ -67,6 +69,8 @@ void AreaTable_Init_DeathMountain() { //Locations LOCATION(RC_DMT_STORMS_GROTTO_CHEST, true), LOCATION(RC_DMT_STORMS_GROTTO_FISH, logic->HasBottle), + LOCATION(RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_DMT_STORMS_GROTTO_GOSSIP_STONE, true), LOCATION(RC_DMT_STORMS_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives), LOCATION(RC_DMT_STORMS_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives), @@ -103,6 +107,10 @@ void AreaTable_Init_DeathMountain() { LOCATION(RC_GC_GS_BOULDER_MAZE, logic->IsChild && logic->CanBlastOrSmash), LOCATION(RC_GC_GS_CENTER_PLATFORM, logic->CanAdultAttack), LOCATION(RC_GC_MEDIGORON, logic->IsAdult && logic->AdultsWallet && (logic->CanBlastOrSmash || logic->GoronBracelet)), + LOCATION(RC_GC_MAZE_GOSSIP_STONE_FAIRY, (logic->CanBlastOrSmash || logic->CanUse(RG_SILVER_GAUNTLETS)) && logic->CanSummonGossipFairyWithoutSuns), + LOCATION(RC_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, (logic->CanBlastOrSmash || logic->CanUse(RG_SILVER_GAUNTLETS)) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY, (logic->CanBlastOrSmash || logic->GoronBracelet) && logic->CanSummonGossipFairyWithoutSuns), + LOCATION(RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, (logic->CanBlastOrSmash || logic->GoronBracelet) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_GC_MAZE_GOSSIP_STONE, logic->CanBlastOrSmash || logic->CanUse(RG_SILVER_GAUNTLETS)), LOCATION(RC_GC_MEDIGORON_GOSSIP_STONE, logic->CanBlastOrSmash || logic->GoronBracelet), }, { @@ -181,6 +189,8 @@ void AreaTable_Init_DeathMountain() { //Locations LOCATION(RC_DMC_WALL_FREESTANDING_POH, logic->FireTimer >= 16 || logic->Hearts >= 3), LOCATION(RC_DMC_GS_CRATE, (logic->FireTimer >= 8 || logic->Hearts >= 3) && logic->IsChild && logic->CanChildAttack), + LOCATION(RC_DMC_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairyWithoutSuns && logic->HasExplosives && (logic->FireTimer >= 16 || logic->Hearts >= 3)), + LOCATION(RC_DMC_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS) && logic->HasExplosives && (logic->FireTimer >= 16 || logic->Hearts >= 3)), LOCATION(RC_DMC_GOSSIP_STONE, logic->HasExplosives && (logic->FireTimer >= 16 || logic->Hearts >= 3)), }, { //Exits @@ -253,6 +263,8 @@ void AreaTable_Init_DeathMountain() { //Locations LOCATION(RC_DMC_UPPER_GROTTO_CHEST, true), LOCATION(RC_DMC_UPPER_GROTTO_FISH, logic->HasBottle), + LOCATION(RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_DMC_UPPER_GROTTO_GOSSIP_STONE, true), LOCATION(RC_DMC_UPPER_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives), LOCATION(RC_DMC_UPPER_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_dodongos_cavern.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_dodongos_cavern.cpp index 591705e51fc..f195b5cc606 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_dodongos_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_dodongos_cavern.cpp @@ -32,6 +32,8 @@ void AreaTable_Init_DodongosCavern() { //Locations LOCATION(RC_DODONGOS_CAVERN_MAP_CHEST, Here(RR_DODONGOS_CAVERN_LOBBY, []{return logic->CanBlastOrSmash || logic->GoronBracelet;})), LOCATION(RC_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, logic->CanStunDeku || logic->GoronBracelet), + LOCATION(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_DODONGOS_CAVERN_GOSSIP_STONE, Here(RR_DODONGOS_CAVERN_LOBBY, []{return logic->CanBlastOrSmash || logic->GoronBracelet;})), }, { //Exits @@ -232,6 +234,8 @@ void AreaTable_Init_DodongosCavern() { LOCATION(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, logic->CanStunDeku), LOCATION(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, logic->CanStunDeku), LOCATION(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, logic->CanStunDeku), + LOCATION(RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_DODONGOS_CAVERN_GOSSIP_STONE, true), }, { //Exits diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp index 57cb2286b01..2ac35e2ab44 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp @@ -28,10 +28,12 @@ void AreaTable_Init_GerudoValley() { LOCATION(RC_GV_WATERFALL_FREESTANDING_POH, logic->IsChild || logic->Swim),//can use cucco as child LOCATION(RC_GV_GS_BEAN_PATCH, logic->CanPlantBugs && logic->CanChildAttack), LOCATION(RC_GV_COW, logic->IsChild && logic->CanUse(RG_EPONAS_SONG)), - LOCATION(RC_GV_GOSSIP_STONE, true), LOCATION(RC_GV_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_GV_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_GV_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_GV_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_GV_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_GV_GOSSIP_STONE, true), }, { //Exits Entrance(RR_GV_LOWER_STREAM, {[]{return true;}}), @@ -186,10 +188,12 @@ void AreaTable_Init_GerudoValley() { LOCATION(RC_COLOSSUS_GS_BEAN_PATCH, logic->CanPlantBugs && logic->CanChildAttack), LOCATION(RC_COLOSSUS_GS_TREE, logic->IsAdult && logic->HookshotOrBoomerang && logic->AtNight && logic->CanGetNightTimeGS), LOCATION(RC_COLOSSUS_GS_HILL, logic->IsAdult && logic->AtNight && ((CanPlantBean(RR_DESERT_COLOSSUS) && logic->CanAdultAttack) || logic->CanUse(RG_LONGSHOT) || (randoCtx->GetTrickOption(RT_COLOSSUS_GS) && logic->CanUse(RG_HOOKSHOT))) && logic->CanGetNightTimeGS), - LOCATION(RC_COLOSSUS_GOSSIP_STONE, true), LOCATION(RC_COLOSSUS_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_COLOSSUS_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_COLOSSUS_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_COLOSSUS_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_COLOSSUS_GOSSIP_STONE, true), }, { //Exits Entrance(RR_COLOSSUS_GREAT_FAIRY_FOUNTAIN, {[]{return logic->HasExplosives;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp index 352ed05696d..73b53d56ed1 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp @@ -34,6 +34,8 @@ void AreaTable_Init_HyruleField() { //Locations LOCATION(RC_HF_SOUTHEAST_GROTTO_CHEST, true), LOCATION(RC_HF_SOUTHEAST_GROTTO_FISH, logic->HasBottle), + LOCATION(RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE, true), LOCATION(RC_HF_SOUTHEAST_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives), LOCATION(RC_HF_SOUTHEAST_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives), @@ -46,6 +48,8 @@ void AreaTable_Init_HyruleField() { //Locations LOCATION(RC_HF_OPEN_GROTTO_CHEST, true), LOCATION(RC_HF_OPEN_GROTTO_FISH, logic->HasBottle), + LOCATION(RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_HF_OPEN_GROTTO_GOSSIP_STONE, true), LOCATION(RC_HF_OPEN_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives), LOCATION(RC_HF_OPEN_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives), @@ -67,6 +71,8 @@ void AreaTable_Init_HyruleField() { //Locations LOCATION(RC_HF_GS_COW_GROTTO, logic->HasFireSource && logic->HookshotOrBoomerang), LOCATION(RC_HF_COW_GROTTO_COW, logic->HasFireSource && logic->CanUse(RG_EPONAS_SONG)), + LOCATION(RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY, logic->HasFireSource && logic->CanSummonGossipFairy), + LOCATION(RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG, logic->HasFireSource && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_HF_COW_GROTTO_GOSSIP_STONE, logic->HasFireSource), }, { //Exits @@ -77,6 +83,8 @@ void AreaTable_Init_HyruleField() { //Locations LOCATION(RC_HF_NEAR_MARKET_GROTTO_CHEST, true), LOCATION(RC_HF_NEAR_MARKET_GROTTO_FISH, logic->HasBottle), + LOCATION(RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE, true), LOCATION(RC_HF_NEAR_MARKET_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives), LOCATION(RC_HF_NEAR_MARKET_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives), @@ -139,6 +147,12 @@ void AreaTable_Init_HyruleField() { LOCATION(RC_LH_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LH_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LH_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_LH_LAB_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_LH_LAB_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LH_LAB_GOSSIP_STONE, true), LOCATION(RC_LH_SOUTHEAST_GOSSIP_STONE, true), LOCATION(RC_LH_SOUTHWEST_GOSSIP_STONE, true), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp index 5df1b9a5379..18de3f53eed 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp @@ -198,6 +198,8 @@ void AreaTable_Init_Kakariko() { //Locations LOCATION(RC_KAK_OPEN_GROTTO_CHEST, true), LOCATION(RC_KAK_OPEN_GROTTO_FISH, logic->HasBottle), + LOCATION(RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_KAK_OPEN_GROTTO_GOSSIP_STONE, true), LOCATION(RC_KAK_OPEN_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives), LOCATION(RC_KAK_OPEN_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives), @@ -292,6 +294,8 @@ void AreaTable_Init_Kakariko() { EventAccess(&logic->GossipStoneFairy, {[]{return logic->GossipStoneFairy || logic->CanSummonGossipFairyWithoutSuns;}}), }, { //Locations + LOCATION(RC_GRAVEYARD_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairyWithoutSuns), + LOCATION(RC_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_GRAVEYARD_GOSSIP_STONE, true), }, { //Exits diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp index b9c07bfaea3..15babf1a3ae 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp @@ -18,6 +18,8 @@ void AreaTable_Init_LostWoods() { LOCATION(RC_KF_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_KF_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_KF_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_KF_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairyWithoutSuns), + LOCATION(RC_KF_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_KF_GOSSIP_STONE, true), }, { //Exits @@ -40,6 +42,10 @@ void AreaTable_Init_LostWoods() { EventAccess(&logic->ShowedMidoSwordAndShield, {[]{return logic->ShowedMidoSwordAndShield || (logic->IsChild && logic->KokiriSword && logic->DekuShield);}}), }, { //Locations + LOCATION(RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairyWithoutSuns), + LOCATION(RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairyWithoutSuns), + LOCATION(RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE, true), LOCATION(RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE, true), }, { @@ -101,6 +107,8 @@ void AreaTable_Init_LostWoods() { //Locations LOCATION(RC_KF_STORMS_GROTTO_CHEST, true), LOCATION(RC_KF_STORMS_GROTTO_FISH, logic->HasBottle), + LOCATION(RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_KF_STORMS_GROTTO_GOSSIP_STONE, true), LOCATION(RC_KF_STORMS_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives), LOCATION(RC_KF_STORMS_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives), @@ -141,6 +149,8 @@ void AreaTable_Init_LostWoods() { LOCATION(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_LW_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairyWithoutSuns), + LOCATION(RC_LW_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LW_GOSSIP_STONE, true), }, { //Exits @@ -177,6 +187,8 @@ void AreaTable_Init_LostWoods() { //Locations LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_CHEST, true), LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_FISH, logic->HasBottle), + LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE, true), LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives), LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives), @@ -219,6 +231,12 @@ void AreaTable_Init_LostWoods() { LOCATION(RC_SONG_FROM_SARIA, logic->IsChild && logic->ZeldasLetter), LOCATION(RC_SHEIK_IN_FOREST, logic->IsAdult), LOCATION(RC_SFM_GS, logic->IsAdult && logic->HookshotOrBoomerang && logic->AtNight && logic->CanGetNightTimeGS), + LOCATION(RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairyWithoutSuns), + LOCATION(RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairyWithoutSuns), + LOCATION(RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_SFM_SARIA_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairyWithoutSuns), + LOCATION(RC_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_SFM_MAZE_LOWER_GOSSIP_STONE, true), LOCATION(RC_SFM_MAZE_UPPER_GOSSIP_STONE, true), LOCATION(RC_SFM_SARIA_GOSSIP_STONE, true), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp index 61612395371..b9d7aef6669 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp @@ -37,6 +37,10 @@ void AreaTable_Init_ZorasDomain() { LOCATION(RC_ZR_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_ZR_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_ZR_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, true), LOCATION(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, true), }, { @@ -59,6 +63,8 @@ void AreaTable_Init_ZorasDomain() { //Locations LOCATION(RC_ZR_OPEN_GROTTO_CHEST, true), LOCATION(RC_ZR_OPEN_GROTTO_FISH, logic->HasBottle), + LOCATION(RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_ZR_OPEN_GROTTO_GOSSIP_STONE, true), LOCATION(RC_ZR_OPEN_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives), LOCATION(RC_ZR_OPEN_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives), @@ -116,6 +122,8 @@ void AreaTable_Init_ZorasDomain() { LOCATION(RC_ZD_FISH_3, logic->IsChild && logic->HasBottle), LOCATION(RC_ZD_FISH_4, logic->IsChild && logic->HasBottle), LOCATION(RC_ZD_FISH_5, logic->IsChild && logic->HasBottle), + LOCATION(RC_ZD_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairyWithoutSuns), + LOCATION(RC_ZD_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_ZD_GOSSIP_STONE, true), LOCATION(RC_ZD_IN_FRONT_OF_KING_ZORA_BEEHIVE_LEFT, logic->CanBreakUpperBeehives), LOCATION(RC_ZD_IN_FRONT_OF_KING_ZORA_BEEHIVE_RIGHT, logic->CanBreakUpperBeehives), @@ -181,6 +189,10 @@ void AreaTable_Init_ZorasDomain() { LOCATION(RC_ZF_GS_TREE, logic->IsChild), LOCATION(RC_ZF_GS_ABOVE_THE_LOG, logic->IsChild && logic->HookshotOrBoomerang && logic->AtNight && logic->CanGetNightTimeGS), LOCATION(RC_ZF_GS_HIDDEN_CAVE, logic->CanUse(RG_SILVER_GAUNTLETS) && logic->CanBlastOrSmash && logic->HookshotOrBoomerang && logic->IsAdult && logic->AtNight && logic->CanGetNightTimeGS), + LOCATION(RC_ZF_FAIRY_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairyWithoutSuns), + LOCATION(RC_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_ZF_JABU_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairyWithoutSuns), + LOCATION(RC_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_ZF_FAIRY_GOSSIP_STONE, true), LOCATION(RC_ZF_JABU_GOSSIP_STONE, true), }, { diff --git a/soh/soh/Enhancements/randomizer/dungeon.cpp b/soh/soh/Enhancements/randomizer/dungeon.cpp index efc1904070c..ebf1e4ea1c8 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/dungeon.cpp @@ -215,6 +215,8 @@ Dungeons::Dungeons() { RC_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, RC_DODONGOS_CAVERN_GS_BACK_ROOM, RC_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, + RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, + RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, }, { // MQ Locations @@ -233,6 +235,8 @@ Dungeons::Dungeons() { RC_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, RC_DODONGOS_CAVERN_MQ_GS_BACK_AREA, + RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, + RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, }, {}, { diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index d4b824bae94..a29523d840e 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -599,10 +599,6 @@ std::vector Rando::StaticData::overworldLocations = { RC_DMT_GOSSIP_STONE_FAIRY_BIG, RC_COLOSSUS_GOSSIP_STONE_FAIRY, RC_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, - RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, - RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, - RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, - RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, RC_GV_GOSSIP_STONE_FAIRY, RC_GV_GOSSIP_STONE_FAIRY_BIG, RC_GC_MAZE_GOSSIP_STONE_FAIRY, diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp index 5d5302657d1..c76119a1465 100644 --- a/soh/soh/Enhancements/randomizer/logic.cpp +++ b/soh/soh/Enhancements/randomizer/logic.cpp @@ -595,7 +595,7 @@ namespace Rando { CanLeaveForest = ctx->GetOption(RSK_FOREST).IsNot(RO_FOREST_CLOSED) || IsAdult || DekuTreeClear || ctx->GetOption(RSK_SHUFFLE_INTERIOR_ENTRANCES) || ctx->GetOption(RSK_SHUFFLE_OVERWORLD_ENTRANCES); CanPlantBugs = IsChild && CanUse(RG_BOTTLE_WITH_BUGS); CanRideEpona = IsAdult && Epona && CanUse(RG_EPONAS_SONG); - CanSummonGossipFairyWithoutSuns = CanUse(RG_ZELDAS_LULLABY) || CanUse(RG_EPONAS_SONG) || CanUse(RG_SARIAS_SONG) || CanUse(RG_SONG_OF_TIME); + CanSummonGossipFairyWithoutSuns = CanUse(RG_ZELDAS_LULLABY) || CanUse(RG_EPONAS_SONG) || CanUse(RG_SONG_OF_TIME); CanSummonGossipFairy = CanSummonGossipFairyWithoutSuns || CanUse(RG_SUNS_SONG); Hearts = ctx->GetSaveContext()->healthCapacity / 16; EffectiveHealth = ((Hearts << (2 + DoubleDefense)) >> Multiplier) + ((Hearts << (2 + DoubleDefense)) % (1 << Multiplier) > 0); //Number of half heart hits to die, ranges from 1 to 160 From 174554c6e24206f49bfd44f3161720421177cbe0 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Mon, 9 Sep 2024 23:30:19 -0700 Subject: [PATCH 080/108] Add Desert Colossus Oasis --- .../location_access/locacc_gerudo_valley.cpp | 14 ++++++++--- .../Enhancements/randomizer/location_list.cpp | 24 +++++++++++++++++++ .../Enhancements/randomizer/randomizerTypes.h | 9 +++++++ .../Enhancements/randomizer/randomizer_inf.h | 8 +++++++ 4 files changed, 52 insertions(+), 3 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp index 2ac35e2ab44..a3ee37a3258 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp @@ -188,9 +188,17 @@ void AreaTable_Init_GerudoValley() { LOCATION(RC_COLOSSUS_GS_BEAN_PATCH, logic->CanPlantBugs && logic->CanChildAttack), LOCATION(RC_COLOSSUS_GS_TREE, logic->IsAdult && logic->HookshotOrBoomerang && logic->AtNight && logic->CanGetNightTimeGS), LOCATION(RC_COLOSSUS_GS_HILL, logic->IsAdult && logic->AtNight && ((CanPlantBean(RR_DESERT_COLOSSUS) && logic->CanAdultAttack) || logic->CanUse(RG_LONGSHOT) || (randoCtx->GetTrickOption(RT_COLOSSUS_GS) && logic->CanUse(RG_HOOKSHOT))) && logic->CanGetNightTimeGS), - LOCATION(RC_COLOSSUS_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), - LOCATION(RC_COLOSSUS_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), - LOCATION(RC_COLOSSUS_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_COLOSSUS_OASIS_FAIRY_1, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_COLOSSUS_OASIS_FAIRY_2, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_COLOSSUS_OASIS_FAIRY_3, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_COLOSSUS_OASIS_FAIRY_4, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_COLOSSUS_OASIS_FAIRY_5, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_COLOSSUS_OASIS_FAIRY_6, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_COLOSSUS_OASIS_FAIRY_7, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_COLOSSUS_OASIS_FAIRY_8, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_COLOSSUS_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_COLOSSUS_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_COLOSSUS_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_COLOSSUS_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), LOCATION(RC_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_COLOSSUS_GOSSIP_STONE, true), diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index a29523d840e..9f04dd5d4ba 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -553,6 +553,14 @@ std::vector Rando::StaticData::overworldLocations = { RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_6, RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_7, RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_8, + RC_COLOSSUS_OASIS_FAIRY_1, + RC_COLOSSUS_OASIS_FAIRY_2, + RC_COLOSSUS_OASIS_FAIRY_3, + RC_COLOSSUS_OASIS_FAIRY_4, + RC_COLOSSUS_OASIS_FAIRY_5, + RC_COLOSSUS_OASIS_FAIRY_6, + RC_COLOSSUS_OASIS_FAIRY_7, + RC_COLOSSUS_OASIS_FAIRY_8, RC_ZR_BEAN_SPROUT_FAIRY_1, RC_ZR_BEAN_SPROUT_FAIRY_2, @@ -788,6 +796,14 @@ std::vector Rando::StaticData::overworldFairyLocations = { RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_6, RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_7, RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_8, + RC_COLOSSUS_OASIS_FAIRY_1, + RC_COLOSSUS_OASIS_FAIRY_2, + RC_COLOSSUS_OASIS_FAIRY_3, + RC_COLOSSUS_OASIS_FAIRY_4, + RC_COLOSSUS_OASIS_FAIRY_5, + RC_COLOSSUS_OASIS_FAIRY_6, + RC_COLOSSUS_OASIS_FAIRY_7, + RC_COLOSSUS_OASIS_FAIRY_8, RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, @@ -1871,6 +1887,14 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x05, RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, "MQ Scrubs Fairy 6", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x06, RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, "MQ Scrubs Fairy 7", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x07, RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, "MQ Scrubs Fairy 8", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_COLOSSUS_OASIS_FAIRY_1] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_1, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x00, RAND_INF_COLOSSUS_OASIS_FAIRY_1, "Oasis Fairy 1", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_COLOSSUS_OASIS_FAIRY_2] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_2, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x01, RAND_INF_COLOSSUS_OASIS_FAIRY_2, "Oasis Fairy 2", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_COLOSSUS_OASIS_FAIRY_3] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_3, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x02, RAND_INF_COLOSSUS_OASIS_FAIRY_3, "Oasis Fairy 3", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_COLOSSUS_OASIS_FAIRY_4] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_4, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x03, RAND_INF_COLOSSUS_OASIS_FAIRY_4, "Oasis Fairy 4", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_COLOSSUS_OASIS_FAIRY_5] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_5, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x04, RAND_INF_COLOSSUS_OASIS_FAIRY_5, "Oasis Fairy 5", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_COLOSSUS_OASIS_FAIRY_6] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_6, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x05, RAND_INF_COLOSSUS_OASIS_FAIRY_6, "Oasis Fairy 6", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_COLOSSUS_OASIS_FAIRY_7] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_7, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x06, RAND_INF_COLOSSUS_OASIS_FAIRY_7, "Oasis Fairy 7", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_COLOSSUS_OASIS_FAIRY_8] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_8, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x07, RAND_INF_COLOSSUS_OASIS_FAIRY_8, "Oasis Fairy 8", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); locationTable[RC_ZR_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_ZR_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 0x0300, RAND_INF_ZR_BEAN_SPROUT_FAIRY_1, "Bean Sprout Fairy 1", RHT_ZR_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); locationTable[RC_ZR_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_ZR_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 0x0301, RAND_INF_ZR_BEAN_SPROUT_FAIRY_2, "Bean Sprout Fairy 2", RHT_ZR_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index c51ce459d66..2559f450ec0 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1716,6 +1716,14 @@ typedef enum { RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, + RC_COLOSSUS_OASIS_FAIRY_1, + RC_COLOSSUS_OASIS_FAIRY_2, + RC_COLOSSUS_OASIS_FAIRY_3, + RC_COLOSSUS_OASIS_FAIRY_4, + RC_COLOSSUS_OASIS_FAIRY_5, + RC_COLOSSUS_OASIS_FAIRY_6, + RC_COLOSSUS_OASIS_FAIRY_7, + RC_COLOSSUS_OASIS_FAIRY_8, RC_ZR_BEAN_SPROUT_FAIRY_1, RC_ZR_BEAN_SPROUT_FAIRY_2, RC_ZR_BEAN_SPROUT_FAIRY_3, @@ -3821,6 +3829,7 @@ typedef enum { RHT_GF_FAIRY_GROTTO_FAIRY, RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, RHT_GANONS_CASTLE_SCRUBS_FAIRY, + RHT_COLOSSUS_OASIS_FAIRY, RHT_ZR_BEAN_SPROUT_FAIRY, RHT_KF_BEAN_SPROUT_FAIRY, RHT_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY, diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index ac27e933b6c..0ef02d506ab 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -371,6 +371,14 @@ typedef enum { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, + RAND_INF_COLOSSUS_OASIS_FAIRY_1, + RAND_INF_COLOSSUS_OASIS_FAIRY_2, + RAND_INF_COLOSSUS_OASIS_FAIRY_3, + RAND_INF_COLOSSUS_OASIS_FAIRY_4, + RAND_INF_COLOSSUS_OASIS_FAIRY_5, + RAND_INF_COLOSSUS_OASIS_FAIRY_6, + RAND_INF_COLOSSUS_OASIS_FAIRY_7, + RAND_INF_COLOSSUS_OASIS_FAIRY_8, RAND_INF_ZR_BEAN_SPROUT_FAIRY_1, RAND_INF_ZR_BEAN_SPROUT_FAIRY_2, From d5dc2bdf88e106edd9bdc32372cd1ba53f7f97c4 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Mon, 9 Sep 2024 23:35:08 -0700 Subject: [PATCH 081/108] Restrict fairy type Somehow, it was previously possible for Navi to get detected as a randomized fairy and rendered as an item. I was not able to reproduce the behavior, but this should prevent it from happening again. --- soh/soh/Enhancements/randomizer/fairy_shuffle.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp index ce82f65d37e..018f60e524d 100644 --- a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp +++ b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp @@ -21,6 +21,9 @@ void FairyDrawRandomizedItem(EnElf* enElf, PlayState* play) { } bool FairyInitialise(EnElf* fairy, int32_t params) { + if (fairy->actor.params != FAIRY_HEAL_TIMED && fairy->actor.params != FAIRY_HEAL && fairy->actor.params != FAIRY_HEAL_BIG) { + return false; + } s16 sceneNum = gPlayState->sceneNum; if (sceneNum == SCENE_TEMPLE_OF_TIME_EXTERIOR_NIGHT || sceneNum == SCENE_TEMPLE_OF_TIME_EXTERIOR_RUINS) { sceneNum = SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY; From b5037a0856032d9f7a5b5b852c2dff0e510d793d Mon Sep 17 00:00:00 2001 From: Malkierian Date: Tue, 10 Sep 2024 12:42:57 -0700 Subject: [PATCH 082/108] Gui window rework (#4307) * Converted all GuiWindows to the new separate Begin/End format in current LUS except InputViewer, CheckTracker, ItemTracker and Modals. * Setup Check, Entrance, Item trackers and Input Viewer to override `Draw()` to bypass the ImGui Begin and End, as they're not intended to go in the modern menu. * Cleanup. --- soh/soh/Enhancements/audio/AudioEditor.cpp | 7 - soh/soh/Enhancements/controls/InputViewer.cpp | 656 ++++++++-------- soh/soh/Enhancements/controls/InputViewer.h | 1 + .../cosmetics/CosmeticsEditor.cpp | 7 - .../Enhancements/debugger/MessageViewer.cpp | 6 - soh/soh/Enhancements/debugger/actorViewer.cpp | 8 - soh/soh/Enhancements/debugger/colViewer.cpp | 7 - .../Enhancements/debugger/debugSaveEditor.cpp | 8 - soh/soh/Enhancements/debugger/dlViewer.cpp | 11 - soh/soh/Enhancements/debugger/valueViewer.cpp | 8 - soh/soh/Enhancements/gameplaystats.cpp | 8 - .../Enhancements/randomizer/randomizer.cpp | 8 - .../randomizer/randomizer_check_tracker.cpp | 26 +- .../randomizer/randomizer_check_tracker.h | 1 + .../randomizer_entrance_tracker.cpp | 11 +- .../randomizer/randomizer_entrance_tracker.h | 1 + .../randomizer/randomizer_item_tracker.cpp | 18 +- .../randomizer/randomizer_item_tracker.h | 1 + .../resolution-editor/ResolutionEditor.cpp | 718 +++++++++--------- soh/soh/SohGui.cpp | 28 +- soh/soh/SohModals.cpp | 9 + soh/soh/SohModals.h | 1 + 22 files changed, 748 insertions(+), 801 deletions(-) diff --git a/soh/soh/Enhancements/audio/AudioEditor.cpp b/soh/soh/Enhancements/audio/AudioEditor.cpp index 3b0c2bb123b..a9fefbe7197 100644 --- a/soh/soh/Enhancements/audio/AudioEditor.cpp +++ b/soh/soh/Enhancements/audio/AudioEditor.cpp @@ -424,12 +424,6 @@ void AudioEditor::InitElement() { void AudioEditor::DrawElement() { AudioCollection::Instance->InitializeShufflePool(); - ImGui::SetNextWindowSize(ImVec2(820, 630), ImGuiCond_FirstUseEver); - if (!ImGui::Begin("Audio Editor", &mIsVisible)) { - ImGui::End(); - return; - } - float buttonSegments = ImGui::GetContentRegionAvail().x / 4; if (ImGui::Button("Randomize All Groups", ImVec2(buttonSegments, 30.0f))) { AudioEditor_RandomizeAll(); @@ -700,7 +694,6 @@ void AudioEditor::DrawElement() { ImGui::EndTabBar(); } - ImGui::End(); } std::vector allTypes = { SEQ_BGM_WORLD, SEQ_BGM_EVENT, SEQ_BGM_BATTLE, SEQ_OCARINA, SEQ_FANFARE, SEQ_INSTRUMENT, SEQ_SFX, SEQ_VOICE }; diff --git a/soh/soh/Enhancements/controls/InputViewer.cpp b/soh/soh/Enhancements/controls/InputViewer.cpp index 106a08b53e7..d4bd5405c77 100644 --- a/soh/soh/Enhancements/controls/InputViewer.cpp +++ b/soh/soh/Enhancements/controls/InputViewer.cpp @@ -61,6 +61,15 @@ void InputViewer::RenderButton(std::string btnTexture, std::string btnOutlineTex } } +void InputViewer::Draw() { + if (!IsVisible()) { + return; + } + DrawElement(); + // Sync up the IsVisible flag if it was changed by ImGui + SyncVisibilityConsoleVariable(); +} + void InputViewer::DrawElement() { if (CVarGetInteger(CVAR_WINDOW("InputViewer"), 0)) { static bool sButtonTexturesLoaded = false; @@ -73,60 +82,60 @@ void InputViewer::DrawElement() { Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("R-Btn", "textures/buttons/RBtn.png"); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Z-Btn", "textures/buttons/ZBtn.png"); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Start-Btn", - "textures/buttons/StartBtn.png"); + "textures/buttons/StartBtn.png"); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("C-Left", "textures/buttons/CLeft.png"); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("C-Right", "textures/buttons/CRight.png"); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("C-Up", "textures/buttons/CUp.png"); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("C-Down", "textures/buttons/CDown.png"); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Analog-Stick", - "textures/buttons/AnalogStick.png"); + "textures/buttons/AnalogStick.png"); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Dpad-Left", - "textures/buttons/DPadLeft.png"); + "textures/buttons/DPadLeft.png"); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Dpad-Right", - "textures/buttons/DPadRight.png"); + "textures/buttons/DPadRight.png"); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Dpad-Up", "textures/buttons/DPadUp.png"); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Dpad-Down", - "textures/buttons/DPadDown.png"); + "textures/buttons/DPadDown.png"); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Modifier-1", "textures/buttons/Mod1.png"); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Modifier-2", "textures/buttons/Mod2.png"); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Right-Stick", - "textures/buttons/RightStick.png"); + "textures/buttons/RightStick.png"); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("A-Btn Outline", - "textures/buttons/ABtnOutline.png"); + "textures/buttons/ABtnOutline.png"); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("B-Btn Outline", - "textures/buttons/BBtnOutline.png"); + "textures/buttons/BBtnOutline.png"); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("L-Btn Outline", - "textures/buttons/LBtnOutline.png"); + "textures/buttons/LBtnOutline.png"); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("R-Btn Outline", - "textures/buttons/RBtnOutline.png"); + "textures/buttons/RBtnOutline.png"); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Z-Btn Outline", - "textures/buttons/ZBtnOutline.png"); + "textures/buttons/ZBtnOutline.png"); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Start-Btn Outline", - "textures/buttons/StartBtnOutline.png"); + "textures/buttons/StartBtnOutline.png"); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("C-Left Outline", - "textures/buttons/CLeftOutline.png"); + "textures/buttons/CLeftOutline.png"); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("C-Right Outline", - "textures/buttons/CRightOutline.png"); + "textures/buttons/CRightOutline.png"); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("C-Up Outline", - "textures/buttons/CUpOutline.png"); + "textures/buttons/CUpOutline.png"); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("C-Down Outline", - "textures/buttons/CDownOutline.png"); + "textures/buttons/CDownOutline.png"); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Analog-Stick Outline", - "textures/buttons/AnalogStickOutline.png"); + "textures/buttons/AnalogStickOutline.png"); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Dpad-Left Outline", - "textures/buttons/DPadLeftOutline.png"); + "textures/buttons/DPadLeftOutline.png"); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Dpad-Right Outline", - "textures/buttons/DPadRightOutline.png"); + "textures/buttons/DPadRightOutline.png"); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Dpad-Up Outline", - "textures/buttons/DPadUpOutline.png"); + "textures/buttons/DPadUpOutline.png"); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Dpad-Down Outline", - "textures/buttons/DPadDownOutline.png"); + "textures/buttons/DPadDownOutline.png"); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Modifier-1 Outline", - "textures/buttons/Mod1Outline.png"); + "textures/buttons/Mod1Outline.png"); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Modifier-2 Outline", - "textures/buttons/Mod2Outline.png"); + "textures/buttons/Mod2Outline.png"); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Right-Stick Outline", - "textures/buttons/RightStickOutline.png"); + "textures/buttons/RightStickOutline.png"); sButtonTexturesLoaded = true; } @@ -147,12 +156,12 @@ void InputViewer::DrawElement() { ImGui::SetNextWindowSize( ImVec2(scaledBGSize.x + 20, scaledBGSize.y + - (showAnalogAngles ? ImGui::CalcTextSize("X").y : 0) * scale * - CVarGetFloat(CVAR_INPUT_VIEWER("AnalogAngles.Scale"), 1.0f) + - 20)); + (showAnalogAngles ? ImGui::CalcTextSize("X").y : 0) * scale * + CVarGetFloat(CVAR_INPUT_VIEWER("AnalogAngles.Scale"), 1.0f) + + 20)); ImGui::SetNextWindowContentSize( ImVec2(scaledBGSize.x, scaledBGSize.y + (showAnalogAngles ? 15 : 0) * scale * - CVarGetFloat(CVAR_INPUT_VIEWER("AnalogAngles.Scale"), 1.0f))); + CVarGetFloat(CVAR_INPUT_VIEWER("AnalogAngles.Scale"), 1.0f))); ImGui::SetNextWindowPos( ImVec2(mainPos.x + size.x - scaledBGSize.x - 30, mainPos.y + size.y - scaledBGSize.y - 30), ImGuiCond_FirstUseEver); @@ -163,8 +172,8 @@ void InputViewer::DrawElement() { OSContPad* pads = Ship::Context::GetInstance()->GetControlDeck()->GetPads(); ImGuiWindowFlags windowFlags = ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoScrollbar | - ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoBackground | - ImGuiWindowFlags_NoFocusOnAppearing; + ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoBackground | + ImGuiWindowFlags_NoFocusOnAppearing; if (!CVarGetInteger(CVAR_INPUT_VIEWER("EnableDragging"), 1)) { windowFlags |= ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoMove; @@ -187,17 +196,17 @@ void InputViewer::DrawElement() { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("B-Btn", "B-Btn Outline", pads[0].button & BTN_B, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("BBtnOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("BBtnOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } if (CVarGetInteger(CVAR_INPUT_VIEWER("ABtn"), 1)) { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("A-Btn", "A-Btn Outline", pads[0].button & BTN_A, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("ABtnOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("ABtnOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } // C buttons @@ -205,33 +214,33 @@ void InputViewer::DrawElement() { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("C-Up", "C-Up Outline", pads[0].button & BTN_CUP, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("CUpOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("CUpOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } if (CVarGetInteger(CVAR_INPUT_VIEWER("CLeft"), 1)) { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("C-Left", "C-Left Outline", pads[0].button & BTN_CLEFT, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("CLeftOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("CLeftOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } if (CVarGetInteger(CVAR_INPUT_VIEWER("CRight"), 1)) { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("C-Right", "C-Right Outline", pads[0].button & BTN_CRIGHT, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("CRightOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("CRightOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } if (CVarGetInteger(CVAR_INPUT_VIEWER("CDown"), 1)) { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("C-Down", "C-Down Outline", pads[0].button & BTN_CDOWN, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("CDownOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("CDownOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } // L/R/Z @@ -239,25 +248,25 @@ void InputViewer::DrawElement() { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("L-Btn", "L-Btn Outline", pads[0].button & BTN_L, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("LBtnOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("LBtnOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } if (CVarGetInteger(CVAR_INPUT_VIEWER("RBtn"), 1)) { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("R-Btn", "R-Btn Outline", pads[0].button & BTN_R, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("RBtnOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("RBtnOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } if (CVarGetInteger(CVAR_INPUT_VIEWER("ZBtn"), 1)) { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("Z-Btn", "Z-Btn Outline", pads[0].button & BTN_Z, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("ZBtnOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("ZBtnOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } // Start @@ -265,9 +274,9 @@ void InputViewer::DrawElement() { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("Start-Btn", "Start-Btn Outline", pads[0].button & BTN_START, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("StartBtnOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("StartBtnOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } // Dpad @@ -275,27 +284,27 @@ void InputViewer::DrawElement() { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("Dpad-Left", "Dpad-Left Outline", pads[0].button & BTN_DLEFT, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("DpadOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("DpadOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("Dpad-Right", "Dpad-Right Outline", pads[0].button & BTN_DRIGHT, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("DpadOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("DpadOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("Dpad-Up", "Dpad-Up Outline", pads[0].button & BTN_DUP, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("DpadOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("DpadOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("Dpad-Down", "Dpad-Down Outline", pads[0].button & BTN_DDOWN, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("DpadOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("DpadOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } // Modifier 1 @@ -303,18 +312,18 @@ void InputViewer::DrawElement() { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("Modifier-1", "Modifier-1 Outline", pads[0].button & BTN_MODIFIER1, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("Mod1OutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("Mod1OutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } // Modifier 2 if (CVarGetInteger(CVAR_INPUT_VIEWER("Mod2"), 0)) { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("Modifier-2", "Modifier-2 Outline", pads[0].button & BTN_MODIFIER2, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("Mod2OutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("Mod2OutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } const bool analogStickIsInDeadzone = !pads[0].stick_x && !pads[0].stick_y; @@ -339,9 +348,9 @@ void InputViewer::DrawElement() { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos( ImVec2(aPos.x + maxStickDistance * ((float)(pads[0].stick_x) / MAX_AXIS_RANGE) * scale, - aPos.y - maxStickDistance * ((float)(pads[0].stick_y) / MAX_AXIS_RANGE) * scale)); + aPos.y - maxStickDistance * ((float)(pads[0].stick_y) / MAX_AXIS_RANGE) * scale)); ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName("Analog-Stick"), - scaledBGSize, ImVec2(0, 0), ImVec2(1.0f, 1.0f), ImVec4(255, 255, 255, 255)); + scaledBGSize, ImVec2(0, 0), ImVec2(1.0f, 1.0f), ImVec4(255, 255, 255, 255)); } // Right Stick @@ -363,15 +372,15 @@ void InputViewer::DrawElement() { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos( ImVec2(aPos.x + maxRightStickDistance * ((float)(pads[0].right_stick_x) / MAX_AXIS_RANGE) * scale, - aPos.y - maxRightStickDistance * ((float)(pads[0].right_stick_y) / MAX_AXIS_RANGE) * scale)); + aPos.y - maxRightStickDistance * ((float)(pads[0].right_stick_y) / MAX_AXIS_RANGE) * scale)); ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName("Right-Stick"), - scaledBGSize, ImVec2(0, 0), ImVec2(1.0f, 1.0f), ImVec4(255, 255, 255, 255)); + scaledBGSize, ImVec2(0, 0), ImVec2(1.0f, 1.0f), ImVec4(255, 255, 255, 255)); } // Analog stick angle text if (showAnalogAngles) { ImGui::SetCursorPos(ImVec2(aPos.x + 10 + CVarGetInteger(CVAR_INPUT_VIEWER("AnalogAngles.Offset"), 0) * scale, - scaledBGSize.y + aPos.y + 10)); + scaledBGSize.y + aPos.y + 10)); // Scale font with input viewer scale float oldFontScale = ImGui::GetFont()->Scale; ImGui::GetFont()->Scale *= scale * CVarGetFloat(CVAR_INPUT_VIEWER("AnalogAngles.Scale"), 1.0f); @@ -393,14 +402,16 @@ void InputViewer::DrawElement() { ImGui::PushStyleColor( ImGuiCol_Text, color2Vec(CVarGetColor(CVAR_INPUT_VIEWER("AnalogAngles.Range1.Color"), vec2Color(range1Color)))); - } else if (CVarGetInteger(CVAR_INPUT_VIEWER("AnalogAngles.Range2.Enabled"), 0) && - (rSquared >= (range2Min * range2Min)) && (rSquared < (range2Max * range2Max))) { + } + else if (CVarGetInteger(CVAR_INPUT_VIEWER("AnalogAngles.Range2.Enabled"), 0) && + (rSquared >= (range2Min * range2Min)) && (rSquared < (range2Max * range2Max))) { ImGui::PushStyleColor( ImGuiCol_Text, color2Vec(CVarGetColor(CVAR_INPUT_VIEWER("AnalogAngles.Range2.Color"), vec2Color(range2Color)))); - } else { + } + else { ImGui::PushStyleColor(ImGuiCol_Text, color2Vec(CVarGetColor(CVAR_INPUT_VIEWER("AnalogAngles.TextColor"), - vec2Color(textColor)))); + vec2Color(textColor)))); } // Render text @@ -425,257 +436,250 @@ InputViewerSettingsWindow::~InputViewerSettingsWindow() { } void InputViewerSettingsWindow::DrawElement() { - ImGui::SetNextWindowSize(ImVec2(500, 525), ImGuiCond_FirstUseEver); - - if (ImGui::Begin("Input Viewer Settings", &mIsVisible, ImGuiWindowFlags_HorizontalScrollbar)) { - - // gInputViewer.Scale - UIWidgets::EnhancementSliderFloat("Input Viewer Scale: %.2f", "##Input", CVAR_INPUT_VIEWER("Scale"), 0.1f, 5.0f, "", - 1.0f, false, true); - UIWidgets::Tooltip("Sets the on screen size of the input viewer"); - - // gInputViewer.EnableDragging - UIWidgets::EnhancementCheckbox("Enable Dragging", CVAR_INPUT_VIEWER("EnableDragging"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); + // gInputViewer.Scale + UIWidgets::EnhancementSliderFloat("Input Viewer Scale: %.2f", "##Input", CVAR_INPUT_VIEWER("Scale"), 0.1f, 5.0f, "", + 1.0f, false, true); + UIWidgets::Tooltip("Sets the on screen size of the input viewer"); + + // gInputViewer.EnableDragging + UIWidgets::EnhancementCheckbox("Enable Dragging", CVAR_INPUT_VIEWER("EnableDragging"), false, "", + UIWidgets::CheckboxGraphics::Checkmark, true); + + UIWidgets::PaddedSeparator(true, true); + + // gInputViewer.ShowBackground + UIWidgets::EnhancementCheckbox("Show Background Layer", CVAR_INPUT_VIEWER("ShowBackground"), false, "", + UIWidgets::CheckboxGraphics::Checkmark, true); + + UIWidgets::PaddedSeparator(true, true); + + if (ImGui::CollapsingHeader("Buttons")) { + + // gInputViewer.ButtonOutlineMode + UIWidgets::PaddedText("Button Outlines/Backgrounds", true, false); + UIWidgets::EnhancementCombobox( + CVAR_INPUT_VIEWER("ButtonOutlineMode"), buttonOutlineOptions, BUTTON_OUTLINE_NOT_PRESSED, + !CVarGetInteger(CVAR_INPUT_VIEWER("UseGlobalButtonOutlineMode"), 1), "", + CVarGetInteger(CVAR_INPUT_VIEWER("ButtonOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + UIWidgets::Tooltip( + "Sets the desired visibility behavior for the button outline/background layers. Useful for " + "custom input viewers."); + + // gInputViewer.UseGlobalButtonOutlineMode + UIWidgets::EnhancementCheckbox("Use for all buttons", CVAR_INPUT_VIEWER("UseGlobalButtonOutlineMode"), false, "", + UIWidgets::CheckboxGraphics::Checkmark, true); + + UIWidgets::PaddedSeparator(); + + bool useIndividualOutlines = !CVarGetInteger(CVAR_INPUT_VIEWER("UseGlobalButtonOutlineMode"), 1); + + // gInputViewer.ABtn + UIWidgets::EnhancementCheckbox("Show A-Button Layers", CVAR_INPUT_VIEWER("ABtn"), false, "", + UIWidgets::CheckboxGraphics::Checkmark, true); + if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("ABtn"), 1)) { + ImGui::Indent(); + UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("ABtnOutlineMode"), buttonOutlineOptionsVerbose, + BUTTON_OUTLINE_NOT_PRESSED); + ImGui::Unindent(); + } + // gInputViewer.BBtn + UIWidgets::EnhancementCheckbox("Show B-Button Layers", CVAR_INPUT_VIEWER("BBtn"), false, "", + UIWidgets::CheckboxGraphics::Checkmark, true); + if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("BBtn"), 1)) { + ImGui::Indent(); + UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("BBtnOutlineMode"), buttonOutlineOptionsVerbose, + BUTTON_OUTLINE_NOT_PRESSED); + ImGui::Unindent(); + } + // gInputViewer.CUp + UIWidgets::EnhancementCheckbox("Show C-Up Layers", CVAR_INPUT_VIEWER("CUp"), false, "", + UIWidgets::CheckboxGraphics::Checkmark, true); + if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("CUp"), 1)) { + ImGui::Indent(); + UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("CUpOutlineMode"), buttonOutlineOptionsVerbose, + BUTTON_OUTLINE_NOT_PRESSED); + ImGui::Unindent(); + } + // gInputViewer.CRight + UIWidgets::EnhancementCheckbox("Show C-Right Layers", CVAR_INPUT_VIEWER("CRight"), false, "", + UIWidgets::CheckboxGraphics::Checkmark, true); + if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("CRight"), 1)) { + ImGui::Indent(); + UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("CRightOutlineMode"), buttonOutlineOptionsVerbose, + BUTTON_OUTLINE_NOT_PRESSED); + ImGui::Unindent(); + } + // gInputViewer.CDown + UIWidgets::EnhancementCheckbox("Show C-Down Layers", CVAR_INPUT_VIEWER("CDown"), false, "", + UIWidgets::CheckboxGraphics::Checkmark, true); + if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("CDown"), 1)) { + ImGui::Indent(); + UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("CDownOutlineMode"), buttonOutlineOptionsVerbose, + BUTTON_OUTLINE_NOT_PRESSED); + ImGui::Unindent(); + } + // gInputViewer.CLeft + UIWidgets::EnhancementCheckbox("Show C-Left Layers", CVAR_INPUT_VIEWER("CLeft"), false, "", + UIWidgets::CheckboxGraphics::Checkmark, true); + if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("CLeft"), 1)) { + ImGui::Indent(); + UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("CLeftOutlineMode"), buttonOutlineOptionsVerbose, + BUTTON_OUTLINE_NOT_PRESSED); + ImGui::Unindent(); + } + // gInputViewer.LBtn + UIWidgets::EnhancementCheckbox("Show L-Button Layers", CVAR_INPUT_VIEWER("LBtn"), false, "", + UIWidgets::CheckboxGraphics::Checkmark, true); + if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("LBtn"), 1)) { + ImGui::Indent(); + UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("LBtnOutlineMode"), buttonOutlineOptionsVerbose, + BUTTON_OUTLINE_NOT_PRESSED); + ImGui::Unindent(); + } + // gInputViewer.RBtn + UIWidgets::EnhancementCheckbox("Show R-Button Layers", CVAR_INPUT_VIEWER("RBtn"), false, "", + UIWidgets::CheckboxGraphics::Checkmark, true); + if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("RBtn"), 1)) { + ImGui::Indent(); + UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("RBtnOutlineMode"), buttonOutlineOptionsVerbose, + BUTTON_OUTLINE_NOT_PRESSED); + ImGui::Unindent(); + } + // gInputViewer.ZBtn + UIWidgets::EnhancementCheckbox("Show Z-Button Layers", CVAR_INPUT_VIEWER("ZBtn"), false, "", + UIWidgets::CheckboxGraphics::Checkmark, true); + if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("ZBtn"), 1)) { + ImGui::Indent(); + UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("ZBtnOutlineMode"), buttonOutlineOptionsVerbose, + BUTTON_OUTLINE_NOT_PRESSED); + ImGui::Unindent(); + } + // gInputViewer.StartBtn + UIWidgets::EnhancementCheckbox("Show Start Button Layers", CVAR_INPUT_VIEWER("StartBtn"), false, "", + UIWidgets::CheckboxGraphics::Checkmark, true); + if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("StartBtn"), 1)) { + ImGui::Indent(); + UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("StartBtnOutlineMode"), buttonOutlineOptionsVerbose, + BUTTON_OUTLINE_NOT_PRESSED); + ImGui::Unindent(); + } + // gInputViewer.Dpad + UIWidgets::EnhancementCheckbox("Show D-Pad Layers", CVAR_INPUT_VIEWER("Dpad"), false, "", + UIWidgets::CheckboxGraphics::Checkmark, false); + if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("Dpad"), 0)) { + ImGui::Indent(); + UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("DpadOutlineMode"), buttonOutlineOptionsVerbose, + BUTTON_OUTLINE_NOT_PRESSED); + ImGui::Unindent(); + } + // gInputViewer.Mod1 + UIWidgets::EnhancementCheckbox("Show Modifier Button 1 Layers", CVAR_INPUT_VIEWER("Mod1"), false, "", + UIWidgets::CheckboxGraphics::Checkmark, false); + if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("Mod1"), 0)) { + ImGui::Indent(); + UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("Mod1OutlineMode"), buttonOutlineOptionsVerbose, + BUTTON_OUTLINE_NOT_PRESSED); + ImGui::Unindent(); + } + // gInputViewer.Mod2 + UIWidgets::EnhancementCheckbox("Show Modifier Button 2 Layers", CVAR_INPUT_VIEWER("Mod2"), false, "", + UIWidgets::CheckboxGraphics::Checkmark, false); + if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("Mod2"), 0)) { + ImGui::Indent(); + UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("Mod2OutlineMode"), buttonOutlineOptionsVerbose, + BUTTON_OUTLINE_NOT_PRESSED); + ImGui::Unindent(); + } UIWidgets::PaddedSeparator(true, true); + } - // gInputViewer.ShowBackground - UIWidgets::EnhancementCheckbox("Show Background Layer", CVAR_INPUT_VIEWER("ShowBackground"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); - + if (ImGui::CollapsingHeader("Analog Stick")) { + // gInputViewer.AnalogStick.VisibilityMode + UIWidgets::PaddedText("Analog Stick Visibility", true, false); + UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("AnalogStick.VisibilityMode"), stickModeOptions, + STICK_MODE_ALWAYS_SHOWN); + UIWidgets::Tooltip( + "Determines the conditions under which the moving layer of the analog stick texture is visible."); + + // gInputViewer.AnalogStick.OutlineMode + UIWidgets::PaddedText("Analog Stick Outline/Background Visibility", true, false); + UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("AnalogStick.OutlineMode"), stickModeOptions, + STICK_MODE_ALWAYS_SHOWN); + UIWidgets::Tooltip( + "Determines the conditions under which the analog stick outline/background texture is visible."); + + // gInputViewer.AnalogStick.Movement + UIWidgets::EnhancementSliderInt("Analog Stick Movement: %dpx", "##AnalogMovement", + CVAR_INPUT_VIEWER("AnalogStick.Movement"), 0, 200, "", 12, true); + UIWidgets::Tooltip( + "Sets the distance to move the analog stick in the input viewer. Useful for custom input viewers."); UIWidgets::PaddedSeparator(true, true); + } - if (ImGui::CollapsingHeader("Buttons")) { - - // gInputViewer.ButtonOutlineMode - UIWidgets::PaddedText("Button Outlines/Backgrounds", true, false); - UIWidgets::EnhancementCombobox( - CVAR_INPUT_VIEWER("ButtonOutlineMode"), buttonOutlineOptions, BUTTON_OUTLINE_NOT_PRESSED, - !CVarGetInteger(CVAR_INPUT_VIEWER("UseGlobalButtonOutlineMode"), 1), "", - CVarGetInteger(CVAR_INPUT_VIEWER("ButtonOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); - UIWidgets::Tooltip( - "Sets the desired visibility behavior for the button outline/background layers. Useful for " - "custom input viewers."); - - // gInputViewer.UseGlobalButtonOutlineMode - UIWidgets::EnhancementCheckbox("Use for all buttons", CVAR_INPUT_VIEWER("UseGlobalButtonOutlineMode"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); - - UIWidgets::PaddedSeparator(); - - bool useIndividualOutlines = !CVarGetInteger(CVAR_INPUT_VIEWER("UseGlobalButtonOutlineMode"), 1); - - // gInputViewer.ABtn - UIWidgets::EnhancementCheckbox("Show A-Button Layers", CVAR_INPUT_VIEWER("ABtn"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); - if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("ABtn"), 1)) { - ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("ABtnOutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); - ImGui::Unindent(); - } - // gInputViewer.BBtn - UIWidgets::EnhancementCheckbox("Show B-Button Layers", CVAR_INPUT_VIEWER("BBtn"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); - if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("BBtn"), 1)) { - ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("BBtnOutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); - ImGui::Unindent(); - } - // gInputViewer.CUp - UIWidgets::EnhancementCheckbox("Show C-Up Layers", CVAR_INPUT_VIEWER("CUp"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); - if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("CUp"), 1)) { - ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("CUpOutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); - ImGui::Unindent(); - } - // gInputViewer.CRight - UIWidgets::EnhancementCheckbox("Show C-Right Layers", CVAR_INPUT_VIEWER("CRight"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); - if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("CRight"), 1)) { - ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("CRightOutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); - ImGui::Unindent(); - } - // gInputViewer.CDown - UIWidgets::EnhancementCheckbox("Show C-Down Layers", CVAR_INPUT_VIEWER("CDown"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); - if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("CDown"), 1)) { - ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("CDownOutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); - ImGui::Unindent(); - } - // gInputViewer.CLeft - UIWidgets::EnhancementCheckbox("Show C-Left Layers", CVAR_INPUT_VIEWER("CLeft"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); - if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("CLeft"), 1)) { - ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("CLeftOutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); - ImGui::Unindent(); - } - // gInputViewer.LBtn - UIWidgets::EnhancementCheckbox("Show L-Button Layers", CVAR_INPUT_VIEWER("LBtn"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); - if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("LBtn"), 1)) { - ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("LBtnOutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); - ImGui::Unindent(); - } - // gInputViewer.RBtn - UIWidgets::EnhancementCheckbox("Show R-Button Layers", CVAR_INPUT_VIEWER("RBtn"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); - if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("RBtn"), 1)) { - ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("RBtnOutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); - ImGui::Unindent(); - } - // gInputViewer.ZBtn - UIWidgets::EnhancementCheckbox("Show Z-Button Layers", CVAR_INPUT_VIEWER("ZBtn"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); - if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("ZBtn"), 1)) { - ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("ZBtnOutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); - ImGui::Unindent(); - } - // gInputViewer.StartBtn - UIWidgets::EnhancementCheckbox("Show Start Button Layers", CVAR_INPUT_VIEWER("StartBtn"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); - if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("StartBtn"), 1)) { - ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("StartBtnOutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); - ImGui::Unindent(); - } - // gInputViewer.Dpad - UIWidgets::EnhancementCheckbox("Show D-Pad Layers", CVAR_INPUT_VIEWER("Dpad"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, false); - if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("Dpad"), 0)) { - ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("DpadOutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); - ImGui::Unindent(); - } - // gInputViewer.Mod1 - UIWidgets::EnhancementCheckbox("Show Modifier Button 1 Layers", CVAR_INPUT_VIEWER("Mod1"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, false); - if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("Mod1"), 0)) { - ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("Mod1OutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); - ImGui::Unindent(); - } - // gInputViewer.Mod2 - UIWidgets::EnhancementCheckbox("Show Modifier Button 2 Layers", CVAR_INPUT_VIEWER("Mod2"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, false); - if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("Mod2"), 0)) { - ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("Mod2OutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); - ImGui::Unindent(); - } - - UIWidgets::PaddedSeparator(true, true); - } - - if (ImGui::CollapsingHeader("Analog Stick")) { - // gInputViewer.AnalogStick.VisibilityMode - UIWidgets::PaddedText("Analog Stick Visibility", true, false); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("AnalogStick.VisibilityMode"), stickModeOptions, - STICK_MODE_ALWAYS_SHOWN); - UIWidgets::Tooltip( - "Determines the conditions under which the moving layer of the analog stick texture is visible."); - - // gInputViewer.AnalogStick.OutlineMode - UIWidgets::PaddedText("Analog Stick Outline/Background Visibility", true, false); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("AnalogStick.OutlineMode"), stickModeOptions, - STICK_MODE_ALWAYS_SHOWN); - UIWidgets::Tooltip( - "Determines the conditions under which the analog stick outline/background texture is visible."); + if (ImGui::CollapsingHeader("Additional (\"Right\") Stick")) { + // gInputViewer.RightStick.VisibilityMode + UIWidgets::PaddedText("Right Stick Visibility", true, false); + UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("RightStick.VisibilityMode"), stickModeOptions, + STICK_MODE_HIDDEN_IN_DEADZONE); + UIWidgets::Tooltip( + "Determines the conditions under which the moving layer of the right stick texture is visible."); + + // gInputViewer.RightStick.OutlineMode + UIWidgets::PaddedText("Right Stick Outline/Background Visibility", true, false); + UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("RightStick.OutlineMode"), stickModeOptions, + STICK_MODE_HIDDEN_IN_DEADZONE); + UIWidgets::Tooltip( + "Determines the conditions under which the right stick outline/background texture is visible."); + + // gInputViewer.RightStick.Movement + UIWidgets::EnhancementSliderInt("Right Stick Movement: %dpx", "##RightMovement", + CVAR_INPUT_VIEWER("RightStick.Movement"), 0, 200, "", 7, true); + UIWidgets::Tooltip( + "Sets the distance to move the right stick in the input viewer. Useful for custom input viewers."); + UIWidgets::PaddedSeparator(true, true); + } - // gInputViewer.AnalogStick.Movement - UIWidgets::EnhancementSliderInt("Analog Stick Movement: %dpx", "##AnalogMovement", - CVAR_INPUT_VIEWER("AnalogStick.Movement"), 0, 200, "", 12, true); - UIWidgets::Tooltip( - "Sets the distance to move the analog stick in the input viewer. Useful for custom input viewers."); + if (ImGui::CollapsingHeader("Analog Angle Values")) { + // gAnalogAngles + UIWidgets::EnhancementCheckbox("Show Analog Stick Angle Values", CVAR_INPUT_VIEWER("AnalogAngles.Enabled")); + UIWidgets::Tooltip("Displays analog stick angle values in the input viewer"); + if (CVarGetInteger(CVAR_INPUT_VIEWER("AnalogAngles.Enabled"), 0)) { + // gInputViewer.AnalogAngles.TextColor + if (ImGui::ColorEdit4("Text Color", (float*)&textColor)) { + CVarSetColor(CVAR_INPUT_VIEWER("AnalogAngles.TextColor"), vec2Color(textColor)); + } + // gAnalogAngleScale + UIWidgets::EnhancementSliderFloat("Angle Text Scale: %.2f%%", "##AnalogAngleScale", + CVAR_INPUT_VIEWER("AnalogAngles.Scale"), 0.1f, 5.0f, "", 1.0f, true, true); + // gInputViewer.AnalogAngles.Offset + UIWidgets::EnhancementSliderInt("Angle Text Offset: %dpx", "##AnalogAngleOffset", + CVAR_INPUT_VIEWER("AnalogAngles.Offset"), 0, 400, "", 0, true); UIWidgets::PaddedSeparator(true, true); - } - - if (ImGui::CollapsingHeader("Additional (\"Right\") Stick")) { - // gInputViewer.RightStick.VisibilityMode - UIWidgets::PaddedText("Right Stick Visibility", true, false); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("RightStick.VisibilityMode"), stickModeOptions, - STICK_MODE_HIDDEN_IN_DEADZONE); - UIWidgets::Tooltip( - "Determines the conditions under which the moving layer of the right stick texture is visible."); - - // gInputViewer.RightStick.OutlineMode - UIWidgets::PaddedText("Right Stick Outline/Background Visibility", true, false); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("RightStick.OutlineMode"), stickModeOptions, - STICK_MODE_HIDDEN_IN_DEADZONE); + // gInputViewer.AnalogAngles.Range1.Enabled + UIWidgets::EnhancementCheckbox("Highlight ESS Position", CVAR_INPUT_VIEWER("AnalogAngles.Range1.Enabled")); UIWidgets::Tooltip( - "Determines the conditions under which the right stick outline/background texture is visible."); - - // gInputViewer.RightStick.Movement - UIWidgets::EnhancementSliderInt("Right Stick Movement: %dpx", "##RightMovement", - CVAR_INPUT_VIEWER("RightStick.Movement"), 0, 200, "", 7, true); - UIWidgets::Tooltip( - "Sets the distance to move the right stick in the input viewer. Useful for custom input viewers."); - UIWidgets::PaddedSeparator(true, true); - } - - if (ImGui::CollapsingHeader("Analog Angle Values")) { - // gAnalogAngles - UIWidgets::EnhancementCheckbox("Show Analog Stick Angle Values", CVAR_INPUT_VIEWER("AnalogAngles.Enabled")); - UIWidgets::Tooltip("Displays analog stick angle values in the input viewer"); - if (CVarGetInteger(CVAR_INPUT_VIEWER("AnalogAngles.Enabled"), 0)) { - // gInputViewer.AnalogAngles.TextColor - if (ImGui::ColorEdit4("Text Color", (float*)&textColor)) { - CVarSetColor(CVAR_INPUT_VIEWER("AnalogAngles.TextColor"), vec2Color(textColor)); - } - // gAnalogAngleScale - UIWidgets::EnhancementSliderFloat("Angle Text Scale: %.2f%%", "##AnalogAngleScale", - CVAR_INPUT_VIEWER("AnalogAngles.Scale"), 0.1f, 5.0f, "", 1.0f, true, true); - // gInputViewer.AnalogAngles.Offset - UIWidgets::EnhancementSliderInt("Angle Text Offset: %dpx", "##AnalogAngleOffset", - CVAR_INPUT_VIEWER("AnalogAngles.Offset"), 0, 400, "", 0, true); - UIWidgets::PaddedSeparator(true, true); - // gInputViewer.AnalogAngles.Range1.Enabled - UIWidgets::EnhancementCheckbox("Highlight ESS Position", CVAR_INPUT_VIEWER("AnalogAngles.Range1.Enabled")); - UIWidgets::Tooltip( - "Highlights the angle value text when the analog stick is in ESS position (on flat ground)"); - if (CVarGetInteger(CVAR_INPUT_VIEWER("AnalogAngles.Range1.Enabled"), 0)) { - // gInputViewer.AnalogAngles.Range1.Color - if (ImGui::ColorEdit4("ESS Color", (float*)&range1Color)) { - CVarSetColor(CVAR_INPUT_VIEWER("AnalogAngles.Range1.Color"), vec2Color(range1Color)); - } + "Highlights the angle value text when the analog stick is in ESS position (on flat ground)"); + if (CVarGetInteger(CVAR_INPUT_VIEWER("AnalogAngles.Range1.Enabled"), 0)) { + // gInputViewer.AnalogAngles.Range1.Color + if (ImGui::ColorEdit4("ESS Color", (float*)&range1Color)) { + CVarSetColor(CVAR_INPUT_VIEWER("AnalogAngles.Range1.Color"), vec2Color(range1Color)); } + } - UIWidgets::PaddedSeparator(true, true); - // gInputViewer.AnalogAngles.Range2.Enabled - UIWidgets::EnhancementCheckbox("Highlight Walking Speed Angles", - CVAR_INPUT_VIEWER("AnalogAngles.Range2.Enabled")); - UIWidgets::Tooltip("Highlights the angle value text when the analog stick is at an angle that would " - "produce a walking speed (on flat ground)\n\n" - "Useful for 1.0 Empty Jumpslash Quick Put Away"); - if (CVarGetInteger(CVAR_INPUT_VIEWER("AnalogAngles.Range2.Enabled"), 0)) { - // gInputViewer.AnalogAngles.Range2.Color - if (ImGui::ColorEdit4("Walking Speed Color", (float*)&range2Color)) { - CVarSetColor(CVAR_INPUT_VIEWER("AnalogAngles.Range2.Color"), vec2Color(range2Color)); - } + UIWidgets::PaddedSeparator(true, true); + // gInputViewer.AnalogAngles.Range2.Enabled + UIWidgets::EnhancementCheckbox("Highlight Walking Speed Angles", + CVAR_INPUT_VIEWER("AnalogAngles.Range2.Enabled")); + UIWidgets::Tooltip("Highlights the angle value text when the analog stick is at an angle that would " + "produce a walking speed (on flat ground)\n\n" + "Useful for 1.0 Empty Jumpslash Quick Put Away"); + if (CVarGetInteger(CVAR_INPUT_VIEWER("AnalogAngles.Range2.Enabled"), 0)) { + // gInputViewer.AnalogAngles.Range2.Color + if (ImGui::ColorEdit4("Walking Speed Color", (float*)&range2Color)) { + CVarSetColor(CVAR_INPUT_VIEWER("AnalogAngles.Range2.Color"), vec2Color(range2Color)); } } } - - ImGui::End(); } } diff --git a/soh/soh/Enhancements/controls/InputViewer.h b/soh/soh/Enhancements/controls/InputViewer.h index b4d6413e16a..a4b1cc44fce 100644 --- a/soh/soh/Enhancements/controls/InputViewer.h +++ b/soh/soh/Enhancements/controls/InputViewer.h @@ -21,6 +21,7 @@ class InputViewer : public Ship::GuiWindow { public: using GuiWindow::GuiWindow; + void Draw() override; void InitElement() override {}; void DrawElement() override; void UpdateElement() override {}; diff --git a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp index 4badd827973..b0e81c16ca4 100644 --- a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp +++ b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp @@ -1687,12 +1687,6 @@ static const char* colorSchemes[2] = { }; void CosmeticsEditorWindow::DrawElement() { - ImGui::SetNextWindowSize(ImVec2(550, 520), ImGuiCond_FirstUseEver); - if (!ImGui::Begin("Cosmetics Editor", &mIsVisible)) { - ImGui::End(); - return; - } - ImGui::Text("Color Scheme"); ImGui::SameLine(); UIWidgets::EnhancementCombobox(CVAR_COSMETIC("DefaultColorScheme"), colorSchemes, COLORSCHEME_N64); @@ -1811,7 +1805,6 @@ void CosmeticsEditorWindow::DrawElement() { } ImGui::EndTabBar(); } - ImGui::End(); } void RegisterOnLoadGameHook() { diff --git a/soh/soh/Enhancements/debugger/MessageViewer.cpp b/soh/soh/Enhancements/debugger/MessageViewer.cpp index a9a6b613e91..46c596e9c37 100644 --- a/soh/soh/Enhancements/debugger/MessageViewer.cpp +++ b/soh/soh/Enhancements/debugger/MessageViewer.cpp @@ -20,11 +20,6 @@ void MessageViewer::InitElement() { } void MessageViewer::DrawElement() { - ImGui::SetNextWindowSize(ImVec2(520, 600), ImGuiCond_FirstUseEver); - if (!ImGui::Begin("Custom Message Debugger", &mIsVisible, ImGuiWindowFlags_NoFocusOnAppearing)) { - ImGui::End(); - return; - } ImGui::Text("Table ID"); ImGui::SameLine(); ImGui::InputText("##TableID", mTableIdBuf, MAX_STRING_SIZE, ImGuiInputTextFlags_CallbackCharFilter, UIWidgets::TextFilters::FilterAlphaNum); @@ -74,7 +69,6 @@ void MessageViewer::DrawElement() { if (ImGui::Button("Display Message##CustomMessage")) { mDisplayCustomMessageClicked = true; } - ImGui::End(); // ReSharper restore CppDFAUnreachableCode } diff --git a/soh/soh/Enhancements/debugger/actorViewer.cpp b/soh/soh/Enhancements/debugger/actorViewer.cpp index 3e4d271a827..84ecd5ff0ea 100644 --- a/soh/soh/Enhancements/debugger/actorViewer.cpp +++ b/soh/soh/Enhancements/debugger/actorViewer.cpp @@ -925,12 +925,6 @@ void ActorViewer_AddTagForAllActors() { } void ActorViewerWindow::DrawElement() { - ImGui::SetNextWindowSize(ImVec2(520, 600), ImGuiCond_FirstUseEver); - if (!ImGui::Begin("Actor Viewer", &mIsVisible, ImGuiWindowFlags_NoFocusOnAppearing)) { - ImGui::End(); - return; - } - static Actor* display; static Actor empty{}; static Actor* fetch = NULL; @@ -1235,8 +1229,6 @@ void ActorViewerWindow::DrawElement() { actors.clear(); } } - - ImGui::End(); } void ActorViewerWindow::InitElement() { diff --git a/soh/soh/Enhancements/debugger/colViewer.cpp b/soh/soh/Enhancements/debugger/colViewer.cpp index 3b5b7aa4758..8ce5f8b501a 100644 --- a/soh/soh/Enhancements/debugger/colViewer.cpp +++ b/soh/soh/Enhancements/debugger/colViewer.cpp @@ -53,11 +53,6 @@ static std::vector sphereVtx; // Draws the ImGui window for the collision viewer void ColViewerWindow::DrawElement() { - ImGui::SetNextWindowSize(ImVec2(520, 600), ImGuiCond_FirstUseEver); - if (!ImGui::Begin("Collision Viewer", &mIsVisible, ImGuiWindowFlags_NoFocusOnAppearing)) { - ImGui::End(); - return; - } UIWidgets::EnhancementCheckbox("Enabled", CVAR_DEVELOPER_TOOLS("ColViewer.Enabled")); UIWidgets::LabeledRightAlignedEnhancementCombobox("Scene", CVAR_DEVELOPER_TOOLS("ColViewer.Scene"), ColRenderSettingNames, COLVIEW_DISABLED); @@ -95,8 +90,6 @@ void ColViewerWindow::DrawElement() { } else { UIWidgets::InsertHelpHoverText(colorHelpText); } - - ImGui::End(); } // Calculates the normal for a triangle at the 3 specified points diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp index daf08894251..a29174331a9 100644 --- a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp @@ -1747,12 +1747,6 @@ void DrawPlayerTab() { } void SaveEditorWindow::DrawElement() { - ImGui::SetNextWindowSize(ImVec2(520, 600), ImGuiCond_FirstUseEver); - if (!ImGui::Begin("Save Editor", &mIsVisible, ImGuiWindowFlags_NoFocusOnAppearing)) { - ImGui::End(); - return; - } - if (ImGui::BeginTabBar("SaveContextTabBar", ImGuiTabBarFlags_NoCloseWithMiddleMouseButton)) { if (ImGui::BeginTabItem("Info")) { DrawInfoTab(); @@ -1786,8 +1780,6 @@ void SaveEditorWindow::DrawElement() { ImGui::EndTabBar(); } - - ImGui::End(); } void SaveEditorWindow::InitElement() { diff --git a/soh/soh/Enhancements/debugger/dlViewer.cpp b/soh/soh/Enhancements/debugger/dlViewer.cpp index 790f426dfb6..42b005a8c2d 100644 --- a/soh/soh/Enhancements/debugger/dlViewer.cpp +++ b/soh/soh/Enhancements/debugger/dlViewer.cpp @@ -90,12 +90,6 @@ void PerformDisplayListSearch() { } void DLViewerWindow::DrawElement() { - ImGui::SetNextWindowSize(ImVec2(520, 600), ImGuiCond_FirstUseEver); - if (!ImGui::Begin("Display List Viewer", &mIsVisible, ImGuiWindowFlags_NoFocusOnAppearing)) { - ImGui::End(); - return; - } - // Debounce the search field as listing otr files is expensive if (ImGui::InputText("Search Display Lists", searchString, ARRAY_COUNT(searchString))) { doSearch = true; @@ -122,7 +116,6 @@ void DLViewerWindow::DrawElement() { } if (activeDisplayList == "") { - ImGui::End(); return; } @@ -131,7 +124,6 @@ void DLViewerWindow::DrawElement() { if (res->GetInitData()->Type != static_cast(LUS::ResourceType::DisplayList)) { ImGui::Text("Resource type is not a Display List. Please choose another."); - ImGui::End(); return; } @@ -325,11 +317,8 @@ void DLViewerWindow::DrawElement() { } } catch (const std::exception& e) { ImGui::Text("Error displaying DL instructions."); - ImGui::End(); return; } - - ImGui::End(); } void DLViewerWindow::InitElement() { diff --git a/soh/soh/Enhancements/debugger/valueViewer.cpp b/soh/soh/Enhancements/debugger/valueViewer.cpp index 97bf8516403..c2b27c79dc0 100644 --- a/soh/soh/Enhancements/debugger/valueViewer.cpp +++ b/soh/soh/Enhancements/debugger/valueViewer.cpp @@ -102,12 +102,6 @@ extern "C" void ValueViewer_Draw(GfxPrint* printer) { } void ValueViewerWindow::DrawElement() { - ImGui::SetNextWindowSize(ImVec2(520, 600), ImGuiCond_FirstUseEver); - if (!ImGui::Begin("Value Viewer", &mIsVisible, ImGuiWindowFlags_NoFocusOnAppearing)) { - ImGui::End(); - return; - } - UIWidgets::PaddedEnhancementCheckbox("Enable Printing", CVAR_DEVELOPER_TOOLS("ValueViewerEnablePrinting")); ImGui::BeginGroup(); @@ -212,8 +206,6 @@ void ValueViewerWindow::DrawElement() { } ImGui::EndGroup(); } - - ImGui::End(); } void ValueViewerWindow::InitElement() { diff --git a/soh/soh/Enhancements/gameplaystats.cpp b/soh/soh/Enhancements/gameplaystats.cpp index 93cb672e3f3..82a4b3b6e17 100644 --- a/soh/soh/Enhancements/gameplaystats.cpp +++ b/soh/soh/Enhancements/gameplaystats.cpp @@ -625,12 +625,6 @@ void DrawGameplayStatsOptionsTab() { } void GameplayStatsWindow::DrawElement() { - ImGui::SetNextWindowSize(ImVec2(480, 550), ImGuiCond_FirstUseEver); - if (!ImGui::Begin("Gameplay Stats", &mIsVisible, ImGuiWindowFlags_NoFocusOnAppearing)) { - ImGui::End(); - return; - } - DrawGameplayStatsHeader(); if (ImGui::BeginTabBar("Stats", ImGuiTabBarFlags_NoCloseWithMiddleMouseButton)) { @@ -654,8 +648,6 @@ void GameplayStatsWindow::DrawElement() { } ImGui::Text("Note: Gameplay stats are saved to the current file and will be\nlost if you quit without saving."); - - ImGui::End(); } void InitStats(bool isDebug) { gSaveContext.sohStats.heartPieces = isDebug ? 8 : 0; diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 5ea7293eb38..487348c9db7 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -3137,13 +3137,6 @@ void RandomizerSettingsWindow::DrawElement() { static int maxKeyringCount; static bool disableGFKeyring = false; - - ImGui::SetNextWindowSize(ImVec2(920, 600), ImGuiCond_FirstUseEver); - if (!ImGui::Begin("Randomizer Editor", &mIsVisible, ImGuiWindowFlags_NoFocusOnAppearing)) { - ImGui::End(); - return; - } - bool disableEditingRandoSettings = CVarGetInteger(CVAR_GENERAL("RandoGenerating"), 0) || CVarGetInteger(CVAR_GENERAL("OnFileSelectNameEntry"), 0); if (disableEditingRandoSettings) { UIWidgets::DisableComponent(ImGui::GetStyle().Alpha * 0.5f); @@ -5284,7 +5277,6 @@ void RandomizerSettingsWindow::DrawElement() { if (disableEditingRandoSettings) { UIWidgets::ReEnableComponent(""); } - ImGui::End(); } CustomMessage Randomizer::GetWarpSongMessage(u16 textId, bool mysterious) { diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index 02952a05278..508cc5e425e 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -867,9 +867,16 @@ void UpdateCheck(uint32_t check, RandomizerCheckTrackerData data) { UpdateOrdering(area); } -void CheckTrackerWindow::DrawElement() { - ImGui::SetNextWindowSize(ImVec2(400, 540), ImGuiCond_FirstUseEver); +void CheckTrackerWindow::Draw() { + if (!IsVisible()) { + return; + } + DrawElement(); + // Sync up the IsVisible flag if it was changed by ImGui + SyncVisibilityConsoleVariable(); +} +void CheckTrackerWindow::DrawElement() { if (CVarGetInteger(CVAR_TRACKER_CHECK("WindowType"), TRACKER_WINDOW_WINDOW) == TRACKER_WINDOW_FLOATING) { if (CVarGetInteger(CVAR_TRACKER_CHECK("ShowOnlyPaused"), 0) && (gPlayState == nullptr || gPlayState->pauseCtx.state == 0)) { return; @@ -880,14 +887,16 @@ void CheckTrackerWindow::DrawElement() { int comboButton2Mask = buttons[CVarGetInteger(CVAR_TRACKER_CHECK("ComboButton2"), TRACKER_COMBO_BUTTON_R)]; OSContPad* trackerButtonsPressed = Ship::Context::GetInstance()->GetControlDeck()->GetPads(); bool comboButtonsHeld = trackerButtonsPressed != nullptr && - trackerButtonsPressed[0].button & comboButton1Mask && - trackerButtonsPressed[0].button & comboButton2Mask; + trackerButtonsPressed[0].button & comboButton1Mask && + trackerButtonsPressed[0].button & comboButton2Mask; if (!comboButtonsHeld) { return; } } } + ImGui::SetNextWindowSize(ImVec2(400, 540), ImGuiCond_FirstUseEver); + BeginFloatWindows("Check Tracker", mIsVisible, ImGuiWindowFlags_NoScrollbar); if (!GameInteractor::IsSaveLoaded() || !initialized) { @@ -1601,14 +1610,8 @@ static const char* windowType[] = { "Floating", "Window" }; static const char* displayType[] = { "Always", "Combo Button Hold" }; static const char* buttonStrings[] = { "A Button", "B Button", "C-Up", "C-Down", "C-Left", "C-Right", "L Button", "Z Button", "R Button", "Start", "D-Up", "D-Down", "D-Left", "D-Right" }; -void CheckTrackerSettingsWindow::DrawElement() { - ImGui::SetNextWindowSize(ImVec2(600, 375), ImGuiCond_FirstUseEver); - - if (!ImGui::Begin("Check Tracker Settings", &mIsVisible, ImGuiWindowFlags_NoFocusOnAppearing)) { - ImGui::End(); - return; - } +void CheckTrackerSettingsWindow::DrawElement() { ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, { 8.0f, 8.0f }); ImGui::BeginTable("CheckTrackerSettingsTable", 2, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV); ImGui::TableSetupColumn("General settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); @@ -1668,7 +1671,6 @@ void CheckTrackerSettingsWindow::DrawElement() { ImGui::PopStyleVar(1); ImGui::EndTable(); - ImGui::End(); } void CheckTrackerWindow::InitElement() { diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h index be1ae441c0d..b1fab2a21eb 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h @@ -21,6 +21,7 @@ class CheckTrackerSettingsWindow : public Ship::GuiWindow { class CheckTrackerWindow : public Ship::GuiWindow { public: using GuiWindow::GuiWindow; + void Draw() override; ~CheckTrackerWindow() {}; protected: diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp index 31d92165708..dbf06f4ce5c 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp @@ -636,7 +636,17 @@ void InitEntranceTrackingData() { SortEntranceListByType(destListSortedByType, 1); } +void EntranceTrackerWindow::Draw() { + if (!IsVisible()) { + return; + } + DrawElement(); + // Sync up the IsVisible flag if it was changed by ImGui + SyncVisibilityConsoleVariable(); +} + void EntranceTrackerWindow::DrawElement() { + // Begin tracker settings ImGui::SetNextWindowSize(ImVec2(600, 375), ImGuiCond_FirstUseEver); if (!ImGui::Begin("Entrance Tracker", &mIsVisible, ImGuiWindowFlags_NoFocusOnAppearing)) { @@ -644,7 +654,6 @@ void EntranceTrackerWindow::DrawElement() { return; } - // Begin tracker settings ImGui::SetNextItemOpen(false, ImGuiCond_Once); if (ImGui::TreeNode("Tracker Settings")) { // Reduce indentation from the tree node for the table diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.h b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.h index 87d73605833..e20aef76fa3 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.h +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.h @@ -89,6 +89,7 @@ class EntranceTrackerWindow : public Ship::GuiWindow { public: using GuiWindow::GuiWindow; + void Draw() override; void InitElement() override; void DrawElement() override; void UpdateElement() override {}; diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index 5fd158d8f66..98633d597f0 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -1006,6 +1006,15 @@ void ItemTrackerLoadFile() { } } +void ItemTrackerWindow::Draw() { + if (!IsVisible()) { + return; + } + DrawElement(); + // Sync up the IsVisible flag if it was changed by ImGui + SyncVisibilityConsoleVariable(); +} + void ItemTrackerWindow::DrawElement() { UpdateVectors(); @@ -1122,13 +1131,6 @@ static const char* displayTypes[3] = { "Hidden", "Main Window", "Separate" }; static const char* extendedDisplayTypes[4] = { "Hidden", "Main Window", "Misc Window", "Separate" }; void ItemTrackerSettingsWindow::DrawElement() { - ImGui::SetNextWindowSize(ImVec2(733, 472), ImGuiCond_FirstUseEver); - - if (!ImGui::Begin("Item Tracker Settings", &mIsVisible, ImGuiWindowFlags_NoFocusOnAppearing)) { - ImGui::End(); - return; - } - ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, { 8.0f, 8.0f }); ImGui::BeginTable("itemTrackerSettingsTable", 2, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV); ImGui::TableSetupColumn("General settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); @@ -1255,8 +1257,6 @@ void ItemTrackerSettingsWindow::DrawElement() { ImGui::PopStyleVar(1); ImGui::EndTable(); - - ImGui::End(); } void ItemTrackerWindow::InitElement() { diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.h b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.h index cae869c5438..3293912594c 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.h +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.h @@ -42,6 +42,7 @@ class ItemTrackerSettingsWindow : public Ship::GuiWindow { class ItemTrackerWindow : public Ship::GuiWindow { public: using GuiWindow::GuiWindow; + void Draw() override; protected: void InitElement() override; diff --git a/soh/soh/Enhancements/resolution-editor/ResolutionEditor.cpp b/soh/soh/Enhancements/resolution-editor/ResolutionEditor.cpp index f7eea08737b..21d99194ef7 100644 --- a/soh/soh/Enhancements/resolution-editor/ResolutionEditor.cpp +++ b/soh/soh/Enhancements/resolution-editor/ResolutionEditor.cpp @@ -59,424 +59,420 @@ void AdvancedResolutionSettingsWindow::InitElement() { } void AdvancedResolutionSettingsWindow::DrawElement() { - ImGui::SetNextWindowSize(ImVec2(497, 599), ImGuiCond_FirstUseEver); - if (ImGui::Begin("Advanced Resolution Settings", &mIsVisible)) { - // Initialise update flags. - bool update[3]; - for (uint8_t i = 0; i < sizeof(update); i++) - update[i] = false; - - // Initialise integer scale bounds. - short max_integerScaleFactor = default_maxIntegerScaleFactor; // default value, which may or may not get - // overridden depending on viewport res - - short integerScale_maximumBounds = 1; // can change when window is resized - // This is mostly just for UX purposes, as Fit Automatically logic is part of LUS. - if (((float)gfx_current_game_window_viewport.width / gfx_current_game_window_viewport.height) > - ((float)gfx_current_dimensions.width / gfx_current_dimensions.height)) { - // Scale to window height - integerScale_maximumBounds = gfx_current_game_window_viewport.height / gfx_current_dimensions.height; - } else { - // Scale to window width - integerScale_maximumBounds = gfx_current_game_window_viewport.width / gfx_current_dimensions.width; - } - // Lower-clamping maximum bounds value to 1 is no-longer necessary as that's accounted for in LUS. - // Letting it go below 1 in this Editor will even allow for checking if screen bounds are being exceeded. - if (default_maxIntegerScaleFactor < integerScale_maximumBounds) { - max_integerScaleFactor = - integerScale_maximumBounds + CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.ExceedBoundsBy", 0); - } + // Initialise update flags. + bool update[3]; + for (uint8_t i = 0; i < sizeof(update); i++) + update[i] = false; + + // Initialise integer scale bounds. + short max_integerScaleFactor = default_maxIntegerScaleFactor; // default value, which may or may not get + // overridden depending on viewport res + + short integerScale_maximumBounds = 1; // can change when window is resized + // This is mostly just for UX purposes, as Fit Automatically logic is part of LUS. + if (((float)gfx_current_game_window_viewport.width / gfx_current_game_window_viewport.height) > + ((float)gfx_current_dimensions.width / gfx_current_dimensions.height)) { + // Scale to window height + integerScale_maximumBounds = gfx_current_game_window_viewport.height / gfx_current_dimensions.height; + } else { + // Scale to window width + integerScale_maximumBounds = gfx_current_game_window_viewport.width / gfx_current_dimensions.width; + } + // Lower-clamping maximum bounds value to 1 is no-longer necessary as that's accounted for in LUS. + // Letting it go below 1 in this Editor will even allow for checking if screen bounds are being exceeded. + if (default_maxIntegerScaleFactor < integerScale_maximumBounds) { + max_integerScaleFactor = + integerScale_maximumBounds + CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.ExceedBoundsBy", 0); + } - // Combo List defaults - static int item_aspectRatio = CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".UIComboItem.AspectRatio", 3); - static int item_pixelCount = CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".UIComboItem.PixelCount", default_pixelCount); - // Stored Values for non-UIWidgets elements - static float aspectRatioX = - CVarGetFloat(CVAR_PREFIX_ADVANCED_RESOLUTION ".AspectRatioX", aspectRatioPresetsX[item_aspectRatio]); - static float aspectRatioY = - CVarGetFloat(CVAR_PREFIX_ADVANCED_RESOLUTION ".AspectRatioY", aspectRatioPresetsY[item_aspectRatio]); - static int verticalPixelCount = - CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".VerticalPixelCount", pixelCountPresets[item_pixelCount]); - // Additional settings - static bool showHorizontalResField = false; - static int horizontalPixelCount = (verticalPixelCount / aspectRatioY) * aspectRatioX; - // Disabling flags - const bool disabled_everything = !CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".Enabled", 0); - const bool disabled_pixelCount = !CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".VerticalResolutionToggle", 0); + // Combo List defaults + static int item_aspectRatio = CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".UIComboItem.AspectRatio", 3); + static int item_pixelCount = CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".UIComboItem.PixelCount", default_pixelCount); + // Stored Values for non-UIWidgets elements + static float aspectRatioX = + CVarGetFloat(CVAR_PREFIX_ADVANCED_RESOLUTION ".AspectRatioX", aspectRatioPresetsX[item_aspectRatio]); + static float aspectRatioY = + CVarGetFloat(CVAR_PREFIX_ADVANCED_RESOLUTION ".AspectRatioY", aspectRatioPresetsY[item_aspectRatio]); + static int verticalPixelCount = + CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".VerticalPixelCount", pixelCountPresets[item_pixelCount]); + // Additional settings + static bool showHorizontalResField = false; + static int horizontalPixelCount = (verticalPixelCount / aspectRatioY) * aspectRatioX; + // Disabling flags + const bool disabled_everything = !CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".Enabled", 0); + const bool disabled_pixelCount = !CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".VerticalResolutionToggle", 0); #ifdef __APPLE__ - // Display HiDPI warning. (Remove this once we can definitively say it's fixed.) - ImGui::TextColored(messageColor[MESSAGE_INFO], - ICON_FA_INFO_CIRCLE " These settings may behave incorrectly on Retina displays."); - UIWidgets::PaddedSeparator(true, true, 3.0f, 3.0f); + // Display HiDPI warning. (Remove this once we can definitively say it's fixed.) + ImGui::TextColored(messageColor[MESSAGE_INFO], + ICON_FA_INFO_CIRCLE " These settings may behave incorrectly on Retina displays."); + UIWidgets::PaddedSeparator(true, true, 3.0f, 3.0f); #endif - if (ImGui::CollapsingHeader("Original Settings", ImGuiTreeNodeFlags_DefaultOpen)) { - // The original resolution slider (for convenience) - const bool disabled_resolutionSlider = (CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".VerticalResolutionToggle", 0) && - CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".Enabled", 0)) || - CVarGetInteger(CVAR_LOW_RES_MODE, 0); - if (UIWidgets::EnhancementSliderFloat("Internal Resolution: %.1f%%", "##IMul", CVAR_INTERNAL_RESOLUTION, 0.5f, - 2.0f, "", 1.0f, true, true, disabled_resolutionSlider)) { - Ship::Context::GetInstance()->GetWindow()->SetResolutionMultiplier( - CVarGetFloat(CVAR_INTERNAL_RESOLUTION, 1)); - } - UIWidgets::Tooltip("Multiplies your output resolution by the value entered."); + if (ImGui::CollapsingHeader("Original Settings", ImGuiTreeNodeFlags_DefaultOpen)) { + // The original resolution slider (for convenience) + const bool disabled_resolutionSlider = (CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".VerticalResolutionToggle", 0) && + CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".Enabled", 0)) || + CVarGetInteger(CVAR_LOW_RES_MODE, 0); + if (UIWidgets::EnhancementSliderFloat("Internal Resolution: %.1f%%", "##IMul", CVAR_INTERNAL_RESOLUTION, 0.5f, + 2.0f, "", 1.0f, true, true, disabled_resolutionSlider)) { + Ship::Context::GetInstance()->GetWindow()->SetResolutionMultiplier( + CVarGetFloat(CVAR_INTERNAL_RESOLUTION, 1)); + } + UIWidgets::Tooltip("Multiplies your output resolution by the value entered."); - // The original MSAA slider (also for convenience) + // The original MSAA slider (also for convenience) #ifndef __WIIU__ - if (UIWidgets::PaddedEnhancementSliderInt("MSAA: %d", "##IMSAA", CVAR_MSAA_VALUE, 1, 8, "", 1, true, true, - false)) { - Ship::Context::GetInstance()->GetWindow()->SetMsaaLevel(CVarGetInteger(CVAR_MSAA_VALUE, 1)); - }; - UIWidgets::Tooltip( - "Activates multi-sample anti-aliasing when above 1x, up to 8x for 8 samples for every pixel.\n\n" - " " ICON_FA_INFO_CIRCLE - " (Higher MSAA with low resolution can approximate an authentic \"real N64\" look!)"); + if (UIWidgets::PaddedEnhancementSliderInt("MSAA: %d", "##IMSAA", CVAR_MSAA_VALUE, 1, 8, "", 1, true, true, + false)) { + Ship::Context::GetInstance()->GetWindow()->SetMsaaLevel(CVarGetInteger(CVAR_MSAA_VALUE, 1)); + }; + UIWidgets::Tooltip( + "Activates multi-sample anti-aliasing when above 1x, up to 8x for 8 samples for every pixel.\n\n" + " " ICON_FA_INFO_CIRCLE + " (Higher MSAA with low resolution can approximate an authentic \"real N64\" look!)"); #endif - // N64 Mode toggle (again for convenience) - // UIWidgets::PaddedEnhancementCheckbox("(Enhancements>Graphics) N64 Mode", CVAR_LOW_RES_MODE, false, false, false, "", UIWidgets::CheckboxGraphics::Cross, false); - } + // N64 Mode toggle (again for convenience) + // UIWidgets::PaddedEnhancementCheckbox("(Enhancements>Graphics) N64 Mode", CVAR_LOW_RES_MODE, false, false, false, "", UIWidgets::CheckboxGraphics::Cross, false); + } - UIWidgets::PaddedSeparator(true, true, 3.0f, 3.0f); - // Activator - UIWidgets::PaddedEnhancementCheckbox("Enable advanced settings.", CVAR_PREFIX_ADVANCED_RESOLUTION ".Enabled", false, false, - false, "", UIWidgets::CheckboxGraphics::Cross, false); - // Error/Warning display - if (!CVarGetInteger(CVAR_LOW_RES_MODE, 0)) { - if (IsDroppingFrames()) { // Significant frame drop warning - ImGui::TextColored(messageColor[MESSAGE_WARNING], - ICON_FA_EXCLAMATION_TRIANGLE " Significant frame rate (FPS) drops may be occuring."); - UIWidgets::Spacer(2); - } else { // No warnings - UIWidgets::Spacer(enhancementSpacerHeight); - } - } else { // N64 Mode warning - ImGui::TextColored(messageColor[MESSAGE_QUESTION], - ICON_FA_QUESTION_CIRCLE " \"N64 Mode\" is overriding these settings."); - ImGui::SameLine(); - if (ImGui::Button("Click to disable")) { - CVarSetInteger(CVAR_LOW_RES_MODE, 0); - CVarSave(); - } - } - // Resolution visualiser - ImGui::Text("Viewport dimensions: %d x %d", gfx_current_game_window_viewport.width, - gfx_current_game_window_viewport.height); - ImGui::Text("Internal resolution: %d x %d", gfx_current_dimensions.width, gfx_current_dimensions.height); - - UIWidgets::PaddedSeparator(true, true, 3.0f, 3.0f); - if (disabled_everything) { // Hide aspect ratio controls. - UIWidgets::DisableComponent(ImGui::GetStyle().Alpha * 0.5f); + UIWidgets::PaddedSeparator(true, true, 3.0f, 3.0f); + // Activator + UIWidgets::PaddedEnhancementCheckbox("Enable advanced settings.", CVAR_PREFIX_ADVANCED_RESOLUTION ".Enabled", false, false, + false, "", UIWidgets::CheckboxGraphics::Cross, false); + // Error/Warning display + if (!CVarGetInteger(CVAR_LOW_RES_MODE, 0)) { + if (IsDroppingFrames()) { // Significant frame drop warning + ImGui::TextColored(messageColor[MESSAGE_WARNING], + ICON_FA_EXCLAMATION_TRIANGLE " Significant frame rate (FPS) drops may be occuring."); + UIWidgets::Spacer(2); + } else { // No warnings + UIWidgets::Spacer(enhancementSpacerHeight); } - - // Aspect Ratio - ImGui::Text("Force aspect ratio:"); + } else { // N64 Mode warning + ImGui::TextColored(messageColor[MESSAGE_QUESTION], + ICON_FA_QUESTION_CIRCLE " \"N64 Mode\" is overriding these settings."); ImGui::SameLine(); - ImGui::TextColored(messageColor[MESSAGE_GRAY_75], "(Select \"Off\" to disable.)"); - // Presets - if (ImGui::Combo(" ", &item_aspectRatio, aspectRatioPresetLabels, - IM_ARRAYSIZE(aspectRatioPresetLabels)) && - item_aspectRatio != default_aspectRatio) { // don't change anything if "Custom" is selected. - aspectRatioX = aspectRatioPresetsX[item_aspectRatio]; - aspectRatioY = aspectRatioPresetsY[item_aspectRatio]; - - if (showHorizontalResField) { - horizontalPixelCount = (verticalPixelCount / aspectRatioY) * aspectRatioX; - } - - CVarSetFloat(CVAR_PREFIX_ADVANCED_RESOLUTION ".AspectRatioX", aspectRatioX); - CVarSetFloat(CVAR_PREFIX_ADVANCED_RESOLUTION ".AspectRatioY", aspectRatioY); - CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".UIComboItem.AspectRatio", item_aspectRatio); + if (ImGui::Button("Click to disable")) { + CVarSetInteger(CVAR_LOW_RES_MODE, 0); CVarSave(); } - // Hide aspect ratio input fields if using one of the presets. - if (item_aspectRatio == default_aspectRatio && !showHorizontalResField) { - // Declare input interaction bools outside of IF statement to prevent Y field from disappearing. - const bool input_X = ImGui::InputFloat("X", &aspectRatioX, 0.1f, 1.0f, "%.3f"); - const bool input_Y = ImGui::InputFloat("Y", &aspectRatioY, 0.1f, 1.0f, "%.3f"); - if (input_X || input_Y) { - item_aspectRatio = default_aspectRatio; - update[UPDATE_aspectRatioX] = true; - update[UPDATE_aspectRatioY] = true; - } - } else if (showHorizontalResField) { // Show calculated aspect ratio - if (item_aspectRatio) { - UIWidgets::Spacer(2); - const float resolvedAspectRatio = (float)gfx_current_dimensions.width / gfx_current_dimensions.height; - ImGui::Text("Aspect ratio: %.2f:1", resolvedAspectRatio); - } else { - UIWidgets::Spacer(enhancementSpacerHeight); - } - } + } + // Resolution visualiser + ImGui::Text("Viewport dimensions: %d x %d", gfx_current_game_window_viewport.width, + gfx_current_game_window_viewport.height); + ImGui::Text("Internal resolution: %d x %d", gfx_current_dimensions.width, gfx_current_dimensions.height); + + UIWidgets::PaddedSeparator(true, true, 3.0f, 3.0f); + if (disabled_everything) { // Hide aspect ratio controls. + UIWidgets::DisableComponent(ImGui::GetStyle().Alpha * 0.5f); + } + + // Aspect Ratio + ImGui::Text("Force aspect ratio:"); + ImGui::SameLine(); + ImGui::TextColored(messageColor[MESSAGE_GRAY_75], "(Select \"Off\" to disable.)"); + // Presets + if (ImGui::Combo(" ", &item_aspectRatio, aspectRatioPresetLabels, + IM_ARRAYSIZE(aspectRatioPresetLabels)) && + item_aspectRatio != default_aspectRatio) { // don't change anything if "Custom" is selected. + aspectRatioX = aspectRatioPresetsX[item_aspectRatio]; + aspectRatioY = aspectRatioPresetsY[item_aspectRatio]; - if (disabled_everything) { // Hide aspect ratio controls. - UIWidgets::ReEnableComponent("disabledTooltipText"); + if (showHorizontalResField) { + horizontalPixelCount = (verticalPixelCount / aspectRatioY) * aspectRatioX; } - UIWidgets::Spacer(0); - // Vertical Resolution - UIWidgets::PaddedEnhancementCheckbox("Set fixed vertical resolution (disables Resolution slider)", - CVAR_PREFIX_ADVANCED_RESOLUTION ".VerticalResolutionToggle", true, false, - disabled_everything, "", UIWidgets::CheckboxGraphics::Cross, false); - UIWidgets::Tooltip( - "Override the resolution scale slider and use the settings below, irrespective of window size."); - if (disabled_pixelCount || disabled_everything) { // Hide pixel count controls. - UIWidgets::DisableComponent(ImGui::GetStyle().Alpha * 0.5f); + CVarSetFloat(CVAR_PREFIX_ADVANCED_RESOLUTION ".AspectRatioX", aspectRatioX); + CVarSetFloat(CVAR_PREFIX_ADVANCED_RESOLUTION ".AspectRatioY", aspectRatioY); + CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".UIComboItem.AspectRatio", item_aspectRatio); + CVarSave(); + } + // Hide aspect ratio input fields if using one of the presets. + if (item_aspectRatio == default_aspectRatio && !showHorizontalResField) { + // Declare input interaction bools outside of IF statement to prevent Y field from disappearing. + const bool input_X = ImGui::InputFloat("X", &aspectRatioX, 0.1f, 1.0f, "%.3f"); + const bool input_Y = ImGui::InputFloat("Y", &aspectRatioY, 0.1f, 1.0f, "%.3f"); + if (input_X || input_Y) { + item_aspectRatio = default_aspectRatio; + update[UPDATE_aspectRatioX] = true; + update[UPDATE_aspectRatioY] = true; } - if (ImGui::Combo("Pixel Count Presets", &item_pixelCount, pixelCountPresetLabels, - IM_ARRAYSIZE(pixelCountPresetLabels)) && - item_pixelCount != default_pixelCount) { // don't change anything if "Custom" is selected. - verticalPixelCount = pixelCountPresets[item_pixelCount]; + } else if (showHorizontalResField) { // Show calculated aspect ratio + if (item_aspectRatio) { + UIWidgets::Spacer(2); + const float resolvedAspectRatio = (float)gfx_current_dimensions.width / gfx_current_dimensions.height; + ImGui::Text("Aspect ratio: %.2f:1", resolvedAspectRatio); + } else { + UIWidgets::Spacer(enhancementSpacerHeight); + } + } - if (showHorizontalResField) { - horizontalPixelCount = (verticalPixelCount / aspectRatioY) * aspectRatioX; - } + if (disabled_everything) { // Hide aspect ratio controls. + UIWidgets::ReEnableComponent("disabledTooltipText"); + } + UIWidgets::Spacer(0); + + // Vertical Resolution + UIWidgets::PaddedEnhancementCheckbox("Set fixed vertical resolution (disables Resolution slider)", + CVAR_PREFIX_ADVANCED_RESOLUTION ".VerticalResolutionToggle", true, false, + disabled_everything, "", UIWidgets::CheckboxGraphics::Cross, false); + UIWidgets::Tooltip( + "Override the resolution scale slider and use the settings below, irrespective of window size."); + if (disabled_pixelCount || disabled_everything) { // Hide pixel count controls. + UIWidgets::DisableComponent(ImGui::GetStyle().Alpha * 0.5f); + } + if (ImGui::Combo("Pixel Count Presets", &item_pixelCount, pixelCountPresetLabels, + IM_ARRAYSIZE(pixelCountPresetLabels)) && + item_pixelCount != default_pixelCount) { // don't change anything if "Custom" is selected. + verticalPixelCount = pixelCountPresets[item_pixelCount]; - CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".VerticalPixelCount", verticalPixelCount); - CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".UIComboItem.PixelCount", item_pixelCount); - CVarSave(); - } - // Horizontal Resolution, if visibility is enabled for it. if (showHorizontalResField) { - // Only show the field if Aspect Ratio is being enforced. - if ((aspectRatioX > 0.0f) && (aspectRatioY > 0.0f)) { - // So basically we're "faking" this one by setting aspectRatioX instead. - if (ImGui::InputInt("Horiz. Pixel Count", &horizontalPixelCount, 8, 320)) { - item_aspectRatio = default_aspectRatio; - if (horizontalPixelCount < SCREEN_WIDTH) { - horizontalPixelCount = SCREEN_WIDTH; - } - aspectRatioX = horizontalPixelCount; - aspectRatioY = verticalPixelCount; - update[UPDATE_aspectRatioX] = true; - update[UPDATE_aspectRatioY] = true; - } - } else { // Display a notice instead. - ImGui::TextColored(messageColor[MESSAGE_QUESTION], - ICON_FA_QUESTION_CIRCLE " \"Force aspect ratio\" required."); - // ImGui::Text(" "); - ImGui::SameLine(); - if (ImGui::Button("Click to resolve")) { - item_aspectRatio = default_aspectRatio; // Set it to Custom - aspectRatioX = aspectRatioPresetsX[2]; // but use the 4:3 defaults - aspectRatioY = aspectRatioPresetsY[2]; - update[UPDATE_aspectRatioX] = true; - update[UPDATE_aspectRatioY] = true; - horizontalPixelCount = (verticalPixelCount / aspectRatioY) * aspectRatioX; - } - } + horizontalPixelCount = (verticalPixelCount / aspectRatioY) * aspectRatioX; } - // Vertical Resolution part 2 - if (ImGui::InputInt("Vertical Pixel Count", &verticalPixelCount, 8, 240)) { - item_pixelCount = default_pixelCount; - update[UPDATE_verticalPixelCount] = true; - - // Account for the natural instinct to enter horizontal first. - // Ignore vertical resolutions that are below the lower clamp constant. - if (showHorizontalResField && !(verticalPixelCount < minVerticalPixelCount)) { + + CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".VerticalPixelCount", verticalPixelCount); + CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".UIComboItem.PixelCount", item_pixelCount); + CVarSave(); + } + // Horizontal Resolution, if visibility is enabled for it. + if (showHorizontalResField) { + // Only show the field if Aspect Ratio is being enforced. + if ((aspectRatioX > 0.0f) && (aspectRatioY > 0.0f)) { + // So basically we're "faking" this one by setting aspectRatioX instead. + if (ImGui::InputInt("Horiz. Pixel Count", &horizontalPixelCount, 8, 320)) { item_aspectRatio = default_aspectRatio; + if (horizontalPixelCount < SCREEN_WIDTH) { + horizontalPixelCount = SCREEN_WIDTH; + } aspectRatioX = horizontalPixelCount; aspectRatioY = verticalPixelCount; update[UPDATE_aspectRatioX] = true; update[UPDATE_aspectRatioY] = true; } + } else { // Display a notice instead. + ImGui::TextColored(messageColor[MESSAGE_QUESTION], + ICON_FA_QUESTION_CIRCLE " \"Force aspect ratio\" required."); + // ImGui::Text(" "); + ImGui::SameLine(); + if (ImGui::Button("Click to resolve")) { + item_aspectRatio = default_aspectRatio; // Set it to Custom + aspectRatioX = aspectRatioPresetsX[2]; // but use the 4:3 defaults + aspectRatioY = aspectRatioPresetsY[2]; + update[UPDATE_aspectRatioX] = true; + update[UPDATE_aspectRatioY] = true; + horizontalPixelCount = (verticalPixelCount / aspectRatioY) * aspectRatioX; + } } - if (disabled_pixelCount || disabled_everything) { // Hide pixel count controls. - UIWidgets::ReEnableComponent("disabledTooltipText"); + } + // Vertical Resolution part 2 + if (ImGui::InputInt("Vertical Pixel Count", &verticalPixelCount, 8, 240)) { + item_pixelCount = default_pixelCount; + update[UPDATE_verticalPixelCount] = true; + + // Account for the natural instinct to enter horizontal first. + // Ignore vertical resolutions that are below the lower clamp constant. + if (showHorizontalResField && !(verticalPixelCount < minVerticalPixelCount)) { + item_aspectRatio = default_aspectRatio; + aspectRatioX = horizontalPixelCount; + aspectRatioY = verticalPixelCount; + update[UPDATE_aspectRatioX] = true; + update[UPDATE_aspectRatioY] = true; } + } + if (disabled_pixelCount || disabled_everything) { // Hide pixel count controls. + UIWidgets::ReEnableComponent("disabledTooltipText"); + } - UIWidgets::Spacer(0); - - // Integer scaling settings group (Pixel-perfect Mode) - static const ImGuiTreeNodeFlags IntegerScalingResolvedImGuiFlag = - CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", 0) ? ImGuiTreeNodeFlags_DefaultOpen - : ImGuiTreeNodeFlags_None; - if (ImGui::CollapsingHeader("Integer Scaling Settings", IntegerScalingResolvedImGuiFlag)) { - const bool disabled_pixelPerfectMode = - !CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", 0) || disabled_everything; - // Pixel-perfect Mode - UIWidgets::PaddedEnhancementCheckbox("Pixel-perfect Mode", CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", true, - true, disabled_pixelCount || disabled_everything, "", - UIWidgets::CheckboxGraphics::Cross, false); - UIWidgets::Tooltip("Don't scale image to fill window."); - if (disabled_pixelCount && CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", 0)) { - CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", 0); - CVarSave(); - } + UIWidgets::Spacer(0); + + // Integer scaling settings group (Pixel-perfect Mode) + static const ImGuiTreeNodeFlags IntegerScalingResolvedImGuiFlag = + CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", 0) ? ImGuiTreeNodeFlags_DefaultOpen + : ImGuiTreeNodeFlags_None; + if (ImGui::CollapsingHeader("Integer Scaling Settings", IntegerScalingResolvedImGuiFlag)) { + const bool disabled_pixelPerfectMode = + !CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", 0) || disabled_everything; + // Pixel-perfect Mode + UIWidgets::PaddedEnhancementCheckbox("Pixel-perfect Mode", CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", true, + true, disabled_pixelCount || disabled_everything, "", + UIWidgets::CheckboxGraphics::Cross, false); + UIWidgets::Tooltip("Don't scale image to fill window."); + if (disabled_pixelCount && CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", 0)) { + CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", 0); + CVarSave(); + } - // Integer Scaling - UIWidgets::EnhancementSliderInt( - "Integer scale factor: %d", "##ARSIntScale", CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.Factor", 1, - max_integerScaleFactor, "%d", 1, true, - disabled_pixelPerfectMode || CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.FitAutomatically", 0)); - UIWidgets::Tooltip("Integer scales the image. Only available in pixel-perfect mode."); - // Display warning if size is being clamped or if framebuffer is larger than viewport. - if (!disabled_pixelPerfectMode && - (CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.NeverExceedBounds", 1) && - CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.Factor", 1) > integerScale_maximumBounds)) { - ImGui::SameLine(); - ImGui::TextColored(messageColor[MESSAGE_WARNING], ICON_FA_EXCLAMATION_TRIANGLE " Window exceeded."); - } + // Integer Scaling + UIWidgets::EnhancementSliderInt( + "Integer scale factor: %d", "##ARSIntScale", CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.Factor", 1, + max_integerScaleFactor, "%d", 1, true, + disabled_pixelPerfectMode || CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.FitAutomatically", 0)); + UIWidgets::Tooltip("Integer scales the image. Only available in pixel-perfect mode."); + // Display warning if size is being clamped or if framebuffer is larger than viewport. + if (!disabled_pixelPerfectMode && + (CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.NeverExceedBounds", 1) && + CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.Factor", 1) > integerScale_maximumBounds)) { + ImGui::SameLine(); + ImGui::TextColored(messageColor[MESSAGE_WARNING], ICON_FA_EXCLAMATION_TRIANGLE " Window exceeded."); + } - UIWidgets::PaddedEnhancementCheckbox( - "Automatically scale image to fit viewport", CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.FitAutomatically", true, - true, disabled_pixelPerfectMode, "", UIWidgets::CheckboxGraphics::Cross, false); - UIWidgets::Tooltip("Automatically sets scale factor to fit window. Only available in pixel-perfect mode."); - if (CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.FitAutomatically", 0)) { - // This is just here to update the value shown on the slider. - // The function in LUS to handle this setting will ignore IntegerScaleFactor while active. - CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.Factor", integerScale_maximumBounds); - // CVarSave(); - } - } // End of integer scaling settings + UIWidgets::PaddedEnhancementCheckbox( + "Automatically scale image to fit viewport", CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.FitAutomatically", true, + true, disabled_pixelPerfectMode, "", UIWidgets::CheckboxGraphics::Cross, false); + UIWidgets::Tooltip("Automatically sets scale factor to fit window. Only available in pixel-perfect mode."); + if (CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.FitAutomatically", 0)) { + // This is just here to update the value shown on the slider. + // The function in LUS to handle this setting will ignore IntegerScaleFactor while active. + CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.Factor", integerScale_maximumBounds); + // CVarSave(); + } + } // End of integer scaling settings - UIWidgets::PaddedSeparator(true, true, 3.0f, 3.0f); + UIWidgets::PaddedSeparator(true, true, 3.0f, 3.0f); - // Collapsible panel for additional settings - if (ImGui::CollapsingHeader("Additional Settings")) { - UIWidgets::Spacer(0); + // Collapsible panel for additional settings + if (ImGui::CollapsingHeader("Additional Settings")) { + UIWidgets::Spacer(0); #if defined(__SWITCH__) || defined(__WIIU__) - // Disable aspect correction, stretching the framebuffer to fill the viewport. - // This option is only really needed on systems limited to 16:9 TV resolutions, such as consoles. - // The associated cvar is still functional on PC platforms if you want to use it though. - UIWidgets::PaddedEnhancementCheckbox("Disable aspect correction and stretch the output image.\n" - "(Might be useful for 4:3 televisions!)\n" - "Not available in Pixel Perfect Mode.", - CVAR_PREFIX_ADVANCED_RESOLUTION ".IgnoreAspectCorrection", false, true, - CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", 0) || - disabled_everything, - "", UIWidgets::CheckboxGraphics::Cross, false); + // Disable aspect correction, stretching the framebuffer to fill the viewport. + // This option is only really needed on systems limited to 16:9 TV resolutions, such as consoles. + // The associated cvar is still functional on PC platforms if you want to use it though. + UIWidgets::PaddedEnhancementCheckbox("Disable aspect correction and stretch the output image.\n" + "(Might be useful for 4:3 televisions!)\n" + "Not available in Pixel Perfect Mode.", + CVAR_PREFIX_ADVANCED_RESOLUTION ".IgnoreAspectCorrection", false, true, + CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", 0) || + disabled_everything, + "", UIWidgets::CheckboxGraphics::Cross, false); #else - if (CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IgnoreAspectCorrection", 0)) { - // This setting is intentionally not exposed on PC platforms, - // but may be accidentally activated for varying reasons. - // Having this button should hopefully prevent support headaches. - ImGui::TextColored(messageColor[MESSAGE_QUESTION], ICON_FA_QUESTION_CIRCLE - " If the image is stretched and you don't know why, click this."); - if (ImGui::Button("Click to reenable aspect correction.")) { - CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IgnoreAspectCorrection", 0); - CVarSave(); - } - UIWidgets::Spacer(2); + if (CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IgnoreAspectCorrection", 0)) { + // This setting is intentionally not exposed on PC platforms, + // but may be accidentally activated for varying reasons. + // Having this button should hopefully prevent support headaches. + ImGui::TextColored(messageColor[MESSAGE_QUESTION], ICON_FA_QUESTION_CIRCLE + " If the image is stretched and you don't know why, click this."); + if (ImGui::Button("Click to reenable aspect correction.")) { + CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IgnoreAspectCorrection", 0); + CVarSave(); } + UIWidgets::Spacer(2); + } #endif - // A requested addition; an alternative way of displaying the resolution field. - if (ImGui::Checkbox("Show a horizontal resolution field, instead of aspect ratio.", &showHorizontalResField)) { - if (!showHorizontalResField && (aspectRatioX > 0.0f)) { // when turning this setting off - // Refresh relevant values - aspectRatioX = aspectRatioY * horizontalPixelCount / verticalPixelCount; + // A requested addition; an alternative way of displaying the resolution field. + if (ImGui::Checkbox("Show a horizontal resolution field, instead of aspect ratio.", &showHorizontalResField)) { + if (!showHorizontalResField && (aspectRatioX > 0.0f)) { // when turning this setting off + // Refresh relevant values + aspectRatioX = aspectRatioY * horizontalPixelCount / verticalPixelCount; + horizontalPixelCount = (verticalPixelCount / aspectRatioY) * aspectRatioX; + } else { // when turning this setting on + item_aspectRatio = default_aspectRatio; + if (aspectRatioX > 0.0f) { + // Refresh relevant values in the opposite order horizontalPixelCount = (verticalPixelCount / aspectRatioY) * aspectRatioX; - } else { // when turning this setting on - item_aspectRatio = default_aspectRatio; - if (aspectRatioX > 0.0f) { - // Refresh relevant values in the opposite order - horizontalPixelCount = (verticalPixelCount / aspectRatioY) * aspectRatioX; - aspectRatioX = aspectRatioY * horizontalPixelCount / verticalPixelCount; - } + aspectRatioX = aspectRatioY * horizontalPixelCount / verticalPixelCount; } - update[UPDATE_aspectRatioX] = true; } + update[UPDATE_aspectRatioX] = true; + } - // Beginning of Integer Scaling additional settings. - { - // UIWidgets::PaddedSeparator(true, true, 3.0f, 3.0f); + // Beginning of Integer Scaling additional settings. + { + // UIWidgets::PaddedSeparator(true, true, 3.0f, 3.0f); - // Integer Scaling - Never Exceed Bounds. - const bool disabled_neverExceedBounds = - !CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", 0) || - CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.FitAutomatically", 0) || disabled_everything; - const bool checkbox_neverExceedBounds = - UIWidgets::PaddedEnhancementCheckbox("Prevent integer scaling from exceeding screen bounds.\n" - "(Makes screen bounds take priority over specified factor.)", - CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.NeverExceedBounds", - true, false, disabled_neverExceedBounds, "", - UIWidgets::CheckboxGraphics::Cross, true); - UIWidgets::Tooltip( - "Prevents integer scaling factor from exceeding screen bounds.\n\n" - "Enabled: Will clamp the scaling factor and display a gentle warning in the resolution editor.\n" - "Disabled: Will allow scaling to exceed screen bounds, for users who want to crop overscan.\n\n" - " " ICON_FA_INFO_CIRCLE - " Please note that exceeding screen bounds may show a scroll bar on-screen."); - - // Initialise the (currently unused) "Exceed Bounds By" cvar if it's been changed. - if (checkbox_neverExceedBounds && - CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.ExceedBoundsBy", 0)) { - CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.ExceedBoundsBy", 0); - CVarSave(); - } + // Integer Scaling - Never Exceed Bounds. + const bool disabled_neverExceedBounds = + !CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", 0) || + CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.FitAutomatically", 0) || disabled_everything; + const bool checkbox_neverExceedBounds = + UIWidgets::PaddedEnhancementCheckbox("Prevent integer scaling from exceeding screen bounds.\n" + "(Makes screen bounds take priority over specified factor.)", + CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.NeverExceedBounds", + true, false, disabled_neverExceedBounds, "", + UIWidgets::CheckboxGraphics::Cross, true); + UIWidgets::Tooltip( + "Prevents integer scaling factor from exceeding screen bounds.\n\n" + "Enabled: Will clamp the scaling factor and display a gentle warning in the resolution editor.\n" + "Disabled: Will allow scaling to exceed screen bounds, for users who want to crop overscan.\n\n" + " " ICON_FA_INFO_CIRCLE + " Please note that exceeding screen bounds may show a scroll bar on-screen."); - // Integer Scaling - Exceed Bounds By 1x/Offset. - // A popular feature in some retro frontends/upscalers, sometimes called "crop overscan" or "1080p 5x". - /* - UIWidgets::PaddedEnhancementCheckbox("Allow integer scale factor to go +1 above maximum screen bounds.", CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.ExceedBoundsBy", false, false, !CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", 0) || disabled_everything, "", UIWidgets::CheckboxGraphics::Cross, false); - */ - // It does actually function as expected, but exceeding the bottom of the screen shows a scroll bar. - // I've ended up commenting this one out because of the scroll bar, and for simplicity. - - // Display an info message about the scroll bar. - if (!CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.NeverExceedBounds", 1) || - CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.ExceedBoundsBy", 0)) { - if (disabled_neverExceedBounds) { // Dim this help text accordingly - UIWidgets::DisableComponent(ImGui::GetStyle().Alpha * 0.5f); - } - ImGui::TextColored(messageColor[MESSAGE_INFO], - " " ICON_FA_INFO_CIRCLE - " A scroll bar may become visible if screen bounds are exceeded."); - if (disabled_neverExceedBounds) { // Dim this help text accordingly - UIWidgets::ReEnableComponent("disabledTooltipText"); - } + // Initialise the (currently unused) "Exceed Bounds By" cvar if it's been changed. + if (checkbox_neverExceedBounds && + CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.ExceedBoundsBy", 0)) { + CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.ExceedBoundsBy", 0); + CVarSave(); + } + + // Integer Scaling - Exceed Bounds By 1x/Offset. + // A popular feature in some retro frontends/upscalers, sometimes called "crop overscan" or "1080p 5x". + /* + UIWidgets::PaddedEnhancementCheckbox("Allow integer scale factor to go +1 above maximum screen bounds.", CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.ExceedBoundsBy", false, false, !CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", 0) || disabled_everything, "", UIWidgets::CheckboxGraphics::Cross, false); + */ + // It does actually function as expected, but exceeding the bottom of the screen shows a scroll bar. + // I've ended up commenting this one out because of the scroll bar, and for simplicity. + + // Display an info message about the scroll bar. + if (!CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.NeverExceedBounds", 1) || + CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.ExceedBoundsBy", 0)) { + if (disabled_neverExceedBounds) { // Dim this help text accordingly + UIWidgets::DisableComponent(ImGui::GetStyle().Alpha * 0.5f); + } + ImGui::TextColored(messageColor[MESSAGE_INFO], + " " ICON_FA_INFO_CIRCLE + " A scroll bar may become visible if screen bounds are exceeded."); + if (disabled_neverExceedBounds) { // Dim this help text accordingly + UIWidgets::ReEnableComponent("disabledTooltipText"); + } - // Another support helper button, to disable the unused "Exceed Bounds By" cvar. - // (Remove this button if uncommenting the checkbox.) - if (CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.ExceedBoundsBy", 0)) { - if (ImGui::Button("Click to reset a console variable that may be causing this.")) { - CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.ExceedBoundsBy", 0); - CVarSave(); - } + // Another support helper button, to disable the unused "Exceed Bounds By" cvar. + // (Remove this button if uncommenting the checkbox.) + if (CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.ExceedBoundsBy", 0)) { + if (ImGui::Button("Click to reset a console variable that may be causing this.")) { + CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.ExceedBoundsBy", 0); + CVarSave(); } - } else { - ImGui::Text(" "); } - // UIWidgets::PaddedSeparator(true, true, 3.0f, 3.0f); - } // End of Integer Scaling additional settings. + } else { + ImGui::Text(" "); + } + // UIWidgets::PaddedSeparator(true, true, 3.0f, 3.0f); + } // End of Integer Scaling additional settings. - } // End of additional settings + } // End of additional settings - // Clamp and update the cvars that don't use UIWidgets - if (update[UPDATE_aspectRatioX] || update[UPDATE_aspectRatioY] || update[UPDATE_verticalPixelCount]) { - if (update[UPDATE_aspectRatioX]) { - if (aspectRatioX < 0.0f) { - aspectRatioX = 0.0f; - } - CVarSetFloat(CVAR_PREFIX_ADVANCED_RESOLUTION ".AspectRatioX", aspectRatioX); + // Clamp and update the cvars that don't use UIWidgets + if (update[UPDATE_aspectRatioX] || update[UPDATE_aspectRatioY] || update[UPDATE_verticalPixelCount]) { + if (update[UPDATE_aspectRatioX]) { + if (aspectRatioX < 0.0f) { + aspectRatioX = 0.0f; } - if (update[UPDATE_aspectRatioY]) { - if (aspectRatioY < 0.0f) { - aspectRatioY = 0.0f; - } - CVarSetFloat(CVAR_PREFIX_ADVANCED_RESOLUTION ".AspectRatioY", aspectRatioY); + CVarSetFloat(CVAR_PREFIX_ADVANCED_RESOLUTION ".AspectRatioX", aspectRatioX); + } + if (update[UPDATE_aspectRatioY]) { + if (aspectRatioY < 0.0f) { + aspectRatioY = 0.0f; } - if (update[UPDATE_verticalPixelCount]) { - // There's a upper and lower clamp on the Libultraship side too, - // so clamping it here is entirely visual, so the vertical resolution field reflects it. - if (verticalPixelCount < minVerticalPixelCount) { - verticalPixelCount = minVerticalPixelCount; - } - if (verticalPixelCount > maxVerticalPixelCount) { - verticalPixelCount = maxVerticalPixelCount; - } - CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".VerticalPixelCount", verticalPixelCount); + CVarSetFloat(CVAR_PREFIX_ADVANCED_RESOLUTION ".AspectRatioY", aspectRatioY); + } + if (update[UPDATE_verticalPixelCount]) { + // There's a upper and lower clamp on the Libultraship side too, + // so clamping it here is entirely visual, so the vertical resolution field reflects it. + if (verticalPixelCount < minVerticalPixelCount) { + verticalPixelCount = minVerticalPixelCount; } - CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".UIComboItem.AspectRatio", item_aspectRatio); - CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".UIComboItem.PixelCount", item_pixelCount); - CVarSave(); + if (verticalPixelCount > maxVerticalPixelCount) { + verticalPixelCount = maxVerticalPixelCount; + } + CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".VerticalPixelCount", verticalPixelCount); } + CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".UIComboItem.AspectRatio", item_aspectRatio); + CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".UIComboItem.PixelCount", item_pixelCount); + CVarSave(); } - ImGui::End(); } void AdvancedResolutionSettingsWindow::UpdateElement() { diff --git a/soh/soh/SohGui.cpp b/soh/soh/SohGui.cpp index 71a3660217f..df475447d44 100644 --- a/soh/soh/SohGui.cpp +++ b/soh/soh/SohGui.cpp @@ -164,41 +164,41 @@ namespace SohGui { SPDLOG_ERROR("Could not find input editor window"); } - mAudioEditorWindow = std::make_shared(CVAR_WINDOW("AudioEditor"), "Audio Editor"); + mAudioEditorWindow = std::make_shared(CVAR_WINDOW("AudioEditor"), "Audio Editor", ImVec2(820, 630)); gui->AddGuiWindow(mAudioEditorWindow); mInputViewer = std::make_shared(CVAR_WINDOW("InputViewer"), "Input Viewer"); gui->AddGuiWindow(mInputViewer); - mInputViewerSettings = std::make_shared(CVAR_WINDOW("InputViewerSettings"), "Input Viewer Settings"); + mInputViewerSettings = std::make_shared(CVAR_WINDOW("InputViewerSettings"), "Input Viewer Settings", ImVec2(500, 525)); gui->AddGuiWindow(mInputViewerSettings); - mCosmeticsEditorWindow = std::make_shared(CVAR_WINDOW("CosmeticsEditor"), "Cosmetics Editor"); + mCosmeticsEditorWindow = std::make_shared(CVAR_WINDOW("CosmeticsEditor"), "Cosmetics Editor", ImVec2(550, 520)); gui->AddGuiWindow(mCosmeticsEditorWindow); - mActorViewerWindow = std::make_shared(CVAR_WINDOW("ActorViewer"), "Actor Viewer"); + mActorViewerWindow = std::make_shared(CVAR_WINDOW("ActorViewer"), "Actor Viewer", ImVec2(520, 600)); gui->AddGuiWindow(mActorViewerWindow); - mColViewerWindow = std::make_shared(CVAR_WINDOW("CollisionViewer"), "Collision Viewer"); + mColViewerWindow = std::make_shared(CVAR_WINDOW("CollisionViewer"), "Collision Viewer", ImVec2(520, 600)); gui->AddGuiWindow(mColViewerWindow); - mSaveEditorWindow = std::make_shared(CVAR_WINDOW("SaveEditor"), "Save Editor"); + mSaveEditorWindow = std::make_shared(CVAR_WINDOW("SaveEditor"), "Save Editor", ImVec2(520, 600)); gui->AddGuiWindow(mSaveEditorWindow); - mDLViewerWindow = std::make_shared(CVAR_WINDOW("DLViewer"), "Display List Viewer"); + mDLViewerWindow = std::make_shared(CVAR_WINDOW("DLViewer"), "Display List Viewer", ImVec2(520, 600)); gui->AddGuiWindow(mDLViewerWindow); - mValueViewerWindow = std::make_shared(CVAR_WINDOW("ValueViewer"), "Value Viewer"); + mValueViewerWindow = std::make_shared(CVAR_WINDOW("ValueViewer"), "Value Viewer", ImVec2(520, 600)); gui->AddGuiWindow(mValueViewerWindow); - mMessageViewerWindow = std::make_shared(CVAR_WINDOW("MessageViewer"), "Message Viewer"); + mMessageViewerWindow = std::make_shared(CVAR_WINDOW("MessageViewer"), "Message Viewer", ImVec2(520, 600)); gui->AddGuiWindow(mMessageViewerWindow); - mGameplayStatsWindow = std::make_shared(CVAR_WINDOW("GameplayStats"), "Gameplay Stats"); + mGameplayStatsWindow = std::make_shared(CVAR_WINDOW("GameplayStats"), "Gameplay Stats", ImVec2(480, 550)); gui->AddGuiWindow(mGameplayStatsWindow); mCheckTrackerWindow = std::make_shared(CVAR_WINDOW("CheckTracker"), "Check Tracker"); gui->AddGuiWindow(mCheckTrackerWindow); - mCheckTrackerSettingsWindow = std::make_shared(CVAR_WINDOW("CheckTrackerSettings"), "Check Tracker Settings"); + mCheckTrackerSettingsWindow = std::make_shared(CVAR_WINDOW("CheckTrackerSettings"), "Check Tracker Settings", ImVec2(600, 375)); gui->AddGuiWindow(mCheckTrackerSettingsWindow); mEntranceTrackerWindow = std::make_shared(CVAR_WINDOW("EntranceTracker"),"Entrance Tracker"); gui->AddGuiWindow(mEntranceTrackerWindow); mItemTrackerWindow = std::make_shared(CVAR_WINDOW("ItemTracker"), "Item Tracker"); gui->AddGuiWindow(mItemTrackerWindow); - mItemTrackerSettingsWindow = std::make_shared(CVAR_WINDOW("ItemTrackerSettings"), "Item Tracker Settings"); + mItemTrackerSettingsWindow = std::make_shared(CVAR_WINDOW("ItemTrackerSettings"), "Item Tracker Settings", ImVec2(733, 472)); gui->AddGuiWindow(mItemTrackerSettingsWindow); - mRandomizerSettingsWindow = std::make_shared(CVAR_WINDOW("RandomizerSettings"), "Randomizer Settings"); + mRandomizerSettingsWindow = std::make_shared(CVAR_WINDOW("RandomizerSettings"), "Randomizer Settings", ImVec2(920, 600)); gui->AddGuiWindow(mRandomizerSettingsWindow); - mAdvancedResolutionSettingsWindow = std::make_shared(CVAR_WINDOW("AdvancedResolutionEditor"), "Advanced Resolution Settings"); + mAdvancedResolutionSettingsWindow = std::make_shared(CVAR_WINDOW("AdvancedResolutionEditor"), "Advanced Resolution Settings", ImVec2(497, 599)); gui->AddGuiWindow(mAdvancedResolutionSettingsWindow); mModalWindow = std::make_shared(CVAR_WINDOW("ModalWindow"), "Modal Window"); gui->AddGuiWindow(mModalWindow); diff --git a/soh/soh/SohModals.cpp b/soh/soh/SohModals.cpp index 44dc93d743e..b77a5f47fc9 100644 --- a/soh/soh/SohModals.cpp +++ b/soh/soh/SohModals.cpp @@ -19,6 +19,15 @@ struct SohModal { }; std::vector modals; +void SohModalWindow::Draw() { + if (!IsVisible()) { + return; + } + DrawElement(); + // Sync up the IsVisible flag if it was changed by ImGui + SyncVisibilityConsoleVariable(); +} + void SohModalWindow::DrawElement() { if (modals.size() > 0) { SohModal curModal = modals.at(0); diff --git a/soh/soh/SohModals.h b/soh/soh/SohModals.h index b64e180b688..f584b954019 100644 --- a/soh/soh/SohModals.h +++ b/soh/soh/SohModals.h @@ -7,6 +7,7 @@ class SohModalWindow : public Ship::GuiWindow { public: using GuiWindow::GuiWindow; + void Draw() override; void InitElement() override {}; void DrawElement() override; From 0e8313166f63c968bb06d7acb0bc9f11e3713b12 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Wed, 11 Sep 2024 23:15:01 -0700 Subject: [PATCH 083/108] Add overworld special fairy spots --- .../location_access/locacc_death_mountain.cpp | 1 + .../location_access/locacc_gerudo_valley.cpp | 1 + .../location_access/locacc_hyrule_field.cpp | 2 ++ .../location_access/locacc_lost_woods.cpp | 5 +++-- .../Enhancements/randomizer/location_list.cpp | 17 +++++++++++++++++ .../Enhancements/randomizer/randomizerTypes.h | 10 ++++++++++ .../Enhancements/randomizer/randomizer_inf.h | 6 ++++++ 7 files changed, 40 insertions(+), 2 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp index 68e47f03f2d..04215d00b69 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp @@ -18,6 +18,7 @@ void AreaTable_Init_DeathMountain() { LOCATION(RC_DMT_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->HasExplosives || logic->HasItem(RG_GORONS_BRACELET))), LOCATION(RC_DMT_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->HasExplosives || logic->HasItem(RG_GORONS_BRACELET))), LOCATION(RC_DMT_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->HasExplosives || logic->HasItem(RG_GORONS_BRACELET))), + LOCATION(RC_DMT_FLAG_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), }, { //Exits Entrance(RR_KAK_BEHIND_GATE, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp index a3ee37a3258..349f347b27d 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp @@ -115,6 +115,7 @@ void AreaTable_Init_GerudoValley() { LOCATION(RC_GF_GERUDO_MEMBERSHIP_CARD, logic->CanFinishGerudoFortress), LOCATION(RC_GF_GS_ARCHERY_RANGE, logic->IsAdult && logic->HookshotOrBoomerang && logic->GerudoToken && logic->AtNight && logic->CanGetNightTimeGS), LOCATION(RC_GF_GS_TOP_FLOOR, logic->IsAdult && logic->AtNight && (logic->CanJumpslash || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_BOOMERANG) || logic->HasExplosives || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_DINS_FIRE)) && (logic->GerudoToken || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS) || randoCtx->GetTrickOption(RT_GF_KITCHEN) || randoCtx->GetTrickOption(RT_GF_JUMP)) && logic->CanGetNightTimeGS), + LOCATION(RC_GF_KITCHEN_SUN_FAIRY, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanUse(RG_SUNS_SONG)), }, { //Exits Entrance(RR_GV_FORTRESS_SIDE, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp index 73b53d56ed1..9fe23d82ced 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp @@ -11,6 +11,7 @@ void AreaTable_Init_HyruleField() { //Locations LOCATION(RC_HF_OCARINA_OF_TIME_ITEM, logic->IsChild && logic->HasAllStones), LOCATION(RC_SONG_FROM_OCARINA_OF_TIME, logic->IsChild && logic->HasAllStones), + LOCATION(RC_HF_POND_STORMS_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), }, { //Exits Entrance(RR_LW_BRIDGE, {[]{return true;}}), @@ -153,6 +154,7 @@ void AreaTable_Init_HyruleField() { LOCATION(RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), LOCATION(RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_LH_ISLAND_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG) && ((logic->HasItem(RG_BRONZE_SCALE) && (logic->IsChild || logic->WaterTempleClear)) || logic->CanUse(RG_DISTANT_SCARECROW))), LOCATION(RC_LH_LAB_GOSSIP_STONE, true), LOCATION(RC_LH_SOUTHEAST_GOSSIP_STONE, true), LOCATION(RC_LH_SOUTHWEST_GOSSIP_STONE, true), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp index 15babf1a3ae..41007dd960c 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp @@ -149,8 +149,9 @@ void AreaTable_Init_LostWoods() { LOCATION(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), - LOCATION(RC_LW_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairyWithoutSuns), - LOCATION(RC_LW_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_LW_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairyWithoutSuns), + LOCATION(RC_LW_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_LW_SHORTCUT_STORMS_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LW_GOSSIP_STONE, true), }, { //Exits diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 9f04dd5d4ba..3c8d110ad33 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -671,6 +671,12 @@ std::vector Rando::StaticData::overworldLocations = { RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, + + RC_LH_ISLAND_SUN_FAIRY, + RC_HF_POND_STORMS_FAIRY, + RC_DMT_FLAG_SUN_FAIRY, + RC_LW_SHORTCUT_STORMS_FAIRY, + RC_GF_KITCHEN_SUN_FAIRY, }; std::vector Rando::StaticData::gossipStoneLocations = { @@ -886,6 +892,11 @@ std::vector Rando::StaticData::overworldFairyLocations = { RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_LH_ISLAND_SUN_FAIRY, + RC_HF_POND_STORMS_FAIRY, + RC_DMT_FLAG_SUN_FAIRY, + RC_LW_SHORTCUT_STORMS_FAIRY, + RC_GF_KITCHEN_SUN_FAIRY, }; typedef enum { @@ -2010,6 +2021,12 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x6, -236), RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, "Upper Grotto Gossip Stone Fairy", RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); locationTable[RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1006, -236), RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, "Upper Grotto Gossip Stone Big Fairy", RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_LH_ISLAND_SUN_FAIRY] = Location::Fairy(RC_LH_ISLAND_SUN_FAIRY, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(0x1000, 7319), RAND_INF_LH_ISLAND_SUN_FAIRY, "Island Sun's Song Fairy", RHT_LH_ISLAND_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[RC_HF_POND_STORMS_FAIRY] = Location::Fairy(RC_HF_POND_STORMS_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(0x1000, 5012), RAND_INF_HF_POND_STORMS_FAIRY, "Pond Song of Storms Fairy", RHT_HF_POND_STORMS_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_DMT_FLAG_SUN_FAIRY] = Location::Fairy(RC_DMT_FLAG_SUN_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(0x1000, 464), RAND_INF_DMT_FLAG_SUN_FAIRY, "Flag Sun's Song Fairy", RHT_DMT_FLAG_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_LW_SHORTCUT_STORMS_FAIRY] = Location::Fairy(RC_LW_SHORTCUT_STORMS_FAIRY, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(0x1000, -795), RAND_INF_LW_SHORTCUT_STORMS_FAIRY, "Shortcuts Song of Storms Fairy", RHT_LW_SHORTCUT_STORMS_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_GF_KITCHEN_SUN_FAIRY] = Location::Fairy(RC_GF_KITCHEN_SUN_FAIRY, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(0x1000, -621), RAND_INF_GF_KITCHEN_SUN_FAIRY, "Kitchen Sun's Song Fairy", RHT_GF_KITCHEN_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + // Gossip Stones locationTable[RC_DMC_GOSSIP_STONE] = Location::HintStone(RC_DMC_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 14341, 0x05, "Gossip Stone", {}); locationTable[RC_DMT_GOSSIP_STONE] = Location::HintStone(RC_DMT_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 14340, 0x04, "Gossip Stone", {}); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 2559f450ec0..ad77b1c905a 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1836,6 +1836,11 @@ typedef enum { RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_LH_ISLAND_SUN_FAIRY, + RC_HF_POND_STORMS_FAIRY, + RC_DMT_FLAG_SUN_FAIRY, + RC_LW_SHORTCUT_STORMS_FAIRY, + RC_GF_KITCHEN_SUN_FAIRY, RC_MAX } RandomizerCheck; @@ -3910,6 +3915,11 @@ typedef enum { RHT_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RHT_LH_ISLAND_SUN_FAIRY, + RHT_HF_POND_STORMS_FAIRY, + RHT_DMT_FLAG_SUN_FAIRY, + RHT_LW_SHORTCUT_STORMS_FAIRY, + RHT_GF_KITCHEN_SUN_FAIRY, RHT_MAX } RandomizerHintTextKey; diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index 0ef02d506ab..de0a0369744 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -493,6 +493,12 @@ typedef enum { RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, + + RAND_INF_LH_ISLAND_SUN_FAIRY, + RAND_INF_HF_POND_STORMS_FAIRY, + RAND_INF_DMT_FLAG_SUN_FAIRY, + RAND_INF_LW_SHORTCUT_STORMS_FAIRY, + RAND_INF_GF_KITCHEN_SUN_FAIRY, // If you add anything to this list, you need to update the size of randomizerInf in z64save.h to be ceil(RAND_INF_MAX / 16) RAND_INF_MAX, From c507d4d9a04c57a72d4816cdbe71c76e8aa9b110 Mon Sep 17 00:00:00 2001 From: inspectredc <78732756+inspectredc@users.noreply.github.com> Date: Fri, 13 Sep 2024 00:01:57 +0100 Subject: [PATCH 084/108] Early Eyeball Frog (#4120) * early eyeball is real :D * make cvar * update cvars * fix additional cvar check bug --- soh/soh/SohMenuBar.cpp | 2 + soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c | 113 +++++++++++++++----- 2 files changed, 86 insertions(+), 29 deletions(-) diff --git a/soh/soh/SohMenuBar.cpp b/soh/soh/SohMenuBar.cpp index 5568841b610..05f22fb2d7e 100644 --- a/soh/soh/SohMenuBar.cpp +++ b/soh/soh/SohMenuBar.cpp @@ -1421,6 +1421,8 @@ void DrawEnhancementsMenu() { UIWidgets::Tooltip("Restore a bug from NTSC 1.0 that allows bypassing Bongo Bongo's intro cutscene to quickly kill him"); UIWidgets::PaddedEnhancementCheckbox("Original RBA Values", CVAR_ENHANCEMENT("RestoreRBAValues"), true, false); UIWidgets::Tooltip("Restores the original outcomes when performing Reverse Bottle Adventure."); + UIWidgets::PaddedEnhancementCheckbox("Early Eyeball Frog", CVAR_ENHANCEMENT("EarlyEyeballFrog"), true, false); + UIWidgets::Tooltip("Restores a bug from NTSC 1.0/1.1 that allows you to obtain the eyeball frog from King Zora instead of the Zora Tunic by holding shield."); ImGui::EndMenu(); } diff --git a/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c b/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c index 73157aedf52..7b6afefaaa1 100644 --- a/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c +++ b/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c @@ -128,18 +128,41 @@ s16 func_80A9C6C0(PlayState* play, Actor* thisx) { switch (Message_GetState(&play->msgCtx)) { case TEXT_STATE_DONE: - ret = NPC_TALK_STATE_IDLE; - switch (this->actor.textId) { - case 0x4012: - Flags_SetInfTable(INFTABLE_139); - ret = NPC_TALK_STATE_ACTION; - break; - case 0x401B: - ret = !Message_ShouldAdvance(play) ? NPC_TALK_STATE_TALKING : NPC_TALK_STATE_ACTION; - break; - case 0x401F: - Flags_SetInfTable(INFTABLE_139); - break; + if (CVarGetInteger(CVAR_ENHANCEMENT("EarlyEyeballFrog"), 0)) { + if (Message_ShouldAdvance(play)) { + ret = NPC_TALK_STATE_ITEM_GIVEN; + } + } else { + ret = NPC_TALK_STATE_IDLE; + switch (this->actor.textId) { + case 0x4012: + Flags_SetInfTable(INFTABLE_139); + ret = NPC_TALK_STATE_ACTION; + break; + case 0x401B: + ret = !Message_ShouldAdvance(play) ? NPC_TALK_STATE_TALKING : NPC_TALK_STATE_ACTION; + break; + case 0x401F: + Flags_SetInfTable(INFTABLE_139); + break; + } + } + break; + case TEXT_STATE_CLOSING: + if (CVarGetInteger(CVAR_ENHANCEMENT("EarlyEyeballFrog"), 0)) { + ret = NPC_TALK_STATE_IDLE; + switch (this->actor.textId) { + case 0x4012: + Flags_SetInfTable(INFTABLE_139); + ret = NPC_TALK_STATE_ACTION; + break; + case 0x401B: + ret = !Message_ShouldAdvance(play) ? NPC_TALK_STATE_TALKING : NPC_TALK_STATE_ACTION; + break; + case 0x401F: + Flags_SetInfTable(INFTABLE_139); + break; + } } break; case TEXT_STATE_DONE_FADING: @@ -160,7 +183,9 @@ s16 func_80A9C6C0(PlayState* play, Actor* thisx) { } if (this->actor.textId == 0x4014) { if (play->msgCtx.choiceIndex == 0) { - EnKz_SetupGetItem(this, play); + if (!CVarGetInteger(CVAR_ENHANCEMENT("EarlyEyeballFrog"), 0)) { + EnKz_SetupGetItem(this, play); + } ret = NPC_TALK_STATE_ACTION; } else { this->actor.textId = 0x4016; @@ -175,7 +200,6 @@ s16 func_80A9C6C0(PlayState* play, Actor* thisx) { break; case TEXT_STATE_NONE: case TEXT_STATE_DONE_HAS_NEXT: - case TEXT_STATE_CLOSING: case TEXT_STATE_SONG_DEMO_DONE: case TEXT_STATE_8: case TEXT_STATE_9: @@ -207,25 +231,34 @@ s32 func_80A9C95C(PlayState* play, EnKz* this, s16* talkState, f32 unkf, NpcGetT return 1; } - if (*talkState != NPC_TALK_STATE_IDLE) { - *talkState = updateTalkState(play, &this->actor); - return 0; - } + if (!CVarGetInteger(CVAR_ENHANCEMENT("EarlyEyeballFrog"), 0)) { + if (*talkState != NPC_TALK_STATE_IDLE) { + *talkState = updateTalkState(play, &this->actor); + return 0; + } - yaw = Math_Vec3f_Yaw(&this->actor.home.pos, &player->actor.world.pos); - yaw -= this->actor.shape.rot.y; - if ((fabsf(yaw) > 1638.0f) || (this->actor.xzDistToPlayer < 265.0f)) { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; - return 0; - } + yaw = Math_Vec3f_Yaw(&this->actor.home.pos, &player->actor.world.pos); + yaw -= this->actor.shape.rot.y; + if ((fabsf(yaw) > 1638.0f) || (this->actor.xzDistToPlayer < 265.0f)) { + this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + return 0; + } - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_TARGETABLE; + } Actor_GetScreenPos(play, &this->actor, &sp32, &sp30); if (!((sp32 >= -30) && (sp32 < 361) && (sp30 >= -10) && (sp30 < 241))) { return 0; } + if (CVarGetInteger(CVAR_ENHANCEMENT("EarlyEyeballFrog"), 0)) { + if (*talkState != NPC_TALK_STATE_IDLE) { + *talkState = updateTalkState(play, &this->actor); + return 0; + } + } + xzDistToPlayer = this->actor.xzDistToPlayer; this->actor.xzDistToPlayer = Math_Vec3f_DistXZ(&this->actor.home.pos, &player->actor.world.pos); if (func_8002F2CC(&this->actor, play, unkf) == 0) { @@ -241,6 +274,18 @@ s32 func_80A9C95C(PlayState* play, EnKz* this, s16* talkState, f32 unkf, NpcGetT void func_80A9CB18(EnKz* this, PlayState* play) { Player* player = GET_PLAYER(play); + if (CVarGetInteger(CVAR_ENHANCEMENT("EarlyEyeballFrog"), 0)) { + f32 yaw; + yaw = Math_Vec3f_Yaw(&this->actor.home.pos, &player->actor.world.pos); + yaw -= this->actor.shape.rot.y; + if ((fabsf(yaw) > 1638.0f) || (this->actor.xzDistToPlayer < 265.0f)) { + this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + return 0; + } + + this->actor.flags |= ACTOR_FLAG_TARGETABLE; + } + if (func_80A9C95C(play, this, &this->interactInfo.talkState, 340.0f, EnKz_GetText, func_80A9C6C0)) { if (GameInteractor_Should(VB_BE_ABLE_TO_EXCHANGE_RUTOS_LETTER, (this->actor.textId == 0x401A), this) && !Flags_GetEventChkInf(EVENTCHKINF_KING_ZORA_MOVED)) @@ -262,12 +307,15 @@ void func_80A9CB18(EnKz* this, PlayState* play) { this->actor.textId = 0x4014; this->sfxPlayed = false; player->actor.textId = this->actor.textId; - this->isTrading = true; + if (!CVarGetInteger(CVAR_ENHANCEMENT("EarlyEyeballFrog"), 0)) { + this->isTrading = true; + } return; } } - - this->isTrading = false; + if (!CVarGetInteger(CVAR_ENHANCEMENT("EarlyEyeballFrog"), 0)) { + this->isTrading = false; + } if (Flags_GetInfTable(INFTABLE_139)) { this->actor.textId = CHECK_QUEST_ITEM(QUEST_SONG_SERENADE) ? 0x4045 : 0x401A; player->actor.textId = this->actor.textId; @@ -434,6 +482,9 @@ void EnKz_StopMweep(EnKz* this, PlayState* play) { void EnKz_Wait(EnKz* this, PlayState* play) { if (this->interactInfo.talkState == NPC_TALK_STATE_ACTION) { + if (CVarGetInteger(CVAR_ENHANCEMENT("EarlyEyeballFrog"), 0)) { + this->interactInfo.talkState = NPC_TALK_STATE_IDLE; + } this->actionFunc = EnKz_SetupGetItem; EnKz_SetupGetItem(this, play); } else { @@ -460,7 +511,11 @@ void EnKz_SetupGetItem(EnKz* this, PlayState* play) { Flags_SetRandomizerInf(RAND_INF_ADULT_TRADES_ZD_TRADE_PRESCRIPTION); } } else { - getItemId = this->isTrading ? GI_FROG : GI_TUNIC_ZORA; + if (CVarGetInteger(CVAR_ENHANCEMENT("EarlyEyeballFrog"), 0)) { + getItemId = func_8002F368(play) == EXCH_ITEM_PRESCRIPTION ? GI_FROG : GI_TUNIC_ZORA; + } else { + getItemId = this->isTrading ? GI_FROG : GI_TUNIC_ZORA; + } yRange = fabsf(this->actor.yDistToPlayer) + 1.0f; xzRange = this->actor.xzDistToPlayer + 1.0f; Actor_OfferGetItem(&this->actor, play, getItemId, xzRange, yRange); From d31b791fb57232519ecf7495e963e3a9ea56e688 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 12 Sep 2024 22:30:25 -0700 Subject: [PATCH 085/108] Add mini-dungeon fairy song spots --- .../randomizer/3drando/item_pool.cpp | 83 ++++++++++++------- .../locacc_bottom_of_the_well.cpp | 3 + .../locacc_gerudo_training_grounds.cpp | 1 + .../location_access/locacc_ice_cavern.cpp | 5 +- soh/soh/Enhancements/randomizer/dungeon.cpp | 5 ++ .../Enhancements/randomizer/location_list.cpp | 6 ++ .../Enhancements/randomizer/randomizerTypes.h | 10 +++ .../Enhancements/randomizer/randomizer_inf.h | 5 ++ 8 files changed, 86 insertions(+), 32 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index 4b82dfba84f..131dbe54981 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -618,6 +618,51 @@ static void PlaceVanillaOverworldFish() { } } +static void PlaceVanillaFairies() { + auto ctx = Rando::Context::GetInstance(); + for (auto rc : Rando::StaticData::overworldFairyLocations) { + ctx->PlaceItemInLocation(rc, GetJunkItem(), false, true); + } + if (ctx->GetDungeon(Rando::GANONS_CASTLE)->IsMQ()) { + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, GetJunkItem(), false, true); + } else { + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_1, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_2, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_3, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_4, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_5, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_6, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_7, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_8, GetJunkItem(), false, true); + } + if (ctx->GetDungeon(Rando::DODONGOS_CAVERN)->IsMQ()) { + ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, GetJunkItem(), false, true); + } else { + ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, GetJunkItem(), false, true); + } + if (ctx->GetDungeon(Rando::BOTTOM_OF_THE_WELL)->IsMQ()) { + ctx->PlaceItemInLocation(RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, GetJunkItem(), false, true); + } else { + ctx->PlaceItemInLocation(RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, GetJunkItem(), false, true); + } + if (ctx->GetDungeon(Rando::ICE_CAVERN)->IsVanilla()) { + ctx->PlaceItemInLocation(RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, GetJunkItem(), false, true); + } + if (ctx->GetDungeon(Rando::GERUDO_TRAINING_GROUNDS)->IsVanilla()) { + ctx->PlaceItemInLocation(RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, GetJunkItem(), false, true); + } +} + static void SetScarceItemPool() { ReplaceMaxItem(RG_PROGRESSIVE_BOMBCHUS, 3); ReplaceMaxItem(RG_BOMBCHU_5, 1); @@ -1170,40 +1215,16 @@ void GenerateItemPool() { for (auto rc : Rando::StaticData::overworldFairyLocations) { AddItemToMainPool(GetJunkItem()); } - // 8 extra for Ganon's Castle + 2 extra for Dodongo's Cavern - for (int i = 0; i < 10; i++) { + // 8 extra for Ganon's Castle + 2 Dodongo's Cavern Gossip Stone + int extra = 10; + extra += ctx->GetDungeon(Rando::BOTTOM_OF_THE_WELL)->IsVanilla() ? 1 : 2; + extra += ctx->GetDungeon(Rando::ICE_CAVERN)->IsVanilla() ? 1 : 0; + extra += ctx->GetDungeon(Rando::GERUDO_TRAINING_GROUNDS)->IsVanilla() ? 1 : 0; + for (int i = 0; i < extra; i++) { AddItemToMainPool(GetJunkItem()); } } else { - for (auto rc : Rando::StaticData::overworldFairyLocations) { - ctx->PlaceItemInLocation(rc, GetJunkItem(), false, true); - } - if (ctx->GetDungeon(Rando::GANONS_CASTLE)->IsMQ()) { - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, GetJunkItem(), false, true); - } else { - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_1, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_2, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_3, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_4, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_5, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_6, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_7, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_8, GetJunkItem(), false, true); - } - if (ctx->GetDungeon(Rando::DODONGOS_CAVERN)->IsMQ()) { - ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, GetJunkItem(), false, true); - } else { - ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, GetJunkItem(), false, true); - } + PlaceVanillaFairies(); } //Scrubsanity diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_bottom_of_the_well.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_bottom_of_the_well.cpp index 44260c7ebe4..a20102819e3 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_bottom_of_the_well.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_bottom_of_the_well.cpp @@ -42,6 +42,7 @@ void AreaTable_Init_BottomOfTheWell() { LOCATION(RC_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, logic->Boomerang && (randoCtx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->SmallKeys(RR_BOTTOM_OF_THE_WELL, 3)), LOCATION(RC_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, logic->Boomerang && (randoCtx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->SmallKeys(RR_BOTTOM_OF_THE_WELL, 3)), LOCATION(RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, logic->SmallKeys(RR_BOTTOM_OF_THE_WELL, 3) && (randoCtx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->Boomerang), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, (randoCtx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->CanUse(RG_SUNS_SONG)), }, { //Exits Entrance(RR_BOTTOM_OF_THE_WELL_ENTRYWAY, {[]{return true;}}), @@ -62,6 +63,7 @@ void AreaTable_Init_BottomOfTheWell() { //Trick: logic->HasExplosives || (LogicBotWMQDeadHandKey && logic->Boomerang) LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, logic->CanChildAttack), LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, logic->CanChildAttack && logic->SmallKeys(RR_BOTTOM_OF_THE_WELL, 2)), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), }, { //Exits Entrance(RR_BOTTOM_OF_THE_WELL_ENTRYWAY, {[]{return true;}}), @@ -76,6 +78,7 @@ void AreaTable_Init_BottomOfTheWell() { LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY, true), LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM, logic->CanChildAttack && (randoCtx->GetTrickOption(RT_BOTW_MQ_PITS) || logic->HasExplosives)), //Trick: logic->CanChildAttack && (LogicBotWMQPits || logic->HasExplosives) + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), }, { //Exits Entrance(RR_BOTTOM_OF_THE_WELL_MQ_PERIMETER, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_training_grounds.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_training_grounds.cpp index c0a2ab2bc16..b3320401095 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_training_grounds.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_training_grounds.cpp @@ -25,6 +25,7 @@ void AreaTable_Init_GerudoTrainingGrounds() { LOCATION(RC_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST, logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT)), LOCATION(RC_GERUDO_TRAINING_GROUND_STALFOS_CHEST, logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD)), LOCATION(RC_GERUDO_TRAINING_GROUND_BEAMOS_CHEST, logic->HasExplosives && (logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD))), + LOCATION(RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), }, { //Exits Entrance(RR_GERUDO_TRAINING_GROUNDS_ENTRYWAY, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ice_cavern.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ice_cavern.cpp index 7f5873ba17a..96206e6c3f2 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ice_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ice_cavern.cpp @@ -19,7 +19,10 @@ void AreaTable_Init_IceCavern() { | VANILLA DUNGEON | ---------------------------*/ if (randoCtx->GetDungeon(ICE_CAVERN)->IsVanilla()) { - areaTable[RR_ICE_CAVERN_BEGINNING] = Area("Ice Cavern Beginning", "Ice Cavern", RA_ICE_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_ICE_CAVERN_BEGINNING] = Area("Ice Cavern Beginning", "Ice Cavern", RA_ICE_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { + //Locations + LOCATION(RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), + }, { //Exits Entrance(RR_ICE_CAVERN_ENTRYWAY, {[]{return true;}}), Entrance(RR_ICE_CAVERN_MAIN, {[]{return Here(RR_ICE_CAVERN_BEGINNING, []{return (logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD)) || logic->CanUse(RG_MEGATON_HAMMER) || logic->HasExplosives || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_DINS_FIRE);});}}), diff --git a/soh/soh/Enhancements/randomizer/dungeon.cpp b/soh/soh/Enhancements/randomizer/dungeon.cpp index ebf1e4ea1c8..1dd18f8bab8 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/dungeon.cpp @@ -575,6 +575,7 @@ Dungeons::Dungeons() { RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, RC_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, RC_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, + RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, }, { // MQ Locations @@ -586,6 +587,8 @@ Dungeons::Dungeons() { RC_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, RC_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, RC_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM, + RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, + RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, }, {}, {}); dungeonList[ICE_CAVERN] = DungeonInfo("Ice Cavern", RHT_ICE_CAVERN, RG_ICE_CAVERN_MAP, RG_ICE_CAVERN_COMPASS, @@ -599,6 +602,7 @@ Dungeons::Dungeons() { RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, RC_ICE_CAVERN_GS_HEART_PIECE_ROOM, + RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, }, { // MQ Locations @@ -642,6 +646,7 @@ Dungeons::Dungeons() { RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST, RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST, RC_GERUDO_TRAINING_GROUND_FREESTANDING_KEY, + RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, }, { // MQ Locations diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 3c8d110ad33..435ce5aab90 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -2027,6 +2027,12 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_LW_SHORTCUT_STORMS_FAIRY] = Location::Fairy(RC_LW_SHORTCUT_STORMS_FAIRY, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(0x1000, -795), RAND_INF_LW_SHORTCUT_STORMS_FAIRY, "Shortcuts Song of Storms Fairy", RHT_LW_SHORTCUT_STORMS_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); locationTable[RC_GF_KITCHEN_SUN_FAIRY] = Location::Fairy(RC_GF_KITCHEN_SUN_FAIRY, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(0x1000, -621), RAND_INF_GF_KITCHEN_SUN_FAIRY, "Kitchen Sun's Song Fairy", RHT_GF_KITCHEN_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -1531), RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, "Basement Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -437), RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, "MQ East Cell Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -1458), RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, "MQ Basement Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY] = Location::Fairy(RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(0x1000, 1186), RAND_INF_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, "Entrance Song of Storms Fairy", RHT_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY] = Location::Fairy(RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, RCQUEST_VANILLA, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(0x1000, -445), RAND_INF_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, "Entrance Song of Storms Fairy", RHT_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + // Gossip Stones locationTable[RC_DMC_GOSSIP_STONE] = Location::HintStone(RC_DMC_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 14341, 0x05, "Gossip Stone", {}); locationTable[RC_DMT_GOSSIP_STONE] = Location::HintStone(RC_DMT_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 14340, 0x04, "Gossip Stone", {}); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index ad77b1c905a..2ab0ad7d100 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1841,6 +1841,11 @@ typedef enum { RC_DMT_FLAG_SUN_FAIRY, RC_LW_SHORTCUT_STORMS_FAIRY, RC_GF_KITCHEN_SUN_FAIRY, + RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, + RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, + RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, + RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, + RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, RC_MAX } RandomizerCheck; @@ -3920,6 +3925,11 @@ typedef enum { RHT_DMT_FLAG_SUN_FAIRY, RHT_LW_SHORTCUT_STORMS_FAIRY, RHT_GF_KITCHEN_SUN_FAIRY, + RHT_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, + RHT_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, + RHT_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, + RHT_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, + RHT_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, RHT_MAX } RandomizerHintTextKey; diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index de0a0369744..e66979d4b25 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -499,6 +499,11 @@ typedef enum { RAND_INF_DMT_FLAG_SUN_FAIRY, RAND_INF_LW_SHORTCUT_STORMS_FAIRY, RAND_INF_GF_KITCHEN_SUN_FAIRY, + RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, + RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, + RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, + RAND_INF_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, + RAND_INF_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, // If you add anything to this list, you need to update the size of randomizerInf in z64save.h to be ceil(RAND_INF_MAX / 16) RAND_INF_MAX, From 727202c9a01bb5660f2c7bee4fbec7590daca579 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Fri, 13 Sep 2024 00:04:02 -0700 Subject: [PATCH 086/108] Add remaining dungeons except Shadow --- .../randomizer/3drando/item_pool.cpp | 22 +++++++++++++++++++ .../location_access/locacc_fire_temple.cpp | 2 ++ .../location_access/locacc_ganons_castle.cpp | 1 + .../location_access/locacc_spirit_temple.cpp | 3 +++ .../location_access/locacc_water_temple.cpp | 7 +++++- soh/soh/Enhancements/randomizer/dungeon.cpp | 9 ++++++++ .../Enhancements/randomizer/location_list.cpp | 9 ++++++++ .../Enhancements/randomizer/randomizerTypes.h | 18 +++++++++++++++ .../Enhancements/randomizer/randomizer_inf.h | 9 ++++++++ 9 files changed, 79 insertions(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index 131dbe54981..e34ef7cce7b 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -649,6 +649,21 @@ static void PlaceVanillaFairies() { ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, GetJunkItem(), false, true); ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, GetJunkItem(), false, true); } + if (ctx->GetDungeon(Rando::FIRE_TEMPLE)->IsMQ()) { + ctx->PlaceItemInLocation(RC_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, GetJunkItem(), false, true); + } + if (ctx->GetDungeon(Rando::WATER_TEMPLE)->IsMQ()) { + ctx->PlaceItemInLocation(RC_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, GetJunkItem(), false, true); + } + if (ctx->GetDungeon(Rando::SPIRIT_TEMPLE)->IsMQ()) { + ctx->PlaceItemInLocation(RC_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, GetJunkItem(), false, true); + } else { + ctx->PlaceItemInLocation(RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, GetJunkItem(), false, true); + } if (ctx->GetDungeon(Rando::BOTTOM_OF_THE_WELL)->IsMQ()) { ctx->PlaceItemInLocation(RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, GetJunkItem(), false, true); ctx->PlaceItemInLocation(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, GetJunkItem(), false, true); @@ -661,6 +676,9 @@ static void PlaceVanillaFairies() { if (ctx->GetDungeon(Rando::GERUDO_TRAINING_GROUNDS)->IsVanilla()) { ctx->PlaceItemInLocation(RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, GetJunkItem(), false, true); } + if (ctx->GetDungeon(Rando::GANONS_CASTLE)->IsVanilla()) { + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, GetJunkItem(), false, true); + } } static void SetScarceItemPool() { @@ -1217,9 +1235,13 @@ void GenerateItemPool() { } // 8 extra for Ganon's Castle + 2 Dodongo's Cavern Gossip Stone int extra = 10; + extra += ctx->GetDungeon(Rando::FIRE_TEMPLE)->IsVanilla() ? 0 : 2; + extra += ctx->GetDungeon(Rando::WATER_TEMPLE)->IsVanilla() ? 0 : 3; + extra += ctx->GetDungeon(Rando::SPIRIT_TEMPLE)->IsVanilla() ? 2 : 1; extra += ctx->GetDungeon(Rando::BOTTOM_OF_THE_WELL)->IsVanilla() ? 1 : 2; extra += ctx->GetDungeon(Rando::ICE_CAVERN)->IsVanilla() ? 1 : 0; extra += ctx->GetDungeon(Rando::GERUDO_TRAINING_GROUNDS)->IsVanilla() ? 1 : 0; + extra += ctx->GetDungeon(Rando::GANONS_CASTLE)->IsVanilla() ? 1 : 0; for (int i = 0; i < extra; i++) { AddItemToMainPool(GetJunkItem()); } diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp index b3c2e5387d1..0b7c6963a7a 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp @@ -318,6 +318,7 @@ void AreaTable_Init_FireTemple() { LOCATION(RC_FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, logic->CanJumpslash || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW) || logic->Bombs || logic->CanUse(RG_DINS_FIRE)), LOCATION(RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, logic->IsAdult && (randoCtx->GetTrickOption(RT_FEWER_TUNIC_REQUIREMENTS) || logic->CanUse(RG_GORON_TUNIC)) && (((logic->CanUse(RG_HOVER_BOOTS) || (randoCtx->GetTrickOption(RT_FIRE_MQ_NEAR_BOSS) && logic->CanUse(RG_FAIRY_BOW))) && logic->HasFireSource) || (logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_FIRE_ARROWS) || (logic->CanUse(RG_DINS_FIRE) && ((randoCtx->GetOption(RSK_DAMAGE_MULTIPLIER).IsNot(RO_DAMAGE_MULTIPLIER_OHKO) && randoCtx->GetOption(RSK_DAMAGE_MULTIPLIER).IsNot(RO_DAMAGE_MULTIPLIER_QUADRUPLE) && randoCtx->GetOption(RSK_DAMAGE_MULTIPLIER).IsNot(RO_DAMAGE_MULTIPLIER_OCTUPLE) && randoCtx->GetOption(RSK_DAMAGE_MULTIPLIER).IsNot(RO_DAMAGE_MULTIPLIER_SEXDECUPLE)) || logic->CanUse(RG_GORON_TUNIC) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_LONGSHOT)))))), //Trick: logic->IsAdult && (LogicFewerTunicRequirements || logic->CanUse(RG_GORON_TUNIC)) && (((logic->CanUse(RG_HOVER_BOOTS) || (LogicFireMQNearBoss && logic->CanUse(RG_FAIRY_BOW))) && logic->HasFireSource) || (logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_FIRE_ARROWS) || (logic->CanUse(RG_DINS_FIRE) && ((DamageMultiplier.IsNot(DAMAGEMULTIPLIER_OHKO) && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_QUADRUPLE) && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_OCTUPLE) && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_SEXDECUPLE)) || logic->CanUse(RG_GORON_TUNIC) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_LONGSHOT))))) + LOCATION(RC_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, logic->SmallKeys(RR_FIRE_TEMPLE, 5) && logic->CanUse(RG_SUNS_SONG)), }, { //Exits Entrance(RR_FIRE_TEMPLE_ENTRYWAY, {[]{return true;}}), @@ -333,6 +334,7 @@ void AreaTable_Init_FireTemple() { //Locations LOCATION(RC_FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, logic->IsAdult && (logic->CanUse(RG_MEGATON_HAMMER) || logic->CanUse(RG_HOOKSHOT) || (logic->HasExplosives && (logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_BOOMERANG))))), LOCATION(RC_FIRE_TEMPLE_MQ_MAP_CHEST, logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), }, {}); areaTable[RR_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM] = Area("Fire Temple MQ Big Lava Room", "Fire Temple", RA_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, { diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp index 2888a4ed1ca..a46d652062b 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp @@ -219,6 +219,7 @@ void AreaTable_Init_GanonsCastle() { LOCATION(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST, logic->IsAdult && logic->Hammer && logic->CanUse(RG_BOMBCHU_5) && ((logic->CanUse(RG_FIRE_ARROWS) && logic->CanUse(RG_MIRROR_SHIELD)) || (randoCtx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS)))), LOCATION(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST, logic->IsAdult && logic->Hammer && logic->CanUse(RG_BOMBCHU_5) && ((logic->CanUse(RG_FIRE_ARROWS) && logic->CanUse(RG_MIRROR_SHIELD)) || (randoCtx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS)))), LOCATION(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST, logic->IsAdult && logic->Hammer && logic->CanUse(RG_BOMBCHU_5) && ((logic->CanUse(RG_FIRE_ARROWS) && logic->CanUse(RG_MIRROR_SHIELD)) || (randoCtx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS)))), + LOCATION(RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), }, {}); areaTable[RR_GANONS_CASTLE_MQ_LIGHT_TRIAL] = Area("Ganon's Castle MQ Light Trial", "Ganons Castle", RA_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp index 747b5ec2f45..775a9df152e 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp @@ -59,6 +59,7 @@ void AreaTable_Init_SpiritTemple() { LOCATION(RC_SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, logic->SmallKeys(RR_SPIRIT_TEMPLE, 3)), LOCATION(RC_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, logic->SmallKeys(RR_SPIRIT_TEMPLE, 3)), LOCATION(RC_SPIRIT_TEMPLE_GS_BOULDER_ROOM, logic->CanUse(RG_SONG_OF_TIME) && (logic->Bow || logic->Hookshot || logic->CanUse(RG_BOMBCHU_5) || (logic->Bombs && randoCtx->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->Bombs && logic->IsAdult && randoCtx->GetTrickOption(RT_SPIRIT_LOWER_ADULT_SWITCH))) && (logic->CanUse(RG_HOVER_BOOTS) || logic->CanJumpslash)), }, { //Exits Entrance(RR_SPIRIT_TEMPLE_CENTRAL_CHAMBER, {[]{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 1);}}), @@ -108,6 +109,7 @@ void AreaTable_Init_SpiritTemple() { LOCATION(RC_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, (logic->MirrorShield || (randoCtx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS))) && logic->HasExplosives), LOCATION(RC_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, (randoCtx->GetTrickOption(RT_LENS_SPIRIT) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->HasExplosives), LOCATION(RC_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, (randoCtx->GetTrickOption(RT_LENS_SPIRIT) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->HasExplosives), + LOCATION(RC_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, logic->HasExplosives && logic->CanUse(RG_SUNS_SONG)), }, { //Exits Entrance(RR_SPIRIT_TEMPLE_BEYOND_FINAL_LOCKED_DOOR, {[]{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && (randoCtx->GetTrickOption(RT_SPIRIT_WALL) || logic->CanUse(RG_LONGSHOT) || logic->CanUse(RG_BOMBCHU_5) || ((logic->Bombs || logic->CanUse(RG_NUTS) || logic->CanUse(RG_DINS_FIRE)) && (logic->Bow || logic->CanUse(RG_HOOKSHOT) || logic->Hammer)));}}), @@ -172,6 +174,7 @@ void AreaTable_Init_SpiritTemple() { LOCATION(RC_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST, logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && logic->CanUse(RG_SONG_OF_TIME) && (logic->MirrorShield || (randoCtx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS)))), LOCATION(RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, logic->SmallKeys(RR_SPIRIT_TEMPLE, 7)), LOCATION(RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, logic->SmallKeys(RR_SPIRIT_TEMPLE, 7)), + LOCATION(RC_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && logic->CanUse(RG_SONG_OF_TIME) && logic->CanUse(RG_SUNS_SONG)), }, { //Exits Entrance(RR_SPIRIT_TEMPLE_MQ_LOWER_ADULT, {[]{return logic->MirrorShield && logic->IsAdult && (logic->CanUse(RG_FIRE_ARROWS) || (randoCtx->GetTrickOption(RT_SPIRIT_MQ_LOWER_ADULT) && logic->CanUse(RG_DINS_FIRE) && logic->Bow));}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_water_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_water_temple.cpp index ef9c5ecd9dd..62f2e3b8a5b 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_water_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_water_temple.cpp @@ -251,7 +251,10 @@ void AreaTable_Init_WaterTemple() { | MASTER QUEST DUNGEON | ---------------------------*/ if (randoCtx->GetDungeon(WATER_TEMPLE)->IsMQ()) { - areaTable[RR_WATER_TEMPLE_MQ_LOBBY] = Area("Water Temple MQ Lobby", "Water Temple", RA_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_LOBBY] = Area("Water Temple MQ Lobby", "Water Temple", RA_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + //Locations + LOCATION(RC_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, logic->SmallKeys(RR_WATER_TEMPLE, 1) && logic->CanUse(RG_SUNS_SONG) && logic->CanUse(RG_LONGSHOT) && (logic->CanUse(RG_HOVER_BOOTS) || (logic->CanJumpslash && logic->Hearts > 0))) + }, { //Exits Entrance(RR_WATER_TEMPLE_ENTRYWAY, {[]{return true;}}), Entrance(RR_WATER_TEMPLE_MQ_DIVE, {[]{return logic->IsAdult && logic->WaterTimer >= 24 && logic->CanUse(RG_IRON_BOOTS);}}), @@ -286,6 +289,8 @@ void AreaTable_Init_WaterTemple() { //Locations LOCATION(RC_WATER_TEMPLE_MQ_BOSS_KEY_CHEST, logic->IsAdult && logic->WaterTimer >= 24 && logic->CanUse(RG_DINS_FIRE) && (randoCtx->GetTrickOption(RT_WATER_DRAGON_JUMP_DIVE) || logic->CanDive || logic->CanUse(RG_IRON_BOOTS))), LOCATION(RC_WATER_TEMPLE_MQ_GS_RIVER, true), + LOCATION(RC_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), }, { //Exits Entrance(RR_WATER_TEMPLE_MQ_BASEMENT_GATED_AREAS, {[]{return logic->IsAdult && logic->WaterTimer >= 24 && logic->CanUse(RG_DINS_FIRE) && logic->CanUse(RG_IRON_BOOTS);}}), diff --git a/soh/soh/Enhancements/randomizer/dungeon.cpp b/soh/soh/Enhancements/randomizer/dungeon.cpp index 1dd18f8bab8..d958da9bcc6 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/dungeon.cpp @@ -377,6 +377,8 @@ Dungeons::Dungeons() { RC_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, RC_FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE, + RC_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, + RC_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, }, {}, { @@ -418,6 +420,9 @@ Dungeons::Dungeons() { RC_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, RC_WATER_TEMPLE_MQ_GS_RIVER, RC_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, + RC_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, + RC_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, + RC_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, }, {}, { @@ -452,6 +457,8 @@ Dungeons::Dungeons() { RC_SPIRIT_TEMPLE_GS_LOBBY, RC_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, RC_SPIRIT_TEMPLE_GS_METAL_FENCE, + RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, + RC_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, }, { // MQ Locations @@ -480,6 +487,7 @@ Dungeons::Dungeons() { RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, RC_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM, + RC_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, }, { // Shared Locations @@ -701,6 +709,7 @@ Dungeons::Dungeons() { RC_GANONS_CASTLE_SCRUBS_FAIRY_6, RC_GANONS_CASTLE_SCRUBS_FAIRY_7, RC_GANONS_CASTLE_SCRUBS_FAIRY_8, + RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, }, { // MQ Locations diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 435ce5aab90..1d9e6250977 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -2027,11 +2027,20 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_LW_SHORTCUT_STORMS_FAIRY] = Location::Fairy(RC_LW_SHORTCUT_STORMS_FAIRY, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(0x1000, -795), RAND_INF_LW_SHORTCUT_STORMS_FAIRY, "Shortcuts Song of Storms Fairy", RHT_LW_SHORTCUT_STORMS_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); locationTable[RC_GF_KITCHEN_SUN_FAIRY] = Location::Fairy(RC_GF_KITCHEN_SUN_FAIRY, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(0x1000, -621), RAND_INF_GF_KITCHEN_SUN_FAIRY, "Kitchen Sun's Song Fairy", RHT_GF_KITCHEN_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY] = Location::Fairy(RC_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -551), RAND_INF_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, "MQ Lower Loop Stalfos Room Sun's Song Fairy", RHT_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY] = Location::Fairy(RC_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1563), RAND_INF_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, "MQ Lower Loop Behind Iron Knuckle Sun's Song Fairy", RHT_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY] = Location::Fairy(RC_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -540), RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, "MQ Before Dark Link Pilar Sun's Song Fairy", RHT_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[RC_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY] = Location::Fairy(RC_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1501), RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, "MQ Before Dark Link Left Song of Storms Fairy", RHT_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[RC_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY] = Location::Fairy(RC_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1504), RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, "MQ Before Dark Link Right Sun's Song Fairy", RHT_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY] = Location::Fairy(RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1896), RAND_INF_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, "After Boulder Room Sun's Song Fairy", RHT_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY] = Location::Fairy(RC_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -220), RAND_INF_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, "Four Armos Room Sun's Song Fairy", RHT_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY] = Location::Fairy(RC_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -220), RAND_INF_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, "MQ Dinalfos Room Sun's Song Fairy", RHT_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -1531), RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, "Basement Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -437), RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, "MQ East Cell Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -1458), RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, "MQ Basement Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY] = Location::Fairy(RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(0x1000, 1186), RAND_INF_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, "Entrance Song of Storms Fairy", RHT_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); locationTable[RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY] = Location::Fairy(RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, RCQUEST_VANILLA, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(0x1000, -445), RAND_INF_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, "Entrance Song of Storms Fairy", RHT_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY] = Location::Fairy(RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(0x1000, 587), RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, "Spirit Trial Beamos Sun's Song Fairy", RHT_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); // Gossip Stones locationTable[RC_DMC_GOSSIP_STONE] = Location::HintStone(RC_DMC_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 14341, 0x05, "Gossip Stone", {}); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 2ab0ad7d100..e47e3ae6d1c 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1841,11 +1841,20 @@ typedef enum { RC_DMT_FLAG_SUN_FAIRY, RC_LW_SHORTCUT_STORMS_FAIRY, RC_GF_KITCHEN_SUN_FAIRY, + RC_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, + RC_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, + RC_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, + RC_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, + RC_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, + RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, + RC_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, + RC_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, + RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, RC_MAX } RandomizerCheck; @@ -3925,11 +3934,20 @@ typedef enum { RHT_DMT_FLAG_SUN_FAIRY, RHT_LW_SHORTCUT_STORMS_FAIRY, RHT_GF_KITCHEN_SUN_FAIRY, + RHT_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, + RHT_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, + RHT_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, + RHT_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, + RHT_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, + RHT_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, + RHT_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, + RHT_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, RHT_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, RHT_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, RHT_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, RHT_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, RHT_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, + RHT_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, RHT_MAX } RandomizerHintTextKey; diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index e66979d4b25..31613f31048 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -499,11 +499,20 @@ typedef enum { RAND_INF_DMT_FLAG_SUN_FAIRY, RAND_INF_LW_SHORTCUT_STORMS_FAIRY, RAND_INF_GF_KITCHEN_SUN_FAIRY, + RAND_INF_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, + RAND_INF_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, + RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, + RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, + RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, + RAND_INF_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, + RAND_INF_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, + RAND_INF_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, RAND_INF_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, RAND_INF_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, + RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, // If you add anything to this list, you need to update the size of randomizerInf in z64save.h to be ceil(RAND_INF_MAX / 16) RAND_INF_MAX, From 97d2acc8dea370070a331bc649b08399b1b20115 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Fri, 13 Sep 2024 15:50:03 -0700 Subject: [PATCH 087/108] Add Shadow Temple fairies --- .../randomizer/3drando/item_pool.cpp | 13 ++++++-- .../location_access/locacc_shadow_temple.cpp | 6 ++++ soh/soh/Enhancements/randomizer/dungeon.cpp | 6 ++++ .../Enhancements/randomizer/location_list.cpp | 19 +++++++---- .../Enhancements/randomizer/randomizerTypes.h | 33 ++++++++++++------- .../Enhancements/randomizer/randomizer_inf.h | 18 ++++++---- 6 files changed, 69 insertions(+), 26 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index e34ef7cce7b..c60f2b67cf0 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -664,6 +664,15 @@ static void PlaceVanillaFairies() { ctx->PlaceItemInLocation(RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, GetJunkItem(), false, true); ctx->PlaceItemInLocation(RC_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, GetJunkItem(), false, true); } + if (ctx->GetDungeon(Rando::SHADOW_TEMPLE)->IsMQ()) { + ctx->PlaceItemInLocation(RC_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY, GetJunkItem(), false, true); + } else { + ctx->PlaceItemInLocation(RC_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_SHADOW_TEMPLE_PIT_STORM_FAIRY, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, GetJunkItem(), false, true); + } if (ctx->GetDungeon(Rando::BOTTOM_OF_THE_WELL)->IsMQ()) { ctx->PlaceItemInLocation(RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, GetJunkItem(), false, true); ctx->PlaceItemInLocation(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, GetJunkItem(), false, true); @@ -1233,8 +1242,8 @@ void GenerateItemPool() { for (auto rc : Rando::StaticData::overworldFairyLocations) { AddItemToMainPool(GetJunkItem()); } - // 8 extra for Ganon's Castle + 2 Dodongo's Cavern Gossip Stone - int extra = 10; + // 8 extra for Ganon's Castle + 2 Dodongo's Cavern Gossip Stone + 3 Shadow Temple + int extra = 13; extra += ctx->GetDungeon(Rando::FIRE_TEMPLE)->IsVanilla() ? 0 : 2; extra += ctx->GetDungeon(Rando::WATER_TEMPLE)->IsVanilla() ? 0 : 3; extra += ctx->GetDungeon(Rando::SPIRIT_TEMPLE)->IsVanilla() ? 2 : 1; diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp index fb926506007..286e92b0aff 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp @@ -40,6 +40,7 @@ void AreaTable_Init_ShadowTemple() { LOCATION(RC_SHADOW_TEMPLE_COMPASS_CHEST, logic->CanJumpslash), LOCATION(RC_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_HOOKSHOT)), LOCATION(RC_SHADOW_TEMPLE_GS_NEAR_SHIP, false), + LOCATION(RC_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), }, { //Exits Entrance(RR_SHADOW_TEMPLE_HUGE_PIT, {[]{return logic->HasExplosives && logic->IsAdult && logic->SmallKeys(RR_SHADOW_TEMPLE, 1, 2);}}), @@ -58,6 +59,7 @@ void AreaTable_Init_ShadowTemple() { LOCATION(RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, logic->CanJumpslash), LOCATION(RC_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, logic->Hookshot || (randoCtx->GetTrickOption(RT_SHADOW_UMBRELLA_GS) && logic->HoverBoots)), LOCATION(RC_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, logic->SmallKeys(RR_SHADOW_TEMPLE, 2, 3) && ((randoCtx->GetTrickOption(RT_LENS_SHADOW_PLATFORM) && randoCtx->GetTrickOption(RT_LENS_SHADOW)) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->Hookshot), + LOCATION(RC_SHADOW_TEMPLE_PIT_STORM_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), }, { //Exits Entrance(RR_SHADOW_TEMPLE_WIND_TUNNEL, {[]{return ((randoCtx->GetTrickOption(RT_LENS_SHADOW_PLATFORM) && randoCtx->GetTrickOption(RT_LENS_SHADOW)) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->Hookshot && logic->SmallKeys(RR_SHADOW_TEMPLE, 3, 4);}}), @@ -69,6 +71,7 @@ void AreaTable_Init_ShadowTemple() { LOCATION(RC_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, logic->CanJumpslash), LOCATION(RC_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, true), LOCATION(RC_SHADOW_TEMPLE_GS_NEAR_SHIP, logic->CanUse(RG_LONGSHOT) && logic->SmallKeys(RR_SHADOW_TEMPLE, 4, 5)), + LOCATION(RC_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), }, { //Exits Entrance(RR_SHADOW_TEMPLE_BEYOND_BOAT, {[]{return logic->CanJumpslash && logic->CanUse(RG_ZELDAS_LULLABY) && logic->SmallKeys(RR_SHADOW_TEMPLE, 4, 5);}}), @@ -109,6 +112,7 @@ void AreaTable_Init_ShadowTemple() { LOCATION(RC_SHADOW_TEMPLE_MQ_MAP_CHEST, logic->CanAdultAttack || logic->CanUse(RG_NUTS)), LOCATION(RC_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, logic->CanJumpslash), LOCATION(RC_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, logic->CanAdultAttack || logic->CanUse(RG_NUTS)), + LOCATION(RC_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), }, { //Exits Entrance(RR_SHADOW_TEMPLE_MQ_UPPER_HUGE_PIT, {[]{return logic->HasExplosives && logic->SmallKeys(RR_SHADOW_TEMPLE, 2);}}), @@ -120,6 +124,7 @@ void AreaTable_Init_ShadowTemple() { //Trick: logic->CanUse(RG_SONG_OF_TIME) || (LogicShadowMQInvisibleBlades && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_OHKO)) LOCATION(RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST, logic->CanUse(RG_SONG_OF_TIME) || (randoCtx->GetTrickOption(RT_SHADOW_MQ_INVISIBLE_BLADES) && randoCtx->GetOption(RSK_DAMAGE_MULTIPLIER).IsNot(RO_DAMAGE_MULTIPLIER_OHKO))), //Trick: logic->CanUse(RG_SONG_OF_TIME) || (LogicShadowMQInvisibleBlades && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_OHKO)) + LOCATION(RC_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), }, { //Exits Entrance(RR_SHADOW_TEMPLE_MQ_LOWER_HUGE_PIT, {[]{return logic->HasFireSource || randoCtx->GetTrickOption(RT_SHADOW_MQ_HUGE_PIT);}}), @@ -151,6 +156,7 @@ void AreaTable_Init_ShadowTemple() { LOCATION(RC_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST, true), LOCATION(RC_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, true), LOCATION(RC_SHADOW_TEMPLE_MQ_GS_AFTER_WIND, true), + LOCATION(RC_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), }, { //Exits Entrance(RR_SHADOW_TEMPLE_MQ_BEYOND_BOAT, {[]{return logic->CanUse(RG_ZELDAS_LULLABY) && logic->SmallKeys(RR_SHADOW_TEMPLE, 5);}}), diff --git a/soh/soh/Enhancements/randomizer/dungeon.cpp b/soh/soh/Enhancements/randomizer/dungeon.cpp index d958da9bcc6..d18cbc87412 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/dungeon.cpp @@ -526,6 +526,9 @@ Dungeons::Dungeons() { RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, RC_SHADOW_TEMPLE_GS_NEAR_SHIP, + RC_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, + RC_SHADOW_TEMPLE_PIT_STORM_FAIRY, + RC_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, }, { // MQ Locations @@ -554,6 +557,9 @@ Dungeons::Dungeons() { RC_SHADOW_TEMPLE_MQ_GS_AFTER_WIND, RC_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, + RC_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY, + RC_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY, + RC_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY, }, {}, { diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 1d9e6250977..6bbedf3664b 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -2027,20 +2027,27 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_LW_SHORTCUT_STORMS_FAIRY] = Location::Fairy(RC_LW_SHORTCUT_STORMS_FAIRY, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(0x1000, -795), RAND_INF_LW_SHORTCUT_STORMS_FAIRY, "Shortcuts Song of Storms Fairy", RHT_LW_SHORTCUT_STORMS_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); locationTable[RC_GF_KITCHEN_SUN_FAIRY] = Location::Fairy(RC_GF_KITCHEN_SUN_FAIRY, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(0x1000, -621), RAND_INF_GF_KITCHEN_SUN_FAIRY, "Kitchen Sun's Song Fairy", RHT_GF_KITCHEN_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY] = Location::Fairy(RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1896), RAND_INF_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, "After Boulder Room Sun's Song Fairy", RHT_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY] = Location::Fairy(RC_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -220), RAND_INF_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, "Four Armos Room Sun's Song Fairy", RHT_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, 54), RAND_INF_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, "Beamos Song of Storms Fairy", RHT_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_PIT_STORM_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_PIT_STORM_FAIRY, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, 3339), RAND_INF_SHADOW_TEMPLE_PIT_STORM_FAIRY, "Pit Room Song of Storms Fairy", RHT_SHADOW_TEMPLE_PIT_STORM_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -127), RAND_INF_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, "Wind Hint Sun's Song Fairy", RHT_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -1531), RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, "Basement Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY] = Location::Fairy(RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(0x1000, 1186), RAND_INF_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, "Entrance Song of Storms Fairy", RHT_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY] = Location::Fairy(RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, RCQUEST_VANILLA, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(0x1000, -445), RAND_INF_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, "Entrance Song of Storms Fairy", RHT_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY] = Location::Fairy(RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(0x1000, 587), RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, "Spirit Trial Beamos Sun's Song Fairy", RHT_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY] = Location::Fairy(RC_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -551), RAND_INF_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, "MQ Lower Loop Stalfos Room Sun's Song Fairy", RHT_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); locationTable[RC_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY] = Location::Fairy(RC_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1563), RAND_INF_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, "MQ Lower Loop Behind Iron Knuckle Sun's Song Fairy", RHT_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); locationTable[RC_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY] = Location::Fairy(RC_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -540), RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, "MQ Before Dark Link Pilar Sun's Song Fairy", RHT_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); locationTable[RC_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY] = Location::Fairy(RC_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1501), RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, "MQ Before Dark Link Left Song of Storms Fairy", RHT_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); locationTable[RC_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY] = Location::Fairy(RC_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1504), RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, "MQ Before Dark Link Right Sun's Song Fairy", RHT_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY] = Location::Fairy(RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1896), RAND_INF_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, "After Boulder Room Sun's Song Fairy", RHT_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[RC_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY] = Location::Fairy(RC_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -220), RAND_INF_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, "Four Armos Room Sun's Song Fairy", RHT_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); locationTable[RC_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY] = Location::Fairy(RC_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -220), RAND_INF_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, "MQ Dinalfos Room Sun's Song Fairy", RHT_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -1531), RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, "Basement Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, 55), RAND_INF_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY, "MQ Beamos Song of Storms Fairy", RHT_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, 3342), RAND_INF_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY, "MQ Pit Room Song of Storms Fairy", RHT_SHADOW_TEMPLE_PIT_STORM_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -127), RAND_INF_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY, "MQ Wind Hint Sun's Song Fairy", RHT_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); locationTable[RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -437), RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, "MQ East Cell Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -1458), RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, "MQ Basement Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY] = Location::Fairy(RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(0x1000, 1186), RAND_INF_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, "Entrance Song of Storms Fairy", RHT_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - locationTable[RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY] = Location::Fairy(RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, RCQUEST_VANILLA, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(0x1000, -445), RAND_INF_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, "Entrance Song of Storms Fairy", RHT_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY] = Location::Fairy(RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(0x1000, 587), RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, "Spirit Trial Beamos Sun's Song Fairy", RHT_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); // Gossip Stones locationTable[RC_DMC_GOSSIP_STONE] = Location::HintStone(RC_DMC_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 14341, 0x05, "Gossip Stone", {}); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index e47e3ae6d1c..3efb4bb2820 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1841,20 +1841,26 @@ typedef enum { RC_DMT_FLAG_SUN_FAIRY, RC_LW_SHORTCUT_STORMS_FAIRY, RC_GF_KITCHEN_SUN_FAIRY, + RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, + RC_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, + RC_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, + RC_SHADOW_TEMPLE_PIT_STORM_FAIRY, + RC_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, + RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, + RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, + RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, + RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, RC_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, RC_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, RC_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, RC_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, RC_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, - RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, - RC_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, RC_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, - RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, + RC_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY, + RC_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY, + RC_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY, RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, - RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, - RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, - RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, RC_MAX } RandomizerCheck; @@ -3934,20 +3940,23 @@ typedef enum { RHT_DMT_FLAG_SUN_FAIRY, RHT_LW_SHORTCUT_STORMS_FAIRY, RHT_GF_KITCHEN_SUN_FAIRY, + RHT_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, + RHT_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, + RHT_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, + RHT_SHADOW_TEMPLE_PIT_STORM_FAIRY, + RHT_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, + RHT_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, + RHT_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, + RHT_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, + RHT_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, RHT_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, RHT_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, RHT_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, RHT_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, RHT_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, - RHT_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, - RHT_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, RHT_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, - RHT_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, RHT_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, RHT_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, - RHT_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, - RHT_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, - RHT_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, RHT_MAX } RandomizerHintTextKey; diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index 31613f31048..1872eab2b02 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -499,20 +499,26 @@ typedef enum { RAND_INF_DMT_FLAG_SUN_FAIRY, RAND_INF_LW_SHORTCUT_STORMS_FAIRY, RAND_INF_GF_KITCHEN_SUN_FAIRY, + RAND_INF_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, + RAND_INF_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, + RAND_INF_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, + RAND_INF_SHADOW_TEMPLE_PIT_STORM_FAIRY, + RAND_INF_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, + RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, + RAND_INF_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, + RAND_INF_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, + RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, RAND_INF_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, RAND_INF_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, - RAND_INF_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, - RAND_INF_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, RAND_INF_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, + RAND_INF_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY, + RAND_INF_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY, + RAND_INF_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY, RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, - RAND_INF_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, - RAND_INF_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, - RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, // If you add anything to this list, you need to update the size of randomizerInf in z64save.h to be ceil(RAND_INF_MAX / 16) RAND_INF_MAX, From ac0dd73512c3c2fa7607dd9b67ece5cef2183a99 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Fri, 13 Sep 2024 15:55:28 -0700 Subject: [PATCH 088/108] Add fairy check flags to the save editor --- .../Enhancements/debugger/debugSaveEditor.h | 213 ++++++++++++++++++ 1 file changed, 213 insertions(+) diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.h b/soh/soh/Enhancements/debugger/debugSaveEditor.h index c3e01b657cd..73e417675da 100644 --- a/soh/soh/Enhancements/debugger/debugSaveEditor.h +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.h @@ -620,6 +620,219 @@ const std::vector flagTables = { { RAND_INF_ZF_GREAT_FAIRY_REWARD, "RAND_INF_ZF_GREAT_FAIRY_REWARD" }, { RAND_INF_COLOSSUS_GREAT_FAIRY_REWARD, "RAND_INF_COLOSSUS_GREAT_FAIRY_REWARD" }, { RAND_INF_OGC_GREAT_FAIRY_REWARD, "RAND_INF_OGC_GREAT_FAIRY_REWARD" }, + + { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_1, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_1" }, + { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_2, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_2" }, + { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_3, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_3" }, + { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_4, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_4" }, + { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_5, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_5" }, + { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_6, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_6" }, + { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_7, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_7" }, + { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_8, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_8" }, + { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_1, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_1" }, + { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_2, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_2" }, + { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_3, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_3" }, + { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_4, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_4" }, + { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_5, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_5" }, + { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_6, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_6" }, + { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_7, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_7" }, + { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_8, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_8" }, + { RAND_INF_HF_FAIRY_GROTTO_FAIRY_1, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_1" }, + { RAND_INF_HF_FAIRY_GROTTO_FAIRY_2, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_2" }, + { RAND_INF_HF_FAIRY_GROTTO_FAIRY_3, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_3" }, + { RAND_INF_HF_FAIRY_GROTTO_FAIRY_4, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_4" }, + { RAND_INF_HF_FAIRY_GROTTO_FAIRY_5, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_5" }, + { RAND_INF_HF_FAIRY_GROTTO_FAIRY_6, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_6" }, + { RAND_INF_HF_FAIRY_GROTTO_FAIRY_7, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_7" }, + { RAND_INF_HF_FAIRY_GROTTO_FAIRY_8, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_8" }, + { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_1, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_1" }, + { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_2, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_2" }, + { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_3, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_3" }, + { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_4, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_4" }, + { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_5, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_5" }, + { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_6, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_6" }, + { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_7, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_7" }, + { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_8, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_8" }, + { RAND_INF_GF_FAIRY_GROTTO_FAIRY_1, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_1" }, + { RAND_INF_GF_FAIRY_GROTTO_FAIRY_2, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_2" }, + { RAND_INF_GF_FAIRY_GROTTO_FAIRY_3, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_3" }, + { RAND_INF_GF_FAIRY_GROTTO_FAIRY_4, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_4" }, + { RAND_INF_GF_FAIRY_GROTTO_FAIRY_5, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_5" }, + { RAND_INF_GF_FAIRY_GROTTO_FAIRY_6, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_6" }, + { RAND_INF_GF_FAIRY_GROTTO_FAIRY_7, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_7" }, + { RAND_INF_GF_FAIRY_GROTTO_FAIRY_8, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_8" }, + { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_1, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_1" }, + { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_2, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_2" }, + { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_3, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_3" }, + { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_4, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_4" }, + { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_5, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_5" }, + { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_6, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_6" }, + { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_7, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_7" }, + { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_8, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_8" }, + { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_1, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_1" }, + { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_2, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_2" }, + { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_3, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_3" }, + { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_4, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_4" }, + { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_5, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_5" }, + { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_6, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_6" }, + { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_7, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_7" }, + { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_8, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_8" }, + { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1" }, + { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2" }, + { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3" }, + { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4" }, + { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5" }, + { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6" }, + { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7" }, + { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8" }, + { RAND_INF_COLOSSUS_OASIS_FAIRY_1, "RAND_INF_COLOSSUS_OASIS_FAIRY_1" }, + { RAND_INF_COLOSSUS_OASIS_FAIRY_2, "RAND_INF_COLOSSUS_OASIS_FAIRY_2" }, + { RAND_INF_COLOSSUS_OASIS_FAIRY_3, "RAND_INF_COLOSSUS_OASIS_FAIRY_3" }, + { RAND_INF_COLOSSUS_OASIS_FAIRY_4, "RAND_INF_COLOSSUS_OASIS_FAIRY_4" }, + { RAND_INF_COLOSSUS_OASIS_FAIRY_5, "RAND_INF_COLOSSUS_OASIS_FAIRY_5" }, + { RAND_INF_COLOSSUS_OASIS_FAIRY_6, "RAND_INF_COLOSSUS_OASIS_FAIRY_6" }, + { RAND_INF_COLOSSUS_OASIS_FAIRY_7, "RAND_INF_COLOSSUS_OASIS_FAIRY_7" }, + { RAND_INF_COLOSSUS_OASIS_FAIRY_8, "RAND_INF_COLOSSUS_OASIS_FAIRY_8" }, + + { RAND_INF_ZR_BEAN_SPROUT_FAIRY_1, "RAND_INF_ZR_BEAN_SPROUT_FAIRY_1" }, + { RAND_INF_ZR_BEAN_SPROUT_FAIRY_2, "RAND_INF_ZR_BEAN_SPROUT_FAIRY_2" }, + { RAND_INF_ZR_BEAN_SPROUT_FAIRY_3, "RAND_INF_ZR_BEAN_SPROUT_FAIRY_3" }, + { RAND_INF_KF_BEAN_SPROUT_FAIRY_1, "RAND_INF_KF_BEAN_SPROUT_FAIRY_1" }, + { RAND_INF_KF_BEAN_SPROUT_FAIRY_2, "RAND_INF_KF_BEAN_SPROUT_FAIRY_2" }, + { RAND_INF_KF_BEAN_SPROUT_FAIRY_3, "RAND_INF_KF_BEAN_SPROUT_FAIRY_3" }, + { RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1, "RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1" }, + { RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2, "RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2" }, + { RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3, "RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3" }, + { RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1, "RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1" }, + { RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2, "RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2" }, + { RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3, "RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3" }, + { RAND_INF_LH_BEAN_SPROUT_FAIRY_1, "RAND_INF_LH_BEAN_SPROUT_FAIRY_1" }, + { RAND_INF_LH_BEAN_SPROUT_FAIRY_2, "RAND_INF_LH_BEAN_SPROUT_FAIRY_2" }, + { RAND_INF_LH_BEAN_SPROUT_FAIRY_3, "RAND_INF_LH_BEAN_SPROUT_FAIRY_3" }, + { RAND_INF_GV_BEAN_SPROUT_FAIRY_1, "RAND_INF_GV_BEAN_SPROUT_FAIRY_1" }, + { RAND_INF_GV_BEAN_SPROUT_FAIRY_2, "RAND_INF_GV_BEAN_SPROUT_FAIRY_2" }, + { RAND_INF_GV_BEAN_SPROUT_FAIRY_3, "RAND_INF_GV_BEAN_SPROUT_FAIRY_3" }, + { RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_1, "RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_1" }, + { RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_2, "RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_2" }, + { RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_3, "RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_3" }, + { RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_1, "RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_1" }, + { RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_2, "RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_2" }, + { RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_3, "RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_3" }, + { RAND_INF_DMC_BEAN_SPROUT_FAIRY_1, "RAND_INF_DMC_BEAN_SPROUT_FAIRY_1" }, + { RAND_INF_DMC_BEAN_SPROUT_FAIRY_2, "RAND_INF_DMC_BEAN_SPROUT_FAIRY_2" }, + { RAND_INF_DMC_BEAN_SPROUT_FAIRY_3, "RAND_INF_DMC_BEAN_SPROUT_FAIRY_3" }, + { RAND_INF_DMT_BEAN_SPROUT_FAIRY_1, "RAND_INF_DMT_BEAN_SPROUT_FAIRY_1" }, + { RAND_INF_DMT_BEAN_SPROUT_FAIRY_2, "RAND_INF_DMT_BEAN_SPROUT_FAIRY_2" }, + { RAND_INF_DMT_BEAN_SPROUT_FAIRY_3, "RAND_INF_DMT_BEAN_SPROUT_FAIRY_3" }, + + { RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, "RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY" }, + { RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, "RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY" }, + { RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, "RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY" }, + { RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, "RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY" }, + { RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_DMC_GOSSIP_STONE_FAIRY, "RAND_INF_DMC_GOSSIP_STONE_FAIRY" }, + { RAND_INF_DMC_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_DMC_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_DMT_GOSSIP_STONE_FAIRY, "RAND_INF_DMT_GOSSIP_STONE_FAIRY" }, + { RAND_INF_DMT_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_DMT_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY, "RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY" }, + { RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, "RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY" }, + { RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, "RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY" }, + { RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_GV_GOSSIP_STONE_FAIRY, "RAND_INF_GV_GOSSIP_STONE_FAIRY" }, + { RAND_INF_GV_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_GV_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY, "RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY" }, + { RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY, "RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY" }, + { RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY, "RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY" }, + { RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY, "RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY" }, + { RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, "RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY" }, + { RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY" }, + { RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY, "RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY" }, + { RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY, "RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY" }, + { RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_KF_GOSSIP_STONE_FAIRY, "RAND_INF_KF_GOSSIP_STONE_FAIRY" }, + { RAND_INF_KF_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_KF_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY" }, + { RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY, "RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY" }, + { RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY, "RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY" }, + { RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, "RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY" }, + { RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_LW_GOSSIP_STONE_FAIRY, "RAND_INF_LW_GOSSIP_STONE_FAIRY" }, + { RAND_INF_LW_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_LW_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY, "RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY" }, + { RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY, "RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY" }, + { RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY, "RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY" }, + { RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_ZD_GOSSIP_STONE_FAIRY, "RAND_INF_ZD_GOSSIP_STONE_FAIRY" }, + { RAND_INF_ZD_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_ZD_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY, "RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY" }, + { RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY, "RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY" }, + { RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, "RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY" }, + { RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY, "RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY" }, + { RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY" }, + { RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY" }, + { RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY" }, + { RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY" }, + { RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY" }, + { RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY" }, + { RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY" }, + { RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY" }, + { RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY" }, + { RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, + + { RAND_INF_LH_ISLAND_SUN_FAIRY, "RAND_INF_LH_ISLAND_SUN_FAIRY" }, + { RAND_INF_HF_POND_STORMS_FAIRY, "RAND_INF_HF_POND_STORMS_FAIRY" }, + { RAND_INF_DMT_FLAG_SUN_FAIRY, "RAND_INF_DMT_FLAG_SUN_FAIRY" }, + { RAND_INF_LW_SHORTCUT_STORMS_FAIRY, "RAND_INF_LW_SHORTCUT_STORMS_FAIRY" }, + { RAND_INF_GF_KITCHEN_SUN_FAIRY, "RAND_INF_GF_KITCHEN_SUN_FAIRY" }, + { RAND_INF_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, "RAND_INF_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY" }, + { RAND_INF_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, "RAND_INF_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY" }, + { RAND_INF_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, "RAND_INF_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY" }, + { RAND_INF_SHADOW_TEMPLE_PIT_STORM_FAIRY, "RAND_INF_SHADOW_TEMPLE_PIT_STORM_FAIRY" }, + { RAND_INF_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, "RAND_INF_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY" }, + { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY" }, + { RAND_INF_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, "RAND_INF_ICE_CAVERN_ENTRANCE_STORMS_FAIRY" }, + { RAND_INF_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, "RAND_INF_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY" }, + { RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, "RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY" }, + { RAND_INF_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, "RAND_INF_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY" }, + { RAND_INF_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, "RAND_INF_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY" }, + { RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, "RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY" }, + { RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, "RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY" }, + { RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, "RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY" }, + { RAND_INF_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, "RAND_INF_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY" }, + { RAND_INF_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY, "RAND_INF_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY" }, + { RAND_INF_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY, "RAND_INF_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY" }, + { RAND_INF_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY, "RAND_INF_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY" }, + { RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY" }, + { RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY" }, } }, }; From ffb5e8e7b90d13899e8a95b62b93cf54b32d1e41 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Fri, 13 Sep 2024 16:00:37 -0700 Subject: [PATCH 089/108] Filter fairy checks from check tracker --- soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp | 2 ++ soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp index 3b5eed450f7..2873a647675 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp @@ -169,6 +169,8 @@ void RandomizerCheckObjects::UpdateImGuiVisibility() { CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleWeirdEgg"), RO_GENERIC_NO)) && (location.GetRCType() != RCTYPE_FROG_SONG || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleFrogSongRupees"), RO_GENERIC_NO)) && + (location.GetRCType() != RCTYPE_FAIRY || + CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleFairies"), RO_GENERIC_NO)) && (location.GetRCType() != RCTYPE_MAP_COMPASS || CVarGetInteger(CVAR_RANDOMIZER_SETTING("StartingMapsCompasses"), RO_DUNGEON_ITEM_LOC_OWN_DUNGEON) != RO_DUNGEON_ITEM_LOC_VANILLA) && diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index 29b99106b93..1350edd9256 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -69,6 +69,7 @@ bool showHyruleLoach; bool showWeirdEgg; bool showGerudoCard; bool showFrogSongRupees; +bool showFairies; bool showStartingMapsCompasses; bool showKeysanity; bool showGerudoFortressKeys; @@ -1207,6 +1208,9 @@ void LoadSettings() { showFrogSongRupees = IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_FROG_SONG_RUPEES) == RO_GENERIC_YES : false; + showFairies = IS_RANDO ? + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_FAIRIES) == RO_GENERIC_YES + : false; showStartingMapsCompasses = IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_MAPANDCOMPASS) != RO_DUNGEON_ITEM_LOC_VANILLA : false; @@ -1322,6 +1326,7 @@ bool IsCheckShuffled(RandomizerCheck rc) { (rc != RC_HC_MALON_EGG || showWeirdEgg) && (loc->GetRCType() != RCTYPE_FROG_SONG || showFrogSongRupees) && (loc->GetRCType() != RCTYPE_MAP_COMPASS || showStartingMapsCompasses) && + (loc->GetRCType() != RCTYPE_FAIRY || showFairies) && (loc->GetRCType() != RCTYPE_SMALL_KEY || showKeysanity) && (loc->GetRCType() != RCTYPE_BOSS_KEY || showBossKeysanity) && (loc->GetRCType() != RCTYPE_GANON_BOSS_KEY || showGanonBossKey) && From 8356a3a98e80ed5c8224f09295d541810b691479 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Fri, 13 Sep 2024 17:22:20 -0700 Subject: [PATCH 090/108] Add hints for fairy checks --- .../hint_list/hint_list_exclude_dungeon.cpp | 84 +++++ .../hint_list/hint_list_exclude_overworld.cpp | 333 ++++++++++++++++++ 2 files changed, 417 insertions(+) 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 c2117c4eb38..5373bac178c 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 @@ -275,6 +275,15 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The /*french*/ "Selon moi, la #peste Mojo au coeur de la Caverne Dodongo# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #deku custodiado por Lizalfos# vende #[[1]]#. + hintTextTable[RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone in Dodongo's Cavern# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone in Dodongo's Cavern# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + /*-------------------------- | JABU JABUS BELLY | ---------------------------*/ @@ -831,6 +840,14 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa /*french*/ "Selon moi, une #Skulltula près du labyrinthe enflammé du Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula junto a un ardiente laberinto# otorga #[[1]]#. + hintTextTable[RAND_INF_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun in a hot arena# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RAND_INF_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun behind a knight's throne in a volcano# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + /*-------------------------- | WATER TEMPLE | ---------------------------*/ @@ -958,6 +975,18 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa /*french*/ "Selon moi, une #Skulltula au dessus de la rivière du Temple de l'Eau# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula sobre un río# del Templo del Agua otorga #[[1]]#. + hintTextTable[RHT_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun atop a small pillar before a duel with one's shadow# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY] = HintText(CustomMessage("They say that #calling the rain before a duel with one's shadow# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun before a duel with one's shadow# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + /*-------------------------- | SPIRIT TEMPLE | ---------------------------*/ @@ -1191,6 +1220,19 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa /*french*/ "Selon moi, une #Skulltula sur une paroi de verre du Temple de l'Esprit# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #sobre una plataforma de cristal# yace una Skulltula que otorga #[[1]]#. + hintTextTable[RHT_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun past some boulders gaurding silver rupees# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun near four statues# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun near a suspicious chest# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + /*-------------------------- | SHADOW TEMPLE | ---------------------------*/ @@ -1434,6 +1476,18 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th /*french*/ "Selon moi, une #Skulltula près du repère du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula flotante# del Templo de las Sombras otorga #[[1]]#. + hintTextTable[RHT_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY] = HintText(CustomMessage("They say that an #calling the rain for a sentry guarding a house of the dead# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_SHADOW_TEMPLE_PIT_STORM_FAIRY] = HintText(CustomMessage("They say that an #calling the rain on a platform suspended above a bottomless pit# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY] = HintText(CustomMessage("They say that an #calling the sun near an invisible chest guarded by the dead# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!.", {QM_RED, QM_GREEN})); + /*-------------------------- | BOTTOM OF THE WELL | ---------------------------*/ @@ -1552,6 +1606,19 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th /*french*/ "Selon moi, une #Skulltula embarrée dans la crypte au fonds du Puits# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula encerrada en una cripta# del pozo otorga #[[1]]#. + hintTextTable[RHT_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY] = HintText(CustomMessage("They say that an #calling the sun a dead end# within the well reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY] = HintText(CustomMessage("They say that an #calling the sun in an empty cell# within the well reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY] = HintText(CustomMessage("They say that an #calling the sun a dead end# within the well reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!.", {QM_RED, QM_GREEN})); + + /*-------------------------- | ICE CAVERN | ---------------------------*/ @@ -1625,6 +1692,11 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th /*french*/ "Selon moi, une #Skulltula figée dans la glace rouge# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula tras un ardiente hielo# otorga #[[1]]#. + hintTextTable[RHT_ICE_CAVERN_ENTRANCE_STORMS_FAIRY] = HintText(CustomMessage("They say that #calling the rain near the entrance to a frozen cave# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula tras un ardiente hielo# otorga #[[1]]#. + /*-------------------------- | GERUDO TRAINING GROUNDS | ---------------------------*/ @@ -1723,6 +1795,10 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th /*french*/ "Selon moi, #derrière un bloc argent# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #hazaña de fuerza# premia a las bandidas con #[[1]]#. + hintTextTable[RHT_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY] = HintText(CustomMessage("They say that #calling the rain near the entrance to the Gerudo Training Grounds# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_FREESTANDING_KEY] = HintText(CustomMessage("They say that the #Song of Time# in the Gerudo Training Grounds leads to #[[1]]#.", /*german*/ "Man erzählt sich, daß die #Hymne der Zeit# in der Gerudo-Trainingsarena zu #[[1]]# führe.", /*french*/ "Selon moi, le #chant du temps# révèle dans le Gymnase Gerudo #[[1]]#.", {QM_RED, QM_GREEN})); @@ -1886,6 +1962,14 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th /*french*/ "Selon moi, la #musique dans l'épreuve du ciel# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #música en la prueba del resplandor# revela #[[1]]#. + hintTextTable[RHT_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun for a sentry in the test of the sands# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_GANONS_CASTLE_SCRUBS_FAIRY] = HintText(CustomMessage("They say that within a #sanctuary before the final trial# rests #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + hintTextTable[RHT_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST] = HintText(CustomMessage("They say that the #test of the seas# holds #[[1]]#.", /*german*/ "Man erzählt sich, daß die #Prüfung der Meere# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve des mers# contient #[[1]]#.", {QM_RED, QM_GREEN})); diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp index a467c18b513..245f609615a 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp @@ -1490,5 +1490,338 @@ void StaticData::HintTable_Init_Exclude_Overworld() { /*german*/ "Man erzählt sich, daß ein #Bienenstock hinter dem Zora-König# #[[1]]# verberge.", /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #colmena detrás del rey de los zoras# esconde #[[1]]#. + + hintTextTable[RHT_SFM_FAIRY_GROTTO_FAIRY] = HintText(CustomMessage("They say that within #a fountain beneath a forest meadow# rests #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_ZR_FAIRY_GROTTO_FAIRY] = HintText(CustomMessage("They say that within #a fountain beneath a river# rests #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_HF_FAIRY_GROTTO_FAIRY] = HintText(CustomMessage("They say that within #a fountain beneath a a few trees bordering a wide field# rests #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_ZD_FAIRY_GROTTO_FAIRY] = HintText(CustomMessage("They say that within #a fountain beneath the home of the Zoras# rests #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_GF_FAIRY_GROTTO_FAIRY] = HintText(CustomMessage("They say that within #a fountain beneath the home of thieves# rests #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY] = HintText(CustomMessage("They say that within #a fountain behind a wall within a grave# rests #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_COLOSSUS_OASIS_FAIRY] = HintText(CustomMessage("They say that #restoring water to a dried oasis# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_ZR_BEAN_SPROUT_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout on the riverside# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_KF_BEAN_SPROUT_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout near a forest shop# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout near the entrance to the forest# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout above a sylvan theatre# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_LH_BEAN_SPROUT_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout on the lakeside# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_GV_BEAN_SPROUT_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout on the side of a canyon# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_COLOSSUS_BEAN_SPROUT_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout near a temple of the sand# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_GRAVEYARD_BEAN_SPROUT_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout within a graveyard# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_DMC_BEAN_SPROUT_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout within a volcano# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_DMT_BEAN_SPROUT_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout on the moutainside# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_TOT_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone in the ouskirts of the market# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_TOT_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone in the ouskirts of the market# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_DMC_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone within a volcano# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_DMC_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone within a volcano# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_DMT_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone on a mountain cliff face# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_DMT_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone on a mountain cliff face# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_COLOSSUS_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone near the temple of the sane# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_COLOSSUS_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone near the temple of the sane# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_GV_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone near a canyon waterfall# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_GV_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone near a canyon waterfall# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_GC_MAZE_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone behind a maze of rock# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_GC_MAZE_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone behind a maze of rock# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_GC_MEDIGORON_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone near a blacksmith# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone near a blacksmith# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_GRAVEYARD_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone overlooking the graveyard# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone overlooking the graveyard# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_HC_MALON_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone overlooking the path to the castle# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_HC_MALON_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone overlooking the path to the castle# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_HC_ROCK_WALL_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone near a secret path to the castle# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone near a secret path to the castle# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone beneath the castle# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone beneath the castle# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone near an ancient tree# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone near an ancient tree# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_KF_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone overlooking a forest village# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_KF_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone overlooking a forest village# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone beneath a forest village# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone beneath a forest village# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_LH_LAB_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone overlooking the river feeding a lake# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_LH_LAB_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone overlooking the river feeding a lake# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_LH_SOUTHEAST_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone at the back of a lake# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone at the back of a lake# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_LH_SOUTHWEST_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone at the back of a lake# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone at the back of a lake# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_LW_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone within a perplexing wood# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_LW_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone within a perplexing wood# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_SFM_MAZE_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone overlooking a forest maze# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_SFM_MAZE_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone overlooking a forest maze# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_SFM_SARIA_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone watching a hiding place in the woods# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone watching a hiding place in the woods# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_ZD_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone listening to an aquatic king# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_ZD_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone listening to an aquatic king# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_ZF_FAIRY_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone in the ouskirts of a deap fountain# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone in the ouskirts of a deap fountain# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_ZF_JABU_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone watching a guardian of the sea# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_ZF_JABU_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone watching a guardian of the sea# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone overwatching a river# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone overwatching a river# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone beneath a waterfall# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone beneath a waterfall# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_HF_COW_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone hiding near a cow# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone hiding near a cow# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone beneath the entrance to the market# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone beneath the entrance to the market# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone beneath trees guarded by a Peahat# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone beneath trees guarded by a Peahat# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone beneath a village at the base of a mountain# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone beneath a village at the base of a mountain# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone within a plateau by a river# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone within a plateau by a river# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone beneath an escape from the forest# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone beneath an escape from the forest# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone beneath the entrance to a village within a mountain# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone beneath the entrance to a village within a mountain# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone within the side of a crater# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone within the side of a crater# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + } } From 42a57005b85ea0af8053d8100ff3cc15470129ed Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sat, 14 Sep 2024 21:14:25 -0400 Subject: [PATCH 091/108] Fixes hint text issue --- .../custom-message/CustomMessageManager.h | 4 +- .../Enhancements/randomizer/3drando/hints.cpp | 151 ------------------ 2 files changed, 2 insertions(+), 153 deletions(-) diff --git a/soh/soh/Enhancements/custom-message/CustomMessageManager.h b/soh/soh/Enhancements/custom-message/CustomMessageManager.h index eb9347db312..2c797e52735 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageManager.h +++ b/soh/soh/Enhancements/custom-message/CustomMessageManager.h @@ -11,7 +11,7 @@ #undef MESSAGE_END -#define QM_WHITE "\x00" +#define QM_WHITE "\x00"s #define QM_RED "\x41" #define QM_GREEN "\x42" #define QM_BLUE "\x43" @@ -20,7 +20,7 @@ #define QM_YELLOW "\x46" #define QM_BLACK "\x47" -#define HS_HORSE_ARCHERY "\x00" //HS_HBA is an enum already +#define HS_HORSE_ARCHERY "\x00"s //HS_HBA is an enum already typedef enum { MF_FORMATTED, diff --git a/soh/soh/Enhancements/randomizer/3drando/hints.cpp b/soh/soh/Enhancements/randomizer/3drando/hints.cpp index f5af885e3b8..c394f7788c6 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hints.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hints.cpp @@ -315,157 +315,6 @@ std::vector>> conditionalAlways return !ctx->GetOption(RSK_KAK_100_SKULLS_HINT) && TokensRequiredBySettings() < 100; }), }; -static std::map pixelWidthTable = { - { " ", 6 }, { "!", 6 }, { "\"", 5 }, { "#", 7 }, { "$", 7 }, { "%", 11 }, { "&", 9 }, { "\'", 3 }, - { "(", 6 }, { ")", 6 }, { "*", 6 }, { "+", 7 }, { ",", 3 }, { "-", 5 }, { ".", 3 }, { "/", 7 }, - { "0", 8 }, { "1", 4 }, { "2", 7 }, { "3", 7 }, { "4", 8 }, { "5", 7 }, { "6", 7 }, { "7", 7 }, - { "8", 7 }, { "9", 7 }, { ":", 5 }, { ";", 5 }, { "<", 7 }, { "=", 9 }, { ">", 7 }, { "?", 9 }, - { "@", 10 }, { "A", 9 }, { "B", 7 }, { "C", 9 }, { "D", 9 }, { "E", 6 }, { "F", 6 }, { "G", 9 }, - { "H", 8 }, { "I", 3 }, { "J", 6 }, { "K", 8 }, { "L", 6 }, { "M", 10 }, { "N", 9 }, { "O", 10 }, - { "P", 7 }, { "Q", 10 }, { "R", 8 }, { "S", 8 }, { "T", 7 }, { "U", 8 }, { "V", 9 }, { "W", 12 }, - { "X", 9 }, { "Y", 8 }, { "Z", 8 }, { "[", 6 }, { "\\", 8 }, { "]", 6 }, { "^", 8 }, { "_", 7 }, - { "`", 4 }, { "a", 6 }, { "b", 7 }, { "c", 6 }, { "d", 7 }, { "e", 7 }, { "f", 5 }, { "g", 7 }, - { "h", 6 }, { "i", 3 }, { "j", 5 }, { "k", 6 }, { "l", 3 }, { "m", 9 }, { "n", 7 }, { "o", 7 }, - { "p", 7 }, { "q", 7 }, { "r", 6 }, { "s", 6 }, { "t", 6 }, { "u", 6 }, { "v", 7 }, { "w", 9 }, - { "x", 6 }, { "y", 7 }, { "z", 6 }, { "{", 6 }, { "¦", 4 }, { "}", 6 }, { "¡", 5 }, { "¢", 7 }, - { "£", 8 }, { "¤", 7 }, { "¥", 8 }, { "|", 4 }, { "§", 12 }, { "¨", 12 }, { "©", 10 }, { "ª", 5 }, - { "«", 8 }, { "¬", 7 }, { "\u00AD", 6 }, { "®", 10 }, { "¯", 8 }, { "°", 12 }, { "±", 12 }, { "²", 5 }, - { "³", 5 }, { "µ", 6 }, { "¶", 8 }, { "·", 4 }, { "¹", 4 }, { "º", 5 }, { "»", 9 }, { "¼", 9 }, - { "½", 9 }, { "¾", 10 }, { "¿", 7 }, { "À", 11 }, { "Á", 9 }, { "Â", 9 }, { "Ã", 9 }, { "Ä", 9 }, - { "Å", 9 }, { "Æ", 12 }, { "Ç", 9 }, { "È", 6 }, { "É", 6 }, { "Ê", 6 }, { "Ë", 6 }, { "Ì", 5 }, - { "Í", 5 }, { "Î", 5 }, { "Ï", 5 }, { "Ð", 10 }, { "Ñ", 9 }, { "Ò", 10 }, { "Ó", 10 }, { "Ô", 10 }, - { "Õ", 10 }, { "Ö", 10 }, { "×", 9 }, { "Ø", 10 }, { "Ù", 8 }, { "Ú", 8 }, { "Û", 8 }, { "Ü", 8 }, - { "Ý", 10 }, { "Þ", 8 }, { "ß", 7 }, { "à", 6 }, { "á", 6 }, { "â", 6 }, { "ã", 6 }, { "ä", 6 }, - { "å", 6 }, { "æ", 11 }, { "ç", 6 }, { "è", 7 }, { "é", 7 }, { "ê", 7 }, { "ë", 7 }, { "ì", 5 }, - { "í", 5 }, { "î", 5 }, { "ï", 5 }, { "ð", 7 }, { "ñ", 7 }, { "ò", 7 }, { "ó", 7 }, { "ô", 7 }, - { "õ", 7 }, { "ö", 7 }, { "÷", 11 }, { "ø", 9 }, { "ù", 7 }, { "ú", 7 }, { "û", 7 }, { "ü", 7 }, - { "ý", 8 }, { "þ", 8 }, { "ÿ", 8 }, { "Œ", 11 }, { "œ", 11 }, { "„", 5 }, { "”", 5 }, { "€", 10 }, - { "Ÿ", 10 }, { "~", 8 } -}; - -static size_t NextLineLength(const std::string* textStr, const size_t lastNewline, bool hasIcon = false) { - const size_t maxLinePixelWidth = hasIcon ? 200 : 216; - - - size_t totalPixelWidth = 0; - size_t currentPos = lastNewline; - - // Looping through the string from the lastNewline until the total - // width of counted characters exceeds the maximum pixels in a line. - size_t nextPosJump = 0; - while (totalPixelWidth < maxLinePixelWidth && currentPos < textStr->length()) { - // Skip over control codes - if (textStr->at(currentPos) == '%') { - nextPosJump = 2; - } else if (textStr->at(currentPos) == '$') { - nextPosJump = 2; - } else if (textStr->at(currentPos) == '@') { - nextPosJump = 1; - // Assume worst case for player name 12 * 8 (widest character * longest name length) - totalPixelWidth += 96; - } else { - // Some characters only one byte while others are two bytes - // So check both possibilities when checking for a character - if (pixelWidthTable.count(textStr->substr(currentPos, 1))) { - totalPixelWidth += pixelWidthTable[textStr->substr(currentPos, 1)]; - nextPosJump = 1; - } else if (pixelWidthTable.count(textStr->substr(currentPos, 2))) { - totalPixelWidth += pixelWidthTable[textStr->substr(currentPos, 2)]; - nextPosJump = 2; - } else { - SPDLOG_DEBUG("Table does not contain " + textStr->substr(currentPos, 1) + "/" + textStr->substr(currentPos, 2)); - SPDLOG_DEBUG("Full string: " + *textStr); - nextPosJump = 1; - } - } - currentPos += nextPosJump; - } - // return the total number of characters we looped through - if (totalPixelWidth > maxLinePixelWidth && textStr->at(currentPos - nextPosJump) != ' ') { - return currentPos - lastNewline - nextPosJump; - } else { - return currentPos - lastNewline; - } -} - -Text AutoFormatHintText(const Text& unformattedHintText, const std::vector& colors = {}) { - std::array strings; - for (int i = 0; i < LANGUAGE_MAX; i++) { - std::string textStr = unformattedHintText.GetForLanguage(i); - - for (const auto& color: colors) { - if (const size_t firstHashtag = textStr.find('#'); firstHashtag != std::string::npos) { - textStr.replace(firstHashtag, 1, color); - if (const size_t secondHashtag = textStr.find('#', firstHashtag + 1); secondHashtag != std::string::npos) { - textStr.replace(secondHashtag, 1, QM_WHITE); - } else { - SPDLOG_DEBUG("non-matching hashtags in string: \"%s\"", textStr); - } - } - } - // Remove any remaining '#' characters. - std::erase(textStr, '#'); - - // insert newlines either manually or when encountering a '&' - size_t lastNewline = 0; - const bool hasIcon = textStr.find('$', 0) != std::string::npos; - size_t lineLength = NextLineLength(&textStr, lastNewline, hasIcon); - while (lastNewline + lineLength < textStr.length()) { - const size_t carrot = textStr.find('^', lastNewline); - const size_t ampersand = textStr.find('&', lastNewline); - const size_t lastSpace = textStr.rfind(' ', lastNewline + lineLength); - const size_t lastPeriod = textStr.rfind('.', lastNewline + lineLength); - // replace '&' first if it's within the newline range - if (ampersand < lastNewline + lineLength) { - lastNewline = ampersand + 1; - // or move the lastNewline cursor to the next line if a '^' is encountered - } else if (carrot < lastNewline + lineLength) { - lastNewline = carrot + 1; - // some lines need to be split but don't have spaces, look for periods instead - } else if (lastSpace == std::string::npos) { - textStr.replace(lastPeriod, 1, ".&"); - lastNewline = lastPeriod + 2; - } else { - textStr.replace(lastSpace, 1, "&"); - lastNewline = lastSpace + 1; - } - lineLength = NextLineLength(&textStr, lastNewline, hasIcon); - } - strings[i] = textStr; - } - - return {strings[0], strings[2], ""/*spanish*/, strings[1]}; -} - -std::array dungeonInfoData; - -Text childAltarText; -Text adultAltarText; -Text ganonText; -Text ganonHintText; -Text sheikText; -Text warpMinuetText; -Text warpBoleroText; -Text warpSerenadeText; -Text warpRequiemText; -Text warpNocturneText; -Text warpPreludeText; - -std::string masterSwordHintLoc; -std::string lightArrowHintLoc; - -void SetGanonText(Text text){ - ganonText = text; -} - - -std::string GetMasterSwordHintLoc() { - return masterSwordHintLoc; -} - -std::string GetLightArrowHintLoc() { - return lightArrowHintLoc; -} static std::vector GetEmptyGossipStones() { auto emptyGossipStones = GetEmptyLocations(Rando::StaticData::gossipStoneLocations); From 7f503c33d22738c8781e5efbb8170ea4d6b2d83e Mon Sep 17 00:00:00 2001 From: Malkierian Date: Sat, 14 Sep 2024 19:38:22 -0700 Subject: [PATCH 092/108] Concurrency Fix (#4318) * Removed all CVarLoad uses from code to prevent thread concurrency issues. * Add mutext locks to save and load functions to prevent concurrent operations between those two. --- soh/soh/Enhancements/debugconsole.cpp | 3 +-- soh/soh/Enhancements/randomizer/3drando/rando_main.cpp | 3 +-- soh/soh/Enhancements/randomizer/randomizer.cpp | 3 +-- soh/soh/SaveManager.cpp | 5 +++++ soh/soh/SaveManager.h | 1 + 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/soh/soh/Enhancements/debugconsole.cpp b/soh/soh/Enhancements/debugconsole.cpp index ad51f1e4b01..f1f3ac76b0e 100644 --- a/soh/soh/Enhancements/debugconsole.cpp +++ b/soh/soh/Enhancements/debugconsole.cpp @@ -1590,6 +1590,5 @@ void DebugConsole_Init(void) { {"group_name", Ship::ArgumentType::TEXT, true}, }}); - CVarSave(); - CVarLoad(); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); } diff --git a/soh/soh/Enhancements/randomizer/3drando/rando_main.cpp b/soh/soh/Enhancements/randomizer/3drando/rando_main.cpp index 6f342535b00..9705d9a1430 100644 --- a/soh/soh/Enhancements/randomizer/3drando/rando_main.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/rando_main.cpp @@ -22,8 +22,7 @@ void RandoMain::GenerateRando(std::unordered_map cvarS std::string fileName = Ship::Context::GetPathRelativeToAppDirectory(GenerateRandomizer(cvarSettings, excludedLocations, enabledTricks, seedString).c_str()); CVarSetString(CVAR_GENERAL("SpoilerLog"), fileName.c_str()); - CVarSave(); - CVarLoad(); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); CVarSetInteger(CVAR_GENERAL("NewSeedGenerated"), 1); } diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 487348c9db7..d2a6c5029bf 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -3053,8 +3053,7 @@ void GenerateRandomizerImgui(std::string seed = "") { RandoMain::GenerateRando(cvarSettings, excludedLocations, enabledTricks, seed); CVarSetInteger(CVAR_GENERAL("RandoGenerating"), 0); - CVarSave(); - CVarLoad(); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); generated = 1; } diff --git a/soh/soh/SaveManager.cpp b/soh/soh/SaveManager.cpp index b6fd0cb07c2..a1ea20b8a30 100644 --- a/soh/soh/SaveManager.cpp +++ b/soh/soh/SaveManager.cpp @@ -17,6 +17,7 @@ #include #include #include +#include extern "C" SaveContext gSaveContext; using namespace std::string_literals; @@ -909,6 +910,7 @@ int copy_file(const char* src, const char* dst) { // Threaded SaveFile takes copy of gSaveContext for local unmodified storage void SaveManager::SaveFileThreaded(int fileNum, SaveContext* saveContext, int sectionID) { + saveMtx.lock(); SPDLOG_INFO("Save File - fileNum: {}", fileNum); // Needed for first time save, hasn't changed in forever anyway saveBlock["version"] = 1; @@ -983,6 +985,7 @@ void SaveManager::SaveFileThreaded(int fileNum, SaveContext* saveContext, int se InitMeta(fileNum); GameInteractor::Instance->ExecuteHooks(fileNum); SPDLOG_INFO("Save File Finish - fileNum: {}", fileNum); + saveMtx.unlock(); } // SaveSection creates a copy of gSaveContext to prevent mid-save data modification, and passes its reference to SaveFileThreaded @@ -1025,6 +1028,7 @@ void SaveManager::SaveGlobal() { } void SaveManager::LoadFile(int fileNum) { + saveMtx.lock(); SPDLOG_INFO("Load File - fileNum: {}", fileNum); std::filesystem::path fileName = GetFileName(fileNum); assert(std::filesystem::exists(fileName)); @@ -1087,6 +1091,7 @@ void SaveManager::LoadFile(int fileNum) { SohGui::RegisterPopup("Error loading save file", "A problem occurred loading the save in slot " + std::to_string(fileNum + 1) + ".\nSave file corruption is suspected.\n" + "The file has been renamed to prevent further issues."); } + saveMtx.unlock(); } void SaveManager::ThreadPoolWait() { diff --git a/soh/soh/SaveManager.h b/soh/soh/SaveManager.h index 817fc6fbfb2..df54992778d 100644 --- a/soh/soh/SaveManager.h +++ b/soh/soh/SaveManager.h @@ -184,6 +184,7 @@ class SaveManager { nlohmann::json* currentJsonContext = nullptr; nlohmann::json::iterator currentJsonArrayContext; std::shared_ptr smThreadPool; + std::mutex saveMtx; }; #else From 19dc4dc0faa4a04b2d986e17b3e6dd2a79059baf Mon Sep 17 00:00:00 2001 From: Archez Date: Sat, 14 Sep 2024 23:13:46 -0400 Subject: [PATCH 093/108] Bump LUS (#4341) --- libultraship | 2 +- soh/soh/OTRGlobals.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libultraship b/libultraship index 92bce011545..0302eab051a 160000 --- a/libultraship +++ b/libultraship @@ -1 +1 @@ -Subproject commit 92bce01154589080e534c3c143913a196e161f02 +Subproject commit 0302eab051a7e0e5a8dc208aca5b00899a91808c diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 6e41eb7a8a8..6ab2f658aa7 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -338,7 +338,7 @@ OTRGlobals::OTRGlobals() { overlay->LoadFont("Fipps", "fonts/Fipps-Regular.otf", 32.0f); overlay->SetCurrentFont(CVarGetString(CVAR_GAME_OVERLAY_FONT, "Press Start 2P")); - context->InitAudio(); + context->InitAudio({ .SampleRate = 44100, .SampleLength = 1024, .DesiredBuffered = 2480 }); SPDLOG_INFO("Starting Ship of Harkinian version {} (Branch: {} | Commit: {})", (char*)gBuildVersion, (char*)gGitBranch, (char*)gGitCommitHash); From 8359d2a8f075e9c7efdf387b2f9e7d54f3e513e7 Mon Sep 17 00:00:00 2001 From: Archez Date: Sat, 14 Sep 2024 23:45:10 -0400 Subject: [PATCH 094/108] Update entrance tracker settings window for modern menu changes --- .../randomizer/randomizer_entrance_tracker.cpp | 9 --------- soh/soh/SohGui.cpp | 2 +- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp index 09602e91754..4cf9d623aad 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp @@ -640,13 +640,6 @@ void InitEntranceTrackingData() { } void EntranceTrackerSettingsWindow::DrawElement() { - ImGui::SetNextWindowSize(ImVec2(600, 375), ImGuiCond_FirstUseEver); - - if (!ImGui::Begin("Entrance Tracker Settings", &mIsVisible, ImGuiWindowFlags_NoFocusOnAppearing)) { - ImGui::End(); - return; - } - if (ImGui::BeginTable("entranceTrackerSettings", 1, ImGuiTableFlags_BordersInnerH)) { ImGui::TableNextColumn(); @@ -718,8 +711,6 @@ void EntranceTrackerSettingsWindow::DrawElement() { ImGui::EndTable(); } - - ImGui::End(); } void EntranceTrackerWindow::Draw() { diff --git a/soh/soh/SohGui.cpp b/soh/soh/SohGui.cpp index 13b58f48ff4..4bef8cea675 100644 --- a/soh/soh/SohGui.cpp +++ b/soh/soh/SohGui.cpp @@ -193,7 +193,7 @@ namespace SohGui { gui->AddGuiWindow(mCheckTrackerSettingsWindow); mEntranceTrackerWindow = std::make_shared(CVAR_WINDOW("EntranceTracker"), "Entrance Tracker"); gui->AddGuiWindow(mEntranceTrackerWindow); - mEntranceTrackerSettingsWindow = std::make_shared(CVAR_WINDOW("EntranceTrackerSettings"), "Entrance Tracker Settings"); + mEntranceTrackerSettingsWindow = std::make_shared(CVAR_WINDOW("EntranceTrackerSettings"), "Entrance Tracker Settings", ImVec2(600, 375)); gui->AddGuiWindow(mEntranceTrackerSettingsWindow); mItemTrackerWindow = std::make_shared(CVAR_WINDOW("ItemTracker"), "Item Tracker"); gui->AddGuiWindow(mItemTrackerWindow); From 38c76323eb672e52c4df94b9961c7074c28f0e47 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 15 Sep 2024 16:44:25 -0400 Subject: [PATCH 095/108] Re-adds missing hint text --- .../randomizer/3drando/hint_list/hint_list_item.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) 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 f9aa2a28042..4a4331c8f98 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 @@ -2057,6 +2057,15 @@ void StaticData::HintTable_Init_Item() { }, { CustomMessage("a fish-puller", /*german*/"ein Fischzieher", /*french*/"(canne à pêche)")}); // /*spanish*/(caña de pescar) + // TODO: Translations + hintTextTable[RHT_ICE_CAVERN_SILVER_RUPEE] = HintText(CustomMessage("an Ice Cavern Silver Rupee"), { CustomMessage("a Silver Rupee") }, { CustomMessage("cold unlocking currency") }); + hintTextTable[RHT_BOTTOM_OF_THE_WELL_SILVER_RUPEE] = HintText(CustomMessage("a Bottom of the Well Silver Rupee"), { CustomMessage("a Silver Rupee") }, { CustomMessage("damp unlocking currency") }); + hintTextTable[RHT_GERUDO_TRAINING_GROUNDS_SILVER_RUPEE] = HintText(CustomMessage("a Gerudo Training Grounds Silver Rupee"), { CustomMessage("a Silver Rupee") }, { CustomMessage("stolen unlocking currency") }); + hintTextTable[RHT_SPIRIT_TEMPLE_SILVER_RUPEE] = HintText(CustomMessage("a Spirit Temple Silver Rupee"), { CustomMessage("a Silver Rupee") }, { CustomMessage("spiritual unlocking currency") }); + hintTextTable[RHT_SHADOW_TEMPLE_SILVER_RUPEE] = HintText(CustomMessage("a Shadow Temple Silver Rupee"), { CustomMessage("a Silver Rupee") }, { CustomMessage("dark unlocking currency") }); + hintTextTable[RHT_GANONS_CASTLE_SILVER_RUPEE] = HintText(CustomMessage("a Ganon's Castle Silver Rupee"), { CustomMessage("a Silver Rupee") }, { CustomMessage("evil unlocking currency") }); + hintTextTable[RHT_DODONGOS_CAVERN_SILVER_RUPEE] = HintText(CustomMessage("a Dodongo's Cavern Silver Rupee"), { CustomMessage("a Silver Rupee") }, {CustomMessage("explosive unlocking currency") }); + // TODO: End Translations hintTextTable[RHT_QUIVER_INF] = HintText(CustomMessage("", /*german*/"!!!", /*french*/"!!!"), { From 1b51750ec04ef4ce956301eb6c636c7bda355e4d Mon Sep 17 00:00:00 2001 From: Pepper0ni <93387759+Pepper0ni@users.noreply.github.com> Date: Tue, 17 Sep 2024 16:26:10 +0100 Subject: [PATCH 096/108] remove a return 0 (#4347) --- soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c b/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c index 7b6afefaaa1..5bc2b690dcd 100644 --- a/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c +++ b/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c @@ -280,7 +280,7 @@ void func_80A9CB18(EnKz* this, PlayState* play) { yaw -= this->actor.shape.rot.y; if ((fabsf(yaw) > 1638.0f) || (this->actor.xzDistToPlayer < 265.0f)) { this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; - return 0; + return; } this->actor.flags |= ACTOR_FLAG_TARGETABLE; From 6cd387ddf334ba73c812916f64a0a5874b69208b Mon Sep 17 00:00:00 2001 From: Malkierian Date: Tue, 17 Sep 2024 08:40:38 -0700 Subject: [PATCH 097/108] Fix Deku Mouth for Entrance Rando and Mido Rando Functionality (#4342) * Restore Deku Tree open as adult with dungeon shuffle. * Add Mido spawn VB to allow for preventing Mido moving in rando when starting with Zelda's letter and closed deku or forest. * Use RAND_GET_OPTION instead of OTRGlobals rando context, get rid of IS_RANDO in deku mouth VB handler. --- .../Enhancements/game-interactor/GameInteractor.h | 2 ++ soh/soh/Enhancements/randomizer/hook_handlers.cpp | 14 ++++++++++++++ soh/src/overlays/actors/ovl_En_Md/z_en_md.c | 2 +- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.h b/soh/soh/Enhancements/game-interactor/GameInteractor.h index 3523fa4057f..108d2f33e81 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor.h @@ -78,6 +78,8 @@ typedef enum { // Vanilla condition: INFTABLE_GREETED_BY_SARIA VB_NOT_BE_GREETED_BY_SARIA, // Opt: *EnMd + VB_MIDO_SPAWN, + // Opt: *EnMd // Vanilla condition: EnMd->interactInfo.talkState == NPC_TALK_STATE_ACTION VB_MOVE_MIDO_IN_KOKIRI_FOREST, // Opt: *EnMd diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index 4bd8da74259..92a1b278c90 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -12,6 +12,7 @@ extern "C" { #include "functions.h" #include "variables.h" #include "soh/Enhancements/randomizer/adult_trade_shuffle.h" +#include "src/overlays/actors/ovl_Bg_Treemouth/z_bg_treemouth.h" #include "src/overlays/actors/ovl_En_Si/z_en_si.h" #include "src/overlays/actors/ovl_En_Cow/z_en_cow.h" #include "src/overlays/actors/ovl_En_Shopnuts/z_en_shopnuts.h" @@ -614,6 +615,11 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void case VB_BE_ELIGIBLE_FOR_PRELUDE_OF_LIGHT: *should = !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_PRELUDE_OF_LIGHT) && CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST); break; + case VB_MIDO_SPAWN: + if (RAND_GET_OPTION(RSK_FOREST) != RO_FOREST_OPEN && !Flags_GetEventChkInf(EVENTCHKINF_SHOWED_MIDO_SWORD_SHIELD)) { + *should = true; + } + break; case VB_MOVE_MIDO_IN_KOKIRI_FOREST: if (RAND_GET_OPTION(RSK_FOREST) == RO_FOREST_OPEN) { *should = true; @@ -1465,6 +1471,14 @@ void RandomizerOnActorInitHandler(void* actorRef) { } } + if (actor->id == ACTOR_BG_TREEMOUTH && LINK_IS_ADULT && + RAND_GET_OPTION(RSK_SHUFFLE_DUNGEON_ENTRANCES) != RO_DUNGEON_ENTRANCE_SHUFFLE_OFF && + (RAND_GET_OPTION(RSK_FOREST) == RO_FOREST_OPEN || + Flags_GetEventChkInf(EVENTCHKINF_SHOWED_MIDO_SWORD_SHIELD))) { + BgTreemouth* bgTreemouth = static_cast(actorRef); + bgTreemouth->unk_168 = 1.0f; + } + //consumable bags if ( actor->id == ACTOR_EN_ITEM00 && diff --git a/soh/src/overlays/actors/ovl_En_Md/z_en_md.c b/soh/src/overlays/actors/ovl_En_Md/z_en_md.c index f55123f5b77..5567f3e29dd 100644 --- a/soh/src/overlays/actors/ovl_En_Md/z_en_md.c +++ b/soh/src/overlays/actors/ovl_En_Md/z_en_md.c @@ -646,7 +646,7 @@ void EnMd_Init(Actor* thisx, PlayState* play) { Collider_InitCylinder(play, &this->collider); Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit); CollisionCheck_SetInfo2(&this->actor.colChkInfo, NULL, &sColChkInfoInit); - if (!EnMd_ShouldSpawn(this, play)) { + if (!GameInteractor_Should(VB_MIDO_SPAWN, EnMd_ShouldSpawn(this, play), this)) { Actor_Kill(&this->actor); return; } From cd92e70b84630284f60169348d4c182a11520a6b Mon Sep 17 00:00:00 2001 From: Pepper0ni <93387759+Pepper0ni@users.noreply.github.com> Date: Tue, 17 Sep 2024 18:06:30 +0100 Subject: [PATCH 098/108] Refactor GetAccessibleLocations (#3871) * saving for branch change * V0 doesn't work * crashing in random places halp * push to rebase * commit for branch change * more branch switching * First apparent working * fix entrence validation * comment cleanups * post merge fixes * Fix entrences not validating when spawns/owl drops are on but other entrences are not * remove bombchusFound from the struct too * Fix issue causing improper bombchu filtering on the playthrough * text fixes * submodules pls * submodules pls pt 2 --- .../Enhancements/randomizer/3drando/fill.cpp | 630 +++++++++++------- .../Enhancements/randomizer/3drando/fill.hpp | 23 +- .../Enhancements/randomizer/3drando/hints.cpp | 6 +- .../randomizer/3drando/location_access.cpp | 7 +- .../randomizer/3drando/location_access.hpp | 4 +- .../location_access/locacc_castle_town.cpp | 5 +- soh/soh/Enhancements/randomizer/entrance.cpp | 4 +- soh/soh/Enhancements/randomizer/logic.cpp | 9 +- soh/soh/Enhancements/randomizer/logic.h | 2 +- 9 files changed, 411 insertions(+), 279 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/fill.cpp b/soh/soh/Enhancements/randomizer/3drando/fill.cpp index 835055ee4a5..366fa1ed1ae 100644 --- a/soh/soh/Enhancements/randomizer/3drando/fill.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/fill.cpp @@ -22,6 +22,57 @@ using namespace CustomMessages; using namespace Rando; + +//RANDOTODO merge into Logic once Logic is a class passed to logic funtions +struct GetAccessableLocationsStruct { + std::vector accessibleLocations; + std::vector regionPool; + //Variables for playthrough + int gsCount; + int maxGsCount; + std::vector buyIgnores; + + //Variables for search + std::vector newItemLocations; + bool updatedEvents; + bool ageTimePropogated; + bool firstIteration; + + //Variables For Validating Entrences + bool haveTimeAccess; + bool foundTempleOfTime; + bool validatedStartingRegion; + bool sphereZeroComplete; + + std::vector itemSphere; + std::list entranceSphere; + + GetAccessableLocationsStruct(int _maxGsCount){ + regionPool = {RR_ROOT}; + gsCount = 0; + maxGsCount = _maxGsCount; + updatedEvents = false; + ageTimePropogated = false; + firstIteration = true; + haveTimeAccess = false; + foundTempleOfTime = false; + validatedStartingRegion = false; + sphereZeroComplete = false; + } + + void InitLoop(){ + firstIteration = false; + ageTimePropogated = false; + updatedEvents = false; + for (Rando::ItemLocation* location : newItemLocations) { + location->ApplyPlacedItemEffect(); + } + newItemLocations.clear(); + itemSphere.clear(); + entranceSphere.clear(); + } +}; + static bool placementFailure = false; static void RemoveStartingItemsFromPool() { @@ -47,12 +98,12 @@ static void RemoveStartingItemsFromPool() { } } -//This function will propogate Time of Day access through the entrance -static bool UpdateToDAccess(Entrance* entrance, SearchMode mode) { +//This function will propagate Time of Day access through the entrance +static bool UpdateToDAccess(Entrance* entrance, bool propagateTimeTravel) { bool ageTimePropogated = false; - //propogate childDay, childNight, adultDay, and adultNight separately + //propagate childDay, childNight, adultDay, and adultNight separately Area* parent = entrance->GetParentRegion(); Area* connection = entrance->GetConnectedRegion(); @@ -74,11 +125,10 @@ static bool UpdateToDAccess(Entrance* entrance, SearchMode mode) { } //special check for temple of time - bool propogateTimeTravel = mode != SearchMode::TimePassAccess && mode != SearchMode::TempleOfTimeAccess; - if (!AreaTable(RR_ROOT)->Adult() && AreaTable(RR_TOT_BEYOND_DOOR_OF_TIME)->Child() && propogateTimeTravel) { + if (propagateTimeTravel && !AreaTable(RR_ROOT)->Adult() && AreaTable(RR_TOT_BEYOND_DOOR_OF_TIME)->Child()) { //RANDOTODO: sphere weirdness, other age locations not propagated in this sphere AreaTable(RR_ROOT)->adultDay = AreaTable(RR_TOT_BEYOND_DOOR_OF_TIME)->childDay; AreaTable(RR_ROOT)->adultNight = AreaTable(RR_TOT_BEYOND_DOOR_OF_TIME)->childNight; - } else if (!AreaTable(RR_ROOT)->Child() && AreaTable(RR_TOT_BEYOND_DOOR_OF_TIME)->Adult() && propogateTimeTravel){ + } else if (propagateTimeTravel && !AreaTable(RR_ROOT)->Child() && AreaTable(RR_TOT_BEYOND_DOOR_OF_TIME)->Adult()){ AreaTable(RR_ROOT)->childDay = AreaTable(RR_TOT_BEYOND_DOOR_OF_TIME)->adultDay; AreaTable(RR_ROOT)->childNight = AreaTable(RR_TOT_BEYOND_DOOR_OF_TIME)->adultNight; } @@ -86,55 +136,85 @@ static bool UpdateToDAccess(Entrance* entrance, SearchMode mode) { return ageTimePropogated; } -// Various checks that need to pass for the world to be validated as completable -static void ValidateWorldChecks(SearchMode& mode, bool checkPoeCollectorAccess, bool checkOtherEntranceAccess, std::vector& areaPool) { +// Check if key locations in the overworld are accessable +static void ValidateOtherEntrance(GetAccessableLocationsStruct& gals) { auto ctx = Rando::Context::GetInstance(); // Condition for validating Temple of Time Access - if (mode == SearchMode::TempleOfTimeAccess && ((ctx->GetSettings()->ResolvedStartingAge() == RO_AGE_CHILD && AreaTable(RR_TEMPLE_OF_TIME)->Adult()) || (ctx->GetSettings()->ResolvedStartingAge() == RO_AGE_ADULT && AreaTable(RR_TEMPLE_OF_TIME)->Child()) || !checkOtherEntranceAccess)) { - mode = SearchMode::ValidStartingRegion; + if (!gals.foundTempleOfTime && ((ctx->GetSettings()->ResolvedStartingAge() == RO_AGE_CHILD && AreaTable(RR_TEMPLE_OF_TIME)->Adult()) || + (ctx->GetSettings()->ResolvedStartingAge() == RO_AGE_ADULT && AreaTable(RR_TEMPLE_OF_TIME)->Child()))) { + gals.foundTempleOfTime = true; } // Condition for validating a valid starting region - if (mode == SearchMode::ValidStartingRegion) { + if (!gals.validatedStartingRegion) { bool childAccess = ctx->GetSettings()->ResolvedStartingAge() == RO_AGE_CHILD || AreaTable(RR_TOT_BEYOND_DOOR_OF_TIME)->Child(); bool adultAccess = ctx->GetSettings()->ResolvedStartingAge() == RO_AGE_ADULT || AreaTable(RR_TOT_BEYOND_DOOR_OF_TIME)->Adult(); Area* kokiri = AreaTable(RR_KOKIRI_FOREST); Area* kakariko = AreaTable(RR_KAKARIKO_VILLAGE); - if ((childAccess && (kokiri->Child() || kakariko->Child())) || - (adultAccess && (kokiri->Adult() || kakariko->Adult())) || - !checkOtherEntranceAccess) { - mode = SearchMode::PoeCollectorAccess; - ApplyStartingInventory(); - logic->NoBottles = true; + if ((childAccess && (kokiri->Child() || kakariko->Child())) ||// RANDOTODO when proper ammo logic is done, this could probably be made optional + (adultAccess && (kokiri->Adult() || kakariko->Adult()))) { + gals.validatedStartingRegion = true; + ApplyStartingInventory(); // RANDOTODO when proper ammo logic is done, this could be moved to the start } } - // Condition for validating Poe Collector Access - if (mode == SearchMode::PoeCollectorAccess && (AreaTable(RR_MARKET_GUARD_HOUSE)->Adult() || !checkPoeCollectorAccess)) { +} + +// Apply all items that are necessary for checking all location access +static void ApplyAllAdvancmentItems(){ + std::vector itemsToPlace = + FilterFromPool(ItemPool, [](const auto i) { return Rando::StaticData::RetrieveItem(i).IsAdvancement(); }); + for (RandomizerGet unplacedItem : itemsToPlace) { + Rando::StaticData::RetrieveItem(unplacedItem).ApplyEffect(); + } +} + +// Check if everything in an entrence rando seed that needs to be avalible without items, is, +// and if so allow obtaining items in logic +static void ValidateSphereZero(GetAccessableLocationsStruct& gals){ + auto ctx = Rando::Context::GetInstance(); + // Condition for verifying everything required for sphere 0, expanding search to all locations + if (logic->CanEmptyBigPoes && gals.validatedStartingRegion && gals.foundTempleOfTime && gals.haveTimeAccess) { // Apply all items that are necessary for checking all location access - std::vector itemsToPlace = - FilterFromPool(ItemPool, [](const auto i) { return Rando::StaticData::RetrieveItem(i).IsAdvancement(); }); - for (RandomizerGet unplacedItem : itemsToPlace) { - Rando::StaticData::RetrieveItem(unplacedItem).ApplyEffect(); - } + ApplyAllAdvancmentItems(); // Reset access as the non-starting age if (ctx->GetSettings()->ResolvedStartingAge() == RO_AGE_CHILD) { - for (RandomizerRegion areaKey : areaPool) { - AreaTable(areaKey)->adultDay = false; - AreaTable(areaKey)->adultNight = false; + for (RandomizerRegion regionKey : gals.regionPool) { + AreaTable(regionKey)->adultDay = false; + AreaTable(regionKey)->adultNight = false; } } else { - for (RandomizerRegion areaKey : areaPool) { - AreaTable(areaKey)->childDay = false; - AreaTable(areaKey)->childNight = false; + for (RandomizerRegion regionKey : gals.regionPool) { + AreaTable(regionKey)->childDay = false; + AreaTable(regionKey)->childNight = false; } } - mode = SearchMode::AllLocationsReachable; - } else { - logic->NoBottles = false; + gals.sphereZeroComplete = true; + } +} + +//This function handles each possible exit +void ProcessExit(Entrance& exit, GetAccessableLocationsStruct& gals, bool propagateTimeTravel = true, bool checkPoeCollectorAccess = false, bool checkOtherEntranceAccess = false){ + //Update Time of Day Access for the exit + if (UpdateToDAccess(&exit, propagateTimeTravel)) { + gals.ageTimePropogated = true; + if (checkOtherEntranceAccess){ + ValidateOtherEntrance(gals); + } + if (!gals.sphereZeroComplete){ + ValidateSphereZero(gals); + } + } + + //If the exit is accessible and hasn't been added yet, add it to the pool + Area* exitArea = exit.GetConnectedRegion(); + if (!exitArea->addedToPool && exit.ConditionsMet()) { + exitArea->addedToPool = true; + gals.regionPool.push_back(exit.GetConnectedRegionKey()); } } + //Get the max number of tokens that can possibly be useful static int GetMaxGSCount() { auto ctx = Rando::Context::GetInstance(); @@ -186,9 +266,9 @@ std::string GetShopItemBaseName(std::string itemName) { return baseName; } -std::vector GetEmptyLocations(std::vector allowedLocations) { +std::vector GetEmptyLocations(std::vector targetLocations) { auto ctx = Rando::Context::GetInstance(); - return FilterFromPool(allowedLocations, [ctx](const auto loc) { + return FilterFromPool(targetLocations, [ctx](const auto loc) { return ctx->GetItemLocation(loc)->GetPlacedRandomizerGet() == RG_NONE; }); } @@ -211,46 +291,230 @@ bool IsBeatableWithout(RandomizerCheck excludedCheck, bool replaceItem, Randomiz ctx->GetItemLocation(excludedCheck)->SetPlacedItem(RG_NONE); //Write in empty item ctx->playthroughBeatable = false; logic->Reset(); - GetAccessibleLocations(ctx->allLocations, SearchMode::CheckBeatable, ignore); //Check if game is still beatable + CheckBeatable(ignore); if (replaceItem){ ctx->GetItemLocation(excludedCheck)->SetPlacedItem(copy); //Immediately put item back } return ctx->playthroughBeatable; } -//This function will return a vector of ItemLocations that are accessible with -//where items have been placed so far within the world. The allowedLocations argument -//specifies the pool of locations that we're trying to search for an accessible location in -std::vector GetAccessibleLocations(const std::vector& allowedLocations, SearchMode mode /* = SearchMode::ReachabilitySearch*/, RandomizerGet ignore /* = RG_NONE*/, bool checkPoeCollectorAccess /*= false*/, bool checkOtherEntranceAccess /*= false*/) { - auto ctx = Rando::Context::GetInstance(); - std::vector accessibleLocations; - // Reset all access to begin a new search - if (mode < SearchMode::ValidateWorld) { - ApplyStartingInventory(); +// Reset non-Logic-class logic, and optionally apply the initial inventory +void ResetLogic(std::shared_ptr& ctx, bool applyInventory = false){ + if (applyInventory){ + ApplyStartingInventory(); } Areas::AccessReset(); ctx->LocationReset(); - std::vector areaPool = {RR_ROOT}; +} - if (mode == SearchMode::ValidateWorld) { - mode = SearchMode::TimePassAccess; - AreaTable(RR_ROOT)->childNight = true; - AreaTable(RR_ROOT)->adultNight = true; - AreaTable(RR_ROOT)->childDay = true; - AreaTable(RR_ROOT)->adultDay = true; - ctx->allLocationsReachable = false; +//Generate the playthrough, so we want to add advancement items, unless we know to ignore them +void AddToPlaythrough(LocationAccess& locPair, GetAccessableLocationsStruct& gals){ + auto ctx = Rando::Context::GetInstance(); + RandomizerCheck loc = locPair.GetLocation(); + Rando::ItemLocation* location = ctx->GetItemLocation(loc); + RandomizerGet locItem = location->GetPlacedRandomizerGet(); + //Item is an advancement item, figure out if it should be added to this sphere + if (!ctx->playthroughBeatable && location->GetPlacedItem().IsAdvancement()) { + ItemType type = location->GetPlacedItem().GetItemType(); + + //Decide whether to exclude this location + //This preprocessing is done to reduce the amount of searches performed in PareDownPlaythrough + //Want to exclude: + //1) Tokens after the last potentially useful one (the last one that gives an advancement item or last for token bridge) + //2) Buy items of the same type, after the first (So only see Buy Deku Nut of any amount once) + bool exclude = true; + //Exclude tokens after the last possibly useful one + if (type == ITEMTYPE_TOKEN && gals.gsCount < gals.maxGsCount) { + gals.gsCount++; + exclude = false; + } + //Handle buy items + //If ammo drops are off, don't do this step, since buyable ammo becomes logically important + // TODO: Reimplement Ammo Drops setting + else if (/*AmmoDrops.IsNot(AMMODROPS_NONE) &&*/ type == ITEMTYPE_SHOP) { + //Only check each buy item once + auto buyItem = location->GetPlacedItem().GetLogicVal(); + //Buy item not in list to ignore, add it to list and write to playthrough + if (std::find(gals.buyIgnores.begin(), gals.buyIgnores.end(), buyItem) == gals.buyIgnores.end()) { + exclude = false; + gals.buyIgnores.push_back(buyItem); + } + } + //Add all other advancement items + else if (type != ITEMTYPE_TOKEN && (/*AmmoDrops.Is(AMMODROPS_NONE) ||*/ type != ITEMTYPE_SHOP)) { + exclude = false; + } + //Has not been excluded, add to playthrough + if (!exclude) { + gals.itemSphere.push_back(loc); + } + } + //Triforce has been found, seed is beatable, nothing else in this or future spheres matters + else if (location->GetPlacedRandomizerGet() == RG_TRIFORCE) { + gals.itemSphere.clear(); + gals.itemSphere.push_back(loc); + ctx->playthroughBeatable = true; } +} - //Variables for playthrough - int gsCount = 0; - const int maxGsCount = mode == SearchMode::GeneratePlaythrough ? GetMaxGSCount() : 0; //If generating playthrough want the max that's possibly useful, else doesn't matter - std::vector buyIgnores; +// Adds the contents of a location to the current progression and optionally playthrough +bool AddCheckToLogic(LocationAccess& locPair, GetAccessableLocationsStruct& gals, RandomizerGet ignore, bool stopOnBeatable, bool addToPlaythrough=false){ + auto ctx = Rando::Context::GetInstance(); + RandomizerCheck loc = locPair.GetLocation(); + Rando::ItemLocation* location = ctx->GetItemLocation(loc); + RandomizerGet locItem = location->GetPlacedRandomizerGet(); - //Variables for search - std::vector newItemLocations; - bool updatedEvents = false; - bool ageTimePropogated = false; - bool firstIteration = true; + if (!location->IsAddedToPool() && locPair.ConditionsMet()) { + location->AddToPool(); + + if (locItem == RG_NONE) { + gals.accessibleLocations.push_back(loc); //Empty location, consider for placement + } else { + //If ignore has a value, we want to check if the item location should be considered or not + //This is necessary due to the below preprocessing for playthrough generation + if (ignore != RG_NONE) { + ItemType type = location->GetPlacedItem().GetItemType(); + //If we want to ignore tokens, only add if not a token + if (ignore == RG_GOLD_SKULLTULA_TOKEN && type != ITEMTYPE_TOKEN) { + gals.newItemLocations.push_back(location); + } + //If we want to ignore bombchus, only add if bombchu is not in the name + else if (IsBombchus(ignore) && IsBombchus(locItem, true)) { + gals.newItemLocations.push_back(location); + } + //We want to ignore a specific Buy item. Buy items with different RandomizerGets are recognised by a shared GetLogicVal + else if (ignore != RG_GOLD_SKULLTULA_TOKEN && IsBombchus(ignore)) { + if ((type == ITEMTYPE_SHOP && Rando::StaticData::GetItemTable()[ignore].GetLogicVal() != location->GetPlacedItem().GetLogicVal()) || type != ITEMTYPE_SHOP) { + gals.newItemLocations.push_back(location); + } + } + } + //If it doesn't, we can just add the location + else { + gals.newItemLocations.push_back(location); //Add item to cache to be considered in logic next iteration + } + } + if (addToPlaythrough){ + AddToPlaythrough(locPair, gals); + } + //All we care about is if the game is beatable, used to pare down playthrough + if (location->GetPlacedRandomizerGet() == RG_TRIFORCE && stopOnBeatable) { + return true; //Return early for efficiency + } + } + return false; +} + +// Return any of the targetLocations that are accessible in logic +std::vector ReachabilitySearch(const std::vector& targetLocations, RandomizerGet ignore /* = RG_NONE*/) { + auto ctx = Rando::Context::GetInstance(); + GetAccessableLocationsStruct gals(0); + ResetLogic(ctx, true); + while (gals.newItemLocations.size() > 0 || gals.updatedEvents || gals.ageTimePropogated || gals.firstIteration) { + gals.InitLoop(); + for (size_t i = 0; i < gals.regionPool.size(); i++) { + Area* region = AreaTable(gals.regionPool[i]); + + if (region->UpdateEvents()){ + gals.updatedEvents = true; + } + for (auto& exit : region->exits) { + ProcessExit(exit, gals); + } + for (size_t k = 0; k < region->locations.size(); k++) { + LocationAccess& locPair = region->locations[k]; + AddCheckToLogic(locPair, gals, ignore, false); + } + } + } + erase_if(gals.accessibleLocations, [&targetLocations, ctx](RandomizerCheck loc){ + for (RandomizerCheck allowedLocation : targetLocations) { + if (loc == allowedLocation || ctx->GetItemLocation(loc)->GetPlacedRandomizerGet() != RG_NONE) { + return false; + } + } + return true; + }); + return gals.accessibleLocations; +} + +// Create the playthrough for the seed +void GeneratePlaythrough() { + auto ctx = Rando::Context::GetInstance(); + ctx->playthroughBeatable = false; + logic->Reset(); + GetAccessableLocationsStruct gals(GetMaxGSCount()); + ResetLogic(ctx, true); + while (gals.newItemLocations.size() > 0 || gals.updatedEvents || gals.ageTimePropogated || gals.firstIteration) { + gals.InitLoop(); + for (size_t i = 0; i < gals.regionPool.size(); i++) { + Area* region = AreaTable(gals.regionPool[i]); + + if (region->UpdateEvents()){ + gals.updatedEvents = true; + } + for (auto& exit : region->exits) { + ProcessExit(exit, gals); + // Add shuffled entrances to the entrance playthrough + // Include bluewarps when unshuffled but dungeon or boss shuffle is on + if((exit.IsShuffled() || (exit.GetType() == Rando::EntranceType::BlueWarp && + (ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES) || ctx->GetOption(RSK_SHUFFLE_BOSS_ENTRANCES)))) && + !exit.IsAddedToPool() && !ctx->GetEntranceShuffler()->HasNoRandomEntrances()) { + gals.entranceSphere.push_back(&exit); + exit.AddToPool(); + // Don't list a two-way coupled entrance from both directions + if (exit.GetReverse() != nullptr && exit.GetReplacement()->GetReverse() != nullptr && !exit.IsDecoupled()) { + exit.GetReplacement()->GetReverse()->AddToPool(); + } + } + } + for (size_t k = 0; k < region->locations.size(); k++) { + LocationAccess& locPair = region->locations[k]; + AddCheckToLogic(locPair, gals, RG_NONE, false, true); + } + } + if (gals.itemSphere.size() > 0) { + ctx->playthroughLocations.push_back(gals.itemSphere); + } + if (gals.entranceSphere.size() > 0 && !ctx->GetEntranceShuffler()->HasNoRandomEntrances()) { + ctx->GetEntranceShuffler()->playthroughEntrances.push_back(gals.entranceSphere); + } + } +} + +// return if the seed is currently beatable or not +bool CheckBeatable(RandomizerGet ignore /* = RG_NONE*/) { + auto ctx = Rando::Context::GetInstance(); + GetAccessableLocationsStruct gals(0); + ResetLogic(ctx, true); + while (gals.newItemLocations.size() > 0 || gals.updatedEvents || gals.ageTimePropogated || gals.firstIteration) { + gals.InitLoop(); + for (size_t i = 0; i < gals.regionPool.size(); i++) { + Area* region = AreaTable(gals.regionPool[i]); + + if (region->UpdateEvents()){ + gals.updatedEvents = true; + } + for (auto& exit : region->exits) { + ProcessExit(exit, gals); + } + for (size_t k = 0; k < region->locations.size(); k++) { + LocationAccess& locPair = region->locations[k]; + if(AddCheckToLogic(locPair, gals, ignore, true)){ + ctx->playthroughBeatable = true; + return true; + } + } + } + } + return false; +} + +// Check if the currently randomised set of entrences is a valid game map. +void ValidateEntrances(bool checkPoeCollectorAccess, bool checkOtherEntranceAccess) { + auto ctx = Rando::Context::GetInstance(); + GetAccessableLocationsStruct gals(0); + ResetLogic(ctx, !checkOtherEntranceAccess); //Variables for Time Pass access bool timePassChildDay = false; @@ -258,192 +522,82 @@ std::vector GetAccessibleLocations(const std::vector 0 || updatedEvents || ageTimePropogated || firstIteration) { - firstIteration = false; - ageTimePropogated = false; - updatedEvents = false; - - for (Rando::ItemLocation* location : newItemLocations) { - location->ApplyPlacedItemEffect(); + ctx->allLocationsReachable = false; + if (checkPoeCollectorAccess){ + logic->CanEmptyBigPoes = false; + } + if (!checkOtherEntranceAccess){ + gals.foundTempleOfTime = true; + gals.validatedStartingRegion = true; + gals.haveTimeAccess = true; + gals.sphereZeroComplete = true; + ApplyAllAdvancmentItems(); + //if we assume valid sphere zero, we only want starting age access + if (ctx->GetSettings()->ResolvedStartingAge() == RO_AGE_CHILD) { + for (RandomizerRegion regionKey : gals.regionPool) { + AreaTable(RR_ROOT)->childNight = true; + AreaTable(RR_ROOT)->childDay = true; + } + } else { + for (RandomizerRegion regionKey : gals.regionPool) { + AreaTable(RR_ROOT)->adultNight = true; + AreaTable(RR_ROOT)->adultDay = true; + } } - newItemLocations.clear(); - - std::vector itemSphere; - std::list entranceSphere; + } else { + AreaTable(RR_ROOT)->childNight = true; + AreaTable(RR_ROOT)->adultNight = true; + AreaTable(RR_ROOT)->childDay = true; + AreaTable(RR_ROOT)->adultDay = true; + } - for (size_t i = 0; i < areaPool.size(); i++) { - Area* area = AreaTable(areaPool[i]); + while (gals.newItemLocations.size() > 0 || gals.updatedEvents || gals.ageTimePropogated || gals.firstIteration) { + gals.InitLoop(); + for (size_t i = 0; i < gals.regionPool.size(); i++) { + Area* region = AreaTable(gals.regionPool[i]); - if (area->UpdateEvents(mode)){ - updatedEvents = true; + if (region->UpdateEvents(gals.haveTimeAccess)){ + gals.updatedEvents = true; } - - // If we're checking for TimePass access do that for each area as it's being updated. - // TimePass Access is satisfied when every AgeTime can reach an area with TimePass + // If we're checking for TimePass access do that for each region as it's being updated. + // TimePass Access is satisfied when every AgeTime can reach a region with TimePass // without the aid of TimePass. During this mode, TimePass won't update ToD access - // in any area. - if (mode == SearchMode::TimePassAccess) { - if (area->timePass) { - if (area->childDay) { + // in any region. + if (!gals.haveTimeAccess) { + if (region->timePass) { + if (region->childDay) { timePassChildDay = true; } - if (area->childNight) { + if (region->childNight) { timePassChildNight = true; } - if (area->adultDay) { + if (region->adultDay) { timePassAdultDay = true; } - if (area->adultNight) { + if (region->adultNight) { timePassAdultNight = true; } } // Condition for validating that all startring AgeTimes have timepass access // Once satisifed, change the mode to begin checking for Temple of Time Access - if ((timePassChildDay && timePassChildNight && timePassAdultDay && timePassAdultNight) || !checkOtherEntranceAccess) { - mode = SearchMode::TempleOfTimeAccess; + if (timePassChildDay && timePassChildNight && timePassAdultDay && timePassAdultNight) { + gals.haveTimeAccess = true; } } - //for each exit in this area - for (auto& exit : area->exits) { - - //Update Time of Day Access for the exit - if (UpdateToDAccess(&exit, mode)) { - ageTimePropogated = true; - ValidateWorldChecks(mode, checkPoeCollectorAccess, checkOtherEntranceAccess, areaPool); - } - - //If the exit is accessible and hasn't been added yet, add it to the pool - Area* exitArea = exit.GetConnectedRegion(); - if (!exitArea->addedToPool && exit.ConditionsMet()) { - exitArea->addedToPool = true; - areaPool.push_back(exit.GetConnectedRegionKey()); - } - - // Add shuffled entrances to the entrance playthrough - // Include bluewarps when unshuffled but dungeon or boss shuffle is on - if (mode == SearchMode::GeneratePlaythrough && - (exit.IsShuffled() || - (exit.GetType() == Rando::EntranceType::BlueWarp && - (ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES) || ctx->GetOption(RSK_SHUFFLE_BOSS_ENTRANCES)))) && - !exit.IsAddedToPool() && !ctx->GetEntranceShuffler()->HasNoRandomEntrances()) { - entranceSphere.push_back(&exit); - exit.AddToPool(); - // Don't list a two-way coupled entrance from both directions - if (exit.GetReverse() != nullptr && exit.GetReplacement()->GetReverse() != nullptr && !exit.IsDecoupled()) { - exit.GetReplacement()->GetReverse()->AddToPool(); - } + //for each exit in this region + for (auto& exit : region->exits) { + ProcessExit(exit, gals, gals.haveTimeAccess && gals.foundTempleOfTime, checkPoeCollectorAccess, checkOtherEntranceAccess); + } + if (gals.sphereZeroComplete) { + for (size_t k = 0; k < region->locations.size(); k++) { + LocationAccess& locPair = region->locations[k]; + AddCheckToLogic(locPair, gals, RG_NONE, false); } } - - //for each ItemLocation in this area - if (mode < SearchMode::ValidateWorld) { - for (size_t k = 0; k < area->locations.size(); k++) { - LocationAccess& locPair = area->locations[k]; - RandomizerCheck loc = locPair.GetLocation(); - Rando::ItemLocation* location = ctx->GetItemLocation(loc); - RandomizerGet locItem = location->GetPlacedRandomizerGet(); - - if (!location->IsAddedToPool() && locPair.ConditionsMet()) { - - location->AddToPool(); - - if (locItem == RG_NONE) { - accessibleLocations.push_back(loc); //Empty location, consider for placement - } else { - //If ignore has a value, we want to check if the item location should be considered or not - //This is necessary due to the below preprocessing for playthrough generation - if (ignore != RG_NONE) { - ItemType type = location->GetPlacedItem().GetItemType(); - //If we want to ignore tokens, only add if not a token - if (ignore == RG_GOLD_SKULLTULA_TOKEN && type != ITEMTYPE_TOKEN) { - newItemLocations.push_back(location); - } - //If we want to ignore bombchus, only add if bombchu is not in the name - else if (IsBombchus(ignore) && IsBombchus(locItem, true)) { - newItemLocations.push_back(location); - } - //We want to ignore a specific Buy item. Buy items with different RandomizerGets are recognised by a shared GetLogicVal - else if (ignore != RG_GOLD_SKULLTULA_TOKEN && IsBombchus(ignore)) { - if ((type == ITEMTYPE_SHOP && Rando::StaticData::GetItemTable()[ignore].GetLogicVal() != location->GetPlacedItem().GetLogicVal()) || type != ITEMTYPE_SHOP) { - newItemLocations.push_back(location); - } - } - } - //If it doesn't, we can just add the location - else { - newItemLocations.push_back(location); //Add item to cache to be considered in logic next iteration - } - } - - //Playthrough stuff - //Generate the playthrough, so we want to add advancement items, unless we know to ignore them - if (mode == SearchMode::GeneratePlaythrough) { - //Item is an advancement item, figure out if it should be added to this sphere - if (!ctx->playthroughBeatable && location->GetPlacedItem().IsAdvancement()) { - ItemType type = location->GetPlacedItem().GetItemType(); - - //Decide whether to exclude this location - //This preprocessing is done to reduce the amount of searches performed in PareDownPlaythrough - //Want to exclude: - //1) Tokens after the last potentially useful one (the last one that gives an advancement item or last for token bridge) - //2) Buy items of the same type, after the first (So only see Buy Deku Nut of any amount once) - bool exclude = true; - //Exclude tokens after the last possibly useful one - if (type == ITEMTYPE_TOKEN && gsCount < maxGsCount) { - gsCount++; - exclude = false; - } - - //Handle buy items - //If ammo drops are off, don't do this step, since buyable ammo becomes logically important - // TODO: Reimplement Ammo Drops setting - else if (/*AmmoDrops.IsNot(AMMODROPS_NONE) &&*/ type == ITEMTYPE_SHOP) { - //Only check each buy item once - auto buyItem = location->GetPlacedItem().GetLogicVal(); - //Buy item not in list to ignore, add it to list and write to playthrough - if (std::find(buyIgnores.begin(), buyIgnores.end(), buyItem) == buyIgnores.end()) { - exclude = false; - buyIgnores.push_back(buyItem); - } - } - //Add all other advancement items - else if (type != ITEMTYPE_TOKEN && (/*AmmoDrops.Is(AMMODROPS_NONE) ||*/ type != ITEMTYPE_SHOP)) { - exclude = false; - } - //Has not been excluded, add to playthrough - if (!exclude) { - itemSphere.push_back(loc); - } - } - //Triforce has been found, seed is beatable, nothing else in this or future spheres matters - else if (location->GetPlacedRandomizerGet() == RG_TRIFORCE) { - itemSphere.clear(); - itemSphere.push_back(loc); - ctx->playthroughBeatable = true; - } - } - //All we care about is if the game is beatable, used to pare down playthrough - else if (location->GetPlacedRandomizerGet() == RG_TRIFORCE && mode == SearchMode::CheckBeatable) { - ctx->playthroughBeatable = true; - return {}; //Return early for efficiency - } - } - } - } - } - - if (mode == SearchMode::GeneratePlaythrough && itemSphere.size() > 0) { - ctx->playthroughLocations.push_back(itemSphere); - } - if (mode == SearchMode::GeneratePlaythrough && entranceSphere.size() > 0 && !ctx->GetEntranceShuffler()->HasNoRandomEntrances()) { - ctx->GetEntranceShuffler()->playthroughEntrances.push_back(entranceSphere); } } - - //Check to see if all locations were reached - if (mode == SearchMode::AllLocationsReachable) { + if (gals.sphereZeroComplete) { ctx->allLocationsReachable = true; for (const RandomizerCheck loc : ctx->allLocations) { if (!ctx->GetItemLocation(loc)->IsAddedToPool()) { @@ -457,25 +611,7 @@ std::vector GetAccessibleLocations(const std::vectorGetItemLocation(loc)->GetPlacedRandomizerGet() != RG_NONE) { - return false; - } - } - return true; - }); - return accessibleLocations; -} - -static void GeneratePlaythrough() { - auto ctx = Rando::Context::GetInstance(); - ctx->playthroughBeatable = false; - logic->Reset(); - GetAccessibleLocations(ctx->allLocations, SearchMode::GeneratePlaythrough); } RandomizerArea LookForExternalArea(const Area* const currentRegion, std::vector &alreadyChecked){ @@ -489,7 +625,7 @@ RandomizerArea LookForExternalArea(const Area* const currentRegion, std::vector< if(passdown != RA_NONE){ return passdown; } - } else if (otherArea != RA_LINKS_POCKET){ //if it's links pocket, do not propogate this, Link's Pocket is not a real Area + } else if (otherArea != RA_LINKS_POCKET){ //if it's links pocket, do not propagate this, Link's Pocket is not a real Area return otherArea; } } @@ -576,7 +712,7 @@ static void CalculateWotH() { } ctx->playthroughBeatable = true; logic->Reset(); - GetAccessibleLocations(ctx->allLocations); + ReachabilitySearch(ctx->allLocations); } //Calculate barren locations and assign Barren Candidacy to all locations inside those areas @@ -687,7 +823,7 @@ static void AssumedFill(const std::vector& items, const std::vect } // get all accessible locations that are allowed - const std::vector accessibleLocations = GetAccessibleLocations(allowedLocations); + const std::vector accessibleLocations = ReachabilitySearch(allowedLocations); // retry if there are no more locations to place items if (accessibleLocations.empty()) { @@ -729,7 +865,7 @@ static void AssumedFill(const std::vector& items, const std::vect if (!ctx->GetOption(RSK_ALL_LOCATIONS_REACHABLE)) { ctx->playthroughBeatable = false; logic->Reset(); - GetAccessibleLocations(ctx->allLocations, SearchMode::CheckBeatable); + CheckBeatable(); if (ctx->playthroughBeatable) { SPDLOG_DEBUG("Game beatable, now placing items randomly. " + std::to_string(itemsToPlace.size()) + " major items remaining.\n\n"); diff --git a/soh/soh/Enhancements/randomizer/3drando/fill.hpp b/soh/soh/Enhancements/randomizer/3drando/fill.hpp index 2dd6c21c898..60feafc16fe 100644 --- a/soh/soh/Enhancements/randomizer/3drando/fill.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/fill.hpp @@ -5,25 +5,16 @@ #include #include -enum class SearchMode { - ReachabilitySearch, - GeneratePlaythrough, - CheckBeatable, - AllLocationsReachable, - ValidateWorld, - TimePassAccess, - TempleOfTimeAccess, - ValidStartingRegion, - PoeCollectorAccess, -}; - void ClearProgress(); void VanillaFill(); int Fill(); std::vector GetEmptyLocations(std::vector allowedLocations); -std::vector GetAccessibleLocations(const std::vector& allowedLocations, - SearchMode mode = SearchMode::ReachabilitySearch, RandomizerGet ignore = RG_NONE, - bool checkPoeCollectorAccess = false, - bool checkOtherEntranceAccess = false); \ No newline at end of file +std::vector ReachabilitySearch(const std::vector& allowedLocations, RandomizerGet ignore=RG_NONE); + +void GeneratePlaythrough(); + +bool CheckBeatable(RandomizerGet ignore=RG_NONE); + +void ValidateEntrances(bool checkPoeCollectorAccess, bool checkOtherEntranceAccess); \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/3drando/hints.cpp b/soh/soh/Enhancements/randomizer/3drando/hints.cpp index 95f5a114405..9b22706cdc0 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hints.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hints.cpp @@ -328,7 +328,7 @@ static std::vector GetAccessibleGossipStones(const RandomizerCh ctx->GetItemLocation(hintedLocation)->SetPlacedItem(RG_NONE); ctx->GetLogic()->Reset(); - auto accessibleGossipStones = GetAccessibleLocations(Rando::StaticData::gossipStoneLocations); + auto accessibleGossipStones = ReachabilitySearch(Rando::StaticData::gossipStoneLocations); //Give the item back to the location ctx->GetItemLocation(hintedLocation)->SetPlacedItem(originalItem); @@ -342,7 +342,7 @@ bool IsReachableWithout(std::vector locsToCheck, RandomizerChec RandomizerGet originalItem = ctx->GetItemLocation(excludedCheck)->GetPlacedRandomizerGet(); ctx->GetItemLocation(excludedCheck)->SetPlacedItem(RG_NONE); ctx->GetLogic()->Reset(); - const auto rechableWithout = GetAccessibleLocations(locsToCheck); + const auto rechableWithout = ReachabilitySearch(locsToCheck); ctx->GetItemLocation(excludedCheck)->SetPlacedItem(originalItem); if (resetAfter){ //if resetAfter is on, reset logic we are done @@ -670,7 +670,7 @@ void CreateStoneHints() { //Getting gossip stone locations temporarily sets one location to not be reachable. //Call the function one last time to get rid of false positives on locations not //being reachable. - GetAccessibleLocations({}); + ReachabilitySearch({}); } std::vector FindItemsAndMarkHinted(std::vector items, std::vector hintChecks){ diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access.cpp index 29b3cb2177c..851c26a4849 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access.cpp @@ -89,9 +89,8 @@ Area::Area(std::string regionName_, std::string scene_, RandomizerArea area, Area::~Area() = default; -bool Area::UpdateEvents(SearchMode mode) { - - if (timePass && mode != SearchMode::TimePassAccess) { +bool Area::UpdateEvents(bool haveTimeAccess) { + if (timePass && haveTimeAccess) { if (Child()) { childDay = true; childNight = true; @@ -241,7 +240,7 @@ std::shared_ptr logic; void AreaTable_Init() { using namespace Rando; randoCtx = Context::GetInstance().get(); - logic = randoCtx->GetLogic(); + logic = randoCtx->GetLogic(); //RANDOTODO do not hardcode, instead allow accepting a Logic class somehow grottoEvents = { EventAccess(&logic->GossipStoneFairy, { [] { return logic->GossipStoneFairy || logic->CanSummonGossipFairy; } }), EventAccess(&logic->ButterflyFairy, { [] { return logic->ButterflyFairy || (logic->CanUse(RG_STICKS)); } }), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access.hpp b/soh/soh/Enhancements/randomizer/3drando/location_access.hpp index 286551cab11..3dcdbfb2681 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access.hpp @@ -164,9 +164,9 @@ class Area { bool childNight = false; bool adultDay = false; bool adultNight = false; - bool addedToPool = false; + bool addedToPool = false;; - bool UpdateEvents(SearchMode mode); + bool UpdateEvents(bool haveTimeAccess = true); void AddExit(RandomizerRegion parentKey, RandomizerRegion newExitKey, ConditionFn condition); diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_castle_town.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_castle_town.cpp index e809beb5472..9f113218caa 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_castle_town.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_castle_town.cpp @@ -165,7 +165,10 @@ void AreaTable_Init_CastleTown() { Entrance(RR_GANONS_CASTLE_ENTRYWAY, {[]{return logic->IsAdult;}}), }); - areaTable[RR_MARKET_GUARD_HOUSE] = Area("Market Guard House", "Market Guard House", RA_NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_MARKET_GUARD_HOUSE] = Area("Market Guard House", "Market Guard House", RA_NONE, NO_DAY_NIGHT_CYCLE, { + //Events + EventAccess(&logic->CanEmptyBigPoes, {[]{return logic->IsAdult;}}), + }, { //Locations LOCATION(RC_MARKET_10_BIG_POES, logic->IsAdult && logic->BigPoeKill), LOCATION(RC_MARKET_GS_GUARD_HOUSE, logic->IsChild), diff --git a/soh/soh/Enhancements/randomizer/entrance.cpp b/soh/soh/Enhancements/randomizer/entrance.cpp index 39eab139822..16f362cb992 100644 --- a/soh/soh/Enhancements/randomizer/entrance.cpp +++ b/soh/soh/Enhancements/randomizer/entrance.cpp @@ -462,7 +462,7 @@ static bool ValidateWorld(Entrance* entrancePlaced) { // Conditions will be checked during the search and any that fail will be figured out // afterwards ctx->GetLogic()->Reset(); - GetAccessibleLocations({}, SearchMode::ValidateWorld, RG_NONE, checkPoeCollectorAccess, checkOtherEntranceAccess); + ValidateEntrances(checkPoeCollectorAccess, checkOtherEntranceAccess); if (!ctx->GetOption(RSK_DECOUPLED_ENTRANCES)) { // Unless entrances are decoupled, we don't want the player to end up through certain entrances as the wrong age @@ -765,7 +765,7 @@ static std::array, 2> SplitEntrancesByRequirements(std::v Rando::StaticData::RetrieveItem(unplacedItem).ApplyEffect(); } // run a search to see what's accessible - GetAccessibleLocations({}); + ReachabilitySearch({}); for (Entrance* entrance : entrancesToSplit) { // if an entrance is accessible at all times of day by both ages, it's a soft entrance with no restrictions diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp index edb17df0c88..231799baf68 100644 --- a/soh/soh/Enhancements/randomizer/logic.cpp +++ b/soh/soh/Enhancements/randomizer/logic.cpp @@ -441,9 +441,12 @@ namespace Rando { uint8_t Logic::BottleCount() { uint8_t count = 0; + if (!CanEmptyBigPoes){ + return 0; + } for (int i = SLOT_BOTTLE_1; i <= SLOT_BOTTLE_4; i++) { uint8_t item = ctx->GetSaveContext()->inventory.items[i]; - if (item != ITEM_NONE && (item != ITEM_LETTER_RUTO || (item == ITEM_LETTER_RUTO && DeliverLetter)) && item != ITEM_BIG_POE) { + if (item != ITEM_NONE && (item != ITEM_LETTER_RUTO || (item == ITEM_LETTER_RUTO && DeliverLetter))) { count++; } } @@ -492,7 +495,7 @@ namespace Rando { KokiriSword = CanUse(RG_KOKIRI_SWORD); MasterSword = CanUse(RG_MASTER_SWORD); BiggoronSword = CanUse(RG_BIGGORON_SWORD); - NumBottles = ((NoBottles) ? 0 : BottleCount()); + NumBottles = BottleCount(); HasBottle = NumBottles >= 1; Slingshot = CanUse(RG_FAIRY_SLINGSHOT) && (BuySeed || AmmoCanDrop); Ocarina = HasItem(RG_FAIRY_OCARINA); @@ -921,7 +924,7 @@ namespace Rando { //Bottle Count Bottles = 0; NumBottles = 0; - NoBottles = false; + CanEmptyBigPoes = true; //Triforce Pieces TriforcePieces = 0; diff --git a/soh/soh/Enhancements/randomizer/logic.h b/soh/soh/Enhancements/randomizer/logic.h index 6a669d7ebb0..d5de5f89942 100644 --- a/soh/soh/Enhancements/randomizer/logic.h +++ b/soh/soh/Enhancements/randomizer/logic.h @@ -165,7 +165,7 @@ class Logic { // Bottle Count uint8_t Bottles = 0; uint8_t NumBottles = 0; - bool NoBottles = false; + bool CanEmptyBigPoes = true; // Drops and Bottle Contents Access bool NutPot = false; From 9c11718341982b19691d3deb57a154fdabe13574 Mon Sep 17 00:00:00 2001 From: Pepe20129 <72659707+Pepe20129@users.noreply.github.com> Date: Tue, 17 Sep 2024 19:43:06 +0200 Subject: [PATCH 099/108] Add 146 ice trap messages (#4281) * Add ice trap message suggestions * Split messages by language * Re-run build * Apply Pepper0ni's patch with fixes --- .../Enhancements/randomizer/randomizer.cpp | 314 +++++++++++++----- soh/soh/Enhancements/randomizer/randomizer.h | 2 +- soh/soh/OTRGlobals.cpp | 6 +- 3 files changed, 241 insertions(+), 81 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index cc572629f10..4983647e92b 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -2826,86 +2826,251 @@ void CreateNaviRandoMessages() { } } -void CreateIceTrapRandoMessages() { - CustomMessage IceTrapMessages[NUM_ICE_TRAP_MESSAGES] = { - { "You are a %bFOOL%w!", "Du bist ein %bDUMMKOPF%w!", "%bPauvre fou%w..." }, - - { "You are a %bFOWL%w!", "Du bist eine %bFrostbeule%w!", "Tu es un %bglaçon%w, Harry!" }, - - { "%bFOOL%w!", "%bDUMMKOPF%w!", "%bSot%w que tu es." }, - - { "You just got %bPUNKED%w!", "Du wurdest %beiskalt%w erwischt!", "Ça me %bglace%w le sang!" }, - - { "Stay %bfrosty%w, @.", "Es läuft Dir %beiskalt%w den Rücken&hinunter, @.", "%bReste au frais%w, @." }, - - { "Take a %bchill pill%w, @.", "Bleib %bcool%w, @.", "Et c'est la douche %bfroide%w!" }, - - { "%bWinter%w is coming.", "Der %bWinter%w naht.", "L'%bhiver%w vient." }, - - { "%bICE%w to see you, @.", "Alles %bcool%w im Pool?", "%bGlacier%w!" }, - - { "Feeling a little %rhot%w under the collar?&%bLet's fix that%w.", "%bAbkühlung gefällig%w?", - "%Ça en jette un %bfroid%w." }, - - { "It's a %bcold day%w in the Evil Realm.", "Es ist ein %kalter%w Tag im Herzen&von Hyrule.", - "Est-ce que tu as déjà eu des sueurs&%bfroides%w?" }, - - { "Getting %bcold feet%w?", "Bekommst Du etwa %bkalte%w Füße?", - "La vengeance est un plat qui se mange&%bfroid%w!" }, - - { "Say hello to the %bZoras%w for me!", "Sag den %bZoras%w viele Grüße von mir!", - "Dit bonjour aux %bZoras%w pour moi!" }, - - { "Can you keep a %bcool head%w?", "Bewahre einen %bkühlen%w! Kopf.", - "Il faut parfois savoir garder la tête&%bfroide%w!" }, - - { "Ganondorf used %bIce Trap%w!&It's super effective!", - "Ganondorf setzt %bEisstrahl%w ein.&Das ist sehr effektiv!", - "Ganondorf utilise %bPiège de Glace%w!&C'est super efficace!" }, - - { "Allow me to break the %bice%w!", "Ein Lächeln ist der beste Weg,&um das %bEis%w zu brechen!", - "Laisse moi briser la %bglace%w!" }, - - { "%bCold pun%w.", "%bEiskalt%w lässt du meine Seele&erfrier'n.", - "Balance man...,&Cadence man...,&Trace la %bglace%w...,&c'est le Cooooolllll Rasta!" }, - - { "The %bTitanic%w would be scared of you,&@.", "Die %bTitanic%w hätte Angst vor Dir,&@.", - "Le %bTitanic%w aurait peur de toi,&@." }, - - { "Oh no!", "Oh nein!", "Oh non!" }, - - { "What killed the dinosaurs?&The %bICE%w age!", "Was die Dinosaurier getötet hat?&Die %bEiszeit%w!", - "Qu'est-ce qui a tué les dinosaures?&L'ère %bglacière%w!" }, - - { "Knock knock. Who's there? Ice. Ice&who? Ice see that you're a %bFOOL%w.", - "Nachts ist es %bkälter%w als draußen.", - "L'imbécile réfléchit uniquement quand il&s'observe dans la %bglace%w." }, +CustomMessage Randomizer::GetIceTrapMessage() { + static const char* const englishIceTrapMessages[169] = { + "You are a #FOOL#!", + "You are a #FOWL#!", + "#FOOL#!", + "You just got #PUNKED#!", + "Stay #frosty#, @.", + "Take a #chill pill#, @.", + "#Winter# is coming.", + "#ICE# to see you, @.", + "Feeling a little %rhot%w under the collar? #Let's fix that#.", + "It's a #cold day# in the Evil Realm.", + "Getting #cold feet#?", + "Say hello to the #Zoras# for me!", + "Can you keep a #cool head#?", + "Ganondorf used #Ice Trap#!&It's super effective!", + "Allow me to break the #ice#!", + "#Cold pun#.", + "The #Titanic# would be scared of you, @.", + "Oh no!", + "Uh oh!", + "What killed the dinosaurs?&The #ICE# age!", + "Knock knock. Who's there? Ice. Ice who? Ice see that you're a #FOOL#.", + "Never gonna #give you up#. Never gonna #let you down#. Never gonna run around and #desert you#.", + "Thank you #@#! But your item is in another castle!", + "#FREEZE#! Don't move!", + "Wouldn't it be #ice# if we were colder?", + "Greetings from #Snowhead#! Wish you were here", + "Too #cool# for you?", + "#Ice#, #ice#, baby...", + "Time to break the #ice#.", + "We wish that you would read this... We wish that you would read this... But we set our bar low.", + "#Freeze# and put your hands in the air!", + "#Ice# to meet you!", + "Do you want to #freeze# a snowman?", + "Isn't there a #mansion# around here?", + "Now you know how #King Zora# feels", + "May the #Frost# be with you.", + "Carpe diem. #Freeze# the day.", + "There #snow# place like home.", + "That'll do, #ice#. That'll do.", + "All that is #cold# does not glitter, Not all those who wander are #frost#.", + "I Used To Be An Adventurer Like You. Then I Took An #Icetrap# To The Knee.", + "Would you like #ice# with that?", + "You have obtained the #Ice# Medallion!", + "Quick, do a #Zora# impression!", + "One item #on the rocks#!",//would be better if it could display the name of the item + "How much does a polar bear weigh?&Enough to break the #ice#.", + "You got Din's #Ice#!", + "You got Nayru's #Cold#!", + "You got Farore's #Freeze#!", + "KEKW", + "You just got #ICE TRAPPED#! Tag your friends to totally #ICE TRAP# them!", + "Are you okay, @? You're being #cold# today.", + "In a moment, your game might experience some #freezing#.", + "Breeze? Trees? Squeeze? No, it's a #freeze#!", + "After collecting this item, @ was assaulted in #cold# blood.", + "Only #chill# vibes around here!", + "Here's a #cool# gift for you!", + "Aha! You THOUGHT.", + "Stay hydrated and brush your teeth!", + "Isn't it too hot here? Let's turn the #AC# on.", + "One serving of #cold# @, coming right up!", + "Is it #cold# in here is that just me?", + "Yahaha! You found me!", + "You'd made a great #ice#-tronaut!", + "That's just the tip of the #iceberg#!", + "It's the triforce!&No, just kidding, it's an #ice trap#.", + "WINNER!", + "LOSER!", + "Greetings from #Cold Miser#!", + "Pardon me while I turn up the #AC#.", + "If you can't stand the #cold#, get out of the #freezer#.", + "Oh, goodie! #Frozen @# for the main course!", + "You have #freeze# power!", + "You obtained the #Ice Beam#! No wait, wrong game.", + "Here's to another lousy millenium!", + "You've activated my #trap card#!", + "I love #refrigerators#!", + "You expected an item,&BUT IT WAS I, AN #ICE TRAP#!", + "It's dangerous to go alone! Take #this#!", + "soh.exe has #stopped responding#.", + "Enough! My #Ice Trap# thaws in the morning!", + "Nobody expects the span-#ice# inquisition!", + "This is one #cool# item!", + "Say hello to my #little friend#!", + "We made you an offer you #can't refuse#.", + "Hyrule? More like #Hycool#!", + "Ice puns are #snow# problem!", + "This #ice# is #snow# joke!", + "There's no business like #snow# business!", + "no, dude", + "N#ice# trap ya got here!", + "Quick do your best impression of #Zoras Domain#!", + "Ganon used #ice beam#, it's super effective!", + "I was #frozen# today.", + "You're not in a #hurry#, right?", + "It's a #trap#!", + "At least it's not a VC crash and only Link is #frozen#!", + "Oh no! #BRAIN FREEZE#!", + "Looks like your game #froze#! Nope just you!", + "PK #FREEZE#!", + "May I interest you in some #iced# Tea?", + "Time for some Netflix and #chill#.", + "I know, I know... #FREEZE#!", + "#Ice# of you to drop by!", + "STOP!&You violated the #Thaw#!", + "I wanted to give you a treasure, but it looks like you got #cold feet#", + "You told me you wanted to deliver #just ice# to Ganondorf!", + "You got the triforce!&This ancient artifact of divine power can grant any- wait, no, sorry, it's just an ice trap. My bad", + "Time to #cool off#!", + "The #Ice Cavern# sends its regards.", + "Loading item, please #wait#...", + "Mash A+B to not #die#.", + "Sorry, your item is in another location.", //would be better if it could have the name of the item + "You only wish this was %gGreg%w.", + "Do you want to drink a hot chocolate?", + "The #cold# never bothered me anyway", + "Hope you're too school for #cool#!", + "Be thankful this isn't #absolute zero#.", + "Did you know the F in ZFG stands for #Freeze#?", + "You got #Ice Age (2002)#!", + "Now you can cast a #spell# you don't know", + "How's about a hero #on the rocks#?", + "Ain't no tunic for #this#!", + "I knew you were #part metroid#!", + "That's just the #icing on the cake#!", + "You're so #cool#, @!", + "You found #disappointment#!", + "You got #FOOLED#!", + "Start Mashing.", + "This item will #self-destruct# in 5 seconds...", + "Remember, there may be some momentary #discomfort#.", + "In a perfect world #ice traps# like me would not exist, but this is not a perfect world.", + "Gee, it sure is #cold# around here.", + "You tested the item with your #ice detector#, it beeped.", //would be better if it could have the name of the item + "You have found the way of the zero. The #sub-zero#.", + "Mweep... mweep... mweep...", + "Scum, #freezebag#! I mean #freeze#, scumbag!", + "Is it #chilly# in here or is it just #you#?", + "#Proceed#", + "WHAT'S SHE GONNA DO, MAKE ME AN #[Ice Cream]#!?", + "You've met with a #terrible fate#, haven't you?", + "So I heard you like the Shining, here's how it #ends#.", + "Minor routing mistake. #I win#.", + "Hold this #L#, @.", + "#SKILL ISSUE#", + "All you heat are belong to us", + "Wait a second, don't you already have #this item#?", + "#Freeze#! We have you surrounded!", + "Error 404 - Item not #found#.", + "Hydration break! Hey, who #froze# my water?", + "Oops, wrong #item model#.", + "Whoops! You have to put the item #in your inventory#.", + "You dropped the item, shattering it into #shards of ice#!", //would be better if it could have the name of the item + "Is this... golden age Simpsons?&BECAUSE I'M ABOUT TO #CHOKE A CHILD#.", + "You are the weakest @, #goodbye#!", + "Ugh... Why did we even randomize #this item#?", + "The #Frost Moon# is rising...", + "According to all known laws of physics and biology, there is no way that @ should be able to survive #getting fully encased in ice#. The cells in @'s body would all die by the time they #unthaw#. Of course, this is a video game, so @ survives anyway... #Probably#.", + "Okay, so stop me if you've heard this one - a gamer and a bottle of #liquid nitrogen# walk into a milk bar...", + "Lástima, es una #trampa de hielo#...&&Nobody expects the Spanish #ice trap#!", + "Gee, it sure is #BURR#ing around here.", + "Navi? Oh! I thought she was called #Névé#!", + "It's fine, @ knew this was a #trap#, they're just using it to take damage intentionally to manipulate RNG.", + "Unfortunately, the item has #stopped#.", //would be better if it could have the name of the item + "This item is #not available# in your country.", //would be better if it could have the name of the item + "#Ice# try. #;)#", + "D'oh, I #missed#!", + "Where is my #super suit#?", + "#Titanic's revenge#.", + }; - { "Never gonna %bgive you up%w. Never&gonna %blet you down%w. Never gonna&run around and %bdesert you%w.", - "Never gonna %bgive you up%w. Never&gonna %blet you down%w. Never gonna&run around and %bdesert you%w.", - "Never gonna %bgive you up%w. Never&gonna %blet you down%w. Never gonna&run around and %bdesert you%w." }, + static const char* const germanIceTrapMessages[23] = { + "Du bist ein #DUMMKOPF#!", + "Du bist eine #Frostbeule#!", + "#DUMMKOPF#!", + "Du wurdest #eiskalt# erwischt!", + "Es läuft Dir #eiskalt# den Rücken hinunter, @.", + "Bleib #cool#, @.", + "Der #Winter# naht.", + "Alles #cool# im Pool?", + "#Abkühlung gefällig#?", + "Es ist ein %kalter%w Tag im Herzen von Hyrule.", + "Bekommst Du etwa #kalte# Füße?", + "Sag den #Zoras# viele Grüße von mir!", + "Bewahre einen #kühlen#! Kopf.", + "Ganondorf setzt #Eisstrahl# ein. Das ist sehr effektiv!", + "Ein Lächeln ist der beste Weg, um das #Eis# zu brechen!", + "#Eiskalt# lässt du meine Seele erfrier'n.", + "Die #Titanic# hätte Angst vor Dir, @.", + "Oh nein!", + "Was die Dinosaurier getötet hat?&Die #Eiszeit#!", + "Nachts ist es #kälter# als draußen.", + "Never gonna #give you up#. Never gonna #let you down#. Never gonna run around and #desert you#.", + "Danke #@#! Aber der Gegenstand ist in einem anderem Schloß!", + "Kalt. Kalt. Kälter. #EISKALT#!", + }; - { "Thank you %b@%w!&But your item is in another castle!", - "Danke %b@%w!&Aber der Gegenstand ist in&einem anderem Schloß!", - "Merci %b@%w!&Mais ton objet est dans un autre&château!" }, + static const char* const frenchIceTrapMessages[23] = { + "#Pauvre fou#...", + "Tu es un #glaçon#, Harry!", + "#Sot# que tu es.", + "Ça me #glace# le sang!", + "#Reste au frais#, @.", + "Et c'est la douche #froide#!", + "L'#hiver# vient.", + "#Glacier#!", + "Ça en jette un #froid#.", + "Est-ce que tu as déjà eu des sueurs #froides#?", + "La vengeance est un plat qui se mange #froid#!", + "Dit bonjour aux #Zoras# pour moi!", + "Il faut parfois savoir garder la tête #froide#!", + "Ganondorf utilise #Piège de Glace#! C'est super efficace!", + "Laisse moi briser la #glace#!", + "Balance man..., Cadence man..., Trace la #glace#..., c'est le Cooooolllll Rasta!", + "Le #Titanic# aurait peur de toi, @.", + "Oh non!", + "Qu'est-ce qui a tué les dinosaures?&L'ère #glacière#!", + "L'imbécile réfléchit uniquement quand il s'observe dans la #glace#.", + "Never gonna #give you up#. Never gonna #let you down#. Never gonna run around and #desert you#.", + "Merci #@#! Mais ton objet est dans un autre château!", + "J'espère que ça ne te fait ni chaud, ni #froid#.", + }; - { "%bFREEZE%w! Don't move!", " Kalt. Kalt. Kälter. %bEISKALT%w!", - "J'espère que ça ne te fait ni chaud, ni&%bfroid%w." }, + CustomMessage msg; - }; - CustomMessageManager* customMessageManager = CustomMessageManager::Instance; - customMessageManager->AddCustomMessageTable(Randomizer::IceTrapRandoMessageTableID); - for (u8 i = 0; i <= (NUM_ICE_TRAP_MESSAGES - 1); i++) { - customMessageManager->CreateMessage(Randomizer::IceTrapRandoMessageTableID, i, - IceTrapMessages[i]); + if (CVarGetInteger(CVAR_GENERAL("LetItSnow"), 0)) { + msg = CustomMessage( + /*english*/ "This year for Christmas, all you get is #COAL#!", + /*german*/ "This year for Christmas, all you get is #COAL#!", + /*french*/ "Pour Noël, cette année, tu n'auras que du #CHARBON#! %rJoyeux Noël%w!", + { QM_BLUE } + ); + } else { + msg = CustomMessage( + RandomElement(englishIceTrapMessages), + RandomElement(germanIceTrapMessages), + RandomElement(frenchIceTrapMessages), + { QM_BLUE, QM_BLUE, QM_BLUE } + ); } - // We only use this ice trap message for christmas, so we don't want it in the normal ice trap messages rotation - customMessageManager->CreateMessage( - Randomizer::IceTrapRandoMessageTableID, NUM_ICE_TRAP_MESSAGES + 1, - CustomMessage("This year for Christmas, all&you get is %BCOAL%w!", - "This year for Christmas, all&you get is %BCOAL%w!", - "Pour Noël, cette année, tu&n'auras que du %BCHARBON!&%rJoyeux Noël%w!")); + msg.AutoFormat(); + return msg; } static int goronIDs[9] = { 0x3052, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, 0x3070 }; @@ -3290,7 +3455,6 @@ void Randomizer::CreateCustomMessages() { CreateRupeeMessages(); CreateTriforcePieceMessages(); CreateNaviRandoMessages(); - CreateIceTrapRandoMessages(); CreateFireTempleGoronMessages(); } diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h index 3e6df621335..9942fa564e3 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.h +++ b/soh/soh/Enhancements/randomizer/randomizer.h @@ -20,7 +20,6 @@ #define MAX_SEED_STRING_SIZE 1024 #define NUM_TRIFORCE_PIECE_MESSAGES 6 #define NUM_NAVI_MESSAGES 19 -#define NUM_ICE_TRAP_MESSAGES 23 #define NUM_GORON_MESSAGES 9 class Randomizer { @@ -68,6 +67,7 @@ class Randomizer { CustomMessage GetMapGetItemMessageWithHint(GetItemEntry itemEntry); static void CreateCustomMessages(); static CustomMessage GetRupeeMessage(u16 rupeeTextId); + static CustomMessage GetIceTrapMessage(); static CustomMessage GetTriforcePieceMessage(); bool CheckContainsVanillaItem(RandomizerCheck randoCheck); }; diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 7f15210b8de..fee872f9329 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -2519,11 +2519,7 @@ extern "C" int CustomMessage_RetrieveIfExists(PlayState* play) { Player* player = GET_PLAYER(play); if (textId == TEXT_RANDOMIZER_CUSTOM_ITEM) { if (player->getItemEntry.getItemId == RG_ICE_TRAP) { - u16 iceTrapTextId = Random(0, NUM_ICE_TRAP_MESSAGES); - messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::IceTrapRandoMessageTableID, iceTrapTextId); - if (CVarGetInteger(CVAR_GENERAL("LetItSnow"), 0)) { - messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::IceTrapRandoMessageTableID, NUM_ICE_TRAP_MESSAGES + 1); - } + messageEntry = Randomizer::GetIceTrapMessage(); } else if (player->getItemEntry.getItemId == RG_TRIFORCE_PIECE) { messageEntry = Randomizer::GetTriforcePieceMessage(); } else { From 4148d59c48a694d04a987719281f002f19a92526 Mon Sep 17 00:00:00 2001 From: Malkierian Date: Tue, 17 Sep 2024 11:32:52 -0700 Subject: [PATCH 100/108] Check Tracker Re-update (#4322) * Update check status in the check tracker to the new system. Status and Skipped are now stored in ItemLocation, though still saved separately in the trackerData section. * Fix shop checks not showing prices when identified. * Patch fix for check status bleed. Some cleanup of unused code. * Small tracker optimizations. * Fix check hiding. * Bit more cleanup. * Unhide the filter and make it work again... * Fix area totals tracking. Fix skipped status saving. * Merge conflict cleanup. --- soh/include/z64save.h | 2 +- .../Enhancements/randomizer/hook_handlers.cpp | 28 +- .../Enhancements/randomizer/item_location.cpp | 21 +- .../Enhancements/randomizer/item_location.h | 9 +- .../Enhancements/randomizer/randomizer.cpp | 2 - .../Enhancements/randomizer/randomizerTypes.h | 27 +- .../randomizer/randomizer_check_tracker.cpp | 338 +++++++----------- .../randomizer/randomizer_check_tracker.h | 12 +- soh/soh/Enhancements/randomizer/savefile.cpp | 2 +- soh/soh/SaveManager.cpp | 11 +- soh/soh/SaveManager.h | 2 + 11 files changed, 192 insertions(+), 262 deletions(-) diff --git a/soh/include/z64save.h b/soh/include/z64save.h index 617c2acf526..c6db012e1df 100644 --- a/soh/include/z64save.h +++ b/soh/include/z64save.h @@ -68,6 +68,7 @@ typedef enum { // Pre-existing IDs for save sections in base code SECTION_ID_STATS, SECTION_ID_ENTRANCES, SECTION_ID_SCENES, + SECTION_ID_TRACKER_DATA, SECTION_ID_MAX } SaveFuncIDs; @@ -279,7 +280,6 @@ typedef struct { /* */ u8 pendingIceTrapCount; /* */ SohStats sohStats; /* */ FaroresWindData backupFW; - /* */ RandomizerCheckTrackerData checkTrackerData[RC_MAX]; // #endregion // #region SOH [Randomizer] // Upstream TODO: Move these to their own struct or name to more obviously specific to Randomizer diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index 92a1b278c90..518daf6d081 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -306,7 +306,9 @@ void RandomizerOnItemReceiveHandler(GetItemEntry receivedItemEntry) { auto loc = Rando::Context::GetInstance()->GetItemLocation(randomizerQueuedCheck); if (randomizerQueuedItemEntry.modIndex == receivedItemEntry.modIndex && randomizerQueuedItemEntry.itemId == receivedItemEntry.itemId) { SPDLOG_INFO("Item received mod {} item {} from RC {}", receivedItemEntry.modIndex, receivedItemEntry.itemId, static_cast(randomizerQueuedCheck)); - loc->MarkAsObtained(); + loc->SetCheckStatus(RCSHOW_COLLECTED); + CheckTracker::RecalculateAllAreaTotals(); + SaveManager::Instance->SaveSection(gSaveContext.fileNum, SECTION_ID_TRACKER_DATA, true); randomizerQueuedCheck = RC_UNKNOWN_CHECK; randomizerQueuedItemEntry = GET_ITEM_NONE; } @@ -662,7 +664,8 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void *should = false; } else { *should = true; - Rando::Context::GetInstance()->GetItemLocation(RC_TOT_MASTER_SWORD)->MarkAsObtained(); + Rando::Context::GetInstance()->GetItemLocation(RC_TOT_MASTER_SWORD)->SetCheckStatus(RCSHOW_COLLECTED); + CheckTracker::RecalculateAllAreaTotals(); } break; case VB_ITEM00_DESPAWN: { @@ -1179,25 +1182,26 @@ void RandomizerOnSceneInitHandler(int16_t sceneNum) { // probably need to do something different when we implement shuffle if (sceneNum == SCENE_TREASURE_BOX_SHOP) { Flags_UnsetRandomizerInf(RAND_INF_MARKET_TREASURE_CHEST_GAME_ITEM_1); - Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_1)->MarkAsNotObtained(); + Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_1)->SetCheckStatus(RCSHOW_UNCHECKED); Flags_UnsetRandomizerInf(RAND_INF_MARKET_TREASURE_CHEST_GAME_ITEM_2); - Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_2)->MarkAsNotObtained(); + Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_2)->SetCheckStatus(RCSHOW_UNCHECKED); Flags_UnsetRandomizerInf(RAND_INF_MARKET_TREASURE_CHEST_GAME_ITEM_3); - Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_3)->MarkAsNotObtained(); + Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_3)->SetCheckStatus(RCSHOW_UNCHECKED); Flags_UnsetRandomizerInf(RAND_INF_MARKET_TREASURE_CHEST_GAME_ITEM_4); - Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_4)->MarkAsNotObtained(); + Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_4)->SetCheckStatus(RCSHOW_UNCHECKED); Flags_UnsetRandomizerInf(RAND_INF_MARKET_TREASURE_CHEST_GAME_ITEM_5); - Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_5)->MarkAsNotObtained(); + Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_5)->SetCheckStatus(RCSHOW_UNCHECKED); Flags_UnsetRandomizerInf(RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_1); - Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_1)->MarkAsNotObtained(); + Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_1)->SetCheckStatus(RCSHOW_UNCHECKED); Flags_UnsetRandomizerInf(RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_2); - Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_2)->MarkAsNotObtained(); + Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_2)->SetCheckStatus(RCSHOW_UNCHECKED); Flags_UnsetRandomizerInf(RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_3); - Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_3)->MarkAsNotObtained(); + Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_3)->SetCheckStatus(RCSHOW_UNCHECKED); Flags_UnsetRandomizerInf(RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_4); - Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_4)->MarkAsNotObtained(); + Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_4)->SetCheckStatus(RCSHOW_UNCHECKED); Flags_UnsetRandomizerInf(RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_5); - Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_5)->MarkAsNotObtained(); + Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_5)->SetCheckStatus(RCSHOW_UNCHECKED); + CheckTracker::RecalculateAllAreaTotals(); } // LACs & Prelude checks diff --git a/soh/soh/Enhancements/randomizer/item_location.cpp b/soh/soh/Enhancements/randomizer/item_location.cpp index 3185fce8aa1..d303b3c3b17 100644 --- a/soh/soh/Enhancements/randomizer/item_location.cpp +++ b/soh/soh/Enhancements/randomizer/item_location.cpp @@ -102,15 +102,23 @@ void ItemLocation::SetCustomPrice(const uint16_t price_) { } bool ItemLocation::HasObtained() const { - return obtained; + return status == RCSHOW_COLLECTED || status == RCSHOW_SAVED; } -void ItemLocation::MarkAsObtained() { - obtained = true; +void ItemLocation::SetCheckStatus(RandomizerCheckStatus status_) { + status = status_; } -void ItemLocation::MarkAsNotObtained() { - obtained = false; +RandomizerCheckStatus ItemLocation::GetCheckStatus() { + return status; +} + +void ItemLocation::SetIsSkipped(bool isSkipped_) { + isSkipped = isSkipped_; +} + +bool ItemLocation::GetIsSkipped() { + return isSkipped; } bool ItemLocation::IsHintable() const { @@ -213,6 +221,7 @@ void ItemLocation::ResetVariables() { wothCandidate = false; barrenCandidate = false; area = RA_NONE; - obtained = false; + status = RCSHOW_UNCHECKED; + isSkipped = false; } } \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/item_location.h b/soh/soh/Enhancements/randomizer/item_location.h index b40cac537b8..868b384b5dc 100644 --- a/soh/soh/Enhancements/randomizer/item_location.h +++ b/soh/soh/Enhancements/randomizer/item_location.h @@ -32,8 +32,10 @@ class ItemLocation { bool HasCustomPrice() const; void SetCustomPrice(uint16_t price_); bool HasObtained() const; - void MarkAsObtained(); - void MarkAsNotObtained(); + void SetCheckStatus(RandomizerCheckStatus status_); + RandomizerCheckStatus GetCheckStatus(); + void SetIsSkipped(bool isSkipped_); + bool GetIsSkipped(); bool IsHintable() const; void SetAsHintable(); bool IsAHintAccessible() const; @@ -70,6 +72,7 @@ class ItemLocation { bool visibleInImGui = false; bool wothCandidate = false; bool barrenCandidate = false; - bool obtained = false; + RandomizerCheckStatus status = RCSHOW_UNCHECKED; + bool isSkipped = false; }; } // namespace Rando \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 4983647e92b..65144484089 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -56,8 +56,6 @@ std::set spoilerExcludedLocations; std::set enabledTricks; std::set enabledGlitches; -std::set> checkTrackerStates; - u8 generated; char* seedString; diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 507ae5fec2b..304fef213cd 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -27,16 +27,6 @@ typedef struct { uint8_t id; } Sprite; -// Check tracker check visibility categories -typedef enum { - RCSHOW_UNCHECKED, - RCSHOW_SEEN, - RCSHOW_IDENTIFIED, - RCSHOW_SCUMMED, - RCSHOW_COLLECTED, - RCSHOW_SAVED, -} RandomizerCheckStatus; - typedef enum { HINT_TYPE_HINT_KEY, HINT_TYPE_AREA, @@ -315,6 +305,16 @@ typedef enum { RCAREA_INVALID } RandomizerCheckArea; +// Check tracker check visibility categories +typedef enum { + RCSHOW_UNCHECKED, + RCSHOW_SEEN, + RCSHOW_IDENTIFIED, + RCSHOW_SCUMMED, + RCSHOW_COLLECTED, + RCSHOW_SAVED, +} RandomizerCheckStatus; + typedef enum { RR_NONE, RR_ROOT, @@ -3886,13 +3886,6 @@ typedef enum { RSK_MAX } RandomizerSettingKey; -typedef struct { - RandomizerCheckStatus status; - uint16_t skipped; - int16_t price; - uint16_t hintItem; -} RandomizerCheckTrackerData; - //Generic Settings (any binary option can use this) // off/on typedef enum { diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index d617f6fd00f..fa67fd1eb18 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -36,21 +36,6 @@ extern std::vector equipmentItems; using json = nlohmann::json; -void to_json(json& j, const RandomizerCheckTrackerData& rctd) { - j = json { - { "status", rctd.status == RCSHOW_COLLECTED ? RCSHOW_SAVED : rctd.status }, - { "skipped", rctd.skipped }, - { "price", rctd.price }, - { "hintItem", rctd.hintItem }}; - } - -void from_json(const json& j, RandomizerCheckTrackerData& rctd) { - j.at("status").get_to(rctd.status); - j.at("skipped").get_to(rctd.skipped); - j.at("hintItem").get_to(rctd.hintItem); - j.at("price").get_to(rctd.price); -} - namespace CheckTracker { // settings @@ -149,13 +134,12 @@ OSContPad* trackerButtonsPressed; std::unordered_map checkNameOverrides; bool ShouldShowCheck(RandomizerCheck rc); -bool ShouldHideArea(RandomizerCheckArea rcArea); +bool UpdateFilters(); void BeginFloatWindows(std::string UniqueName, bool& open, ImGuiWindowFlags flags = 0); bool CompareChecks(RandomizerCheck, RandomizerCheck); bool CheckByArea(RandomizerCheckArea); void DrawLocation(RandomizerCheck); void EndFloatWindows(); -bool HasItemBeenCollected(RandomizerCheck); void LoadSettings(); void RainbowTick(); void UpdateAreas(RandomizerCheckArea area); @@ -219,39 +203,35 @@ Color_RGBA8 Color_Saved_Extra = { 0, 185, 0, 255 }; // Green std::vector buttons = { BTN_A, BTN_B, BTN_CUP, BTN_CDOWN, BTN_CLEFT, BTN_CRIGHT, BTN_L, BTN_Z, BTN_R, BTN_START, BTN_DUP, BTN_DDOWN, BTN_DLEFT, BTN_DRIGHT }; static ImGuiTextFilter checkSearch; - -void DefaultCheckData(RandomizerCheck rc) { - gSaveContext.checkTrackerData[rc].status = RCSHOW_UNCHECKED; - gSaveContext.checkTrackerData[rc].skipped = 0; - gSaveContext.checkTrackerData[rc].hintItem = RC_UNKNOWN_CHECK; -} +std::array filterAreasHidden = { 0 }; +std::array filterChecksHidden = { 0 }; void SongFromImpa() { if (IS_RANDO) { if (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SKIP_CHILD_ZELDA) == RO_GENERIC_ON && IS_RANDO) { - if (gSaveContext.checkTrackerData[RC_SONG_FROM_IMPA].status != RCSHOW_SAVED) { - gSaveContext.checkTrackerData[RC_SONG_FROM_IMPA].status = RCSHOW_SAVED; - } + //if (gSaveContext.checkTrackerData[RC_SONG_FROM_IMPA].status != RCSHOW_SAVED) { + // gSaveContext.checkTrackerData[RC_SONG_FROM_IMPA].status = RCSHOW_SAVED; + //} } } } void GiftFromSages() { if (!IS_RANDO) { - DefaultCheckData(RC_GIFT_FROM_SAGES); + //DefaultCheckData(RC_GIFT_FROM_SAGES); } } std::vector checks; // Function for adding Link's Pocket check void LinksPocket() { - if (IS_RANDO) { + /*if (IS_RANDO) { if (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LINKS_POCKET) != RO_LINKS_POCKET_NOTHING || OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_DUNGEON_REWARDS) == RO_DUNGEON_REWARDS_END_OF_DUNGEON) { DefaultCheckData(RC_LINKS_POCKET); gSaveContext.checkTrackerData[RC_LINKS_POCKET].status = RCSHOW_SAVED; } - } + }*/ } void TrySetAreas() { @@ -280,37 +260,38 @@ uint16_t GetTotalChecksGotten() { return totalChecksGotten; } -void RecalculateAreaTotals() { - for (auto [rcArea, checks] : checksByArea) { - if (rcArea == RCAREA_INVALID) { - return; +void RecalculateAreaTotals(RandomizerCheckArea rcArea) { + areaChecksGotten[rcArea] = 0; + areaCheckTotals[rcArea] = 0; + for (auto rc : checksByArea.at(rcArea)) { + if (!IsVisibleInCheckTracker(rc)) { + continue; } - areaChecksGotten[rcArea] = 0; - areaCheckTotals[rcArea] = 0; - for (auto rc : checks) { - if (!IsVisibleInCheckTracker(rc)) { - continue; - } - areaCheckTotals[rcArea]++; - if (gSaveContext.checkTrackerData[rc].skipped || gSaveContext.checkTrackerData[rc].status == RCSHOW_COLLECTED - || gSaveContext.checkTrackerData[rc].status == RCSHOW_SAVED) { - areaChecksGotten[rcArea]++; - } + areaCheckTotals[rcArea]++; + if (OTRGlobals::Instance->gRandoContext->GetItemLocation(rc)->GetIsSkipped() || OTRGlobals::Instance->gRandoContext->GetItemLocation(rc)->HasObtained()) { + areaChecksGotten[rcArea]++; } } + CalculateTotals(); +} - totalChecks = 0; - totalChecksGotten = 0; +void RecalculateAllAreaTotals() { + for (auto& [rcArea, checks] : checksByArea) { + if (rcArea == RCAREA_INVALID) { + return; + } + RecalculateAreaTotals(rcArea); + } } void SetCheckCollected(RandomizerCheck rc) { - gSaveContext.checkTrackerData[rc].status = RCSHOW_COLLECTED; + OTRGlobals::Instance->gRandoContext->GetItemLocation(rc)->SetCheckStatus(RCSHOW_COLLECTED); Rando::Location* loc = Rando::StaticData::GetLocation(rc); if (IsVisibleInCheckTracker(rc)) { - if (!gSaveContext.checkTrackerData[rc].skipped) { + if (!OTRGlobals::Instance->gRandoContext->GetItemLocation(rc)->GetIsSkipped()) { areaChecksGotten[loc->GetArea()]++; } else { - gSaveContext.checkTrackerData[rc].skipped = false; + OTRGlobals::Instance->gRandoContext->GetItemLocation(rc)->SetIsSkipped(false); } } SaveManager::Instance->SaveSection(gSaveContext.fileNum, sectionId, true); @@ -427,6 +408,8 @@ void ClearAreaChecksAndTotals() { areaChecksGotten[rcArea] = 0; areaCheckTotals[rcArea] = 0; } + totalChecks = 0; + totalChecksGotten = 0; } void SetShopSeen(uint32_t sceneNum, bool prices) { @@ -439,8 +422,8 @@ void SetShopSeen(uint32_t sceneNum, bool prices) { } bool statusChanged = false; for (int i = start; i < start + 8; i++) { - if (gSaveContext.checkTrackerData[i].status == RCSHOW_UNCHECKED) { - gSaveContext.checkTrackerData[i].status = RCSHOW_SEEN; + if (OTRGlobals::Instance->gRandoContext->GetItemLocation(i)->GetCheckStatus() == RCSHOW_UNCHECKED) { + OTRGlobals::Instance->gRandoContext->GetItemLocation(i)->SetCheckStatus(RCSHOW_SEEN); statusChanged = true; } } @@ -449,73 +432,23 @@ void SetShopSeen(uint32_t sceneNum, bool prices) { } } -bool HasItemBeenCollected(RandomizerCheck rc) { - if (gPlayState == nullptr) { - return false; - } - Rando::Location* x = Rando::StaticData::GetLocation(rc); - Rando::SpoilerCollectionCheck check = x->GetCollectionCheck(); - auto flag = check.flag; - auto scene = check.scene; - auto type = check.type; - - switch (type) { - case SpoilerCollectionCheckType::SPOILER_CHK_ALWAYS_COLLECTED: - return true; - case SpoilerCollectionCheckType::SPOILER_CHK_CHEST: - return (gPlayState->sceneNum == scene && gPlayState->actorCtx.flags.chest & (1 << flag)) || - gSaveContext.sceneFlags[scene].chest & (1 << flag); - case SpoilerCollectionCheckType::SPOILER_CHK_COLLECTABLE: - return (gPlayState->sceneNum == scene && gPlayState->actorCtx.flags.collect & (1 << flag)) || - gSaveContext.sceneFlags[scene].collect & (1 << flag); - case SpoilerCollectionCheckType::SPOILER_CHK_SHOP_ITEM: - case SpoilerCollectionCheckType::SPOILER_CHK_FISH: - case SpoilerCollectionCheckType::SPOILER_CHK_RANDOMIZER_INF: - case SpoilerCollectionCheckType::SPOILER_CHK_MASTER_SWORD: - return Flags_GetRandomizerInf(OTRGlobals::Instance->gRandomizer->GetRandomizerInfFromCheck(rc)); - case SpoilerCollectionCheckType::SPOILER_CHK_EVENT_CHK_INF: - return gSaveContext.eventChkInf[flag / 16] & (0x01 << flag % 16); - case SpoilerCollectionCheckType::SPOILER_CHK_GOLD_SKULLTULA: - return GET_GS_FLAGS(scene) & flag; - case SpoilerCollectionCheckType::SPOILER_CHK_INF_TABLE: - return gSaveContext.infTable[scene] & INDEX_TO_16BIT_LITTLE_ENDIAN_BITMASK(flag); - case SpoilerCollectionCheckType::SPOILER_CHK_ITEM_GET_INF: - return gSaveContext.itemGetInf[flag / 16] & INDEX_TO_16BIT_LITTLE_ENDIAN_BITMASK(flag); - case SpoilerCollectionCheckType::SPOILER_CHK_NONE: - return false; - case SpoilerCollectionCheckType::SPOILER_CHK_GRAVEDIGGER: - // Gravedigger has a fix in place that means one of two save locations. Check both. - return (gSaveContext.itemGetInf[1] & 0x1000) || // vanilla flag - ((IS_RANDO || CVarGetInteger(CVAR_ENHANCEMENT("GravediggingTourFix"), 0)) && - gSaveContext.sceneFlags[scene].collect & (1 << flag) || (gPlayState->actorCtx.flags.collect & (1 << flag))); // rando/fix flag - default: - return false; - } - return false; -} - void CheckTrackerLoadGame(int32_t fileNum) { LoadSettings(); TrySetAreas(); for (auto& entry : Rando::StaticData::GetLocationTable()) { RandomizerCheck rc = entry.GetRandomizerCheck(); - RandomizerCheckTrackerData rcTrackerData = gSaveContext.checkTrackerData[rc]; if (rc == RC_UNKNOWN_CHECK || rc == RC_MAX || rc == RC_LINKS_POCKET || !Rando::StaticData::GetLocation(rc) != RC_UNKNOWN_CHECK) { continue; } - Rando::Location* entry2; - if (rc == RC_GIFT_FROM_SAGES && !IS_RANDO) { - entry2 = Rando::StaticData::GetLocation(rc); - } else { - entry2 = Rando::StaticData::GetLocation(rc); - } + Rando::Location* entry2 = Rando::StaticData::GetLocation(rc); + Rando::ItemLocation* loc = OTRGlobals::Instance->gRandoContext->GetItemLocation(rc); checksByArea.find(entry2->GetArea())->second.push_back(entry2->GetRandomizerCheck()); if (IsVisibleInCheckTracker(entry2->GetRandomizerCheck())) { areaCheckTotals[entry2->GetArea()]++; - if (rcTrackerData.status == RCSHOW_SAVED || rcTrackerData.skipped) { + if (loc->GetCheckStatus() == RCSHOW_SAVED || loc->GetIsSkipped()) { areaChecksGotten[entry2->GetArea()]++; } } @@ -570,6 +503,7 @@ void CheckTrackerLoadGame(int32_t fileNum) { initialized = true; UpdateAllOrdering(); UpdateInventoryChecks(); + UpdateFilters(); } void CheckTrackerShopSlotChange(uint8_t cursorSlot, int16_t basePrice) { @@ -581,10 +515,9 @@ void CheckTrackerShopSlotChange(uint8_t cursorSlot, int16_t basePrice) { if (GetCheckArea() == RCAREA_KAKARIKO_VILLAGE && gPlayState->sceneNum == SCENE_BAZAAR) { slot = RC_KAK_BAZAAR_ITEM_1 + cursorSlot; } - auto status = gSaveContext.checkTrackerData[slot].status; + auto status = OTRGlobals::Instance->gRandoContext->GetItemLocation(slot)->GetCheckStatus(); if (status == RCSHOW_SEEN) { - gSaveContext.checkTrackerData[slot].status = RCSHOW_IDENTIFIED; - gSaveContext.checkTrackerData[slot].price = basePrice; + OTRGlobals::Instance->gRandoContext->GetItemLocation(slot)->SetCheckStatus(RCSHOW_IDENTIFIED); SaveManager::Instance->SaveSection(gSaveContext.fileNum, sectionId, true); } } @@ -617,8 +550,7 @@ void CheckTrackerFrame() { return; } // TODO: Move to OnAmmoChange hook once it gets added. - if (gSaveContext.checkTrackerData[RC_ZR_MAGIC_BEAN_SALESMAN].status != RCSHOW_COLLECTED && - gSaveContext.checkTrackerData[RC_ZR_MAGIC_BEAN_SALESMAN].status != RCSHOW_SAVED) { + if (!OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_ZR_MAGIC_BEAN_SALESMAN)->HasObtained()) { if (BEANS_BOUGHT >= 10) { SetCheckCollected(RC_ZR_MAGIC_BEAN_SALESMAN); } @@ -827,33 +759,43 @@ void CheckTrackerFlagSet(int16_t flagType, int32_t flag) { void InitTrackerData(bool isDebug) { TrySetAreas(); areasSpoiled = 0; - for (auto& loc : Rando::StaticData::GetLocationTable()) { - if (loc.GetRandomizerCheck() != RC_UNKNOWN_CHECK && loc.GetRandomizerCheck() != RC_MAX) { - DefaultCheckData(loc.GetRandomizerCheck()); - } - } - UpdateAllOrdering(); } -void SaveTrackerData(SaveContext* saveContext, int sectionID, bool gameSave) { - SaveManager::Instance->SaveArray("checks", ARRAY_COUNT(saveContext->checkTrackerData), [&](size_t i) { - if (saveContext->checkTrackerData[i].status == RCSHOW_COLLECTED) { - if (gameSave) { - gSaveContext.checkTrackerData[i].status = saveContext->checkTrackerData[i].status = RCSHOW_SAVED; - UpdateAllOrdering(); - UpdateInventoryChecks(); - } else { - saveContext->checkTrackerData[i].status = RCSHOW_SCUMMED; +void SaveTrackerData(SaveContext* saveContext, int sectionID, bool fullSave) { + bool updateOrdering = false; + std::vector checkCount; + for (int i = RC_UNKNOWN_CHECK; i < RC_MAX; i++) { + if (OTRGlobals::Instance->gRandoContext->GetItemLocation(i)->GetCheckStatus() != RCSHOW_UNCHECKED || + OTRGlobals::Instance->gRandoContext->GetItemLocation(i)->GetIsSkipped()) + checkCount.push_back(static_cast(i)); + } + SaveManager::Instance->SaveArray("checkStatus", checkCount.size(), [&](size_t i) { + RandomizerCheck check = checkCount.at(i); + RandomizerCheckStatus savedStatus = OTRGlobals::Instance->gRandoContext->GetItemLocation(check)->GetCheckStatus(); + bool isSkipped = OTRGlobals::Instance->gRandoContext->GetItemLocation(check)->GetIsSkipped(); + if (savedStatus == RCSHOW_COLLECTED) { + if (fullSave) { + OTRGlobals::Instance->gRandoContext->GetItemLocation(check)->SetCheckStatus(RCSHOW_SAVED); + savedStatus = RCSHOW_SAVED; + updateOrdering = true; + } + else { + savedStatus = RCSHOW_SCUMMED; } } - SaveManager::Instance->SaveStruct("", [&]() { - SaveManager::Instance->SaveData("status", saveContext->checkTrackerData[i].status); - SaveManager::Instance->SaveData("skipped", saveContext->checkTrackerData[i].skipped); - SaveManager::Instance->SaveData("price", saveContext->checkTrackerData[i].price); - SaveManager::Instance->SaveData("hintItem", saveContext->checkTrackerData[i].hintItem); - }); + if (savedStatus != RCSHOW_UNCHECKED || isSkipped) { + SaveManager::Instance->SaveStruct("", [&]() { + SaveManager::Instance->SaveData("randomizerCheck", check); + SaveManager::Instance->SaveData("status", savedStatus); + SaveManager::Instance->SaveData("skipped", isSkipped); + }); + } }); SaveManager::Instance->SaveData("areasSpoiled", areasSpoiled); + if (updateOrdering) { + UpdateAllOrdering(); + UpdateAllAreas(); + } } void SaveFile(SaveContext* saveContext, int sectionID, bool fullSave) { @@ -861,15 +803,21 @@ void SaveFile(SaveContext* saveContext, int sectionID, bool fullSave) { } void LoadFile() { - SaveManager::Instance->LoadArray("checks", RC_MAX, [](size_t i) { + SaveManager::Instance->LoadArray("checkStatus", RC_MAX, [](size_t i) { SaveManager::Instance->LoadStruct("", [&]() { - SaveManager::Instance->LoadData("status", gSaveContext.checkTrackerData[i].status); - SaveManager::Instance->LoadData("skipped", gSaveContext.checkTrackerData[i].skipped); - SaveManager::Instance->LoadData("price", gSaveContext.checkTrackerData[i].price); - SaveManager::Instance->LoadData("hintItem", gSaveContext.checkTrackerData[i].hintItem); + RandomizerCheckStatus status; + bool skipped; + RandomizerCheck rc; + SaveManager::Instance->LoadData("randomizerCheck", rc, RC_UNKNOWN_CHECK); + SaveManager::Instance->LoadData("status", status, RCSHOW_UNCHECKED); + SaveManager::Instance->LoadData("skipped", skipped, false); + OTRGlobals::Instance->gRandoContext->GetItemLocation(rc)->SetCheckStatus(status); + OTRGlobals::Instance->gRandoContext->GetItemLocation(rc)->SetIsSkipped(skipped); + }); }); - }); - SaveManager::Instance->LoadData("areasSpoiled", areasSpoiled); + SaveManager::Instance->LoadData("areasSpoiled", areasSpoiled, (uint32_t)0); + UpdateAllOrdering(); + UpdateAllAreas(); } void Teardown() { @@ -877,6 +825,8 @@ void Teardown() { ClearAreaChecksAndTotals(); checksByArea.clear(); areasSpoiled = 0; + filterAreasHidden = { 0 }; + filterChecksHidden = { 0 }; lastLocationChecked = RC_UNKNOWN_CHECK; } @@ -890,30 +840,6 @@ void SetAreaSpoiled(RandomizerCheckArea rcArea) { SaveManager::Instance->SaveSection(gSaveContext.fileNum, sectionId, true); } -void UpdateCheck(uint32_t check, RandomizerCheckTrackerData data) { - auto area = Rando::StaticData::GetLocation(static_cast(check))->GetArea(); - if ((!gSaveContext.checkTrackerData[check].skipped && data.skipped) || - ((gSaveContext.checkTrackerData[check].status != RCSHOW_COLLECTED && gSaveContext.checkTrackerData[check].status != RCSHOW_SAVED) && - (data.status == RCSHOW_COLLECTED || data.status == RCSHOW_SAVED))) { - areaChecksGotten[area]++; - } else if ((gSaveContext.checkTrackerData[check].skipped && !data.skipped) || - ((gSaveContext.checkTrackerData[check].status == RCSHOW_COLLECTED || gSaveContext.checkTrackerData[check].status == RCSHOW_SAVED) && - (data.status != RCSHOW_COLLECTED && data.status != RCSHOW_SAVED))) { - areaChecksGotten[area]--; - } - gSaveContext.checkTrackerData[check] = data; - UpdateOrdering(area); -} - -void CheckTrackerWindow::Draw() { - if (!IsVisible()) { - return; - } - DrawElement(); - // Sync up the IsVisible flag if it was changed by ImGui - SyncVisibilityConsoleVariable(); -} - void CheckTrackerWindow::DrawElement() { if (CVarGetInteger(CVAR_TRACKER_CHECK("WindowType"), TRACKER_WINDOW_WINDOW) == TRACKER_WINDOW_FLOATING) { if (CVarGetInteger(CVAR_TRACKER_CHECK("ShowOnlyPaused"), 0) && (gPlayState == nullptr || gPlayState->pauseCtx.state == 0)) { @@ -985,7 +911,9 @@ void CheckTrackerWindow::DrawElement() { doAreaScroll = true; } UIWidgets::Tooltip("Clear the search field"); - checkSearch.Draw(); + if (checkSearch.Draw()) { + UpdateFilters(); + } UIWidgets::PaddedSeparator(); @@ -1039,7 +967,7 @@ void CheckTrackerWindow::DrawElement() { previousShowHidden = showHidden; doAreaScroll = true; } - if ((shouldHideFilteredAreas && ShouldHideArea(rcArea)) || + if ((shouldHideFilteredAreas && filterAreasHidden[rcArea]) || (!showHidden && ((hideComplete && thisAreaFullyChecked) || (hideIncomplete && !thisAreaFullyChecked))) ) { doDraw = false; @@ -1099,7 +1027,7 @@ void CheckTrackerWindow::DrawElement() { doAreaScroll = false; } for (auto rc : checks) { - if (doDraw && isThisAreaSpoiled && ShouldShowCheck(rc)) { + if (doDraw && isThisAreaSpoiled && !filterChecksHidden[rc]) { DrawLocation(rc); } } @@ -1119,13 +1047,16 @@ void CheckTrackerWindow::DrawElement() { } } -bool ShouldHideArea(RandomizerCheckArea rcArea) { - if (checkSearch.Filters.Size == 0 || checkSearch.PassFilter(RandomizerCheckObjects::GetRCAreaName(rcArea).c_str())) { - return false; - } - for (auto check : checksByArea[rcArea]) { - if (ShouldShowCheck(check)) { - return false; +bool UpdateFilters() { + for (auto& [rcArea, checks] : checksByArea) { + filterAreasHidden[rcArea] = !checkSearch.PassFilter(RandomizerCheckObjects::GetRCAreaName(rcArea).c_str()); + for (auto check : checks) { + if (ShouldShowCheck(check)) { + filterAreasHidden[rcArea] = false; + filterChecksHidden[check] = false; + } else { + filterChecksHidden[check] = true; + } } } @@ -1136,8 +1067,9 @@ bool ShouldShowCheck(RandomizerCheck check) { return ( IsVisibleInCheckTracker(check) && (checkSearch.Filters.Size == 0 || - checkSearch.PassFilter(RandomizerCheckObjects::GetRCAreaName(Rando::StaticData::GetLocation(check)->GetArea()).c_str()) || - checkSearch.PassFilter(Rando::StaticData::GetLocation(check)->GetShortName().c_str())) + checkSearch.PassFilter((Rando::StaticData::GetLocation(check)->GetShortName() + " " + + Rando::StaticData::GetLocation(check)->GetName() + " " + + RandomizerCheckObjects::GetRCAreaName(Rando::StaticData::GetLocation(check)->GetArea())).c_str())) ); } @@ -1368,6 +1300,13 @@ void UpdateInventoryChecks() { void UpdateAreaFullyChecked(RandomizerCheckArea area) { } +void UpdateAllAreas() { + // Sort the entire thing + for (int i = 0; i < RCAREA_INVALID; i++) { + UpdateAreas(static_cast(i)); + } +} + void UpdateAreas(RandomizerCheckArea area) { areasFullyChecked[area] = areaChecksGotten[area] == checksByArea.find(area)->second.size(); } @@ -1384,7 +1323,7 @@ void UpdateOrdering(RandomizerCheckArea rcArea) { if(checksByArea.contains(rcArea)) { std::sort(checksByArea.find(rcArea)->second.begin(), checksByArea.find(rcArea)->second.end(), CompareChecks); } - + RecalculateAllAreaTotals(); CalculateTotals(); } @@ -1393,14 +1332,14 @@ bool IsEoDCheck(RandomizerCheckType type) { } bool CompareChecks(RandomizerCheck i, RandomizerCheck j) { - RandomizerCheckTrackerData iShow = gSaveContext.checkTrackerData[i]; - RandomizerCheckTrackerData jShow = gSaveContext.checkTrackerData[j]; Rando::Location* x = Rando::StaticData::GetLocation(i); Rando::Location* y = Rando::StaticData::GetLocation(j); - bool iCollected = iShow.status == RCSHOW_COLLECTED || iShow.status == RCSHOW_SAVED; - bool iSaved = iShow.status == RCSHOW_SAVED; - bool jCollected = jShow.status == RCSHOW_COLLECTED || jShow.status == RCSHOW_SAVED; - bool jSaved = jShow.status == RCSHOW_SAVED; + auto itemI = OTRGlobals::Instance->gRandoContext->GetItemLocation(i); + auto itemJ = OTRGlobals::Instance->gRandoContext->GetItemLocation(j); + bool iCollected = itemI->HasObtained(); + bool iSaved = itemI->GetCheckStatus() == RCSHOW_SAVED; + bool jCollected = itemJ->HasObtained(); + bool jSaved = itemJ->GetCheckStatus() == RCSHOW_SAVED; if (!iCollected && jCollected) { return true; @@ -1414,9 +1353,9 @@ bool CompareChecks(RandomizerCheck i, RandomizerCheck j) { return false; } - if (!iShow.skipped && jShow.skipped) { + if (!itemI->GetIsSkipped() && itemJ->GetIsSkipped()) { return true; - } else if (iShow.skipped && !jShow.skipped) { + } else if (itemI->GetIsSkipped() && !itemJ->GetIsSkipped()) { return false; } @@ -1446,14 +1385,8 @@ void DrawLocation(RandomizerCheck rc) { bool showHidden = CVarGetInteger(CVAR_TRACKER_CHECK("ShowHidden"), 0); Rando::Location* loc = Rando::StaticData::GetLocation(rc); Rando::ItemLocation* itemLoc = OTRGlobals::Instance->gRandoContext->GetItemLocation(rc); - RandomizerCheckTrackerData checkData = gSaveContext.checkTrackerData[rc]; - RandomizerCheckStatus status = checkData.status; - - if (itemLoc->HasObtained()) { - status = RCSHOW_COLLECTED; - } - - bool skipped = checkData.skipped; + RandomizerCheckStatus status = itemLoc->GetCheckStatus(); + bool skipped = itemLoc->GetIsSkipped(); if (status == RCSHOW_COLLECTED) { if (!showHidden && CVarGetInteger(CVAR_TRACKER_CHECK("Collected.Hide"), 0)) { return; @@ -1525,11 +1458,13 @@ void DrawLocation(RandomizerCheck rc) { if (status == RCSHOW_UNCHECKED || status == RCSHOW_SEEN || status == RCSHOW_IDENTIFIED || status == RCSHOW_SCUMMED || skipped) { if (UIWidgets::StateButton(std::to_string(rc).c_str(), skipped ? ICON_FA_PLUS : ICON_FA_TIMES)) { if (skipped) { - gSaveContext.checkTrackerData[rc].skipped = false; + OTRGlobals::Instance->gRandoContext->GetItemLocation(rc)->SetIsSkipped(false); areaChecksGotten[loc->GetArea()]--; + totalChecksGotten--; } else { - gSaveContext.checkTrackerData[rc].skipped = true; + OTRGlobals::Instance->gRandoContext->GetItemLocation(rc)->SetIsSkipped(true); areaChecksGotten[loc->GetArea()]++; + totalChecksGotten++; } UpdateOrdering(loc->GetArea()); UpdateInventoryChecks(); @@ -1550,9 +1485,7 @@ void DrawLocation(RandomizerCheck rc) { bool mystery = CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MysteriousShuffle"), 0) && itemLoc->IsAddedToPool(); - if (checkData.hintItem != 0) { - // TODO hints - } else if (status != RCSHOW_UNCHECKED) { + if (status != RCSHOW_UNCHECKED) { switch (status) { case RCSHOW_SAVED: case RCSHOW_COLLECTED: @@ -1581,8 +1514,8 @@ void DrawLocation(RandomizerCheck rc) { } else if (!mystery) { txt = itemLoc->GetPlacedItem().GetName().GetForLanguage(gSaveContext.language); } - if (!IsVisibleInCheckTracker(rc) && status == RCSHOW_IDENTIFIED && !mystery) { - txt += fmt::format(" - {}", gSaveContext.checkTrackerData[rc].price); + if (IsVisibleInCheckTracker(rc) && status == RCSHOW_IDENTIFIED && !mystery) { + txt += fmt::format(" - {}", OTRGlobals::Instance->gRandoContext->GetItemLocation(rc)->GetPrice()); } } else { if (IsHeartPiece((GetItemID)Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetItemID())) { @@ -1608,8 +1541,7 @@ void DrawLocation(RandomizerCheck rc) { } if (CVarGetInteger("gCheckTrackerOptionShowLogic", 0)) { - std::vector locationsInRegion = areaTable[itemLoc->GetParentRegionKey()].locations; - for (auto& locationInRegion : locationsInRegion) { + for (auto& locationInRegion : areaTable[itemLoc->GetParentRegionKey()].locations) { if (locationInRegion.GetLocation() == rc) { std::string conditionStr = locationInRegion.GetConditionStr(); if (conditionStr != "true") { @@ -1742,12 +1674,12 @@ void CheckTrackerSettingsWindow::DrawElement() { UIWidgets::Tooltip("If enabled, Vanilla/MQ dungeons will show on the tracker immediately. Otherwise, Vanilla/MQ dungeon locations must be unlocked."); if (UIWidgets::EnhancementCheckbox("Hide right-side shop item checks", CVAR_TRACKER_CHECK("HideRightShopChecks"), false, "", UIWidgets::CheckboxGraphics::Cross, true)) { hideShopRightChecks = !hideShopRightChecks; - RecalculateAreaTotals(); + RecalculateAllAreaTotals(); } UIWidgets::Tooltip("If enabled, will prevent the tracker from displaying slots 1-4 in all shops."); if (UIWidgets::EnhancementCheckbox("Always show gold skulltulas", CVAR_TRACKER_CHECK("AlwaysShowGSLocs"), false, "")) { alwaysShowGS = !alwaysShowGS; - RecalculateAreaTotals(); + RecalculateAllAreaTotals(); } UIWidgets::Tooltip("If enabled, will show GS locations in the tracker regardless of tokensanity settings."); UIWidgets::EnhancementCheckbox("Show Logic", "gCheckTrackerOptionShowLogic"); @@ -1796,7 +1728,7 @@ void CheckTrackerWindow::InitElement() { Color_Saved_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Saved.ExtraColor"), Color_Saved_Extra_Default); SaveManager::Instance->AddInitFunction(InitTrackerData); - sectionId = SaveManager::Instance->AddSaveFunction("trackerData", 1, SaveFile, true, -1); + sectionId = SaveManager::Instance->AddSaveFunction("trackerData", 1, SaveFile, true, SECTION_PARENT_NONE); SaveManager::Instance->AddLoadFunction("trackerData", 1, LoadFile); GameInteractor::Instance->RegisterGameHook(CheckTrackerLoadGame); GameInteractor::Instance->RegisterGameHook([](uint32_t fileNum) { @@ -1811,8 +1743,6 @@ void CheckTrackerWindow::InitElement() { hideShopRightChecks = CVarGetInteger(CVAR_TRACKER_CHECK("HideRightShopChecks"), 1); alwaysShowGS = CVarGetInteger(CVAR_TRACKER_CHECK("AlwaysShowGSLocs"), 0); - - //LocationTable_Init(); } } // namespace CheckTracker diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h index 295bb39b09f..3d3330f218f 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h @@ -21,7 +21,6 @@ class CheckTrackerSettingsWindow : public Ship::GuiWindow { class CheckTrackerWindow : public Ship::GuiWindow { public: using GuiWindow::GuiWindow; - void Draw() override; ~CheckTrackerWindow() {}; protected: @@ -44,20 +43,19 @@ class CheckTrackerWindow : public Ship::GuiWindow { //repeat... #define INDEX_TO_16BIT_LITTLE_ENDIAN_BITMASK(idx) (0x8000 >> (7 - (idx % 8) + ((idx % 16) / 8) * 8)) -void DefaultCheckData(RandomizerCheck rc); void Teardown(); void UpdateAllOrdering(); bool IsVisibleInCheckTracker(RandomizerCheck rc); bool IsCheckShuffled(RandomizerCheck rc); void InitTrackerData(bool isDebug); RandomizerCheckArea GetCheckArea(); -void UpdateCheck(uint32_t, RandomizerCheckTrackerData); uint16_t GetTotalChecks(); uint16_t GetTotalChecksGotten(); bool IsAreaSpoiled(RandomizerCheckArea rcArea); void SetAreaSpoiled(RandomizerCheckArea rcArea); +void UpdateInventoryChecks(); +void UpdateAreas(RandomizerCheckArea area); +void UpdateAllOrdering(); +void UpdateAllAreas(); +void RecalculateAllAreaTotals(); } // namespace CheckTracker - - -void to_json(nlohmann::json & j, const RandomizerCheckTrackerData& rctd); -void from_json(const nlohmann::json& j, RandomizerCheckTrackerData& rctd); diff --git a/soh/soh/Enhancements/randomizer/savefile.cpp b/soh/soh/Enhancements/randomizer/savefile.cpp index 8859e8d43cb..bfa2f760607 100644 --- a/soh/soh/Enhancements/randomizer/savefile.cpp +++ b/soh/soh/Enhancements/randomizer/savefile.cpp @@ -97,7 +97,7 @@ void GiveLinksPocketItem() { if (Randomizer_GetSettingValue(RSK_LINKS_POCKET) != RO_LINKS_POCKET_NOTHING) { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LINKS_POCKET, (GetItemID)RG_NONE); StartingItemGive(getItemEntry); - Rando::Context::GetInstance()->GetItemLocation(RC_LINKS_POCKET)->MarkAsObtained(); + Rando::Context::GetInstance()->GetItemLocation(RC_LINKS_POCKET)->SetCheckStatus(RCSHOW_SAVED); // If we re-add the above, we'll get the item on save creation, now it's given on first load Flags_SetRandomizerInf(RAND_INF_LINKS_POCKET); } diff --git a/soh/soh/SaveManager.cpp b/soh/soh/SaveManager.cpp index 4398d25a545..10e3a694b40 100644 --- a/soh/soh/SaveManager.cpp +++ b/soh/soh/SaveManager.cpp @@ -111,6 +111,7 @@ SaveManager::SaveManager() { coreSectionIDsByName["sohStats"] = SECTION_ID_STATS; coreSectionIDsByName["entrances"] = SECTION_ID_ENTRANCES; coreSectionIDsByName["scenes"] = SECTION_ID_SCENES; + coreSectionIDsByName["trackerData"] = SECTION_ID_TRACKER_DATA; AddLoadFunction("base", 1, LoadBaseVersion1); AddLoadFunction("base", 2, LoadBaseVersion2); AddLoadFunction("base", 3, LoadBaseVersion3); @@ -404,13 +405,6 @@ void SaveManager::LoadRandomizerVersion3() { // all ItemLocations is 0 anyway. randoContext->GetItemLocation(i)->SetCustomPrice(price); } - uint16_t obtained = 0; - SaveManager::Instance->LoadData("obtained", obtained, (uint16_t)0); - if (obtained) { - randoContext->GetItemLocation(i)->MarkAsObtained(); - } else { - randoContext->GetItemLocation(i)->MarkAsNotObtained(); - } }); }); @@ -496,7 +490,6 @@ void SaveManager::SaveRandomizer(SaveContext* saveContext, int sectionID, bool f if (randoContext->GetItemLocation(i)->HasCustomPrice()) { SaveManager::Instance->SaveData("price", randoContext->GetItemLocation(i)->GetPrice()); } - SaveManager::Instance->SaveData("obtained", randoContext->GetItemLocation(i)->HasObtained()); }); }); @@ -666,8 +659,8 @@ void SaveManager::Init() { if (std::filesystem::exists(GetFileName(fileNum))) { LoadFile(fileNum); saveBlock = nlohmann::json::object(); + OTRGlobals::Instance->gRandoContext->ClearItemLocations(); } - } } diff --git a/soh/soh/SaveManager.h b/soh/soh/SaveManager.h index 55480b675c4..ac139ed9729 100644 --- a/soh/soh/SaveManager.h +++ b/soh/soh/SaveManager.h @@ -163,6 +163,8 @@ class SaveManager { static void LoadRandomizerVersion1(); static void LoadRandomizerVersion2(); static void LoadRandomizerVersion3(); + static void LoadTrackerData(); + static void SaveTrackerData(SaveContext* saveContext, int sectionID, bool fullSave); static void SaveRandomizer(SaveContext* saveContext, int sectionID, bool fullSave); static void LoadBaseVersion1(); From fab63877f0baaa917f662563e04f4c2c35fef6d5 Mon Sep 17 00:00:00 2001 From: Extloga <141232749+Extloga@users.noreply.github.com> Date: Tue, 17 Sep 2024 20:41:09 +0200 Subject: [PATCH 101/108] Rearrangement of the currencies in randomizer.cpp (#4338) --- .../Enhancements/randomizer/randomizer.cpp | 110 ++++++++++-------- 1 file changed, 59 insertions(+), 51 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 65144484089..01ff89d2d68 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -68,61 +68,69 @@ const std::string Randomizer::NaviRandoMessageTableID = "RandomizerNavi"; const std::string Randomizer::IceTrapRandoMessageTableID = "RandomizerIceTrap"; const std::string Randomizer::randoMiscHintsTableID = "RandomizerMiscHints"; -static const char* englishRupeeNames[171] = { - "[P]", "Bad RNG Rolls", "Bananas", "Beanbean Coins", "Beans", - "Beli", "Bells", "Berries", "Bison Dollars", "Bitcoin", - "Blue Essence", "Bolts", "Bones", "Boondollars", "Bottle Caps", - "Bratwürste", "Bucks", "BugFrags", "Canadian Dollars", "Cards", - "Chaos Orbs", "Clams", "Coal", "Cocoa Beans", "Coins", - "Cookies", "Copper", "Cor", "Cornflakes", "Credits", - "Crimebucks", "Crystal Shards", "Cubits", "Cucumbers", "Dalmations", - "Dampécoin", "Dark Elixir", "Darseks", "Dead Memes", "Diamonds", - "DNA", "Doge", "Dogecoin", "Doll Hairs", "Dollars", - "Dollarydoos", "Dosh", "Doubloons", "Dwarfbucks", "Emeralds", - "Energon", "Eris", "Ether", "Euro", "Experience", - "Extinction Points", "Floopies", "Flurbos", "FPS", "Friends", - "Frog Coins", "Gald", "Gekz", "Gems", "Geo", - "Gil", "Glimmer", "Glitches", "Gold", "Gold Dragons", - "Goober Dollars", "Green Herbs", "Greg Siblings", "Gummybears", "Hell", - "Hyrule Loaches", "Ice Traps", "ISK", "Jiggies", "KF7 Ammo", - "Kinstones", "Kremcoins", "Kroner", "Leaves ", "Lemmings", - "Lien", "Lira", "Lumber", "Lungmen Dollars", "Macca", - "Mana", "Mann Co. Keys", "Meat", "Meat Stacks", "Medaparts", - "Meseta", "Mesetas", "Minerals", "Monopoly Money", "Moons", - "Mora", "Mumbo Tokens", "Munny", "Mushrooms", "Mysteries", - "Neopoints", "Notes", "Nuyen", "Orbs", "Pix", - "Pixels", "Platinum", "Pokédollars", "Pokémon", "Poko", - "Pokos", "Potch", "Pounds", "Power Pellets", "Primogems", - "Réals", "Refined Metal", "Remote Mines", "Retweets", "Rhinu", - "Rings", "Riot Points", "Robux", "Rubies", "Rubles", - "Runite Ore", "Rupees", "Saint Quartz", "Septims", "Shekels", - "Shillings", "Silver", "Simoleons", "Smackaroos", "Social Credit", - "Souls", "Spent Casings", "Spice", "Spondulicks", "Spoons", - "Star Bits", "Star Chips", "Stars", "Stones of Jordan", "Store Credit", - "Strawbs", "Studs", "Super Sea Snails", "Talent", "Teef", - "Telecrystals", "Tiberium", "TokKul", "Toys", "Turnips", - "Upvotes", "V-Bucks", "Vespene Gas", "Watts", "Widgets", - "Woolongs", "World Dollars", "Wumpa Fruit", "Yen", "Zenny", - "Zorkmids" +static const char* englishRupeeNames[175] = { + "[P]", "Bad RNG Rolls", "Bananas", "Beanbean Coins", "Beans", + "Beli", "Bells", "Berries", "Bison Dollars", "Bitcoin", + "Blue Essence", "Bolts", "Bones", "Boondollars", "Bottle Caps", + "Bratwürste", "Bucks", "BugFrags", "Canadian Dollars", "Cards", + "Chaos Orbs", "Clams", "Coal", "Cocoa Beans", "Coins", + "Cookies", "Copper", "Cor", "Cornflakes", "Credits", + "Crimebucks", "Crystal Shards", "Cubits", "Cucumbers", "Dalmations", + "Dampécoin", "Dark Elixir", "Darseks", "Dead Memes", "Diamonds", + "DNA", "Doge", "Dogecoin", "Doll Hairs", "Dollars", + "Dollarydoos", "Dosh", "Doubloons", "Dwarfbucks", "Elexit", + "Emeralds", "Energon", "Eris", "Ether", "Euro", + "Experience", "Extinction Points", "Floopies", "Flurbos", "FPS", + "Friends", "Frog Coins", "Gald", "Gekz", "Gems", + "Geo", "Gil", "Glimmer", "Glitches", "Gold", + "Gold Dragons", "Goober Dollars", "Green Herbs", "Greg Siblings", "Grouses", + "Gummybears", "Hell", "Hyrule Loaches", "Ice Traps", "ISK", + "Jiggies", "KF7 Ammo", "Kinstones", "Kremcoins", "Kroner", + "Leaves", "Lemmings", "Lien", "Lira", "Lumber", + "Lungmen Dollars", "Macca", "Mana", "Mann Co. Keys", "Meat", + "Meat Stacks", "Medaparts", "Meseta", "Mesetas", "Minerals", + "Monopoly Money", "Moons", "Mora", "Mumbo Tokens", "Munny", + "Mushrooms", "Mysteries", "Neopoints", "Notes", "Nuyen", + "Orbs", "Ore", "Pix", "Pixels", "Plastyks", + "Platinum", "Pokédollars", "Pokémon", "Poko", "Pokos", + "Potch", "Pounds", "Power Pellets", "Primogems", "Réals", + "Refined Metal", "Remote Mines", "Retweets", "Rhinu", "Rings", + "Riot Points", "Robux", "Rubies", "Rubles", "Runite Ore", + "Rupees", "Saint Quartz", "Septims", "Shekels", "Shillings", + "Silver", "Simoleons", "Smackaroos", "Social Credit", "Souls", + "Spent Casings", "Spice", "Spondulicks", "Spoons", "Star Bits", + "Star Chips", "Stars", "Stones of Jordan", "Store Credit", "Strawbs", + "Studs", "Super Sea Snails", "Talent", "Teef", "Telecrystals", + "Tiberium", "TokKul", "Toys", "Turnips", "Upvotes", + "V-Bucks", "Vespene Gas", "Watts", "Widgets", "Woolongs", + "World Dollars", "Wumpa Fruit", "Yen", "Zenny", "Zorkmids" }; -static const char* germanRupeeNames[56] = { - "Rubine", "Mäuse", "Kröten", "Münzen", "Euro", "Mark", "Bananen", - "Gummibären", "Bonbons", "Diamanten", "Bratwürste", "Bitcoin", "Dogecoin", "Monde", - "Sterne", "Brause UFOs", "Taler", "Sternis", "Schilling", "Freunde", "Seelen", - "Gil", "Zenny", "Pfandflaschen", "Knochen", "Pilze", "Smaragde", "Kronkorken", - "Pokédollar", "Brötchen", "EXP", "Wagenchips", "Moos", "Knete", "Kohle", - "Kies", "Radieschen", "Diridari", "Steine", "Kartoffeln", "Penunze", "ECU", - "Franken", "Cent", "Pfennig", "Groschen", "Rappen", "Gulden", "Kreuzer", - "Kronen", "Forint", "Heller", "Pfund", "Karolin", "Pesa", "Tael" +static const char* germanRupeeNames[65] = { + "Bananen", "Bitcoin", "Bonbons", "Bratwürste", "Brause UFOs", + "Brötchen", "Cent", "Diamanten", "Diridari", "Dogecoin", + "ECU", "Elexit", "Erz", "Erzbrocken", "Euro", + "EXP", "Forint", "Franken", "Freunde", "Gil", + "Gold", "Groschen", "Gulden", "Gummibären", "Heller", + "Juwelen", "Karolin", "Kartoffeln", "Kies", "Knete", + "Knochen", "Kohle", "Kraniche", "Kreuzer", "Kronen", + "Kronkorken", "Kröten", "Mark", "Mäuse", "Monde", + "Moorhühner", "Moos", "Münzen", "Penunze", "Pesa", + "Pfandflaschen", "Pfennig", "Pfund", "Pilze", "Plastiks", + "Pokédollar", "Radieschen", "Rappen", "Rubine", "Saphire", + "Schilling", "Seelen", "Smaragde", "Steine", "Sterne", + "Sternis", "Tael", "Taler", "Wagenchips", "Zenny" }; -static const char* frenchRupeeNames[36] = { - "Rubis", "Bitcoin", "Bananes", "Euros", "Dollars", "Émeraudes", "Joyaux", "Diamants", - "Balles", "Pokémon", "Pièces", "Lunes", "Étoiles", "Dogecoin", "Anneaux", "Radis", - "Pokédollars", "Zennies", "Pépètes", "Mailles", "Éthers", "Clochettes", "Capsules", "Gils", - "Champignons", "Blés", "Halos", "Munnies", "Orens", "Florens", "Crédits", "Galds", - "Bling", "Orbes", "Baguettes", "Croissants" +static const char* frenchRupeeNames[40] = { + "Anneaux", "Baguettes", "Balles", "Bananes", "Bitcoin", + "Blés", "Bling", "Capsules", "Centimes", "Champignons", + "Clochettes", "Crédits", "Croissants", "Diamants", "Dogecoin", + "Dollars", "Émeraudes", "Éthers", "Étoiles", "Euros", + "Florens", "Francs", "Galds", "Gils", "Grouses", + "Halos", "Joyaux", "Lunes", "Mailles", "Munnies", + "Orbes", "Orens", "Pépètes", "Pièces", "Plastyks", + "Pokédollars", "Pokémon", "Radis", "Rubis", "Zennies" }; Randomizer::Randomizer() { From da6e4cac91cd601537fc0b82c17f6c0fc635b879 Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Tue, 17 Sep 2024 14:30:33 -0500 Subject: [PATCH 102/108] Remove erroneous Entrance_OverrideBlueWarp (#4340) --- .../SkipCutscene/Story/SkipBlueWarp.cpp | 27 ++++++++++--------- .../actors/ovl_Door_Warp1/z_door_warp1.c | 15 ----------- 2 files changed, 14 insertions(+), 28 deletions(-) diff --git a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipBlueWarp.cpp b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipBlueWarp.cpp index ec53c7ed01e..27dc30ae92c 100644 --- a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipBlueWarp.cpp +++ b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipBlueWarp.cpp @@ -19,19 +19,19 @@ extern "C" { */ void SkipBlueWarp_ShouldPlayTransitionCS(GIVanillaBehavior _, bool* should, void* opt) { if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) { - uint8_t isBlueWarp = 0; + uint8_t isBlueWarpCutscene = 0; // Deku Tree Blue warp if (gSaveContext.entranceIndex == ENTR_KOKIRI_FOREST_0 && gSaveContext.cutsceneIndex == 0xFFF1) { gSaveContext.entranceIndex = ENTR_KOKIRI_FOREST_11; - isBlueWarp = 1; + isBlueWarpCutscene = 1; // Dodongo's Cavern Blue warp } else if (gSaveContext.entranceIndex == ENTR_DEATH_MOUNTAIN_TRAIL_0 && gSaveContext.cutsceneIndex == 0xFFF1) { gSaveContext.entranceIndex = ENTR_DEATH_MOUNTAIN_TRAIL_5; - isBlueWarp = 1; + isBlueWarpCutscene = 1; // Jabu Jabu's Blue warp } else if (gSaveContext.entranceIndex == ENTR_ZORAS_FOUNTAIN_0 && gSaveContext.cutsceneIndex == 0xFFF0) { gSaveContext.entranceIndex = ENTR_ZORAS_FOUNTAIN_0; - isBlueWarp = 1; + isBlueWarpCutscene = 1; // Forest Temple Blue warp } else if (gSaveContext.entranceIndex == ENTR_CHAMBER_OF_THE_SAGES_0 && gSaveContext.cutsceneIndex == 0x0 && gSaveContext.chamberCutsceneNum == CHAMBER_CS_FOREST) { // Normally set in the blue warp cutscene @@ -43,14 +43,14 @@ void SkipBlueWarp_ShouldPlayTransitionCS(GIVanillaBehavior _, bool* should, void gSaveContext.entranceIndex = ENTR_KOKIRI_FOREST_12; } - isBlueWarp = 1; + isBlueWarpCutscene = 1; // Fire Temple Blue warp } else if (gSaveContext.entranceIndex == ENTR_KAKARIKO_VILLAGE_0 && gSaveContext.cutsceneIndex == 0xFFF3) { // Normally set in the blue warp cutscene Flags_SetEventChkInf(EVENTCHKINF_DEATH_MOUNTAIN_ERUPTED); gSaveContext.entranceIndex = ENTR_DEATH_MOUNTAIN_CRATER_5; - isBlueWarp = 1; + isBlueWarpCutscene = 1; // Water Temple Blue warp } else if (gSaveContext.entranceIndex == ENTR_CHAMBER_OF_THE_SAGES_0 && gSaveContext.cutsceneIndex == 0x0 && gSaveContext.chamberCutsceneNum == CHAMBER_CS_WATER) { // Normally set in the blue warp cutscene @@ -58,18 +58,18 @@ void SkipBlueWarp_ShouldPlayTransitionCS(GIVanillaBehavior _, bool* should, void Flags_SetEventChkInf(EVENTCHKINF_RAISED_LAKE_HYLIA_WATER); gSaveContext.entranceIndex = ENTR_LAKE_HYLIA_9; - isBlueWarp = 1; + isBlueWarpCutscene = 1; // Spirit Temple Blue warp } else if (gSaveContext.entranceIndex == ENTR_CHAMBER_OF_THE_SAGES_0 && gSaveContext.cutsceneIndex == 0x0 && gSaveContext.chamberCutsceneNum == CHAMBER_CS_SPIRIT) { gSaveContext.entranceIndex = ENTR_DESERT_COLOSSUS_8; - isBlueWarp = 1; + isBlueWarpCutscene = 1; // Shadow Temple Blue warp } else if (gSaveContext.entranceIndex == ENTR_CHAMBER_OF_THE_SAGES_0 && gSaveContext.cutsceneIndex == 0x0 && gSaveContext.chamberCutsceneNum == CHAMBER_CS_SHADOW) { gSaveContext.entranceIndex = ENTR_GRAVEYARD_8; - isBlueWarp = 1; + isBlueWarpCutscene = 1; } - if (isBlueWarp) { + if (isBlueWarpCutscene) { if (gSaveContext.entranceIndex != ENTR_LAKE_HYLIA_9) { // Normally set in the blue warp cutscene gSaveContext.dayTime = gSaveContext.skyboxTime = 0x8000; @@ -77,10 +77,11 @@ void SkipBlueWarp_ShouldPlayTransitionCS(GIVanillaBehavior _, bool* should, void *should = false; gSaveContext.cutsceneIndex = 0; + } - if (IS_RANDO && (RAND_GET_OPTION(RSK_SHUFFLE_DUNGEON_ENTRANCES) != RO_DUNGEON_ENTRANCE_SHUFFLE_OFF || RAND_GET_OPTION(RSK_SHUFFLE_BOSS_ENTRANCES) != RO_BOSS_ROOM_ENTRANCE_SHUFFLE_OFF)) { - Entrance_OverrideBlueWarp(); - } + // This is outside the above condition because we want to handle both first and following visits to the blue warp + if (IS_RANDO && (RAND_GET_OPTION(RSK_SHUFFLE_DUNGEON_ENTRANCES) != RO_DUNGEON_ENTRANCE_SHUFFLE_OFF || RAND_GET_OPTION(RSK_SHUFFLE_BOSS_ENTRANCES) != RO_BOSS_ROOM_ENTRANCE_SHUFFLE_OFF)) { + Entrance_OverrideBlueWarp(); } } } diff --git a/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c b/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c index 00509500fe6..242ac1ddbc8 100644 --- a/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c +++ b/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c @@ -557,11 +557,6 @@ void DoorWarp1_ChildWarpOut(DoorWarp1* this, PlayState* play) { gSaveContext.nextCutsceneIndex = 0; } - if (IS_RANDO && (Randomizer_GetSettingValue(RSK_SHUFFLE_DUNGEON_ENTRANCES) != RO_DUNGEON_ENTRANCE_SHUFFLE_OFF || - Randomizer_GetSettingValue(RSK_SHUFFLE_BOSS_ENTRANCES) != RO_BOSS_ROOM_ENTRANCE_SHUFFLE_OFF)) { - Entrance_OverrideBlueWarp(); - } - osSyncPrintf("\n\n\nおわりおわり"); play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_WHITE_SLOW; @@ -654,11 +649,6 @@ void DoorWarp1_RutoWarpOut(DoorWarp1* this, PlayState* play) { } play->nextEntranceIndex = ENTR_ZORAS_FOUNTAIN_0; - if (IS_RANDO && (Randomizer_GetSettingValue(RSK_SHUFFLE_DUNGEON_ENTRANCES) != RO_DUNGEON_ENTRANCE_SHUFFLE_OFF || - Randomizer_GetSettingValue(RSK_SHUFFLE_BOSS_ENTRANCES) != RO_BOSS_ROOM_ENTRANCE_SHUFFLE_OFF)) { - Entrance_OverrideBlueWarp(); - } - play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_WHITE_SLOW; } @@ -847,11 +837,6 @@ void DoorWarp1_AdultWarpOut(DoorWarp1* this, PlayState* play) { } } - if (IS_RANDO && (Randomizer_GetSettingValue(RSK_SHUFFLE_DUNGEON_ENTRANCES) != RO_DUNGEON_ENTRANCE_SHUFFLE_OFF || - Randomizer_GetSettingValue(RSK_SHUFFLE_BOSS_ENTRANCES) != RO_BOSS_ROOM_ENTRANCE_SHUFFLE_OFF)) { - Entrance_OverrideBlueWarp(); - } - play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_WHITE; gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE_SLOW; From ee02e503fc53ee7f41d15aa8c509a069599c79fd Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Thu, 19 Sep 2024 11:15:31 -0500 Subject: [PATCH 103/108] Fix issues with faster heavy block lift (#4335) --- .../TimeSavers/FasterHeavyBlockLift.cpp | 58 +++++++++++++++++++ .../Enhancements/TimeSavers/TimeSavers.cpp | 1 + soh/soh/Enhancements/TimeSavers/TimeSavers.h | 1 + .../game-interactor/GameInteractor.h | 3 + .../Enhancements/timesaver_hook_handlers.cpp | 4 ++ .../ovl_Bg_Heavy_Block/z_bg_heavy_block.c | 36 +++++------- .../actors/ovl_player_actor/z_player.c | 18 ++---- 7 files changed, 89 insertions(+), 32 deletions(-) create mode 100644 soh/soh/Enhancements/TimeSavers/FasterHeavyBlockLift.cpp diff --git a/soh/soh/Enhancements/TimeSavers/FasterHeavyBlockLift.cpp b/soh/soh/Enhancements/TimeSavers/FasterHeavyBlockLift.cpp new file mode 100644 index 00000000000..ca73877c610 --- /dev/null +++ b/soh/soh/Enhancements/TimeSavers/FasterHeavyBlockLift.cpp @@ -0,0 +1,58 @@ +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/OTRGlobals.h" +#include "spdlog/spdlog.h" + +extern "C" { + #include "z64save.h" + #include "macros.h" + #include "variables.h" + #include "functions.h" + extern PlayState* gPlayState; + extern SaveContext gSaveContext; +} + +/** + * This primarily handles speeding up the heavy block lifts (OGC and in the Fire Trial) but also handles skipping + * the one point cutscene since the two options are so similar in what they do. + */ +void FasterHeavyBlockLift_Register() { + REGISTER_VB_SHOULD(VB_PLAY_ONEPOINT_ACTOR_CS, { + Actor* actor = static_cast(opt); + + if ( + actor->id == ACTOR_BG_HEAVY_BLOCK && + (CVarGetInteger(CVAR_ENHANCEMENT("FasterHeavyBlockLift"), 0) || CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.OnePoint"), IS_RANDO)) + ) { + *should = false; + } + }); + + REGISTER_VB_SHOULD(VB_FREEZE_LINK_FOR_BLOCK_THROW, { + if (CVarGetInteger(CVAR_ENHANCEMENT("FasterHeavyBlockLift"), 0) || CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.OnePoint"), IS_RANDO)) { + *should = false; + } + }); + + REGISTER_VB_SHOULD(VB_PLAY_THROW_ANIMATION, { + Player *player = GET_PLAYER(gPlayState); + Actor* interactRangeActor = player->interactRangeActor; + s32 interactActorId = interactRangeActor->id; + LinkAnimationHeader* anim = static_cast(opt); + + // Same actor is used for small and large silver rocks, use actor params to identify large ones + bool isLargeSilverRock = interactActorId == ACTOR_EN_ISHI && interactRangeActor->params & 1 == 1; + if (CVarGetInteger(CVAR_ENHANCEMENT("FasterHeavyBlockLift"), 0) && (isLargeSilverRock || interactActorId == ACTOR_BG_HEAVY_BLOCK)) { + *should = false; + LinkAnimation_PlayOnceSetSpeed(gPlayState, &player->skelAnime, anim, 5.0f); + } + }); + + REGISTER_VB_SHOULD(VB_MOVE_THROWN_ACTOR, { + if (CVarGetInteger(CVAR_ENHANCEMENT("FasterHeavyBlockLift"), 0)) { + Actor* heldActor = static_cast(opt); + + heldActor->shape.rot.x -= 3510; + } + }); +} diff --git a/soh/soh/Enhancements/TimeSavers/TimeSavers.cpp b/soh/soh/Enhancements/TimeSavers/TimeSavers.cpp index f6d2e362963..68fe71da666 100644 --- a/soh/soh/Enhancements/TimeSavers/TimeSavers.cpp +++ b/soh/soh/Enhancements/TimeSavers/TimeSavers.cpp @@ -11,4 +11,5 @@ void TimeSavers_Register() { SkipIntro_Register(); // SkipMiscInteractions MoveMidoInKokiriForest_Register(); + FasterHeavyBlockLift_Register(); } diff --git a/soh/soh/Enhancements/TimeSavers/TimeSavers.h b/soh/soh/Enhancements/TimeSavers/TimeSavers.h index b3b22135191..d45ed7f1085 100644 --- a/soh/soh/Enhancements/TimeSavers/TimeSavers.h +++ b/soh/soh/Enhancements/TimeSavers/TimeSavers.h @@ -13,5 +13,6 @@ void TimeSavers_Register(); void SkipIntro_Register(); // SkipMiscInteractions void MoveMidoInKokiriForest_Register(); +void FasterHeavyBlockLift_Register(); #endif // TIME_SAVERS_H diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.h b/soh/soh/Enhancements/game-interactor/GameInteractor.h index 108d2f33e81..f6db2e950a2 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor.h @@ -244,6 +244,8 @@ typedef enum { ``` */ VB_DRAW_AMMO_COUNT, + VB_FREEZE_LINK_FOR_BLOCK_THROW, + VB_MOVE_THROWN_ACTOR, /*** Play Cutscenes ***/ @@ -286,6 +288,7 @@ typedef enum { VB_PLAY_RAINBOW_BRIDGE_CS, // Opt: *EnBox VB_PLAY_SLOW_CHEST_CS, + VB_PLAY_THROW_ANIMATION, /*** Give Items ***/ diff --git a/soh/soh/Enhancements/timesaver_hook_handlers.cpp b/soh/soh/Enhancements/timesaver_hook_handlers.cpp index 0cd6ffb09d5..0682f4de13d 100644 --- a/soh/soh/Enhancements/timesaver_hook_handlers.cpp +++ b/soh/soh/Enhancements/timesaver_hook_handlers.cpp @@ -223,6 +223,10 @@ void TimeSaverOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void* if (actor->id == ACTOR_BG_MORI_HINERI) { break; } + // This is handled in the FasterHeavyBlockLift enhancement + if (actor->id == ACTOR_BG_HEAVY_BLOCK) { + break; + } RateLimitedSuccessChime(); *should = false; diff --git a/soh/src/overlays/actors/ovl_Bg_Heavy_Block/z_bg_heavy_block.c b/soh/src/overlays/actors/ovl_Bg_Heavy_Block/z_bg_heavy_block.c index 61d0ccb1bc3..6df97fcfcb0 100644 --- a/soh/src/overlays/actors/ovl_Bg_Heavy_Block/z_bg_heavy_block.c +++ b/soh/src/overlays/actors/ovl_Bg_Heavy_Block/z_bg_heavy_block.c @@ -7,6 +7,7 @@ #include "z_bg_heavy_block.h" #include "objects/object_heavy_object/object_heavy_object.h" #include "vt.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS 0 @@ -320,18 +321,16 @@ void BgHeavyBlock_Wait(BgHeavyBlock* this, PlayState* play) { if (Actor_HasParent(&this->dyna.actor, play)) { this->timer = 0; - if (!CVarGetInteger(CVAR_ENHANCEMENT("FasterHeavyBlockLift"), 0)) { - switch (this->dyna.actor.params & 0xFF) { - case HEAVYBLOCK_BREAKABLE: - OnePointCutscene_Init(play, 4020, 270, &this->dyna.actor, MAIN_CAM); - break; - case HEAVYBLOCK_UNBREAKABLE: - OnePointCutscene_Init(play, 4021, 220, &this->dyna.actor, MAIN_CAM); - break; - case HEAVYBLOCK_UNBREAKABLE_OUTSIDE_CASTLE: - OnePointCutscene_Init(play, 4022, 210, &this->dyna.actor, MAIN_CAM); - break; - } + switch (this->dyna.actor.params & 0xFF) { + case HEAVYBLOCK_BREAKABLE: + OnePointCutscene_Init(play, 4020, 270, &this->dyna.actor, MAIN_CAM); + break; + case HEAVYBLOCK_UNBREAKABLE: + OnePointCutscene_Init(play, 4021, 220, &this->dyna.actor, MAIN_CAM); + break; + case HEAVYBLOCK_UNBREAKABLE_OUTSIDE_CASTLE: + OnePointCutscene_Init(play, 4022, 210, &this->dyna.actor, MAIN_CAM); + break; } quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), 3); @@ -369,7 +368,7 @@ void BgHeavyBlock_LiftedUp(BgHeavyBlock* this, PlayState* play) { this->timer++; - if (!CVarGetInteger(CVAR_ENHANCEMENT("FasterHeavyBlockLift"), 0)) { + if (GameInteractor_Should(VB_FREEZE_LINK_FOR_BLOCK_THROW, true, this)) { Player_SetCsActionWithHaltedActors(play, &player->actor, 8); } @@ -408,13 +407,10 @@ void BgHeavyBlock_Fly(BgHeavyBlock* this, PlayState* play) { Quake_SetQuakeValues(quakeIndex, 14, 2, 100, 0); Quake_SetCountdown(quakeIndex, 30); - // We don't want this arbitrarily long quake with the enhancement enabled - if (!CVarGetInteger(CVAR_ENHANCEMENT("FasterHeavyBlockLift"), 0)) { - quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), 2); - Quake_SetSpeed(quakeIndex, 12000); - Quake_SetQuakeValues(quakeIndex, 5, 0, 0, 0); - Quake_SetCountdown(quakeIndex, 999); - } + quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), 2); + Quake_SetSpeed(quakeIndex, 12000); + Quake_SetQuakeValues(quakeIndex, 5, 0, 0, 0); + Quake_SetCountdown(quakeIndex, 999); SoundSource_PlaySfxAtFixedWorldPos(play, &this->dyna.actor.world.pos, 30, NA_SE_EV_ELECTRIC_EXPLOSION); diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index c5d1a65bd39..24ff3dd1f0c 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -5096,11 +5096,7 @@ void func_8083A0F4(PlayState* play, Player* this) { anim = GET_PLAYER_ANIM(PLAYER_ANIMGROUP_carryB, this->modelAnimType); } - // Same actor is used for small and large silver rocks, use actor params to identify large ones - bool isLargeSilverRock = interactActorId == ACTOR_EN_ISHI && interactRangeActor->params & 1 == 1; - if (CVarGetInteger(CVAR_ENHANCEMENT("FasterHeavyBlockLift"), 0) && (isLargeSilverRock || interactActorId == ACTOR_BG_HEAVY_BLOCK)) { - LinkAnimation_PlayOnceSetSpeed(play, &this->skelAnime, anim, 5.0f); - } else { + if (GameInteractor_Should(VB_PLAY_THROW_ANIMATION, true, anim)) { LinkAnimation_PlayOnce(play, &this->skelAnime, anim); } } @@ -9842,14 +9838,12 @@ void Player_Action_80846120(Player* this, PlayState* play) { if (LinkAnimation_OnFrame(&this->skelAnime, 229.0f)) { Actor* heldActor = this->heldActor; - if (CVarGetInteger(CVAR_ENHANCEMENT("FasterHeavyBlockLift"), 0)) { - // This is the difference in rotation when the animation is sped up 5x - heldActor->shape.rot.x -= 3510; + if (GameInteractor_Should(VB_MOVE_THROWN_ACTOR, true, heldActor)) { + heldActor->speedXZ = Math_SinS(heldActor->shape.rot.x) * 40.0f; + heldActor->velocity.y = Math_CosS(heldActor->shape.rot.x) * 40.0f; + heldActor->gravity = -2.0f; + heldActor->minVelocityY = -30.0f; } - heldActor->speedXZ = Math_SinS(heldActor->shape.rot.x) * 40.0f; - heldActor->velocity.y = Math_CosS(heldActor->shape.rot.x) * 40.0f; - heldActor->gravity = -2.0f; - heldActor->minVelocityY = -30.0f; Player_DetachHeldActor(play, this); return; } From 2434eb82bf81926eaa9dff5ea1014b59626f18e8 Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Thu, 19 Sep 2024 11:16:31 -0500 Subject: [PATCH 104/108] Fix for LACS awarding everywhere (#4348) * Fix for LACS awarding everywhere * Update soh/soh/Enhancements/randomizer/hook_handlers.cpp Co-authored-by: Pepe20129 <72659707+Pepe20129@users.noreply.github.com> --------- Co-authored-by: Pepe20129 <72659707+Pepe20129@users.noreply.github.com> --- soh/soh/Enhancements/randomizer/hook_handlers.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index 518daf6d081..35f9df9f60f 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -637,7 +637,11 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void *should = !Flags_GetRandomizerInf(RAND_INF_DARUNIAS_JOY); break; case VB_BE_ELIGIBLE_FOR_LIGHT_ARROWS: - *should = !Flags_GetEventChkInf(EVENTCHKINF_RETURNED_TO_TEMPLE_OF_TIME_WITH_ALL_MEDALLIONS) && MeetsLACSRequirements(); + *should = + LINK_IS_ADULT && + (gEntranceTable[gSaveContext.entranceIndex].scene == SCENE_TEMPLE_OF_TIME) && + !Flags_GetEventChkInf(EVENTCHKINF_RETURNED_TO_TEMPLE_OF_TIME_WITH_ALL_MEDALLIONS) && + MeetsLACSRequirements(); break; case VB_BE_ELIGIBLE_FOR_NOCTURNE_OF_SHADOW: *should = @@ -1212,6 +1216,7 @@ void RandomizerOnSceneInitHandler(int16_t sceneNum) { updateHook = 0; } + // If we're not in the Temple of Time or we've already learned the Prelude of Light and received LACs, we don't need to do anything if ( sceneNum != SCENE_TEMPLE_OF_TIME || ( @@ -1225,15 +1230,18 @@ void RandomizerOnSceneInitHandler(int16_t sceneNum) { Flags_SetEventChkInf(EVENTCHKINF_LEARNED_PRELUDE_OF_LIGHT); } - if (!Flags_GetEventChkInf(EVENTCHKINF_RETURNED_TO_TEMPLE_OF_TIME_WITH_ALL_MEDALLIONS) && MeetsLACSRequirements()) { + // We're always in rando here, and rando always overrides this should so we can just pass false + if (GameInteractor_Should(VB_BE_ELIGIBLE_FOR_LIGHT_ARROWS, false, NULL)) { Flags_SetEventChkInf(EVENTCHKINF_RETURNED_TO_TEMPLE_OF_TIME_WITH_ALL_MEDALLIONS); } + // If both awards have been given, we can unregister the hook, otherwise it will get unregistered when the player leaves the area if ( Flags_GetEventChkInf(EVENTCHKINF_LEARNED_PRELUDE_OF_LIGHT) && Flags_GetEventChkInf(EVENTCHKINF_RETURNED_TO_TEMPLE_OF_TIME_WITH_ALL_MEDALLIONS) ) { GameInteractor::Instance->UnregisterGameHook(updateHook); + updateHook = 0; } }); } From 74c93b0182779985b2b5f1c24bf5c866ac311df3 Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Thu, 19 Sep 2024 11:17:01 -0500 Subject: [PATCH 105/108] Stop disabling dampe checkbox, as it's no longer forced to on for rando (#4349) --- soh/soh/SohMenuBar.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/soh/soh/SohMenuBar.cpp b/soh/soh/SohMenuBar.cpp index 05f22fb2d7e..35f0b6ae141 100644 --- a/soh/soh/SohMenuBar.cpp +++ b/soh/soh/SohMenuBar.cpp @@ -1094,8 +1094,7 @@ void DrawEnhancementsMenu() { UIWidgets::Tooltip("All regular enemies and mini-bosses move and act twice as fast."); UIWidgets::PaddedEnhancementCheckbox("Always Win Goron Pot", CVAR_ENHANCEMENT("GoronPot"), true, false); UIWidgets::Tooltip("Always get the heart piece/purple rupee from the spinning Goron pot"); - UIWidgets::PaddedEnhancementCheckbox("Always Win Dampe Digging Game", CVAR_ENHANCEMENT("DampeWin"), true, false, SaveManager::Instance->IsRandoFile(), - "This setting is always enabled in randomizer files", UIWidgets::CheckboxGraphics::Checkmark); + UIWidgets::PaddedEnhancementCheckbox("Always Win Dampe Digging Game", CVAR_ENHANCEMENT("DampeWin"), true, false); UIWidgets::Tooltip("Always win the heart piece/purple rupee on the first dig in Dampe's grave digging game, just like in rando\nIn a rando file, this is unconditionally enabled"); UIWidgets::PaddedEnhancementCheckbox("All Dogs are Richard", CVAR_ENHANCEMENT("AllDogsRichard"), true, false); UIWidgets::Tooltip("All dogs can be traded in and will count as Richard."); From 9608f7102f6bf153bb6a9f115d8fe5a8769acfc9 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Thu, 19 Sep 2024 19:40:18 -0400 Subject: [PATCH 106/108] Partially fix some color related stuff --- soh/soh/Enhancements/randomizer/randomizer.cpp | 7 ++++--- soh/soh/Enhancements/randomizer/silver_rupee.cpp | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index a84a43d35ff..a6442d35820 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -2621,9 +2621,10 @@ void CreateGetItemMessages(const std::array* messageEntries) //TODO: AI Translated Text, get translation from native speaker. customMessageManager->CreateMessage( Randomizer::getItemMessageTableID, RG_SILVER_RUPEE_FIRST, - CustomMessage("You got a %cSilver Rupee%w for the %g{{location}}%w! {{count_text}}!", - "Du hast eine %cSilberne Rupie%w für die %g{{location}}%w!{{count_text}}!", - "Vous avez reçu une %cRoupie d'Argent%w pour le %g{{location}}%w!{{count_text}}!", + CustomMessage("You got a #Silver Rupee# for the #{{location}}#! {{count_text}}!", + "Du hast eine #Silberne Rupie# für die #{{location}}#!{{count_text}}!", + "Vous avez reçu une #Roupie d'Argent# pour le #{{location}}#!{{count_text}}!", + {QM_LBLUE, QM_GREEN}, {false, false, false}, TEXTBOX_TYPE_BLUE, TEXTBOX_POS_BOTTOM)); // Special Case for Silver Rupee Pouches // customMessageManager->CreateMessage(Randomizer::getItemMessageTableID, RG_SILVER_RUPEE_POUCH_FIRST, diff --git a/soh/soh/Enhancements/randomizer/silver_rupee.cpp b/soh/soh/Enhancements/randomizer/silver_rupee.cpp index 2273a5a9a5b..c1304833087 100644 --- a/soh/soh/Enhancements/randomizer/silver_rupee.cpp +++ b/soh/soh/Enhancements/randomizer/silver_rupee.cpp @@ -268,7 +268,7 @@ namespace Rando { if (complete) { messageEntry.Replace("{{count_text}}", "That's all of them"); } else { - messageEntry.Replace("{{count_text}}", CustomMessage("You have collected #{{count}}# of them so far", {QM_GREEN})); + messageEntry.Replace("{{count_text}}", CustomMessage("You have collected #{{count}}# of them so far")); messageEntry.Replace("{{count}}", std::to_string(srCount)); } }/* else if (rgid >= RG_SILVER_RUPEE_POUCH_FIRST && rgid <= RG_SILVER_RUPEE_POUCH_LAST) { From 59351bc3a20b5859ed4418107a848b393d998c1e Mon Sep 17 00:00:00 2001 From: Caladius Date: Thu, 19 Sep 2024 22:08:43 -0400 Subject: [PATCH 107/108] Fairy Shuffle --- .../hint_list/hint_list_exclude_dungeon.cpp | 1 + soh/soh/Enhancements/randomizer/location.cpp | 50 ++++++++--------- soh/soh/Enhancements/randomizer/location.h | 54 +++++++++---------- 3 files changed, 53 insertions(+), 52 deletions(-) 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 14a18f23976..daecdd84b5e 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 @@ -675,6 +675,7 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, una #Skulltula en un borde# del Templo del Bosque otorga #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_MQ_GS_WELL] = HintText(CustomMessage("They say that #draining a well# in Forest Temple uncovers a spider with #[[1]]#.", /*german*/ "", + /*spanish*/ "", {QM_RED, QM_GREEN})); hintTextTable[RHT_FOREST_TEMPLE_MQ_GS_WELL] = HintText(CustomMessage("They say that #draining a well# in Forest Temple uncovers a spider with #[[1]]#.", /*german*/ "Man erzählt sich, daß das #Entleeren eines Brunnens# im Waldtempel eine Spinne mit #[[1]]# enthülle.", /*french*/ "Selon moi, une #Skulltula au fond du Puits du Temple de la Forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); diff --git a/soh/soh/Enhancements/randomizer/location.cpp b/soh/soh/Enhancements/randomizer/location.cpp index 0d26311dac5..14561b56e96 100644 --- a/soh/soh/Enhancements/randomizer/location.cpp +++ b/soh/soh/Enhancements/randomizer/location.cpp @@ -99,7 +99,7 @@ RandomizerGet Rando::Location::GetVanillaItem() const { Rando::Location Rando::Location::Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, - uint8_t flag_, std::string&& shortName_, std::string&& spoilerName_, + uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck, SpoilerCollectionCheckGroup collectionCheckGroup, bool isVanillaCompletion_) { @@ -110,7 +110,7 @@ Rando::Location Rando::Location::Base(RandomizerCheck rc, RandomizerCheckQuest q Rando::Location Rando::Location::Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, - uint8_t flag_, std::string&& shortName_, + uint16_t flag_, std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck, SpoilerCollectionCheckGroup collectionCheckGroup, bool isVanillaCompletion_) { @@ -121,7 +121,7 @@ Rando::Location Rando::Location::Base(RandomizerCheck rc, RandomizerCheckQuest q Rando::Location Rando::Location::Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, - int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheckGroup collectionCheckGroup, bool isVanillaCompletion_) { @@ -134,7 +134,7 @@ Rando::Location Rando::Location::Chest(RandomizerCheck rc, RandomizerCheckQuest Rando::Location Rando::Location::Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, - int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + int32_t actorParams_, uint16_t flag_, std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheckGroup collectionCheckGroup, bool isVanillaCompletion_) { @@ -147,7 +147,7 @@ Rando::Location Rando::Location::Chest(RandomizerCheck rc, RandomizerCheckQuest Rando::Location Rando::Location::Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, - int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck, @@ -159,7 +159,7 @@ Rando::Location Rando::Location::Chest(RandomizerCheck rc, RandomizerCheckQuest Rando::Location Rando::Location::Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, - int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + int32_t actorParams_, uint16_t flag_, std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck, @@ -171,7 +171,7 @@ Rando::Location Rando::Location::Chest(RandomizerCheck rc, RandomizerCheckQuest Rando::Location Rando::Location::Collectable( RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, - ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheckGroup collectionCheckGroup, bool isVanillaCompletion_) { return {rc, quest_, checkType_, area_, LocationType::Collectable, actorId_, scene_, actorParams_, flag_, @@ -183,7 +183,7 @@ Rando::Location Rando::Location::Collectable( Rando::Location Rando::Location::Collectable( RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, - ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheckGroup collectionCheckGroup, bool isVanillaCompletion_) { return {rc, quest_, checkType_, area_, LocationType::Collectable, actorId_, scene_, actorParams_, flag_, @@ -195,7 +195,7 @@ Rando::Location Rando::Location::Collectable( Rando::Location Rando::Location::Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, - ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, + ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, std::vector&& categories, const uint8_t collectFlag_, @@ -210,7 +210,7 @@ Rando::Location Rando::Location::Collectable(RandomizerCheck rc, RandomizerCheck Rando::Location Rando::Location::Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, - ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, + ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, std::vector&& categories, const uint8_t collectFlag_, @@ -225,7 +225,7 @@ Rando::Location Rando::Location::Collectable(RandomizerCheck rc, RandomizerCheck Rando::Location Rando::Location::Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, - ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, + ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck, @@ -238,7 +238,7 @@ Rando::Location Rando::Location::Collectable(RandomizerCheck rc, RandomizerCheck Rando::Location Rando::Location::Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, - ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, + ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck, @@ -250,7 +250,7 @@ Rando::Location Rando::Location::Collectable(RandomizerCheck rc, RandomizerCheck } Rando::Location Rando::Location::GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, - uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, const RandomizerHintTextKey hintKey, std::vector&& categories, SpoilerCollectionCheckGroup collectionCheckGroup, bool isVanillaCompletion_) { @@ -262,7 +262,7 @@ Rando::Location Rando::Location::GSToken(RandomizerCheck rc, RandomizerCheckQues } Rando::Location Rando::Location::GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, - uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, const RandomizerHintTextKey hintKey, std::vector&& categories, SpoilerCollectionCheckGroup collectionCheckGroup, bool isVanillaCompletion_) { @@ -274,7 +274,7 @@ Rando::Location Rando::Location::GSToken(RandomizerCheck rc, RandomizerCheckQues } Rando::Location Rando::Location::GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, - uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, const RandomizerHintTextKey hintKey, std::vector&& categories, const uint8_t skullScene_, SpoilerCollectionCheckGroup collectionCheckGroup, bool isVanillaCompletion_) { @@ -286,7 +286,7 @@ Rando::Location Rando::Location::GSToken(RandomizerCheck rc, RandomizerCheckQues } Rando::Location Rando::Location::GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, - uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, const RandomizerHintTextKey hintKey, std::vector&& categories, const uint8_t skullScene_, SpoilerCollectionCheckGroup collectionCheckGroup, bool isVanillaCompletion_) { @@ -299,7 +299,7 @@ Rando::Location Rando::Location::GSToken(RandomizerCheck rc, RandomizerCheckQues Rando::Location Rando::Location::GrottoScrub(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, - ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, + ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck, @@ -312,7 +312,7 @@ Rando::Location Rando::Location::GrottoScrub(RandomizerCheck rc, RandomizerCheck Rando::Location Rando::Location::GrottoScrub(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, - ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, + ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck, @@ -325,7 +325,7 @@ Rando::Location Rando::Location::GrottoScrub(RandomizerCheck rc, RandomizerCheck Rando::Location Rando::Location::Delayed(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, - uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck, @@ -337,7 +337,7 @@ Rando::Location Rando::Location::Delayed(RandomizerCheck rc, RandomizerCheckQues Rando::Location Rando::Location::Delayed(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, - uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck, @@ -349,7 +349,7 @@ Rando::Location Rando::Location::Delayed(RandomizerCheck rc, RandomizerCheckQues Rando::Location Rando::Location::Reward(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, - int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck, @@ -361,7 +361,7 @@ Rando::Location Rando::Location::Reward(RandomizerCheck rc, RandomizerCheckQuest Rando::Location Rando::Location::Reward(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, - int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + int32_t actorParams_, uint16_t flag_, std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck, @@ -375,7 +375,7 @@ Rando::Location Rando::Location::Fairy(RandomizerCheck rc, RandomizerCheckQuest RandomizerCheckArea area_, uint8_t scene_, int32_t actorParams_, RandomizerInf flag_, std::string&& shortName_, const RandomizerHintTextKey hintKey, SpoilerCollectionCheckGroup collectionCheckGroup) { - return {rc, quest_, RCTYPE_FAIRY, area_, LocationType::Base, ACTOR_EN_ELF, scene_, actorParams_, flag_, + return {rc, quest_, RCTYPE_FAIRY, area_, LocationType::Base, ACTOR_EN_ELF, scene_, actorParams_, (uint16_t)flag_, std::move(shortName_), hintKey, RG_NONE, { Category::cFairy }, false, SpoilerCollectionCheck(SPOILER_CHK_RANDOMIZER_INF, scene_, flag_), collectionCheckGroup}; } @@ -399,7 +399,7 @@ Rando::Location Rando::Location::OtherHint(RandomizerCheck rc, RandomizerCheckQu } Rando::Location Rando::Location::HintStone(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, - uint8_t scene_, int32_t actorParams_, uint8_t flag_, + uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, std::vector&& categories, bool isVanillaCompletion_) { return {rc, quest_, RCTYPE_GOSSIP_STONE, area_, LocationType::Base, ACTOR_EN_GS, scene_, actorParams_, flag_, @@ -408,7 +408,7 @@ Rando::Location Rando::Location::HintStone(RandomizerCheck rc, RandomizerCheckQu } Rando::Location Rando::Location::HintStone(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, - uint8_t scene_, int32_t actorParams_, uint8_t flag_, + uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::vector&& categories, bool isVanillaCompletion_) { return {rc, quest_, RCTYPE_GOSSIP_STONE, area_, LocationType::Base, ACTOR_EN_GS, scene_, actorParams_, flag_, diff --git a/soh/soh/Enhancements/randomizer/location.h b/soh/soh/Enhancements/randomizer/location.h index 9fdb4f1a82b..e1322867729 100644 --- a/soh/soh/Enhancements/randomizer/location.h +++ b/soh/soh/Enhancements/randomizer/location.h @@ -101,7 +101,7 @@ class Location { collectionCheck(SpoilerCollectionCheck()), collectionCheckGroup(GROUP_NO_GROUP) {} Location(const RandomizerCheck rc_, const RandomizerCheckQuest quest_, const RandomizerCheckType checkType_, const RandomizerCheckArea area_, const LocationType locationType_, const ActorID actorId_, const uint8_t scene_, - const int32_t actorParams_, const uint8_t flag_, std::string shortName_, std::string spoilerName_, + const int32_t actorParams_, const uint16_t flag_, std::string shortName_, std::string spoilerName_, const RandomizerHintTextKey hintKey_, const RandomizerGet vanillaItem_, std::vector categories_, const bool isVanillaCompletion_ = false, const SpoilerCollectionCheck collectionCheck_ = SpoilerCollectionCheck(), const SpoilerCollectionCheckGroup collectionCheckGroup_ = GROUP_NO_GROUP) @@ -113,7 +113,7 @@ class Location { } Location(const RandomizerCheck rc_, const RandomizerCheckQuest quest_, const RandomizerCheckType checkType_, const RandomizerCheckArea area_, const LocationType locationType_, const ActorID actorId_, const uint8_t scene_, - const int32_t actorParams_, const uint8_t flag_, std::string shortName_, + const int32_t actorParams_, const uint16_t flag_, std::string shortName_, const RandomizerHintTextKey hintKey_, const RandomizerGet vanillaItem_, std::vector categories_, const bool isVanillaCompletion_ = false, const SpoilerCollectionCheck collectionCheck_ = SpoilerCollectionCheck(), const SpoilerCollectionCheckGroup collectionCheckGroup_ = GROUP_NO_GROUP) @@ -156,7 +156,7 @@ class Location { static Location Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, - uint8_t flag_, std::string&& shortName_, std::string&& spoilerName_, + uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), @@ -165,7 +165,7 @@ class Location { static Location Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, - uint8_t flag_, std::string&& shortName_, + uint16_t flag_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), @@ -174,7 +174,7 @@ class Location { static Location Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, - ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheckGroup collectionCheckGroup = GROUP_NO_GROUP, @@ -182,7 +182,7 @@ class Location { static Location Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, - ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheckGroup collectionCheckGroup = GROUP_NO_GROUP, @@ -190,7 +190,7 @@ class Location { static Location Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, - ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup = GROUP_NO_GROUP, @@ -198,7 +198,7 @@ class Location { static Location Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, - ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup = GROUP_NO_GROUP, @@ -206,7 +206,7 @@ class Location { static Location Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, - RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, + RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheckGroup collectionCheckGroup = GROUP_NO_GROUP, @@ -214,7 +214,7 @@ class Location { static Location Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, - RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, + RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheckGroup collectionCheckGroup = GROUP_NO_GROUP, @@ -222,7 +222,7 @@ class Location { static Location Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, - RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, + RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, std::vector&& categories, uint8_t collectFlag_, SpoilerCollectionCheckGroup collectionCheckGroup = GROUP_NO_GROUP, @@ -230,7 +230,7 @@ class Location { static Location Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, - RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, + RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, std::vector&& categories, uint8_t collectFlag_, SpoilerCollectionCheckGroup collectionCheckGroup = GROUP_NO_GROUP, @@ -238,7 +238,7 @@ class Location { static Location Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, - RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, + RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), @@ -247,7 +247,7 @@ class Location { static Location Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, - RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, + RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), @@ -256,14 +256,14 @@ class Location { static Location GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, - uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, RandomizerHintTextKey hintKey, std::vector&& categories, SpoilerCollectionCheckGroup collectionCheckGroup = GROUP_NO_GROUP, bool isVanillaCompletion_ = true); static Location GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, - uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, RandomizerHintTextKey hintKey, std::vector&& categories, SpoilerCollectionCheckGroup collectionCheckGroup = GROUP_NO_GROUP, bool isVanillaCompletion_ = true); @@ -288,7 +288,7 @@ class Location { /// @return static Location GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, - uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, RandomizerHintTextKey hintKey, std::vector&& categories, uint8_t skullScene_, SpoilerCollectionCheckGroup collectionCheckGroup = GROUP_NO_GROUP, @@ -296,7 +296,7 @@ class Location { static Location GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, - uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, RandomizerHintTextKey hintKey, std::vector&& categories, uint8_t skullScene_, SpoilerCollectionCheckGroup collectionCheckGroup = GROUP_NO_GROUP, @@ -304,7 +304,7 @@ class Location { static Location GrottoScrub(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, - RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, + RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), @@ -313,7 +313,7 @@ class Location { static Location GrottoScrub(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, - RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, + RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), @@ -322,7 +322,7 @@ class Location { static Location Delayed(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, - ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup = GROUP_NO_GROUP, @@ -330,7 +330,7 @@ class Location { static Location Delayed(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, - ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup = GROUP_NO_GROUP, @@ -338,14 +338,14 @@ class Location { static Location Reward(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, - ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup = GROUP_NO_GROUP, bool isVanillaCompletion_ = false); static Location Reward(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, - ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup = GROUP_NO_GROUP, bool isVanillaCompletion_ = false); @@ -363,11 +363,11 @@ class Location { std::string&& shortName_, bool isVanillaCompletion_ = false); static Location HintStone(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, uint8_t scene_, - int32_t actorParams_, uint8_t flag_, std::string&& shortName_, std::string&& spoilerName_, + int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, std::vector&& categories, bool isVanillaCompletion_ = false); static Location HintStone(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, uint8_t scene_, - int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::vector&& categories, bool isVanillaCompletion_ = false); private: @@ -379,7 +379,7 @@ class Location { ActorID actorId; uint8_t scene; int32_t actorParams; - uint8_t flag; + uint16_t flag; bool checked = false; std::string shortName; std::string spoilerName; From e3004ff3428067b19f2b1ce280ebcfa0896ca6c6 Mon Sep 17 00:00:00 2001 From: Caladius Date: Sat, 21 Sep 2024 12:07:27 -0400 Subject: [PATCH 108/108] ganons fix --- .../location_access/locacc_ganons_castle.cpp | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp index e32d86a5bff..d574e8d364a 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp @@ -83,14 +83,12 @@ void AreaTable_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)), - }, {}); - }, { - LocationAccess(RC_FIRE_TRIAL_SILVER_RUPEE_1, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ - LocationAccess(RC_FIRE_TRIAL_SILVER_RUPEE_2, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ - LocationAccess(RC_FIRE_TRIAL_SILVER_RUPEE_3, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ - LocationAccess(RC_FIRE_TRIAL_SILVER_RUPEE_4, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ - LocationAccess(RC_FIRE_TRIAL_SILVER_RUPEE_5, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ - }, {}); + LocationAccess(RC_FIRE_TRIAL_SILVER_RUPEE_1, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_FIRE_TRIAL_SILVER_RUPEE_2, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_FIRE_TRIAL_SILVER_RUPEE_3, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_FIRE_TRIAL_SILVER_RUPEE_4, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + LocationAccess(RC_FIRE_TRIAL_SILVER_RUPEE_5, {[]{return true;}}), /*TODO: Silver Rupee Logic*/ + }, {}); areaTable[RR_GANONS_CASTLE_WATER_TRIAL] = Area("Ganon's Castle Water Trial", "Ganon's Castle", RA_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { //Events