From 92028aa8d835763449cec573c1a11c21704cd60e Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Thu, 19 Oct 2023 19:48:25 -0400 Subject: [PATCH] Rando Definition Deduplication (#3284) * Initial StaticData and RandoItem class definitions * Initial implementation of RandoItem class. * Rerranges RandoItem Constructor parameters The parameters were rearranged for easy copy-paste from the GET_ITEM macro calls later on. * Switches static data from map to static array. Array is all that is needed, since the item list will be contiguous and indexed by the RandomizerGet Enum values. * Defines part of the randomizer item list. * Adds more item class instances to item_list.cpp Up through bottles, many more items still to go. * Adds song items * Adds Maps and Compasses to the item_list * Added Key Items to item_list * Added Key Rings to item_list * Added Dungeon Rewards to item_list * Adds generic items and refills to item_list * Adds shop items, triforce, and hints Also added constructors that put the GET_ITEM_NONE data in for these items, since there is no corresponding GetItemEntry for them. * Adds in the stages of progressive items These are present for GetItemEntry purposes, and aren't really meant to be used in seed generation (unless we find a need for it later on.) * Remove GetItemEntry data from progressive items * Moves/adds function definitions to item/item_list * Refactors GetItemEntry data It's now a pointer to memory instantiated on the heap in the constructor. These are shared pointers so the memory is freed if any of the item instances get deconstructed (which they shouldn't but just in case.) * Adds item class member for if item is progressive * Removes unneeded stuff from initializer list macro * Replaces relevant `uint32_t`s w/ `RandomizerGet`s Also replaces calls to the ItemTable method with StaticData::RetrieveItem * Switches our runtime code to use the new itemList. * Changes just enough hint gen code to compile * Initial Definition of Location Class * Initial Implementation of Location * Fixes some names and definitions. * Extracts ActorID and SceneID enums to separate files. This allows importing them without causing weird conflicts in cpp files when importing the z64scene.h and z64actor.h files directly. Now you can just import z64scene_enum.h and z64actor_enum.h instead. The two old files also import these new files so that existing setups still work as expected. * Replaces the forward definitions with the new imports. * Adds missing data for RandomizerCheckObjects. * Definition and first entry of locationTable * Added Mido's House Locations * Added locations up through lost woods. * Adds in Hyrule Field locations. * Adds Lake Hylia locations * Adds location name comments * Adds Gerudo Valley Locations * Adds Gerudo Fortress locations. * Adds the Wasteland and Collosus locations * Adds Market locations * Adds Hyrule Castle locations. * Adds Kakariko and Graveyard locations. * Adds Death Mountain checks. * Adds Goron City locations * Adds Death Mountain Crater locations * Adds Zora's River locations * Added Zora's Domain Locations. * Added Zora's Fountain locations * Adds Lon Lon Ranch locations. * Adds Deku Tree locations * Adds Dodongo's Cavern Locations. * Adds Jabu Jabu's Belly Locations * Adds Forest Temple Locations * Adds Fire Temple Locations * Adds Water Temple Locations * Added Spirit Temple Locations * Some of shadow temple locations. * Adds remaining Shadow Temple locations * Fixes a leftover merge conflict * Adds Bottom of the Well locations. * Adds Ice Cavern locations * Adds GTG locations. * Adds Ganon's Castle and Tower locations * Adds dungeon Gold Skulltula locations. * Adds Overworld Gold Skulltula locations * Adds dungeon reward locations * Adds Heart Container Locations * Adds Cutscene and Song locations * Adds Cow locations * Adds Shop locations. * Adds hint locations * Adds function for retrieving the Location data. * Initial definition of ItemLocation structure for tracking runtime data * First push on converting code to use new location definitions * Changes hints to use the new tables * Further conversion of hints to new definitions. * Adds new Hint and Location IDs to area tables * Moves areaTable to use new RandomizerRegion keys * Removal of 3drando/item_location files. * Uses new RandomizerRegion keys in entrance.cpp * Final push for removal of massive keys.hpp enum * Uses new SceneID Enum Values * Remove RandomizerCheckObject structs in favor of new location list. * Fix a few stragglers to successfully build * Rename of RandoItem to just Item, but in the Rando namespace * Adds static hints (Light Arrows, Altar text, etc) to the new Hint table. * More hint related fixes/edits * small fix for #include path * Fix various miscellaneous issues related to seed gen and spoiler parsing. * Handle progressive items correctly. * Fixes some hint generation logic * Fix a few GetItemEntry niche bugs. * Adds missing shop GI Entries * Formatting fixes * small formatting fix * Namespace StaticData under Rando * Added a note about a potential use-after-free. I confirmed the actual pointer in question isn't currently being used, but I added the note as a reminder to fix it later and/or as a warning to anyone who changes how the return value is used. * Fixes missing location table entries * Fixes LUS submodule and removes now-unused code * Resolves weird duplicate definition issue * Fix missing include It was missed because not being included wasn't an issue on Windows. * Fixes error present on Linux builds * Fixes some issues with excluding locations * Updates the Resolve Exclusion conflicts function not sure if actually used, will look into that more later * Removes some duplicate RGs * More fixes of duplicate RG values. * Fix a few duplication issues in the check tracker. * Fix progressive bombchus. * Minor typo fix, shouldn't really be affecting anything though * Should fix some of the remaining check tracker issues. * oops wrong boolean operator * Fix skulltulas in the check tracker. * oops, missing comma * re-formatting of HintStone locations * Fixes issue when picking up second Progressive Bullet Bag * Hide bombchu bowling bombchus * Fixes missed skullScene in location_list * Reformats shop items * Re-formats cow checks * reformat song locations * reformat "cutscene" checks * reformat heart container locaitons * reformat Boss/Dungeon reward checks * Hide Triforce Completed if not playing Triforce Hunt * Fixes incorrect chest param * reformat GS Tokens locations and cuts down on duplicate data * reformat Ganons Castle checks * reformat GTG check locations * Prevents Gift from Raoru from appearing in the check tracker * more reformatting (botw, ice cavern, shadow temple) * Should fix a couple more check tracker checks * reformat spirit temple checks * reformat water and fire temple checks * fix RC_ZR_GS_ABOVE_BRIDGE flag typo * reformat Forest Temple checks * Fix RC_LW_TRADE_ODD_POTION in check tracker * reformat child dungeon locations * reformat overworld locations * reformat item entries --- soh/include/z64actor.h | 17 +- soh/include/z64actor_enum.h | 19 + soh/include/z64scene.h | 2 + soh/include/z64scene_enum.h | 17 + .../custom-message/CustomMessageTypes.h | 2 +- .../Enhancements/item-tables/ItemTableTypes.h | 10 +- .../randomizer/3drando/dungeon.cpp | 1213 ++++++----- .../randomizer/3drando/dungeon.hpp | 49 +- .../randomizer/3drando/entrance.cpp | 652 +++--- .../randomizer/3drando/entrance.hpp | 29 +- .../Enhancements/randomizer/3drando/fill.cpp | 526 ++--- .../Enhancements/randomizer/3drando/fill.hpp | 4 +- .../randomizer/3drando/hint_list.cpp | 945 ++++----- .../randomizer/3drando/hint_list.hpp | 5 +- .../hint_list/hint_list_exclude_dungeon.cpp | 728 +++---- .../hint_list/hint_list_exclude_overworld.cpp | 470 ++--- .../3drando/hint_list/hint_list_item.cpp | 324 +-- .../Enhancements/randomizer/3drando/hints.cpp | 513 +++-- .../Enhancements/randomizer/3drando/hints.hpp | 6 +- .../Enhancements/randomizer/3drando/item.cpp | 86 - .../Enhancements/randomizer/3drando/item.hpp | 156 -- .../randomizer/3drando/item_list.cpp | 311 --- .../randomizer/3drando/item_list.hpp | 10 - .../randomizer/3drando/item_location.cpp | 1658 --------------- .../randomizer/3drando/item_location.hpp | 529 ----- .../randomizer/3drando/item_pool.cpp | 1243 +++++------ .../randomizer/3drando/item_pool.hpp | 11 +- .../Enhancements/randomizer/3drando/keys.hpp | 1831 ---------------- .../randomizer/3drando/location_access.cpp | 174 +- .../randomizer/3drando/location_access.hpp | 37 +- .../locacc_bottom_of_the_well.cpp | 72 +- .../location_access/locacc_castle_town.cpp | 266 +-- .../location_access/locacc_death_mountain.cpp | 264 +-- .../location_access/locacc_deku_tree.cpp | 244 +-- .../locacc_dodongos_cavern.cpp | 276 +-- .../location_access/locacc_fire_temple.cpp | 398 ++-- .../location_access/locacc_forest_temple.cpp | 388 ++-- .../location_access/locacc_ganons_castle.cpp | 194 +- .../locacc_gerudo_training_grounds.cpp | 174 +- .../location_access/locacc_gerudo_valley.cpp | 188 +- .../location_access/locacc_hyrule_field.cpp | 228 +- .../location_access/locacc_ice_cavern.cpp | 66 +- .../locacc_jabujabus_belly.cpp | 212 +- .../location_access/locacc_kakariko.cpp | 318 +-- .../location_access/locacc_lost_woods.cpp | 246 +-- .../location_access/locacc_shadow_temple.cpp | 190 +- .../location_access/locacc_spirit_temple.cpp | 276 +-- .../location_access/locacc_water_temple.cpp | 282 +-- .../location_access/locacc_zoras_domain.cpp | 168 +- .../Enhancements/randomizer/3drando/logic.cpp | 192 +- .../Enhancements/randomizer/3drando/logic.hpp | 8 +- .../Enhancements/randomizer/3drando/menu.hpp | 20 +- .../randomizer/3drando/playthrough.cpp | 13 +- .../randomizer/3drando/playthrough.hpp | 2 +- .../randomizer/3drando/rando_main.cpp | 14 +- .../randomizer/3drando/rando_main.hpp | 5 +- .../randomizer/3drando/settings.cpp | 386 ++-- .../randomizer/3drando/settings.hpp | 2 +- .../Enhancements/randomizer/3drando/shops.cpp | 145 +- .../Enhancements/randomizer/3drando/shops.hpp | 7 +- .../randomizer/3drando/spoiler_log.cpp | 210 +- .../randomizer/3drando/spoiler_log.hpp | 2 +- .../randomizer/3drando/starting_inventory.cpp | 178 +- .../randomizer/3drando/starting_inventory.hpp | 4 +- soh/soh/Enhancements/randomizer/context.cpp | 188 ++ soh/soh/Enhancements/randomizer/context.h | 56 + soh/soh/Enhancements/randomizer/draw.cpp | 2 +- soh/soh/Enhancements/randomizer/draw.h | 2 +- soh/soh/Enhancements/randomizer/hint.cpp | 43 + soh/soh/Enhancements/randomizer/hint.h | 30 + soh/soh/Enhancements/randomizer/item.cpp | 379 ++++ soh/soh/Enhancements/randomizer/item.h | 88 + soh/soh/Enhancements/randomizer/item_list.cpp | 295 +++ .../Enhancements/randomizer/item_location.cpp | 189 ++ .../Enhancements/randomizer/item_location.h | 105 + soh/soh/Enhancements/randomizer/location.cpp | 252 +++ soh/soh/Enhancements/randomizer/location.h | 285 +++ .../Enhancements/randomizer/location_list.cpp | 1417 +++++++++++++ .../Enhancements/randomizer/randomizer.cpp | 250 +-- soh/soh/Enhancements/randomizer/randomizer.h | 3 +- .../Enhancements/randomizer/randomizerTypes.h | 1880 ++++++++++++++++- .../randomizer/randomizer_check_objects.cpp | 1073 ++-------- .../randomizer/randomizer_check_objects.h | 28 +- .../randomizer/randomizer_check_tracker.cpp | 275 +-- .../randomizer/randomizer_check_tracker.h | 2 +- soh/soh/Enhancements/randomizer/static_data.h | 37 + soh/soh/OTRGlobals.cpp | 2 + soh/soh/OTRGlobals.h | 2 + 88 files changed, 12038 insertions(+), 12060 deletions(-) create mode 100644 soh/include/z64actor_enum.h create mode 100644 soh/include/z64scene_enum.h delete mode 100644 soh/soh/Enhancements/randomizer/3drando/item.cpp delete mode 100644 soh/soh/Enhancements/randomizer/3drando/item.hpp delete mode 100644 soh/soh/Enhancements/randomizer/3drando/item_list.cpp delete mode 100644 soh/soh/Enhancements/randomizer/3drando/item_list.hpp delete mode 100644 soh/soh/Enhancements/randomizer/3drando/item_location.cpp delete mode 100644 soh/soh/Enhancements/randomizer/3drando/item_location.hpp delete mode 100644 soh/soh/Enhancements/randomizer/3drando/keys.hpp create mode 100644 soh/soh/Enhancements/randomizer/context.cpp create mode 100644 soh/soh/Enhancements/randomizer/context.h create mode 100644 soh/soh/Enhancements/randomizer/hint.cpp create mode 100644 soh/soh/Enhancements/randomizer/hint.h create mode 100644 soh/soh/Enhancements/randomizer/item.cpp create mode 100644 soh/soh/Enhancements/randomizer/item.h create mode 100644 soh/soh/Enhancements/randomizer/item_list.cpp create mode 100644 soh/soh/Enhancements/randomizer/item_location.cpp create mode 100644 soh/soh/Enhancements/randomizer/item_location.h create mode 100644 soh/soh/Enhancements/randomizer/location.cpp create mode 100644 soh/soh/Enhancements/randomizer/location.h create mode 100644 soh/soh/Enhancements/randomizer/location_list.cpp create mode 100644 soh/soh/Enhancements/randomizer/static_data.h diff --git a/soh/include/z64actor.h b/soh/include/z64actor.h index 82c8611d1..7d4e313e7 100644 --- a/soh/include/z64actor.h +++ b/soh/include/z64actor.h @@ -7,6 +7,7 @@ #include "z64collision_check.h" #include "z64bgcheck.h" #include "soh/Enhancements/item-tables/ItemTableTypes.h" +#include "z64actor_enum.h" #define ACTOR_NUMBER_MAX 2000 #define INVISIBLE_ACTOR_MAX 20 @@ -337,22 +338,6 @@ typedef enum { } ActorCategory; //#define DEFINE_ACTOR(_0, enum, _2) enum, -#define DEFINE_ACTOR_INTERNAL(_0, enum, _2) enum, -#define DEFINE_ACTOR_UNSET(enum) enum, -#define DEFINE_ACTOR(_0, enum, _2) DEFINE_ACTOR_INTERNAL(_0, enum, _2) - -#ifdef __cplusplus -enum ActorID : int { -#else -enum ActorID { -#endif - #include "tables/actor_table.h" - /* 0x0192 */ ACTOR_ID_MAX // originally "ACTOR_DLF_MAX" -}; - -#undef DEFINE_ACTOR -#undef DEFINE_ACTOR_INTERNAL -#undef DEFINE_ACTOR_UNSET typedef enum { DOORLOCK_NORMAL, diff --git a/soh/include/z64actor_enum.h b/soh/include/z64actor_enum.h new file mode 100644 index 000000000..1b0a6b986 --- /dev/null +++ b/soh/include/z64actor_enum.h @@ -0,0 +1,19 @@ +#pragma once + +#ifndef Z64ACTOR_ENUM_H +#define Z64ACTOR_ENUM_H + +#define DEFINE_ACTOR_INTERNAL(_0, enum, _2) enum, +#define DEFINE_ACTOR_UNSET(enum) enum, +#define DEFINE_ACTOR(_0, enum, _2) DEFINE_ACTOR_INTERNAL(_0, enum, _2) + +enum ActorID { +#include "tables/actor_table.h" + /* 0x0192 */ ACTOR_ID_MAX // originally "ACTOR_DLF_MAX" +}; + +#undef DEFINE_ACTOR +#undef DEFINE_ACTOR_INTERNAL +#undef DEFINE_ACTOR_UNSET + +#endif \ No newline at end of file diff --git a/soh/include/z64scene.h b/soh/include/z64scene.h index 361e5f3c8..f14af0c4f 100644 --- a/soh/include/z64scene.h +++ b/soh/include/z64scene.h @@ -2,6 +2,8 @@ #define Z64SCENE_H #include "command_macros_base.h" +#include "libultraship/libultra.h" +#include "z64math.h" typedef struct { /* 0x00 */ uintptr_t vromStart; diff --git a/soh/include/z64scene_enum.h b/soh/include/z64scene_enum.h new file mode 100644 index 000000000..068d1c42f --- /dev/null +++ b/soh/include/z64scene_enum.h @@ -0,0 +1,17 @@ +#pragma once + +#ifndef Z64SCENE_ENUM_H +#define Z64SCENE_ENUM_H +#define DEFINE_SCENE(_0, _1, enum, _3, _4, _5) enum, + +#ifdef __cplusplus +enum SceneID : int { +#else +enum SceneID { +#endif +#include "tables/scene_table.h" + /* 0x6E */ SCENE_ID_MAX +}; + +#undef DEFINE_SCENE +#endif \ No newline at end of file diff --git a/soh/soh/Enhancements/custom-message/CustomMessageTypes.h b/soh/soh/Enhancements/custom-message/CustomMessageTypes.h index 4ce0db90a..1f043211e 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageTypes.h +++ b/soh/soh/Enhancements/custom-message/CustomMessageTypes.h @@ -58,7 +58,7 @@ typedef enum { #ifdef __cplusplus typedef struct { - u16 giid; + uint16_t giid; ItemID iid; std::string english; std::string german; diff --git a/soh/soh/Enhancements/item-tables/ItemTableTypes.h b/soh/soh/Enhancements/item-tables/ItemTableTypes.h index f16762db9..d3a1a6cf2 100644 --- a/soh/soh/Enhancements/item-tables/ItemTableTypes.h +++ b/soh/soh/Enhancements/item-tables/ItemTableTypes.h @@ -3,8 +3,8 @@ #include #endif -#define CHEST_ANIM_SHORT 0 -#define CHEST_ANIM_LONG 1 +#define CHEST_ANIM_SHORT (int16_t)0 +#define CHEST_ANIM_LONG (int16_t)1 /** * Flag to indicate which type of Actor has given the player an item. ITEM_FROM_NPC by default, @@ -30,7 +30,7 @@ typedef enum GetItemCategory { } GetItemCategory; #define GET_ITEM(itemId, objectId, drawId, textId, field, chestAnim, itemCategory, modIndex, getItemId) \ - { itemId, field, (chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1), textId, objectId, modIndex, getItemId, drawId, true, ITEM_FROM_NPC, itemCategory, NULL } + { itemId, field, (int16_t)((chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1)), textId, objectId, modIndex, getItemId, drawId, true, ITEM_FROM_NPC, itemCategory, NULL } #define GET_ITEM_NONE \ { ITEM_NONE, 0, 0, 0, 0, 0, 0, 0, false, ITEM_FROM_NPC, ITEM_CATEGORY_JUNK, NULL } @@ -38,7 +38,7 @@ typedef enum GetItemCategory { typedef struct PlayState PlayState; typedef struct GetItemEntry GetItemEntry; -typedef void (*CustomDrawFunc)(PlayState* play, GetItemEntry* getItemEntry); +typedef void (*CustomDrawFunc)(PlayState*, GetItemEntry*); typedef struct GetItemEntry { /* 0x00 */ uint16_t itemId; @@ -55,4 +55,4 @@ typedef struct GetItemEntry { /* 0x10 */ uint16_t drawItemId; // Will be a copy of itemId unless the item is an ice trap. Needed for particles to function on ice traps. /* 0x11 */ uint16_t drawModIndex; // Will be a copy of modIndex unless the item is an ice trap. Needed for particles to function on ice traps. CustomDrawFunc drawFunc; -}; // size = 0x11 +} GetItemEntry; // size = 0x11 diff --git a/soh/soh/Enhancements/randomizer/3drando/dungeon.cpp b/soh/soh/Enhancements/randomizer/3drando/dungeon.cpp index dd7ba681d..511217036 100644 --- a/soh/soh/Enhancements/randomizer/3drando/dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/dungeon.cpp @@ -1,641 +1,682 @@ #include "dungeon.hpp" #include "category.hpp" -#include "item_location.hpp" #include "pool_functions.hpp" -#include "keys.hpp" +#include "../context.h" +#include "../static_data.h" namespace Dungeon { -DungeonInfo::DungeonInfo(std::string name_, uint32_t hintKey_, uint32_t map_, uint32_t compass_, uint32_t smallKey_, - uint32_t keyRing_, uint32_t bossKey_, uint8_t vanillaKeyCount_, 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_), - vanillaKeyCount(vanillaKeyCount_), - mqKeyCount(mqKeyCount_), - vanillaLocations(std::move(vanillaLocations_)), - mqLocations(std::move(mqLocations_)), - sharedLocations(std::move(sharedLocations_)), - bossRoomLocations(std::move(bossRoomLocations_)) {} +DungeonInfo::DungeonInfo(std::string name_, RandomizerHintTextKey hintKey_, RandomizerGet map_, RandomizerGet compass_, + RandomizerGet smallKey_, RandomizerGet keyRing_, RandomizerGet bossKey_, + uint8_t vanillaKeyCount_, 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_), vanillaKeyCount(vanillaKeyCount_), mqKeyCount(mqKeyCount_), + vanillaLocations(std::move(vanillaLocations_)), mqLocations(std::move(mqLocations_)), + sharedLocations(std::move(sharedLocations_)), bossRoomLocations(std::move(bossRoomLocations_)) { +} DungeonInfo::~DungeonInfo() = default; -uint32_t DungeonInfo::GetHintKey() const { - return hintKey; +RandomizerHintTextKey DungeonInfo::GetHintKey() const { + return hintKey; } -uint32_t DungeonInfo::GetSmallKey() const { - return smallKey; +RandomizerGet DungeonInfo::GetSmallKey() const { + return smallKey; } -uint32_t DungeonInfo::GetKeyRing() const { - return keyRing; +RandomizerGet DungeonInfo::GetKeyRing() const { + return keyRing; } -uint32_t DungeonInfo::GetMap() const { - return map; +RandomizerGet DungeonInfo::GetMap() const { + return map; } -uint32_t DungeonInfo::GetCompass() const { - return compass; +RandomizerGet DungeonInfo::GetCompass() const { + return compass; } -uint32_t DungeonInfo::GetBossKey() const { - return bossKey; +RandomizerGet DungeonInfo::GetBossKey() const { + return bossKey; } void DungeonInfo::PlaceVanillaMap() { - if (map == NONE) { - return; - } + if (map == RG_NONE) { + return; + } - auto dungeonLocations = GetDungeonLocations(); - auto mapLocation = FilterFromPool(dungeonLocations, [](const uint32_t loc){ return Location(loc)->IsCategory(Category::cVanillaMap); })[0]; - PlaceItemInLocation(mapLocation, map); + auto dungeonLocations = GetDungeonLocations(); + auto mapLocation = FilterFromPool(dungeonLocations, [](const RandomizerCheck loc) { + return Rando::StaticData::GetLocation(loc)->IsCategory(Category::cVanillaMap); + })[0]; + Rando::Context::GetInstance()->PlaceItemInLocation(mapLocation, map); } void DungeonInfo::PlaceVanillaCompass() { - if (compass == NONE) { - return; - } + if (compass == RG_NONE) { + return; + } - auto dungeonLocations = GetDungeonLocations(); - auto compassLocation = FilterFromPool(dungeonLocations, [](const uint32_t loc){ return Location(loc)->IsCategory(Category::cVanillaCompass); })[0]; - PlaceItemInLocation(compassLocation, compass); + auto dungeonLocations = GetDungeonLocations(); + auto compassLocation = FilterFromPool(dungeonLocations, [](const RandomizerCheck loc) { + return Rando::StaticData::GetLocation(loc)->IsCategory(Category::cVanillaCompass); + })[0]; + Rando::Context::GetInstance()->PlaceItemInLocation(compassLocation, compass); } void DungeonInfo::PlaceVanillaBossKey() { - if (bossKey == NONE || bossKey == GANONS_CASTLE_BOSS_KEY) { - return; - } + if (bossKey == RG_NONE || bossKey == RG_GANONS_CASTLE_BOSS_KEY) { + return; + } - auto dungeonLocations = GetDungeonLocations(); - auto bossKeyLocation = FilterFromPool(dungeonLocations, [](const uint32_t loc){ return Location(loc)->IsCategory(Category::cVanillaBossKey); })[0]; - PlaceItemInLocation(bossKeyLocation, bossKey); + auto dungeonLocations = GetDungeonLocations(); + auto bossKeyLocation = FilterFromPool(dungeonLocations, [](const RandomizerCheck loc) { + return Rando::StaticData::GetLocation(loc)->IsCategory(Category::cVanillaBossKey); + })[0]; + Rando::Context::GetInstance()->PlaceItemInLocation(bossKeyLocation, bossKey); } void DungeonInfo::PlaceVanillaSmallKeys() { - if (smallKey == NONE) { - return; - } + if (smallKey == RG_NONE) { + return; + } - auto dungeonLocations = GetDungeonLocations(); - auto smallKeyLocations = FilterFromPool(dungeonLocations, [](const uint32_t loc){ return Location(loc)->IsCategory(Category::cVanillaSmallKey); }); - for (auto location : smallKeyLocations) { - PlaceItemInLocation(location, smallKey); - } + auto dungeonLocations = GetDungeonLocations(); + auto smallKeyLocations = FilterFromPool(dungeonLocations, [](const RandomizerCheck loc) { + return Rando::StaticData::GetLocation(loc)->IsCategory(Category::cVanillaSmallKey); + }); + for (auto location : smallKeyLocations) { + Rando::Context::GetInstance()->PlaceItemInLocation(location, smallKey); + } } -//Gets the chosen dungeon locations for a playthrough (so either MQ or Vanilla) -std::vector DungeonInfo::GetDungeonLocations() const { - auto locations = masterQuest ? mqLocations : vanillaLocations; - AddElementsToPool(locations, sharedLocations); - AddElementsToPool(locations, bossRoomLocations); - return locations; +// Gets the chosen dungeon locations for a playthrough (so either MQ or Vanilla) +std::vector DungeonInfo::GetDungeonLocations() const { + auto locations = masterQuest ? mqLocations : vanillaLocations; + AddElementsToPool(locations, sharedLocations); + AddElementsToPool(locations, bossRoomLocations); + return locations; } -//Gets all dungeon locations (MQ + Vanilla) -std::vector DungeonInfo::GetEveryLocation() const { - auto locations = vanillaLocations; - AddElementsToPool(locations, mqLocations); - AddElementsToPool(locations, sharedLocations); - AddElementsToPool(locations, bossRoomLocations); - return locations; +// Gets all dungeon locations (MQ + Vanilla) +std::vector DungeonInfo::GetEveryLocation() const { + auto locations = vanillaLocations; + AddElementsToPool(locations, mqLocations); + AddElementsToPool(locations, sharedLocations); + AddElementsToPool(locations, bossRoomLocations); + return locations; } - DungeonInfo DekuTree = DungeonInfo("Deku Tree", DEKU_TREE, DEKU_TREE_MAP, DEKU_TREE_COMPASS, NONE, NONE, NONE, 0, 0, { - //Vanilla Locations - DEKU_TREE_MAP_CHEST, - DEKU_TREE_COMPASS_CHEST, - DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, - DEKU_TREE_BASEMENT_CHEST, - DEKU_TREE_SLINGSHOT_CHEST, - DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, - DEKU_TREE_GS_BASEMENT_BACK_ROOM, - DEKU_TREE_GS_BASEMENT_GATE, - DEKU_TREE_GS_BASEMENT_VINES, - DEKU_TREE_GS_COMPASS_ROOM, - }, { - //MQ Locations - DEKU_TREE_MQ_MAP_CHEST, - DEKU_TREE_MQ_COMPASS_CHEST, - DEKU_TREE_MQ_SLINGSHOT_CHEST, - DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, - DEKU_TREE_MQ_BASEMENT_CHEST, - DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, - DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, - DEKU_TREE_MQ_DEKU_SCRUB, - DEKU_TREE_MQ_GS_LOBBY, - DEKU_TREE_MQ_GS_COMPASS_ROOM, - DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, - DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, - }, - {}, - { - // Boss Room Locations - DEKU_TREE_QUEEN_GOHMA_HEART, - QUEEN_GOHMA, - }); +DungeonInfo DekuTree = + DungeonInfo("Deku Tree", RHT_DEKU_TREE, RG_DEKU_TREE_MAP, RG_DEKU_TREE_COMPASS, RG_NONE, RG_NONE, RG_NONE, 0, 0, + { + // Vanilla Locations + RC_DEKU_TREE_MAP_CHEST, + RC_DEKU_TREE_COMPASS_CHEST, + RC_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, + RC_DEKU_TREE_BASEMENT_CHEST, + RC_DEKU_TREE_SLINGSHOT_CHEST, + RC_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, + RC_DEKU_TREE_GS_BASEMENT_BACK_ROOM, + RC_DEKU_TREE_GS_BASEMENT_GATE, + RC_DEKU_TREE_GS_BASEMENT_VINES, + RC_DEKU_TREE_GS_COMPASS_ROOM, + }, + { + // MQ Locations + RC_DEKU_TREE_MQ_MAP_CHEST, + RC_DEKU_TREE_MQ_COMPASS_CHEST, + RC_DEKU_TREE_MQ_SLINGSHOT_CHEST, + RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, + RC_DEKU_TREE_MQ_BASEMENT_CHEST, + RC_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, + RC_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, + RC_DEKU_TREE_MQ_DEKU_SCRUB, + RC_DEKU_TREE_MQ_GS_LOBBY, + RC_DEKU_TREE_MQ_GS_COMPASS_ROOM, + RC_DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, + RC_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, + }, + {}, + { + // Boss Room Locations + RC_DEKU_TREE_QUEEN_GOHMA_HEART, + RC_QUEEN_GOHMA, + }); - DungeonInfo DodongosCavern = DungeonInfo("Dodongo's Cavern", DODONGOS_CAVERN, DODONGOS_CAVERN_MAP, DODONGOS_CAVERN_COMPASS, NONE, NONE, NONE, 0, 0, { - //Vanilla Locations - DODONGOS_CAVERN_MAP_CHEST, - DODONGOS_CAVERN_COMPASS_CHEST, - DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, - DODONGOS_CAVERN_BOMB_BAG_CHEST, - DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, - DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, - DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, - DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, - DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, - DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS, - DODONGOS_CAVERN_GS_SCARECROW, - DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, - DODONGOS_CAVERN_GS_BACK_ROOM, - DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, - }, { - //MQ Locations - DODONGOS_CAVERN_MQ_MAP_CHEST, - DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST, - DODONGOS_CAVERN_MQ_COMPASS_CHEST, - DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, - DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST, - DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, - DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, - DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, - DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, - DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, - DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, - DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, - DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, - DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, - DODONGOS_CAVERN_MQ_GS_BACK_AREA, - }, - {}, - { - // Boss Room Locations - DODONGOS_CAVERN_BOSS_ROOM_CHEST, - DODONGOS_CAVERN_KING_DODONGO_HEART, - KING_DODONGO, - }); +DungeonInfo DodongosCavern = DungeonInfo("Dodongo's Cavern", RHT_DODONGOS_CAVERN, RG_DODONGOS_CAVERN_MAP, + RG_DODONGOS_CAVERN_COMPASS, RG_NONE, RG_NONE, RG_NONE, 0, 0, + { + // Vanilla Locations + RC_DODONGOS_CAVERN_MAP_CHEST, + RC_DODONGOS_CAVERN_COMPASS_CHEST, + RC_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, + RC_DODONGOS_CAVERN_BOMB_BAG_CHEST, + RC_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, + RC_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, + RC_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, + RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, + RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, + RC_DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS, + RC_DODONGOS_CAVERN_GS_SCARECROW, + RC_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, + RC_DODONGOS_CAVERN_GS_BACK_ROOM, + RC_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, + }, + { + // MQ Locations + RC_DODONGOS_CAVERN_MQ_MAP_CHEST, + RC_DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST, + RC_DODONGOS_CAVERN_MQ_COMPASS_CHEST, + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, + RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST, + RC_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, + RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, + RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, + RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, + RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, + RC_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, + RC_DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, + RC_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, + RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, + RC_DODONGOS_CAVERN_MQ_GS_BACK_AREA, + }, + {}, + { + // Boss Room Locations + RC_DODONGOS_CAVERN_BOSS_ROOM_CHEST, + RC_DODONGOS_CAVERN_KING_DODONGO_HEART, + RC_KING_DODONGO, + }); - DungeonInfo JabuJabusBelly = DungeonInfo("Jabu Jabu's Belly", JABU_JABUS_BELLY, JABU_JABUS_BELLY_MAP, JABU_JABUS_BELLY_COMPASS, NONE, NONE, NONE, 0, 0, { - //Vanilla Locations - JABU_JABUS_BELLY_MAP_CHEST, - JABU_JABUS_BELLY_COMPASS_CHEST, - JABU_JABUS_BELLY_BOOMERANG_CHEST, - JABU_JABUS_BELLY_DEKU_SCRUB, - JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER, - JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER, - JABU_JABUS_BELLY_GS_NEAR_BOSS, - JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM, - }, { - //MQ Locations - JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, - JABU_JABUS_BELLY_MQ_MAP_CHEST, - JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST, - JABU_JABUS_BELLY_MQ_COMPASS_CHEST, - JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST, - JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, - JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, - JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, - JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, - JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, - JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, - JABU_JABUS_BELLY_MQ_COW, - JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, - JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, - JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, - JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, - }, - {}, - { - // Boss Room Locations - JABU_JABUS_BELLY_BARINADE_HEART, - BARINADE, - }); +DungeonInfo JabuJabusBelly = 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, 0, 0, + { + // Vanilla Locations + RC_JABU_JABUS_BELLY_MAP_CHEST, + RC_JABU_JABUS_BELLY_COMPASS_CHEST, + RC_JABU_JABUS_BELLY_BOOMERANG_CHEST, + RC_JABU_JABUS_BELLY_DEKU_SCRUB, + RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER, + RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER, + RC_JABU_JABUS_BELLY_GS_NEAR_BOSS, + RC_JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM, + }, + { + // MQ Locations + RC_JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, + RC_JABU_JABUS_BELLY_MQ_MAP_CHEST, + RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST, + RC_JABU_JABUS_BELLY_MQ_COMPASS_CHEST, + RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST, + RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, + RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, + RC_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, + RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, + RC_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, + RC_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, + RC_JABU_JABUS_BELLY_MQ_COW, + RC_JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, + 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, + }, + {}, + { + // Boss Room Locations + RC_JABU_JABUS_BELLY_BARINADE_HEART, + RC_BARINADE, + }); - DungeonInfo ForestTemple = DungeonInfo("Forest Temple", FOREST_TEMPLE, FOREST_TEMPLE_MAP, FOREST_TEMPLE_COMPASS, FOREST_TEMPLE_SMALL_KEY, FOREST_TEMPLE_KEY_RING, FOREST_TEMPLE_BOSS_KEY, 5, 6, { - //Vanilla Locations - FOREST_TEMPLE_FIRST_ROOM_CHEST, - FOREST_TEMPLE_FIRST_STALFOS_CHEST, - FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, - FOREST_TEMPLE_MAP_CHEST, - FOREST_TEMPLE_WELL_CHEST, - FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST, - FOREST_TEMPLE_EYE_SWITCH_CHEST, - FOREST_TEMPLE_BOSS_KEY_CHEST, - FOREST_TEMPLE_FLOORMASTER_CHEST, - FOREST_TEMPLE_BOW_CHEST, - FOREST_TEMPLE_RED_POE_CHEST, - FOREST_TEMPLE_BLUE_POE_CHEST, - FOREST_TEMPLE_BASEMENT_CHEST, - FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, - FOREST_TEMPLE_GS_FIRST_ROOM, - FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, - FOREST_TEMPLE_GS_LOBBY, - FOREST_TEMPLE_GS_BASEMENT, - }, { - //MQ Locations - FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST, - FOREST_TEMPLE_MQ_WOLFOS_CHEST, - FOREST_TEMPLE_MQ_BOW_CHEST, - FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST, - FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST, - FOREST_TEMPLE_MQ_WELL_CHEST, - FOREST_TEMPLE_MQ_MAP_CHEST, - FOREST_TEMPLE_MQ_COMPASS_CHEST, - FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST, - FOREST_TEMPLE_MQ_BASEMENT_CHEST, - FOREST_TEMPLE_MQ_REDEAD_CHEST, - FOREST_TEMPLE_MQ_BOSS_KEY_CHEST, - FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY, - FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM, - FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, - FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, - FOREST_TEMPLE_MQ_GS_WELL, - }, - {}, - { - // Boss Room Locations - FOREST_TEMPLE_PHANTOM_GANON_HEART, - PHANTOM_GANON, - }); +DungeonInfo ForestTemple = + 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, 5, 6, + { + // Vanilla Locations + RC_FOREST_TEMPLE_FIRST_ROOM_CHEST, + RC_FOREST_TEMPLE_FIRST_STALFOS_CHEST, + RC_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, + RC_FOREST_TEMPLE_MAP_CHEST, + RC_FOREST_TEMPLE_WELL_CHEST, + RC_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST, + RC_FOREST_TEMPLE_EYE_SWITCH_CHEST, + RC_FOREST_TEMPLE_BOSS_KEY_CHEST, + RC_FOREST_TEMPLE_FLOORMASTER_CHEST, + RC_FOREST_TEMPLE_BOW_CHEST, + RC_FOREST_TEMPLE_RED_POE_CHEST, + RC_FOREST_TEMPLE_BLUE_POE_CHEST, + RC_FOREST_TEMPLE_BASEMENT_CHEST, + RC_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, + RC_FOREST_TEMPLE_GS_FIRST_ROOM, + RC_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, + RC_FOREST_TEMPLE_GS_LOBBY, + RC_FOREST_TEMPLE_GS_BASEMENT, + }, + { + // MQ Locations + RC_FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST, + RC_FOREST_TEMPLE_MQ_WOLFOS_CHEST, + RC_FOREST_TEMPLE_MQ_BOW_CHEST, + RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST, + RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST, + RC_FOREST_TEMPLE_MQ_WELL_CHEST, + RC_FOREST_TEMPLE_MQ_MAP_CHEST, + RC_FOREST_TEMPLE_MQ_COMPASS_CHEST, + RC_FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST, + RC_FOREST_TEMPLE_MQ_BASEMENT_CHEST, + RC_FOREST_TEMPLE_MQ_REDEAD_CHEST, + RC_FOREST_TEMPLE_MQ_BOSS_KEY_CHEST, + RC_FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY, + RC_FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM, + RC_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, + RC_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, + RC_FOREST_TEMPLE_MQ_GS_WELL, + }, + {}, + { + // Boss Room Locations + RC_FOREST_TEMPLE_PHANTOM_GANON_HEART, + RC_PHANTOM_GANON, + }); - DungeonInfo FireTemple = DungeonInfo("Fire Temple", FIRE_TEMPLE, FIRE_TEMPLE_MAP, FIRE_TEMPLE_COMPASS, FIRE_TEMPLE_SMALL_KEY, FIRE_TEMPLE_KEY_RING, FIRE_TEMPLE_BOSS_KEY, 8, 5, { - //Vanilla Locations - FIRE_TEMPLE_NEAR_BOSS_CHEST, - FIRE_TEMPLE_FLARE_DANCER_CHEST, - FIRE_TEMPLE_BOSS_KEY_CHEST, - FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, - FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST, - FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST, - FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST, - FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST, - FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST, - FIRE_TEMPLE_SCARECROW_CHEST, - FIRE_TEMPLE_MAP_CHEST, - FIRE_TEMPLE_COMPASS_CHEST, - FIRE_TEMPLE_HIGHEST_GORON_CHEST, - FIRE_TEMPLE_MEGATON_HAMMER_CHEST, - FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM, - FIRE_TEMPLE_GS_BOSS_KEY_LOOP, - FIRE_TEMPLE_GS_BOULDER_MAZE, - FIRE_TEMPLE_GS_SCARECROW_TOP, - FIRE_TEMPLE_GS_SCARECROW_CLIMB, - }, { - //MQ Locations - FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, - FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, - FIRE_TEMPLE_MQ_COMPASS_CHEST, - FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, - FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, - FIRE_TEMPLE_MQ_CHEST_ON_FIRE, - FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, - FIRE_TEMPLE_MQ_MAP_CHEST, - FIRE_TEMPLE_MQ_BOSS_KEY_CHEST, - FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, - FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, - FIRE_TEMPLE_MQ_FREESTANDING_KEY, - FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE, - FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER, - FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, - FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, - FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE, - }, - {}, - { - // Boos Room Locations - FIRE_TEMPLE_VOLVAGIA_HEART, - VOLVAGIA, - }); +DungeonInfo FireTemple = 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, 8, 5, + { + // Vanilla Locations + RC_FIRE_TEMPLE_NEAR_BOSS_CHEST, + RC_FIRE_TEMPLE_FLARE_DANCER_CHEST, + RC_FIRE_TEMPLE_BOSS_KEY_CHEST, + RC_FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, + RC_FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST, + RC_FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST, + RC_FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST, + RC_FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST, + RC_FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST, + RC_FIRE_TEMPLE_SCARECROW_CHEST, + RC_FIRE_TEMPLE_MAP_CHEST, + RC_FIRE_TEMPLE_COMPASS_CHEST, + RC_FIRE_TEMPLE_HIGHEST_GORON_CHEST, + RC_FIRE_TEMPLE_MEGATON_HAMMER_CHEST, + RC_FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM, + RC_FIRE_TEMPLE_GS_BOSS_KEY_LOOP, + RC_FIRE_TEMPLE_GS_BOULDER_MAZE, + RC_FIRE_TEMPLE_GS_SCARECROW_TOP, + RC_FIRE_TEMPLE_GS_SCARECROW_CLIMB, + }, + { + // MQ Locations + RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, + RC_FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, + RC_FIRE_TEMPLE_MQ_COMPASS_CHEST, + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, + RC_FIRE_TEMPLE_MQ_CHEST_ON_FIRE, + RC_FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, + RC_FIRE_TEMPLE_MQ_MAP_CHEST, + RC_FIRE_TEMPLE_MQ_BOSS_KEY_CHEST, + RC_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, + RC_FIRE_TEMPLE_MQ_FREESTANDING_KEY, + RC_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE, + RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER, + 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, + }, + {}, + { + // Boos Room Locations + RC_FIRE_TEMPLE_VOLVAGIA_HEART, + RC_VOLVAGIA, + }); - DungeonInfo WaterTemple = DungeonInfo("Water Temple", WATER_TEMPLE, WATER_TEMPLE_MAP, WATER_TEMPLE_COMPASS, WATER_TEMPLE_SMALL_KEY, WATER_TEMPLE_KEY_RING, WATER_TEMPLE_BOSS_KEY, 6, 2, { - //Vanilla Locations - WATER_TEMPLE_MAP_CHEST, - WATER_TEMPLE_COMPASS_CHEST, - WATER_TEMPLE_TORCHES_CHEST, - WATER_TEMPLE_DRAGON_CHEST, - WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST, - WATER_TEMPLE_CENTRAL_PILLAR_CHEST, - WATER_TEMPLE_CRACKED_WALL_CHEST, - WATER_TEMPLE_BOSS_KEY_CHEST, - WATER_TEMPLE_LONGSHOT_CHEST, - WATER_TEMPLE_RIVER_CHEST, - WATER_TEMPLE_GS_BEHIND_GATE, - WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM, - WATER_TEMPLE_GS_CENTRAL_PILLAR, - WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST, - WATER_TEMPLE_GS_RIVER, - }, { - //MQ Locations - WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, - WATER_TEMPLE_MQ_BOSS_KEY_CHEST, - WATER_TEMPLE_MQ_LONGSHOT_CHEST, - WATER_TEMPLE_MQ_COMPASS_CHEST, - WATER_TEMPLE_MQ_MAP_CHEST, - WATER_TEMPLE_MQ_FREESTANDING_KEY, - WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH, - WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, - WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, - WATER_TEMPLE_MQ_GS_RIVER, - WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, - }, - {}, - { - // Boss Room Locations - WATER_TEMPLE_MORPHA_HEART, - MORPHA, - }); +DungeonInfo WaterTemple = + 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, 6, 2, + { + // Vanilla Locations + RC_WATER_TEMPLE_MAP_CHEST, + RC_WATER_TEMPLE_COMPASS_CHEST, + RC_WATER_TEMPLE_TORCHES_CHEST, + RC_WATER_TEMPLE_DRAGON_CHEST, + RC_WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST, + RC_WATER_TEMPLE_CENTRAL_PILLAR_CHEST, + RC_WATER_TEMPLE_CRACKED_WALL_CHEST, + RC_WATER_TEMPLE_BOSS_KEY_CHEST, + RC_WATER_TEMPLE_LONGSHOT_CHEST, + RC_WATER_TEMPLE_RIVER_CHEST, + RC_WATER_TEMPLE_GS_BEHIND_GATE, + RC_WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM, + RC_WATER_TEMPLE_GS_CENTRAL_PILLAR, + RC_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST, + RC_WATER_TEMPLE_GS_RIVER, + }, + { + // MQ Locations + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, + RC_WATER_TEMPLE_MQ_BOSS_KEY_CHEST, + RC_WATER_TEMPLE_MQ_LONGSHOT_CHEST, + RC_WATER_TEMPLE_MQ_COMPASS_CHEST, + RC_WATER_TEMPLE_MQ_MAP_CHEST, + RC_WATER_TEMPLE_MQ_FREESTANDING_KEY, + RC_WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH, + RC_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, + RC_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, + RC_WATER_TEMPLE_MQ_GS_RIVER, + RC_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, + }, + {}, + { + // Boss Room Locations + RC_WATER_TEMPLE_MORPHA_HEART, + RC_MORPHA, + }); - DungeonInfo SpiritTemple = DungeonInfo("Spirit Temple", SPIRIT_TEMPLE, SPIRIT_TEMPLE_MAP, SPIRIT_TEMPLE_COMPASS, SPIRIT_TEMPLE_SMALL_KEY, SPIRIT_TEMPLE_KEY_RING, SPIRIT_TEMPLE_BOSS_KEY, 5, 7, { - //Vanilla Locations - SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, - SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, - SPIRIT_TEMPLE_COMPASS_CHEST, - SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, - SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, - SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, - SPIRIT_TEMPLE_MAP_CHEST, - SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, - SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, - SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST, - SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST, - SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST, - SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, - SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, - SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, - SPIRIT_TEMPLE_BOSS_KEY_CHEST, - SPIRIT_TEMPLE_TOPMOST_CHEST, - SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM, - SPIRIT_TEMPLE_GS_BOULDER_ROOM, - SPIRIT_TEMPLE_GS_LOBBY, - SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, - SPIRIT_TEMPLE_GS_METAL_FENCE, - }, { - //MQ Locations - SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST, - SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST, - SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST, - SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST, - SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST, - SPIRIT_TEMPLE_MQ_MAP_CHEST, - SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST, - SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST, - SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST, - SPIRIT_TEMPLE_MQ_COMPASS_CHEST, - SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, - SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST, - SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, - SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST, - SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST, - SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST, - SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, - SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST, - SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST, - SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST, - SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM, - SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM, - SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, - SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, - SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM, - }, { - //Shared Locations - SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, - SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, - }, { - // Boss Room Locations - SPIRIT_TEMPLE_TWINROVA_HEART, - TWINROVA, - }); +DungeonInfo SpiritTemple = + 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, 5, 7, + { + // Vanilla Locations + RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, + RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, + RC_SPIRIT_TEMPLE_COMPASS_CHEST, + RC_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, + RC_SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, + RC_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, + RC_SPIRIT_TEMPLE_MAP_CHEST, + RC_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, + RC_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, + RC_SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST, + RC_SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST, + RC_SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST, + RC_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, + RC_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, + RC_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, + RC_SPIRIT_TEMPLE_BOSS_KEY_CHEST, + RC_SPIRIT_TEMPLE_TOPMOST_CHEST, + RC_SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM, + RC_SPIRIT_TEMPLE_GS_BOULDER_ROOM, + RC_SPIRIT_TEMPLE_GS_LOBBY, + RC_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, + RC_SPIRIT_TEMPLE_GS_METAL_FENCE, + }, + { + // MQ Locations + RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST, + RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST, + RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST, + RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST, + RC_SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST, + RC_SPIRIT_TEMPLE_MQ_MAP_CHEST, + RC_SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST, + RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST, + RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST, + RC_SPIRIT_TEMPLE_MQ_COMPASS_CHEST, + RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, + RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST, + RC_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, + RC_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST, + RC_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST, + RC_SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST, + RC_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, + RC_SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST, + RC_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST, + RC_SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST, + RC_SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM, + RC_SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM, + 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, + }, + { + // Shared Locations + RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, + RC_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, + }, + { + // Boss Room Locations + RC_SPIRIT_TEMPLE_TWINROVA_HEART, + RC_TWINROVA, + }); - DungeonInfo ShadowTemple = DungeonInfo("Shadow Temple", SHADOW_TEMPLE, SHADOW_TEMPLE_MAP, SHADOW_TEMPLE_COMPASS, SHADOW_TEMPLE_SMALL_KEY, SHADOW_TEMPLE_KEY_RING, SHADOW_TEMPLE_BOSS_KEY, 5, 6, { - //Vanilla Locations - SHADOW_TEMPLE_MAP_CHEST, - SHADOW_TEMPLE_HOVER_BOOTS_CHEST, - SHADOW_TEMPLE_COMPASS_CHEST, - SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, - SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, - SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, - SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST, - SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST, - SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST, - SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST, - SHADOW_TEMPLE_WIND_HINT_CHEST, - SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, - SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, - SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, - SHADOW_TEMPLE_BOSS_KEY_CHEST, - SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, - SHADOW_TEMPLE_FREESTANDING_KEY, - SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, - SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, - SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, - SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, - SHADOW_TEMPLE_GS_NEAR_SHIP, - }, { - //MQ Locations - SHADOW_TEMPLE_MQ_COMPASS_CHEST, - SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST, - SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, - SHADOW_TEMPLE_MQ_MAP_CHEST, - SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, - SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST, - SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST, - SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST, - SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST, - SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST, - SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST, - SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST, - SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST, - SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST, - SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST, - SHADOW_TEMPLE_MQ_WIND_HINT_CHEST, - SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST, - SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST, - SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, - SHADOW_TEMPLE_MQ_FREESTANDING_KEY, - SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM, - SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, - SHADOW_TEMPLE_MQ_GS_AFTER_WIND, - SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, - SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, - }, - {}, - { - // Boss Room Locations - SHADOW_TEMPLE_BONGO_BONGO_HEART, - BONGO_BONGO, - }); +DungeonInfo ShadowTemple = + 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, 5, 6, + { + // Vanilla Locations + RC_SHADOW_TEMPLE_MAP_CHEST, + RC_SHADOW_TEMPLE_HOVER_BOOTS_CHEST, + RC_SHADOW_TEMPLE_COMPASS_CHEST, + RC_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, + RC_SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, + RC_SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, + RC_SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST, + RC_SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST, + RC_SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST, + RC_SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST, + RC_SHADOW_TEMPLE_WIND_HINT_CHEST, + RC_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, + RC_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, + RC_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, + RC_SHADOW_TEMPLE_BOSS_KEY_CHEST, + RC_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, + RC_SHADOW_TEMPLE_FREESTANDING_KEY, + RC_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, + RC_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, + RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, + RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, + RC_SHADOW_TEMPLE_GS_NEAR_SHIP, + }, + { + // MQ Locations + RC_SHADOW_TEMPLE_MQ_COMPASS_CHEST, + RC_SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST, + RC_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, + RC_SHADOW_TEMPLE_MQ_MAP_CHEST, + RC_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, + RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST, + RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST, + RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST, + RC_SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST, + RC_SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST, + RC_SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST, + RC_SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST, + RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST, + RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST, + RC_SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST, + RC_SHADOW_TEMPLE_MQ_WIND_HINT_CHEST, + RC_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST, + RC_SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST, + RC_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, + RC_SHADOW_TEMPLE_MQ_FREESTANDING_KEY, + RC_SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM, + RC_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, + RC_SHADOW_TEMPLE_MQ_GS_AFTER_WIND, + RC_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, + RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, + }, + {}, + { + // Boss Room Locations + RC_SHADOW_TEMPLE_BONGO_BONGO_HEART, + RC_BONGO_BONGO, + }); - DungeonInfo BottomOfTheWell = DungeonInfo("Bottom of the Well", BOTTOM_OF_THE_WELL, BOTTOM_OF_THE_WELL_MAP, BOTTOM_OF_THE_WELL_COMPASS, BOTTOM_OF_THE_WELL_SMALL_KEY, BOTTOM_OF_THE_WELL_KEY_RING, NONE, 3, 2, { - //Vanilla Locations - BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, - BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST, - BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST, - BOTTOM_OF_THE_WELL_COMPASS_CHEST, - BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST, - BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST, - BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST, - BOTTOM_OF_THE_WELL_INVISIBLE_CHEST, - BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST, - BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST, - BOTTOM_OF_THE_WELL_MAP_CHEST, - BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST, - BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST, - BOTTOM_OF_THE_WELL_FREESTANDING_KEY, - BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, - BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, - BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, - }, { - //MQ Locations - BOTTOM_OF_THE_WELL_MQ_MAP_CHEST, - BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST, - BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, - BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY, - BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY, - BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, - BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, - BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM, - }, {}, {}); +DungeonInfo BottomOfTheWell = + 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, 3, 2, + { + // Vanilla Locations + RC_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, + RC_BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST, + RC_BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST, + RC_BOTTOM_OF_THE_WELL_COMPASS_CHEST, + RC_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST, + RC_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST, + RC_BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST, + RC_BOTTOM_OF_THE_WELL_INVISIBLE_CHEST, + RC_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST, + RC_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST, + RC_BOTTOM_OF_THE_WELL_MAP_CHEST, + RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST, + RC_BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST, + RC_BOTTOM_OF_THE_WELL_FREESTANDING_KEY, + 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, + }, + { + // MQ Locations + RC_BOTTOM_OF_THE_WELL_MQ_MAP_CHEST, + RC_BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST, + RC_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, + RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY, + RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY, + 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, + }, + {}, {}); - DungeonInfo IceCavern = DungeonInfo("Ice Cavern", ICE_CAVERN, ICE_CAVERN_MAP, ICE_CAVERN_COMPASS, NONE, NONE, NONE, 0, 0, { - //Vanilla Locations - ICE_CAVERN_MAP_CHEST, - ICE_CAVERN_COMPASS_CHEST, - ICE_CAVERN_IRON_BOOTS_CHEST, - ICE_CAVERN_FREESTANDING_POH, - ICE_CAVERN_GS_PUSH_BLOCK_ROOM, - ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, - ICE_CAVERN_GS_HEART_PIECE_ROOM, - }, { - //MQ Locations - ICE_CAVERN_MQ_IRON_BOOTS_CHEST, - ICE_CAVERN_MQ_COMPASS_CHEST, - ICE_CAVERN_MQ_MAP_CHEST, - ICE_CAVERN_MQ_FREESTANDING_POH, - ICE_CAVERN_MQ_GS_SCARECROW, - ICE_CAVERN_MQ_GS_ICE_BLOCK, - ICE_CAVERN_MQ_GS_RED_ICE, - }, { - //Shared Locations - SHEIK_IN_ICE_CAVERN, - }, {}); +DungeonInfo IceCavern = + DungeonInfo("Ice Cavern", RHT_ICE_CAVERN, RG_ICE_CAVERN_MAP, RG_ICE_CAVERN_COMPASS, RG_NONE, RG_NONE, RG_NONE, 0, 0, + { + // Vanilla Locations + RC_ICE_CAVERN_MAP_CHEST, + RC_ICE_CAVERN_COMPASS_CHEST, + RC_ICE_CAVERN_IRON_BOOTS_CHEST, + RC_ICE_CAVERN_FREESTANDING_POH, + RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, + RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, + RC_ICE_CAVERN_GS_HEART_PIECE_ROOM, + }, + { + // MQ Locations + RC_ICE_CAVERN_MQ_IRON_BOOTS_CHEST, + RC_ICE_CAVERN_MQ_COMPASS_CHEST, + RC_ICE_CAVERN_MQ_MAP_CHEST, + RC_ICE_CAVERN_MQ_FREESTANDING_POH, + RC_ICE_CAVERN_MQ_GS_SCARECROW, + RC_ICE_CAVERN_MQ_GS_ICE_BLOCK, + RC_ICE_CAVERN_MQ_GS_RED_ICE, + }, + { + // Shared Locations + RC_SHEIK_IN_ICE_CAVERN, + }, + {}); - DungeonInfo GerudoTrainingGrounds = DungeonInfo("Gerudo Training Grounds", GERUDO_TRAINING_GROUNDS, NONE, NONE, GERUDO_TRAINING_GROUNDS_SMALL_KEY, GERUDO_TRAINING_GROUNDS_KEY_RING, NONE, 9, 3, { - //Vanilla Locations - GERUDO_TRAINING_GROUNDS_LOBBY_LEFT_CHEST, - GERUDO_TRAINING_GROUNDS_LOBBY_RIGHT_CHEST, - GERUDO_TRAINING_GROUNDS_STALFOS_CHEST, - GERUDO_TRAINING_GROUNDS_BEAMOS_CHEST, - GERUDO_TRAINING_GROUNDS_HIDDEN_CEILING_CHEST, - GERUDO_TRAINING_GROUNDS_MAZE_PATH_FIRST_CHEST, - GERUDO_TRAINING_GROUNDS_MAZE_PATH_SECOND_CHEST, - GERUDO_TRAINING_GROUNDS_MAZE_PATH_THIRD_CHEST, - GERUDO_TRAINING_GROUNDS_MAZE_PATH_FINAL_CHEST, - GERUDO_TRAINING_GROUNDS_MAZE_RIGHT_CENTRAL_CHEST, - GERUDO_TRAINING_GROUNDS_MAZE_RIGHT_SIDE_CHEST, - GERUDO_TRAINING_GROUNDS_UNDERWATER_SILVER_RUPEE_CHEST, - GERUDO_TRAINING_GROUNDS_HAMMER_ROOM_CLEAR_CHEST, - GERUDO_TRAINING_GROUNDS_HAMMER_ROOM_SWITCH_CHEST, - GERUDO_TRAINING_GROUNDS_EYE_STATUE_CHEST, - GERUDO_TRAINING_GROUNDS_NEAR_SCARECROW_CHEST, - GERUDO_TRAINING_GROUNDS_BEFORE_HEAVY_BLOCK_CHEST, - GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_FIRST_CHEST, - GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_SECOND_CHEST, - GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_THIRD_CHEST, - GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_FOURTH_CHEST, - GERUDO_TRAINING_GROUNDS_FREESTANDING_KEY, - }, { - //MQ Locations - GERUDO_TRAINING_GROUNDS_MQ_LOBBY_RIGHT_CHEST, - GERUDO_TRAINING_GROUNDS_MQ_LOBBY_LEFT_CHEST, - GERUDO_TRAINING_GROUNDS_MQ_FIRST_IRON_KNUCKLE_CHEST, - GERUDO_TRAINING_GROUNDS_MQ_BEFORE_HEAVY_BLOCK_CHEST, - GERUDO_TRAINING_GROUNDS_MQ_EYE_STATUE_CHEST, - GERUDO_TRAINING_GROUNDS_MQ_FLAME_CIRCLE_CHEST, - GERUDO_TRAINING_GROUNDS_MQ_SECOND_IRON_KNUCKLE_CHEST, - GERUDO_TRAINING_GROUNDS_MQ_DINOLFOS_CHEST, - GERUDO_TRAINING_GROUNDS_MQ_ICE_ARROWS_CHEST, - GERUDO_TRAINING_GROUNDS_MQ_MAZE_RIGHT_CENTRAL_CHEST, - GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_FIRST_CHEST, - GERUDO_TRAINING_GROUNDS_MQ_MAZE_RIGHT_SIDE_CHEST, - GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_THIRD_CHEST, - GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_SECOND_CHEST, - GERUDO_TRAINING_GROUNDS_MQ_HIDDEN_CEILING_CHEST, - GERUDO_TRAINING_GROUNDS_MQ_UNDERWATER_SILVER_RUPEE_CHEST, - GERUDO_TRAINING_GROUNDS_MQ_HEAVY_BLOCK_CHEST, - }, {}, {}); +DungeonInfo GerudoTrainingGrounds = + 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, 9, 3, + { + // Vanilla Locations + RC_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST, + RC_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST, + RC_GERUDO_TRAINING_GROUND_STALFOS_CHEST, + RC_GERUDO_TRAINING_GROUND_BEAMOS_CHEST, + RC_GERUDO_TRAINING_GROUND_HIDDEN_CEILING_CHEST, + RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FIRST_CHEST, + 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_GROUND_MAZE_RIGHT_CENTRAL_CHEST, + RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST, + RC_GERUDO_TRAINING_GROUND_UNDERWATER_SILVER_RUPEE_CHEST, + RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST, + RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_SWITCH_CHEST, + RC_GERUDO_TRAINING_GROUND_EYE_STATUE_CHEST, + RC_GERUDO_TRAINING_GROUND_NEAR_SCARECROW_CHEST, + RC_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST, + RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FIRST_CHEST, + RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_SECOND_CHEST, + RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST, + RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST, + RC_GERUDO_TRAINING_GROUND_FREESTANDING_KEY, + }, + { + // MQ Locations + RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_CHEST, + RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_CHEST, + RC_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST, + RC_GERUDO_TRAINING_GROUND_MQ_BEFORE_HEAVY_BLOCK_CHEST, + RC_GERUDO_TRAINING_GROUND_MQ_EYE_STATUE_CHEST, + RC_GERUDO_TRAINING_GROUND_MQ_FLAME_CIRCLE_CHEST, + RC_GERUDO_TRAINING_GROUND_MQ_SECOND_IRON_KNUCKLE_CHEST, + RC_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST, + RC_GERUDO_TRAINING_GROUND_MQ_ICE_ARROWS_CHEST, + RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_CENTRAL_CHEST, + RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_FIRST_CHEST, + RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_SIDE_CHEST, + RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST, + RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_SECOND_CHEST, + 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, + }, + {}, {}); - DungeonInfo GanonsCastle = DungeonInfo("Ganon's Castle", GANONS_CASTLE, NONE, NONE, GANONS_CASTLE_SMALL_KEY, GANONS_CASTLE_KEY_RING, GANONS_CASTLE_BOSS_KEY, 2, 3, { - //Vanilla Locations - GANONS_CASTLE_FOREST_TRIAL_CHEST, - GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST, - GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST, - GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST, - GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST, - GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, - GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, - GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST, - GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST, - GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST, - GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST, - GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST, - GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST, - GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST, - GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST, - GANONS_CASTLE_DEKU_SCRUB_LEFT, - GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, - GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, - GANONS_CASTLE_DEKU_SCRUB_RIGHT, - }, { - //MQ Locations - GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, - GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, - GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST, - GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, - GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST, - GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, - GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST, - GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST, - GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST, - GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST, - GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST, - GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, - GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, - GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, - GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, - GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, - GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, - GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, - }, { - //Shared Locations - GANONS_TOWER_BOSS_KEY_CHEST, - GANON, - }, {}); +DungeonInfo GanonsCastle = + 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, 2, 3, + { + // Vanilla Locations + RC_GANONS_CASTLE_FOREST_TRIAL_CHEST, + 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_GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST, + RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST, + RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST, + RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST, + RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST, + RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST, + RC_GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST, + RC_GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST, + RC_GANONS_CASTLE_DEKU_SCRUB_LEFT, + RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, + RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, + RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT, + }, + { + // MQ Locations + RC_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, + RC_GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, + 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_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, + RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST, + RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST, + RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, + RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, + RC_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, + RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, + RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, + RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, + RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, + }, + { + // Shared Locations + RC_GANONS_TOWER_BOSS_KEY_CHEST, + RC_GANON, + }, + {}); - const DungeonArray dungeonList = { - &DekuTree, - &DodongosCavern, - &JabuJabusBelly, - &ForestTemple, - &FireTemple, - &WaterTemple, - &SpiritTemple, - &ShadowTemple, - &BottomOfTheWell, - &IceCavern, - &GerudoTrainingGrounds, - &GanonsCastle, - }; +const DungeonArray dungeonList = { + &DekuTree, &DodongosCavern, &JabuJabusBelly, &ForestTemple, + &FireTemple, &WaterTemple, &SpiritTemple, &ShadowTemple, + &BottomOfTheWell, &IceCavern, &GerudoTrainingGrounds, &GanonsCastle, +}; -} //namespace Dungeon +} // namespace Dungeon diff --git a/soh/soh/Enhancements/randomizer/3drando/dungeon.hpp b/soh/soh/Enhancements/randomizer/3drando/dungeon.hpp index 91644e128..93f3017d6 100644 --- a/soh/soh/Enhancements/randomizer/3drando/dungeon.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/dungeon.hpp @@ -4,17 +4,18 @@ #include #include -#include "keys.hpp" +#include "../randomizerTypes.h" namespace Dungeon { class DungeonInfo { public: - DungeonInfo(std::string name_, uint32_t hintKey_, uint32_t map_, uint32_t compass_, uint32_t smallKey_, uint32_t keyRing_, uint32_t bossKey_, + DungeonInfo(std::string name_, RandomizerHintTextKey hintKey_, RandomizerGet map_, RandomizerGet compass_, RandomizerGet smallKey_, + RandomizerGet keyRing_, RandomizerGet bossKey_, uint8_t vanillaKeyCount_, uint8_t mqKeyCount_, - std::vector vanillaLocations_, - std::vector mqLocations_, - std::vector sharedLocations_, - std::vector bossRoomLocations_); + std::vector vanillaLocations_, + std::vector mqLocations_, + std::vector sharedLocations_, + std::vector bossRoomLocations_); ~DungeonInfo(); const std::string& GetName() const { @@ -53,12 +54,12 @@ public: return (masterQuest) ? mqKeyCount : vanillaKeyCount; } - uint32_t GetHintKey() const; - uint32_t GetSmallKey() const; - uint32_t GetKeyRing() const; - uint32_t GetMap() const; - uint32_t GetCompass() const; - uint32_t GetBossKey() const; + RandomizerHintTextKey GetHintKey() const; + RandomizerGet GetSmallKey() const; + RandomizerGet GetKeyRing() const; + RandomizerGet GetMap() const; + RandomizerGet GetCompass() const; + RandomizerGet GetBossKey() const; void PlaceVanillaMap(); void PlaceVanillaCompass(); @@ -66,27 +67,27 @@ public: void PlaceVanillaSmallKeys(); // Gets the chosen dungeon locations for a playthrough (so either MQ or Vanilla) - std::vector GetDungeonLocations() const; + std::vector GetDungeonLocations() const; // Gets all dungeon locations (MQ + Vanilla) - std::vector GetEveryLocation() const; + std::vector GetEveryLocation() const; private: std::string name; - uint32_t hintKey; - uint32_t map; - uint32_t compass; - uint32_t smallKey; - uint32_t keyRing; - uint32_t bossKey; + RandomizerHintTextKey hintKey; + RandomizerGet map; + RandomizerGet compass; + RandomizerGet smallKey; + RandomizerGet keyRing; + RandomizerGet bossKey; uint8_t vanillaKeyCount; uint8_t mqKeyCount; bool masterQuest = false; bool hasKeyRing = false; - std::vector vanillaLocations; - std::vector mqLocations; - std::vector sharedLocations; - std::vector bossRoomLocations; + std::vector vanillaLocations; + std::vector mqLocations; + std::vector sharedLocations; + std::vector bossRoomLocations; }; extern DungeonInfo DekuTree; diff --git a/soh/soh/Enhancements/randomizer/3drando/entrance.cpp b/soh/soh/Enhancements/randomizer/3drando/entrance.cpp index bd308596e..ccdf516f9 100644 --- a/soh/soh/Enhancements/randomizer/3drando/entrance.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/entrance.cpp @@ -2,12 +2,12 @@ #include "fill.hpp" #include "settings.hpp" -#include "item_list.hpp" #include "item_pool.hpp" -#include "item_location.hpp" +#include "../context.h" #include "spoiler_log.hpp" #include "hints.hpp" #include "location_access.hpp" +#include "soh/Enhancements/randomizer/static_data.h" #include #include @@ -23,16 +23,16 @@ static int curNumRandomizedEntrances = 0; typedef struct { EntranceType type; - AreaKey parentRegion; - AreaKey connectedRegion; + RandomizerRegion parentRegion; + RandomizerRegion connectedRegion; int16_t index; int16_t blueWarp; } EntranceLinkInfo; -EntranceLinkInfo NO_RETURN_ENTRANCE = {EntranceType::None, NONE, NONE, -1}; +EntranceLinkInfo NO_RETURN_ENTRANCE = {EntranceType::None, RR_NONE, RR_NONE, -1}; typedef struct { - std::list targetRegions; + std::list targetRegions; std::list allowedTypes; } PriorityEntrance; //primary, secondary @@ -87,7 +87,7 @@ void SetAllEntrancesData(std::vector& entranceShuffleTable) { forwardEntrance->SetDecoupled(); } - if (returnEntry.parentRegion != NONE) { + if (returnEntry.parentRegion != RR_NONE) { Entrance* returnEntrance = AreaTable(returnEntry.parentRegion)->GetExit(returnEntry.connectedRegion); returnEntrance->SetIndex(returnEntry.index); returnEntrance->SetBlueWarp(returnEntry.blueWarp); @@ -125,7 +125,7 @@ static std::vector AssumeEntrancePool(std::vector& entranc return assumedPool; } -static std::vector BuildOneWayTargets(std::vector typesToInclude, std::vector> exclude = {}/*, target_region_names*/) { +static std::vector BuildOneWayTargets(std::vector typesToInclude, std::vector> exclude = {}/*, target_region_names*/) { std::vector oneWayEntrances = {}; // Get all entrances of the specified type for (EntranceType poolType : typesToInclude) { @@ -133,7 +133,7 @@ static std::vector BuildOneWayTargets(std::vector types } // Filter out any that are passed in the exclusion list FilterAndEraseFromPool(oneWayEntrances, [&exclude](Entrance* entrance){ - std::pair entranceBeingChecked (entrance->GetParentRegionKey(), entrance->GetConnectedRegionKey()); + std::pair entranceBeingChecked (entrance->GetParentRegionKey(), entrance->GetConnectedRegionKey()); return ElementInContainer(entranceBeingChecked, exclude); }); @@ -152,7 +152,7 @@ static std::vector BuildOneWayTargets(std::vector types //returns restrictive entrances and soft entrances in an array of size 2 (restrictive vector is index 0, soft is index 1) static std::array, 2> SplitEntrancesByRequirements(std::vector& entrancesToSplit, std::vector& assumedEntrances) { //First, disconnect all root assumed entrances and save which regions they were originally connected to, so we can reconnect them later - std::map originalConnectedRegions = {}; + std::map originalConnectedRegions = {}; std::set entrancesToDisconnect = {}; for (Entrance* entrance : assumedEntrances) { entrancesToDisconnect.insert(entrance); @@ -165,7 +165,7 @@ static std::array, 2> SplitEntrancesByRequirements(std::v //soft entrances are ones that can be accessed by both ages (child/adult) at both times of day (day/night) //restrictive entrances are ones that do not meet this criteria for (Entrance* entrance : entrancesToDisconnect) { - if (entrance->GetConnectedRegionKey() != NONE) { + if (entrance->GetConnectedRegionKey() != RR_NONE) { originalConnectedRegions[entrance] = entrance->Disconnect(); } } @@ -175,9 +175,10 @@ static std::array, 2> SplitEntrancesByRequirements(std::v Logic::LogicReset(); // Apply the effects of all advancement items to search for entrance accessibility - std::vector items = FilterFromPool(ItemPool, [](const ItemKey i){ return ItemTable(i).IsAdvancement();}); - for (ItemKey unplacedItem : items) { - ItemTable(unplacedItem).ApplyEffect(); + std::vector items = + FilterFromPool(ItemPool, [](const RandomizerGet i){ return Rando::StaticData::RetrieveItem(i).IsAdvancement();}); + for (RandomizerGet unplacedItem : items) { + Rando::StaticData::RetrieveItem(unplacedItem).ApplyEffect(); } // run a search to see what's accessible GetAccessibleLocations({}); @@ -248,12 +249,12 @@ static void RestoreConnections(Entrance* entrance, Entrance* targetEntrance) { } static void DeleteTargetEntrance(Entrance* targetEntrance) { - if (targetEntrance->GetConnectedRegionKey() != NONE) { + if (targetEntrance->GetConnectedRegionKey() != RR_NONE) { targetEntrance->Disconnect(); } - if (targetEntrance->GetParentRegionKey() != NONE) { + if (targetEntrance->GetParentRegionKey() != RR_NONE) { targetEntrance->GetParentRegion()->RemoveExit(targetEntrance); - targetEntrance->SetParentRegion(NONE); + targetEntrance->SetParentRegion(RR_NONE); } } @@ -282,9 +283,9 @@ static bool EntranceUnreachableAs(Entrance* entrance, uint8_t age, std::vectorGetConnectedRegionKey() == KF_LINKS_HOUSE) { + } else if (type == EntranceType::Spawn && entrance->GetConnectedRegionKey() == RR_KF_LINKS_HOUSE) { return age == AGE_ADULT; - } else if (type == EntranceType::Spawn && entrance->GetConnectedRegionKey() == TEMPLE_OF_TIME) { + } else if (type == EntranceType::Spawn && entrance->GetConnectedRegionKey() == RR_TEMPLE_OF_TIME) { return age == AGE_CHILD; } @@ -377,9 +378,9 @@ static bool ValidateWorld(Entrance* entrancePlaced) { (entrancePlaced == nullptr || type == EntranceType::Interior || type == EntranceType::SpecialInterior)) { //When cows are shuffled, ensure both Impa's House entrances are in the same hint area because the cow is reachable from both sides if (Settings::ShuffleCows) { - auto impasHouseFrontHintRegion = GetHintRegionHintKey(KAK_IMPAS_HOUSE); - auto impasHouseBackHintRegion = GetHintRegionHintKey(KAK_IMPAS_HOUSE_BACK); - if (impasHouseFrontHintRegion != NONE && impasHouseBackHintRegion != NONE && impasHouseBackHintRegion != LINKS_POCKET && impasHouseFrontHintRegion != LINKS_POCKET && impasHouseBackHintRegion != impasHouseFrontHintRegion) { + auto impasHouseFrontHintRegion = GetHintRegionHintKey(RR_KAK_IMPAS_HOUSE); + auto impasHouseBackHintRegion = GetHintRegionHintKey(RR_KAK_IMPAS_HOUSE_BACK); + if (impasHouseFrontHintRegion != RHT_NONE && impasHouseBackHintRegion != RHT_NONE && impasHouseBackHintRegion != RHT_LINKS_POCKET && impasHouseFrontHintRegion != RHT_LINKS_POCKET && impasHouseBackHintRegion != impasHouseFrontHintRegion) { auto message = "Kak Impas House entrances are not in the same hint area\n"; SPDLOG_DEBUG(message); return false; @@ -388,10 +389,10 @@ static bool ValidateWorld(Entrance* entrancePlaced) { } // If all locations aren't reachable, that means that one of the conditions failed when searching - if (!allLocationsReachable) { + if (!Rando::Context::GetInstance()->allLocationsReachable) { if (checkOtherEntranceAccess) { // At least one valid starting region with all basic refills should be reachable without using any items at the beginning of the seed - if (!AreaTable(KOKIRI_FOREST)->HasAccess() && !AreaTable(KAKARIKO_VILLAGE)->HasAccess()) { + if (!AreaTable(RR_KOKIRI_FOREST)->HasAccess() && !AreaTable(RR_KAKARIKO_VILLAGE)->HasAccess()) { SPDLOG_DEBUG("Invalid starting area\n"); return false; } @@ -404,10 +405,10 @@ static bool ValidateWorld(Entrance* entrancePlaced) { // The player should be able to get back to ToT after going through time, without having collected any items // This is important to ensure that the player never loses access to the pedestal after going through time - if (Settings::ResolvedStartingAge == AGE_CHILD && !AreaTable(TEMPLE_OF_TIME)->Adult()) { + if (Settings::ResolvedStartingAge == AGE_CHILD && !AreaTable(RR_TEMPLE_OF_TIME)->Adult()) { SPDLOG_DEBUG("Path to Temple of Time as adult is not guaranteed\n"); return false; - } else if (Settings::ResolvedStartingAge == AGE_ADULT && !AreaTable(TEMPLE_OF_TIME)->Child()) { + } else if (Settings::ResolvedStartingAge == AGE_ADULT && !AreaTable(RR_TEMPLE_OF_TIME)->Child()) { SPDLOG_DEBUG("Path to Temple of Time as child is not guaranteed\n"); return false; } @@ -416,7 +417,7 @@ static bool ValidateWorld(Entrance* entrancePlaced) { // The Big Poe shop should always be accessible as adult without the need to use any bottles // This is important to ensure that players can never lock their only bottles by filling them with Big Poes they can't sell if (checkPoeCollectorAccess) { - if (!AreaTable(MARKET_GUARD_HOUSE)->Adult()) { + if (!AreaTable(RR_MARKET_GUARD_HOUSE)->Adult()) { SPDLOG_DEBUG("Big Poe Shop access is not guarenteed as adult\n"); return false; } @@ -451,7 +452,7 @@ static bool ReplaceEntrance(Entrance* entrance, Entrance* target, std::vectorGetConnectedRegionKey() != NONE) { + if (entrance->GetConnectedRegionKey() != RR_NONE) { RestoreConnections(entrance, target); } } @@ -462,7 +463,7 @@ static bool ReplaceEntrance(Entrance* entrance, Entrance* target, std::vector& allowedRegions, std::list& allowedTypes, std::vector& rollbacks, EntrancePools oneWayEntrancePools, EntrancePools oneWayTargetEntrancePools) { +static bool PlaceOneWayPriorityEntrance(std::string priorityName, std::list& allowedRegions, std::list& allowedTypes, std::vector& rollbacks, EntrancePools oneWayEntrancePools, EntrancePools oneWayTargetEntrancePools) { // Combine the entrances for allowed types in one list. // Shuffle this list. // Pick the first one not already set, not adult spawn, that has a valid target entrance. @@ -482,20 +483,20 @@ static bool PlaceOneWayPriorityEntrance(std::string priorityName, std::listGetParentRegionKey() == ADULT_SPAWN) { + if (entrance->GetParentRegionKey() == RR_ADULT_SPAWN) { if (priorityName != "Nocturne" || Settings::GossipStoneHints.Is(HINTS_MASK_OF_TRUTH)) { continue; } } // If not shuffling dungeons, Nocturne requires adult access if (!Settings::ShuffleDungeonEntrances && priorityName == "Nocturne") { - if (entrance->GetType() != EntranceType::WarpSong && entrance->GetParentRegionKey() != ADULT_SPAWN) { + if (entrance->GetType() != EntranceType::WarpSong && entrance->GetParentRegionKey() != RR_ADULT_SPAWN) { continue; } } for (Entrance* target : oneWayTargetEntrancePools[entrance->GetType()]) { - AreaKey targetRegionKey = target->GetConnectedRegionKey(); - if (targetRegionKey != NONE && ElementInContainer(targetRegionKey, allowedRegions)) { + RandomizerRegion targetRegionKey = target->GetConnectedRegionKey(); + if (targetRegionKey != RR_NONE && ElementInContainer(targetRegionKey, allowedRegions)) { if (ReplaceEntrance(entrance, target, rollbacks)) { // Return once the entrance has been replaced return true; @@ -514,7 +515,10 @@ static bool PlaceOneWayPriorityEntrance(std::string priorityName, std::list entrances, std::vector targetEntrances, std::vector& rollbacks) { // Get the other impas house entrance - auto otherImpaTargets = FilterFromPool(targetEntrances, [](const Entrance* target){return (target->GetConnectedRegionKey() == KAK_IMPAS_HOUSE || target->GetConnectedRegionKey() == KAK_IMPAS_HOUSE_BACK);}); + auto otherImpaTargets = FilterFromPool(targetEntrances, [](const Entrance* target) { + return (target->GetConnectedRegionKey() == RR_KAK_IMPAS_HOUSE || + target->GetConnectedRegionKey() == RR_KAK_IMPAS_HOUSE_BACK); + }); if (otherImpaTargets.empty()) { return true; } @@ -522,11 +526,14 @@ static bool PlaceOtherImpasHouseEntrance(std::vector entrances, std:: Entrance* otherImpaTarget = otherImpaTargets[0]; auto m = "Now Placing Other Impa Target: " + otherImpaTarget->GetName() + "\n"; SPDLOG_DEBUG(m); - AreaKey otherImpaRegion = otherImpaTarget->GetConnectedRegionKey() != KAK_IMPAS_HOUSE_BACK ? KAK_IMPAS_HOUSE_BACK : KAK_IMPAS_HOUSE; + RandomizerRegion otherImpaRegion = otherImpaTarget->GetConnectedRegionKey() != RR_KAK_IMPAS_HOUSE_BACK + ? RR_KAK_IMPAS_HOUSE_BACK + : RR_KAK_IMPAS_HOUSE; for (Entrance* entrance : entrances) { // If the entrance is already connected or it doesn't have the same hint region as the already placed impas house entrance, then don't try to use it - if (entrance->GetConnectedRegionKey() != NONE || (GetHintRegionHintKey(otherImpaRegion) != GetHintRegionHintKey(entrance->GetParentRegionKey()))) { - continue; + if (entrance->GetConnectedRegionKey() != RR_NONE || + (GetHintRegionHintKey(otherImpaRegion) != GetHintRegionHintKey(entrance->GetParentRegionKey()))) { + continue; } // If the placement succeeds, we return true if (ReplaceEntrance(entrance, otherImpaTarget, rollbacks)) { @@ -544,18 +551,18 @@ static bool ShuffleEntrances(std::vector& entrances, std::vectorGetConnectedRegionKey() != NONE) { + if (entrance->GetConnectedRegionKey() != RR_NONE) { continue; } Shuffle(targetEntrances); for (Entrance* target : targetEntrances) { - if (target->GetConnectedRegionKey() == NONE) { + if (target->GetConnectedRegionKey() == RR_NONE) { continue; } // Store whether or not we're about to attempt placing an entrance to Impas House - bool attemptedImpasHousePlacement = (target->GetConnectedRegionKey() == KAK_IMPAS_HOUSE || target->GetConnectedRegionKey() == KAK_IMPAS_HOUSE_BACK); + bool attemptedImpasHousePlacement = (target->GetConnectedRegionKey() == RR_KAK_IMPAS_HOUSE || target->GetConnectedRegionKey() == RR_KAK_IMPAS_HOUSE_BACK); if (ReplaceEntrance(entrance, target, rollbacks)) { // If shuffle cows is enabled and the last entrance was one to Impas House, @@ -569,7 +576,7 @@ static bool ShuffleEntrances(std::vector& entrances, std::vectorGetConnectedRegionKey() == NONE) { + if (entrance->GetConnectedRegionKey() == RR_NONE) { return false; } } @@ -687,287 +694,294 @@ int ShuffleAllEntrances() { curNumRandomizedEntrances = 0; std::vector entranceShuffleTable = { - //Parent Region Connected Region index blue warp - {{EntranceType::Dungeon, KF_OUTSIDE_DEKU_TREE, DEKU_TREE_ENTRYWAY, 0x0000}, - {EntranceType::Dungeon, DEKU_TREE_ENTRYWAY, KF_OUTSIDE_DEKU_TREE, 0x0209, 0x0457}}, - {{EntranceType::Dungeon, DEATH_MOUNTAIN_TRAIL, DODONGOS_CAVERN_ENTRYWAY, 0x0004}, - {EntranceType::Dungeon, DODONGOS_CAVERN_ENTRYWAY, DEATH_MOUNTAIN_TRAIL, 0x0242, 0x047A}}, - {{EntranceType::Dungeon, ZORAS_FOUNTAIN, JABU_JABUS_BELLY_ENTRYWAY, 0x0028}, - {EntranceType::Dungeon, JABU_JABUS_BELLY_ENTRYWAY, ZORAS_FOUNTAIN, 0x0221, 0x010E}}, - {{EntranceType::Dungeon, SACRED_FOREST_MEADOW, FOREST_TEMPLE_ENTRYWAY, 0x0169}, - {EntranceType::Dungeon, FOREST_TEMPLE_ENTRYWAY, SACRED_FOREST_MEADOW, 0x0215, 0x0608}}, - {{EntranceType::Dungeon, DMC_CENTRAL_LOCAL, FIRE_TEMPLE_ENTRYWAY, 0x0165}, - {EntranceType::Dungeon, FIRE_TEMPLE_ENTRYWAY, DMC_CENTRAL_LOCAL, 0x024A, 0x0564}}, - {{EntranceType::Dungeon, LAKE_HYLIA, WATER_TEMPLE_ENTRYWAY, 0x0010}, - {EntranceType::Dungeon, WATER_TEMPLE_ENTRYWAY, LAKE_HYLIA, 0x021D, 0x060C}}, - {{EntranceType::Dungeon, DESERT_COLOSSUS, SPIRIT_TEMPLE_ENTRYWAY, 0x0082}, - {EntranceType::Dungeon, SPIRIT_TEMPLE_ENTRYWAY, DESERT_COLOSSUS_FROM_SPIRIT_ENTRYWAY, 0x01E1, 0x0610}}, - {{EntranceType::Dungeon, GRAVEYARD_WARP_PAD_REGION, SHADOW_TEMPLE_ENTRYWAY, 0x0037}, - {EntranceType::Dungeon, SHADOW_TEMPLE_ENTRYWAY, GRAVEYARD_WARP_PAD_REGION, 0x0205, 0x0580}}, - {{EntranceType::Dungeon, KAKARIKO_VILLAGE, BOTTOM_OF_THE_WELL_ENTRYWAY, 0x0098}, - {EntranceType::Dungeon, BOTTOM_OF_THE_WELL_ENTRYWAY, KAKARIKO_VILLAGE, 0x02A6}}, - {{EntranceType::Dungeon, ZORAS_FOUNTAIN, ICE_CAVERN_ENTRYWAY, 0x0088}, - {EntranceType::Dungeon, ICE_CAVERN_ENTRYWAY, ZORAS_FOUNTAIN, 0x03D4}}, - {{EntranceType::Dungeon, GERUDO_FORTRESS, GERUDO_TRAINING_GROUNDS_ENTRYWAY, 0x0008}, - {EntranceType::Dungeon, GERUDO_TRAINING_GROUNDS_ENTRYWAY, GERUDO_FORTRESS, 0x03A8}}, - {{EntranceType::GanonDungeon, GANONS_CASTLE_LEDGE, GANONS_CASTLE_ENTRYWAY, 0x0467}, - {EntranceType::GanonDungeon, GANONS_CASTLE_ENTRYWAY, CASTLE_GROUNDS_FROM_GANONS_CASTLE, 0x023D}}, + // Parent Region Connected Region index blue warp + { { EntranceType::Dungeon, RR_KF_OUTSIDE_DEKU_TREE, RR_DEKU_TREE_ENTRYWAY, 0x0000 }, + { EntranceType::Dungeon, RR_DEKU_TREE_ENTRYWAY, RR_KF_OUTSIDE_DEKU_TREE, 0x0209, 0x0457 } }, + { { EntranceType::Dungeon, RR_DEATH_MOUNTAIN_TRAIL, RR_DODONGOS_CAVERN_ENTRYWAY, 0x0004 }, + { EntranceType::Dungeon, RR_DODONGOS_CAVERN_ENTRYWAY, RR_DEATH_MOUNTAIN_TRAIL, 0x0242, 0x047A } }, + { { EntranceType::Dungeon, RR_ZORAS_FOUNTAIN, RR_JABU_JABUS_BELLY_ENTRYWAY, 0x0028 }, + { EntranceType::Dungeon, RR_JABU_JABUS_BELLY_ENTRYWAY, RR_ZORAS_FOUNTAIN, 0x0221, 0x010E } }, + { { EntranceType::Dungeon, RR_SACRED_FOREST_MEADOW, RR_FOREST_TEMPLE_ENTRYWAY, 0x0169 }, + { EntranceType::Dungeon, RR_FOREST_TEMPLE_ENTRYWAY, RR_SACRED_FOREST_MEADOW, 0x0215, 0x0608 } }, + { { EntranceType::Dungeon, RR_DMC_CENTRAL_LOCAL, RR_FIRE_TEMPLE_ENTRYWAY, 0x0165 }, + { EntranceType::Dungeon, RR_FIRE_TEMPLE_ENTRYWAY, RR_DMC_CENTRAL_LOCAL, 0x024A, 0x0564 } }, + { { EntranceType::Dungeon, RR_LAKE_HYLIA, RR_WATER_TEMPLE_ENTRYWAY, 0x0010 }, + { EntranceType::Dungeon, RR_WATER_TEMPLE_ENTRYWAY, RR_LAKE_HYLIA, 0x021D, 0x060C } }, + { { EntranceType::Dungeon, RR_DESERT_COLOSSUS, RR_SPIRIT_TEMPLE_ENTRYWAY, 0x0082 }, + { EntranceType::Dungeon, RR_SPIRIT_TEMPLE_ENTRYWAY, RR_DESERT_COLOSSUS_FROM_SPIRIT_ENTRYWAY, 0x01E1, 0x0610 } }, + { { EntranceType::Dungeon, RR_GRAVEYARD_WARP_PAD_REGION, RR_SHADOW_TEMPLE_ENTRYWAY, 0x0037 }, + { EntranceType::Dungeon, RR_SHADOW_TEMPLE_ENTRYWAY, RR_GRAVEYARD_WARP_PAD_REGION, 0x0205, 0x0580 } }, + { { EntranceType::Dungeon, RR_KAKARIKO_VILLAGE, RR_BOTTOM_OF_THE_WELL_ENTRYWAY, 0x0098 }, + { EntranceType::Dungeon, RR_BOTTOM_OF_THE_WELL_ENTRYWAY, RR_KAKARIKO_VILLAGE, 0x02A6 } }, + { { EntranceType::Dungeon, RR_ZORAS_FOUNTAIN, RR_ICE_CAVERN_ENTRYWAY, 0x0088 }, + { EntranceType::Dungeon, RR_ICE_CAVERN_ENTRYWAY, RR_ZORAS_FOUNTAIN, 0x03D4 } }, + { { EntranceType::Dungeon, RR_GERUDO_FORTRESS, RR_GERUDO_TRAINING_GROUNDS_ENTRYWAY, 0x0008 }, + { EntranceType::Dungeon, RR_GERUDO_TRAINING_GROUNDS_ENTRYWAY, RR_GERUDO_FORTRESS, 0x03A8 } }, + { { EntranceType::GanonDungeon, RR_GANONS_CASTLE_LEDGE, RR_GANONS_CASTLE_ENTRYWAY, 0x0467 }, + { EntranceType::GanonDungeon, RR_GANONS_CASTLE_ENTRYWAY, RR_CASTLE_GROUNDS_FROM_GANONS_CASTLE, 0x023D } }, - {{EntranceType::Interior, KOKIRI_FOREST, KF_MIDOS_HOUSE, 0x0433}, - {EntranceType::Interior, KF_MIDOS_HOUSE, KOKIRI_FOREST, 0x0443}}, - {{EntranceType::Interior, KOKIRI_FOREST, KF_SARIAS_HOUSE, 0x0437}, - {EntranceType::Interior, KF_SARIAS_HOUSE, KOKIRI_FOREST, 0x0447}}, - {{EntranceType::Interior, KOKIRI_FOREST, KF_HOUSE_OF_TWINS, 0x009C}, - {EntranceType::Interior, KF_HOUSE_OF_TWINS, KOKIRI_FOREST, 0x033C}}, - {{EntranceType::Interior, KOKIRI_FOREST, KF_KNOW_IT_ALL_HOUSE, 0x00C9}, - {EntranceType::Interior, KF_KNOW_IT_ALL_HOUSE, KOKIRI_FOREST, 0x026A}}, - {{EntranceType::Interior, KOKIRI_FOREST, KF_KOKIRI_SHOP, 0x00C1}, - {EntranceType::Interior, KF_KOKIRI_SHOP, KOKIRI_FOREST, 0x0266}}, - {{EntranceType::Interior, LAKE_HYLIA, LH_LAB, 0x0043}, - {EntranceType::Interior, LH_LAB, LAKE_HYLIA, 0x03CC}}, - {{EntranceType::Interior, LH_FISHING_ISLAND, LH_FISHING_HOLE, 0x045F}, - {EntranceType::Interior, LH_FISHING_HOLE, LH_FISHING_ISLAND, 0x0309}}, - {{EntranceType::Interior, GV_FORTRESS_SIDE, GV_CARPENTER_TENT, 0x03A0}, - {EntranceType::Interior, GV_CARPENTER_TENT, GV_FORTRESS_SIDE, 0x03D0}}, - {{EntranceType::Interior, MARKET_ENTRANCE, MARKET_GUARD_HOUSE, 0x007E}, - {EntranceType::Interior, MARKET_GUARD_HOUSE, MARKET_ENTRANCE, 0x026E}}, - {{EntranceType::Interior, THE_MARKET, MARKET_MASK_SHOP, 0x0530}, - {EntranceType::Interior, MARKET_MASK_SHOP, THE_MARKET, 0x01D1}}, - {{EntranceType::Interior, THE_MARKET, MARKET_BOMBCHU_BOWLING, 0x0507}, - {EntranceType::Interior, MARKET_BOMBCHU_BOWLING, THE_MARKET, 0x03BC}}, - {{EntranceType::Interior, THE_MARKET, MARKET_POTION_SHOP, 0x0388}, - {EntranceType::Interior, MARKET_POTION_SHOP, THE_MARKET, 0x02A2}}, - {{EntranceType::Interior, THE_MARKET, MARKET_TREASURE_CHEST_GAME, 0x0063}, - {EntranceType::Interior, MARKET_TREASURE_CHEST_GAME, THE_MARKET, 0x01D5}}, - {{EntranceType::Interior, MARKET_BACK_ALLEY, MARKET_BOMBCHU_SHOP, 0x0528}, - {EntranceType::Interior, MARKET_BOMBCHU_SHOP, MARKET_BACK_ALLEY, 0x03C0}}, - {{EntranceType::Interior, MARKET_BACK_ALLEY, MARKET_MAN_IN_GREEN_HOUSE, 0x043B}, - {EntranceType::Interior, MARKET_MAN_IN_GREEN_HOUSE, MARKET_BACK_ALLEY, 0x0067}}, - {{EntranceType::Interior, KAKARIKO_VILLAGE, KAK_CARPENTER_BOSS_HOUSE, 0x02FD}, - {EntranceType::Interior, KAK_CARPENTER_BOSS_HOUSE, KAKARIKO_VILLAGE, 0x0349}}, - {{EntranceType::Interior, KAKARIKO_VILLAGE, KAK_HOUSE_OF_SKULLTULA, 0x0550}, - {EntranceType::Interior, KAK_HOUSE_OF_SKULLTULA, KAKARIKO_VILLAGE, 0x04EE}}, - {{EntranceType::Interior, KAKARIKO_VILLAGE, KAK_IMPAS_HOUSE, 0x039C}, - {EntranceType::Interior, KAK_IMPAS_HOUSE, KAKARIKO_VILLAGE, 0x0345}}, - {{EntranceType::Interior, KAK_IMPAS_LEDGE, KAK_IMPAS_HOUSE_BACK, 0x05C8}, - {EntranceType::Interior, KAK_IMPAS_HOUSE_BACK, KAK_IMPAS_LEDGE, 0x05DC}}, - {{EntranceType::Interior, KAK_BACKYARD, KAK_ODD_POTION_BUILDING, 0x0072}, - {EntranceType::Interior, KAK_ODD_POTION_BUILDING, KAK_BACKYARD, 0x034D}}, - {{EntranceType::Interior, THE_GRAVEYARD, GRAVEYARD_DAMPES_HOUSE, 0x030D}, - {EntranceType::Interior, GRAVEYARD_DAMPES_HOUSE, THE_GRAVEYARD, 0x0355}}, - {{EntranceType::Interior, GORON_CITY, GC_SHOP, 0x037C}, - {EntranceType::Interior, GC_SHOP, GORON_CITY, 0x03FC}}, - {{EntranceType::Interior, ZORAS_DOMAIN, ZD_SHOP, 0x0380}, - {EntranceType::Interior, ZD_SHOP, ZORAS_DOMAIN, 0x03C4}}, - {{EntranceType::Interior, LON_LON_RANCH, LLR_TALONS_HOUSE, 0x004F}, - {EntranceType::Interior, LLR_TALONS_HOUSE, LON_LON_RANCH, 0x0378}}, - {{EntranceType::Interior, LON_LON_RANCH, LLR_STABLES, 0x02F9}, - {EntranceType::Interior, LLR_STABLES, LON_LON_RANCH, 0x042F}}, - {{EntranceType::Interior, LON_LON_RANCH, LLR_TOWER, 0x05D0}, - {EntranceType::Interior, LLR_TOWER, LON_LON_RANCH, 0x05D4}}, - {{EntranceType::Interior, THE_MARKET, MARKET_BAZAAR, 0x052C}, - {EntranceType::Interior, MARKET_BAZAAR, THE_MARKET, 0x03B8}}, - {{EntranceType::Interior, THE_MARKET, MARKET_SHOOTING_GALLERY, 0x016D}, - {EntranceType::Interior, MARKET_SHOOTING_GALLERY, THE_MARKET, 0x01CD}}, - {{EntranceType::Interior, KAKARIKO_VILLAGE, KAK_BAZAAR, 0x00B7}, - {EntranceType::Interior, KAK_BAZAAR, KAKARIKO_VILLAGE, 0x0201}}, - {{EntranceType::Interior, KAKARIKO_VILLAGE, KAK_SHOOTING_GALLERY, 0x003B}, - {EntranceType::Interior, KAK_SHOOTING_GALLERY, KAKARIKO_VILLAGE, 0x0463}}, - {{EntranceType::Interior, DESERT_COLOSSUS, COLOSSUS_GREAT_FAIRY_FOUNTAIN, 0x0588}, - {EntranceType::Interior, COLOSSUS_GREAT_FAIRY_FOUNTAIN, DESERT_COLOSSUS, 0x057C}}, - {{EntranceType::Interior, HYRULE_CASTLE_GROUNDS, HC_GREAT_FAIRY_FOUNTAIN, 0x0578}, - {EntranceType::Interior, HC_GREAT_FAIRY_FOUNTAIN, CASTLE_GROUNDS, 0x0340}}, - {{EntranceType::Interior, GANONS_CASTLE_GROUNDS, OGC_GREAT_FAIRY_FOUNTAIN, 0x04C2}, - {EntranceType::Interior, OGC_GREAT_FAIRY_FOUNTAIN, CASTLE_GROUNDS, 0x03E8}}, //0x3E8 is an unused entrance index repruposed to differentiate between the HC and OGC fairy fountain exits (normally they both use 0x340) - {{EntranceType::Interior, DMC_LOWER_NEARBY, DMC_GREAT_FAIRY_FOUNTAIN, 0x04BE}, - {EntranceType::Interior, DMC_GREAT_FAIRY_FOUNTAIN, DMC_LOWER_LOCAL, 0x0482}}, - {{EntranceType::Interior, DEATH_MOUNTAIN_SUMMIT, DMT_GREAT_FAIRY_FOUNTAIN, 0x0315}, - {EntranceType::Interior, DMT_GREAT_FAIRY_FOUNTAIN, DEATH_MOUNTAIN_SUMMIT, 0x045B}}, - {{EntranceType::Interior, ZORAS_FOUNTAIN, ZF_GREAT_FAIRY_FOUNTAIN, 0x0371}, - {EntranceType::Interior, ZF_GREAT_FAIRY_FOUNTAIN, ZORAS_FOUNTAIN, 0x0394}}, + { { EntranceType::Interior, RR_KOKIRI_FOREST, RR_KF_MIDOS_HOUSE, 0x0433 }, + { EntranceType::Interior, RR_KF_MIDOS_HOUSE, RR_KOKIRI_FOREST, 0x0443 } }, + { { EntranceType::Interior, RR_KOKIRI_FOREST, RR_KF_SARIAS_HOUSE, 0x0437 }, + { EntranceType::Interior, RR_KF_SARIAS_HOUSE, RR_KOKIRI_FOREST, 0x0447 } }, + { { EntranceType::Interior, RR_KOKIRI_FOREST, RR_KF_HOUSE_OF_TWINS, 0x009C }, + { EntranceType::Interior, RR_KF_HOUSE_OF_TWINS, RR_KOKIRI_FOREST, 0x033C } }, + { { EntranceType::Interior, RR_KOKIRI_FOREST, RR_KF_KNOW_IT_ALL_HOUSE, 0x00C9 }, + { EntranceType::Interior, RR_KF_KNOW_IT_ALL_HOUSE, RR_KOKIRI_FOREST, 0x026A } }, + { { EntranceType::Interior, RR_KOKIRI_FOREST, RR_KF_KOKIRI_SHOP, 0x00C1 }, + { EntranceType::Interior, RR_KF_KOKIRI_SHOP, RR_KOKIRI_FOREST, 0x0266 } }, + { { EntranceType::Interior, RR_LAKE_HYLIA, RR_LH_LAB, 0x0043 }, + { EntranceType::Interior, RR_LH_LAB, RR_LAKE_HYLIA, 0x03CC } }, + { { EntranceType::Interior, RR_LH_FISHING_ISLAND, RR_LH_FISHING_HOLE, 0x045F }, + { EntranceType::Interior, RR_LH_FISHING_HOLE, RR_LH_FISHING_ISLAND, 0x0309 } }, + { { EntranceType::Interior, RR_GV_FORTRESS_SIDE, RR_GV_CARPENTER_TENT, 0x03A0 }, + { EntranceType::Interior, RR_GV_CARPENTER_TENT, RR_GV_FORTRESS_SIDE, 0x03D0 } }, + { { EntranceType::Interior, RR_MARKET_ENTRANCE, RR_MARKET_GUARD_HOUSE, 0x007E }, + { EntranceType::Interior, RR_MARKET_GUARD_HOUSE, RR_MARKET_ENTRANCE, 0x026E } }, + { { EntranceType::Interior, RR_THE_MARKET, RR_MARKET_MASK_SHOP, 0x0530 }, + { EntranceType::Interior, RR_MARKET_MASK_SHOP, RR_THE_MARKET, 0x01D1 } }, + { { EntranceType::Interior, RR_THE_MARKET, RR_MARKET_BOMBCHU_BOWLING, 0x0507 }, + { EntranceType::Interior, RR_MARKET_BOMBCHU_BOWLING, RR_THE_MARKET, 0x03BC } }, + { { EntranceType::Interior, RR_THE_MARKET, RR_MARKET_POTION_SHOP, 0x0388 }, + { EntranceType::Interior, RR_MARKET_POTION_SHOP, RR_THE_MARKET, 0x02A2 } }, + { { EntranceType::Interior, RR_THE_MARKET, RR_MARKET_TREASURE_CHEST_GAME, 0x0063 }, + { EntranceType::Interior, RR_MARKET_TREASURE_CHEST_GAME, RR_THE_MARKET, 0x01D5 } }, + { { EntranceType::Interior, RR_MARKET_BACK_ALLEY, RR_MARKET_BOMBCHU_SHOP, 0x0528 }, + { EntranceType::Interior, RR_MARKET_BOMBCHU_SHOP, RR_MARKET_BACK_ALLEY, 0x03C0 } }, + { { EntranceType::Interior, RR_MARKET_BACK_ALLEY, RR_MARKET_MAN_IN_GREEN_HOUSE, 0x043B }, + { EntranceType::Interior, RR_MARKET_MAN_IN_GREEN_HOUSE, RR_MARKET_BACK_ALLEY, 0x0067 } }, + { { EntranceType::Interior, RR_KAKARIKO_VILLAGE, RR_KAK_CARPENTER_BOSS_HOUSE, 0x02FD }, + { EntranceType::Interior, RR_KAK_CARPENTER_BOSS_HOUSE, RR_KAKARIKO_VILLAGE, 0x0349 } }, + { { EntranceType::Interior, RR_KAKARIKO_VILLAGE, RR_KAK_HOUSE_OF_SKULLTULA, 0x0550 }, + { EntranceType::Interior, RR_KAK_HOUSE_OF_SKULLTULA, RR_KAKARIKO_VILLAGE, 0x04EE } }, + { { EntranceType::Interior, RR_KAKARIKO_VILLAGE, RR_KAK_IMPAS_HOUSE, 0x039C }, + { EntranceType::Interior, RR_KAK_IMPAS_HOUSE, RR_KAKARIKO_VILLAGE, 0x0345 } }, + { { EntranceType::Interior, RR_KAK_IMPAS_LEDGE, RR_KAK_IMPAS_HOUSE_BACK, 0x05C8 }, + { EntranceType::Interior, RR_KAK_IMPAS_HOUSE_BACK, RR_KAK_IMPAS_LEDGE, 0x05DC } }, + { { EntranceType::Interior, RR_KAK_BACKYARD, RR_KAK_ODD_POTION_BUILDING, 0x0072 }, + { EntranceType::Interior, RR_KAK_ODD_POTION_BUILDING, RR_KAK_BACKYARD, 0x034D } }, + { { EntranceType::Interior, RR_THE_GRAVEYARD, RR_GRAVEYARD_DAMPES_HOUSE, 0x030D }, + { EntranceType::Interior, RR_GRAVEYARD_DAMPES_HOUSE, RR_THE_GRAVEYARD, 0x0355 } }, + { { EntranceType::Interior, RR_GORON_CITY, RR_GC_SHOP, 0x037C }, + { EntranceType::Interior, RR_GC_SHOP, RR_GORON_CITY, 0x03FC } }, + { { EntranceType::Interior, RR_ZORAS_DOMAIN, RR_ZD_SHOP, 0x0380 }, + { EntranceType::Interior, RR_ZD_SHOP, RR_ZORAS_DOMAIN, 0x03C4 } }, + { { EntranceType::Interior, RR_LON_LON_RANCH, RR_LLR_TALONS_HOUSE, 0x004F }, + { EntranceType::Interior, RR_LLR_TALONS_HOUSE, RR_LON_LON_RANCH, 0x0378 } }, + { { EntranceType::Interior, RR_LON_LON_RANCH, RR_LLR_STABLES, 0x02F9 }, + { EntranceType::Interior, RR_LLR_STABLES, RR_LON_LON_RANCH, 0x042F } }, + { { EntranceType::Interior, RR_LON_LON_RANCH, RR_LLR_TOWER, 0x05D0 }, + { EntranceType::Interior, RR_LLR_TOWER, RR_LON_LON_RANCH, 0x05D4 } }, + { { EntranceType::Interior, RR_THE_MARKET, RR_MARKET_BAZAAR, 0x052C }, + { EntranceType::Interior, RR_MARKET_BAZAAR, RR_THE_MARKET, 0x03B8 } }, + { { EntranceType::Interior, RR_THE_MARKET, RR_MARKET_SHOOTING_GALLERY, 0x016D }, + { EntranceType::Interior, RR_MARKET_SHOOTING_GALLERY, RR_THE_MARKET, 0x01CD } }, + { { EntranceType::Interior, RR_KAKARIKO_VILLAGE, RR_KAK_BAZAAR, 0x00B7 }, + { EntranceType::Interior, RR_KAK_BAZAAR, RR_KAKARIKO_VILLAGE, 0x0201 } }, + { { EntranceType::Interior, RR_KAKARIKO_VILLAGE, RR_KAK_SHOOTING_GALLERY, 0x003B }, + { EntranceType::Interior, RR_KAK_SHOOTING_GALLERY, RR_KAKARIKO_VILLAGE, 0x0463 } }, + { { EntranceType::Interior, RR_DESERT_COLOSSUS, RR_COLOSSUS_GREAT_FAIRY_FOUNTAIN, 0x0588 }, + { EntranceType::Interior, RR_COLOSSUS_GREAT_FAIRY_FOUNTAIN, RR_DESERT_COLOSSUS, 0x057C } }, + { { EntranceType::Interior, RR_HYRULE_CASTLE_GROUNDS, RR_HC_GREAT_FAIRY_FOUNTAIN, 0x0578 }, + { EntranceType::Interior, RR_HC_GREAT_FAIRY_FOUNTAIN, RR_CASTLE_GROUNDS, 0x0340 } }, + { { EntranceType::Interior, RR_GANONS_CASTLE_GROUNDS, RR_OGC_GREAT_FAIRY_FOUNTAIN, 0x04C2 }, + { EntranceType::Interior, RR_OGC_GREAT_FAIRY_FOUNTAIN, RR_CASTLE_GROUNDS, + 0x03E8 } }, // 0x3E8 is an unused entrance index repruposed to differentiate between the HC and OGC fairy + // fountain exits (normally they both use 0x340) + { { EntranceType::Interior, RR_DMC_LOWER_NEARBY, RR_DMC_GREAT_FAIRY_FOUNTAIN, 0x04BE }, + { EntranceType::Interior, RR_DMC_GREAT_FAIRY_FOUNTAIN, RR_DMC_LOWER_LOCAL, 0x0482 } }, + { { EntranceType::Interior, RR_DEATH_MOUNTAIN_SUMMIT, RR_DMT_GREAT_FAIRY_FOUNTAIN, 0x0315 }, + { EntranceType::Interior, RR_DMT_GREAT_FAIRY_FOUNTAIN, RR_DEATH_MOUNTAIN_SUMMIT, 0x045B } }, + { { EntranceType::Interior, RR_ZORAS_FOUNTAIN, RR_ZF_GREAT_FAIRY_FOUNTAIN, 0x0371 }, + { EntranceType::Interior, RR_ZF_GREAT_FAIRY_FOUNTAIN, RR_ZORAS_FOUNTAIN, 0x0394 } }, - {{EntranceType::SpecialInterior, KOKIRI_FOREST, KF_LINKS_HOUSE, 0x0272}, - {EntranceType::SpecialInterior, KF_LINKS_HOUSE, KOKIRI_FOREST, 0x0211}}, - {{EntranceType::SpecialInterior, TOT_ENTRANCE, TEMPLE_OF_TIME, 0x0053}, - {EntranceType::SpecialInterior, TEMPLE_OF_TIME, TOT_ENTRANCE, 0x0472}}, - {{EntranceType::SpecialInterior, KAKARIKO_VILLAGE, KAK_WINDMILL, 0x0453}, - {EntranceType::SpecialInterior, KAK_WINDMILL, KAKARIKO_VILLAGE, 0x0351}}, - {{EntranceType::SpecialInterior, KAKARIKO_VILLAGE, KAK_POTION_SHOP_FRONT, 0x0384}, - {EntranceType::SpecialInterior, KAK_POTION_SHOP_FRONT, KAKARIKO_VILLAGE, 0x044B}}, - {{EntranceType::SpecialInterior, KAK_BACKYARD, KAK_POTION_SHOP_BACK, 0x03EC}, - {EntranceType::SpecialInterior, KAK_POTION_SHOP_BACK, KAK_BACKYARD, 0x04FF}}, + { { EntranceType::SpecialInterior, RR_KOKIRI_FOREST, RR_KF_LINKS_HOUSE, 0x0272 }, + { EntranceType::SpecialInterior, RR_KF_LINKS_HOUSE, RR_KOKIRI_FOREST, 0x0211 } }, + { { EntranceType::SpecialInterior, RR_TOT_ENTRANCE, RR_TEMPLE_OF_TIME, 0x0053 }, + { EntranceType::SpecialInterior, RR_TEMPLE_OF_TIME, RR_TOT_ENTRANCE, 0x0472 } }, + { { EntranceType::SpecialInterior, RR_KAKARIKO_VILLAGE, RR_KAK_WINDMILL, 0x0453 }, + { EntranceType::SpecialInterior, RR_KAK_WINDMILL, RR_KAKARIKO_VILLAGE, 0x0351 } }, + { { EntranceType::SpecialInterior, RR_KAKARIKO_VILLAGE, RR_KAK_POTION_SHOP_FRONT, 0x0384 }, + { EntranceType::SpecialInterior, RR_KAK_POTION_SHOP_FRONT, RR_KAKARIKO_VILLAGE, 0x044B } }, + { { EntranceType::SpecialInterior, RR_KAK_BACKYARD, RR_KAK_POTION_SHOP_BACK, 0x03EC }, + { EntranceType::SpecialInterior, RR_KAK_POTION_SHOP_BACK, RR_KAK_BACKYARD, 0x04FF } }, - // Grotto Loads use an entrance index of 0x0700 + their grotto id. The id is used as index for the - // grottoLoadTable in soh/soh/Enhancements/randomizer/randomizer_grotto.c - // Grotto Returns use an entrance index of 0x0800 + their grotto id. The id is used as index for the - // grottoReturnTable in soh/soh/Enhancements/randomizer/randomizer_grotto.c - {{EntranceType::GrottoGrave, DESERT_COLOSSUS, COLOSSUS_GROTTO, 0x0700}, - {EntranceType::GrottoGrave, COLOSSUS_GROTTO, DESERT_COLOSSUS, 0x0800}}, - {{EntranceType::GrottoGrave, LAKE_HYLIA, LH_GROTTO, 0x0701}, - {EntranceType::GrottoGrave, LH_GROTTO, LAKE_HYLIA, 0x0801}}, - {{EntranceType::GrottoGrave, ZORAS_RIVER, ZR_STORMS_GROTTO, 0x0702}, - {EntranceType::GrottoGrave, ZR_STORMS_GROTTO, ZORAS_RIVER, 0x0802}}, - {{EntranceType::GrottoGrave, ZORAS_RIVER, ZR_FAIRY_GROTTO, 0x0703}, - {EntranceType::GrottoGrave, ZR_FAIRY_GROTTO, ZORAS_RIVER, 0x0803}}, - {{EntranceType::GrottoGrave, ZORAS_RIVER, ZR_OPEN_GROTTO, 0x0704}, - {EntranceType::GrottoGrave, ZR_OPEN_GROTTO, ZORAS_RIVER, 0x0804}}, - {{EntranceType::GrottoGrave, DMC_LOWER_NEARBY, DMC_HAMMER_GROTTO, 0x0705}, - {EntranceType::GrottoGrave, DMC_HAMMER_GROTTO, DMC_LOWER_LOCAL, 0x0805}}, - {{EntranceType::GrottoGrave, DMC_UPPER_NEARBY, DMC_UPPER_GROTTO, 0x0706}, - {EntranceType::GrottoGrave, DMC_UPPER_GROTTO, DMC_UPPER_LOCAL, 0x0806}}, - {{EntranceType::GrottoGrave, GC_GROTTO_PLATFORM, GC_GROTTO, 0x0707}, - {EntranceType::GrottoGrave, GC_GROTTO, GC_GROTTO_PLATFORM, 0x0807}}, - {{EntranceType::GrottoGrave, DEATH_MOUNTAIN_TRAIL, DMT_STORMS_GROTTO, 0x0708}, - {EntranceType::GrottoGrave, DMT_STORMS_GROTTO, DEATH_MOUNTAIN_TRAIL, 0x0808}}, - {{EntranceType::GrottoGrave, DEATH_MOUNTAIN_SUMMIT, DMT_COW_GROTTO, 0x0709}, - {EntranceType::GrottoGrave, DMT_COW_GROTTO, DEATH_MOUNTAIN_SUMMIT, 0x0809}}, - {{EntranceType::GrottoGrave, KAK_BACKYARD, KAK_OPEN_GROTTO, 0x070A}, - {EntranceType::GrottoGrave, KAK_OPEN_GROTTO, KAK_BACKYARD, 0x080A}}, - {{EntranceType::GrottoGrave, KAKARIKO_VILLAGE, KAK_REDEAD_GROTTO, 0x070B}, - {EntranceType::GrottoGrave, KAK_REDEAD_GROTTO, KAKARIKO_VILLAGE, 0x080B}}, - {{EntranceType::GrottoGrave, HYRULE_CASTLE_GROUNDS, HC_STORMS_GROTTO, 0x070C}, - {EntranceType::GrottoGrave, HC_STORMS_GROTTO, CASTLE_GROUNDS, 0x080C}}, - {{EntranceType::GrottoGrave, HYRULE_FIELD, HF_TEKTITE_GROTTO, 0x070D}, - {EntranceType::GrottoGrave, HF_TEKTITE_GROTTO, HYRULE_FIELD, 0x080D}}, - {{EntranceType::GrottoGrave, HYRULE_FIELD, HF_NEAR_KAK_GROTTO, 0x070E}, - {EntranceType::GrottoGrave, HF_NEAR_KAK_GROTTO, HYRULE_FIELD, 0x080E}}, - {{EntranceType::GrottoGrave, HYRULE_FIELD, HF_FAIRY_GROTTO, 0x070F}, - {EntranceType::GrottoGrave, HF_FAIRY_GROTTO, HYRULE_FIELD, 0x080F}}, - {{EntranceType::GrottoGrave, HYRULE_FIELD, HF_NEAR_MARKET_GROTTO, 0x0710}, - {EntranceType::GrottoGrave, HF_NEAR_MARKET_GROTTO, HYRULE_FIELD, 0x0810}}, - {{EntranceType::GrottoGrave, HYRULE_FIELD, HF_COW_GROTTO, 0x0711}, - {EntranceType::GrottoGrave, HF_COW_GROTTO, HYRULE_FIELD, 0x0811}}, - {{EntranceType::GrottoGrave, HYRULE_FIELD, HF_INSIDE_FENCE_GROTTO, 0x0712}, - {EntranceType::GrottoGrave, HF_INSIDE_FENCE_GROTTO, HYRULE_FIELD, 0x0812}}, - {{EntranceType::GrottoGrave, HYRULE_FIELD, HF_OPEN_GROTTO, 0x0713}, - {EntranceType::GrottoGrave, HF_OPEN_GROTTO, HYRULE_FIELD, 0x0813}}, - {{EntranceType::GrottoGrave, HYRULE_FIELD, HF_SOUTHEAST_GROTTO, 0x0714}, - {EntranceType::GrottoGrave, HF_SOUTHEAST_GROTTO, HYRULE_FIELD, 0x0814}}, - {{EntranceType::GrottoGrave, LON_LON_RANCH, LLR_GROTTO, 0x0715}, - {EntranceType::GrottoGrave, LLR_GROTTO, LON_LON_RANCH, 0x0815}}, - {{EntranceType::GrottoGrave, SFM_ENTRYWAY, SFM_WOLFOS_GROTTO, 0x0716}, - {EntranceType::GrottoGrave, SFM_WOLFOS_GROTTO, SFM_ENTRYWAY, 0x0816}}, - {{EntranceType::GrottoGrave, SACRED_FOREST_MEADOW, SFM_STORMS_GROTTO, 0x0717}, - {EntranceType::GrottoGrave, SFM_STORMS_GROTTO, SACRED_FOREST_MEADOW, 0x0817}}, - {{EntranceType::GrottoGrave, SACRED_FOREST_MEADOW, SFM_FAIRY_GROTTO, 0x0718}, - {EntranceType::GrottoGrave, SFM_FAIRY_GROTTO, SACRED_FOREST_MEADOW, 0x0818}}, - {{EntranceType::GrottoGrave, LW_BEYOND_MIDO, LW_SCRUBS_GROTTO, 0x0719}, - {EntranceType::GrottoGrave, LW_SCRUBS_GROTTO, LW_BEYOND_MIDO, 0x0819}}, - {{EntranceType::GrottoGrave, THE_LOST_WOODS, LW_NEAR_SHORTCUTS_GROTTO, 0x071A}, - {EntranceType::GrottoGrave, LW_NEAR_SHORTCUTS_GROTTO, THE_LOST_WOODS, 0x081A}}, - {{EntranceType::GrottoGrave, KOKIRI_FOREST, KF_STORMS_GROTTO, 0x071B}, - {EntranceType::GrottoGrave, KF_STORMS_GROTTO, KOKIRI_FOREST, 0x081B}}, - {{EntranceType::GrottoGrave, ZORAS_DOMAIN, ZD_STORMS_GROTTO, 0x071C}, - {EntranceType::GrottoGrave, ZD_STORMS_GROTTO, ZORAS_DOMAIN, 0x081C}}, - {{EntranceType::GrottoGrave, GERUDO_FORTRESS, GF_STORMS_GROTTO, 0x071D}, - {EntranceType::GrottoGrave, GF_STORMS_GROTTO, GERUDO_FORTRESS, 0x081D}}, - {{EntranceType::GrottoGrave, GV_FORTRESS_SIDE, GV_STORMS_GROTTO, 0x071E}, - {EntranceType::GrottoGrave, GV_STORMS_GROTTO, GV_FORTRESS_SIDE, 0x081E}}, - {{EntranceType::GrottoGrave, GV_GROTTO_LEDGE, GV_OCTOROK_GROTTO, 0x071F}, - {EntranceType::GrottoGrave, GV_OCTOROK_GROTTO, GV_GROTTO_LEDGE, 0x081F}}, - {{EntranceType::GrottoGrave, LW_BEYOND_MIDO, DEKU_THEATER, 0x0720}, - {EntranceType::GrottoGrave, DEKU_THEATER, LW_BEYOND_MIDO, 0x0820}}, + // Grotto Loads use an entrance index of 0x0700 + their grotto id. The id is used as index for the + // grottoLoadTable in soh/soh/Enhancements/randomizer/randomizer_grotto.c + // Grotto Returns use an entrance index of 0x0800 + their grotto id. The id is used as index for the + // grottoReturnTable in soh/soh/Enhancements/randomizer/randomizer_grotto.c + { { EntranceType::GrottoGrave, RR_DESERT_COLOSSUS, RR_COLOSSUS_GROTTO, 0x0700 }, + { EntranceType::GrottoGrave, RR_COLOSSUS_GROTTO, RR_DESERT_COLOSSUS, 0x0800 } }, + { { EntranceType::GrottoGrave, RR_LAKE_HYLIA, RR_LH_GROTTO, 0x0701 }, + { EntranceType::GrottoGrave, RR_LH_GROTTO, RR_LAKE_HYLIA, 0x0801 } }, + { { EntranceType::GrottoGrave, RR_ZORAS_RIVER, RR_ZR_STORMS_GROTTO, 0x0702 }, + { EntranceType::GrottoGrave, RR_ZR_STORMS_GROTTO, RR_ZORAS_RIVER, 0x0802 } }, + { { EntranceType::GrottoGrave, RR_ZORAS_RIVER, RR_ZR_FAIRY_GROTTO, 0x0703 }, + { EntranceType::GrottoGrave, RR_ZR_FAIRY_GROTTO, RR_ZORAS_RIVER, 0x0803 } }, + { { EntranceType::GrottoGrave, RR_ZORAS_RIVER, RR_ZR_OPEN_GROTTO, 0x0704 }, + { EntranceType::GrottoGrave, RR_ZR_OPEN_GROTTO, RR_ZORAS_RIVER, 0x0804 } }, + { { EntranceType::GrottoGrave, RR_DMC_LOWER_NEARBY, RR_DMC_HAMMER_GROTTO, 0x0705 }, + { EntranceType::GrottoGrave, RR_DMC_HAMMER_GROTTO, RR_DMC_LOWER_LOCAL, 0x0805 } }, + { { EntranceType::GrottoGrave, RR_DMC_UPPER_NEARBY, RR_DMC_UPPER_GROTTO, 0x0706 }, + { EntranceType::GrottoGrave, RR_DMC_UPPER_GROTTO, RR_DMC_UPPER_LOCAL, 0x0806 } }, + { { EntranceType::GrottoGrave, RR_GC_GROTTO_PLATFORM, RR_GC_GROTTO, 0x0707 }, + { EntranceType::GrottoGrave, RR_GC_GROTTO, RR_GC_GROTTO_PLATFORM, 0x0807 } }, + { { EntranceType::GrottoGrave, RR_DEATH_MOUNTAIN_TRAIL, RR_DMT_STORMS_GROTTO, 0x0708 }, + { EntranceType::GrottoGrave, RR_DMT_STORMS_GROTTO, RR_DEATH_MOUNTAIN_TRAIL, 0x0808 } }, + { { EntranceType::GrottoGrave, RR_DEATH_MOUNTAIN_SUMMIT, RR_DMT_COW_GROTTO, 0x0709 }, + { EntranceType::GrottoGrave, RR_DMT_COW_GROTTO, RR_DEATH_MOUNTAIN_SUMMIT, 0x0809 } }, + { { EntranceType::GrottoGrave, RR_KAK_BACKYARD, RR_KAK_OPEN_GROTTO, 0x070A }, + { EntranceType::GrottoGrave, RR_KAK_OPEN_GROTTO, RR_KAK_BACKYARD, 0x080A } }, + { { EntranceType::GrottoGrave, RR_KAKARIKO_VILLAGE, RR_KAK_REDEAD_GROTTO, 0x070B }, + { EntranceType::GrottoGrave, RR_KAK_REDEAD_GROTTO, RR_KAKARIKO_VILLAGE, 0x080B } }, + { { EntranceType::GrottoGrave, RR_HYRULE_CASTLE_GROUNDS, RR_HC_STORMS_GROTTO, 0x070C }, + { EntranceType::GrottoGrave, RR_HC_STORMS_GROTTO, RR_CASTLE_GROUNDS, 0x080C } }, + { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_TEKTITE_GROTTO, 0x070D }, + { EntranceType::GrottoGrave, RR_HF_TEKTITE_GROTTO, RR_HYRULE_FIELD, 0x080D } }, + { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_NEAR_KAK_GROTTO, 0x070E }, + { EntranceType::GrottoGrave, RR_HF_NEAR_KAK_GROTTO, RR_HYRULE_FIELD, 0x080E } }, + { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_FAIRY_GROTTO, 0x070F }, + { EntranceType::GrottoGrave, RR_HF_FAIRY_GROTTO, RR_HYRULE_FIELD, 0x080F } }, + { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_NEAR_MARKET_GROTTO, 0x0710 }, + { EntranceType::GrottoGrave, RR_HF_NEAR_MARKET_GROTTO, RR_HYRULE_FIELD, 0x0810 } }, + { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_COW_GROTTO, 0x0711 }, + { EntranceType::GrottoGrave, RR_HF_COW_GROTTO, RR_HYRULE_FIELD, 0x0811 } }, + { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_INSIDE_FENCE_GROTTO, 0x0712 }, + { EntranceType::GrottoGrave, RR_HF_INSIDE_FENCE_GROTTO, RR_HYRULE_FIELD, 0x0812 } }, + { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_OPEN_GROTTO, 0x0713 }, + { EntranceType::GrottoGrave, RR_HF_OPEN_GROTTO, RR_HYRULE_FIELD, 0x0813 } }, + { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_SOUTHEAST_GROTTO, 0x0714 }, + { EntranceType::GrottoGrave, RR_HF_SOUTHEAST_GROTTO, RR_HYRULE_FIELD, 0x0814 } }, + { { EntranceType::GrottoGrave, RR_LON_LON_RANCH, RR_LLR_GROTTO, 0x0715 }, + { EntranceType::GrottoGrave, RR_LLR_GROTTO, RR_LON_LON_RANCH, 0x0815 } }, + { { EntranceType::GrottoGrave, RR_SFM_ENTRYWAY, RR_SFM_WOLFOS_GROTTO, 0x0716 }, + { EntranceType::GrottoGrave, RR_SFM_WOLFOS_GROTTO, RR_SFM_ENTRYWAY, 0x0816 } }, + { { EntranceType::GrottoGrave, RR_SACRED_FOREST_MEADOW, RR_SFM_STORMS_GROTTO, 0x0717 }, + { EntranceType::GrottoGrave, RR_SFM_STORMS_GROTTO, RR_SACRED_FOREST_MEADOW, 0x0817 } }, + { { EntranceType::GrottoGrave, RR_SACRED_FOREST_MEADOW, RR_SFM_FAIRY_GROTTO, 0x0718 }, + { EntranceType::GrottoGrave, RR_SFM_FAIRY_GROTTO, RR_SACRED_FOREST_MEADOW, 0x0818 } }, + { { EntranceType::GrottoGrave, RR_LW_BEYOND_MIDO, RR_LW_SCRUBS_GROTTO, 0x0719 }, + { EntranceType::GrottoGrave, RR_LW_SCRUBS_GROTTO, RR_LW_BEYOND_MIDO, 0x0819 } }, + { { EntranceType::GrottoGrave, RR_THE_LOST_WOODS, RR_LW_NEAR_SHORTCUTS_GROTTO, 0x071A }, + { EntranceType::GrottoGrave, RR_LW_NEAR_SHORTCUTS_GROTTO, RR_THE_LOST_WOODS, 0x081A } }, + { { EntranceType::GrottoGrave, RR_KOKIRI_FOREST, RR_KF_STORMS_GROTTO, 0x071B }, + { EntranceType::GrottoGrave, RR_KF_STORMS_GROTTO, RR_KOKIRI_FOREST, 0x081B } }, + { { EntranceType::GrottoGrave, RR_ZORAS_DOMAIN, RR_ZD_STORMS_GROTTO, 0x071C }, + { EntranceType::GrottoGrave, RR_ZD_STORMS_GROTTO, RR_ZORAS_DOMAIN, 0x081C } }, + { { EntranceType::GrottoGrave, RR_GERUDO_FORTRESS, RR_GF_STORMS_GROTTO, 0x071D }, + { EntranceType::GrottoGrave, RR_GF_STORMS_GROTTO, RR_GERUDO_FORTRESS, 0x081D } }, + { { EntranceType::GrottoGrave, RR_GV_FORTRESS_SIDE, RR_GV_STORMS_GROTTO, 0x071E }, + { EntranceType::GrottoGrave, RR_GV_STORMS_GROTTO, RR_GV_FORTRESS_SIDE, 0x081E } }, + { { EntranceType::GrottoGrave, RR_GV_GROTTO_LEDGE, RR_GV_OCTOROK_GROTTO, 0x071F }, + { EntranceType::GrottoGrave, RR_GV_OCTOROK_GROTTO, RR_GV_GROTTO_LEDGE, 0x081F } }, + { { EntranceType::GrottoGrave, RR_LW_BEYOND_MIDO, RR_DEKU_THEATER, 0x0720 }, + { EntranceType::GrottoGrave, RR_DEKU_THEATER, RR_LW_BEYOND_MIDO, 0x0820 } }, - // Graves have their own specified entrance indices - {{EntranceType::GrottoGrave, THE_GRAVEYARD, GRAVEYARD_SHIELD_GRAVE, 0x004B}, - {EntranceType::GrottoGrave, GRAVEYARD_SHIELD_GRAVE, THE_GRAVEYARD, 0x035D}}, - {{EntranceType::GrottoGrave, THE_GRAVEYARD, GRAVEYARD_HEART_PIECE_GRAVE, 0x031C}, - {EntranceType::GrottoGrave, GRAVEYARD_HEART_PIECE_GRAVE, THE_GRAVEYARD, 0x0361}}, - {{EntranceType::GrottoGrave, THE_GRAVEYARD, GRAVEYARD_COMPOSERS_GRAVE, 0x002D}, - {EntranceType::GrottoGrave, GRAVEYARD_COMPOSERS_GRAVE, THE_GRAVEYARD, 0x050B}}, - {{EntranceType::GrottoGrave, THE_GRAVEYARD, GRAVEYARD_DAMPES_GRAVE, 0x044F}, - {EntranceType::GrottoGrave, GRAVEYARD_DAMPES_GRAVE, THE_GRAVEYARD, 0x0359}}, + // Graves have their own specified entrance indices + { { EntranceType::GrottoGrave, RR_THE_GRAVEYARD, RR_GRAVEYARD_SHIELD_GRAVE, 0x004B }, + { EntranceType::GrottoGrave, RR_GRAVEYARD_SHIELD_GRAVE, RR_THE_GRAVEYARD, 0x035D } }, + { { EntranceType::GrottoGrave, RR_THE_GRAVEYARD, RR_GRAVEYARD_HEART_PIECE_GRAVE, 0x031C }, + { EntranceType::GrottoGrave, RR_GRAVEYARD_HEART_PIECE_GRAVE, RR_THE_GRAVEYARD, 0x0361 } }, + { { EntranceType::GrottoGrave, RR_THE_GRAVEYARD, RR_GRAVEYARD_COMPOSERS_GRAVE, 0x002D }, + { EntranceType::GrottoGrave, RR_GRAVEYARD_COMPOSERS_GRAVE, RR_THE_GRAVEYARD, 0x050B } }, + { { EntranceType::GrottoGrave, RR_THE_GRAVEYARD, RR_GRAVEYARD_DAMPES_GRAVE, 0x044F }, + { EntranceType::GrottoGrave, RR_GRAVEYARD_DAMPES_GRAVE, RR_THE_GRAVEYARD, 0x0359 } }, - {{EntranceType::Overworld, KOKIRI_FOREST, LW_BRIDGE_FROM_FOREST, 0x05E0}, - {EntranceType::Overworld, LW_BRIDGE, KOKIRI_FOREST, 0x020D}}, - {{EntranceType::Overworld, KOKIRI_FOREST, THE_LOST_WOODS, 0x011E}, - {EntranceType::Overworld, LW_FOREST_EXIT, KOKIRI_FOREST, 0x0286}}, - {{EntranceType::Overworld, THE_LOST_WOODS, GC_WOODS_WARP, 0x04E2}, - {EntranceType::Overworld, GC_WOODS_WARP, THE_LOST_WOODS, 0x04D6}}, - {{EntranceType::Overworld, THE_LOST_WOODS, ZORAS_RIVER, 0x01DD}, - {EntranceType::Overworld, ZORAS_RIVER, THE_LOST_WOODS, 0x04DA}}, - {{EntranceType::Overworld, LW_BEYOND_MIDO, SFM_ENTRYWAY, 0x00FC}, - {EntranceType::Overworld, SFM_ENTRYWAY, LW_BEYOND_MIDO, 0x01A9}}, - {{EntranceType::Overworld, LW_BRIDGE, HYRULE_FIELD, 0x0185}, - {EntranceType::Overworld, HYRULE_FIELD, LW_BRIDGE, 0x04DE}}, - {{EntranceType::Overworld, HYRULE_FIELD, LAKE_HYLIA, 0x0102}, - {EntranceType::Overworld, LAKE_HYLIA, HYRULE_FIELD, 0x0189}}, - {{EntranceType::Overworld, HYRULE_FIELD, GERUDO_VALLEY, 0x0117}, - {EntranceType::Overworld, GERUDO_VALLEY, HYRULE_FIELD, 0x018D}}, - {{EntranceType::Overworld, HYRULE_FIELD, MARKET_ENTRANCE, 0x0276}, - {EntranceType::Overworld, MARKET_ENTRANCE, HYRULE_FIELD, 0x01FD}}, - {{EntranceType::Overworld, HYRULE_FIELD, KAKARIKO_VILLAGE, 0x00DB}, - {EntranceType::Overworld, KAKARIKO_VILLAGE, HYRULE_FIELD, 0x017D}}, - {{EntranceType::Overworld, HYRULE_FIELD, ZR_FRONT, 0x00EA}, - {EntranceType::Overworld, ZR_FRONT, HYRULE_FIELD, 0x0181}}, - {{EntranceType::Overworld, HYRULE_FIELD, LON_LON_RANCH, 0x0157}, - {EntranceType::Overworld, LON_LON_RANCH, HYRULE_FIELD, 0x01F9}}, - {{EntranceType::Overworld, LAKE_HYLIA, ZORAS_DOMAIN, 0x0328}, - {EntranceType::Overworld, ZORAS_DOMAIN, LAKE_HYLIA, 0x0560}}, - {{EntranceType::Overworld, GV_FORTRESS_SIDE, GERUDO_FORTRESS, 0x0129}, - {EntranceType::Overworld, GERUDO_FORTRESS, GV_FORTRESS_SIDE, 0x022D}}, - {{EntranceType::Overworld, GF_OUTSIDE_GATE, WASTELAND_NEAR_FORTRESS, 0x0130}, - {EntranceType::Overworld, WASTELAND_NEAR_FORTRESS, GF_OUTSIDE_GATE, 0x03AC}}, - {{EntranceType::Overworld, WASTELAND_NEAR_COLOSSUS, DESERT_COLOSSUS, 0x0123}, - {EntranceType::Overworld, DESERT_COLOSSUS, WASTELAND_NEAR_COLOSSUS, 0x0365}}, - {{EntranceType::Overworld, MARKET_ENTRANCE, THE_MARKET, 0x00B1}, - {EntranceType::Overworld, THE_MARKET, MARKET_ENTRANCE, 0x0033}}, - {{EntranceType::Overworld, THE_MARKET, CASTLE_GROUNDS, 0x0138}, - {EntranceType::Overworld, CASTLE_GROUNDS, THE_MARKET, 0x025A}}, - {{EntranceType::Overworld, THE_MARKET, TOT_ENTRANCE, 0x0171}, - {EntranceType::Overworld, TOT_ENTRANCE, THE_MARKET, 0x025E}}, - {{EntranceType::Overworld, KAKARIKO_VILLAGE, THE_GRAVEYARD, 0x00E4}, - {EntranceType::Overworld, THE_GRAVEYARD, KAKARIKO_VILLAGE, 0x0195}}, - {{EntranceType::Overworld, KAK_BEHIND_GATE, DEATH_MOUNTAIN_TRAIL, 0x013D}, - {EntranceType::Overworld, DEATH_MOUNTAIN_TRAIL, KAK_BEHIND_GATE, 0x0191}}, - {{EntranceType::Overworld, DEATH_MOUNTAIN_TRAIL, GORON_CITY, 0x014D}, - {EntranceType::Overworld, GORON_CITY, DEATH_MOUNTAIN_TRAIL, 0x01B9}}, - {{EntranceType::Overworld, GC_DARUNIAS_CHAMBER, DMC_LOWER_LOCAL, 0x0246}, - {EntranceType::Overworld, DMC_LOWER_NEARBY, GC_DARUNIAS_CHAMBER, 0x01C1}}, - {{EntranceType::Overworld, DEATH_MOUNTAIN_SUMMIT, DMC_UPPER_LOCAL, 0x0147}, - {EntranceType::Overworld, DMC_UPPER_NEARBY, DEATH_MOUNTAIN_SUMMIT, 0x01BD}}, - {{EntranceType::Overworld, ZR_BEHIND_WATERFALL, ZORAS_DOMAIN, 0x0108}, - {EntranceType::Overworld, ZORAS_DOMAIN, ZR_BEHIND_WATERFALL, 0x019D}}, - {{EntranceType::Overworld, ZD_BEHIND_KING_ZORA, ZORAS_FOUNTAIN, 0x0225}, - {EntranceType::Overworld, ZORAS_FOUNTAIN, ZD_BEHIND_KING_ZORA, 0x01A1}}, + { { EntranceType::Overworld, RR_KOKIRI_FOREST, RR_LW_BRIDGE_FROM_FOREST, 0x05E0 }, + { EntranceType::Overworld, RR_LW_BRIDGE, RR_KOKIRI_FOREST, 0x020D } }, + { { EntranceType::Overworld, RR_KOKIRI_FOREST, RR_THE_LOST_WOODS, 0x011E }, + { EntranceType::Overworld, RR_LW_FOREST_EXIT, RR_KOKIRI_FOREST, 0x0286 } }, + { { EntranceType::Overworld, RR_THE_LOST_WOODS, RR_GC_WOODS_WARP, 0x04E2 }, + { EntranceType::Overworld, RR_GC_WOODS_WARP, RR_THE_LOST_WOODS, 0x04D6 } }, + { { EntranceType::Overworld, RR_THE_LOST_WOODS, RR_ZORAS_RIVER, 0x01DD }, + { EntranceType::Overworld, RR_ZORAS_RIVER, RR_THE_LOST_WOODS, 0x04DA } }, + { { EntranceType::Overworld, RR_LW_BEYOND_MIDO, RR_SFM_ENTRYWAY, 0x00FC }, + { EntranceType::Overworld, RR_SFM_ENTRYWAY, RR_LW_BEYOND_MIDO, 0x01A9 } }, + { { EntranceType::Overworld, RR_LW_BRIDGE, RR_HYRULE_FIELD, 0x0185 }, + { EntranceType::Overworld, RR_HYRULE_FIELD, RR_LW_BRIDGE, 0x04DE } }, + { { EntranceType::Overworld, RR_HYRULE_FIELD, RR_LAKE_HYLIA, 0x0102 }, + { EntranceType::Overworld, RR_LAKE_HYLIA, RR_HYRULE_FIELD, 0x0189 } }, + { { EntranceType::Overworld, RR_HYRULE_FIELD, RR_GERUDO_VALLEY, 0x0117 }, + { EntranceType::Overworld, RR_GERUDO_VALLEY, RR_HYRULE_FIELD, 0x018D } }, + { { EntranceType::Overworld, RR_HYRULE_FIELD, RR_MARKET_ENTRANCE, 0x0276 }, + { EntranceType::Overworld, RR_MARKET_ENTRANCE, RR_HYRULE_FIELD, 0x01FD } }, + { { EntranceType::Overworld, RR_HYRULE_FIELD, RR_KAKARIKO_VILLAGE, 0x00DB }, + { EntranceType::Overworld, RR_KAKARIKO_VILLAGE, RR_HYRULE_FIELD, 0x017D } }, + { { EntranceType::Overworld, RR_HYRULE_FIELD, RR_ZR_FRONT, 0x00EA }, + { EntranceType::Overworld, RR_ZR_FRONT, RR_HYRULE_FIELD, 0x0181 } }, + { { EntranceType::Overworld, RR_HYRULE_FIELD, RR_LON_LON_RANCH, 0x0157 }, + { EntranceType::Overworld, RR_LON_LON_RANCH, RR_HYRULE_FIELD, 0x01F9 } }, + { { EntranceType::Overworld, RR_LAKE_HYLIA, RR_ZORAS_DOMAIN, 0x0328 }, + { EntranceType::Overworld, RR_ZORAS_DOMAIN, RR_LAKE_HYLIA, 0x0560 } }, + { { EntranceType::Overworld, RR_GV_FORTRESS_SIDE, RR_GERUDO_FORTRESS, 0x0129 }, + { EntranceType::Overworld, RR_GERUDO_FORTRESS, RR_GV_FORTRESS_SIDE, 0x022D } }, + { { EntranceType::Overworld, RR_GF_OUTSIDE_GATE, RR_WASTELAND_NEAR_FORTRESS, 0x0130 }, + { EntranceType::Overworld, RR_WASTELAND_NEAR_FORTRESS, RR_GF_OUTSIDE_GATE, 0x03AC } }, + { { EntranceType::Overworld, RR_WASTELAND_NEAR_COLOSSUS, RR_DESERT_COLOSSUS, 0x0123 }, + { EntranceType::Overworld, RR_DESERT_COLOSSUS, RR_WASTELAND_NEAR_COLOSSUS, 0x0365 } }, + { { EntranceType::Overworld, RR_MARKET_ENTRANCE, RR_THE_MARKET, 0x00B1 }, + { EntranceType::Overworld, RR_THE_MARKET, RR_MARKET_ENTRANCE, 0x0033 } }, + { { EntranceType::Overworld, RR_THE_MARKET, RR_CASTLE_GROUNDS, 0x0138 }, + { EntranceType::Overworld, RR_CASTLE_GROUNDS, RR_THE_MARKET, 0x025A } }, + { { EntranceType::Overworld, RR_THE_MARKET, RR_TOT_ENTRANCE, 0x0171 }, + { EntranceType::Overworld, RR_TOT_ENTRANCE, RR_THE_MARKET, 0x025E } }, + { { EntranceType::Overworld, RR_KAKARIKO_VILLAGE, RR_THE_GRAVEYARD, 0x00E4 }, + { EntranceType::Overworld, RR_THE_GRAVEYARD, RR_KAKARIKO_VILLAGE, 0x0195 } }, + { { EntranceType::Overworld, RR_KAK_BEHIND_GATE, RR_DEATH_MOUNTAIN_TRAIL, 0x013D }, + { EntranceType::Overworld, RR_DEATH_MOUNTAIN_TRAIL, RR_KAK_BEHIND_GATE, 0x0191 } }, + { { EntranceType::Overworld, RR_DEATH_MOUNTAIN_TRAIL, RR_GORON_CITY, 0x014D }, + { EntranceType::Overworld, RR_GORON_CITY, RR_DEATH_MOUNTAIN_TRAIL, 0x01B9 } }, + { { EntranceType::Overworld, RR_GC_DARUNIAS_CHAMBER, RR_DMC_LOWER_LOCAL, 0x0246 }, + { EntranceType::Overworld, RR_DMC_LOWER_NEARBY, RR_GC_DARUNIAS_CHAMBER, 0x01C1 } }, + { { EntranceType::Overworld, RR_DEATH_MOUNTAIN_SUMMIT, RR_DMC_UPPER_LOCAL, 0x0147 }, + { EntranceType::Overworld, RR_DMC_UPPER_NEARBY, RR_DEATH_MOUNTAIN_SUMMIT, 0x01BD } }, + { { EntranceType::Overworld, RR_ZR_BEHIND_WATERFALL, RR_ZORAS_DOMAIN, 0x0108 }, + { EntranceType::Overworld, RR_ZORAS_DOMAIN, RR_ZR_BEHIND_WATERFALL, 0x019D } }, + { { EntranceType::Overworld, RR_ZD_BEHIND_KING_ZORA, RR_ZORAS_FOUNTAIN, 0x0225 }, + { EntranceType::Overworld, RR_ZORAS_FOUNTAIN, RR_ZD_BEHIND_KING_ZORA, 0x01A1 } }, - {{EntranceType::Overworld, GV_LOWER_STREAM, LAKE_HYLIA, 0x0219}, NO_RETURN_ENTRANCE}, + { { EntranceType::Overworld, RR_GV_LOWER_STREAM, RR_LAKE_HYLIA, 0x0219 }, NO_RETURN_ENTRANCE }, - {{EntranceType::OwlDrop, LH_OWL_FLIGHT, HYRULE_FIELD, 0x027E}, NO_RETURN_ENTRANCE}, - {{EntranceType::OwlDrop, DMT_OWL_FLIGHT, KAK_IMPAS_ROOFTOP, 0x0554}, NO_RETURN_ENTRANCE}, + { { EntranceType::OwlDrop, RR_LH_OWL_FLIGHT, RR_HYRULE_FIELD, 0x027E }, NO_RETURN_ENTRANCE }, + { { EntranceType::OwlDrop, RR_DMT_OWL_FLIGHT, RR_KAK_IMPAS_ROOFTOP, 0x0554 }, NO_RETURN_ENTRANCE }, - {{EntranceType::Spawn, CHILD_SPAWN, KF_LINKS_HOUSE, 0x00BB}, NO_RETURN_ENTRANCE}, - {{EntranceType::Spawn, ADULT_SPAWN, TEMPLE_OF_TIME, 0x0282}, NO_RETURN_ENTRANCE}, // 0x282 is an unused entrance index repurposed to differentiate between - // Adult Spawn and prelude of light (normally they both use 0x5F4) - {{EntranceType::WarpSong, MINUET_OF_FOREST_WARP, SACRED_FOREST_MEADOW, 0x0600}, NO_RETURN_ENTRANCE}, - {{EntranceType::WarpSong, BOLERO_OF_FIRE_WARP, DMC_CENTRAL_LOCAL, 0x04F6}, NO_RETURN_ENTRANCE}, - {{EntranceType::WarpSong, SERENADE_OF_WATER_WARP, LAKE_HYLIA, 0x0604}, NO_RETURN_ENTRANCE}, - {{EntranceType::WarpSong, REQUIEM_OF_SPIRIT_WARP, DESERT_COLOSSUS, 0x01F1}, NO_RETURN_ENTRANCE}, - {{EntranceType::WarpSong, NOCTURNE_OF_SHADOW_WARP, GRAVEYARD_WARP_PAD_REGION, 0x0568}, NO_RETURN_ENTRANCE}, - {{EntranceType::WarpSong, PRELUDE_OF_LIGHT_WARP, TEMPLE_OF_TIME, 0x05F4}, NO_RETURN_ENTRANCE}, + { { EntranceType::Spawn, RR_CHILD_SPAWN, RR_KF_LINKS_HOUSE, 0x00BB }, NO_RETURN_ENTRANCE }, + { { EntranceType::Spawn, RR_ADULT_SPAWN, RR_TEMPLE_OF_TIME, 0x0282 }, + NO_RETURN_ENTRANCE }, // 0x282 is an unused entrance index repurposed to differentiate between + // Adult Spawn and prelude of light (normally they both use 0x5F4) + { { EntranceType::WarpSong, RR_MINUET_OF_FOREST_WARP, RR_SACRED_FOREST_MEADOW, 0x0600 }, NO_RETURN_ENTRANCE }, + { { EntranceType::WarpSong, RR_BOLERO_OF_FIRE_WARP, RR_DMC_CENTRAL_LOCAL, 0x04F6 }, NO_RETURN_ENTRANCE }, + { { EntranceType::WarpSong, RR_SERENADE_OF_WATER_WARP, RR_LAKE_HYLIA, 0x0604 }, NO_RETURN_ENTRANCE }, + { { EntranceType::WarpSong, RR_REQUIEM_OF_SPIRIT_WARP, RR_DESERT_COLOSSUS, 0x01F1 }, NO_RETURN_ENTRANCE }, + { { EntranceType::WarpSong, RR_NOCTURNE_OF_SHADOW_WARP, RR_GRAVEYARD_WARP_PAD_REGION, 0x0568 }, + NO_RETURN_ENTRANCE }, + { { EntranceType::WarpSong, RR_PRELUDE_OF_LIGHT_WARP, RR_TEMPLE_OF_TIME, 0x05F4 }, NO_RETURN_ENTRANCE }, - {{EntranceType::ChildBoss, DEKU_TREE_BOSS_ENTRYWAY, DEKU_TREE_BOSS_ROOM, 0x040F}, - {EntranceType::ChildBoss, DEKU_TREE_BOSS_ROOM, DEKU_TREE_BOSS_ENTRYWAY, 0x0252, 0x0457}}, - {{EntranceType::ChildBoss, DODONGOS_CAVERN_BOSS_ENTRYWAY, DODONGOS_CAVERN_BOSS_ROOM, 0x040B}, - {EntranceType::ChildBoss, DODONGOS_CAVERN_BOSS_ROOM, DODONGOS_CAVERN_BOSS_ENTRYWAY, 0x00C5, 0x047A}}, - {{EntranceType::ChildBoss, JABU_JABUS_BELLY_BOSS_ENTRYWAY, JABU_JABUS_BELLY_BOSS_ROOM, 0x0301}, - {EntranceType::ChildBoss, JABU_JABUS_BELLY_BOSS_ROOM, JABU_JABUS_BELLY_BOSS_ENTRYWAY, 0x0407, 0x010E}}, - {{EntranceType::AdultBoss, FOREST_TEMPLE_BOSS_ENTRYWAY, FOREST_TEMPLE_BOSS_ROOM, 0x000C}, - {EntranceType::AdultBoss, FOREST_TEMPLE_BOSS_ROOM, FOREST_TEMPLE_BOSS_ENTRYWAY, 0x024E, 0x0608}}, - {{EntranceType::AdultBoss, FIRE_TEMPLE_BOSS_ENTRYWAY, FIRE_TEMPLE_BOSS_ROOM, 0x0305}, - {EntranceType::AdultBoss, FIRE_TEMPLE_BOSS_ROOM, FIRE_TEMPLE_BOSS_ENTRYWAY, 0x0175, 0x0564}}, - {{EntranceType::AdultBoss, WATER_TEMPLE_BOSS_ENTRYWAY, WATER_TEMPLE_BOSS_ROOM, 0x0417}, - {EntranceType::AdultBoss, WATER_TEMPLE_BOSS_ROOM, WATER_TEMPLE_BOSS_ENTRYWAY, 0x0423, 0x060C}}, - {{EntranceType::AdultBoss, SPIRIT_TEMPLE_BOSS_ENTRYWAY, SPIRIT_TEMPLE_BOSS_ROOM, 0x008D}, - {EntranceType::AdultBoss, SPIRIT_TEMPLE_BOSS_ROOM, SPIRIT_TEMPLE_BOSS_ENTRYWAY, 0x02F5, 0x0610}}, - {{EntranceType::AdultBoss, SHADOW_TEMPLE_BOSS_ENTRYWAY, SHADOW_TEMPLE_BOSS_ROOM, 0x0413}, - {EntranceType::AdultBoss, SHADOW_TEMPLE_BOSS_ROOM, SHADOW_TEMPLE_BOSS_ENTRYWAY, 0x02B2, 0x0580}}, + { { EntranceType::ChildBoss, RR_DEKU_TREE_BOSS_ENTRYWAY, RR_DEKU_TREE_BOSS_ROOM, 0x040F }, + { EntranceType::ChildBoss, RR_DEKU_TREE_BOSS_ROOM, RR_DEKU_TREE_BOSS_ENTRYWAY, 0x0252, 0x0457 } }, + { { EntranceType::ChildBoss, RR_DODONGOS_CAVERN_BOSS_ENTRYWAY, RR_DODONGOS_CAVERN_BOSS_ROOM, 0x040B }, + { EntranceType::ChildBoss, RR_DODONGOS_CAVERN_BOSS_ROOM, RR_DODONGOS_CAVERN_BOSS_ENTRYWAY, 0x00C5, 0x047A } }, + { { EntranceType::ChildBoss, RR_JABU_JABUS_BELLY_BOSS_ENTRYWAY, RR_JABU_JABUS_BELLY_BOSS_ROOM, 0x0301 }, + { EntranceType::ChildBoss, RR_JABU_JABUS_BELLY_BOSS_ROOM, RR_JABU_JABUS_BELLY_BOSS_ENTRYWAY, 0x0407, 0x010E } }, + { { EntranceType::AdultBoss, RR_FOREST_TEMPLE_BOSS_ENTRYWAY, RR_FOREST_TEMPLE_BOSS_ROOM, 0x000C }, + { EntranceType::AdultBoss, RR_FOREST_TEMPLE_BOSS_ROOM, RR_FOREST_TEMPLE_BOSS_ENTRYWAY, 0x024E, 0x0608 } }, + { { EntranceType::AdultBoss, RR_FIRE_TEMPLE_BOSS_ENTRYWAY, RR_FIRE_TEMPLE_BOSS_ROOM, 0x0305 }, + { EntranceType::AdultBoss, RR_FIRE_TEMPLE_BOSS_ROOM, RR_FIRE_TEMPLE_BOSS_ENTRYWAY, 0x0175, 0x0564 } }, + { { EntranceType::AdultBoss, RR_WATER_TEMPLE_BOSS_ENTRYWAY, RR_WATER_TEMPLE_BOSS_ROOM, 0x0417 }, + { EntranceType::AdultBoss, RR_WATER_TEMPLE_BOSS_ROOM, RR_WATER_TEMPLE_BOSS_ENTRYWAY, 0x0423, 0x060C } }, + { { EntranceType::AdultBoss, RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY, RR_SPIRIT_TEMPLE_BOSS_ROOM, 0x008D }, + { EntranceType::AdultBoss, RR_SPIRIT_TEMPLE_BOSS_ROOM, RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY, 0x02F5, 0x0610 } }, + { { EntranceType::AdultBoss, RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, RR_SHADOW_TEMPLE_BOSS_ROOM, 0x0413 }, + { EntranceType::AdultBoss, RR_SHADOW_TEMPLE_BOSS_ROOM, RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, 0x02B2, 0x0580 } }, }; std::map priorityEntranceTable = { - {"Bolero", {{DMC_CENTRAL_LOCAL}, {EntranceType::OwlDrop, EntranceType::WarpSong}}}, - {"Nocturne", {{GRAVEYARD_WARP_PAD_REGION}, {EntranceType::OwlDrop, EntranceType::Spawn, EntranceType::WarpSong}}}, - {"Requiem", {{DESERT_COLOSSUS, DESERT_COLOSSUS_FROM_SPIRIT_ENTRYWAY}, {EntranceType::OwlDrop, EntranceType::Spawn, EntranceType::WarpSong}}}, + { "Bolero", { { RR_DMC_CENTRAL_LOCAL }, { EntranceType::OwlDrop, EntranceType::WarpSong } } }, + { "Nocturne", + { { RR_GRAVEYARD_WARP_PAD_REGION }, { EntranceType::OwlDrop, EntranceType::Spawn, EntranceType::WarpSong } } }, + { "Requiem", + { { RR_DESERT_COLOSSUS, RR_DESERT_COLOSSUS_FROM_SPIRIT_ENTRYWAY }, + { EntranceType::OwlDrop, EntranceType::Spawn, EntranceType::WarpSong } } }, }; entranceShuffleFailure = false; @@ -1008,16 +1022,16 @@ int ShuffleAllEntrances() { // If forest is closed, ensure Ghoma is inside the Deku tree // Deku tree being in its vanilla location is handled below if (Settings::OpenForest.Is(OPENFOREST_CLOSED) && !(Settings::ShuffleOverworldEntrances || Settings::ShuffleInteriorEntrances)) { - FilterAndEraseFromPool(entrancePools[EntranceType::Boss], [](const Entrance* entrance){return entrance->GetParentRegionKey() == DEKU_TREE_BOSS_ENTRYWAY && - entrance->GetConnectedRegionKey() == DEKU_TREE_BOSS_ROOM;}); + FilterAndEraseFromPool(entrancePools[EntranceType::Boss], [](const Entrance* entrance){return entrance->GetParentRegionKey() == RR_DEKU_TREE_BOSS_ENTRYWAY && + entrance->GetConnectedRegionKey() == RR_DEKU_TREE_BOSS_ROOM;}); } } else { entrancePools[EntranceType::ChildBoss] = GetShuffleableEntrances(EntranceType::ChildBoss); entrancePools[EntranceType::AdultBoss] = GetShuffleableEntrances(EntranceType::AdultBoss); // If forest is closed, ensure Ghoma is inside the Deku tree if (Settings::OpenForest.Is(OPENFOREST_CLOSED) && !(Settings::ShuffleOverworldEntrances || Settings::ShuffleInteriorEntrances)) { - FilterAndEraseFromPool(entrancePools[EntranceType::ChildBoss], [](const Entrance* entrance){return entrance->GetParentRegionKey() == DEKU_TREE_BOSS_ENTRYWAY && - entrance->GetConnectedRegionKey() == DEKU_TREE_BOSS_ROOM;}); + FilterAndEraseFromPool(entrancePools[EntranceType::ChildBoss], [](const Entrance* entrance){return entrance->GetParentRegionKey() == RR_DEKU_TREE_BOSS_ENTRYWAY && + entrance->GetConnectedRegionKey() == RR_DEKU_TREE_BOSS_ROOM;}); } } } @@ -1031,8 +1045,8 @@ int ShuffleAllEntrances() { } //If forest is closed don't allow a forest escape via spirit temple hands if (Settings::OpenForest.Is(OPENFOREST_CLOSED) && !(Settings::ShuffleOverworldEntrances || Settings::ShuffleInteriorEntrances)) { - FilterAndEraseFromPool(entrancePools[EntranceType::Dungeon], [](const Entrance* entrance){return entrance->GetParentRegionKey() == KF_OUTSIDE_DEKU_TREE && - entrance->GetConnectedRegionKey() == DEKU_TREE_ENTRYWAY;}); + FilterAndEraseFromPool(entrancePools[EntranceType::Dungeon], [](const Entrance* entrance){return entrance->GetParentRegionKey() == RR_KF_OUTSIDE_DEKU_TREE && + entrance->GetConnectedRegionKey() == RR_DEKU_TREE_ENTRYWAY;}); } if (Settings::DecoupleEntrances) { for (Entrance* entrance : entrancePools[EntranceType::Dungeon]) { @@ -1072,8 +1086,8 @@ int ShuffleAllEntrances() { entrancePools[EntranceType::Overworld] = GetShuffleableEntrances(EntranceType::Overworld, excludeOverworldReverse); // Only shuffle GV Lower Stream -> Lake Hylia if decoupled entrances are on if (!Settings::DecoupleEntrances) { - FilterAndEraseFromPool(entrancePools[EntranceType::Overworld], [](const Entrance* entrance){return entrance->GetParentRegionKey() == GV_LOWER_STREAM && - entrance->GetConnectedRegionKey() == LAKE_HYLIA;}); + FilterAndEraseFromPool(entrancePools[EntranceType::Overworld], [](const Entrance* entrance){return entrance->GetParentRegionKey() == RR_GV_LOWER_STREAM && + entrance->GetConnectedRegionKey() == RR_LAKE_HYLIA;}); } } @@ -1135,7 +1149,7 @@ int ShuffleAllEntrances() { if (poolType == EntranceType::OwlDrop) { validTargetTypes = {EntranceType::WarpSong, EntranceType::OwlDrop, EntranceType::Overworld, EntranceType::Extra}; - oneWayTargetEntrancePools[poolType] = BuildOneWayTargets(validTargetTypes, {std::make_pair(PRELUDE_OF_LIGHT_WARP, TEMPLE_OF_TIME)}); + oneWayTargetEntrancePools[poolType] = BuildOneWayTargets(validTargetTypes, {std::make_pair(RR_PRELUDE_OF_LIGHT_WARP, RR_TEMPLE_OF_TIME)}); // Owl Drops are only accessible as child, so targets should reflect that for (Entrance* target : oneWayTargetEntrancePools[poolType]) { target->SetCondition([]{return Logic::IsChild;}); diff --git a/soh/soh/Enhancements/randomizer/3drando/entrance.hpp b/soh/soh/Enhancements/randomizer/3drando/entrance.hpp index b6a5cb432..d9c62a5fb 100644 --- a/soh/soh/Enhancements/randomizer/3drando/entrance.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/entrance.hpp @@ -1,6 +1,5 @@ #pragma once -#include "keys.hpp" #include "location_access.hpp" #include @@ -38,7 +37,7 @@ enum class EntranceType { class Entrance { public: - Entrance(uint32_t connectedRegion_, std::vector conditions_met_) + Entrance(RandomizerRegion connectedRegion_, std::vector conditions_met_) : connectedRegion(connectedRegion_) { conditions_met.resize(2); for (size_t i = 0; i < conditions_met_.size(); i++) { @@ -127,10 +126,10 @@ public: age = true; Logic::UpdateHelpers(); - return GetConditionsMet() && (connectedRegion != NONE || passAnyway); + return GetConditionsMet() && (connectedRegion != RR_NONE || passAnyway); } - uint32_t GetConnectedRegionKey() const { + RandomizerRegion GetConnectedRegionKey() const { return connectedRegion; } @@ -138,11 +137,11 @@ public: return AreaTable(connectedRegion); } - void SetParentRegion(uint32_t newParent) { + void SetParentRegion(RandomizerRegion newParent) { parentRegion = newParent; } - uint32_t GetParentRegionKey() const { + RandomizerRegion GetParentRegionKey() const { return parentRegion; } @@ -150,7 +149,7 @@ public: return AreaTable(parentRegion); } - void SetNewEntrance(uint32_t newRegion) { + void SetNewEntrance(RandomizerRegion newRegion) { connectedRegion = newRegion; } @@ -230,15 +229,15 @@ public: return reverse; } - void Connect(uint32_t newConnectedRegion) { + void Connect(RandomizerRegion newConnectedRegion) { connectedRegion = newConnectedRegion; AreaTable(newConnectedRegion)->entrances.push_front(this); } - uint32_t Disconnect() { + RandomizerRegion Disconnect() { AreaTable(connectedRegion)->entrances.remove_if([this](const auto entrance){return this == entrance;}); - uint32_t previouslyConnected = connectedRegion; - connectedRegion = NONE; + RandomizerRegion previouslyConnected = connectedRegion; + connectedRegion = RR_NONE; return previouslyConnected; } @@ -248,8 +247,8 @@ public: } Entrance* GetNewTarget() { - AreaTable(ROOT)->AddExit(ROOT, connectedRegion, []{return true;}); - Entrance* targetEntrance = AreaTable(ROOT)->GetExit(connectedRegion); + AreaTable(RR_ROOT)->AddExit(RR_ROOT, connectedRegion, []{return true;}); + Entrance* targetEntrance = AreaTable(RR_ROOT)->GetExit(connectedRegion); targetEntrance->SetReplacement(this); targetEntrance->SetName(GetParentRegion()->regionName + " -> " + GetConnectedRegion()->regionName); return targetEntrance; @@ -264,8 +263,8 @@ public: } private: - uint32_t parentRegion; - uint32_t connectedRegion; + RandomizerRegion parentRegion; + RandomizerRegion connectedRegion; std::vector conditions_met; //Entrance Randomizer stuff diff --git a/soh/soh/Enhancements/randomizer/3drando/fill.cpp b/soh/soh/Enhancements/randomizer/3drando/fill.cpp index f9d3a9592..b0a99d85d 100644 --- a/soh/soh/Enhancements/randomizer/3drando/fill.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/fill.cpp @@ -2,7 +2,7 @@ #include "custom_messages.hpp" #include "dungeon.hpp" -#include "item_location.hpp" +#include "../context.h" #include "item_pool.hpp" #include "location_access.hpp" #include "logic.hpp" @@ -13,6 +13,8 @@ #include "hint_list.hpp" #include "entrance.hpp" #include "shops.hpp" +//#include "debug.hpp" +#include "soh/Enhancements/randomizer/static_data.h" #include #include @@ -25,16 +27,18 @@ using namespace Settings; static bool placementFailure = false; static void RemoveStartingItemsFromPool() { - for (uint32_t startingItem : StartingInventory) { + for (RandomizerGet startingItem : StartingInventory) { for (size_t i = 0; i < ItemPool.size(); i++) { - if (startingItem == BIGGORON_SWORD) { - if (ItemPool[i] == GIANTS_KNIFE || ItemPool[i] == BIGGORON_SWORD) { + if (startingItem == RG_BIGGORON_SWORD) { + if (ItemPool[i] == RG_GIANTS_KNIFE || ItemPool[i] == RG_BIGGORON_SWORD) { ItemPool[i] = GetJunkItem(); } continue; - } else if (startingItem == ItemPool[i] || (ItemTable(startingItem).IsBottleItem() && ItemTable(ItemPool[i]).IsBottleItem())) { - if (AdditionalHeartContainers > 0 && (startingItem == PIECE_OF_HEART || startingItem == TREASURE_GAME_HEART)) { - ItemPool[i] = HEART_CONTAINER; + } else if (startingItem == ItemPool[i] || (Rando::StaticData::RetrieveItem(startingItem).IsBottleItem() && + Rando::StaticData::RetrieveItem(ItemPool[i]).IsBottleItem())) { + if (AdditionalHeartContainers > 0 && + (startingItem == RG_PIECE_OF_HEART || startingItem == RG_TREASURE_GAME_HEART)) { + ItemPool[i] = RG_HEART_CONTAINER; AdditionalHeartContainers--; } else { ItemPool[i] = GetJunkItem(); @@ -73,30 +77,30 @@ static bool UpdateToDAccess(Entrance* entrance, SearchMode mode) { //special check for temple of time bool propogateTimeTravel = mode != SearchMode::TimePassAccess && mode != SearchMode::TempleOfTimeAccess; - if (!AreaTable(ROOT)->Adult() && AreaTable(TOT_BEYOND_DOOR_OF_TIME)->Child() && propogateTimeTravel) { - AreaTable(ROOT)->adultDay = AreaTable(TOT_BEYOND_DOOR_OF_TIME)->childDay; - AreaTable(ROOT)->adultNight = AreaTable(TOT_BEYOND_DOOR_OF_TIME)->childNight; - } else if (!AreaTable(ROOT)->Child() && AreaTable(TOT_BEYOND_DOOR_OF_TIME)->Adult() && propogateTimeTravel){ - AreaTable(ROOT)->childDay = AreaTable(TOT_BEYOND_DOOR_OF_TIME)->adultDay; - AreaTable(ROOT)->childNight = AreaTable(TOT_BEYOND_DOOR_OF_TIME)->adultNight; + if (!AreaTable(RR_ROOT)->Adult() && AreaTable(RR_TOT_BEYOND_DOOR_OF_TIME)->Child() && propogateTimeTravel) { + 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){ + AreaTable(RR_ROOT)->childDay = AreaTable(RR_TOT_BEYOND_DOOR_OF_TIME)->adultDay; + AreaTable(RR_ROOT)->childNight = AreaTable(RR_TOT_BEYOND_DOOR_OF_TIME)->adultNight; } 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) { +static void ValidateWorldChecks(SearchMode& mode, bool checkPoeCollectorAccess, bool checkOtherEntranceAccess, std::vector& areaPool) { // Condition for validating Temple of Time Access - if (mode == SearchMode::TempleOfTimeAccess && ((Settings::ResolvedStartingAge == AGE_CHILD && AreaTable(TEMPLE_OF_TIME)->Adult()) || (Settings::ResolvedStartingAge == AGE_ADULT && AreaTable(TEMPLE_OF_TIME)->Child()) || !checkOtherEntranceAccess)) { + if (mode == SearchMode::TempleOfTimeAccess && ((Settings::ResolvedStartingAge == AGE_CHILD && AreaTable(RR_TEMPLE_OF_TIME)->Adult()) || (Settings::ResolvedStartingAge == AGE_ADULT && AreaTable(RR_TEMPLE_OF_TIME)->Child()) || !checkOtherEntranceAccess)) { mode = SearchMode::ValidStartingRegion; } // Condition for validating a valid starting region if (mode == SearchMode::ValidStartingRegion) { - bool childAccess = Settings::ResolvedStartingAge == AGE_CHILD || AreaTable(TOT_BEYOND_DOOR_OF_TIME)->Child(); - bool adultAccess = Settings::ResolvedStartingAge == AGE_ADULT || AreaTable(TOT_BEYOND_DOOR_OF_TIME)->Adult(); + bool childAccess = Settings::ResolvedStartingAge == AGE_CHILD || AreaTable(RR_TOT_BEYOND_DOOR_OF_TIME)->Child(); + bool adultAccess = Settings::ResolvedStartingAge == AGE_ADULT || AreaTable(RR_TOT_BEYOND_DOOR_OF_TIME)->Adult(); - Area* kokiri = AreaTable(KOKIRI_FOREST); - Area* kakariko = AreaTable(KAKARIKO_VILLAGE); + Area* kokiri = AreaTable(RR_KOKIRI_FOREST); + Area* kakariko = AreaTable(RR_KAKARIKO_VILLAGE); if ((childAccess && (kokiri->Child() || kakariko->Child())) || (adultAccess && (kokiri->Adult() || kakariko->Adult())) || @@ -107,21 +111,21 @@ static void ValidateWorldChecks(SearchMode& mode, bool checkPoeCollectorAccess, } } // Condition for validating Poe Collector Access - if (mode == SearchMode::PoeCollectorAccess && (AreaTable(MARKET_GUARD_HOUSE)->Adult() || !checkPoeCollectorAccess)) { + if (mode == SearchMode::PoeCollectorAccess && (AreaTable(RR_MARKET_GUARD_HOUSE)->Adult() || !checkPoeCollectorAccess)) { // Apply all items that are necessary for checking all location access - std::vector itemsToPlace = - FilterFromPool(ItemPool, [](const auto i) { return ItemTable(i).IsAdvancement(); }); - for (uint32_t unplacedItem : itemsToPlace) { - ItemTable(unplacedItem).ApplyEffect(); + std::vector itemsToPlace = + FilterFromPool(ItemPool, [](const auto i) { return Rando::StaticData::RetrieveItem(i).IsAdvancement(); }); + for (RandomizerGet unplacedItem : itemsToPlace) { + Rando::StaticData::RetrieveItem(unplacedItem).ApplyEffect(); } // Reset access as the non-starting age if (Settings::ResolvedStartingAge == AGE_CHILD) { - for (uint32_t areaKey : areaPool) { + for (RandomizerRegion areaKey : areaPool) { AreaTable(areaKey)->adultDay = false; AreaTable(areaKey)->adultNight = false; } } else { - for (uint32_t areaKey : areaPool) { + for (RandomizerRegion areaKey : areaPool) { AreaTable(areaKey)->childDay = false; AreaTable(areaKey)->childNight = false; } @@ -134,6 +138,7 @@ static void ValidateWorldChecks(SearchMode& mode, bool checkPoeCollectorAccess, //Get the max number of tokens that can possibly be useful static int GetMaxGSCount() { + auto ctx = Rando::Context::GetInstance(); //If bridge or LACS is set to tokens, get how many are required int maxBridge = 0; int maxLACS = 0; @@ -147,23 +152,23 @@ static int GetMaxGSCount() { //Get the max amount of GS which could be useful from token reward locations int maxUseful = 0; //If the highest advancement item is a token, we know it is useless since it won't lead to an otherwise useful item - if (Location(KAK_100_GOLD_SKULLTULA_REWARD)->GetPlacedItem().IsAdvancement() && Location(KAK_100_GOLD_SKULLTULA_REWARD)->GetPlacedItem().GetItemType() != ITEMTYPE_TOKEN) { + if (ctx->GetItemLocation(RC_KAK_100_GOLD_SKULLTULA_REWARD)->GetPlacedItem().IsAdvancement() && ctx->GetItemLocation(RC_KAK_100_GOLD_SKULLTULA_REWARD)->GetPlacedItem().GetItemType() != ITEMTYPE_TOKEN) { maxUseful = 100; - } - else if (Location(KAK_50_GOLD_SKULLTULA_REWARD)->GetPlacedItem().IsAdvancement() && Location(KAK_50_GOLD_SKULLTULA_REWARD)->GetPlacedItem().GetItemType() != ITEMTYPE_TOKEN) { - maxUseful = 50; - } - else if (Location(KAK_40_GOLD_SKULLTULA_REWARD)->GetPlacedItem().IsAdvancement() && Location(KAK_40_GOLD_SKULLTULA_REWARD)->GetPlacedItem().GetItemType() != ITEMTYPE_TOKEN) { - maxUseful = 40; - } - else if (Location(KAK_30_GOLD_SKULLTULA_REWARD)->GetPlacedItem().IsAdvancement() && Location(KAK_30_GOLD_SKULLTULA_REWARD)->GetPlacedItem().GetItemType() != ITEMTYPE_TOKEN) { - maxUseful = 30; - } - else if (Location(KAK_20_GOLD_SKULLTULA_REWARD)->GetPlacedItem().IsAdvancement() && Location(KAK_20_GOLD_SKULLTULA_REWARD)->GetPlacedItem().GetItemType() != ITEMTYPE_TOKEN) { - maxUseful = 20; - } - else if (Location(KAK_10_GOLD_SKULLTULA_REWARD)->GetPlacedItem().IsAdvancement() && Location(KAK_10_GOLD_SKULLTULA_REWARD)->GetPlacedItem().GetItemType() != ITEMTYPE_TOKEN) { - maxUseful = 10; + } else if (ctx->GetItemLocation(RC_KAK_50_GOLD_SKULLTULA_REWARD)->GetPlacedItem().IsAdvancement() && + ctx->GetItemLocation(RC_KAK_50_GOLD_SKULLTULA_REWARD)->GetPlacedItem().GetItemType() != ITEMTYPE_TOKEN) { + maxUseful = 50; + } else if (ctx->GetItemLocation(RC_KAK_40_GOLD_SKULLTULA_REWARD)->GetPlacedItem().IsAdvancement() && + ctx->GetItemLocation(RC_KAK_40_GOLD_SKULLTULA_REWARD)->GetPlacedItem().GetItemType() != ITEMTYPE_TOKEN) { + maxUseful = 40; + } else if (ctx->GetItemLocation(RC_KAK_30_GOLD_SKULLTULA_REWARD)->GetPlacedItem().IsAdvancement() && + ctx->GetItemLocation(RC_KAK_30_GOLD_SKULLTULA_REWARD)->GetPlacedItem().GetItemType() != ITEMTYPE_TOKEN) { + maxUseful = 30; + } else if (ctx->GetItemLocation(RC_KAK_20_GOLD_SKULLTULA_REWARD)->GetPlacedItem().IsAdvancement() && + ctx->GetItemLocation(RC_KAK_20_GOLD_SKULLTULA_REWARD)->GetPlacedItem().GetItemType() != ITEMTYPE_TOKEN) { + maxUseful = 20; + } else if (ctx->GetItemLocation(RC_KAK_10_GOLD_SKULLTULA_REWARD)->GetPlacedItem().IsAdvancement() && + ctx->GetItemLocation(RC_KAK_10_GOLD_SKULLTULA_REWARD)->GetPlacedItem().GetItemType() != ITEMTYPE_TOKEN) { + maxUseful = 10; } //Return max of the two possible reasons tokens could be important, minus the tokens in the starting inventory return std::max(maxUseful, maxBridge) - StartingSkulltulaToken.Value(); @@ -182,34 +187,41 @@ std::string GetShopItemBaseName(std::string itemName) { return baseName; } -std::vector GetEmptyLocations(std::vector allowedLocations) { - return FilterFromPool(allowedLocations, [](const auto loc){ return Location(loc)->GetPlaceduint32_t() == NONE;}); +std::vector GetEmptyLocations(std::vector allowedLocations) { + auto ctx = Rando::Context::GetInstance(); + return FilterFromPool(allowedLocations, [ctx](const auto loc) { + return ctx->GetItemLocation(loc)->GetPlacedRandomizerGet() == RG_NONE; + }); } -std::vector GetAllEmptyLocations() { - return FilterFromPool(allLocations, [](const auto loc) { return Location(loc)->GetPlaceduint32_t() == NONE; }); +std::vector GetAllEmptyLocations() { + auto ctx = Rando::Context::GetInstance(); + return FilterFromPool(ctx->allLocations, [ctx](const auto loc) { + return ctx->GetItemLocation(loc)->GetPlacedRandomizerGet() == RG_NONE; + }); } //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*/, std::string ignore /*= ""*/, bool checkPoeCollectorAccess /*= false*/, bool checkOtherEntranceAccess /*= false*/) { - std::vector accessibleLocations; - // Reset all access to begin a new search - if (mode < SearchMode::ValidateWorld) { - ApplyStartingInventory(); +std::vector GetAccessibleLocations(const std::vector& allowedLocations, SearchMode mode /* = SearchMode::ReachabilitySearch*/, std::string ignore /*= ""*/, 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(); } Areas::AccessReset(); - LocationReset(); - std::vector areaPool = {ROOT}; + ctx->LocationReset(); + std::vector areaPool = {RR_ROOT}; if (mode == SearchMode::ValidateWorld) { mode = SearchMode::TimePassAccess; - AreaTable(ROOT)->childNight = true; - AreaTable(ROOT)->adultNight = true; - AreaTable(ROOT)->childDay = true; - AreaTable(ROOT)->adultDay = true; - allLocationsReachable = false; + AreaTable(RR_ROOT)->childNight = true; + AreaTable(RR_ROOT)->adultNight = true; + AreaTable(RR_ROOT)->childDay = true; + AreaTable(RR_ROOT)->adultDay = true; + ctx->allLocationsReachable = false; } //Variables for playthrough @@ -219,7 +231,7 @@ std::vector GetAccessibleLocations(const std::vector& allowe std::vector buyIgnores; //Variables for search - std::vector newItemLocations; + std::vector newItemLocations; bool updatedEvents = false; bool ageTimePropogated = false; bool firstIteration = true; @@ -236,12 +248,12 @@ std::vector GetAccessibleLocations(const std::vector& allowe ageTimePropogated = false; updatedEvents = false; - for (ItemLocation* location : newItemLocations) { + for (Rando::ItemLocation* location : newItemLocations) { location->ApplyPlacedItemEffect(); } newItemLocations.clear(); - std::vector itemSphere; + std::vector itemSphere; std::list entranceSphere; for (size_t i = 0; i < areaPool.size(); i++) { @@ -290,7 +302,7 @@ std::vector GetAccessibleLocations(const std::vector& allowe Area* exitArea = exit.GetConnectedRegion(); if (!exitArea->addedToPool && exit.ConditionsMet()) { exitArea->addedToPool = true; - areaPool.push_back(exit.Getuint32_t()); + areaPool.push_back(exit.GetConnectedRegionKey()); } // Add shuffled entrances to the entrance playthrough @@ -308,14 +320,14 @@ std::vector GetAccessibleLocations(const std::vector& allowe if (mode < SearchMode::ValidateWorld) { for (size_t k = 0; k < area->locations.size(); k++) { LocationAccess& locPair = area->locations[k]; - uint32_t loc = locPair.GetLocation(); - ItemLocation* location = Location(loc); + RandomizerCheck loc = locPair.GetLocation(); + Rando::ItemLocation* location = ctx->GetItemLocation(loc); if (!location->IsAddedToPool() && locPair.ConditionsMet()) { location->AddToPool(); - if (location->GetPlaceduint32_t() == NONE) { + if (location->GetPlacedRandomizerGet() == 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 @@ -348,7 +360,7 @@ std::vector GetAccessibleLocations(const std::vector& allowe //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 (!playthroughBeatable && location->GetPlacedItem().IsAdvancement()) { + if (!ctx->playthroughBeatable && location->GetPlacedItem().IsAdvancement()) { ItemType type = location->GetPlacedItem().GetItemType(); std::string itemName(location->GetPlacedItemName().GetEnglish()); bool bombchus = itemName.find("Bombchu") != std::string::npos; //Is a bombchu location @@ -391,15 +403,15 @@ std::vector GetAccessibleLocations(const std::vector& allowe } } //Triforce has been found, seed is beatable, nothing else in this or future spheres matters - else if (location->GetPlaceduint32_t() == TRIFORCE) { + else if (location->GetPlacedRandomizerGet() == RG_TRIFORCE) { itemSphere.clear(); itemSphere.push_back(loc); - playthroughBeatable = true; + ctx->playthroughBeatable = true; } } //All we care about is if the game is beatable, used to pare down playthrough - else if (location->GetPlaceduint32_t() == TRIFORCE && mode == SearchMode::CheckBeatable) { - playthroughBeatable = true; + else if (location->GetPlacedRandomizerGet() == RG_TRIFORCE && mode == SearchMode::CheckBeatable) { + ctx->playthroughBeatable = true; return {}; //Return early for efficiency } } @@ -408,7 +420,7 @@ std::vector GetAccessibleLocations(const std::vector& allowe } if (mode == SearchMode::GeneratePlaythrough && itemSphere.size() > 0) { - playthroughLocations.push_back(itemSphere); + ctx->playthroughLocations.push_back(itemSphere); } if (mode == SearchMode::GeneratePlaythrough && entranceSphere.size() > 0 && !noRandomEntrances) { playthroughEntrances.push_back(entranceSphere); @@ -417,12 +429,14 @@ std::vector GetAccessibleLocations(const std::vector& allowe //Check to see if all locations were reached if (mode == SearchMode::AllLocationsReachable) { - allLocationsReachable = true; - for (const uint32_t loc : allLocations) { - if (!Location(loc)->IsAddedToPool()) { - allLocationsReachable = false; - auto message = "Location " + Location(loc)->GetName() + " not reachable\n"; - SPDLOG_DEBUG(message); + ctx->allLocationsReachable = true; + for (const RandomizerCheck loc : ctx->allLocations) { + if (!ctx->GetItemLocation(loc)->IsAddedToPool()) { + ctx->allLocationsReachable = false; + auto message = "Location " + + Rando::StaticData::GetLocation(ctx->GetItemLocation(loc)->GetRandomizerCheck())->GetName() + + " not reachable\n"; + SPDLOG_DEBUG(message); #ifndef ENABLE_DEBUG break; #endif @@ -431,9 +445,9 @@ std::vector GetAccessibleLocations(const std::vector& allowe return {}; } - erase_if(accessibleLocations, [&allowedLocations](uint32_t loc){ - for (uint32_t allowedLocation : allowedLocations) { - if (loc == allowedLocation || Location(loc)->GetPlaceduint32_t() != NONE) { + erase_if(accessibleLocations, [&allowedLocations, ctx](RandomizerCheck loc){ + for (RandomizerCheck allowedLocation : allowedLocations) { + if (loc == allowedLocation || ctx->GetItemLocation(loc)->GetPlacedRandomizerGet() != RG_NONE) { return false; } } @@ -443,67 +457,69 @@ std::vector GetAccessibleLocations(const std::vector& allowe } static void GeneratePlaythrough() { - playthroughBeatable = false; - LogicReset(); - GetAccessibleLocations(allLocations, SearchMode::GeneratePlaythrough); + auto ctx = Rando::Context::GetInstance(); + ctx->playthroughBeatable = false; + LogicReset(); + GetAccessibleLocations(ctx->allLocations, SearchMode::GeneratePlaythrough); } //Remove unnecessary items from playthrough by removing their location, and checking if game is still beatable //To reduce searches, some preprocessing is done in playthrough generation to avoid adding obviously unnecessary items static void PareDownPlaythrough() { - std::vector toAddBackItem; + auto ctx = Rando::Context::GetInstance(); + std::vector toAddBackItem; //Start at sphere before Ganon's and count down - for (int i = playthroughLocations.size() - 2; i >= 0; i--) { + for (int i = ctx->playthroughLocations.size() - 2; i >= 0; i--) { //Check each item location in sphere std::vector erasableIndices; - std::vector sphere = playthroughLocations.at(i); + std::vector sphere = ctx->playthroughLocations.at(i); for (int j = sphere.size() - 1; j >= 0; j--) { - uint32_t loc = sphere.at(j); - uint32_t copy = Location(loc)->GetPlaceduint32_t(); //Copy out item - Location(loc)->SetPlacedItem(NONE); //Write in empty item - playthroughBeatable = false; + RandomizerCheck loc = sphere.at(j); + RandomizerGet copy = ctx->GetItemLocation(loc)->GetPlacedRandomizerGet(); //Copy out item + ctx->GetItemLocation(loc)->SetPlacedItem(RG_NONE); //Write in empty item + ctx->playthroughBeatable = false; LogicReset(); std::string ignore = ""; - if (ItemTable(copy).GetItemType() == ITEMTYPE_TOKEN) { + if (Rando::StaticData::RetrieveItem(copy).GetItemType() == ITEMTYPE_TOKEN) { ignore = "Tokens"; } - else if (ItemTable(copy).GetName().GetEnglish().find("Bombchu") != std::string::npos) { + else if (Rando::StaticData::RetrieveItem(copy).GetName().GetEnglish().find("Bombchu") != std::string::npos) { ignore = "Bombchus"; } - else if (ItemTable(copy).GetItemType() == ITEMTYPE_SHOP) { - ignore = GetShopItemBaseName(ItemTable(copy).GetName().GetEnglish()); + else if (Rando::StaticData::RetrieveItem(copy).GetItemType() == ITEMTYPE_SHOP) { + ignore = GetShopItemBaseName(Rando::StaticData::RetrieveItem(copy).GetName().GetEnglish()); } - GetAccessibleLocations(allLocations, SearchMode::CheckBeatable, ignore); //Check if game is still beatable + GetAccessibleLocations(ctx->allLocations, SearchMode::CheckBeatable, ignore); //Check if game is still beatable //Playthrough is still beatable without this item, therefore it can be removed from playthrough section. - if (playthroughBeatable) { - //Uncomment to print playthrough deletion log in citra - // std::string itemname(ItemTable(copy).GetName().GetEnglish()); - // std::string locationname(Location(loc)->GetName()); - // std::string removallog = itemname + " at " + locationname + " removed from playthrough"; - // CitraPrint(removallog); - playthroughLocations[i].erase(playthroughLocations[i].begin() + j); - Location(loc)->SetDelayedItem(copy); //Game is still beatable, don't add back until later + if (ctx->playthroughBeatable) { + // Uncomment to print playthrough deletion log in citra + // std::string itemname(Rando::StaticData::RetrieveItem(copy).GetName().GetEnglish()); + // std::string locationname(GetLocation(loc)->GetName()); + // std::string removallog = itemname + " at " + locationname + " removed from playthrough"; + // CitraPrint(removallog); + ctx->playthroughLocations[i].erase(ctx->playthroughLocations[i].begin() + j); + ctx->GetItemLocation(loc)->SetDelayedItem(copy); //Game is still beatable, don't add back until later toAddBackItem.push_back(loc); } else { - Location(loc)->SetPlacedItem(copy); //Immediately put item back so game is beatable again + ctx->GetItemLocation(loc)->SetPlacedItem(copy); //Immediately put item back so game is beatable again } } } //Some spheres may now be empty, remove these - for (int i = playthroughLocations.size() - 2; i >= 0; i--) { - if (playthroughLocations.at(i).size() == 0) { - playthroughLocations.erase(playthroughLocations.begin() + i); + for (int i = ctx->playthroughLocations.size() - 2; i >= 0; i--) { + if (ctx->playthroughLocations.at(i).size() == 0) { + ctx->playthroughLocations.erase(ctx->playthroughLocations.begin() + i); } } //Now we can add back items which were removed previously - for (uint32_t loc : toAddBackItem) { - Location(loc)->SaveDelayedItem(); + for (RandomizerCheck loc : toAddBackItem) { + ctx->GetItemLocation(loc)->SaveDelayedItem(); } } @@ -512,48 +528,50 @@ static void PareDownPlaythrough() { // be obtained to logically be able to complete the seed, rather than playthrough items which // are just possible items you *can* collect to complete the seed. static void CalculateWotH() { + auto ctx = Rando::Context::GetInstance(); //First copy locations from the 2-dimensional playthroughLocations into the 1-dimensional wothLocations //size - 1 so Triforce is not counted - for (size_t i = 0; i < playthroughLocations.size() - 1; i++) { - for (size_t j = 0; j < playthroughLocations[i].size(); j++) { - if (Location(playthroughLocations[i][j])->IsHintable()) { - wothLocations.push_back(playthroughLocations[i][j]); + for (size_t i = 0; i < ctx->playthroughLocations.size() - 1; i++) { + for (size_t j = 0; j < ctx->playthroughLocations[i].size(); j++) { + if (ctx->GetItemLocation(ctx->playthroughLocations[i][j])->IsHintable()) { + ctx->wothLocations.push_back(ctx->playthroughLocations[i][j]); } } } //Now go through and check each location, seeing if it is strictly necessary for game completion - for (int i = wothLocations.size() - 1; i >= 0; i--) { - uint32_t loc = wothLocations[i]; - uint32_t copy = Location(loc)->GetPlaceduint32_t(); //Copy out item - Location(loc)->SetPlacedItem(NONE); //Write in empty item - playthroughBeatable = false; + for (int i = ctx->wothLocations.size() - 1; i >= 0; i--) { + RandomizerCheck loc = ctx->wothLocations[i]; + RandomizerGet copy = ctx->GetItemLocation(loc)->GetPlacedRandomizerGet(); //Copy out item + ctx->GetItemLocation(loc)->SetPlacedItem(RG_NONE); //Write in empty item + ctx->playthroughBeatable = false; LogicReset(); - GetAccessibleLocations(allLocations, SearchMode::CheckBeatable); //Check if game is still beatable - Location(loc)->SetPlacedItem(copy); //Immediately put item back + GetAccessibleLocations(ctx->allLocations, SearchMode::CheckBeatable); //Check if game is still beatable + ctx->GetItemLocation(loc)->SetPlacedItem(copy); //Immediately put item back //If removing this item and no other item caused the game to become unbeatable, then it is strictly necessary, so keep it //Else, delete from wothLocations - if (playthroughBeatable) { - wothLocations.erase(wothLocations.begin() + i); + if (ctx->playthroughBeatable) { + ctx->wothLocations.erase(ctx->wothLocations.begin() + i); } } - playthroughBeatable = true; + ctx->playthroughBeatable = true; LogicReset(); - GetAccessibleLocations(allLocations); + GetAccessibleLocations(ctx->allLocations); } //Will place things completely randomly, no logic checks are performed -static void FastFill(std::vector items, std::vector locations, bool endOnItemsEmpty = false) { +static void FastFill(std::vector items, std::vector locations, bool endOnItemsEmpty = false) { + auto ctx = Rando::Context::GetInstance(); //Loop until locations are empty, or also end if items are empty and the parameters specify to end then while (!locations.empty() && (!endOnItemsEmpty || !items.empty())) { if (items.empty() && !endOnItemsEmpty) { items.push_back(GetJunkItem()); } - uint32_t loc = RandomElement(locations, true); - Location(loc)->SetAsHintable(); - PlaceItemInLocation(loc, RandomElement(items, true)); + RandomizerCheck loc = RandomElement(locations, true); + ctx->GetItemLocation(loc)->SetAsHintable(); + ctx->PlaceItemInLocation(loc, RandomElement(items, true)); } } @@ -564,21 +582,23 @@ static void FastFill(std::vector items, std::vector location | This method helps distribution of items locked behind many requirements. | - OoT Randomizer */ -static void AssumedFill(const std::vector& items, const std::vector& allowedLocations, +static void AssumedFill(const std::vector& items, const std::vector& allowedLocations, bool setLocationsAsHintable = false) { - + auto ctx = Rando::Context::GetInstance(); if (items.size() > allowedLocations.size()) { printf("\x1b[2;2HERROR: MORE ITEMS THAN LOCATIONS IN GIVEN LISTS"); SPDLOG_DEBUG("Items:\n"); - for (const uint32_t item : items) { + // NOLINTNEXTLINE(clang-diagnostic-unused-variable) + for (const RandomizerGet item : items) { SPDLOG_DEBUG("\t"); - SPDLOG_DEBUG(ItemTable(item).GetName().GetEnglish()); + SPDLOG_DEBUG(Rando::StaticData::RetrieveItem(item).GetName().GetEnglish()); SPDLOG_DEBUG("\n"); } SPDLOG_DEBUG("\nAllowed Locations:\n"); - for (const uint32_t loc : allowedLocations) { + // NOLINTNEXTLINE(clang-diagnostic-unused-variable) + for (const RandomizerCheck loc : allowedLocations) { SPDLOG_DEBUG("\t"); - SPDLOG_DEBUG(Location(loc)->GetName()); + SPDLOG_DEBUG(Rando::StaticData::GetLocation(loc)->GetName()); SPDLOG_DEBUG("\n"); } placementFailure = true; @@ -593,7 +613,7 @@ static void AssumedFill(const std::vector& items, const std::vector attemptedLocations; + std::vector attemptedLocations; do { retries--; if (retries <= 0) { @@ -601,47 +621,47 @@ static void AssumedFill(const std::vector& items, const std::vector itemsToPlace = items; + std::vector itemsToPlace = items; // copy all not yet placed advancement items so that we can apply their effects for the fill algorithm - std::vector itemsToNotPlace = - FilterFromPool(ItemPool, [](const auto i) { return ItemTable(i).IsAdvancement(); }); + std::vector itemsToNotPlace = + FilterFromPool(ItemPool, [](const auto i) { return Rando::StaticData::RetrieveItem(i).IsAdvancement(); }); // shuffle the order of items to place Shuffle(itemsToPlace); while (!itemsToPlace.empty()) { - uint32_t item = std::move(itemsToPlace.back()); - ItemTable(item).SetAsPlaythrough(); + RandomizerGet item = std::move(itemsToPlace.back()); + Rando::StaticData::RetrieveItem(item).SetAsPlaythrough(); itemsToPlace.pop_back(); // assume we have all unplaced items LogicReset(); - for (uint32_t unplacedItem : itemsToPlace) { - ItemTable(unplacedItem).ApplyEffect(); + for (RandomizerGet unplacedItem : itemsToPlace) { + Rando::StaticData::RetrieveItem(unplacedItem).ApplyEffect(); } - for (uint32_t unplacedItem : itemsToNotPlace) { - ItemTable(unplacedItem).ApplyEffect(); + for (RandomizerGet unplacedItem : itemsToNotPlace) { + Rando::StaticData::RetrieveItem(unplacedItem).ApplyEffect(); } // get all accessible locations that are allowed - const std::vector accessibleLocations = GetAccessibleLocations(allowedLocations); + const std::vector accessibleLocations = GetAccessibleLocations(allowedLocations); // retry if there are no more locations to place items if (accessibleLocations.empty()) { SPDLOG_DEBUG("\nCANNOT PLACE "); - SPDLOG_DEBUG(ItemTable(item).GetName().GetEnglish()); + SPDLOG_DEBUG(Rando::StaticData::RetrieveItem(item).GetName().GetEnglish()); SPDLOG_DEBUG(". TRYING AGAIN...\n"); #ifdef ENABLE_DEBUG - Areas::DumpWorldGraph(ItemTable(item).GetName().GetEnglish()); + Areas::DumpWorldGraph(Rando::StaticData::RetrieveItem(item).GetName().GetEnglish()); PlacementLog_Write(); #endif // reset any locations that got an item - for (uint32_t loc : attemptedLocations) { - Location(loc)->SetPlacedItem(NONE); - itemsPlaced--; + for (RandomizerCheck loc : attemptedLocations) { + ctx->GetItemLocation(loc)->SetPlacedItem(RG_NONE); + //itemsPlaced--; } attemptedLocations.clear(); @@ -650,24 +670,24 @@ static void AssumedFill(const std::vector& items, const std::vectorPlaceItemInLocation(selectedLocation, item); attemptedLocations.push_back(selectedLocation); // This tells us the location went through the randomization algorithm // to distinguish it from locations which did not or that the player already // knows if (setLocationsAsHintable) { - Location(selectedLocation)->SetAsHintable(); + ctx->GetItemLocation(selectedLocation)->SetAsHintable(); } // If ALR is off, then we check beatability after placing the item. // If the game is beatable, then we can stop placing items with logic. if (!LocationsReachable) { - playthroughBeatable = false; + ctx->playthroughBeatable = false; LogicReset(); - GetAccessibleLocations(allLocations, SearchMode::CheckBeatable); - if (playthroughBeatable) { + GetAccessibleLocations(ctx->allLocations, SearchMode::CheckBeatable); + if (ctx->playthroughBeatable) { SPDLOG_DEBUG("Game beatable, now placing items randomly. " + std::to_string(itemsToPlace.size()) + " major items remaining.\n\n"); FastFill(itemsToPlace, GetEmptyLocations(allowedLocations), true); @@ -681,7 +701,7 @@ static void AssumedFill(const std::vector& items, const std::vector bitMaskTable = { 0x00040000, //Kokiri Emerald @@ -694,99 +714,102 @@ static void RandomizeDungeonRewards() { 0x00000010, //Shadow Medallion 0x00000020, //Light Medallion }; - int baseOffset = ItemTable(KOKIRI_EMERALD).GetItemID(); + int baseOffset = Rando::StaticData::RetrieveItem(RG_KOKIRI_EMERALD).GetItemID(); //End of Dungeons includes Link's Pocket if (ShuffleRewards.Is(REWARDSHUFFLE_END_OF_DUNGEON)) { //get stones and medallions - std::vector rewards = FilterAndEraseFromPool(ItemPool, [](const auto i) {return ItemTable(i).GetItemType() == ITEMTYPE_DUNGEONREWARD;}); + std::vector rewards = FilterAndEraseFromPool(ItemPool, [](const auto i) {return Rando::StaticData::RetrieveItem(i).GetItemType() == ITEMTYPE_DUNGEONREWARD;}); // If there are less than 9 dungeon rewards, prioritize the actual dungeons // for placement instead of Link's Pocket if (rewards.size() < 9) { - PlaceItemInLocation(LINKS_POCKET, GREEN_RUPEE); + ctx->PlaceItemInLocation(RC_LINKS_POCKET, RG_GREEN_RUPEE); } if (Settings::Logic.Is(LOGIC_VANILLA)) { //Place dungeon rewards in vanilla locations - for (uint32_t loc : dungeonRewardLocations) { - Location(loc)->PlaceVanillaItem(); + for (RandomizerCheck loc : Rando::StaticData::dungeonRewardLocations) { + ctx->GetItemLocation(loc)->PlaceVanillaItem(); } } else { //Randomize dungeon rewards with assumed fill - AssumedFill(rewards, dungeonRewardLocations); + AssumedFill(rewards, Rando::StaticData::dungeonRewardLocations); } - for (size_t i = 0; i < dungeonRewardLocations.size(); i++) { - const auto index = Location(dungeonRewardLocations[i])->GetPlacedItem().GetItemID() - baseOffset; + for (size_t i = 0; i < Rando::StaticData::dungeonRewardLocations.size(); i++) { + const auto index = ctx->GetItemLocation(Rando::StaticData::dungeonRewardLocations[i])->GetPlacedItem().GetItemID() - baseOffset; rDungeonRewardOverrides[i] = index; //set the player's dungeon reward on file creation instead of pushing it to them at the start. //This is done mainly because players are already familiar with seeing their dungeon reward //before opening up their file - if (i == dungeonRewardLocations.size()-1) { + if (i == Rando::StaticData::dungeonRewardLocations.size()-1) { LinksPocketRewardBitMask = bitMaskTable[index]; } } } else if (LinksPocketItem.Is(LINKSPOCKETITEM_DUNGEON_REWARD)) { //get 1 stone/medallion - std::vector rewards = FilterFromPool(ItemPool, [](const auto i) {return ItemTable(i).GetItemType() == ITEMTYPE_DUNGEONREWARD;}); + std::vector rewards = FilterFromPool( + ItemPool, [](const auto i) { return Rando::StaticData::RetrieveItem(i).GetItemType() == ITEMTYPE_DUNGEONREWARD; }); // If there are no remaining stones/medallions, then Link's pocket won't get one if (rewards.empty()) { - PlaceItemInLocation(LINKS_POCKET, GREEN_RUPEE); + ctx->PlaceItemInLocation(RC_LINKS_POCKET, RG_GREEN_RUPEE); return; } - uint32_t startingReward = RandomElement(rewards, true); + RandomizerGet startingReward = RandomElement(rewards, true); - LinksPocketRewardBitMask = bitMaskTable[ItemTable(startingReward).GetItemID() - baseOffset]; - PlaceItemInLocation(LINKS_POCKET, startingReward); + LinksPocketRewardBitMask = bitMaskTable[Rando::StaticData::RetrieveItem(startingReward).GetItemID() - baseOffset]; + ctx->PlaceItemInLocation(RC_LINKS_POCKET, startingReward); //erase the stone/medallion from the Item Pool - FilterAndEraseFromPool(ItemPool, [startingReward](const uint32_t i) {return i == startingReward;}); + FilterAndEraseFromPool(ItemPool, [startingReward](const RandomizerGet i) {return i == startingReward;}); } } //Fills any locations excluded by the player with junk items so that advancement items //can't be placed there. static void FillExcludedLocations() { + auto ctx = Rando::Context::GetInstance(); //Only fill in excluded locations that don't already have something and are forbidden - std::vector excludedLocations = FilterFromPool(allLocations, [](const auto loc){ - return Location(loc)->IsExcluded(); + std::vector excludedLocations = FilterFromPool(ctx->allLocations, [ctx](const auto loc){ + return ctx->GetItemLocation(loc)->IsExcluded(); }); - for (uint32_t loc : excludedLocations) { + for (RandomizerCheck loc : excludedLocations) { PlaceJunkInExcludedLocation(loc); } } //Function to handle the Own Dungeon setting static void RandomizeOwnDungeon(const Dungeon::DungeonInfo* dungeon) { - std::vector dungeonItems; + auto ctx = Rando::Context::GetInstance(); + std::vector dungeonItems; // Search and filter for locations that match the hint region of the dungeon // This accounts for boss room shuffle so that own dungeon items can be placed // in the shuffled boss room - std::vector dungeonLocations = FilterFromPool(allLocations, [dungeon](const auto loc) { - return GetHintRegionHintKey(Location(loc)->GetParentRegionKey()) == dungeon->GetHintKey(); + std::vector dungeonLocations = FilterFromPool(ctx->allLocations, [dungeon, ctx](const auto loc) { + return GetHintRegionHintKey(ctx->GetItemLocation(loc)->GetParentRegionKey()) == dungeon->GetHintKey(); }); //filter out locations that may be required to have songs placed at them dungeonLocations = FilterFromPool(dungeonLocations, [](const auto loc){ if (ShuffleSongs.Is(SONGSHUFFLE_SONG_LOCATIONS)) { - return !(Location(loc)->IsCategory(Category::cSong)); + return !(Rando::StaticData::GetLocation(loc)->IsCategory(Category::cSong)); } if (ShuffleSongs.Is(SONGSHUFFLE_DUNGEON_REWARDS)) { - return !(Location(loc)->IsCategory(Category::cSongDungeonReward)); + return !(Rando::StaticData::GetLocation(loc)->IsCategory(Category::cSongDungeonReward)); } return true; }); //Add specific items that need be randomized within this dungeon - if (Keysanity.Is(KEYSANITY_OWN_DUNGEON) && dungeon->GetSmallKey() != NONE) { - std::vector dungeonSmallKeys = FilterAndEraseFromPool(ItemPool, [dungeon](const uint32_t i){ return (i == dungeon->GetSmallKey()) || (i == dungeon->GetKeyRing());}); + if (Keysanity.Is(KEYSANITY_OWN_DUNGEON) && dungeon->GetSmallKey() != RG_NONE) { + std::vector dungeonSmallKeys = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i){ return (i == dungeon->GetSmallKey()) || (i == dungeon->GetKeyRing());}); AddElementsToPool(dungeonItems, dungeonSmallKeys); } - if ((BossKeysanity.Is(BOSSKEYSANITY_OWN_DUNGEON) && dungeon->GetBossKey() != GANONS_CASTLE_BOSS_KEY) || - (GanonsBossKey.Is(GANONSBOSSKEY_OWN_DUNGEON) && dungeon->GetBossKey() == GANONS_CASTLE_BOSS_KEY)) { - auto dungeonBossKey = FilterAndEraseFromPool(ItemPool, [dungeon](const uint32_t i){ return i == dungeon->GetBossKey();}); + if ((BossKeysanity.Is(BOSSKEYSANITY_OWN_DUNGEON) && dungeon->GetBossKey() != RG_GANONS_CASTLE_BOSS_KEY) || + (GanonsBossKey.Is(GANONSBOSSKEY_OWN_DUNGEON) && dungeon->GetBossKey() == RG_GANONS_CASTLE_BOSS_KEY)) { + auto dungeonBossKey = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i){ return i == dungeon->GetBossKey();}); AddElementsToPool(dungeonItems, dungeonBossKey); } @@ -794,8 +817,8 @@ static void RandomizeOwnDungeon(const Dungeon::DungeonInfo* dungeon) { AssumedFill(dungeonItems, dungeonLocations); //randomize map and compass separately since they're not progressive - if (MapsAndCompasses.Is(MAPSANDCOMPASSES_OWN_DUNGEON) && dungeon->GetMap() != NONE && dungeon->GetCompass() != NONE) { - auto dungeonMapAndCompass = FilterAndEraseFromPool(ItemPool, [dungeon](const uint32_t i){ return i == dungeon->GetMap() || i == dungeon->GetCompass();}); + if (MapsAndCompasses.Is(MAPSANDCOMPASSES_OWN_DUNGEON) && dungeon->GetMap() != RG_NONE && dungeon->GetCompass() != RG_NONE) { + auto dungeonMapAndCompass = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i){ return i == dungeon->GetMap() || i == dungeon->GetCompass();}); AssumedFill(dungeonMapAndCompass, dungeonLocations); } } @@ -809,103 +832,106 @@ static void RandomizeOwnDungeon(const Dungeon::DungeonInfo* dungeon) { will be randomized together if they have the same setting. Maps and Compasses are randomized separately once the dungeon advancement items have all been placed.*/ static void RandomizeDungeonItems() { + auto ctx = Rando::Context::GetInstance(); using namespace Dungeon; //Get Any Dungeon and Overworld group locations - std::vector anyDungeonLocations = FilterFromPool(allLocations, [](const auto loc){return Location(loc)->IsDungeon();}); + std::vector anyDungeonLocations = FilterFromPool(ctx->allLocations, [](const auto loc){return Rando::StaticData::GetLocation(loc)->IsDungeon();}); //overworldLocations defined in item_location.cpp //Create Any Dungeon and Overworld item pools - std::vector anyDungeonItems; - std::vector overworldItems; + std::vector anyDungeonItems; + std::vector overworldItems; for (auto dungeon : dungeonList) { if (Keysanity.Is(KEYSANITY_ANY_DUNGEON)) { - auto dungeonKeys = FilterAndEraseFromPool(ItemPool, [dungeon](const uint32_t i){return (i == dungeon->GetSmallKey()) || (i == dungeon->GetKeyRing());}); + auto dungeonKeys = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i){return (i == dungeon->GetSmallKey()) || (i == dungeon->GetKeyRing());}); AddElementsToPool(anyDungeonItems, dungeonKeys); } else if (Keysanity.Is(KEYSANITY_OVERWORLD)) { - auto dungeonKeys = FilterAndEraseFromPool(ItemPool, [dungeon](const uint32_t i){return (i == dungeon->GetSmallKey()) || (i == dungeon->GetKeyRing());}); + auto dungeonKeys = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i){return (i == dungeon->GetSmallKey()) || (i == dungeon->GetKeyRing());}); AddElementsToPool(overworldItems, dungeonKeys); } - if (BossKeysanity.Is(BOSSKEYSANITY_ANY_DUNGEON) && dungeon->GetBossKey() != GANONS_CASTLE_BOSS_KEY) { - auto bossKey = FilterAndEraseFromPool(ItemPool, [dungeon](const uint32_t i){return i == dungeon->GetBossKey();}); + if (BossKeysanity.Is(BOSSKEYSANITY_ANY_DUNGEON) && dungeon->GetBossKey() != RG_GANONS_CASTLE_BOSS_KEY) { + auto bossKey = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i){return i == dungeon->GetBossKey();}); AddElementsToPool(anyDungeonItems, bossKey); - } else if (BossKeysanity.Is(BOSSKEYSANITY_OVERWORLD) && dungeon->GetBossKey() != GANONS_CASTLE_BOSS_KEY) { - auto bossKey = FilterAndEraseFromPool(ItemPool, [dungeon](const uint32_t i){return i == dungeon->GetBossKey();}); + } else if (BossKeysanity.Is(BOSSKEYSANITY_OVERWORLD) && dungeon->GetBossKey() != RG_GANONS_CASTLE_BOSS_KEY) { + auto bossKey = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i){return i == dungeon->GetBossKey();}); AddElementsToPool(overworldItems, bossKey); } if (GanonsBossKey.Is(GANONSBOSSKEY_ANY_DUNGEON)) { - auto ganonBossKey = FilterAndEraseFromPool(ItemPool, [](const auto i){return i == GANONS_CASTLE_BOSS_KEY;}); + auto ganonBossKey = FilterAndEraseFromPool(ItemPool, [](const auto i){return i == RG_GANONS_CASTLE_BOSS_KEY;}); AddElementsToPool(anyDungeonItems, ganonBossKey); } else if (GanonsBossKey.Is(GANONSBOSSKEY_OVERWORLD)) { - auto ganonBossKey = FilterAndEraseFromPool(ItemPool, [](const auto i) { return i == GANONS_CASTLE_BOSS_KEY; }); + auto ganonBossKey = FilterAndEraseFromPool(ItemPool, [](const auto i) { return i == RG_GANONS_CASTLE_BOSS_KEY; }); AddElementsToPool(overworldItems, ganonBossKey); } } if (GerudoKeys.Is(GERUDOKEYS_ANY_DUNGEON)) { - auto gerudoKeys = FilterAndEraseFromPool(ItemPool, [](const auto i) { return i == GERUDO_FORTRESS_SMALL_KEY; }); + auto gerudoKeys = FilterAndEraseFromPool(ItemPool, [](const auto i) { return i == RG_GERUDO_FORTRESS_SMALL_KEY; }); AddElementsToPool(anyDungeonItems, gerudoKeys); } else if (GerudoKeys.Is(GERUDOKEYS_OVERWORLD)) { - auto gerudoKeys = FilterAndEraseFromPool(ItemPool, [](const auto i) { return i == GERUDO_FORTRESS_SMALL_KEY; }); + auto gerudoKeys = FilterAndEraseFromPool(ItemPool, [](const auto i) { return i == RG_GERUDO_FORTRESS_SMALL_KEY; }); AddElementsToPool(overworldItems, gerudoKeys); } if (ShuffleRewards.Is(REWARDSHUFFLE_ANY_DUNGEON)) { auto rewards = FilterAndEraseFromPool( - ItemPool, [](const auto i) { return ItemTable(i).GetItemType() == ITEMTYPE_DUNGEONREWARD; }); + ItemPool, [](const auto i) { return Rando::StaticData::RetrieveItem(i).GetItemType() == ITEMTYPE_DUNGEONREWARD; }); AddElementsToPool(anyDungeonItems, rewards); } else if (ShuffleRewards.Is(REWARDSHUFFLE_OVERWORLD)) { auto rewards = FilterAndEraseFromPool( - ItemPool, [](const auto i) { return ItemTable(i).GetItemType() == ITEMTYPE_DUNGEONREWARD; }); + ItemPool, [](const auto i) { return Rando::StaticData::RetrieveItem(i).GetItemType() == ITEMTYPE_DUNGEONREWARD; }); AddElementsToPool(overworldItems, rewards); } //Randomize Any Dungeon and Overworld pools AssumedFill(anyDungeonItems, anyDungeonLocations, true); - AssumedFill(overworldItems, overworldLocations, true); + AssumedFill(overworldItems, Rando::StaticData::overworldLocations, true); //Randomize maps and compasses after since they're not advancement items for (auto dungeon : dungeonList) { if (MapsAndCompasses.Is(MAPSANDCOMPASSES_ANY_DUNGEON)) { - auto mapAndCompassItems = FilterAndEraseFromPool(ItemPool, [dungeon](const uint32_t i){return i == dungeon->GetMap() || i == dungeon->GetCompass();}); + auto mapAndCompassItems = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i){return i == dungeon->GetMap() || i == dungeon->GetCompass();}); AssumedFill(mapAndCompassItems, anyDungeonLocations, true); } else if (MapsAndCompasses.Is(MAPSANDCOMPASSES_OVERWORLD)) { - auto mapAndCompassItems = FilterAndEraseFromPool(ItemPool, [dungeon](const uint32_t i){return i == dungeon->GetMap() || i == dungeon->GetCompass();}); - AssumedFill(mapAndCompassItems, overworldLocations, true); + auto mapAndCompassItems = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i){return i == dungeon->GetMap() || i == dungeon->GetCompass();}); + AssumedFill(mapAndCompassItems, Rando::StaticData::overworldLocations, true); } } } static void RandomizeLinksPocket() { + auto ctx = Rando::Context::GetInstance(); if (LinksPocketItem.Is(LINKSPOCKETITEM_ADVANCEMENT)) { //Get all the advancement items don't include tokens - std::vector advancementItems = FilterAndEraseFromPool(ItemPool, [](const auto i) { - return ItemTable(i).IsAdvancement() && ItemTable(i).GetItemType() != ITEMTYPE_TOKEN; + std::vector advancementItems = FilterAndEraseFromPool(ItemPool, [](const auto i) { + return Rando::StaticData::RetrieveItem(i).IsAdvancement() && Rando::StaticData::RetrieveItem(i).GetItemType() != ITEMTYPE_TOKEN; }); //select a random one - uint32_t startingItem = RandomElement(advancementItems, true); + RandomizerGet startingItem = RandomElement(advancementItems, true); //add the others back AddElementsToPool(ItemPool, advancementItems); - PlaceItemInLocation(LINKS_POCKET, startingItem); + ctx->PlaceItemInLocation(RC_LINKS_POCKET, startingItem); } else if (LinksPocketItem.Is(LINKSPOCKETITEM_NOTHING)) { - PlaceItemInLocation(LINKS_POCKET, GREEN_RUPEE); + ctx->PlaceItemInLocation(RC_LINKS_POCKET, RG_GREEN_RUPEE); } } void VanillaFill() { + auto ctx = Rando::Context::GetInstance(); //Perform minimum needed initialization AreaTable_Init(); - GenerateLocationPool(); + ctx->GenerateLocationPool(); GenerateItemPool(); GenerateStartingInventory(); //Place vanilla item in each location RandomizeDungeonRewards(); - for (uint32_t loc : allLocations) { - Location(loc)->PlaceVanillaItem(); + for (RandomizerCheck loc : ctx->allLocations) { + ctx->GetItemLocation(loc)->PlaceVanillaItem(); } //If necessary, handle ER stuff if (ShuffleEntrances) { @@ -914,7 +940,7 @@ void VanillaFill() { printf("\x1b[7;32HDone"); } //Finish up - CreateItemOverrides(); + ctx->CreateItemOverrides(); CreateEntranceOverrides(); CreateWarpSongTexts(); } @@ -928,17 +954,17 @@ void ClearProgress() { } int Fill() { - + auto ctx = Rando::Context::GetInstance(); int retries = 0; while(retries < 5) { placementFailure = false; - showItemProgress = false; - playthroughLocations.clear(); + //showItemProgress = false; + ctx->playthroughLocations.clear(); playthroughEntrances.clear(); - wothLocations.clear(); + ctx->wothLocations.clear(); AreaTable_Init(); //Reset the world graph to intialize the proper locations - ItemReset(); //Reset shops incase of shopsanity random - GenerateLocationPool(); + ctx->ItemReset(); //Reset shops incase of shopsanity random + ctx->GenerateLocationPool(); GenerateItemPool(); GenerateStartingInventory(); RemoveStartingItemsFromPool(); @@ -957,9 +983,9 @@ int Fill() { printf("\x1b[7;32HDone"); } //erase temporary shop items - FilterAndEraseFromPool(ItemPool, [](const auto item) { return ItemTable(item).GetItemType() == ITEMTYPE_SHOP; }); + FilterAndEraseFromPool(ItemPool, [](const auto item) { return Rando::StaticData::RetrieveItem(item).GetItemType() == ITEMTYPE_SHOP; }); - showItemProgress = true; + //ctx->showItemProgress = true; //Place shop items first, since a buy shield is needed to place a dungeon reward on Gohma due to access NonShopItems = {}; if (Shopsanity.Is(SHOPSANITY_OFF)) { @@ -976,27 +1002,28 @@ int Fill() { //Indices from OoTR. So shopsanity one will overwrite 7, three will overwrite 7, 5, 8, etc. const std::array indices = {7, 5, 8, 6}; //Overwrite appropriate number of shop items - for (size_t i = 0; i < ShopLocationLists.size(); i++) { + for (size_t i = 0; i < Rando::StaticData::shopLocationLists.size(); i++) { int num_to_replace = GetShopsanityReplaceAmount(); //1-4 shop items will be overwritten, depending on settings total_replaced += num_to_replace; for (int j = 0; j < num_to_replace; j++) { int itemindex = indices[j]; int shopsanityPrice = GetRandomShopPrice(); - NonShopItems[TransformShopIndex(i*8+itemindex-1)].Price = shopsanityPrice; //Set price to be retrieved by the patch and textboxes - Location(ShopLocationLists[i][itemindex - 1])->SetShopsanityPrice(shopsanityPrice); + NonShopItems[TransformShopIndex(i * 8 + itemindex - 1)].Price = + shopsanityPrice; // Set price to be retrieved by the patch and textboxes + ctx->GetItemLocation(Rando::StaticData::shopLocationLists[i][itemindex - 1])->SetShopsanityPrice(shopsanityPrice); } } } //Get all locations and items that don't have a shopsanity price attached - std::vector shopLocations = {}; + std::vector shopLocations = {}; //Get as many vanilla shop items as the total number of shop items minus the number of replaced items //So shopsanity 0 will get all 64 vanilla items, shopsanity 4 will get 32, etc. - std::vector shopItems = GetMinVanillaShopItems(total_replaced); + std::vector shopItems = GetMinVanillaShopItems(total_replaced); - for (size_t i = 0; i < ShopLocationLists.size(); i++) { - for (size_t j = 0; j < ShopLocationLists[i].size(); j++) { - uint32_t loc = ShopLocationLists[i][j]; - if (!(Location(loc)->HasShopsanityPrice())) { + for (size_t i = 0; i < Rando::StaticData::shopLocationLists.size(); i++) { + for (size_t j = 0; j < Rando::StaticData::shopLocationLists[i].size(); j++) { + RandomizerCheck loc = Rando::StaticData::shopLocationLists[i][j]; + if (!(ctx->GetItemLocation(loc)->HasShopsanityPrice())) { shopLocations.push_back(loc); } } @@ -1017,18 +1044,19 @@ int Fill() { if (ShuffleSongs.IsNot(SONGSHUFFLE_ANYWHERE)) { //Get each song - std::vector songs = - FilterAndEraseFromPool(ItemPool, [](const auto i) { return ItemTable(i).GetItemType() == ITEMTYPE_SONG; }); + std::vector songs = FilterAndEraseFromPool( + ItemPool, [](const auto i) { return Rando::StaticData::RetrieveItem(i).GetItemType() == ITEMTYPE_SONG; }); //Get each song location - std::vector songLocations; + std::vector songLocations; if (ShuffleSongs.Is(SONGSHUFFLE_SONG_LOCATIONS)) { - songLocations = - FilterFromPool(allLocations, [](const auto loc) { return Location(loc)->IsCategory(Category::cSong); }); + songLocations = FilterFromPool( + ctx->allLocations, [](const auto loc) { return Rando::StaticData::GetLocation(loc)->IsCategory(Category::cSong); }); } else if (ShuffleSongs.Is(SONGSHUFFLE_DUNGEON_REWARDS)) { - songLocations = FilterFromPool( - allLocations, [](const auto loc) { return Location(loc)->IsCategory(Category::cSongDungeonReward); }); + songLocations = FilterFromPool(ctx->allLocations, [](const auto loc) { + return Rando::StaticData::GetLocation(loc)->IsCategory(Category::cSongDungeonReward); + }); } AssumedFill(songs, songLocations, true); @@ -1040,35 +1068,35 @@ int Fill() { //Then place Link's Pocket Item if it has to be an advancement item RandomizeLinksPocket(); //Then place the rest of the advancement items - std::vector remainingAdvancementItems = - FilterAndEraseFromPool(ItemPool, [](const auto i) { return ItemTable(i).IsAdvancement(); }); - AssumedFill(remainingAdvancementItems, allLocations, true); + std::vector remainingAdvancementItems = + FilterAndEraseFromPool(ItemPool, [](const auto i) { return Rando::StaticData::RetrieveItem(i).IsAdvancement(); }); + AssumedFill(remainingAdvancementItems, ctx->allLocations, true); //Fast fill for the rest of the pool - std::vector remainingPool = FilterAndEraseFromPool(ItemPool, [](const auto i) { return true; }); + std::vector remainingPool = FilterAndEraseFromPool(ItemPool, [](const auto i) { return true; }); FastFill(remainingPool, GetAllEmptyLocations(), false); //Add prices for scrubsanity, this is unique to SoH because we write/read scrub prices to/from the spoilerfile. if (Scrubsanity.Is(SCRUBSANITY_AFFORDABLE)) { - for (size_t i = 0; i < ScrubLocations.size(); i++) { - Location(ScrubLocations[i])->SetScrubsanityPrice(10); + for (size_t i = 0; i < Rando::StaticData::scrubLocations.size(); i++) { + ctx->GetItemLocation(Rando::StaticData::scrubLocations[i])->SetScrubsanityPrice(10); } } else if (Scrubsanity.Is(SCRUBSANITY_RANDOM_PRICES)) { - for (size_t i = 0; i < ScrubLocations.size(); i++) { + for (size_t i = 0; i < Rando::StaticData::scrubLocations.size(); i++) { int randomPrice = GetRandomScrubPrice(); - Location(ScrubLocations[i])->SetScrubsanityPrice(randomPrice); + ctx->GetItemLocation(Rando::StaticData::scrubLocations[i])->SetScrubsanityPrice(randomPrice); } } GeneratePlaythrough(); //Successful placement, produced beatable result - if(playthroughBeatable && !placementFailure) { + if(ctx->playthroughBeatable && !placementFailure) { printf("Done"); printf("\x1b[9;10HCalculating Playthrough..."); PareDownPlaythrough(); CalculateWotH(); printf("Done"); - CreateItemOverrides(); + ctx->CreateItemOverrides(); CreateEntranceOverrides(); if (GossipStoneHints.IsNot(HINTS_NO_HINTS)) { printf("\x1b[10;10HCreating Hints..."); diff --git a/soh/soh/Enhancements/randomizer/3drando/fill.hpp b/soh/soh/Enhancements/randomizer/3drando/fill.hpp index 427668985..0b0ab59d8 100644 --- a/soh/soh/Enhancements/randomizer/3drando/fill.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/fill.hpp @@ -1,6 +1,6 @@ #pragma once -#include "keys.hpp" +#include "../randomizerTypes.h" #include #include @@ -21,7 +21,7 @@ void ClearProgress(); void VanillaFill(); int Fill(); -std::vector GetAccessibleLocations(const std::vector& allowedLocations, +std::vector GetAccessibleLocations(const std::vector& allowedLocations, SearchMode mode = SearchMode::ReachabilitySearch, std::string ignore = "", bool checkPoeCollectorAccess = false, bool checkOtherEntranceAccess = false); diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp index b830efb60..fc47069fe 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp @@ -1,6 +1,8 @@ #include "hint_list.hpp" #include "custom_messages.hpp" +#include "../randomizerTypes.h" + #include using namespace CustomMessages; @@ -18,25 +20,25 @@ using namespace CustomMessages; // '%d' indicates a number will be placed there. -std::array hintTable; +std::array hintTable; void HintTable_Init() { /*-------------------------- | GENERAL TEXT | ---------------------------*/ - hintTable[NONE] = HintText::Exclude({ Text{ "No Hint", "Pas d'Indice", "" } }); - hintTable[PREFIX] = + hintTable[RHT_NONE] = HintText::Exclude({ Text{ "No Hint", "Pas d'Indice", "" } }); + hintTable[RHT_PREFIX] = HintText::Exclude({ Text{ "They say that ", /*french*/ "Selon moi, ", /*spanish*/ "Según dicen, " } }); - hintTable[WAY_OF_THE_HERO] = + hintTable[RHT_WAY_OF_THE_HERO] = HintText::Exclude({ Text{ " is on %cthe way of the hero%w.", /*french*/ " est sur %cla voie du héros%w.", /*spanish*/ " conduce a la senda del héroe." } }); - hintTable[PLUNDERING] = + hintTable[RHT_PLUNDERING] = HintText::Exclude({ Text{ "plundering ", /*french*/ "explorer ", /*spanish*/ "inspeccionar " } }); - hintTable[FOOLISH] = HintText::Exclude( + hintTable[RHT_FOOLISH] = HintText::Exclude( { Text{ " is %pa foolish choice%w.", /*french*/ " est %pfutile%w.", /*spanish*/ " no es una sabia decisión." } }); - hintTable[CAN_BE_FOUND_AT] = + hintTable[RHT_CAN_BE_FOUND_AT] = HintText::Exclude({ Text{ "can be found at", /*french*/ "se trouve dans", /*spanish*/ "aguarda en" } }); - hintTable[HOARDS] = HintText::Exclude({ Text{ "hoards", /*french*/ "recèle", /*spanish*/ "acapara" } }); + hintTable[RHT_HOARDS] = HintText::Exclude({ Text{ "hoards", /*french*/ "recèle", /*spanish*/ "acapara" } }); HintTable_Init_Item(); HintTable_Init_Exclude_Overworld(); @@ -46,7 +48,7 @@ void HintTable_Init() { | ALWAYS HINT TEXT | ---------------------------*/ - hintTable[ZR_FROGS_OCARINA_GAME] = HintText::Always( + hintTable[RHT_ZR_FROGS_OCARINA_GAME] = HintText::Always( { // obscure text Text{ "an #amphibian feast# yields", /*french*/ "un #festin d'amphibiens# donne", @@ -62,7 +64,7 @@ void HintTable_Init() { /*french*/ "la dernière récompense des #grenouilles de la Rivière Zora# est", /*spanish*/ "la recompensa final de las #ranas del Río Zora# premia" }); - hintTable[KF_LINKS_HOUSE_COW] = HintText::Always( + hintTable[RHT_KF_LINKS_HOUSE_COW] = HintText::Always( { // obscure text Text{ "the #bovine bounty of a horseback hustle# gifts", @@ -74,7 +76,7 @@ void HintTable_Init() { Text{ "#Malon's obstacle course# leads to", /*french*/ "la #course à obstacle de Malon# amène à", /*spanish*/ "la #carrera de obstáculos de Malon# brinda" }); - hintTable[KAK_100_GOLD_SKULLTULA_REWARD] = HintText::Always( + hintTable[RHT_KAK_100_GOLD_SKULLTULA_REWARD] = HintText::Always( { // obscure text Text{ "#100 bug badges# rewards", @@ -96,14 +98,13 @@ void HintTable_Init() { /*-------------------------- | SOMETIMES HINT TEXT | ---------------------------*/ - - hintTable[SONG_FROM_OCARINA_OF_TIME] = HintText::Sometimes({ + hintTable[RHT_SONG_FROM_OCARINA_OF_TIME] = HintText::Sometimes({ // obscure text Text{ "the #Ocarina of Time# teaches", /*french*/ "l'#Ocarina du Temps# est accompagné par", /*spanish*/ "la #Ocarina del Tiempo# enseña" }, }); - hintTable[SONG_FROM_COMPOSERS_GRAVE] = HintText::Sometimes({ + hintTable[RHT_SONG_FROM_ROYAL_FAMILYS_TOMB] = HintText::Sometimes({ // obscure text Text{ "#ReDead in the Composers' Grave# guard", /*french*/ "les #Éffrois du tombeau des compositeurs# protègent", @@ -112,45 +113,45 @@ void HintTable_Init() { /*spanish*/ "los #hermanos compositores escribieron#" }, }); - hintTable[SHEIK_IN_FOREST] = HintText::Sometimes({ + hintTable[RHT_SHEIK_IN_FOREST] = HintText::Sometimes({ // obscure text Text{ "#in a meadow# Sheik teaches", /*french*/ "Sheik confiera, #dans un bosquet#,", /*spanish*/ "#en la pradera sagrada# Sheik enseña" }, }); - hintTable[SHEIK_AT_TEMPLE] = HintText::Sometimes({ + hintTable[RHT_SHEIK_AT_TEMPLE] = HintText::Sometimes({ // obscure text Text{ "Sheik waits at a #monument to time# to teach", /*french*/ "Sheik confiera, #au pied de l'épée légendaire#,", /*spanish*/ "Sheik espera en el #momumento del tiempo# para enseñar" }, }); - hintTable[SHEIK_IN_CRATER] = HintText::Sometimes({ + hintTable[RHT_SHEIK_IN_CRATER] = HintText::Sometimes({ // obscure text Text{ "the #crater's melody# is", /*french*/ "Sheik confiera, #entouré de lave#,", /*spanish*/ "la #melodía del cráter# otorga" }, }); - hintTable[SHEIK_IN_ICE_CAVERN] = HintText::Sometimes({ + hintTable[RHT_SHEIK_IN_ICE_CAVERN] = HintText::Sometimes({ // obscure text Text{ "the #frozen cavern# echoes with", /*french*/ "Sheik confiera, #dans une caverne enneigée#,", /*spanish*/ "en la #caverna de hielo# retumban los ecos de" }, }); - hintTable[SHEIK_IN_KAKARIKO] = HintText::Sometimes({ + hintTable[RHT_SHEIK_IN_KAKARIKO] = HintText::Sometimes({ // obscure text Text{ "a #ravaged village# mourns with", /*french*/ "Sheik confirera, #au coeur d'un village ravagé#,", /*spanish*/ "un #arrasado pueblo# llora" }, }); - hintTable[SHEIK_AT_COLOSSUS] = HintText::Sometimes({ + hintTable[RHT_SHEIK_AT_COLOSSUS] = HintText::Sometimes({ // obscure text Text{ "a hero ventures #beyond the wasteland# to learn", /*french*/ "Sheik confiera, #au bout d'un chemin sableux#,", /*spanish*/ "el héroe que se adentre #más allá del desierto# aprenderá" }, }); - hintTable[MARKET_10_BIG_POES] = HintText::Sometimes( + hintTable[RHT_MARKET_10_BIG_POES] = HintText::Sometimes( { // obscure text Text{ "#ghost hunters# will be rewarded with", @@ -162,13 +163,13 @@ void HintTable_Init() { Text{ "catching #Big Poes# leads to", /*french*/ "#d'attraper des Àmes# donne", /*spanish*/ "hacerte con #Grandes Poes# conduce a" }); - hintTable[DEKU_THEATER_SKULL_MASK] = HintText::Sometimes({ + hintTable[RHT_DEKU_THEATER_SKULL_MASK] = HintText::Sometimes({ // obscure text Text{ "the #Skull Mask# yields", /*french*/ "le #Masque de Mort# donne", /*spanish*/ "la #máscara de calavera# otorga" }, }); - hintTable[DEKU_THEATER_MASK_OF_TRUTH] = HintText::Sometimes( + hintTable[RHT_DEKU_THEATER_MASK_OF_TRUTH] = HintText::Sometimes( { // obscure text Text{ "showing a #truthful eye to the crowd# rewards", @@ -180,30 +181,30 @@ void HintTable_Init() { Text{ "the #Mask of Truth# yields", /*french*/ "le #Masque de Vérité# donne", /*spanish*/ "la #máscara de la verdad# premia" }); - hintTable[HF_OCARINA_OF_TIME_ITEM] = HintText::Sometimes({ + hintTable[RHT_HF_OCARINA_OF_TIME_ITEM] = HintText::Sometimes({ // obscure text Text{ "the #treasure thrown by Princess Zelda# is", /*french*/ "le trésor #laissé par la princesse# est", /*spanish*/ "el #tesoro arrojado por la Princesa Zelda# se trata de" }, }); - hintTable[DMT_TRADE_BROKEN_SWORD] = HintText::Sometimes({ + hintTable[RHT_DMT_TRADE_BROKEN_SWORD] = HintText::Sometimes({ // obscure text Text{ "a #blinded Biggoron# entrusts", /*french*/ "un #Grogoron aveuglé# confie", /*spanish*/ "un #miope Biggoron# otorga" }, }); - hintTable[DMT_TRADE_EYEDROPS] = HintText::Sometimes({ + hintTable[RHT_DMT_TRADE_EYEDROPS] = HintText::Sometimes({ // obscure text Text{ "while you wait, #Biggoron# gives", /*french*/ "pendant que tu attends, #Biggoron# donne", /*spanish*/ "#Biggoron# está a la espera de otorgar" }, }); - hintTable[DMT_TRADE_CLAIM_CHECK] = HintText::Sometimes({ + hintTable[RHT_DMT_TRADE_CLAIM_CHECK] = HintText::Sometimes({ // obscure text Text{ "#Biggoron# crafts", /*french*/ "#Biggoron# fabrique", /*spanish*/ "#Biggoron# forja" }, }); - hintTable[KAK_50_GOLD_SKULLTULA_REWARD] = HintText::Sometimes( + hintTable[RHT_KAK_50_GOLD_SKULLTULA_REWARD] = HintText::Sometimes( { // obscure text Text{ "#50 bug badges# rewards", /*french*/ "#50 écussons# donnent", @@ -218,7 +219,7 @@ void HintTable_Init() { Text{ "slaying #50 Gold Skulltulas# reveals", /*french*/ "détruire #50 Skulltulas d'or# donne", /*spanish*/ "exterminar #50 skulltulas doradas# revela" }); - hintTable[KAK_40_GOLD_SKULLTULA_REWARD] = HintText::Sometimes( + hintTable[RHT_KAK_40_GOLD_SKULLTULA_REWARD] = HintText::Sometimes( { // obscure text Text{ "#40 bug badges# rewards", /*french*/ "#40 écussons# donnent", @@ -233,7 +234,7 @@ void HintTable_Init() { Text{ "slaying #40 Gold Skulltulas# reveals", /*french*/ "détruire #40 Skulltulas d'or# donne", /*spanish*/ "exterminar #40 skulltulas doradas# revela" }); - hintTable[KAK_30_GOLD_SKULLTULA_REWARD] = HintText::Sometimes( + hintTable[RHT_KAK_30_GOLD_SKULLTULA_REWARD] = HintText::Sometimes( { // obscure text Text{ "#30 bug badges# rewards", /*french*/ "#30 écussons# donnent", @@ -248,7 +249,7 @@ void HintTable_Init() { Text{ "slaying #30 Gold Skulltulas# reveals", /*french*/ "détruire #30 Skulltulas d'or# donne", /*spanish*/ "exterminar #30 skulltulas doradas# revela" }); - hintTable[KAK_20_GOLD_SKULLTULA_REWARD] = HintText::Sometimes( + hintTable[RHT_KAK_20_GOLD_SKULLTULA_REWARD] = HintText::Sometimes( { // obscure text Text{ "#20 bug badges# rewards", /*french*/ "#20 écussons# donnent", @@ -263,7 +264,7 @@ void HintTable_Init() { Text{ "slaying #20 Gold Skulltulas# reveals", /*french*/ "détruire #20 Skulltulas d'or# donne", /*spanish*/ "exterminar #20 skulltulas doradas# revela" }); - hintTable[KAK_ANJU_AS_CHILD] = HintText::Sometimes( + hintTable[RHT_KAK_ANJU_AS_CHILD] = HintText::Sometimes( { // obscure text Text{ "#wrangling roosters# rewards", /*french*/ "#plumer des poulets# donne", @@ -276,19 +277,19 @@ void HintTable_Init() { Text{ "#collecting cuccos# rewards", /*french*/ "#rapporter les Cocottes# donne", /*spanish*/ "#hacerte con todos los cucos# premia" }); - hintTable[KAK_TRADE_POCKET_CUCCO] = HintText::Sometimes({ + hintTable[RHT_KAK_TRADE_POCKET_CUCCO] = HintText::Sometimes({ // obscure text Text{ "an adult's #happy Cucco# awards", /*french*/ "un adulte avec une #poulette joyeuse# obtient", /*spanish*/ "un #alegre cuco# en la madurez otorga" }, }); - hintTable[KAK_TRADE_ODD_MUSHROOM] = HintText::Sometimes({ + hintTable[RHT_KAK_TRADE_ODD_MUSHROOM] = HintText::Sometimes({ // obscure text Text{ "the #potion shop lady# entrusts", /*french*/ "la #gribiche du magasin de potion# confie", /*spanish*/ "la #señora de la tienda de pociones# otorga" }, }); - hintTable[GC_DARUNIAS_JOY] = HintText::Sometimes( + hintTable[RHT_GC_DARUNIAS_JOY] = HintText::Sometimes( { // obscure text Text{ "a #groovin' goron# gifts", /*french*/ "#le Goron joyeux# donne", @@ -299,24 +300,24 @@ void HintTable_Init() { Text{ "#Darunia's dance# leads to", /*french*/ "#la dance de Darunia# donne", /*spanish*/ "#el baile de Darunia# conduce a" }); - hintTable[LW_SKULL_KID] = HintText::Sometimes({ + hintTable[RHT_LW_SKULL_KID] = HintText::Sometimes({ // obscure text Text{ "the #Skull Kid# grants", /*french*/ "le #Skull Kid# donne", /*spanish*/ "#Skull Kid# otorga" }, }); - hintTable[LW_TRADE_COJIRO] = HintText::Sometimes({ + hintTable[RHT_LW_TRADE_COJIRO] = HintText::Sometimes({ // obscure text Text{ "returning a #special Cucco# awards", /*french*/ "ramener une #poulette précieuse# donne", /*spanish*/ "quien devuelva un #cuco especial# encontrará" }, }); - hintTable[LW_TRADE_ODD_POTION] = HintText::Sometimes({ + hintTable[RHT_LW_TRADE_ODD_POTION] = HintText::Sometimes({ // obscure text Text{ "a #Kokiri girl in the woods# leaves", /*french*/ "la #fillette Kokiri dans les bois# laisse", /*spanish*/ "una #chica kokiri del bosque# otorga" }, }); - hintTable[LH_SUN] = HintText::Sometimes( + hintTable[RHT_LH_SUN] = HintText::Sometimes( { // obscure text Text{ "staring into #the sun# grants", /*french*/ "regarder #le soleil# donne", @@ -327,13 +328,13 @@ void HintTable_Init() { Text{ "shooting #the sun# grants", /*french*/ "tirer une flèche dans #sur le soleil# donne", /*spanish*/ "#disparar al sol# revela" }); - hintTable[LH_TRADE_FROG] = HintText::Sometimes({ + hintTable[RHT_LH_TRADE_FROG] = HintText::Sometimes({ // obscure text Text{ "#Lake Hylia's scientist# hurriedly entrusts", /*french*/ "le #scientifique du lac# confie rapidement", /*spanish*/ "el #científico del Lago Hylia# otorga con prisa" }, }); - hintTable[MARKET_TREASURE_CHEST_GAME_REWARD] = HintText::Sometimes( + hintTable[RHT_MARKET_TREASURE_CHEST_GAME_REWARD] = HintText::Sometimes( { // obscure text Text{ "#gambling# grants", /*french*/ "#parier# donne", /*spanish*/ "#los juegos de azar# revelan" }, @@ -345,7 +346,7 @@ void HintTable_Init() { Text{ "the #treasure chest game# grants", /*french*/ "la #Chasse-aux-Trésors# donne", /*spanish*/ "#el Cofre del Tesoro# premia" }); - hintTable[MARKET_TREASURE_CHEST_GAME_ITEM_1] = HintText::Sometimes( + hintTable[RHT_MARKET_TREASURE_CHEST_GAME_ITEM_1] = HintText::Sometimes( { // obscure text Text{ "#gambling once# grants", /*french*/ "#parier une fois# donne", @@ -360,7 +361,7 @@ void HintTable_Init() { /*french*/ "la #première salle# de la Chasse-aux-Trésors contient", /*spanish*/ "#en la primera sala del Cofre del Tesoro# aguarda" }); - hintTable[MARKET_TREASURE_CHEST_GAME_ITEM_2] = HintText::Sometimes( + hintTable[RHT_MARKET_TREASURE_CHEST_GAME_ITEM_2] = HintText::Sometimes( { // obscure text Text{ "#gambling twice# grants", /*french*/ "#parier deux fois# donne", @@ -375,7 +376,7 @@ void HintTable_Init() { /*french*/ "la #deuxième salle# de la Chasse-aux-Trésors contient", /*spanish*/ "#en la segunda sala del Cofre del Tesoro# aguarda" }); - hintTable[MARKET_TREASURE_CHEST_GAME_ITEM_3] = HintText::Sometimes( + hintTable[RHT_MARKET_TREASURE_CHEST_GAME_ITEM_3] = HintText::Sometimes( { // obscure text Text{ "#gambling 3 times# grants", /*french*/ "#parier trois fois# donne", @@ -390,7 +391,7 @@ void HintTable_Init() { /*french*/ "la #troisième salle# de la Chasse-aux-Trésors contient", /*spanish*/ "#en la tercera sala del Cofre del Tesoro# aguarda" }); - hintTable[MARKET_TREASURE_CHEST_GAME_ITEM_4] = HintText::Sometimes( + hintTable[RHT_MARKET_TREASURE_CHEST_GAME_ITEM_4] = HintText::Sometimes( { // obscure text Text{ "#gambling 4 times# grants", /*french*/ "#parier quatre fois# donne", @@ -405,7 +406,7 @@ void HintTable_Init() { /*french*/ "la #quatrième salle# de la Chasse-aux-Trésors contient", /*spanish*/ "#en la cuarta sala del Cofre del Tesoro# aguarda" }); - hintTable[MARKET_TREASURE_CHEST_GAME_ITEM_5] = HintText::Sometimes( + hintTable[RHT_MARKET_TREASURE_CHEST_GAME_ITEM_5] = HintText::Sometimes( { // obscure text Text{ "#gambling 5 times# grants", /*french*/ "#parier cinq fois# donne", @@ -420,7 +421,7 @@ void HintTable_Init() { /*french*/ "la #cinquième salle# de la Chasse-aux-Trésors contient", /*spanish*/ "#en la quinta sala del Cofre del Tesoro# aguarda" }); - hintTable[GF_HBA_1500_POINTS] = HintText::Sometimes( + hintTable[RHT_GF_HBA_1500_POINTS] = HintText::Sometimes( { // obscure text Text{ "mastery of #horseback archery# grants", /*french*/ "maîtriser l'#archerie équestre# donne", @@ -432,51 +433,51 @@ void HintTable_Init() { /*french*/ "obtenir 1500 points dans l'#archerie équestre# donne", /*spanish*/ "conseguir 1500 puntos en el #tiro con arco a caballo# premia" }); - hintTable[GRAVEYARD_HEART_PIECE_GRAVE_CHEST] = HintText::Sometimes({ + hintTable[RHT_GRAVEYARD_HEART_PIECE_GRAVE_CHEST] = HintText::Sometimes({ // obscure text Text{ "playing #Sun's Song# in a grave spawns", /*french*/ "jouer le #chant du soleil# dans un tombeau donne", /*spanish*/ "#tocar la Canción del Sol# en una cripta conduce a" }, }); - hintTable[GC_MAZE_LEFT_CHEST] = HintText::Sometimes({ + hintTable[RHT_GC_MAZE_LEFT_CHEST] = HintText::Sometimes({ // obscure text Text{ "in #Goron City# the hammer unlocks", /*french*/ "dans le #village Goron#, le marteau donne accès à", /*spanish*/ "en la #Ciudad Goron# el martillo desbloquea" }, }); - hintTable[GV_CHEST] = HintText::Sometimes({ + hintTable[RHT_GV_CHEST] = HintText::Sometimes({ // obscure text Text{ "in #Gerudo Valley# the hammer unlocks", /*french*/ "dans la #Vallée Gerudo#, le marteau donne accès à", /*spanish*/ "en el #Valle Gerudo# el martillo desbloquea" }, }); - hintTable[GV_TRADE_SAW] = HintText::Sometimes({ + hintTable[RHT_GV_TRADE_SAW] = HintText::Sometimes({ // obscure text Text{ "the #boss of the carpenters# leaves", /*french*/ "le #patron des ouvriers# laisse", /*spanish*/ "el #capataz de los carpinteros# otorga" }, }); - hintTable[GV_COW] = HintText::Sometimes({ + hintTable[RHT_GV_COW] = HintText::Sometimes({ // obscure text Text{ "a #cow in Gerudo Valley# gifts", /*french*/ "la #vache de la Vallée Gerudo# donne", /*spanish*/ "una #vaca del Valle Gerudo# brinda" }, }); - hintTable[HC_GS_STORMS_GROTTO] = HintText::Sometimes({ + hintTable[RHT_HC_GS_STORMS_GROTTO] = HintText::Sometimes({ // obscure text Text{ "a #spider behind a muddy wall# in a grotto holds", /*french*/ "l'#araignée derrière un mur de boue# dans une grotte donne", /*spanish*/ "una #Skulltula tras la agrietada pared# de una cueva otorga" }, }); - hintTable[HF_GS_COW_GROTTO] = HintText::Sometimes({ + hintTable[RHT_HF_GS_COW_GROTTO] = HintText::Sometimes({ // obscure text Text{ "a #spider behind webs# in a grotto holds", /*french*/ "l'#araignée derrière une toile# dans une grotte donne", /*spanish*/ "una #Skulltula tras la telaraña# de una cueva otorga" }, }); - hintTable[HF_COW_GROTTO_COW] = HintText::Sometimes( + hintTable[RHT_HF_COW_GROTTO_COW] = HintText::Sometimes( { // obscure text Text{ "the #cobwebbed cow# gifts", /*french*/ "la #vache prisonnière d'araignées# donne", @@ -487,13 +488,13 @@ void HintTable_Init() { Text{ "a #cow behind webs# in a grotto gifts", /*french*/ "la #vache derrière les toiles# d'une grotte donne", /*spanish*/ "una #vaca tras la telaraña# de una cueva brinda" }); - hintTable[ZF_GS_HIDDEN_CAVE] = HintText::Sometimes({ + hintTable[RHT_ZF_GS_HIDDEN_CAVE] = HintText::Sometimes({ // obscure text Text{ "a spider high #above the icy waters# holds", /*french*/ "l'araignée #en haut des eaux glacées# donne", /*spanish*/ "una Skulltula en lo #alto de las congeladas aguas# otorga" }, }); - hintTable[WASTELAND_CHEST] = HintText::Sometimes({ + hintTable[RHT_WASTELAND_CHEST] = HintText::Sometimes({ // obscure text Text{ "#deep in the wasteland# is", /*french*/ "#loin dans le désert# gît", /*spanish*/ "en lo #profundo del desierto encantado# yace" }, @@ -501,13 +502,13 @@ void HintTable_Init() { /*spanish*/ "tras las #arenas# unas llamas revelan" }, }); - hintTable[WASTELAND_GS] = HintText::Sometimes({ + hintTable[RHT_WASTELAND_GS] = HintText::Sometimes({ // obscure text Text{ "a #spider in the wasteland# holds", /*french*/ "#l'araignée dans le désert# donne", /*spanish*/ "una #Skulltula del desierto encantado# otorga" }, }); - hintTable[GRAVEYARD_COMPOSERS_GRAVE_CHEST] = HintText::Sometimes({ + hintTable[RHT_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST] = HintText::Sometimes({ // obscure text Text{ "#flames in the Composers' Grave# reveal", /*french*/ "#les flammes dans le tombeau des compositeurs# cachent", @@ -516,19 +517,19 @@ void HintTable_Init() { /*spanish*/ "los #hermanos compositores esconden#" }, }); - hintTable[ZF_BOTTOM_FREESTANDING_POH] = HintText::Sometimes({ + hintTable[RHT_ZF_BOTTOM_FREESTANDING_POH] = HintText::Sometimes({ // obscure text Text{ "#under the icy waters# lies", /*french*/ "#sous les eaux glacées# se cache", /*spanish*/ "#bajo las congeladas aguas# yace" }, }); - hintTable[GC_POT_FREESTANDING_POH] = HintText::Sometimes({ + hintTable[RHT_GC_POT_FREESTANDING_POH] = HintText::Sometimes({ // obscure text Text{ "spinning #Goron pottery# contains", /*french*/ "la #potterie Goron# contient", /*spanish*/ "una #cerámica goron# contiene" }, }); - hintTable[ZD_KING_ZORA_THAWED] = HintText::Sometimes( + hintTable[RHT_ZD_KING_ZORA_THAWED] = HintText::Sometimes( { // obscure text Text{ "a #defrosted dignitary# gifts", /*french*/ "le #monarque libéré# donne", @@ -539,25 +540,25 @@ void HintTable_Init() { Text{ "unfreezing #King Zora# grants", /*french*/ "dégeler # le Roi Zora# donne", /*spanish*/ "#descongelar al Rey Zora# conduce a" }); - hintTable[ZD_TRADE_PRESCRIPTION] = HintText::Sometimes({ + hintTable[RHT_ZD_TRADE_PRESCRIPTION] = HintText::Sometimes({ // obscure text Text{ "#King Zora# hurriedly entrusts", /*french*/ "le #roi Zora# confie rapidement", /*spanish*/ "el #Rey Zora# otorga con prisa" }, }); - hintTable[DMC_DEKU_SCRUB] = HintText::Sometimes({ + hintTable[RHT_DMC_DEKU_SCRUB] = HintText::Sometimes({ // obscure text Text{ "a single #scrub in the crater# sells", /*french*/ "la #peste Mojo dans le cratère# vend", /*spanish*/ "un solitario #deku del cráter# vende" }, }); - hintTable[DMC_GS_CRATE] = HintText::Sometimes({ + hintTable[RHT_DMC_GS_CRATE] = HintText::Sometimes({ // obscure text Text{ "a spider under a #crate in the crater# holds", /*french*/ "la Skulltula dans une #boîte volcanique# a", /*spanish*/ "una Skulltula bajo una #caja del cráter# otorga" }, }); - hintTable[DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST] = HintText::Sometimes( + hintTable[RHT_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST] = HintText::Sometimes( { // obscure text Text{ "a #temporal stone within a tree# contains", /*french*/ "la #pierre bleue dans un arbre# mène à", @@ -569,7 +570,7 @@ void HintTable_Init() { /*french*/ "la #pierre temporelle dans l'Arbre Mojo# cache", /*spanish*/ "un #bloque temporal del Gran Árbol Deku# contiene" }); - hintTable[DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM] = HintText::Sometimes( + hintTable[RHT_DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM] = HintText::Sometimes( { // obscure text Text{ "a #spider on a ceiling in a tree# holds", /*french*/ "l'#araignée haut-perchée dans un arbre# a", @@ -581,7 +582,7 @@ void HintTable_Init() { /*french*/ "la#Skulltula dans le Cimetière de l'Arbre Mojo# a", /*spanish*/ "una #Skulltula en el techo del Gran Árbol Deku# otorga" }); - hintTable[DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM] = HintText::Sometimes( + hintTable[RHT_DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM] = HintText::Sometimes( { // obscure text Text{ "a spider under #temporal stones in a cavern# holds", @@ -594,7 +595,7 @@ void HintTable_Init() { /*french*/ "la Skulltula sous #la pierre temporelle dans la Caverne Dodongo# a", /*spanish*/ "una Skulltula bajo #bloques temporales de la Cueva de los Dodongos# otorga" }); - hintTable[JABU_JABUS_BELLY_BOOMERANG_CHEST] = HintText::Sometimes( + hintTable[RHT_JABU_JABUS_BELLY_BOOMERANG_CHEST] = HintText::Sometimes( { // obscure text Text{ "a school of #stingers swallowed by a deity# guard", @@ -606,7 +607,7 @@ void HintTable_Init() { Text{ "a school of #stingers swallowed by Jabu-Jabu# guard", /*french*/ "les #raies dans Jabu-Jabu# protègent", /*spanish*/ "unos #stingers engullidos por Jabu-Jabu# guardan" }); - hintTable[JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM] = HintText::Sometimes( + hintTable[RHT_JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM] = HintText::Sometimes( { // obscure text Text{ "a spider surrounded by #shadows in the belly of a deity# holds", @@ -619,7 +620,7 @@ void HintTable_Init() { /*french*/ "la Skulltula entourée d'#ombres dans Jabu-Jabu# possède", /*spanish*/ "una Skulltula rodeada de #sombras en la Tripa de Jabu-Jabu# otorga" }); - hintTable[JABU_JABUS_BELLY_MQ_COW] = HintText::Sometimes( + hintTable[RHT_JABU_JABUS_BELLY_MQ_COW] = HintText::Sometimes( { // obscure text Text{ "a #cow swallowed by a deity# gifts", /*french*/ "la #vache dans le gardien# donne", @@ -630,7 +631,7 @@ void HintTable_Init() { Text{ "a #cow swallowed by Jabu-Jabu# gifts", /*french*/ "la #vache avallée par Jabu-Jabu# donne", /*spanish*/ "una #vaca engullida por Jabu-Jabu# brinda" }); - hintTable[FIRE_TEMPLE_SCARECROW_CHEST] = HintText::Sometimes( + hintTable[RHT_FIRE_TEMPLE_SCARECROW_CHEST] = HintText::Sometimes( { // obscure text Text{ "a #scarecrow atop the volcano# hides", /*french*/ "l'#épouvantail au sommet d'un volcan# donne", @@ -641,7 +642,7 @@ void HintTable_Init() { Text{ "#Pierre atop the Fire Temple# hides", /*french*/ "#Pierre au sommet du Temple du Feu# donne", /*spanish*/ "#Pierre en lo alto del Templo del Fuego# esconde" }); - hintTable[FIRE_TEMPLE_MEGATON_HAMMER_CHEST] = HintText::Sometimes( + hintTable[RHT_FIRE_TEMPLE_MEGATON_HAMMER_CHEST] = HintText::Sometimes( { // obscure text Text{ "the #Flare Dancer atop the volcano# guards a chest containing", @@ -654,7 +655,7 @@ void HintTable_Init() { /*french*/ "le #Danse-Flamme au sommet du Temple du Feu# protège", /*spanish*/ "el #Bailaguego en lo alto del Templo del Fuego# otorga" }); - hintTable[FIRE_TEMPLE_MQ_CHEST_ON_FIRE] = HintText::Sometimes( + hintTable[RHT_FIRE_TEMPLE_MQ_CHEST_ON_FIRE] = HintText::Sometimes( { // obscure text Text{ "the #Flare Dancer atop the volcano# guards a chest containing", @@ -667,7 +668,7 @@ void HintTable_Init() { /*french*/ "le #Danse-Flamme au sommet du Temple du Feu# protège", /*spanish*/ "el #Bailafuego en lo alto del Templo del Fuego# otorga" }); - hintTable[FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE] = HintText::Sometimes( + hintTable[RHT_FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE] = HintText::Sometimes( { // obscure text Text{ "a #spider under a block in the volcano# holds", @@ -680,7 +681,7 @@ void HintTable_Init() { /*french*/ "une #Skulltula sous un bloc dans le Temple du Feu# a", /*spanish*/ "una #Skulltula bajo un bloque del Templo del Fuego# otorga" }); - hintTable[WATER_TEMPLE_RIVER_CHEST] = HintText::Sometimes( + hintTable[RHT_WATER_TEMPLE_RIVER_CHEST] = HintText::Sometimes( { // obscure text Text{ "beyond the #river under the lake# waits", /*french*/ "au delà de #la rivière sous le lac# se cache", @@ -692,7 +693,7 @@ void HintTable_Init() { /*french*/ "au delà de #la rivière dans le Temple de l'Eau# se cache", /*spanish*/ "tras el #río del Templo del Agua# yace" }); - hintTable[WATER_TEMPLE_BOSS_KEY_CHEST] = HintText::Sometimes( + hintTable[RHT_WATER_TEMPLE_BOSS_KEY_CHEST] = HintText::Sometimes( { // obscure text Text{ "dodging #rolling boulders under the lake# leads to", @@ -705,7 +706,7 @@ void HintTable_Init() { /*french*/ "éviter des #rochers roulants dans le Temple de l'Eau# mène à", /*spanish*/ "esquivar #rocas rondantes del Templo del Agua# conduce a" }); - hintTable[WATER_TEMPLE_GS_BEHIND_GATE] = HintText::Sometimes( + hintTable[RHT_WATER_TEMPLE_GS_BEHIND_GATE] = HintText::Sometimes( { // obscure text Text{ "a spider behind a #gate under the lake# holds", @@ -718,7 +719,7 @@ void HintTable_Init() { /*french*/ "la Skulltula derrière une #barrière dans le Temple de l'Eau# a", /*spanish*/ "una Skulltula tras #una valla del Templo del Agua# otorga" }); - hintTable[WATER_TEMPLE_MQ_FREESTANDING_KEY] = HintText::Sometimes( + hintTable[RHT_WATER_TEMPLE_MQ_FREESTANDING_KEY] = HintText::Sometimes( { // obscure text Text{ "hidden in a #box under the lake# lies", /*french*/ "dans une #boîte sous le lac# gît", @@ -729,7 +730,7 @@ void HintTable_Init() { Text{ "hidden in a #box in the Water Temple# lies", /*french*/ "dans une #boîte dans le Temple de l'Eau# gît", /*spanish*/ "en una #caja del Templo del Agua# yace" }); - hintTable[WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA] = HintText::Sometimes( + hintTable[RHT_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA] = HintText::Sometimes( { // obscure text Text{ "the #locked spider under the lake# holds", /*french*/ "l'#araignée emprisonnée sous le lac# a", @@ -741,7 +742,7 @@ void HintTable_Init() { /*french*/ "une #Skulltula emprisonnée dans le Temple de l'Eau# a", /*spanish*/ "la #Skulltula enjaulada del Templo del Agua# otorga" }); - hintTable[WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH] = HintText::Sometimes( + hintTable[RHT_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH] = HintText::Sometimes( { // obscure text Text{ "a spider behind a #gate under the lake# holds", @@ -754,7 +755,7 @@ void HintTable_Init() { /*french*/ "une #Skulltula derrière une barrière dans le Temple de l'Eau# a", /*spanish*/ "una Skulltula tras una #valla del Templo del Agua#" }); - hintTable[GERUDO_TRAINING_GROUNDS_UNDERWATER_SILVER_RUPEE_CHEST] = HintText::Sometimes({ + hintTable[RHT_GERUDO_TRAINING_GROUND_UNDERWATER_SILVER_RUPEE_CHEST] = HintText::Sometimes({ // obscure text Text{ "those who seek #sunken silver rupees# will find", /*french*/ "ceux qui pêchent les #joyaux argentés# trouveront", @@ -763,7 +764,7 @@ void HintTable_Init() { /*spanish*/ "la #instrucción submarina de las bandidas# premia" }, }); - hintTable[GERUDO_TRAINING_GROUNDS_MQ_UNDERWATER_SILVER_RUPEE_CHEST] = HintText::Sometimes({ + hintTable[RHT_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST] = HintText::Sometimes({ // obscure text Text{ "those who seek #sunken silver rupees# will find", /*french*/ "ceux qui pêchent les #joyaux argentés# trouveront", @@ -772,21 +773,21 @@ void HintTable_Init() { /*spanish*/ "la #instrucción submarina de las bandidas# premia" }, }); - hintTable[GERUDO_TRAINING_GROUNDS_MAZE_PATH_FINAL_CHEST] = HintText::Sometimes({ + hintTable[RHT_GERUDO_TRAINING_GROUND_MAZE_PATH_FINAL_CHEST] = HintText::Sometimes({ // obscure text Text{ "the final prize of #the thieves' training# is", /*french*/ "la récompense ultime de #l'épreuve des voleurs# est", /*spanish*/ "la recompensa final de la #instrucción de las bandida# brinda" }, }); - hintTable[GERUDO_TRAINING_GROUNDS_MQ_ICE_ARROWS_CHEST] = HintText::Sometimes({ + hintTable[RHT_GERUDO_TRAINING_GROUND_MQ_ICE_ARROWS_CHEST] = HintText::Sometimes({ // obscure text Text{ "the final prize of #the thieves' training# is", /*french*/ "la récompense ultime de #l'épreuve des voleurs# est", /*spanish*/ "el premio final de la #instrucción de las bandidas# brinda" }, }); - hintTable[BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST] = HintText::Sometimes( + hintTable[RHT_BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST] = HintText::Sometimes( { // obscure text Text{ "the well's #grasping ghoul# hides", /*french*/ "la #terreur du Puits# cache", @@ -799,7 +800,7 @@ void HintTable_Init() { Text{ "#Dead Hand in the well# holds", /*french*/ "le #Poigneur dans le Puits# cache", /*spanish*/ "la #Mano Muerta del pozo# concede" }); - hintTable[BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST] = HintText::Sometimes( + hintTable[RHT_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST] = HintText::Sometimes( { // obscure text Text{ "the well's #grasping ghoul# hides", /*french*/ "la #terreur du Puits# cache", @@ -812,7 +813,7 @@ void HintTable_Init() { Text{ "#Dead Hand in the well# holds", /*french*/ "le #Poigneur dans le Puits# cache", /*spanish*/ "la #Mano Muerta del pozo# concede" }); - hintTable[SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST] = HintText::Sometimes( + hintTable[RHT_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST] = HintText::Sometimes( { // obscure text Text{ "the treasure #sought by Nabooru# is", /*french*/ "le trésor que #recherche Nabooru# est", @@ -823,13 +824,13 @@ void HintTable_Init() { Text{ "upon the #Colossus's right hand# is", /*french*/ "sur la #main droite du colosse# repose", /*spanish*/ "en la #mano derecha del Coloso# yace" }); - hintTable[SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST] = HintText::Sometimes({ + hintTable[RHT_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST] = HintText::Sometimes({ // obscure text Text{ "upon the #Colossus's left hand# is", /*french*/ "sur la #main gauche du colosse# repose", /*spanish*/ "en la #mano izquierda del Coloso# yace" }, }); - hintTable[SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST] = HintText::Sometimes( + hintTable[RHT_SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST] = HintText::Sometimes( { // obscure text Text{ "a #temporal paradox in the Colossus# yields", @@ -842,7 +843,7 @@ void HintTable_Init() { /*french*/ "le #paradoxe temporel dans le Temple de l'Esprit# révèle", /*spanish*/ "una #paradoja temporal del Coloso# conduce a" }); - hintTable[SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST] = HintText::Sometimes( + hintTable[RHT_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST] = HintText::Sometimes( { // obscure text Text{ "a #symphony in the Colossus# yields", /*french*/ "la #symphonie du colosse# révèle", @@ -854,7 +855,7 @@ void HintTable_Init() { /*french*/ "les #cinq chansons du Temple de l'Esprit# révèlent", /*spanish*/ "una #sinfonía del Coloso# conduce a" }); - hintTable[SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM] = HintText::Sometimes( + hintTable[RHT_SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM] = HintText::Sometimes( { // obscure text Text{ "a #spider's symphony in the Colossus# yields", @@ -867,13 +868,13 @@ void HintTable_Init() { /*french*/ "la #mélodie de la Skulltula du Temple de l'Esprit# révèle", /*spanish*/ "la #Skulltula de la sinfonía del Coloso# otorga" }); - hintTable[SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST] = HintText::Sometimes({ + hintTable[RHT_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST] = HintText::Sometimes({ // obscure text Text{ "shadows in an #invisible maze# guard", /*french*/ "les ombres dans le #labyrinthe invisible# protègent", /*spanish*/ "las sombras del #laberinto misterioso# esconden" }, }); - hintTable[SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST] = HintText::Sometimes({ + hintTable[RHT_SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST] = HintText::Sometimes({ // obscure text Text{ "shadows in an #invisible maze# guard", /*french*/ "les ombres dans le #labyrinthe invisible# protègent", /*spanish*/ "las sombras del #laberinto invisible# esconden" }, @@ -883,99 +884,99 @@ void HintTable_Init() { | ENTRANCE HINT TEXT | ---------------------------*/ - hintTable[DESERT_COLOSSUS_TO_COLOSSUS_GROTTO] = HintText::Entrance({ + hintTable[RHT_DESERT_COLOSSUS_TO_COLOSSUS_GROTTO] = HintText::Entrance({ // obscure text Text{ "lifting a #rock in the desert# reveals", /*french*/ "soulever une #roche dans le désert# révèle", /*spanish*/ "levantar una #roca del desierto# revela" }, }); - hintTable[GV_GROTTO_LEDGE_TO_GV_OCTOROK_GROTTO] = HintText::Entrance({ + hintTable[RHT_GV_GROTTO_LEDGE_TO_GV_OCTOROK_GROTTO] = HintText::Entrance({ // obscure text Text{ "a rock on #a ledge in the valley# hides", /*french*/ "soulever une #roche dans la vallée# révèle", /*spanish*/ "levantar una #roca al borde del valle# esconde" }, }); - hintTable[GC_GROTTO_PLATFORM_TO_GC_GROTTO] = HintText::Entrance({ + hintTable[RHT_GC_GROTTO_PLATFORM_TO_GC_GROTTO] = HintText::Entrance({ // obscure text Text{ "a #pool of lava# in Goron City blocks the way to", /*french*/ "l'#étang de lave# dans le village Goron renferme", /*spanish*/ "un #estanque de lava# en la Ciudad Goron bloquea el paso a" }, }); - hintTable[GERUDO_FORTRESS_TO_GF_STORMS_GROTTO] = HintText::Entrance({ + hintTable[RHT_GERUDO_FORTRESS_TO_GF_STORMS_GROTTO] = HintText::Entrance({ // obscure text Text{ "a #storm within Gerudo's Fortress# reveals", /*french*/ "la #tempête dans la forteresse# révèle", /*spanish*/ "una #tormenta en la Fortaleza Gerudo# revela" }, }); - hintTable[ZORAS_DOMAIN_TO_ZD_STORMS_GROTTO] = HintText::Entrance({ + hintTable[RHT_ZORAS_DOMAIN_TO_ZD_STORMS_GROTTO] = HintText::Entrance({ // obscure text Text{ "a #storm within Zora's Domain# reveals", /*french*/ "la #tempête dans le Domaine Zora# révèle", /*spanish*/ "una #tormenta en la Región de los Zora# revela" }, }); - hintTable[HYRULE_CASTLE_GROUNDS_TO_HC_STORMS_GROTTO] = HintText::Entrance({ + hintTable[RHT_HYRULE_CASTLE_GROUNDS_TO_HC_STORMS_GROTTO] = HintText::Entrance({ // obscure text Text{ "a #storm near the castle# reveals", /*french*/ "la #tempête près du château# révèle", /*spanish*/ "una #tormenta junto al castillo# revela" }, }); - hintTable[GV_FORTRESS_SIDE_TO_GV_STORMS_GROTTO] = HintText::Entrance({ + hintTable[RHT_GV_FORTRESS_SIDE_TO_GV_STORMS_GROTTO] = HintText::Entrance({ // obscure text Text{ "a #storm in the valley# reveals", /*french*/ "la #tempête dans la vallée# révèle", /*spanish*/ "una #tormenta en el valle# revela" }, }); - hintTable[DESERT_COLOSSUS_TO_COLOSSUS_GREAT_FAIRY_FOUNTAIN] = HintText::Entrance({ + hintTable[RHT_DESERT_COLOSSUS_TO_COLOSSUS_GREAT_FAIRY_FOUNTAIN] = HintText::Entrance({ // obscure text Text{ "a #fractured desert wall# hides", /*french*/ "le #mur fragile du désert# cache", /*spanish*/ "una #agrietada pared del desierto# esconde" }, }); - hintTable[GANONS_CASTLE_GROUNDS_TO_OGC_GREAT_FAIRY_FOUNTAIN] = HintText::Entrance({ + hintTable[RHT_GANONS_CASTLE_GROUNDS_TO_OGC_GREAT_FAIRY_FOUNTAIN] = HintText::Entrance({ // obscure text Text{ "a #heavy pillar# outside the castle obstructs", /*french*/ "le #rocher fragile près du château# cache", /*spanish*/ "una #pesada columna# fuera del castillo obstruye" }, }); - hintTable[ZORAS_FOUNTAIN_TO_ZF_GREAT_FAIRY_FOUNTAIN] = HintText::Entrance({ + hintTable[RHT_ZORAS_FOUNTAIN_TO_ZF_GREAT_FAIRY_FOUNTAIN] = HintText::Entrance({ // obscure text Text{ "a #fountain wall# hides", /*french*/ "le #mur fragile du réservoir# cache", /*spanish*/ "una #pared de la fuente# esconde" }, }); - hintTable[GV_FORTRESS_SIDE_TO_GV_CARPENTER_TENT] = HintText::Entrance({ + hintTable[RHT_GV_FORTRESS_SIDE_TO_GV_CARPENTER_TENT] = HintText::Entrance({ // obscure text Text{ "a #tent in the valley# covers", /*french*/ "la #tente dans la vallée# recouvre", /*spanish*/ "una #tienda de campaña del valle# cubre" }, }); - hintTable[GRAVEYARD_WARP_PAD_REGION_TO_SHADOW_TEMPLE_ENTRYWAY] = HintText::Entrance({ + hintTable[RHT_GRAVEYARD_WARP_PAD_REGION_TO_SHADOW_TEMPLE_ENTRYWAY] = HintText::Entrance({ // obscure text Text{ "at the #back of the Graveyard#, there is", /*french*/ "#derrière le Cimetière# gît", /*spanish*/ "en la #parte trasera del cementerio# se halla" }, }); - hintTable[LAKE_HYLIA_TO_WATER_TEMPLE_LOBBY] = HintText::Entrance({ + hintTable[RHT_LAKE_HYLIA_TO_WATER_TEMPLE_LOBBY] = HintText::Entrance({ // obscure text Text{ "deep #under a vast lake#, one can find", /*french*/ "#sous le lac# gît", /*spanish*/ "en las #profundidades de un lago inmenso# se halla" }, }); - hintTable[GERUDO_FORTRESS_TO_GERUDO_TRAINING_GROUNDS_LOBBY] = HintText::Entrance({ + hintTable[RHT_GERUDO_FORTRESS_TO_GERUDO_TRAINING_GROUNDS_LOBBY] = HintText::Entrance({ // obscure text Text{ "paying a #fee to the Gerudos# grants access to", /*french*/ "l'#entrée payante des Gerudo# donne accès à", /*spanish*/ "pagarle una #tasa a las gerudo# da acceso a" }, }); - hintTable[ZORAS_FOUNTAIN_TO_JABU_JABUS_BELLY_BEGINNING] = HintText::Entrance({ + hintTable[RHT_ZORAS_FOUNTAIN_TO_JABU_JABUS_BELLY_BEGINNING] = HintText::Entrance({ // obscure text Text{ "inside #Jabu-Jabu#, one can find", /*french*/ "#dans Jabu-Jabu# se trouve", /*spanish*/ "dentro de #Jabu-Jabu# se halla" }, }); - hintTable[KAKARIKO_VILLAGE_TO_BOTTOM_OF_THE_WELL] = HintText::Entrance({ + hintTable[RHT_KAKARIKO_VILLAGE_TO_BOTTOM_OF_THE_WELL] = HintText::Entrance({ // obscure text Text{ "a #village well# leads to", /*french*/ "dans le fond du #Puits du village# gît", /*spanish*/ "el #pozo de un pueblo# conduce a" }, @@ -986,120 +987,120 @@ void HintTable_Init() { ---------------------------*/ // maybe make a new type for this? I'm not sure if it really matters - hintTable[LINKS_POCKET] = HintText::Exclude({ + hintTable[RHT_LINKS_POCKET] = HintText::Exclude({ // obscure text Text{ "Link's Pocket", /*french*/ "les Poches de @", /*spanish*/ "el bolsillo de @" }, }); - hintTable[KOKIRI_FOREST] = HintText::Exclude({ + hintTable[RHT_KOKIRI_FOREST] = HintText::Exclude({ // obscure text Text{ "Kokiri Forest", /*french*/ "la Forêt Kokiri", /*spanish*/ "el Bosque Kokiri" }, }); - hintTable[THE_LOST_WOODS] = HintText::Exclude({ + hintTable[RHT_THE_LOST_WOODS] = HintText::Exclude({ // obscure text Text{ "the Lost Woods", /*french*/ "les Bois Perdus", /*spanish*/ "el Bosque Perdido" }, }); - hintTable[SACRED_FOREST_MEADOW] = HintText::Exclude({ + hintTable[RHT_SACRED_FOREST_MEADOW] = HintText::Exclude({ // obscure text Text{ "Sacred Forest Meadow", /*french*/ "le Bosquet Sacré", /*spanish*/ "la pradera sagrada del bosque" }, }); - hintTable[HYRULE_FIELD] = HintText::Exclude({ + hintTable[RHT_HYRULE_FIELD] = HintText::Exclude({ // obscure text Text{ "Hyrule Field", /*french*/ "la Plaine d'Hyrule", /*spanish*/ "la Llanura de Hyrule" }, }); - hintTable[LAKE_HYLIA] = HintText::Exclude({ + hintTable[RHT_LAKE_HYLIA] = HintText::Exclude({ // obscure text Text{ "Lake Hylia", /*french*/ "le Lac Hylia", /*spanish*/ "el Lago Hylia" }, }); - hintTable[GERUDO_VALLEY] = HintText::Exclude({ + hintTable[RHT_GERUDO_VALLEY] = HintText::Exclude({ // obscure text Text{ "Gerudo Valley", /*french*/ "la Vallée Gerudo", /*spanish*/ "el Valle Gerudo" }, }); - hintTable[GERUDO_FORTRESS] = HintText::Exclude({ + hintTable[RHT_GERUDO_FORTRESS] = HintText::Exclude({ // obscure text Text{ "Gerudo's Fortress", /*french*/ "le Repaire des Voleurs", /*spanish*/ "la Fortaleza Gerudo" }, }); - hintTable[HAUNTED_WASTELAND] = HintText::Exclude({ + hintTable[RHT_HAUNTED_WASTELAND] = HintText::Exclude({ // obscure text Text{ "Haunted Wasteland", /*french*/ "le Désert Hanté", /*spanish*/ "el desierto encantado" }, }); - hintTable[DESERT_COLOSSUS] = HintText::Exclude({ + hintTable[RHT_DESERT_COLOSSUS] = HintText::Exclude({ // obscure text Text{ "Desert Colossus", /*french*/ "le Colosse du Désert", /*spanish*/ "el Coloso del Desierto" }, }); - hintTable[THE_MARKET] = HintText::Exclude({ + hintTable[RHT_THE_MARKET] = HintText::Exclude({ // obscure text Text{ "the Market", /*french*/ "la Place du Marché", /*spanish*/ "la plaza del mercado" }, }); - hintTable[TEMPLE_OF_TIME] = HintText::Exclude({ + hintTable[RHT_TEMPLE_OF_TIME] = HintText::Exclude({ // obscure text Text{ "Temple of Time", /*french*/ "le Temple du Temps", /*spanish*/ "el Templo del Tiempo" }, }); - hintTable[HYRULE_CASTLE] = HintText::Exclude({ + hintTable[RHT_HYRULE_CASTLE] = HintText::Exclude({ // obscure text Text{ "Hyrule Castle", /*french*/ "le Château d'Hyrule", /*spanish*/ "el Castillo de Hyrule" }, }); - hintTable[OUTSIDE_GANONS_CASTLE] = HintText::Exclude({ + hintTable[RHT_OUTSIDE_GANONS_CASTLE] = HintText::Exclude({ // obscure text Text{ "outside Ganon's Castle", /*french*/ "les alentours du Château&de Ganon", /*spanish*/ "el exterior del Castillo de Ganon" }, }); - hintTable[KAKARIKO_VILLAGE] = HintText::Exclude({ + hintTable[RHT_KAKARIKO_VILLAGE] = HintText::Exclude({ // obscure text Text{ "Kakariko Village", /*french*/ "le Village Cocorico", /*spanish*/ "Kakariko" }, }); - hintTable[THE_GRAVEYARD] = HintText::Exclude({ + hintTable[RHT_THE_GRAVEYARD] = HintText::Exclude({ // obscure text Text{ "the Graveyard", /*french*/ "le Cimetière", /*spanish*/ "el cementerio" }, }); - hintTable[DEATH_MOUNTAIN_TRAIL] = HintText::Exclude({ + hintTable[RHT_DEATH_MOUNTAIN_TRAIL] = HintText::Exclude({ // obscure text Text{ "Death Mountain Trail", /*french*/ "le Chemin du Péril", /*spanish*/ "el sendero de la Montaña de la Muerte" }, }); - hintTable[GORON_CITY] = HintText::Exclude({ + hintTable[RHT_GORON_CITY] = HintText::Exclude({ // obscure text Text{ "Goron City", /*french*/ "le Village Goron", /*spanish*/ "la Ciudad Goron" }, }); - hintTable[DEATH_MOUNTAIN_CRATER] = HintText::Exclude({ + hintTable[RHT_DEATH_MOUNTAIN_CRATER] = HintText::Exclude({ // obscure text Text{ "Death Mountain Crater", /*french*/ "le Cratère du Péril", /*spanish*/ "el cráter de la Montaña de la Muerte" }, }); - hintTable[ZORAS_RIVER] = HintText::Exclude({ + hintTable[RHT_ZORAS_RIVER] = HintText::Exclude({ // obscure text Text{ "Zora's River", /*french*/ "la Rivière Zora", /*spanish*/ "el Río Zora" }, }); - hintTable[ZORAS_DOMAIN] = HintText::Exclude({ + hintTable[RHT_ZORAS_DOMAIN] = HintText::Exclude({ // obscure text Text{ "Zora's Domain", /*french*/ "le Domaine Zora", /*spanish*/ "la Región de los Zora" }, }); - hintTable[ZORAS_FOUNTAIN] = HintText::Exclude({ + hintTable[RHT_ZORAS_FOUNTAIN] = HintText::Exclude({ // obscure text Text{ "Zora's Fountain", /*french*/ "la Fontaine Zora", /*spanish*/ "la Fuente Zora" }, }); - hintTable[LON_LON_RANCH] = HintText::Exclude({ + hintTable[RHT_LON_LON_RANCH] = HintText::Exclude({ // obscure text Text{ "Lon Lon Ranch", /*french*/ "le Ranch Lon Lon", /*spanish*/ "el Rancho Lon Lon" }, }); @@ -1108,437 +1109,437 @@ void HintTable_Init() { | REGION HINT TEXT | ---------------------------*/ - hintTable[KF_LINKS_HOUSE] = HintText::Region({ + hintTable[RHT_KF_LINKS_HOUSE] = HintText::Region({ // obscure text Text{ "Link's House", /*french*/ "la #maison de @#", /*spanish*/ "la casa de @" }, }); - // hintTable[TOT_MAIN] = HintText::Region({ + // hintTable[RHT_TOT_MAIN] = HintText::Region({ // //obscure text // Text{"the #Temple of Time#", /*french*/"le #Temple du Temps#", /*spanish*/"el Templo del // Tiempo"}, // }); - hintTable[KF_MIDOS_HOUSE] = HintText::Region({ + hintTable[RHT_KF_MIDOS_HOUSE] = HintText::Region({ // obscure text Text{ "Mido's house", /*french*/ "la Cabane du Grand Mido", /*spanish*/ "la casa de Mido" }, }); - hintTable[KF_SARIAS_HOUSE] = HintText::Region({ + hintTable[RHT_KF_SARIAS_HOUSE] = HintText::Region({ // obscure text Text{ "Saria's House", /*french*/ "la Cabane de Saria", /*spanish*/ "la casa de Saria" }, }); - hintTable[KF_HOUSE_OF_TWINS] = HintText::Region({ + hintTable[RHT_KF_HOUSE_OF_TWINS] = HintText::Region({ // obscure text Text{ "the #House of Twins#", /*french*/ "la Cabane des Jumelles", /*spanish*/ "la casa de las gemelas" }, }); - hintTable[KF_KNOW_IT_ALL_HOUSE] = HintText::Region({ + hintTable[RHT_KF_KNOW_IT_ALL_HOUSE] = HintText::Region({ // obscure text Text{ "Know-It-All Brothers' House", /*french*/ "la Cabane des frères Je-Sais-Tout", /*spanish*/ "la casa de los hermanos Sabelotodo" }, }); - hintTable[KF_KOKIRI_SHOP] = HintText::Region({ + hintTable[RHT_KF_KOKIRI_SHOP] = HintText::Region({ // obscure text Text{ "the #Kokiri Shop#", /*french*/ "le #Magasin Kokiri#", /*spanish*/ "la tienda kokiri" }, }); - hintTable[LH_LAB] = HintText::Region({ + hintTable[RHT_LH_LAB] = HintText::Region({ // obscure text Text{ "the #Lakeside Laboratory#", /*french*/ "le #Laboratoire du Lac#", /*spanish*/ "el laboratorio del lago" }, }); - hintTable[LH_FISHING_HOLE] = HintText::Region({ + hintTable[RHT_LH_FISHING_HOLE] = HintText::Region({ // obscure text Text{ "the #Fishing Pond#", /*french*/ "l'#Étang#", /*spanish*/ "el estanque" }, }); - hintTable[GV_CARPENTER_TENT] = HintText::Region({ + hintTable[RHT_GV_CARPENTER_TENT] = HintText::Region({ // obscure text Text{ "the #Carpenters' tent#", /*french*/ "la #Tente des charpentiers#", /*spanish*/ "la #tienda de campaña de los carpinteros#" }, }); - hintTable[MARKET_GUARD_HOUSE] = HintText::Region({ + hintTable[RHT_MARKET_GUARD_HOUSE] = HintText::Region({ // obscure text Text{ "the #Guard House#", /*french*/ "le #poste de garde#", /*spanish*/ "la caseta de guardia" }, }); - hintTable[MARKET_MASK_SHOP] = HintText::Region({ + hintTable[RHT_MARKET_MASK_SHOP] = HintText::Region({ // obscure text Text{ "the #Happy Mask Shop#", /*french*/ "la #Foire Aux Masques#", /*spanish*/ "la tienda de La Máscara Feliz" }, }); - hintTable[MARKET_BOMBCHU_BOWLING] = HintText::Region({ + hintTable[RHT_MARKET_BOMBCHU_BOWLING] = HintText::Region({ // obscure text Text{ "the #Bombchu Bowling Alley#", /*french*/ "le #Bowling Teigneux#", /*spanish*/ "la Bolera Bombchu" }, }); - hintTable[MARKET_POTION_SHOP] = HintText::Region({ + hintTable[RHT_MARKET_POTION_SHOP] = HintText::Region({ // obscure text Text{ "the #Market Potion Shop#", /*french*/ "l'#apothicaire de la Place du Marché#", /*spanish*/ "la tienda de pociones de la plaza del mercado" }, }); - hintTable[MARKET_TREASURE_CHEST_GAME] = HintText::Region({ + hintTable[RHT_MARKET_TREASURE_CHEST_GAME] = HintText::Region({ // obscure text Text{ "the #Treasure Chest Shop#", /*french*/ "la #Chasse-aux-Trésors#", /*spanish*/ "el Cofre del Tesoro" }, }); - hintTable[MARKET_BOMBCHU_SHOP] = HintText::Region({ + hintTable[RHT_MARKET_BOMBCHU_SHOP] = HintText::Region({ // obscure text Text{ "the #Bombchu Shop#", /*french*/ "le #Magasin de Missiles#", /*spanish*/ "la Tienda Bombchu" }, }); - hintTable[MARKET_MAN_IN_GREEN_HOUSE] = HintText::Region({ + hintTable[RHT_MARKET_MAN_IN_GREEN_HOUSE] = HintText::Region({ // obscure text Text{ "Man in Green's House", /*french*/ "la #Maison de l'Homme en Vert#", /*spanish*/ "la casa del hombre de verde" }, }); - hintTable[KAK_WINDMILL] = HintText::Region({ + hintTable[RHT_KAK_WINDMILL] = HintText::Region({ // obscure text Text{ "the #Windmill#", /*french*/ "le #Moulin#", /*spanish*/ "el #molino#" }, }); - hintTable[KAK_CARPENTER_BOSS_HOUSE] = HintText::Region({ + hintTable[RHT_KAK_CARPENTER_BOSS_HOUSE] = HintText::Region({ // obscure text Text{ "the #Carpenters' Boss House#", /*french*/ "la #Maison du Chef des ouvriers#", /*spanish*/ "la casa del capataz de los carpinteros" }, }); - hintTable[KAK_HOUSE_OF_SKULLTULA] = HintText::Region({ + hintTable[RHT_KAK_HOUSE_OF_SKULLTULA] = HintText::Region({ // obscure text Text{ "the #House of Skulltula#", /*french*/ "la #Maison des Skulltulas#", /*spanish*/ "la casa de las Skulltulas" }, }); - hintTable[KAK_IMPAS_HOUSE] = HintText::Region({ + hintTable[RHT_KAK_IMPAS_HOUSE] = HintText::Region({ // obscure text Text{ "Impa's House", /*french*/ "la #Maison d'Impa#", /*spanish*/ "la casa de Impa" }, }); - hintTable[KAK_IMPAS_HOUSE_BACK] = HintText::Region({ + hintTable[RHT_KAK_IMPAS_HOUSE_BACK] = HintText::Region({ // obscure text Text{ "Impa's cow cage", /*french*/ "la #cage à vache d'Impa#", /*spanish*/ "la jaula de la vaca de Impa" }, }); - hintTable[KAK_ODD_POTION_BUILDING] = HintText::Region({ + hintTable[RHT_KAK_ODD_POTION_BUILDING] = HintText::Region({ // obscure text Text{ "Granny's Potion Shop", /*french*/ "la #maison bleue de Cocorico#", /*spanish*/ "la tienda de pociones de la abuela" }, }); - hintTable[GRAVEYARD_DAMPES_HOUSE] = HintText::Region({ + hintTable[RHT_GRAVEYARD_DAMPES_HOUSE] = HintText::Region({ // obscure text Text{ "Dampé's Hut", /*french*/ "la #Cabane du Fossoyeur#", /*spanish*/ "la cabaña de Dampé" }, }); - hintTable[GC_SHOP] = HintText::Region({ + hintTable[RHT_GC_SHOP] = HintText::Region({ // obscure text Text{ "the #Goron Shop#", /*french*/ "la #Boutique Goron#", /*spanish*/ "la #tienda goron#" }, }); - hintTable[ZD_SHOP] = HintText::Region({ + hintTable[RHT_ZD_SHOP] = HintText::Region({ // obscure text Text{ "the #Zora Shop#", /*french*/ "la #Boutique Zora#", /*spanish*/ "la #tienda zora#" }, }); - hintTable[LLR_TALONS_HOUSE] = HintText::Region({ + hintTable[RHT_LLR_TALONS_HOUSE] = HintText::Region({ // obscure text Text{ "Talon's House", /*french*/ "la #Maison de Talon#", /*spanish*/ "la casa de Talon" }, }); - hintTable[LLR_STABLES] = HintText::Region({ + hintTable[RHT_LLR_STABLES] = HintText::Region({ // obscure text Text{ "a #stable#", /*french*/ "l'#Étable#", /*spanish*/ "el establo" }, }); - hintTable[LLR_TOWER] = HintText::Region({ + hintTable[RHT_LLR_TOWER] = HintText::Region({ // obscure text Text{ "the #Lon Lon Tower#", /*french*/ "le #silo du Ranch Lon Lon#", /*spanish*/ "la torre Lon Lon" }, }); - hintTable[MARKET_BAZAAR] = HintText::Region({ + hintTable[RHT_MARKET_BAZAAR] = HintText::Region({ // obscure text Text{ "the #Market Bazaar#", /*french*/ "le #Bazar de la Place du Marché#", /*spanish*/ "el bazar de la plaza del mercado" }, }); - hintTable[MARKET_SHOOTING_GALLERY] = HintText::Region({ + hintTable[RHT_MARKET_SHOOTING_GALLERY] = HintText::Region({ // obscure text Text{ "a #Slingshot Shooting Gallery#", /*french*/ "le #Jeu d'Adresse de la Place du Marché#", /*spanish*/ "el Tiro al Blanco con tirachinas" }, }); - hintTable[KAK_BAZAAR] = HintText::Region({ + hintTable[RHT_KAK_BAZAAR] = HintText::Region({ // obscure text Text{ "the #Kakariko Bazaar#", /*french*/ "le #Bazar de Cocorico#", /*spanish*/ "el bazar de Kakariko" }, }); - hintTable[KAK_POTION_SHOP_FRONT] = HintText::Region({ + hintTable[RHT_KAK_POTION_SHOP_FRONT] = HintText::Region({ // obscure text Text{ "the #Kakariko Potion Shop#", /*french*/ "l'#apothicaire de Cocorico#", /*spanish*/ "la tienda de pociones de Kakariko" }, }); - hintTable[KAK_POTION_SHOP_BACK] = HintText::Region({ + hintTable[RHT_KAK_POTION_SHOP_BACK] = HintText::Region({ // obscure text Text{ "the #Kakariko Potion Shop#", /*french*/ "l'#apothicaire de Cocorico#", /*spanish*/ "la tienda de pociones de Kakariko" }, }); - hintTable[KAK_SHOOTING_GALLERY] = HintText::Region({ + hintTable[RHT_KAK_SHOOTING_GALLERY] = HintText::Region({ // obscure text Text{ "a #Bow Shooting Gallery#", /*french*/ "le #jeu d'adresse de Cocorico#", /*spanish*/ "el Tiro al Blanco con arco" }, }); - hintTable[COLOSSUS_GREAT_FAIRY_FOUNTAIN] = HintText::Region({ + hintTable[RHT_COLOSSUS_GREAT_FAIRY_FOUNTAIN] = HintText::Region({ // obscure text Text{ "a #Great Fairy Fountain#", /*french*/ "une #Fontaine Royale des Fées#", /*spanish*/ "una fuente de la Gran Hada" }, }); - hintTable[HC_GREAT_FAIRY_FOUNTAIN] = HintText::Region({ + hintTable[RHT_HC_GREAT_FAIRY_FOUNTAIN] = HintText::Region({ // obscure text Text{ "a #Great Fairy Fountain#", /*french*/ "une #Fontaine Royale des Fées#", /*spanish*/ "una fuente de la Gran Hada" }, }); - hintTable[OGC_GREAT_FAIRY_FOUNTAIN] = HintText::Region({ + hintTable[RHT_OGC_GREAT_FAIRY_FOUNTAIN] = HintText::Region({ // obscure text Text{ "a #Great Fairy Fountain#", /*french*/ "une #Fontaine Royale des Fées#", /*spanish*/ "una fuente de la Gran Hada" }, }); - hintTable[DMC_GREAT_FAIRY_FOUNTAIN] = HintText::Region({ + hintTable[RHT_DMC_GREAT_FAIRY_FOUNTAIN] = HintText::Region({ // obscure text Text{ "a #Great Fairy Fountain#", /*french*/ "une #Fontaine Royale des Fées#", /*spanish*/ "una fuente de la Gran Hada" }, }); - hintTable[DMT_GREAT_FAIRY_FOUNTAIN] = HintText::Region({ + hintTable[RHT_DMT_GREAT_FAIRY_FOUNTAIN] = HintText::Region({ // obscure text Text{ "a #Great Fairy Fountain#", /*french*/ "une #Fontaine Royale des Fées#", /*spanish*/ "una fuente de la Gran Hada" }, }); - hintTable[ZF_GREAT_FAIRY_FOUNTAIN] = HintText::Region({ + hintTable[RHT_ZF_GREAT_FAIRY_FOUNTAIN] = HintText::Region({ // obscure text Text{ "a #Great Fairy Fountain#", /*french*/ "une #Fontaine Royale des Fées#", /*spanish*/ "una fuente de la Gran Hada" }, }); - hintTable[GRAVEYARD_SHIELD_GRAVE] = HintText::Region({ + hintTable[RHT_GRAVEYARD_SHIELD_GRAVE] = HintText::Region({ // obscure text Text{ "a #grave with a free chest#", /*french*/ "le #tombeau avec un trésor#", /*spanish*/ "la #tumba con un cofre#" }, }); - hintTable[GRAVEYARD_HEART_PIECE_GRAVE] = HintText::Region({ + hintTable[RHT_GRAVEYARD_HEART_PIECE_GRAVE] = HintText::Region({ // obscure text Text{ "a chest spawned by #Sun's Song#", /*french*/ "un #coffre apparaît avec le Chant du Soleil#", /*spanish*/ "la #tumba de la Canción del Sol#" }, }); - hintTable[GRAVEYARD_COMPOSERS_GRAVE] = HintText::Region({ + hintTable[RHT_GRAVEYARD_COMPOSERS_GRAVE] = HintText::Region({ // obscure text Text{ "the #Composers' Grave#", /*french*/ "la #Tombe royale#", /*spanish*/ "el #Panteón Real#" }, }); - hintTable[GRAVEYARD_DAMPES_GRAVE] = HintText::Region({ + hintTable[RHT_GRAVEYARD_DAMPES_GRAVE] = HintText::Region({ // obscure text Text{ "Dampé's Grave", /*french*/ "la #Tombe d'Igor#", /*spanish*/ "la #tumba de Dampé#" }, }); - hintTable[DMT_COW_GROTTO] = HintText::Region({ + hintTable[RHT_DMT_COW_GROTTO] = HintText::Region({ // obscure text Text{ "a solitary #Cow#", /*french*/ "la #grotte avec une vache#", /*spanish*/ "una #vaca# solitaria" }, }); - hintTable[HC_STORMS_GROTTO] = HintText::Region({ + hintTable[RHT_HC_STORMS_GROTTO] = HintText::Region({ // obscure text Text{ "a sandy grotto with #fragile walls#", /*french*/ "la #grotte avec des murs fragiles#", /*spanish*/ "la arenosa gruta de #frágiles paredes#" }, }); - hintTable[HF_TEKTITE_GROTTO] = HintText::Region({ + hintTable[RHT_HF_TEKTITE_GROTTO] = HintText::Region({ // obscure text Text{ "a pool guarded by a #Tektite#", /*french*/ "l'#étang sous-terrain avec un Araknon#", /*spanish*/ "un charco custodiado por un #Tektite#" }, }); - hintTable[HF_NEAR_KAK_GROTTO] = HintText::Region({ + hintTable[RHT_HF_NEAR_KAK_GROTTO] = HintText::Region({ // obscure text Text{ "a #Big Skulltula# guarding a Gold one", /*french*/ "la #grotte d'araignées#", /*spanish*/ "una #gran Skulltula# custodiando una dorada" }, }); - hintTable[HF_COW_GROTTO] = HintText::Region({ + hintTable[RHT_HF_COW_GROTTO] = HintText::Region({ // obscure text Text{ "a grotto full of #spider webs#", /*french*/ "la #grotte couverte de toiles d'araignées#", /*spanish*/ "una gruta llena de #telarañas#" }, }); - hintTable[KAK_REDEAD_GROTTO] = HintText::Region({ + hintTable[RHT_KAK_REDEAD_GROTTO] = HintText::Region({ // obscure text Text{ "#ReDeads# guarding a chest", /*french*/ "le tombeau de #deux morts#", /*spanish*/ "los #ReDeads# que custodian un cofre" }, }); - hintTable[SFM_WOLFOS_GROTTO] = HintText::Region({ + hintTable[RHT_SFM_WOLFOS_GROTTO] = HintText::Region({ // obscure text Text{ "#Wolfos# guarding a chest", /*french*/ "la #grotte iridescente#", /*spanish*/ "los #Wolfos# que custodian un cofre" }, }); - hintTable[GV_OCTOROK_GROTTO] = HintText::Region({ + hintTable[RHT_GV_OCTOROK_GROTTO] = HintText::Region({ // obscure text Text{ "an #Octorok# guarding a rich pool", /*french*/ "un #étang sous-terrain avec un Octorok#", /*spanish*/ "un #Octorok# que custodia un lujoso charco" }, }); - hintTable[DEKU_THEATER] = HintText::Region({ + hintTable[RHT_DEKU_THEATER] = HintText::Region({ // obscure text Text{ "the #Lost Woods Stage#", /*french*/ "le #théâtre sylvestre#", /*spanish*/ "el #escenario del Bosque Perdido#" }, }); - hintTable[ZR_OPEN_GROTTO] = HintText::Region({ + hintTable[RHT_ZR_OPEN_GROTTO] = HintText::Region({ // obscure text Text{ "a #generic grotto#", /*french*/ "une #grotte avec un trésor#", /*spanish*/ "una #cueva genérica#" }, }); - hintTable[DMC_UPPER_GROTTO] = HintText::Region({ + hintTable[RHT_DMC_UPPER_GROTTO] = HintText::Region({ // obscure text Text{ "a #generic grotto#", /*french*/ "une #grotte avec un trésor#", /*spanish*/ "una #cueva genérica#" }, }); - hintTable[DMT_STORMS_GROTTO] = HintText::Region({ + hintTable[RHT_DMT_STORMS_GROTTO] = HintText::Region({ // obscure text Text{ "a #generic grotto#", /*french*/ "une #grotte avec un trésor#", /*spanish*/ "una #cueva genérica#" }, }); - hintTable[KAK_OPEN_GROTTO] = HintText::Region({ + hintTable[RHT_KAK_OPEN_GROTTO] = HintText::Region({ // obscure text Text{ "a #generic grotto#", /*french*/ "une #grotte avec un trésor#", /*spanish*/ "una #cueva genérica#" }, }); - hintTable[HF_NEAR_MARKET_GROTTO] = HintText::Region({ + hintTable[RHT_HF_NEAR_MARKET_GROTTO] = HintText::Region({ // obscure text Text{ "a #generic grotto#", /*french*/ "une #grotte avec un trésor#", /*spanish*/ "una #cueva genérica#" }, }); - hintTable[HF_OPEN_GROTTO] = HintText::Region({ + hintTable[RHT_HF_OPEN_GROTTO] = HintText::Region({ // obscure text Text{ "a #generic grotto#", /*french*/ "une #grotte avec un trésor#", /*spanish*/ "una #cueva genérica#" }, }); - hintTable[HF_SOUTHEAST_GROTTO] = HintText::Region({ + hintTable[RHT_HF_SOUTHEAST_GROTTO] = HintText::Region({ // obscure text Text{ "a #generic grotto#", /*french*/ "une #grotte avec un trésor#", /*spanish*/ "una #cueva genérica#" }, }); - hintTable[KF_STORMS_GROTTO] = HintText::Region({ + hintTable[RHT_KF_STORMS_GROTTO] = HintText::Region({ // obscure text Text{ "a #generic grotto#", /*french*/ "une #grotte avec un trésor#", /*spanish*/ "una #cueva genérica#" }, }); - hintTable[LW_NEAR_SHORTCUTS_GROTTO] = HintText::Region({ + hintTable[RHT_LW_NEAR_SHORTCUTS_GROTTO] = HintText::Region({ // obscure text Text{ "a #generic grotto#", /*french*/ "une #grotte avec un trésor#", /*spanish*/ "una #cueva genérica#" }, }); - hintTable[HF_INSIDE_FENCE_GROTTO] = HintText::Region({ + hintTable[RHT_HF_INSIDE_FENCE_GROTTO] = HintText::Region({ // obscure text Text{ "a #single Upgrade Deku Scrub#", /*french*/ "une #grotte avec une peste Mojo#", /*spanish*/ "una cueva con un #solitario mercader deku#" }, }); - hintTable[LW_SCRUBS_GROTTO] = HintText::Region({ + hintTable[RHT_LW_SCRUBS_GROTTO] = HintText::Region({ // obscure text Text{ "#2 Deku Scrubs# including an Upgrade one", /*french*/ "une #grotte avec deux pestes Mojo#", /*spanish*/ "una cueva con #dos mercaderes deku#" }, }); - hintTable[COLOSSUS_GROTTO] = HintText::Region({ + hintTable[RHT_COLOSSUS_GROTTO] = HintText::Region({ // obscure text Text{ "2 Deku Scrubs", /*french*/ "une #grotte avec deux pestes Mojo#", /*spanish*/ "una cueva con #dos mercaderes deku#" }, }); - hintTable[ZR_STORMS_GROTTO] = HintText::Region({ + hintTable[RHT_ZR_STORMS_GROTTO] = HintText::Region({ // obscure text Text{ "2 Deku Scrubs", /*french*/ "une #grotte avec deux pestes Mojo#", /*spanish*/ "una cueva con #dos mercaderes deku#" }, }); - hintTable[SFM_STORMS_GROTTO] = HintText::Region({ + hintTable[RHT_SFM_STORMS_GROTTO] = HintText::Region({ // obscure text Text{ "2 Deku Scrubs", /*french*/ "une #grotte avec deux pestes Mojo#", /*spanish*/ "una cueva con #dos mercaderes deku#" }, }); - hintTable[GV_STORMS_GROTTO] = HintText::Region({ + hintTable[RHT_GV_STORMS_GROTTO] = HintText::Region({ // obscure text Text{ "2 Deku Scrubs", /*french*/ "une #grotte avec deux pestes Mojo#", /*spanish*/ "una cueva con #dos mercaderes deku#" }, }); - hintTable[LH_GROTTO] = HintText::Region({ + hintTable[RHT_LH_GROTTO] = HintText::Region({ // obscure text Text{ "3 Deku Scrubs", /*french*/ "une #grotte avec trois pestes Mojo#", /*spanish*/ "una cueva con #tres mercaderes deku#" }, }); - hintTable[DMC_HAMMER_GROTTO] = HintText::Region({ + hintTable[RHT_DMC_HAMMER_GROTTO] = HintText::Region({ // obscure text Text{ "3 Deku Scrubs", /*french*/ "une #grotte avec trois pestes Mojo#", /*spanish*/ "una cueva con #tres mercaderes deku#" }, }); - hintTable[GC_GROTTO] = HintText::Region({ + hintTable[RHT_GC_GROTTO] = HintText::Region({ // obscure text Text{ "3 Deku Scrubs", /*french*/ "une #grotte avec trois pestes Mojo#", /*spanish*/ "una cueva con #tres mercaderes deku#" }, }); - hintTable[LLR_GROTTO] = HintText::Region({ + hintTable[RHT_LLR_GROTTO] = HintText::Region({ // obscure text Text{ "3 Deku Scrubs", /*french*/ "une #grotte avec trois pestes Mojo#", /*spanish*/ "una cueva con #tres mercaderes deku#" }, }); - hintTable[ZR_FAIRY_GROTTO] = HintText::Region({ + hintTable[RHT_ZR_FAIRY_GROTTO] = HintText::Region({ // obscure text Text{ "a small #Fairy Fountain#", /*french*/ "une #fontaine de fées#", /*spanish*/ "una pequeña #fuente de hadas#" }, }); - hintTable[HF_FAIRY_GROTTO] = HintText::Region({ + hintTable[RHT_HF_FAIRY_GROTTO] = HintText::Region({ // obscure text Text{ "a small #Fairy Fountain#", /*french*/ "une #fontaine de fées#", /*spanish*/ "una pequeña #fuente de hadas#" }, }); - hintTable[SFM_FAIRY_GROTTO] = HintText::Region({ + hintTable[RHT_SFM_FAIRY_GROTTO] = HintText::Region({ // obscure text Text{ "a small #Fairy Fountain#", /*french*/ "une #fontaine de fées#", /*spanish*/ "una pequeña #fuente de hadas#" }, }); - hintTable[ZD_STORMS_GROTTO] = HintText::Region({ + hintTable[RHT_ZD_STORMS_GROTTO] = HintText::Region({ // obscure text Text{ "a small #Fairy Fountain#", /*french*/ "une #fontaine de fées#", /*spanish*/ "una pequeña #fuente de hadas#" }, }); - hintTable[GF_STORMS_GROTTO] = HintText::Region({ + hintTable[RHT_GF_STORMS_GROTTO] = HintText::Region({ // obscure text Text{ "a small #Fairy Fountain#", /*french*/ "une #fontaine de fées#", /*spanish*/ "una pequeña #fuente de hadas#" }, @@ -1548,48 +1549,48 @@ void HintTable_Init() { | JUNK HINT TEXT | ---------------------------*/ - hintTable[JUNK02] = HintText::Junk({ + hintTable[RHT_JUNK02] = HintText::Junk({ // obscure text Text{ "They say you must read the names of \"Special Deal\" shop items carefully.", /*french*/ "Selon moi, les \"Offres spéciales\" sont parfois trompeuses... Lisez les attentivement!", /*spanish*/ "Según dicen, se debería prestar atención a los nombres de las ofertas especiales." }, }); - hintTable[JUNK03] = HintText::Junk({ + hintTable[RHT_JUNK03] = HintText::Junk({ // obscure text Text{ "They say that Zelda is a poor leader.", /*french*/ "Selon moi, Zelda ne ferait pas un bon monarque.", /*spanish*/ "Según dicen, Zelda es mala líder." }, }); - hintTable[JUNK04] = HintText::Junk({ + hintTable[RHT_JUNK04] = HintText::Junk({ // obscure text Text{ "These hints can be quite useful. This is an exception.", /*french*/ "Ces indices sont très utiles, à l'exception de celui-ci.", /*spanish*/ "Las pistas suelen servir de ayuda. En cambio, esta no." }, }); - hintTable[JUNK05] = HintText::Junk({ + hintTable[RHT_JUNK05] = HintText::Junk({ // obscure text Text{ "They say that the Lizalfos in Dodongo's Cavern like to play in lava.", /*french*/ "Selon moi, les Lézalfos de la Caverne Dodongo aiment patauger dans la lave.", /*spanish*/ "Según dicen, a los Lizalfos de la Cueva de los Dodongos les gusta jugar en la lava." }, }); - hintTable[JUNK06] = HintText::Junk({ + hintTable[RHT_JUNK06] = HintText::Junk({ // obscure text Text{ "They say that all the Zora drowned in Wind Waker.", /*french*/ "Selon moi, les Zoras se sont noyés dans Wind Waker.", /*spanish*/ "Según dicen, en Wind Waker todos los zora se ahogaron." }, }); - hintTable[JUNK07] = HintText::Junk({ + hintTable[RHT_JUNK07] = HintText::Junk({ // obscure text Text{ "If Gorons eat rocks, does that mean I'm in danger?", /*french*/ "Ne dis pas au Gorons que je suis ici. Ils mangent des roches, tu sais!", /*spanish*/ "Si los Goron se tragan las piedras, ¿no me hace ser una especia vulnarable o algo así" }, }); - hintTable[JUNK08] = HintText::Junk({ + hintTable[RHT_JUNK08] = HintText::Junk({ // obscure text Text{ "'Member when Ganon was a blue pig?^I 'member.", @@ -1597,20 +1598,20 @@ void HintTable_Init() { /*spanish*/ "¿T'acuerdas cuando Ganon era un cerdo azul?^Qué tiempos, chico." }, }); - hintTable[JUNK09] = HintText::Junk({ + hintTable[RHT_JUNK09] = HintText::Junk({ // obscure text Text{ "One who does not have Triforce can't go in.", /*french*/ "Ceux sans Triforce doivent rebrousser chemin.", /*spanish*/ "Aquel que no porte la Trifuerza no podrá pasar." }, }); - hintTable[JUNK10] = HintText::Junk({ + hintTable[RHT_JUNK10] = HintText::Junk({ // obscure text Text{ "Save your future, end the Happy Mask Salesman.", /*french*/ "Selon moi, tu t'éviteras des jours de malheur si tu vaincs le vendeur de masques...", /*spanish*/ "Salva tu futuro, acaba con el dueño de La Máscara Feliz." }, }); - hintTable[JUNK11] = HintText::Junk({ + hintTable[RHT_JUNK11] = HintText::Junk({ // obscure text Text{ "Glitches are a pathway to many abilities some consider to be... Unnatural.", /*french*/ "Les glitchs sont un moyen d'acquérir de nombreuses facultés considérées par certains comme... contraire " @@ -1618,75 +1619,75 @@ void HintTable_Init() { /*spanish*/ "Los glitches son el camino a muchas habilidades que varios consideran... nada natural." }, }); - hintTable[JUNK12] = HintText::Junk({ + hintTable[RHT_JUNK12] = HintText::Junk({ // obscure text Text{ "I'm stoned. Get it?", /*french*/ "Allez, roche, papier, ciseau...&Roche.", /*spanish*/ "Me he quedado de piedra. ¿Lo pillas?" }, }); - hintTable[JUNK13] = HintText::Junk({ + hintTable[RHT_JUNK13] = HintText::Junk({ // obscure text Text{ "Hoot! Hoot! Would you like me to repeat that?", /*french*/ "Hou hou! Veux-tu que je répète tout ça?", /*spanish*/ "¡Buuu, buuu! ¿Te lo vuelvo a repetir?" }, }); - hintTable[JUNK14] = HintText::Junk({ + hintTable[RHT_JUNK14] = HintText::Junk({ // obscure text Text{ "Gorons are stupid. They eat rocks.", /*french*/ "Les Gorons sont des vraies têtes dures.", /*spanish*/ "Los Goron son tontos. Se comen las piedras." }, }); - hintTable[JUNK15] = HintText::Junk({ + hintTable[RHT_JUNK15] = HintText::Junk({ // obscure text Text{ "They say that Lon Lon Ranch prospered under Ingo.", /*french*/ "Selon moi, le Ranch Lon Lon était plus prospère sous Ingo.", /*spanish*/ "Según dicen, el Rancho Lon Lon prosperó gracias a Ingo." }, }); - hintTable[JUNK16] = HintText::Junk({ + hintTable[RHT_JUNK16] = HintText::Junk({ // obscure text Text{ "The single rupee is a unique item.", /*french*/ "Nul objet n'est plus unique que le rubis vert.", /*spanish*/ "La rupia de uno es un objeto singular." }, }); - hintTable[JUNK17] = HintText::Junk({ + hintTable[RHT_JUNK17] = HintText::Junk({ // obscure text Text{ "Without the Lens of Truth, the Treasure Chest Mini-Game is a 1 out of 32 chance.^Good luck!", /*french*/ "Gagner la Chasse-aux-Trésors est 1 chance sur 32.^Bonne chance!", /*spanish*/ "Sin la Lupa de la Verdad, ganarías 1/32 veces en el Cofre del Tesoro.^¡Buena suerte con ello!" }, }); - hintTable[JUNK18] = HintText::Junk({ + hintTable[RHT_JUNK18] = HintText::Junk({ // obscure text Text{ "Use bombs wisely.", /*french*/ "Utilise les bombes avec précaution.", /*spanish*/ "No desperdicies las bombas." }, }); - hintTable[JUNK19] = HintText::Junk({ + hintTable[RHT_JUNK19] = HintText::Junk({ // obscure text Text{ "They say that Volvagia hates splinters", /*french*/ "Selon moi, Volvagia déteste les échardes.", /*spanish*/ "Según dicen, Volvagia le teme a las astillas." }, }); - hintTable[JUNK20] = HintText::Junk({ + hintTable[RHT_JUNK20] = HintText::Junk({ // obscure text Text{ "They say that funky monkeys can be spotted on Friday.", /*french*/ "Selon moi, des capucins coquins sortent le vendredi.", /*spanish*/ "Según dicen, en los viernes puedes hallar monos marchosos." }, }); - hintTable[JUNK21] = HintText::Junk({ + hintTable[RHT_JUNK21] = HintText::Junk({ // obscure text Text{ "I found you, faker!", /*french*/ "Ah-ha! Je t'ai trouvé!", /*spanish*/ "¡Ahí estás, impostor!" }, }); - hintTable[JUNK22] = HintText::Junk({ + hintTable[RHT_JUNK22] = HintText::Junk({ // obscure text Text{ "They say the Groose is loose.", /*french*/ "Selon moi, Hergo est le vrai héros.", /*spanish*/ "Según dicen, Malton es un espanto." }, }); - hintTable[JUNK23] = HintText::Junk({ + hintTable[RHT_JUNK23] = HintText::Junk({ // obscure text Text{ "They say that players who select the \"ON\" option for \"MOTION CONTROL\" are the real \"Zelda players!\"", @@ -1695,129 +1696,129 @@ void HintTable_Init() { "Zelda." }, }); - hintTable[JUNK24] = HintText::Junk({ + hintTable[RHT_JUNK24] = HintText::Junk({ // obscure text Text{ "What happened to Sheik?", /*french*/ "Donc... Qu'est-ce qui arrive avec Sheik?", /*spanish*/ "¿Qué la habrá pasado a Sheik?" }, }); - hintTable[JUNK25] = HintText::Junk({ + hintTable[RHT_JUNK25] = HintText::Junk({ // obscure text Text{ "L2P @.", /*french*/ "Arrête de lire les indices et joue comme un grand, @.", /*spanish*/ "Mira que eres novato, @." }, }); - hintTable[JUNK26] = HintText::Junk({ + hintTable[RHT_JUNK26] = HintText::Junk({ // obscure text Text{ "I've heard you can cheat at Sploosh Kaboom.", /*french*/ "Selon moi, il y a une carte aux trésors à Mercantîle... Duh!", /*spanish*/ "He oído por ahí que puedes hacer trampa en el Sploosh Kaboom." }, }); - hintTable[JUNK27] = HintText::Junk({ + hintTable[RHT_JUNK27] = HintText::Junk({ // obscure text Text{ "I'm Lonk from Pennsylvania.", /*french*/ "Je suis Lonk, le héros de Pennsylvanie!", /*spanish*/ "Soy Lonk, de Pensilvania." }, }); - hintTable[JUNK28] = HintText::Junk({ + hintTable[RHT_JUNK28] = HintText::Junk({ // obscure text Text{ "I bet you'd like to have more bombs.", /*french*/ "Je parie que tu veux plus de bombes.", /*spanish*/ "Me apuesto a que quisieras tener más bombas." }, }); - hintTable[JUNK29] = HintText::Junk({ + hintTable[RHT_JUNK29] = HintText::Junk({ // obscure text Text{ "When all else fails, use Fire.", /*french*/ "Quand rien ne marche, utilise le feu.", /*spanish*/ "Cuando nada funcione, usa el fuego." }, }); - hintTable[JUNK30] = HintText::Junk({ + hintTable[RHT_JUNK30] = HintText::Junk({ // obscure text Text{ "Here's a hint, @. Don't be bad.", /*french*/ "Selon moi, la #Triforce# n'est pas dans le jeu... Duh!", /*spanish*/ "Aquí tienes una pista, @: deja de ser manco." }, }); - hintTable[JUNK31] = HintText::Junk({ + hintTable[RHT_JUNK31] = HintText::Junk({ // obscure text Text{ "Game Over. Return of Ganon.", /*french*/ "Partie terminée. RETour de Ganon.", /*spanish*/ "Fin de la partida. El regreso de Ganon." }, }); - hintTable[JUNK32] = HintText::Junk({ + hintTable[RHT_JUNK32] = HintText::Junk({ // obscure text Text{ "May the way of the Hero lead to the Triforce.", /*french*/ "Que le chemin du héros te mène à la Triforce.", /*spanish*/ "Puede que la senda del héroe te lleve hacia la Trifuerza." }, }); - hintTable[JUNK33] = HintText::Junk({ + hintTable[RHT_JUNK33] = HintText::Junk({ // obscure text Text{ "Can't find an item? Scan an Amiibo.", /*french*/ "Tu cherches de quoi? Utilise un Amiibo!", /*spanish*/ "¿No encuentras algo? Escanea un amiibo." }, }); - hintTable[JUNK34] = HintText::Junk({ + hintTable[RHT_JUNK34] = HintText::Junk({ // obscure text Text{ "They say this game has just a few glitches.", /*french*/ "Selon moi, ce jeu est complètement exempt de glitchs.", /*spanish*/ "Dicen que este juego apenas tiene glitches." }, }); - hintTable[JUNK35] = HintText::Junk({ + hintTable[RHT_JUNK35] = HintText::Junk({ // obscure text Text{ "BRRING BRRING This is Ulrira. Wrong number?", /*french*/ "DRING DRING!! Pépé le Ramollo à l'appareil... Quoi? Faux numéro?", /*spanish*/ "¡Ring! ¡Ring! Al habla Ulrira. ¿Me he equivocado de número?" }, }); - hintTable[JUNK36] = HintText::Junk({ + hintTable[RHT_JUNK36] = HintText::Junk({ // obscure text Text{ "Tingle Tingle Kooloo Limpah!", /*french*/ "Tingle! Tingle! Kooloolin... Pah!", /*spanish*/ "Tingle, Tingle, Kurulín... ¡PA!" }, }); - hintTable[JUNK37] = HintText::Junk({ + hintTable[RHT_JUNK37] = HintText::Junk({ // obscure text Text{ "L is real 2401", /*french*/ "L is real 2401", /*spanish*/ "L es real 2401." }, }); - hintTable[JUNK38] = HintText::Junk({ + hintTable[RHT_JUNK38] = HintText::Junk({ // obscure text Text{ "They say that Ganondorf will appear in the next Mario Tennis.", /*french*/ "Selon moi, Ganondorf sera la nouvelle recrue dans Mario Tennis.", /*spanish*/ "Según dicen, Ganondorf estará en el próximo Mario Tennis." }, }); - hintTable[JUNK39] = HintText::Junk({ + hintTable[RHT_JUNK39] = HintText::Junk({ // obscure text Text{ "Medigoron sells the earliest Breath of the Wild demo.", /*french*/ "Selon moi, Medigoron vend une démo de #Breath of the Wild#.", /*spanish*/ "Medigoron vende la primera demo del Breath of the Wild." }, }); - hintTable[JUNK40] = HintText::Junk({ + hintTable[RHT_JUNK40] = HintText::Junk({ // obscure text Text{ "Can you move me? I don't get great service here.", /*french*/ "Peux-tu me déplacer? J'ai pas une bonne réception ici.", /*spanish*/ "¿Puedes llevarme a otro lado? Aquí nadie me presta atención." }, }); - hintTable[JUNK41] = HintText::Junk({ + hintTable[RHT_JUNK41] = HintText::Junk({ // obscure text Text{ "They say if you use Strength on the truck, you can find Mew.", /*french*/ "Selon moi, #Mew# se trouve dessous le camion... Duh!", /*spanish*/ "Según dicen, puedes hallar un Mew usando Fuerza contra el camión de Ciudad Carmín." }, }); - hintTable[JUNK42] = HintText::Junk({ + hintTable[RHT_JUNK42] = HintText::Junk({ // obscure text Text{ "I'm a helpful hint Gossip Stone!^See, I'm helping.", /*french*/ "Salut! Je suis une pierre de bons conseils!^Tiens, tu vois? J'aide bien, hein?", /*spanish*/ "Soy una Piedra Sheikah muy útil.^¡Mira cómo te ayudo!" }, }); - hintTable[JUNK43] = HintText::Junk({ + hintTable[RHT_JUNK43] = HintText::Junk({ // obscure text Text{ "Dear @, please come to the castle. I've baked a cake for you.&Yours truly, Princess Zelda.", /*french*/ @@ -1826,103 +1827,103 @@ void HintTable_Init() { "Querido @: Por favor, ven al castillo. He hecho una tarta para ti.&Sinceramente tuya: Princesa Zelda." }, }); - hintTable[JUNK44] = HintText::Junk({ + hintTable[RHT_JUNK44] = HintText::Junk({ // obscure text Text{ "They say all toasters toast toast.", /*french*/ "Selon moi, les grille-pains grillent du pain.", /*spanish*/ "Según dicen, todas las tostadoras tostan tostadas tostadas." }, }); - hintTable[JUNK45] = HintText::Junk({ + hintTable[RHT_JUNK45] = HintText::Junk({ // obscure text Text{ "You thought it would be a useful hint, but it was me, junk hint!", /*french*/ "Tu t'attendais à un bon indice... Mais c'était moi, un mauvais indice!", /*spanish*/ "Je... Creeías que iba a ser una piedra de utilidad, ¡pero no, era yo, la piedra de la agonía!" }, }); - hintTable[JUNK46] = HintText::Junk({ + hintTable[RHT_JUNK46] = HintText::Junk({ // obscure text Text{ "They say that quest guidance can be found at a talking rock.", /*french*/ "Selon moi, des #indices# se trouvent auprès d'une pierre parlante... Duh!", /*spanish*/ "Según dicen, puedes consultarle ayuda a rocas parlanchinas." }, }); - hintTable[JUNK47] = HintText::Junk({ + hintTable[RHT_JUNK47] = HintText::Junk({ // obscure text Text{ "They say that the final item you're looking for can be found somewhere in Hyrule.", /*french*/ "Selon moi, le #dernier objet# se trouve quelque part dans Hyrule... Duh!", /*spanish*/ "Según dicen, el último objeto que te falte puede estar en cualquier rincón de Hyrule." }, }); - hintTable[JUNK48] = HintText::Junk({ + hintTable[RHT_JUNK48] = HintText::Junk({ // obscure text Text{ "Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.", /*french*/ "Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.", /*spanish*/ "Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep." }, }); - hintTable[JUNK49] = HintText::Junk({ + hintTable[RHT_JUNK49] = HintText::Junk({ // obscure text Text{ "They say that Barinade fears Deku Nuts.", /*french*/ "Selon moi, Barinade a la frousse des noix Mojo.", /*spanish*/ "Según dicen, lo que más teme a Barinade son las nueces deku." }, }); - hintTable[JUNK50] = HintText::Junk({ + hintTable[RHT_JUNK50] = HintText::Junk({ // obscure text Text{ "They say that Flare Dancers do not fear Goron-crafted blades.", /*french*/ "Selon moi, le danse-flamme n'a pas peur des armes de Goron.", /*spanish*/ "Según dicen, los Bailafuegos no le temen a las armas forjadas por Gorons." }, }); - hintTable[JUNK51] = HintText::Junk({ + hintTable[RHT_JUNK51] = HintText::Junk({ // obscure text Text{ "They say that Morpha is easily trapped in a corner.", /*french*/ "Selon moi, Morpha est facilement coincé.", /*spanish*/ "Según dicen, puedes atrapar a Morpha con facilidad en una esquina." }, }); - hintTable[JUNK52] = HintText::Junk({ + hintTable[RHT_JUNK52] = HintText::Junk({ // obscure text Text{ "They say that Bongo Bongo really hates the cold.", /*french*/ "Selon moi, Bongo Bongo a facilement froid aux doigts.", /*spanish*/ "Según dicen, Bongo Bongo odia a muerte el frío." }, }); - hintTable[JUNK53] = HintText::Junk({ + hintTable[RHT_JUNK53] = HintText::Junk({ // obscure text Text{ "They say that your sword is most powerful when you put it away.", /*french*/ "Selon moi, ton épée est à pleine puissance quand tu la rengaines.", /*spanish*/ "Según dicen, tu espada se vuelve más poderosa si la guardas." }, }); - hintTable[JUNK54] = HintText::Junk({ + hintTable[RHT_JUNK54] = HintText::Junk({ // obscure text Text{ "They say that bombing the hole Volvagia last flew into can be rewarding.", /*french*/ "Selon moi, le trou où se creuse Volvagia est vulnérable aux bombes.", /*spanish*/ "Según dicen, trae buena suerte colocar una bomba en el último agujero de donde salió Volvagia." }, }); - hintTable[JUNK55] = HintText::Junk({ + hintTable[RHT_JUNK55] = HintText::Junk({ // obscure text Text{ "They say that invisible ghosts can be exposed with Deku Nuts.", /*french*/ "Selon moi, des fantômes invisibles apparaissent avec des noix Mojo.", /*spanish*/ "Según dicen, puedes exponer a los espectros invisibles con nueces deku." }, }); - hintTable[JUNK56] = HintText::Junk({ + hintTable[RHT_JUNK56] = HintText::Junk({ // obscure text Text{ "They say that the real Phantom Ganon is bright and loud.", /*french*/ "Selon moi, le vrai spectre de Ganon est clair et bruyant.", /*spanish*/ "Según dicen, el verdadero Ganon Fantasma es brillante y ruidoso." }, }); - hintTable[JUNK57] = HintText::Junk({ + hintTable[RHT_JUNK57] = HintText::Junk({ // obscure text Text{ "They say that walking backwards is very fast.", /*french*/ "Selon moi, tu fais marche arrière très rapidement pour un héros.", /*spanish*/ "Según dicen, es más rápido caminar hacia atrás." }, }); - hintTable[JUNK58] = HintText::Junk({ + hintTable[RHT_JUNK58] = HintText::Junk({ // obscure text Text{ "They say that leaping above the Market entrance enriches most children.", @@ -1930,56 +1931,56 @@ void HintTable_Init() { /*spanish*/ "Según dicen, saltar por las cadenas a la entrada de la plaza enriquece a muchos chiquillos." }, }); - hintTable[JUNK59] = HintText::Junk({ + hintTable[RHT_JUNK59] = HintText::Junk({ // obscure text Text{ "They say Ingo is not very good at planning ahead.", /*french*/ "Selon moi, Ingo ne fait pas un très bon geôlier.", /*spanish*/ "Según dicen, a Ingo no se le da especialmente bien planificar con antelación." }, }); - hintTable[JUNK60] = HintText::Junk({ + hintTable[RHT_JUNK60] = HintText::Junk({ // obscure text Text{ "You found a spiritual Stone! By which I mean, I worship Nayru.", /*french*/ "Vous avez trouvé une Pierre Ancestrale! En effet, je vénère la déesse Hylia.", /*spanish*/ "¡Has encontrado una piedra espiritual! Es que le rindo culto a Nayru..." }, }); - hintTable[JUNK61] = HintText::Junk({ + hintTable[RHT_JUNK61] = HintText::Junk({ // obscure text Text{ "They say that a flying strike with a Deku Stick is no stronger than a grounded one.", /*french*/ "Selon moi, un coup de bâton sauté n'est pas meilleur qu'au sol.", /*spanish*/ "Según dicen, los golpes aéreos con palos deku son tan fuertes como los normales." }, }); - hintTable[JUNK62] = HintText::Junk({ + hintTable[RHT_JUNK62] = HintText::Junk({ // obscure text Text{ "Open your eyes.^Open your eyes.^Wake up, @.", /*french*/ "Réveille-toi...^Réveille-toi.^Ouvre les yeux, @.", /*spanish*/ "Abre los ojos...^Abre los ojos...^Despierta, @..." }, }); - hintTable[JUNK63] = HintText::Junk({ + hintTable[RHT_JUNK63] = HintText::Junk({ // obscure text Text{ "They say that the Nocturne of Shadow can bring you very close to Ganon.", /*french*/ "Selon moi, le nocturne de l'ombre peut t'amener très près de Ganon.", /*spanish*/ "Según dicen, el Nocturno de la sombra te puede acercar mucho a Ganon." }, }); - hintTable[JUNK64] = HintText::Junk({ + hintTable[RHT_JUNK64] = HintText::Junk({ // obscure text Text{ "They say that Twinrova always casts the same spell the first three times.", /*french*/ "Selon moi, Twinrova lance toujours les mêmes trois premiers sorts.", /*spanish*/ "Según dicen, Birova siempre lanza el mismo hechizo las tres primeras veces." }, }); - hintTable[JUNK65] = HintText::Junk({ + hintTable[RHT_JUNK65] = HintText::Junk({ // obscure text Text{ "They say that the nightly builds may be unstable.", /*french*/ "Selon moi, les \"nightly builds\" peuvent être instables.", /*spanish*/ "Según dicen, las últimas nightlies pueden llegar a ser algo inestables." }, }); - hintTable[JUNK66] = HintText::Junk({ + hintTable[RHT_JUNK66] = HintText::Junk({ // obscure text Text{ "You're playing a Randomizer. I'm randomized!^Here's a random number: #4#.&Enjoy your Randomizer!", /*french*/ "Tu joues à un randomizer. Je suis aléatoire!^Voici un nombre aléatoire: #4#.&Bonne partie!", @@ -1988,14 +1989,14 @@ void HintTable_Init() { "#8#.&¡Diviértete!" }, }); - hintTable[JUNK67] = HintText::Junk({ + hintTable[RHT_JUNK67] = HintText::Junk({ // obscure text Text{ "They say Ganondorf's bolts can be reflected with glass or steel.", /*french*/ "Selon moi, les éclairs de Ganon se reflètent sur l'acier et le verre.", /*spanish*/ "Según dicen, puedes reflejar las esferas de energía de Ganondorf con cristal y acero." }, }); - hintTable[JUNK68] = HintText::Junk({ + hintTable[RHT_JUNK68] = HintText::Junk({ // obscure text Text{ "They say Ganon's tail is vulnerable to nuts, arrows, swords, explosives, hammers...^...sticks, seeds, " "boomerangs...^...rods, shovels, iron balls, angry bees...", @@ -2007,7 +2008,7 @@ void HintTable_Init() { "martillos...^...palos, semillas, bumeráns...^...cetros, palas, bolas de hierro, abejas..." }, }); - hintTable[JUNK69] = HintText::Junk({ + hintTable[RHT_JUNK69] = HintText::Junk({ // obscure text Text{ "They say that you're wasting time reading this hint, but I disagree. Talk to me again!", @@ -2015,20 +2016,20 @@ void HintTable_Init() { "Según dicen, pierdes el tiempo en leer esta pista, pero no pienso igual. ¡Vuelve a hablarme, ya verás!" }, }); - hintTable[JUNK70] = HintText::Junk({ + hintTable[RHT_JUNK70] = HintText::Junk({ // obscure text Text{ "They say Ganondorf knows where to find the instrument of his doom.", /*french*/ "Selon moi, Ganondorf sait où il a caché son point faible.", /*spanish*/ "Según dicen, Ganondorf sabe dónde hallar el instrumento de su perdición." }, }); - hintTable[JUNK71] = HintText::Junk({ + hintTable[RHT_JUNK71] = HintText::Junk({ // obscure text Text{ "I heard @ is pretty good at Zelda.", /*french*/ "Apparemment, @ est super bon à Zelda.", /*spanish*/ "He oído que a @ se le dan muy bien los Zelda." }, }); - hintTable[JUNK72] = HintText::Junk({ + hintTable[RHT_JUNK72] = HintText::Junk({ // obscure text Text{ "Hi @, we've been trying to reach you about your car's extended warranty. ", /*french*/ "Bonjour, @. Vous avez une voiture? Vous savez, nous offrons des assurances abordables...", @@ -2037,28 +2038,28 @@ void HintTable_Init() { "intereses ni comisiones." }, }); - hintTable[JUNK73] = HintText::Junk({ + hintTable[RHT_JUNK73] = HintText::Junk({ // obscure text Text{ "They say that the best weapon against Iron Knuckles is item 176.", /*french*/ "Selon moi, les hache-viandes sont vulnérables contre l'objet 176.", /*spanish*/ "Según dicen, la mejor arma para enfrentarse a los Nudillos de hierro es el objeto 176." }, }); - hintTable[JUNK74] = HintText::Junk({ + hintTable[RHT_JUNK74] = HintText::Junk({ // obscure text Text{ "They say that it's actually possible to beat the running man.", /*french*/ "Selon moi, il est possible de battre le coureur.&Donc, tu prends ton arc, et...", /*spanish*/ "Según dicen, con mucha perseverancia puedes ganarle al corredor con la capucha de conejo." }, }); - hintTable[JUNK75] = HintText::Junk({ + hintTable[RHT_JUNK75] = HintText::Junk({ // obscure text Text{ "They say that the stone-cold guardian of the Well is only present during work hours.", /*french*/ "Selon moi, le gardien de pierre du Puits quitte le soir pour aller se coucher.", /*spanish*/ "Según dicen, la inmensa roca que bloquea el pozo solo trabaja en horas laborales." }, }); - hintTable[JUNK76] = HintText::Junk({ + hintTable[RHT_JUNK76] = HintText::Junk({ // obscure text Text{ "They say this hint makes more sense in other languages.", @@ -2066,7 +2067,7 @@ void HintTable_Init() { /*spanish*/ "Según dicen, esta pista revela algo de vital importancia si cambias el idioma del juego..." }, }); - hintTable[JUNK77] = HintText::Junk({ + hintTable[RHT_JUNK77] = HintText::Junk({ // obscure text Text{ "BOK? No way.", /*french*/ "BD'accord? Hors de question.", /*spanish*/ "¿BVale? Ni hablar." }, }); @@ -2077,391 +2078,391 @@ void HintTable_Init() { #define HINT_TEXT_NEEDS_TRANSLATION_FR \ "Erreur 0x69a504:&Traduction manquante^C'est de la faute à Purple Hato!&J'vous jure!" - hintTable[JUNK78] = HintText::Junk({ + hintTable[RHT_JUNK78] = HintText::Junk({ //obscure text Text{"They say blarg...^...or at least briaguya does.", /*french*/"Tout ce que j'ai à dire, c'est blarg...^... 'fin c'est plutôt ce que briaguya dirait.", /*spanish*/"blarg"}, }); - hintTable[JUNK79] = HintText::Junk({ + hintTable[RHT_JUNK79] = HintText::Junk({ //obscure text Text{"They say this peace is what all true warriors strive for.", /*french*/"Selon moi, cette paix est ce pour quoi luttent tous les vrais guerriers.", /*spanish*/"blarg"}, }); - hintTable[JUNK80] = HintText::Junk({ + hintTable[RHT_JUNK80] = HintText::Junk({ //obscure text Text{"They say this ship is what all true gamers strive for.", /*french*/"Selon moi, cette version du port est ce pour quoi luttent tous les vrais gamers.", /*spanish*/"blarg"}, }); - hintTable[JUNK81] = HintText::Junk({ + hintTable[RHT_JUNK81] = HintText::Junk({ //obscure text Text{"They say that Glowsticks can be found in the Raveyard.", /*french*/"On peut trouver des Bâtons Lumineux sur le dancefloor du cimetière.", /*spanish*/"blarg"}, }); - hintTable[JUNK_WTC_1] = HintText::Junk({ + hintTable[RHT_JUNK_WTC_1] = HintText::Junk({ Text{ "They say %rthere are no more than 18&people on this island.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_WTC_2] = HintText::Junk({ + hintTable[RHT_JUNK_WTC_2] = HintText::Junk({ Text{ "They say I am one yet many", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_WTC_3] = HintText::Junk({ + hintTable[RHT_JUNK_WTC_3] = HintText::Junk({ Text{ "They say its all in the name of guiding&humanity down the right path.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_WTC_4] = HintText::Junk({ + hintTable[RHT_JUNK_WTC_4] = HintText::Junk({ Text{ "They say \"Repetition requested\"", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_WTC_5] = HintText::Junk({ + hintTable[RHT_JUNK_WTC_5] = HintText::Junk({ Text{ "They say %rThe red tells only the truth!", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_WTC_6] = HintText::Junk({ + hintTable[RHT_JUNK_WTC_6] = HintText::Junk({ Text{ "They say good tidings to you^my traitorous @", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_WTC_7] = HintText::Junk({ + hintTable[RHT_JUNK_WTC_7] = HintText::Junk({ Text{ "They say when the seagulls cried,&none were left alive.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_WTC_7] = HintText::Junk({ + hintTable[RHT_JUNK_WTC_7] = HintText::Junk({ Text{ "They say when the seagulls cried,&none were left alive.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_WTC_8] = HintText::Junk({ + hintTable[RHT_JUNK_WTC_8] = HintText::Junk({ Text{ "They say she is lying with the red letters!", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_WTC_9] = HintText::Junk({ + hintTable[RHT_JUNK_WTC_9] = HintText::Junk({ Text{ "They say we'll meet again,&when something else cries.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_WTC_10] = HintText::Junk({ + hintTable[RHT_JUNK_WTC_10] = HintText::Junk({ Text{ "They say \"Forgive me, but-^Your script will not be used.&....After all...^The one writing the rest of " "the script...&will be me.\"", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_WTC_11] = HintText::Junk({ + hintTable[RHT_JUNK_WTC_11] = HintText::Junk({ Text{ "They say tea is best enjoyed...^\"\"With your fellow monsters.\"\"", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_WTC_12] = HintText::Junk({ + hintTable[RHT_JUNK_WTC_12] = HintText::Junk({ Text{ "They say I shall make you some black tea. With my own hands, not magic.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SEI_1] = HintText::Junk({ + hintTable[RHT_JUNK_SEI_1] = HintText::Junk({ Text{ "They say you know I've kiboshed before...^and I will kibosh again.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SEI_2] = HintText::Junk({ + hintTable[RHT_JUNK_SEI_2] = HintText::Junk({ Text{ "They say if relationship @ walks through that door,^they will KILL independent @.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SEI_3] = HintText::Junk({ + hintTable[RHT_JUNK_SEI_3] = HintText::Junk({ Text{ "They say you gotta have the BIG Salad.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SEI_4] = HintText::Junk({ + hintTable[RHT_JUNK_SEI_4] = HintText::Junk({ Text{ "They say it's a festivus miracle", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SEI_5] = HintText::Junk({ + hintTable[RHT_JUNK_SEI_5] = HintText::Junk({ Text{ "They say there are no houses in Tuscany to rent.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SEI_6] = HintText::Junk({ + hintTable[RHT_JUNK_SEI_6] = HintText::Junk({ Text{ "They say my last boyfriend had a real&Kroner comprehension problem.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SEI_7] = HintText::Junk({ + hintTable[RHT_JUNK_SEI_7] = HintText::Junk({ Text{ "They say it's a festivus miracle.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SEI_8] = HintText::Junk({ + hintTable[RHT_JUNK_SEI_8] = HintText::Junk({ Text{ "They say Louis quit the importing&to focus on the exporting.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SEI_9] = HintText::Junk({ + hintTable[RHT_JUNK_SEI_9] = HintText::Junk({ Text{ "They say no thanks, I can't drink coffee&late at night, it keeps me up.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SEI_10] = HintText::Junk({ + hintTable[RHT_JUNK_SEI_10] = HintText::Junk({ Text{ "They say it's not a lie if you believe it.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SEI_11] = HintText::Junk({ + hintTable[RHT_JUNK_SEI_11] = HintText::Junk({ Text{ "They say there was a second spitter.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SEI_12] = HintText::Junk({ + hintTable[RHT_JUNK_SEI_12] = HintText::Junk({ Text{ "They say there was a second spitter.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SEI_13] = HintText::Junk({ + hintTable[RHT_JUNK_SEI_13] = HintText::Junk({ Text{ "They say the jerk store called,^they're running out of YOU.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SEI_14] = HintText::Junk({ + hintTable[RHT_JUNK_SEI_14] = HintText::Junk({ Text{ "They say when you look annoyed all the time,&people thing you are busy.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SEI_15] = HintText::Junk({ + hintTable[RHT_JUNK_SEI_15] = HintText::Junk({ Text{ "They say when you look annoyed all the time,&people think you are busy.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SEI_16] = HintText::Junk({ + hintTable[RHT_JUNK_SEI_16] = HintText::Junk({ Text{ "They say he fires people like its a bodily function.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SEI_17] = HintText::Junk({ + hintTable[RHT_JUNK_SEI_17] = HintText::Junk({ Text{ "They say he threatened to move the ship to New Jersey&just to upset people.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SEI_18] = HintText::Junk({ + hintTable[RHT_JUNK_SEI_18] = HintText::Junk({ Text{ "They say there was significant shrinkage.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SEI_19] = HintText::Junk({ + hintTable[RHT_JUNK_SEI_19] = HintText::Junk({ Text{ "They say if it wasn't for the toilet there'd be no books.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SEI_20] = HintText::Junk({ + hintTable[RHT_JUNK_SEI_20] = HintText::Junk({ Text{ "They say if it wasn't for the toilet there'd be no books.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SEI_21] = HintText::Junk({ + hintTable[RHT_JUNK_SEI_21] = HintText::Junk({ Text{ "They say don't trust men in capes.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SEI_22] = HintText::Junk({ + hintTable[RHT_JUNK_SEI_22] = HintText::Junk({ Text{ "They say @'s uncle works for Nintendo.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SEI_23] = HintText::Junk({ + hintTable[RHT_JUNK_SEI_23] = HintText::Junk({ Text{ "They say @'s stole the marble rye.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SEI_24] = HintText::Junk({ + hintTable[RHT_JUNK_SEI_24] = HintText::Junk({ Text{ "They say there is no better harmony&than the black and white cookie.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SEI_25] = HintText::Junk({ + hintTable[RHT_JUNK_SEI_25] = HintText::Junk({ Text{ "They say @ hasn't vomited since 1983.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SEI_26] = HintText::Junk({ + hintTable[RHT_JUNK_SEI_26] = HintText::Junk({ Text{ "They say you gotta have the early bird special.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SEI_27] = HintText::Junk({ + hintTable[RHT_JUNK_SEI_27] = HintText::Junk({ Text{ "They say a donation has been made in your name&to the human fund.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SEI_28] = HintText::Junk({ + hintTable[RHT_JUNK_SEI_28] = HintText::Junk({ Text{ "They say you want to be my latex salesman.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SEI_29] = HintText::Junk({ + hintTable[RHT_JUNK_SEI_29] = HintText::Junk({ Text{ "They say if every instinct you have is wrong...^... then the opposite would have to be right.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_OTR_MEANS_1] = HintText::Junk({ + hintTable[RHT_JUNK_OTR_MEANS_1] = HintText::Junk({ Text{ "They say OTR stands for&Over the Rainbow", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_OTR_MEANS_2] = HintText::Junk({ + hintTable[RHT_JUNK_OTR_MEANS_2] = HintText::Junk({ Text{ "They say that OTR stands for&Onions, Tomatoes, and Radishes", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_OTR_MEANS_3] = HintText::Junk({ + hintTable[RHT_JUNK_OTR_MEANS_3] = HintText::Junk({ Text{ "They say that OTR stands for&Ocarina of Time Resources", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_OTR_MEANS_4] = HintText::Junk({ + hintTable[RHT_JUNK_OTR_MEANS_4] = HintText::Junk({ Text{ "They say that OTR stands for&Over the Road", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_OTR_MEANS_5] = HintText::Junk({ + hintTable[RHT_JUNK_OTR_MEANS_5] = HintText::Junk({ Text{ "They say that OTR stands for&Off the Record", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_OTR_MEANS_6] = HintText::Junk({ + hintTable[RHT_JUNK_OTR_MEANS_6] = HintText::Junk({ Text{ "They say that OTR stands for&Office of Tax and Revenue", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_OTR_MEANS_7] = HintText::Junk({ + hintTable[RHT_JUNK_OTR_MEANS_7] = HintText::Junk({ Text{ "They say OTR stands for&Over the Rainbow", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_OTR_MEANS_8] = HintText::Junk({ + hintTable[RHT_JUNK_OTR_MEANS_8] = HintText::Junk({ Text{ "They say that OTR stands for&Office of Trade Relations", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_OTR_MEANS_9] = HintText::Junk({ + hintTable[RHT_JUNK_OTR_MEANS_9] = HintText::Junk({ Text{ "They say that OTR stands for&Original Theatrical Release", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_OTR_MEANS_10] = HintText::Junk({ + hintTable[RHT_JUNK_OTR_MEANS_10] = HintText::Junk({ Text{ "They say that OTR stands for&Operational Test Requirement", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_OTR_MEANS_11] = HintText::Junk({ + hintTable[RHT_JUNK_OTR_MEANS_11] = HintText::Junk({ Text{ "They say that OTR stands for&Operational Trouble Report", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_OTR_MEANS_12] = HintText::Junk({ + hintTable[RHT_JUNK_OTR_MEANS_12] = HintText::Junk({ Text{ "They say that OTR stands for&Oxygen Transmission Rate", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_OTR_MEANS_13] = HintText::Junk({ + hintTable[RHT_JUNK_OTR_MEANS_13] = HintText::Junk({ Text{ "They say that OTR stands for&One Touch Recording", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_OTR_MEANS_14] = HintText::Junk({ + hintTable[RHT_JUNK_OTR_MEANS_14] = HintText::Junk({ Text{ "They say that OTR stands for&Olympic Torch Relay", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_OTR_MEANS_15] = HintText::Junk({ + hintTable[RHT_JUNK_OTR_MEANS_15] = HintText::Junk({ Text{ "They say that OTR stands for&Off the Rack", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_OTR_MEANS_16] = HintText::Junk({ + hintTable[RHT_JUNK_OTR_MEANS_16] = HintText::Junk({ Text{ "They say that OTR stands for&Overhead Transfer Rate", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_OTR_MEANS_17] = HintText::Junk({ + hintTable[RHT_JUNK_OTR_MEANS_17] = HintText::Junk({ Text{ "They say that OTR stands for&Operational TurnaRound", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_OTR_MEANS_18] = HintText::Junk({ + hintTable[RHT_JUNK_OTR_MEANS_18] = HintText::Junk({ Text{ "They say that OTR stands for&Opportunity to Recall", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_OTR_MEANS_19] = HintText::Junk({ + hintTable[RHT_JUNK_OTR_MEANS_19] = HintText::Junk({ Text{ "They say that OTR stands for&Operability Test Report", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_OTR_MEANS_20] = HintText::Junk({ + hintTable[RHT_JUNK_OTR_MEANS_20] = HintText::Junk({ Text{ "They say that OTR stands for&Overall Tuning Range", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_OTR_MEANS_21] = HintText::Junk({ + hintTable[RHT_JUNK_OTR_MEANS_21] = HintText::Junk({ Text{ "They say that OTR stands for&One Time Requisition", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_OTR_MEANS_22] = HintText::Junk({ + hintTable[RHT_JUNK_OTR_MEANS_22] = HintText::Junk({ Text{ "They say that OTR stands for&Oblivious to Reality", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_OTR_MEANS_23] = HintText::Junk({ + hintTable[RHT_JUNK_OTR_MEANS_23] = HintText::Junk({ Text{ "They say that OTR stands for&On the Run", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_OTR_MEANS_24] = HintText::Junk({ + hintTable[RHT_JUNK_OTR_MEANS_24] = HintText::Junk({ Text{ "They say that OTR stands for&On Time Reporting", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_OTR_MEANS_25] = HintText::Junk({ + hintTable[RHT_JUNK_OTR_MEANS_25] = HintText::Junk({ Text{ "They say that OTR stands for&Order to Receipt", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_OTR_MEANS_26] = HintText::Junk({ + hintTable[RHT_JUNK_OTR_MEANS_26] = HintText::Junk({ Text{ "They say that OTR stands for&Other Terrestrial Radio", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_OTR_MEANS_27] = HintText::Junk({ + hintTable[RHT_JUNK_OTR_MEANS_27] = HintText::Junk({ Text{ "They say that OTR stands for&On Target Reports", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_OTR_MEANS_28] = HintText::Junk({ + hintTable[RHT_JUNK_OTR_MEANS_28] = HintText::Junk({ Text{ "They say that OTR stands for&One Time Repair", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_OTR_MEANS_29] = HintText::Junk({ + hintTable[RHT_JUNK_OTR_MEANS_29] = HintText::Junk({ Text{ "They say that OTR stands for&Own the Room", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_OTR_MEANS_30] = HintText::Junk({ + hintTable[RHT_JUNK_OTR_MEANS_30] = HintText::Junk({ Text{ "They say that OTR stands for&Online Text Repository", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_MISC_1] = HintText::Junk({ + hintTable[RHT_JUNK_MISC_1] = HintText::Junk({ Text{ "They say %gKenix%w isn't a developer...^...Just a PR guy", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_MISC_2] = HintText::Junk({ + hintTable[RHT_JUNK_MISC_2] = HintText::Junk({ Text {"They say... No", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg"}, }); - hintTable[JUNK_MISC_3] = HintText::Junk({ + hintTable[RHT_JUNK_MISC_3] = HintText::Junk({ Text{ "They say BIG RIGS: OTR", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" } }); - hintTable[JUNK_MISC_4] = HintText::Junk({ + hintTable[RHT_JUNK_MISC_4] = HintText::Junk({ Text{ "They say you wanted to see me %pMr. Kenix%w?", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_MISC_5] = HintText::Junk({ + hintTable[RHT_JUNK_MISC_5] = HintText::Junk({ Text{ "They say Louis once saw an&equals not get set equals", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_MISC_6] = HintText::Junk({ + hintTable[RHT_JUNK_MISC_6] = HintText::Junk({ Text{ "They say only you can find your rom.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_MISC_7] = HintText::Junk({ + hintTable[RHT_JUNK_MISC_7] = HintText::Junk({ Text{ "They say ZAPD is good software.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_MISC_8] = HintText::Junk({ + hintTable[RHT_JUNK_MISC_8] = HintText::Junk({ Text{ "They say you can encounter&a parascode in tall grass.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_MISC_9] = HintText::Junk({ + hintTable[RHT_JUNK_MISC_9] = HintText::Junk({ Text{ "They say the ship sails on March 32nd.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_MISC_10] = HintText::Junk({ + hintTable[RHT_JUNK_MISC_10] = HintText::Junk({ Text{ "They say bombing dodongos is fun.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_MISC_11] = HintText::Junk({ + hintTable[RHT_JUNK_MISC_11] = HintText::Junk({ Text{ "They say shopkeepers don't give credits.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_MISC_12] = HintText::Junk({ + hintTable[RHT_JUNK_MISC_12] = HintText::Junk({ Text{ "They say shopkeepers don't give credits.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_MISC_13] = HintText::Junk({ + hintTable[RHT_JUNK_MISC_13] = HintText::Junk({ Text{ "They say Malon is glitched.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_MISC_14] = HintText::Junk({ + hintTable[RHT_JUNK_MISC_14] = HintText::Junk({ Text{ "They say do I look like I know&what a DList is?", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_MISC_15] = HintText::Junk({ + hintTable[RHT_JUNK_MISC_15] = HintText::Junk({ Text{ "They say do I look like I know&what an AList is?", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_MISC_16] = HintText::Junk({ + hintTable[RHT_JUNK_MISC_16] = HintText::Junk({ Text{ "They say the king drinks enthusiastically", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_MISC_17] = HintText::Junk({ + hintTable[RHT_JUNK_MISC_17] = HintText::Junk({ Text{ "They say Rubies are on the path to&Lamp Oil, Rope, and Bombs", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SG_1] = HintText::Junk({ + hintTable[RHT_JUNK_SG_1] = HintText::Junk({ Text{ "They say %rError. Human is dead, mismatch.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SG_2] = HintText::Junk({ + hintTable[RHT_JUNK_SG_2] = HintText::Junk({ Text{ "They say this is the choice of the&steins gate.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SG_3] = HintText::Junk({ + hintTable[RHT_JUNK_SG_3] = HintText::Junk({ Text{ "They say el psy kongroo.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SG_4] = HintText::Junk({ + hintTable[RHT_JUNK_SG_4] = HintText::Junk({ Text{ "They say tutturu~.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SG_5] = HintText::Junk({ + hintTable[RHT_JUNK_SG_5] = HintText::Junk({ Text{ "They say im not Christina!.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SG_6] = HintText::Junk({ + hintTable[RHT_JUNK_SG_6] = HintText::Junk({ Text{ "They say you know where to find an IBN5100.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SG_7] = HintText::Junk({ + hintTable[RHT_JUNK_SG_7] = HintText::Junk({ Text{ "They say when you're on a chicken bender&grab a box of chicken tenders.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); - hintTable[JUNK_SG_8] = HintText::Junk({ + hintTable[RHT_JUNK_SG_8] = HintText::Junk({ Text{ "Juicy Chicken #1! Wow!.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, }); @@ -2470,7 +2471,7 @@ void HintTable_Init() { | DUNGEON HINT TEXT | ---------------------------*/ - hintTable[DEKU_TREE] = HintText::DungeonName( + hintTable[RHT_DEKU_TREE] = HintText::DungeonName( { // obscure text Text{ "an ancient tree", /*french*/ "le vieil arbre", /*spanish*/ "un ancestral árbol" }, @@ -2479,7 +2480,7 @@ void HintTable_Init() { // clear text Text{ "Deku Tree", /*french*/ "l'Arbre Mojo", /*spanish*/ "el Gran Árbol Deku" }); - hintTable[DODONGOS_CAVERN] = HintText::DungeonName( + hintTable[RHT_DODONGOS_CAVERN] = HintText::DungeonName( { // obscure text Text{ "an immense cavern", /*french*/ "l'immense caverne", /*spanish*/ "una descomunal cueva" }, @@ -2488,7 +2489,7 @@ void HintTable_Init() { // clear text Text{ "Dodongo's Cavern", /*french*/ "la Caverne Dodongo", /*spanish*/ "la Cueva de los Dodongos" }); - hintTable[JABU_JABUS_BELLY] = HintText::DungeonName( + hintTable[RHT_JABU_JABUS_BELLY] = HintText::DungeonName( { // obscure text Text{ "the belly of a deity", /*french*/ "le ventre d'un gardien", @@ -2498,7 +2499,7 @@ void HintTable_Init() { // clear text Text{ "Jabu-Jabu's Belly", /*french*/ "le Ventre de Jabu-Jabu", /*spanish*/ "tripa de Jabu-Jabu" }); - hintTable[FOREST_TEMPLE] = HintText::DungeonName( + hintTable[RHT_FOREST_TEMPLE] = HintText::DungeonName( { // obscure text Text{ "a deep forest", /*french*/ "la profonde forêt", /*spanish*/ "las profundidades del bosque" }, @@ -2507,7 +2508,7 @@ void HintTable_Init() { // clear text Text{ "Forest Temple", /*french*/ "le Temple de la Forêt", /*spanish*/ "el Templo del Bosque" }); - hintTable[FIRE_TEMPLE] = HintText::DungeonName( + hintTable[RHT_FIRE_TEMPLE] = HintText::DungeonName( { // obscure text Text{ "a high mountain", /*french*/ "la grande montagne", /*spanish*/ "una alta montaña" }, @@ -2516,7 +2517,7 @@ void HintTable_Init() { // clear text Text{ "Fire Temple", /*french*/ "le Temple du Feu", /*spanish*/ "el Templo del Fuego" }); - hintTable[WATER_TEMPLE] = HintText::DungeonName( + hintTable[RHT_WATER_TEMPLE] = HintText::DungeonName( { // obscure text Text{ "a vast lake", /*french*/ "le vaste lac", /*spanish*/ "un lago inmenso" }, @@ -2525,7 +2526,7 @@ void HintTable_Init() { // clear text Text{ "Water Temple", /*french*/ "le Temple de l'Eau", /*spanish*/ "el Templo del Agua" }); - hintTable[SPIRIT_TEMPLE] = HintText::DungeonName( + hintTable[RHT_SPIRIT_TEMPLE] = HintText::DungeonName( { // obscure text Text{ "the goddess of the sand", /*french*/ "la déesse des sables", /*spanish*/ "la diosa de las arenas" }, @@ -2536,7 +2537,7 @@ void HintTable_Init() { ); - hintTable[SHADOW_TEMPLE] = HintText::DungeonName( + hintTable[RHT_SHADOW_TEMPLE] = HintText::DungeonName( { // obscure text Text{ "the house of the dead", /*french*/ "la maison des morts", /*spanish*/ "la casa de la muerte" }, @@ -2545,7 +2546,7 @@ void HintTable_Init() { // clear text Text{ "Shadow Temple", /*french*/ "le Temple de l'Ombre", /*spanish*/ "el Templo de las Sombras" }); - hintTable[ICE_CAVERN] = HintText::DungeonName( + hintTable[RHT_ICE_CAVERN] = HintText::DungeonName( { // obscure text Text{ "a frozen maze", /*french*/ "le dédale glacé", /*spanish*/ "un gélido laberinto" }, @@ -2554,7 +2555,7 @@ void HintTable_Init() { // clear text Text{ "Ice Cavern", /*french*/ "la caverne de glace", /*spanish*/ "la caverna de hielo" }); - hintTable[BOTTOM_OF_THE_WELL] = HintText::DungeonName( + hintTable[RHT_BOTTOM_OF_THE_WELL] = HintText::DungeonName( { // obscure text Text{ "a shadow\'s prison", /*french*/ "la prison d'une ombre", /*spanish*/ "la prisión de las sombras" }, @@ -2563,7 +2564,7 @@ void HintTable_Init() { // clear text Text{ "Bottom of the Well", /*french*/ "le fonds du Puits", /*spanish*/ "el fondo del pozo" }); - hintTable[GERUDO_TRAINING_GROUNDS] = HintText::DungeonName( + hintTable[RHT_GERUDO_TRAINING_GROUND] = HintText::DungeonName( { // obscure text Text{ "the test of thieves", /*french*/ "l'épreuve des voleurs", /*spanish*/ "la prueba de las bandidas" }, @@ -2573,7 +2574,7 @@ void HintTable_Init() { Text{ "Gerudo Training Grounds", /*french*/ "le Gymnase Gerudo", /*spanish*/ "el Centro de Instrucción Gerudo" }); - hintTable[GANONS_CASTLE] = HintText::DungeonName( + hintTable[RHT_GANONS_CASTLE] = HintText::DungeonName( { // obscure text Text{ "a conquered citadel", /*french*/ "la citadelle assiégée", /*spanish*/ "una conquistada ciudadela" }, @@ -2587,63 +2588,63 @@ void HintTable_Init() { | BOSS HINT TEXT | ---------------------------*/ - hintTable[QUEEN_GOHMA] = HintText::Boss({ + hintTable[RHT_QUEEN_GOHMA] = HintText::Boss({ // obscure text Text{"the #Parasitic Armored Arachnid# holds", /*french*/"le #monstre insectoïde géant# possède", /*spanish*/"el #arácnido parasitario acorazado# porta"}, }, {}, //clear text Text{"#Queen Gohma# holds", /*french*/"la #Reine Gohma# possède", /*spanish*/"la #Reina Goma# porta"}); - hintTable[KING_DODONGO] = HintText::Boss({ + hintTable[RHT_KING_DODONGO] = HintText::Boss({ //obscure text Text{"the #Infernal Dinosaur# holds", /*french*/"le #dinosaure infernal# possède", /*spanish*/"el #dinosaurio infernal# porta"}, }, {}, //clear text Text{"#King Dodongo# holds", /*french*/"le #Roi Dodongo# possède", /*spanish*/"el #Rey Dodongo# porta"}); - hintTable[BARINADE] = HintText::Boss({ + hintTable[RHT_BARINADE] = HintText::Boss({ //obscure text Text{"the #Bio-Electric Anemone# holds", /*french*/"l'#anémone bioélectrique# possède", /*spanish*/"la #anémona bioeléctrica# porta"}, }, {}, //clear text Text{"#Barinade# holds", /*french*/"#Barinade# possède", /*spanish*/"#Barinade# porta"}); - hintTable[PHANTOM_GANON] = HintText::Boss({ + hintTable[RHT_PHANTOM_GANON] = HintText::Boss({ //obscure text Text{"the #Evil Spirit from Beyond# holds", /*french*/"l'#esprit maléfique de l'au-delà# possède", /*spanish*/"el #espíritu maligno de ultratumba# porta"}, }, {}, //clear text Text{"#Phantom Ganon# holds", /*french*/"#Ganon Spectral# possède", /*spanish*/"#Ganon Fantasma# porta"}); - hintTable[VOLVAGIA] = HintText::Boss({ + hintTable[RHT_VOLVAGIA] = HintText::Boss({ //obscure text Text{"the #Subterranean Lava Dragon# holds", /*french*/"le #dragon des profondeurs# possède", /*spanish*/"el #dragón de lava subterráneo# porta"}, }, {}, //clear text Text{"#Volvagia# holds", /*french*/"#Volvagia# possède", /*spanish*/"#Volvagia# porta"}); - hintTable[MORPHA] = HintText::Boss({ + hintTable[RHT_MORPHA] = HintText::Boss({ //obscure text Text{"the #Giant Aquatic Amoeba# holds", /*french*/"l'#amibe aquatique géante# possède", /*spanish*/"la #ameba acuática gigante# porta"}, }, {}, //clear text Text{"#Morpha# holds", /*french*/"#Morpha# possède", /*spanish*/"#Morpha# porta"}); - hintTable[BONGO_BONGO] = HintText::Boss({ + hintTable[RHT_BONGO_BONGO] = HintText::Boss({ //obscure text Text{"the #Phantom Shadow Beast# holds", /*french*/"le #monstre de l'ombre# possède", /*spanish*/"la #alimaña oscura espectral# porta"}, }, {}, //clear text Text{"#Bongo Bongo# holds", /*french*/"#Bongo Bongo# possède", /*spanish*/"#Bongo Bongo# porta"}); - hintTable[TWINROVA] = HintText::Boss({ + hintTable[RHT_TWINROVA] = HintText::Boss({ //obscure text Text{"the #Sorceress Sisters# hold", /*french*/"#les sorcières jumelles# possède", /*spanish*/"las #hermanas hechiceras# portan"}, }, {}, //clear text Text{"#Twinrova# holds", /*french*/"#Twinrova# possède", /*spanish*/"#Birova# porta"}); // - // [LINKS_POCKET_BOSS] = HintText::Boss({ + // [RHT_LINKS_POCKET_BOSS] = HintText::Boss({ // //obscure text // Text{"#@'s pocket# rewards", /*french*/"#@ débute avec#", /*spanish*/"el #bolsillo de @# // premia con"}, @@ -2657,14 +2658,14 @@ void HintTable_Init() { | BRIDGE HINT TEXT | ---------------------------*/ - hintTable[BRIDGE_OPEN_HINT] = HintText::Bridge({ + hintTable[RHT_BRIDGE_OPEN_HINT] = HintText::Bridge({ // obscure text Text{ "The awakened ones have already&created a bridge to the castle&where the evil dwells.", /*french*/ "Les êtres de sagesse ont&déjà créé un pont vers&le repaire du mal.", /*spanish*/ "Los sabios #ya habrán creado un puente#&al castillo, de donde emana el mal." }, }); - hintTable[BRIDGE_VANILLA_HINT] = HintText::Bridge({ + hintTable[RHT_BRIDGE_VANILLA_HINT] = HintText::Bridge({ // obscure text Text{ "The awakened ones require&the Shadow and Spirit Medallions&as well as the Light Arrows.", /*french*/ @@ -2674,7 +2675,7 @@ void HintTable_Init() { "a la #flecha de luz#." }, }); - hintTable[BRIDGE_STONES_HINT] = HintText::Bridge({ + hintTable[RHT_BRIDGE_STONES_HINT] = HintText::Bridge({ // obscure text singular plural Text{ "The awakened ones will&await for the Hero to collect&%d |Spiritual Stone|Spiritual Stones|.", @@ -2682,14 +2683,14 @@ void HintTable_Init() { /*spanish*/ "Los sabios aguardarán a que el héroe&obtenga #%d |piedra espiritual|piedras espirituales|#." }, }); - hintTable[BRIDGE_MEDALLIONS_HINT] = HintText::Bridge({ + hintTable[RHT_BRIDGE_MEDALLIONS_HINT] = HintText::Bridge({ // obscure text singular plural Text{ "The awakened ones will await&for the Hero to collect&%d |Medallion|Medallions|.", /*french*/ "Les êtres de sagesse attendront&le héros muni de %r#%d |Médaillon|Médaillons|%w.", /*spanish*/ "Los sabios aguardarán a que el héroe&obtenga #%d |medallón|medallones|#." }, }); - hintTable[BRIDGE_REWARDS_HINT] = HintText::Bridge({ + hintTable[RHT_BRIDGE_REWARDS_HINT] = HintText::Bridge({ // obscure text singular plural Text{ "The awakened ones will await&for the Hero to collect&%d |Spiritual Stone or Medallion|Spiritual Stones " "and Medallions|.", @@ -2700,21 +2701,21 @@ void HintTable_Init() { "medallones|#." }, }); - hintTable[BRIDGE_DUNGEONS_HINT] = HintText::Bridge({ + hintTable[RHT_BRIDGE_DUNGEONS_HINT] = HintText::Bridge({ // obscure text singular plural Text{ "The awakened ones will await&for the Hero to conquer&%d |Dungeon|Dungeons|.", /*french*/ "Les êtres de sagesse attendront&la conquête de %r%d |Donjon|Donjons|%w.", /*spanish*/ "Los sabios aguardarán a que el héroe& complete #%d |mazmorra|mazmorras|#." }, }); - hintTable[BRIDGE_TOKENS_HINT] = HintText::Bridge({ + hintTable[RHT_BRIDGE_TOKENS_HINT] = HintText::Bridge({ // obscure text Text{ "The awakened ones will await&for the Hero to collect&%d |Gold Skulltula Token|Gold Skulltula Tokens|.", /*french*/ "Les êtres de sagesse attendront&le héros muni de %r%d |Symbole|Symboles| &de Skulltula d'or%w.", /*spanish*/ "Los sabios aguardarán a que el héroe&obtenga #%d |símbolo|símbolos| de&skulltula dorada#." }, }); - hintTable[BRIDGE_GREG_HINT] = HintText::Bridge({ + hintTable[RHT_BRIDGE_GREG_HINT] = HintText::Bridge({ // obscure text Text{ "The awakened ones will await&for the Hero to find %gGreg%w.", /*french*/ "The awakened ones will await&for the Hero to find %gGreg%w.", @@ -2725,56 +2726,56 @@ void HintTable_Init() { | GANON BOSS KEY HINT TEXT | ---------------------------*/ - hintTable[GANON_BK_START_WITH_HINT] = HintText::GanonsBossKey({ + hintTable[RHT_GANON_BK_START_WITH_HINT] = HintText::GanonsBossKey({ // obscure text Text{ "And the %revil one%w's key will&be given %rfrom the start%w.", /*french*/ "Aussi, la %rclé du Malin%w sera&possession %rmême du héros%w.", /*spanish*/ "Y obtendrás la llave del #señor del mal# desde el #inicio#." }, }); - hintTable[GANON_BK_VANILLA_HINT] = HintText::GanonsBossKey({ + hintTable[RHT_GANON_BK_VANILLA_HINT] = HintText::GanonsBossKey({ // obscure text Text{ "And the %revil one%w's key will&be kept in a big chest&%rinside its tower%w.", /*french*/ "Aussi, la %rclé du Malin%w sera&encoffrée %rdans sa tour%w.", /*spanish*/ "Y la llave del #señor del mal# aguardará en un gran cofre de #su torre#." }, }); - hintTable[GANON_BK_OWN_DUNGEON_HINT] = HintText::GanonsBossKey({ + hintTable[RHT_GANON_BK_OWN_DUNGEON_HINT] = HintText::GanonsBossKey({ // obscure text Text{ "And the %revil one%w's key will&be hidden somewhere %rinside&its castle%w.", /*french*/ "Aussi, la %rclé du Malin%w sera&cachée %rdans son vaste château%w.", /*spanish*/ "Y la llave del #señor del mal# aguardará en #algún lugar de su castillo#." }, }); - hintTable[GANON_BK_OVERWORLD_HINT] = HintText::GanonsBossKey({ + hintTable[RHT_GANON_BK_OVERWORLD_HINT] = HintText::GanonsBossKey({ // obscure text Text{ "And the %revil one%w's key will&be hidden %routside of&dungeons%w in Hyrule.", /*french*/ "Aussi, la %rclé du Malin%w se&trouve %rhors des donjons%w d'Hyrule.", /*spanish*/ "Y la llave del #señor del mal# aguardará #fuera de las mazmorras# de Hyrule." }, }); - hintTable[GANON_BK_ANY_DUNGEON_HINT] = HintText::GanonsBossKey({ + hintTable[RHT_GANON_BK_ANY_DUNGEON_HINT] = HintText::GanonsBossKey({ // obscure text Text{ "And the %revil one%w's key will&be hidden %rinside a&dungeon%w in Hyrule.", /*french*/ "Aussi, la %rclé du Malin%w se&trouve %rdans un donjon%w d'Hyrule.", /*spanish*/ "Y la llave del #señor del mal# aguardará #en una mazmorra# de Hyrule." }, }); - hintTable[GANON_BK_ANYWHERE_HINT] = HintText::GanonsBossKey({ + hintTable[RHT_GANON_BK_ANYWHERE_HINT] = HintText::GanonsBossKey({ // obscure text Text{ "And the %revil one%w's key will&be hidden somewhere&%rin Hyrule%w.", /*french*/ "Aussi, la %rclé du Malin%w se&trouve quelque part %rdans Hyrule%w.", /*spanish*/ "Y la llave del #señor del mal# aguardará en #cualquier lugar de Hyrule#." }, }); - hintTable[GANON_BK_TRIFORCE_HINT] = HintText::GanonsBossKey({ + hintTable[RHT_GANON_BK_TRIFORCE_HINT] = HintText::GanonsBossKey({ // obscure text Text{ "And the %revil one%w's key will&be given to the Hero once&the %rTriforce%w is completed.", /*french*/ "Aussi, la %rclé du Malin%w se&révèlera une fois la %rTriforce%w&assemblée.", /*spanish*/ "Y el héroe recibirá la llave del #señor del mal# cuando haya completado la #Trifuerza#." }, }); - hintTable[GANON_BK_SKULLTULA_HINT] = HintText::GanonsBossKey({ + hintTable[RHT_GANON_BK_SKULLTULA_HINT] = HintText::GanonsBossKey({ // obscure text Text { "And the %revil one%w's key will be&provided by the cursed rich man&once %r100 Gold Skulltula Tokens%w&are retrieved.", /*french*/ "Aussi, la %rclé du Malin%w sera&donnée par l'homme maudit une&fois que %r100 Symboles de&Skulltula d'or%w auront été trouvés.", @@ -2785,7 +2786,7 @@ void HintTable_Init() { | LACS HINT TEXT | ---------------------------*/ - hintTable[LACS_VANILLA_HINT] = HintText::LACS({ + hintTable[RHT_LACS_VANILLA_HINT] = HintText::LACS({ // obscure text Text{ "And the %revil one%w's key will be&provided by Zelda once the&%rShadow and Spirit Medallions%w&are retrieved.", @@ -2795,14 +2796,14 @@ void HintTable_Init() { "espíritu#." }, }); - hintTable[LACS_MEDALLIONS_HINT] = HintText::LACS({ + hintTable[RHT_LACS_MEDALLIONS_HINT] = HintText::LACS({ // obscure text singular plural Text{ "And the %revil one%w's key will be&provided by Zelda once %r%d&|Medallion%w is|Medallions%w are| retrieved.", /*french*/ "Aussi, la %rclé du Malin%w sera&fournie par Zelda une fois |qu'&%r%d Médaillon%w aura été&récupéré|que&%r%d Médaillons%w auront été&récupérés|.", /*spanish*/ "Y Zelda entregará la llave&del #señor del mal# tras obtener&#%d |medallón|medallones|#." }, }); - hintTable[LACS_STONES_HINT] = HintText::LACS({ + hintTable[RHT_LACS_STONES_HINT] = HintText::LACS({ // obscure text singular plural Text{ "And the %revil one%w's key will be&provided by Zelda once %r%d&|Spiritual Stone%w is|Spiritual Stones%w are| " @@ -2813,7 +2814,7 @@ void HintTable_Init() { "espirituales|#." }, }); - hintTable[LACS_REWARDS_HINT] = HintText::LACS({ + hintTable[RHT_LACS_REWARDS_HINT] = HintText::LACS({ // obscure text singular plural Text{ "And the %revil one%w's key will be&provided by Zelda once %r%d&|Spiritual Stone or Medallion%w&" "is|Spiritual Stones and Medallions%w&are| retrieved.", @@ -2824,14 +2825,14 @@ void HintTable_Init() { "espirituales o medallones|#." }, }); - hintTable[LACS_DUNGEONS_HINT] = HintText::LACS({ + hintTable[RHT_LACS_DUNGEONS_HINT] = HintText::LACS({ // obscure text singular plural Text{ "And the %revil one%w's key will be&provided by Zelda once %r%d&|Dungeon%w is|Dungeons%w are| conquered.", /*french*/ "Aussi, la %rclé du Malin%w sera&fournie par Zelda une fois |qu'&%r%d donjon %wsera conquis|que&%r%d donjons%w seront conquis|.", /*spanish*/ "Y Zelda entregará la llave&del #señor del mal# tras completar&#%d |mazmorra|mazmorras|#." }, }); - hintTable[LACS_TOKENS_HINT] = HintText::LACS({ + hintTable[RHT_LACS_TOKENS_HINT] = HintText::LACS({ // obscure text singular plural Text{ "And the %revil one%w's key will be&provided by Zelda once %r%d |Gold&Skulltula Token%w is|Gold&Skulltula " "Tokens%w are| retrieved.", @@ -2844,27 +2845,27 @@ void HintTable_Init() { | TRIAL HINT TEXT | ---------------------------*/ - hintTable[SIX_TRIALS] = HintText::Exclude({ + hintTable[RHT_SIX_TRIALS] = HintText::Exclude({ // obscure text Text{ "#Ganon's Tower# is protected by a powerful barrier.", /*french*/ "#la Tour de Ganon# est protégée par une puissante barrière", /*spanish*/ "la #torre de Ganon# está protegida por una poderosa barrera" }, }); - hintTable[ZERO_TRIALS] = HintText::Exclude({ + hintTable[RHT_ZERO_TRIALS] = HintText::Exclude({ // obscure text Text{ "Sheik dispelled the barrier around #Ganon's Tower#.", /*french*/ "Sheik a dissipé la barrière autour de #la Tour de Ganon#", /*spanish*/ "Sheik disipó la barrera alrededor de la #torre de Ganon#." }, }); - hintTable[FOUR_TO_FIVE_TRIALS] = HintText::Exclude({ + hintTable[RHT_FOUR_TO_FIVE_TRIALS] = HintText::Exclude({ // obscure text Text{ " was dispelled by Sheik.", /*french*/ " a été dissipée par Sheik.", /*spanish*/ " se disipó gracias a Sheik." }, }); - hintTable[ONE_TO_THREE_TRIALS] = HintText::Exclude({ + hintTable[RHT_ONE_TO_THREE_TRIALS] = HintText::Exclude({ // obscure text Text{ " protects Ganons Tower.", /*french*/ " protège la Tour de Ganon.", /*spanish*/ " protege la torre de Ganon" }, @@ -2874,21 +2875,21 @@ void HintTable_Init() { | ALTAR TEXT | ---------------------------*/ - hintTable[SPIRITUAL_STONE_TEXT_START] = HintText::Altar({ + hintTable[RHT_SPIRITUAL_STONE_TEXT_START] = HintText::Altar({ // obscure text Text{ "3 Spiritual Stones found in Hyrule...", /*french*/ "Les trois Pierres Ancestrales cachées&dans Hyrule...", /*spanish*/ "Tres piedras espirituales halladas por Hyrule..." }, }); - hintTable[CHILD_ALTAR_TEXT_END_DOTOPEN] = HintText::Altar({ + hintTable[RHT_CHILD_ALTAR_TEXT_END_DOTOPEN] = HintText::Altar({ // obscure text Text{ "Ye who may become a Hero...&The path to the future is open...", /*french*/ "À celui qui a quête de devenir&héros...&Le futur vous accueille béant...", /*spanish*/ "Para aquel que se convierta en el héroe...&La puerta al futuro está a su disposición..." }, }); - hintTable[CHILD_ALTAR_TEXT_END_DOTSONGONLY] = HintText::Altar({ + hintTable[RHT_CHILD_ALTAR_TEXT_END_DOTSONGONLY] = HintText::Altar({ // obscure text Text{ "Ye who may become a Hero...&Stand with the Ocarina and&play the Song of Time.", @@ -2896,7 +2897,7 @@ void HintTable_Init() { /*spanish*/ "Para aquel que se convierta en el héroe...&Tome la ocarina y&entone la Canción del Tiempo." }, }); - hintTable[CHILD_ALTAR_TEXT_END_DOTCLOSED] = HintText::Altar({ + hintTable[RHT_CHILD_ALTAR_TEXT_END_DOTCLOSED] = HintText::Altar({ // obscure text Text{ "Ye who may become a Hero...&Offer the spiritual stones and&play the Song of Time.", /*french*/ @@ -2906,7 +2907,7 @@ void HintTable_Init() { "Tiempo." }, }); - hintTable[ADULT_ALTAR_TEXT_START] = HintText::Altar({ + hintTable[RHT_ADULT_ALTAR_TEXT_START] = HintText::Altar({ // obscure text Text{ "An awakening voice from the Sacred&Realm will call those destined to be&Sages, who dwell in the five " "temples.", @@ -2918,7 +2919,7 @@ void HintTable_Init() { "que moran en los #cinco templos#." }, }); - hintTable[ADULT_ALTAR_TEXT_END] = HintText::Altar({ + hintTable[RHT_ADULT_ALTAR_TEXT_END] = HintText::Altar({ // obscure text Text{ "$kTogether with the Hero of Time,&the awakened ones will return&the light of peace to the world...", @@ -2933,7 +2934,7 @@ void HintTable_Init() { | VALIDATION LINE TEXT | ---------------------------*/ - hintTable[VALIDATION_LINE] = HintText::Validation({ + hintTable[RHT_VALIDATION_LINE] = HintText::Validation({ // obscure text Text{ "Hmph... Since you made it this far, I'll let you know what glorious prize of Ganon's you likely missed " "out on in my tower.^Behold...^", @@ -2948,7 +2949,7 @@ void HintTable_Init() { | LIGHT ARROW LOCATION TEXT| ---------------------------*/ - hintTable[LIGHT_ARROW_LOCATION_HINT] = HintText::LightArrow({ + hintTable[RHT_LIGHT_ARROW_LOCATION_HINT] = HintText::LightArrow({ // obscure text Text{ "Ha ha ha... You'll never beat me by reflecting my lightning bolts and unleashing the arrows from ", @@ -2958,7 +2959,7 @@ void HintTable_Init() { "Ja, ja, ja... Nunca me derrotarás reflejando mis esferas de energía y desplegando la flecha de luz de " }, }); - hintTable[YOUR_POCKET] = HintText::Exclude({ + hintTable[RHT_YOUR_POCKET] = HintText::Exclude({ // obscure text Text{ "your pocket", /*french*/ "tes poches", /*spanish*/ "tu bolsillo" }, }); @@ -2967,7 +2968,7 @@ void HintTable_Init() { | GANON LINE TEXT | ---------------------------*/ - hintTable[GANON_LINE01] = HintText::GanonLine({ + hintTable[RHT_GANON_LINE01] = HintText::GanonLine({ // obscure text Text{ "Oh! It's @.&I was expecting someone called Sheik.&Do you know what happened to them?", /*french*/ "Ah, c'est @.&J'attendais un certain Sheik.&Tu sais ce qui lui est arrivé?", @@ -2975,21 +2976,21 @@ void HintTable_Init() { "¡Oh! Pero si es @.&Estaba esperando a alguien llamado Sheik. ¿Sabes qué puede haberle pasado?" }, }); - hintTable[GANON_LINE02] = HintText::GanonLine({ + hintTable[RHT_GANON_LINE02] = HintText::GanonLine({ // obscure text Text{ "I knew I shouldn't have put the key on the other side of my door.", /*french*/ "J'aurais dû garder la clé ici. Hélas...", /*spanish*/ "Sabía que no tendría que haber dejado la llave al otro lado de la puerta." }, }); - hintTable[GANON_LINE03] = HintText::GanonLine({ + hintTable[RHT_GANON_LINE03] = HintText::GanonLine({ // obscure text Text{ "Looks like it's time for a round of tennis.", /*french*/ "C'est l'heure de jouer au tennis.", /*spanish*/ "Parece que es hora de una pachanga de tenis." }, }); - hintTable[GANON_LINE04] = HintText::GanonLine({ + hintTable[RHT_GANON_LINE04] = HintText::GanonLine({ // obscure text Text{ "You'll never deflect my bolts of energy with your sword, then shoot me with those Light Arrows you " "happen to have.", @@ -3001,14 +3002,14 @@ void HintTable_Init() { "que tendrás." }, }); - hintTable[GANON_LINE05] = HintText::GanonLine({ + hintTable[RHT_GANON_LINE05] = HintText::GanonLine({ // obscure text Text{ "Why did I leave my trident back in the desert?", /*french*/ "Sale bêtise... Et j'ai oublié mon trident dans le désert!", /*spanish*/ "Santa Hylia... ¿Por qué me habré dejado el tridente en el desierto?" }, }); - hintTable[GANON_LINE06] = HintText::GanonLine({ + hintTable[RHT_GANON_LINE06] = HintText::GanonLine({ // obscure text Text{ "Zelda is probably going to do something stupid, like send you back to your own timeline.^So this is " "quite meaningless. Do you really want to save this moron?", @@ -3020,7 +3021,7 @@ void HintTable_Init() { "ningún sentido alguno. ¿De verdad quieres salvar a esa tonta?" }, }); - hintTable[GANON_LINE07] = HintText::GanonLine({ + hintTable[RHT_GANON_LINE07] = HintText::GanonLine({ // obscure text Text{ "What about Zelda makes you think&she'd be a better ruler than I?^I saved Lon Lon Ranch,&fed the " "hungry,&and my castle floats.", @@ -3032,7 +3033,7 @@ void HintTable_Init() { "los hambrientos&y hasta hago que mi castillo flote." }, }); - hintTable[GANON_LINE08] = HintText::GanonLine({ + hintTable[RHT_GANON_LINE08] = HintText::GanonLine({ // obscure text Text{ "I've learned this spell,&it's really neat,&I'll keep it later&for your treat!", /*french*/ @@ -3043,21 +3044,21 @@ void HintTable_Init() { "afrontar la verdad?" }, }); - hintTable[GANON_LINE09] = HintText::GanonLine({ + hintTable[RHT_GANON_LINE09] = HintText::GanonLine({ // obscure text Text{ "Many tricks are up my sleeve,&to save yourself&you'd better leave!", /*french*/ "Sale petit garnement,&tu fais erreur!&C'est maintenant que marque&ta dernière heure!", /*spanish*/ "¿No osarás a mí enfrentarte?&Rimas aparte,&¡voy a matarte!" }, }); - hintTable[GANON_LINE10] = HintText::GanonLine({ + hintTable[RHT_GANON_LINE10] = HintText::GanonLine({ // obscure text Text{ "After what you did to Koholint Island, how can you call me the bad guy?", /*french*/ "J'admire ce que tu as fait à l'Île Koholint... Toi et moi, nous devrions faire équipe!", /*spanish*/ "Después de lo que le hiciste a la Isla Koholint, ¿cómo te atreves a llamarme malvado?" }, }); - hintTable[GANON_LINE11] = HintText::GanonLine({ + hintTable[RHT_GANON_LINE11] = HintText::GanonLine({ // obscure text Text{ "Today, let's begin down&'The Hero is Defeated' timeline.", /*french*/ @@ -3071,21 +3072,21 @@ void HintTable_Init() { | MERCHANTS' ITEMS | ---------------------------*/ - hintTable[MEDIGORON_DIALOG_FIRST] = HintText::MerchantsDialogs({ + hintTable[RHT_MEDIGORON_DIALOG_FIRST] = HintText::MerchantsDialogs({ // obscure text Text{ "How about buying ", /*french*/ "Veux-tu acheter ", /*spanish*/ "¿Me compras " }, }); - hintTable[MEDIGORON_DIALOG_SECOND] = HintText::MerchantsDialogs({ + hintTable[RHT_MEDIGORON_DIALOG_SECOND] = HintText::MerchantsDialogs({ // obscure text Text{ " for #200 Rupees#?&" + TWO_WAY_CHOICE() + "#Buy&Don't buy#", /*french*/ " pour #200 rubis#?&" + TWO_WAY_CHOICE() + "#Acheter&Ne pas acheter#", /*spanish*/ " por #200 rupias#?&" + TWO_WAY_CHOICE() + "#Comprar&No comprar#" }, }); - hintTable[CARPET_SALESMAN_DIALOG_FIRST] = HintText::MerchantsDialogs({ + hintTable[RHT_CARPET_SALESMAN_DIALOG_FIRST] = HintText::MerchantsDialogs({ // obscure text Text{ "Welcome!^I am selling stuff, strange and rare, from&all over the world to everybody. Today's&special " "is...^", @@ -3096,7 +3097,7 @@ void HintTable_Init() { "oferta de hoy es...^¡" }, }); - hintTable[CARPET_SALESMAN_DIALOG_SECOND] = HintText::MerchantsDialogs({ + hintTable[RHT_CARPET_SALESMAN_DIALOG_SECOND] = HintText::MerchantsDialogs({ // obscure text Text{ "! Terrifying!&I won't tell you what it is until I see the&money...^How about #200 Rupees#?&&" + @@ -3110,14 +3111,14 @@ void HintTable_Init() { TWO_WAY_CHOICE() + "#Comprar&No comprar#" }, }); - hintTable[CARPET_SALESMAN_DIALOG_THIRD] = HintText::MerchantsDialogs({ + hintTable[RHT_CARPET_SALESMAN_DIALOG_THIRD] = HintText::MerchantsDialogs({ // obscure text Text{ "Thank you very much!^What I'm selling is... #", /*french*/ "Merci beaucoup!^Cet objet extraordinaire est... #", /*spanish*/ "¡Muchas gracias!^Lo que vendo es... #¡" }, }); - hintTable[CARPET_SALESMAN_DIALOG_FOURTH] = HintText::MerchantsDialogs({ + hintTable[RHT_CARPET_SALESMAN_DIALOG_FOURTH] = HintText::MerchantsDialogs({ // obscure text Text{ "!#^The mark that will lead you to the #Spirit&Temple# is the #flag on the " + IF_NOT_MQ() + "left" + MQ_ELSE() + "right" + MQ_END() + "# outside the shop. Be seeing you!", @@ -3127,7 +3128,7 @@ void HintTable_Init() { IF_NOT_MQ() + "izquierda" + MQ_ELSE() + "derecha" + MQ_END() + "# al salir de aquí. ¡Nos vemos!" }, }); - hintTable[GRANNY_DIALOG] = HintText::MerchantsDialogs({ + hintTable[RHT_GRANNY_DIALOG] = HintText::MerchantsDialogs({ // obscure text Text{ "! How about #100 Rupees#?&" + TWO_WAY_CHOICE() + "#Buy&Don't buy#", /*french*/ "! Que dis-tu de #100 rubis#?&" + TWO_WAY_CHOICE() + "#Acheter&Ne pas acheter#", @@ -3193,21 +3194,21 @@ int32_t TokensRequiredBySettings() { } std::array conditionalAlwaysHints = { - std::make_pair(MARKET_10_BIG_POES, + std::make_pair(RC_MARKET_10_BIG_POES, []() { return Settings::BigPoeTargetCount.Value() >= 3; }), // Remember, the option's value being 3 means 4 are required - std::make_pair(DEKU_THEATER_MASK_OF_TRUTH, []() { return !Settings::CompleteMaskQuest; }), - std::make_pair(SONG_FROM_OCARINA_OF_TIME, []() { return StonesRequiredBySettings() < 2; }), - std::make_pair(HF_OCARINA_OF_TIME_ITEM, []() { return StonesRequiredBySettings() < 2; }), - std::make_pair(SHEIK_IN_KAKARIKO, []() { return MedallionsRequiredBySettings() < 5; }), - std::make_pair(DMT_TRADE_CLAIM_CHECK, []() { return false; }), - std::make_pair(KAK_30_GOLD_SKULLTULA_REWARD, []() { return TokensRequiredBySettings() < 30; }), - std::make_pair(KAK_40_GOLD_SKULLTULA_REWARD, []() { return TokensRequiredBySettings() < 40; }), - std::make_pair(KAK_50_GOLD_SKULLTULA_REWARD, []() { return TokensRequiredBySettings() < 50; }) + std::make_pair(RC_DEKU_THEATER_MASK_OF_TRUTH, []() { return !Settings::CompleteMaskQuest; }), + std::make_pair(RC_SONG_FROM_OCARINA_OF_TIME, []() { return StonesRequiredBySettings() < 2; }), + std::make_pair(RC_HF_OCARINA_OF_TIME_ITEM, []() { return StonesRequiredBySettings() < 2; }), + std::make_pair(RC_SHEIK_IN_KAKARIKO, []() { return MedallionsRequiredBySettings() < 5; }), + std::make_pair(RC_DMT_TRADE_CLAIM_CHECK, []() { return false; }), + std::make_pair(RC_KAK_30_GOLD_SKULLTULA_REWARD, []() { return TokensRequiredBySettings() < 30; }), + std::make_pair(RC_KAK_40_GOLD_SKULLTULA_REWARD, []() { return TokensRequiredBySettings() < 40; }), + std::make_pair(RC_KAK_50_GOLD_SKULLTULA_REWARD, []() { return TokensRequiredBySettings() < 50; }) }; -const HintText& Hint(const uint32_t hintKey) { +const HintText& Hint(const RandomizerHintTextKey hintKey) { return hintTable[hintKey]; } diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list.hpp b/soh/soh/Enhancements/randomizer/3drando/hint_list.hpp index f60297179..1850c1990 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list.hpp @@ -1,14 +1,13 @@ #pragma once #include "hints.hpp" -#include "keys.hpp" #include -extern std::array hintTable; +extern std::array hintTable; void HintTable_Init(); -const HintText& Hint(uint32_t hintKey); +const HintText& Hint(const RandomizerHintTextKey hintKey); std::vector GetHintCategory(HintCategory category); void HintTable_Init_Item(); 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 ed54508ca..934a8f56c 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 @@ -4,68 +4,68 @@ void HintTable_Init_Exclude_Dungeon() { /*-------------------------- | DEKU TREE | ---------------------------*/ - hintTable[DEKU_TREE_MAP_CHEST] = HintText::Exclude({ + hintTable[RHT_DEKU_TREE_MAP_CHEST] = HintText::Exclude({ //obscure text Text{"in the #center of the Deku Tree# lies", /*french*/"#le coeur de l'Arbre Mojo# recèle", /*spanish*/"al #centro del Gran Árbol Deku# yace"}, }); - hintTable[DEKU_TREE_SLINGSHOT_CHEST] = HintText::Exclude({ + hintTable[RHT_DEKU_TREE_SLINGSHOT_CHEST] = HintText::Exclude({ //obscure text Text{"the #treasure guarded by a scrub# in the Deku Tree is", /*french*/"le #trésor protégé par une peste# dans l'Arbre Mojo est", /*spanish*/"un #deku del Gran Árbol Deku# esconde"}, }); - hintTable[DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST] = HintText::Exclude({ + hintTable[RHT_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST] = HintText::Exclude({ //obscure text Text{"the #treasure guarded by a scrub# in the Deku Tree is", /*french*/"le #trésor protégé par une peste# dans l'Arbre Mojo est", /*spanish*/"un #deku del Gran Árbol Deku# esconde"}, }); - hintTable[DEKU_TREE_COMPASS_CHEST] = HintText::Exclude({ + hintTable[RHT_DEKU_TREE_COMPASS_CHEST] = HintText::Exclude({ //obscure text Text{"#pillars of wood# in the Deku Tree lead to", /*french*/"les #piliers de bois# dans l'Arbre Mojo indiquent", /*spanish*/"los #salientes del Gran Árbol Deku# conducen a"}, }); - hintTable[DEKU_TREE_COMPASS_ROOM_SIDE_CHEST] = HintText::Exclude({ + hintTable[RHT_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST] = HintText::Exclude({ //obscure text Text{"#pillars of wood# in the Deku Tree lead to", /*french*/"les #piliers de bois# dans l'Arbre Mojo indiquent", /*spanish*/"los #salientes del Gran Árbol Deku# conducen a"}, }); - hintTable[DEKU_TREE_BASEMENT_CHEST] = HintText::Exclude({ + hintTable[RHT_DEKU_TREE_BASEMENT_CHEST] = HintText::Exclude({ //obscure text Text{"#webs in the Deku Tree# hide", /*french*/"les #toiles dans l'Arbre Mojo# cachent", /*spanish*/"entre #telarañas del Gran Árbol Deku# yace"}, }); - hintTable[DEKU_TREE_MQ_MAP_CHEST] = HintText::Exclude({ + hintTable[RHT_DEKU_TREE_MQ_MAP_CHEST] = HintText::Exclude({ //obscure text Text{"in the #center of the Deku Tree# lies", /*french*/"#le coeur de l'Arbre Mojo# recèle", /*spanish*/"al #centro del Gran Árbol Deku# yace"}, }); - hintTable[DEKU_TREE_MQ_COMPASS_CHEST] = HintText::Exclude({ + hintTable[RHT_DEKU_TREE_MQ_COMPASS_CHEST] = HintText::Exclude({ //obscure text Text{"a #treasure guarded by a large spider# in the Deku Tree is", /*french*/"le #trésor protégé par une grosse araignée# dans l'Arbre Mojo est", /*spanish*/"una #gran araña del Gran Árbol Deku# esconde"}, }); - hintTable[DEKU_TREE_MQ_SLINGSHOT_CHEST] = HintText::Exclude({ + hintTable[RHT_DEKU_TREE_MQ_SLINGSHOT_CHEST] = HintText::Exclude({ //obscure text Text{"#pillars of wood# in the Deku Tree lead to", /*french*/"les #piliers de bois# dans l'Arbre Mojo indiquent", /*spanish*/"los #salientes del Gran Árbol Deku# conducen a"}, }); - hintTable[DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST] = HintText::Exclude({ + hintTable[RHT_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST] = HintText::Exclude({ //obscure text Text{"#pillars of wood# in the Deku Tree lead to", /*french*/"les #piliers de bois# dans l'Arbre Mojo indiquent", /*spanish*/"los #salientes del Gran Árbol Deku# conducen a"}, }); - hintTable[DEKU_TREE_MQ_BASEMENT_CHEST] = HintText::Exclude({ + hintTable[RHT_DEKU_TREE_MQ_BASEMENT_CHEST] = HintText::Exclude({ //obscure text Text{"#webs in the Deku Tree# hide", /*french*/"les #toiles dans l'Arbre Mojo# cachent", /*spanish*/"entre #telarañas del Gran Árbol Deku# yace"}, }); - hintTable[DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST] = HintText::Exclude({ + hintTable[RHT_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST] = HintText::Exclude({ //obscure text Text{"#magical fire in the Deku Tree# leads to", /*french*/"le #feu magique dans l'Arbre Mojo# éclaire", /*spanish*/"el #fuego mágico en el Gran Árbol Deku# conduce a"}, }); - hintTable[DEKU_TREE_QUEEN_GOHMA_HEART] = HintText::Exclude({ + hintTable[RHT_DEKU_TREE_QUEEN_GOHMA_HEART] = HintText::Exclude({ //obscure text Text{"the #Parasitic Armored Arachnid# holds", /*french*/"le #monstre insectoïde géant# possède", /*spanish*/"el #arácnido parasitario acorazado# porta"}, }, {}, @@ -73,43 +73,43 @@ void HintTable_Init_Exclude_Dungeon() { Text{"#Queen Gohma# holds", /*french*/"la #Reine Gohma# possède", /*spanish*/"la #Reina Goma# porta"} ); - hintTable[DEKU_TREE_GS_BASEMENT_BACK_ROOM] = HintText::Exclude({ + hintTable[RHT_DEKU_TREE_GS_BASEMENT_BACK_ROOM] = HintText::Exclude({ //obscure text Text{"a #spider deep within the Deku Tree# hides", /*french*/"une #Skulltula au coeur de l'Arbre Mojo# a", /*spanish*/"una #Skulltula en las profundidades del Árbol Deku# otorga"}, }); - hintTable[DEKU_TREE_GS_BASEMENT_GATE] = HintText::Exclude({ + hintTable[RHT_DEKU_TREE_GS_BASEMENT_GATE] = HintText::Exclude({ //obscure text Text{"a #web protects a spider# within the Deku Tree holding", /*french*/"une #Skulltula derrière une toile dans l'Arbre Mojo# a", /*spanish*/"una #Skulltula protegida por su tela# del Árbol Deku otorga"}, }); - hintTable[DEKU_TREE_GS_BASEMENT_VINES] = HintText::Exclude({ + hintTable[RHT_DEKU_TREE_GS_BASEMENT_VINES] = HintText::Exclude({ //obscure text Text{"a #web protects a spider# within the Deku Tree holding", /*french*/"une #Skulltula derrière une toile dans l'Arbre Mojo# a", /*spanish*/"una #Skulltula protegida por su tela# del Árbol Deku otorga"}, }); - hintTable[DEKU_TREE_GS_COMPASS_ROOM] = HintText::Exclude({ + hintTable[RHT_DEKU_TREE_GS_COMPASS_ROOM] = HintText::Exclude({ //obscure text Text{"a #spider atop the Deku Tree# holds", /*french*/"une #Skulltula au sommet de l'Arbre Mojo# a", /*spanish*/"una #Skulltula en lo alto del Árbol Deku# otorga"}, }); - hintTable[DEKU_TREE_MQ_GS_LOBBY] = HintText::Exclude({ + hintTable[RHT_DEKU_TREE_MQ_GS_LOBBY] = HintText::Exclude({ //obscure text Text{"a #spider in a crate# within the Deku Tree hides", /*french*/"une #Skulltula dans une boîte dans l'Arbre Mojo# a", /*spanish*/"una #Skulltula bajo una caja# del Árbol Deku otorga"}, }); - hintTable[DEKU_TREE_MQ_GS_COMPASS_ROOM] = HintText::Exclude({ + hintTable[RHT_DEKU_TREE_MQ_GS_COMPASS_ROOM] = HintText::Exclude({ //obscure text Text{"a #wall of rock protects a spider# within the Deku Tree holding", /*french*/"une #Skulltula derrière des rochers dans l'Arbre Mojo# a", /*spanish*/"una #Skulltula protegida por una pared rocosa# del Árbol Deku otorga"}, }); - hintTable[DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM] = HintText::Exclude({ + hintTable[RHT_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM] = HintText::Exclude({ //obscure text Text{"a #spider deep within the Deku Tree# hides", /*french*/"une #Skulltula au coeur de l'Arbre Mojo# a", /*spanish*/"una #Skulltula en las profundidades del Árbol Deku# otorga"}, }); - hintTable[DEKU_TREE_MQ_DEKU_SCRUB] = HintText::Exclude({ + hintTable[RHT_DEKU_TREE_MQ_DEKU_SCRUB] = HintText::Exclude({ //obscure text Text{"a #scrub in the Deku Tree# sells", /*french*/"la #peste Mojo dans l'Arbre Mojo# vend", /*spanish*/"un #deku del Gran Árbol Deku# vende"}, }); @@ -117,68 +117,68 @@ void HintTable_Init_Exclude_Dungeon() { /*-------------------------- | DODONGOS CAVERN | ---------------------------*/ - hintTable[DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText::Exclude({ + hintTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText::Exclude({ //obscure text Text{"#above King Dodongo# lies", /*french*/"#par dessus le Roi Dodongo# gît", /*spanish*/"#sobre el Rey Dodongo# yace"}, }); - hintTable[DODONGOS_CAVERN_MAP_CHEST] = HintText::Exclude({ + hintTable[RHT_DODONGOS_CAVERN_MAP_CHEST] = HintText::Exclude({ //obscure text Text{"a #muddy wall in Dodongo's Cavern# hides", /*french*/"le #mur fragile dans la Caverne Dodongo# recèle", /*spanish*/"tras una #agrietada pared en la Cueva de los Dodongos# yace"}, }); - hintTable[DODONGOS_CAVERN_COMPASS_CHEST] = HintText::Exclude({ + hintTable[RHT_DODONGOS_CAVERN_COMPASS_CHEST] = HintText::Exclude({ //obscure text Text{"a #statue in Dodongo's Cavern# guards", /*french*/"la #statue dans la Caverne Dodongo# protège", /*spanish*/"una #estatua de la Cueva de los Dodongos# esconde"}, }); - hintTable[DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST] = HintText::Exclude({ + hintTable[RHT_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST] = HintText::Exclude({ //obscure text Text{"above a #maze of stone# in Dodongo's Cavern lies", /*french*/"sur #un labyrinthe de pierre# dans la Caverne Dodongo gît", /*spanish*/"entre un #laberinto de piedra# en la Cueva de los Dodongos yace"}, }); - hintTable[DODONGOS_CAVERN_BOMB_BAG_CHEST] = HintText::Exclude({ + hintTable[RHT_DODONGOS_CAVERN_BOMB_BAG_CHEST] = HintText::Exclude({ //obscure text Text{"the #second lizard cavern battle# yields", /*french*/"le #deuxième duel de lézards de caverne# octroie", /*spanish*/"#luchar dos veces contra reptiles en una cueva# conduce a"}, }); - hintTable[DODONGOS_CAVERN_END_OF_BRIDGE_CHEST] = HintText::Exclude({ + hintTable[RHT_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST] = HintText::Exclude({ //obscure text Text{"a #chest at the end of a bridge# yields", /*french*/"le #trésor à l'extrémité d'un pont# contient", /*spanish*/"un #cofre al final de un quebrado puente# contiene"}, }); - hintTable[DODONGOS_CAVERN_MQ_MAP_CHEST] = HintText::Exclude({ + hintTable[RHT_DODONGOS_CAVERN_MQ_MAP_CHEST] = HintText::Exclude({ //obscure text Text{"a #muddy wall in Dodongo's Cavern# hides", /*french*/"le #mur fragile dans la Caverne Dodongo# recèle", /*spanish*/"una #agrietada pared en la Cueva de los Dodongos# esconde"}, }); - hintTable[DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST] = HintText::Exclude({ + hintTable[RHT_DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST] = HintText::Exclude({ //obscure text Text{"an #elevated alcove# in Dodongo's Cavern holds", /*french*/"l'#alcove haut perchée# dans la Caverne Dodongo cache", /*spanish*/"una #elevada alcoba# en la Cueva de los Dodongos brinda"}, }); - hintTable[DODONGOS_CAVERN_MQ_COMPASS_CHEST] = HintText::Exclude({ + hintTable[RHT_DODONGOS_CAVERN_MQ_COMPASS_CHEST] = HintText::Exclude({ //obscure text Text{"#fire-breathing lizards# in Dodongo's Cavern guard", /*french*/"les #lézards cracheurs de feu# dans la Caverne Dodongo protègent", /*spanish*/"unos #flamígeros reptiles# en la Cueva de los Dodongos esconden"}, }); - hintTable[DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST] = HintText::Exclude({ + hintTable[RHT_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST] = HintText::Exclude({ //obscure text Text{"#baby spiders# in Dodongo's Cavern guard", /*french*/"les #petites araignées dans la Caverne Dodongo# protègent", /*spanish*/"unas #pequeñas larvas# en la Cueva de los Dodongos esconden"}, }); - hintTable[DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST] = HintText::Exclude({ + hintTable[RHT_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST] = HintText::Exclude({ //obscure text Text{"above a #maze of stone# in Dodongo's Cavern lies", /*french*/"sur #un labyrinthe de pierre# dans la Caverne Dodongo gît", /*spanish*/"sobre un #laberinto de piedra# en la Cueva de los Dodongos yace"}, }); - hintTable[DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST] = HintText::Exclude({ + hintTable[RHT_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST] = HintText::Exclude({ //obscure text Text{"#beneath a headstone# in Dodongo's Cavern lies", /*french*/"#sous une pierre tombale# dans la Caverne Dodongo gît", /*spanish*/"#bajo una lápida# en la Cueva de los Dodongos yace"}, }); - hintTable[DODONGOS_CAVERN_KING_DODONGO_HEART] = HintText::Exclude({ + hintTable[RHT_DODONGOS_CAVERN_KING_DODONGO_HEART] = HintText::Exclude({ //obscure text Text{"the #Infernal Dinosaur# holds", /*french*/"le #dinosaure infernal# possède", /*spanish*/"el #dinosaurio infernal# porta"}, }, {}, @@ -186,89 +186,89 @@ void HintTable_Init_Exclude_Dungeon() { Text{"#King Dodongo# holds", /*french*/"le #Roi Dodongo# possède", /*spanish*/"el #Rey Dodongo# porta"} ); - hintTable[DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS] = HintText::Exclude({ + hintTable[RHT_DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS] = HintText::Exclude({ //obscure text Text{"a #spider entangled in vines# in Dodongo's Cavern guards", /*french*/"une #Skulltula sur les vignes dans la Caverne Dodongo# a", /*spanish*/"una #Skulltula sobre unas cepas# de la Cueva de los Dodongos otorga"}, }); - hintTable[DODONGOS_CAVERN_GS_SCARECROW] = HintText::Exclude({ + hintTable[RHT_DODONGOS_CAVERN_GS_SCARECROW] = HintText::Exclude({ //obscure text Text{"a #spider among explosive slugs# hides", /*french*/"une #Skulltula dans l'alcove du couloir dans la Caverne Dodongo# a", /*spanish*/"una #Skulltula rodeada de explosivos gusanos# otorga"}, }); - hintTable[DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS] = HintText::Exclude({ + hintTable[RHT_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS] = HintText::Exclude({ //obscure text Text{"a #spider just out of reach# in Dodongo's Cavern holds", /*french*/"une #Skulltula au haut des escaliers de la Caverne Dodongo# a", /*spanish*/"una #Skulltula fuera del alcance# de la Cueva de los Dodongos otorga"}, }); - hintTable[DODONGOS_CAVERN_GS_BACK_ROOM] = HintText::Exclude({ + hintTable[RHT_DODONGOS_CAVERN_GS_BACK_ROOM] = HintText::Exclude({ //obscure text Text{"a #spider behind a statue# in Dodongo's Cavern holds", /*french*/"une #Skulltula au coeur de la Caverne Dodongo# a", /*spanish*/"una #Skulltula tras una estatua# de la Cueva de los Dodongos otorga"}, }); - hintTable[DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS] = HintText::Exclude({ + hintTable[RHT_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS] = HintText::Exclude({ //obscure text Text{"a #spider among bats# in Dodongo's Cavern holds", /*french*/"une #Skulltula entourée de Saigneurs dans la Caverne Dodongo# a", /*spanish*/"una #Skulltula rodeada de murciélagos# de la Cueva de los Dodongos otorga"}, }); - hintTable[DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM] = HintText::Exclude({ + hintTable[RHT_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM] = HintText::Exclude({ //obscure text Text{"a #spider high on a wall# in Dodongo's Cavern holds", /*french*/"une #Skulltula haut perchée dans la Caverne Dodongo# a", /*spanish*/"una #Skulltula en lo alto de una pared# de la Cueva de los Dodongos otorga"}, }); - hintTable[DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM] = HintText::Exclude({ + hintTable[RHT_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM] = HintText::Exclude({ //obscure text Text{"a #spider on top of a pillar of rock# in Dodongo's Cavern holds", /*french*/"une #Skulltula sur l'énorme pilier de roc de la Caverne Dodongo# a", /*spanish*/"una #Skulltula en lo alto de un pilar# de la Cueva de los Dodongos otorga"}, }); - hintTable[DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM] = HintText::Exclude({ + hintTable[RHT_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM] = HintText::Exclude({ //obscure text Text{"a #spider in a crate# in Dodongo's Cavern holds", /*french*/"une #Skulltula dans une boîte de la Caverne Dodongo# a", /*spanish*/"una #Skulltula bajo una caja# de la Cueva de los Dodongos otorga"}, }); - hintTable[DODONGOS_CAVERN_MQ_GS_BACK_AREA] = HintText::Exclude({ + hintTable[RHT_DODONGOS_CAVERN_MQ_GS_BACK_AREA] = HintText::Exclude({ //obscure text Text{"a #spider among graves# in Dodongo's Cavern holds", /*french*/"une #Skulltula parmi les tombes de la Caverne Dodongo# a", /*spanish*/"una #Skulltula entre lápidas# en la Cueva de los Dodongos otorga"}, }); - hintTable[DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT] = HintText::Exclude({ + hintTable[RHT_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT] = HintText::Exclude({ //obscure text Text{"a pair of #scrubs in Dodongo's Cavern# sells", /*french*/"le #duo de peste Mojo dans la Caverne Dodongo# vend", /*spanish*/"un #par de dekus en la Cueva de los Dodongos# venden"}, }); - hintTable[DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS] = HintText::Exclude({ + hintTable[RHT_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS] = HintText::Exclude({ //obscure text Text{"a #scrub guarded by Lizalfos# sells", /*french*/"la #peste Mojo au coeur de la Caverne Dodongo# vend", /*spanish*/"un #deku custodiado por Lizalfos# vende"}, }); - hintTable[DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT] = HintText::Exclude({ + hintTable[RHT_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT] = HintText::Exclude({ //obscure text Text{"a pair of #scrubs in Dodongo's Cavern# sells", /*french*/"le #duo de peste Mojo dans la Caverne Dodongo# vend", /*spanish*/"un #par de dekus en la Cueva de los Dodongos# venden"}, }); - hintTable[DODONGOS_CAVERN_DEKU_SCRUB_LOBBY] = HintText::Exclude({ + hintTable[RHT_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY] = HintText::Exclude({ //obscure text Text{"a #scrub in Dodongo's Cavern# sells", /*french*/"la #peste Mojo dans l'entrée de la Caverne Dodongo# vend", /*spanish*/"un #deku en la Cueva de los Dodongos# vende"}, }); - hintTable[DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR] = HintText::Exclude({ + hintTable[RHT_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR] = HintText::Exclude({ //obscure text Text{"a pair of #scrubs in Dodongo's Cavern# sells", /*french*/"le #duo de peste Mojo dans l'entrée de la Caverne Dodongo# vend", /*spanish*/"un #par de dekus en la Cueva de los Dodongos# venden"}, }); - hintTable[DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT] = HintText::Exclude({ + hintTable[RHT_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT] = HintText::Exclude({ //obscure text Text{"a pair of #scrubs in Dodongo's Cavern# sells", /*french*/"le #duo de peste Mojo dans l'entrée de la Caverne Dodongo# vend", /*spanish*/"un #par de dekus en la Cueva de los Dodongos# venden"}, }); - hintTable[DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE] = HintText::Exclude({ + hintTable[RHT_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE] = HintText::Exclude({ //obscure text Text{"a #scrub in Dodongo's Cavern# sells", /*french*/"la #peste Mojo au sommet des escaliers dans la Caverne Dodongo# vend", /*spanish*/"un #deku en la Cueva de los Dodongos# vende"}, }); - hintTable[DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS] = HintText::Exclude({ + hintTable[RHT_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS] = HintText::Exclude({ //obscure text Text{"a #scrub guarded by Lizalfos# sells", /*french*/"la #peste Mojo au coeur de la Caverne Dodongo# vend", /*spanish*/"un #deku custodiado por Lizalfos# vende"}, }); @@ -276,7 +276,7 @@ void HintTable_Init_Exclude_Dungeon() { /*-------------------------- | JABU JABUS BELLY | ---------------------------*/ - hintTable[JABU_JABUS_BELLY_MAP_CHEST] = HintText::Exclude({ + hintTable[RHT_JABU_JABUS_BELLY_MAP_CHEST] = HintText::Exclude({ //obscure text Text{"#tentacle trouble# in a deity's belly guards", /*french*/"la #membrane# dans le ventre du gardien protège", /*spanish*/"un #problema tentaculoso# en la tripa de cierta deidad esconde"}, }, {}, @@ -284,7 +284,7 @@ void HintTable_Init_Exclude_Dungeon() { Text{"a #slimy thing# guards", /*french*/"la #chose gluante# gardien protège", /*spanish*/"un #tentáculo parasitario# protege"} ); - hintTable[JABU_JABUS_BELLY_COMPASS_CHEST] = HintText::Exclude({ + hintTable[RHT_JABU_JABUS_BELLY_COMPASS_CHEST] = HintText::Exclude({ //obscure text Text{"#bubble trouble# in a deity's belly guards", /*french*/"un #horde de bulles# dans le ventre du gardien protègent", /*spanish*/"un #problema burbujesco# en la tripa de cierta deidad esconde"}, }, {}, @@ -293,12 +293,12 @@ void HintTable_Init_Exclude_Dungeon() { ); - hintTable[JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST] = HintText::Exclude({ + hintTable[RHT_JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST] = HintText::Exclude({ //obscure text Text{"shooting a #mouth cow# reveals", /*french*/"tirer sur une #vache# révèle", /*spanish*/"#dispararle a una vaca# revela"}, }); - hintTable[JABU_JABUS_BELLY_MQ_MAP_CHEST] = HintText::Exclude({ + hintTable[RHT_JABU_JABUS_BELLY_MQ_MAP_CHEST] = HintText::Exclude({ //obscure text Text{"#pop rocks# hide", /*french*/"des #pierres aux reins# cachent", /*spanish*/"#cepillarse los dientes con explosivos# revela"}, Text{"an #explosive palate# holds", /*french*/"des #gargouillis explosifs# cachent", /*spanish*/"un #paladar explosivo# esconde"}, @@ -307,42 +307,42 @@ void HintTable_Init_Exclude_Dungeon() { Text{"a #boulder before cows# hides", /*french*/"des #rochers près des vaches# cachent", /*spanish*/"cierta #roca rodeada de vacas# esconde"} ); - hintTable[JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST] = HintText::Exclude({ + hintTable[RHT_JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST] = HintText::Exclude({ //obscure text Text{"near a #spiked elevator# lies", /*french*/"près d'un #ascenseur visqueux# gît", /*spanish*/"cerca de un #ascensor puntiagudo# yace"}, }); - hintTable[JABU_JABUS_BELLY_MQ_COMPASS_CHEST] = HintText::Exclude({ + hintTable[RHT_JABU_JABUS_BELLY_MQ_COMPASS_CHEST] = HintText::Exclude({ //obscure text Text{"a #drowning cow# unveils", /*french*/"une #vache à l'eau# a", /*spanish*/"una #vaca sumergida# revela"}, }); - hintTable[JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST] = HintText::Exclude({ + hintTable[RHT_JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST] = HintText::Exclude({ //obscure text Text{"#moving anatomy# creates a path to", /*french*/"un #organe descendant# mène à", /*spanish*/"un #ser movedizo entre paredes# conduce a"}, }); - hintTable[JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST] = HintText::Exclude({ + hintTable[RHT_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST] = HintText::Exclude({ //obscure text Text{"a #pair of digested cows# hold", /*french*/"#deux boeufs digérés# détiennent", /*spanish*/"un #par de digeridas vacas# otorgan"}, }); - hintTable[JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST] = HintText::Exclude({ + hintTable[RHT_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST] = HintText::Exclude({ //obscure text Text{"a #pair of digested cows# hold", /*french*/"#deux boeufs digérés# détiennent", /*spanish*/"un #par de digeridas vacas# otorgan"}, }); - hintTable[JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST] = HintText::Exclude({ + hintTable[RHT_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST] = HintText::Exclude({ //obscure text Text{"the #final cows' reward# in a deity's belly is", /*french*/"le #cadeau des dernières vaches# estomacales est", /*spanish*/"las #vacas al final# de la tripa de cierta deidad otorgan"}, }); - hintTable[JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST] = HintText::Exclude({ + hintTable[RHT_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST] = HintText::Exclude({ //obscure text Text{"#cows protected by falling monsters# in a deity's belly guard", /*french*/"des #vaches protégées par des monstres tombants# cachent", /*spanish*/"unas #vacas custodiadas por monstruos del techo# de la tripa de cierta deidad otorgan"}, }); - hintTable[JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST] = HintText::Exclude({ + hintTable[RHT_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST] = HintText::Exclude({ //obscure text Text{"a school of #stingers swallowed by a deity# guard", /*french*/"les #raies avallées par le gardien# protègent", /*spanish*/"unos #stingers engullidos por cierta deidad# guardan"}, }, {}, @@ -350,7 +350,7 @@ void HintTable_Init_Exclude_Dungeon() { Text{"a school of #stingers swallowed by Jabu-Jabu# guard", /*french*/"les #raies avallées par Jabu-Jabu# protègent", /*spanish*/"unos #stingers engullidos por Jabu-Jabu# guardan"} ); - hintTable[JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST] = HintText::Exclude({ + hintTable[RHT_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST] = HintText::Exclude({ //obscure text Text{"a school of #stingers swallowed by a deity# guard", /*french*/"les #raies avallées par le gardien# protègent", /*spanish*/"unos #stingers engullidos por cierta deidad# guardan"}, }, {}, @@ -358,7 +358,7 @@ void HintTable_Init_Exclude_Dungeon() { Text{"a school of #stingers swallowed by Jabu-Jabu# guard", /*french*/"les #raies avallées par Jabu-Jabu# protègent", /*spanish*/"unos #stingers engullidos por Jabu-Jabu# guardan"} ); - hintTable[JABU_JABUS_BELLY_BARINADE_HEART] = HintText::Exclude({ + hintTable[RHT_JABU_JABUS_BELLY_BARINADE_HEART] = HintText::Exclude({ //obscure text Text{"the #Bio-Electric Anemone# holds", /*french*/"l'#anémone bioélectrique# possède", /*spanish*/"la #anémona bioeléctrica# porta"}, }, {}, @@ -366,43 +366,43 @@ void HintTable_Init_Exclude_Dungeon() { Text{"#Barinade# holds", /*french*/"#Barinade# possède", /*spanish*/"#Barinade# porta"} ); - hintTable[JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER] = HintText::Exclude({ + hintTable[RHT_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER] = HintText::Exclude({ //obscure text Text{"a #spider resting near a princess# in Jabu-Jabu's Belly holds", /*french*/"une #Skulltula près de la princesse dans le Ventre de Jabu-Jabu# a", /*spanish*/"una #Skulltula junto a una princesa# en la Tripa de Jabu-Jabu otorga"}, }); - hintTable[JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER] = HintText::Exclude({ + hintTable[RHT_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER] = HintText::Exclude({ //obscure text Text{"a #spider resting near a princess# in Jabu-Jabu's Belly holds", /*french*/"une #Skulltula près de la princesse dans le Ventre de Jabu-Jabu# a", /*spanish*/"una #Skulltula junto a una princesa# en la Tripa de Jabu-Jabu otorga"}, }); - hintTable[JABU_JABUS_BELLY_GS_NEAR_BOSS] = HintText::Exclude({ + hintTable[RHT_JABU_JABUS_BELLY_GS_NEAR_BOSS] = HintText::Exclude({ //obscure text Text{"#jellyfish surround a spider# holding", /*french*/"une #Skulltula entourée de méduses dans le Ventre de Jabu-Jabu# a", /*spanish*/"una #Skulltula rodeada de medusas# otorga"}, }); - hintTable[JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM] = HintText::Exclude({ + hintTable[RHT_JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM] = HintText::Exclude({ //obscure text Text{"a #spider guarded by a school of stingers# in Jabu-Jabu's Belly holds", /*french*/"une #Skulltula protégée par des raies dans le Ventre de Jabu-Jabu# a", /*spanish*/"una #Skulltula rodeada por unos stingers# en la Tripa de Jabu-Jabu otorga"}, }); - hintTable[JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM] = HintText::Exclude({ + hintTable[RHT_JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM] = HintText::Exclude({ //obscure text Text{"a #spider surrounded by electricity# in Jabu-Jabu's Belly holds", /*french*/"une #Skulltula entourée d'électricité dans le Ventre de Jabu-Jabu# a", /*spanish*/"una #Skulltula rodeada de electricidad# en la Tripa de Jabu-Jabu otorga"}, }); - hintTable[JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM] = HintText::Exclude({ + hintTable[RHT_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM] = HintText::Exclude({ //obscure text Text{"a #spider guarded by a school of stingers# in Jabu-Jabu's Belly holds", /*french*/"une #Skulltula protégée par des raies dans le Ventre de Jabu-Jabu# a", /*spanish*/"una #Skulltula protegida por unos stingers# en la Tripa de Jabu-Jabu otorga"}, }); - hintTable[JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS] = HintText::Exclude({ + hintTable[RHT_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS] = HintText::Exclude({ //obscure text Text{"a #spider in a web within Jabu-Jabu's Belly# holds", /*french*/"une #Skulltula sur une toile dans le Ventre de Jabu-Jabu# a", /*spanish*/"una #Skulltula sobre una red# en la Tripa de Jabu-Jabu otorga"}, }); - hintTable[JABU_JABUS_BELLY_DEKU_SCRUB] = HintText::Exclude({ + hintTable[RHT_JABU_JABUS_BELLY_DEKU_SCRUB] = HintText::Exclude({ //obscure text Text{"a #scrub in a deity# sells", /*french*/"la #peste Mojo dans le ventre du gardien# vend", /*spanish*/"un #deku dentro de cierta deidad# vende"}, }); @@ -410,37 +410,37 @@ void HintTable_Init_Exclude_Dungeon() { /*-------------------------- | FOREST TEMPLE | ---------------------------*/ - hintTable[FOREST_TEMPLE_FIRST_ROOM_CHEST] = HintText::Exclude({ + hintTable[RHT_FOREST_TEMPLE_FIRST_ROOM_CHEST] = HintText::Exclude({ //obscure text Text{"a #tree in the Forest Temple# supports", /*french*/"sur l'#arbre dans le Temple de la Forêt# gît", /*spanish*/"sobre un #árbol del Templo del Bosque# yace"}, }); - hintTable[FOREST_TEMPLE_FIRST_STALFOS_CHEST] = HintText::Exclude({ + hintTable[RHT_FOREST_TEMPLE_FIRST_STALFOS_CHEST] = HintText::Exclude({ //obscure text Text{"#defeating enemies beneath a falling ceiling# in Forest Temple yields", /*french*/"#deux squelettes# dans le Temple de la Forêt protègent", /*spanish*/"#derrotar enemigos caídos de lo alto# del Templo del Bosque revela"}, }); - hintTable[FOREST_TEMPLE_WELL_CHEST] = HintText::Exclude({ + hintTable[RHT_FOREST_TEMPLE_WELL_CHEST] = HintText::Exclude({ //obscure text Text{"a #sunken chest deep in the woods# contains", /*french*/"le #coffre submergé dans la forêt# contient", /*spanish*/"un #sumergido cofre en lo profundo del bosque# contiene"}, }); - hintTable[FOREST_TEMPLE_MAP_CHEST] = HintText::Exclude({ + hintTable[RHT_FOREST_TEMPLE_MAP_CHEST] = HintText::Exclude({ //obscure text Text{"a #fiery skull# in Forest Temple guards", /*french*/"le #crâne enflammé# dans le Temple de la Forêt protège", /*spanish*/"una #ardiente calavera# del Templo del Bosque esconde"}, }); - hintTable[FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST] = HintText::Exclude({ + hintTable[RHT_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST] = HintText::Exclude({ //obscure text Text{"a #chest on a small island# in the Forest Temple holds", /*french*/"le #coffre sur l'îlot# du Temple de la Forêt contient", /*spanish*/"un #cofre sobre una isla# del Templo del Bosque contiene"}, }); - hintTable[FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST] = HintText::Exclude({ + hintTable[RHT_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST] = HintText::Exclude({ //obscure text Text{"beneath a #checkerboard falling ceiling# lies", /*french*/"sous #l'échiquier tombant# gît", /*spanish*/"tras un #techo de ajedrez# yace"}, }); - hintTable[FOREST_TEMPLE_EYE_SWITCH_CHEST] = HintText::Exclude({ + hintTable[RHT_FOREST_TEMPLE_EYE_SWITCH_CHEST] = HintText::Exclude({ //obscure text Text{"a #sharp eye# will spot", /*french*/"l'#oeil perçant# dans la forêt verra", /*spanish*/"un #afilado ojo# revela"}, }, {}, @@ -448,17 +448,17 @@ void HintTable_Init_Exclude_Dungeon() { Text{"#blocks of stone# in the Forest Temple surround", /*french*/"les #blocs dans le Temple de la Forêt# entourent", /*spanish*/"cerca de unos #bloques de piedra# del Templo del Bosque yace"} ); - hintTable[FOREST_TEMPLE_BOSS_KEY_CHEST] = HintText::Exclude({ + hintTable[RHT_FOREST_TEMPLE_BOSS_KEY_CHEST] = HintText::Exclude({ //obscure text Text{"a #turned trunk# contains", /*french*/"le #coffre pivoté# contient", /*spanish*/"en una #sala con otro punto de vista# se esconde"}, }); - hintTable[FOREST_TEMPLE_FLOORMASTER_CHEST] = HintText::Exclude({ + hintTable[RHT_FOREST_TEMPLE_FLOORMASTER_CHEST] = HintText::Exclude({ //obscure text Text{"deep in the forest #shadows guard a chest# containing", /*french*/"l'#ombre de la forêt# protège un coffre contenant", /*spanish*/"en lo profundo del bosque #unas sombras# esconden"}, }); - hintTable[FOREST_TEMPLE_BOW_CHEST] = HintText::Exclude({ + hintTable[RHT_FOREST_TEMPLE_BOW_CHEST] = HintText::Exclude({ //obscure text Text{"an #army of the dead# guards", /*french*/"des #squelettes sylvestres# protègent", /*spanish*/"un #ejército de soldados caídos# guarda"}, }, {}, @@ -466,7 +466,7 @@ void HintTable_Init_Exclude_Dungeon() { Text{"#Stalfos deep in the Forest Temple# guard", /*french*/"#trois squelettes dans le Temple de la Forêt# protègent", /*spanish*/"los #Stalfos en lo profundo del Templo del Bosque# guardan"} ); - hintTable[FOREST_TEMPLE_RED_POE_CHEST] = HintText::Exclude({ + hintTable[RHT_FOREST_TEMPLE_RED_POE_CHEST] = HintText::Exclude({ //obscure text Text{"#Joelle# guards", /*french*/"#Joelle# protège", /*spanish*/"#Joelle# guarda"}, }, {}, @@ -474,7 +474,7 @@ void HintTable_Init_Exclude_Dungeon() { Text{"a #red ghost# guards", /*french*/"le #fantôme rouge# protège", /*spanish*/"un #espectro rojo# guarda"} ); - hintTable[FOREST_TEMPLE_BLUE_POE_CHEST] = HintText::Exclude({ + hintTable[RHT_FOREST_TEMPLE_BLUE_POE_CHEST] = HintText::Exclude({ //obscure text Text{"#Beth# guards", /*french*/"#Beth# protège", /*spanish*/"#Beth# guarda"}, }, {}, @@ -482,23 +482,23 @@ void HintTable_Init_Exclude_Dungeon() { Text{"a #blue ghost# guards", /*french*/"le #fantôme bleu# protège", /*spanish*/"un #espectro azul# guarda"} ); - hintTable[FOREST_TEMPLE_BASEMENT_CHEST] = HintText::Exclude({ + hintTable[RHT_FOREST_TEMPLE_BASEMENT_CHEST] = HintText::Exclude({ //obscure text Text{"#revolving walls# in the Forest Temple conceal", /*french*/"des #murs rotatifs dans la forêt# recèlent", /*spanish*/"las #paredes giratorias# del Templo del Bosque conceden"}, }); - hintTable[FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST] = HintText::Exclude({ + hintTable[RHT_FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST] = HintText::Exclude({ //obscure text Text{"a #tree in the Forest Temple# supports", /*french*/"sur l'#arbre dans le Temple de la Forêt# gît", /*spanish*/"sobre un #árbol del Templo del Bosque# yace"}, }); - hintTable[FOREST_TEMPLE_MQ_WOLFOS_CHEST] = HintText::Exclude({ + hintTable[RHT_FOREST_TEMPLE_MQ_WOLFOS_CHEST] = HintText::Exclude({ //obscure text Text{"#defeating enemies beneath a falling ceiling# in Forest Temple yields", /*french*/"#deux squelettes# dans le Temple de la Forêt protègent", /*spanish*/"#derrotar enemigos caídos de lo alto# del Templo del Bosque revela"}, }); - hintTable[FOREST_TEMPLE_MQ_BOW_CHEST] = HintText::Exclude({ + hintTable[RHT_FOREST_TEMPLE_MQ_BOW_CHEST] = HintText::Exclude({ //obscure text Text{"an #army of the dead# guards", /*french*/"des #squelettes sylvestres# protègent", /*spanish*/"un #ejército de soldados caídos# guarda"}, }, {}, @@ -506,22 +506,22 @@ void HintTable_Init_Exclude_Dungeon() { Text{"#Stalfos deep in the Forest Temple# guard", /*french*/"#trois squelettes dans le Temple de la Forêt# protègent", /*spanish*/"los #Stalfos en lo profundo del Templo del Bosque# guardan"} ); - hintTable[FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST] = HintText::Exclude({ + hintTable[RHT_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST] = HintText::Exclude({ //obscure text Text{"a #chest on a small island# in the Forest Temple holds", /*french*/"le #coffre sur l'îlot# du Temple de la Forêt contient", /*spanish*/"un #cofre sobre una isla# del Templo del Bosque contiene"}, }); - hintTable[FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST] = HintText::Exclude({ + hintTable[RHT_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST] = HintText::Exclude({ //obscure text Text{"#high in a courtyard# within the Forest Temple is", /*french*/"#haut perché dans le jardin# du Temple de la Forêt gît", /*spanish*/"un #cofre en lo alto de un patio# del Templo del Bosque contiene"}, }); - hintTable[FOREST_TEMPLE_MQ_WELL_CHEST] = HintText::Exclude({ + hintTable[RHT_FOREST_TEMPLE_MQ_WELL_CHEST] = HintText::Exclude({ //obscure text Text{"a #sunken chest deep in the woods# contains", /*french*/"le #coffre submergé dans la forêt# contient", /*spanish*/"un #sumergido cofre en lo profundo del bosque# contiene"}, }); - hintTable[FOREST_TEMPLE_MQ_MAP_CHEST] = HintText::Exclude({ + hintTable[RHT_FOREST_TEMPLE_MQ_MAP_CHEST] = HintText::Exclude({ //obscure text Text{"#Joelle# guards", /*french*/"#Joelle# protège", /*spanish*/"#Joelle# guarda"}, }, {}, @@ -529,7 +529,7 @@ void HintTable_Init_Exclude_Dungeon() { Text{"a #red ghost# guards", /*french*/"le #fantôme rouge# protège", /*spanish*/"un #fantasma rojo# guarda"} ); - hintTable[FOREST_TEMPLE_MQ_COMPASS_CHEST] = HintText::Exclude({ + hintTable[RHT_FOREST_TEMPLE_MQ_COMPASS_CHEST] = HintText::Exclude({ //obscure text Text{"#Beth# guards", /*french*/"#Beth# protège", /*spanish*/"#Beth# guarda"}, }, {}, @@ -537,27 +537,27 @@ void HintTable_Init_Exclude_Dungeon() { Text{"a #blue ghost# guards", /*french*/"le #fantôme bleu# protège", /*spanish*/"un #fantasma azul# guarda"} ); - hintTable[FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST] = HintText::Exclude({ + hintTable[RHT_FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST] = HintText::Exclude({ //obscure text Text{"beneath a #checkerboard falling ceiling# lies", /*french*/"sous #l'échiquier tombant# gît", /*spanish*/"tras un #techo de ajedrez# yace"}, }); - hintTable[FOREST_TEMPLE_MQ_BASEMENT_CHEST] = HintText::Exclude({ + hintTable[RHT_FOREST_TEMPLE_MQ_BASEMENT_CHEST] = HintText::Exclude({ //obscure text Text{"#revolving walls# in the Forest Temple conceal", /*french*/"des #murs rotatifs dans la forêt# recèlent", /*spanish*/"las #paredes giratorias# del Templo del Bosque conceden"}, }); - hintTable[FOREST_TEMPLE_MQ_REDEAD_CHEST] = HintText::Exclude({ + hintTable[RHT_FOREST_TEMPLE_MQ_REDEAD_CHEST] = HintText::Exclude({ //obscure text Text{"deep in the forest #undead guard a chest# containing", /*french*/"des #revenants dans le Temple de la Forêt# protègent", /*spanish*/"en lo profundo del bosque #guardias del más allá# guardan"}, }); - hintTable[FOREST_TEMPLE_MQ_BOSS_KEY_CHEST] = HintText::Exclude({ + hintTable[RHT_FOREST_TEMPLE_MQ_BOSS_KEY_CHEST] = HintText::Exclude({ //obscure text Text{"a #turned trunk# contains", /*french*/"le #coffre pivoté# contient", /*spanish*/"en una #sala con otro punto de vista# se esconde"}, }); - hintTable[FOREST_TEMPLE_PHANTOM_GANON_HEART] = HintText::Exclude({ + hintTable[RHT_FOREST_TEMPLE_PHANTOM_GANON_HEART] = HintText::Exclude({ //obscure text Text{"the #Evil Spirit from Beyond# holds", /*french*/"l'#esprit maléfique de l'au-delà# possède", /*spanish*/"el #espíritu maligno de ultratumba# porta"}, }, {}, @@ -565,53 +565,53 @@ void HintTable_Init_Exclude_Dungeon() { Text{"#Phantom Ganon# holds", /*french*/"#Ganon Spectral# possède", /*spanish*/"#Ganon Fantasma# porta"} ); - hintTable[FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD] = HintText::Exclude({ + hintTable[RHT_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD] = HintText::Exclude({ //obscure text Text{"a #spider on a small island# in the Forest Temple holds", /*french*/"une #Skulltula sur l'îlot du Temple de la Forêt# a", /*spanish*/"una #Skulltula sobre una pequeña isla# del Templo del Bosque otorga"}, }); - hintTable[FOREST_TEMPLE_GS_FIRST_ROOM] = HintText::Exclude({ + hintTable[RHT_FOREST_TEMPLE_GS_FIRST_ROOM] = HintText::Exclude({ //obscure text Text{"a #spider high on a wall of vines# in the Forest Temple holds", /*french*/"une #Skulltula sur un mur de vignes du Temple de la Forêt# a", /*spanish*/"una #Skulltula en lo alto de una pared de cepas# del Templo del Bosque otorga"}, }); - hintTable[FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD] = HintText::Exclude({ + hintTable[RHT_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD] = HintText::Exclude({ //obscure text Text{"#stone columns# lead to a spider in the Forest Temple hiding", /*french*/"une #Skulltula haut perchée dans le jardin du Temple de la Forêt# a", /*spanish*/"unas #columnas del Templo del Bosque# conducen a una Skulltula que otorga"}, }); - hintTable[FOREST_TEMPLE_GS_LOBBY] = HintText::Exclude({ + hintTable[RHT_FOREST_TEMPLE_GS_LOBBY] = HintText::Exclude({ //obscure text Text{"a #spider among ghosts# in the Forest Temple guards", /*french*/"une #Skulltula dans la grande salle du Temple de la Forêt# a", /*spanish*/"una #Skulltula rodeada de fantasmas# del Templo del Bosque otorga"}, }); - hintTable[FOREST_TEMPLE_GS_BASEMENT] = HintText::Exclude({ + hintTable[RHT_FOREST_TEMPLE_GS_BASEMENT] = HintText::Exclude({ //obscure text Text{"a #spider within revolving walls# in the Forest Temple holds", /*french*/"une #Skulltula derrière les murs pivotants du Temple de la Forêt# a", /*spanish*/"una #Skulltula entre paredes giratorias# del Templo del Bosque otorga"}, }); - hintTable[FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY] = HintText::Exclude({ + hintTable[RHT_FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY] = HintText::Exclude({ //obscure text Text{"an #ivy-hidden spider# in the Forest Temple hoards", /*french*/"une #Skulltula près de l'entrée du Temple de la Forêt# a", /*spanish*/"una #Skulltula escondida entre cepas# del Templo del Bosque otorga"}, }); - hintTable[FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM] = HintText::Exclude({ + hintTable[RHT_FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM] = HintText::Exclude({ //obscure text Text{"a #spider in a hidden nook# within the Forest Temple holds", /*french*/"une #Skulltula dans un recoin caché du Temple de la Forêt# a", /*spanish*/"una #Skulltula en una esquina oculta# del Templo del Bosque otorga"}, }); - hintTable[FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD] = HintText::Exclude({ + hintTable[RHT_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD] = HintText::Exclude({ //obscure text Text{"a #spider on an arch# in the Forest Temple holds", /*french*/"une #Skulltula sur une arche du Temple de la Forêt# a", /*spanish*/"una #Skulltula sobre un arco# del Templo del Bosque otorga"}, }); - hintTable[FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD] = HintText::Exclude({ + hintTable[RHT_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD] = HintText::Exclude({ //obscure text Text{"a #spider on a ledge# in the Forest Temple holds", /*french*/"une #Skulltula dans le jardin du Temple de la Forêt# a", /*spanish*/"una #Skulltula en un borde# del Templo del Bosque otorga"}, }); - hintTable[FOREST_TEMPLE_MQ_GS_WELL] = HintText::Exclude({ + hintTable[RHT_FOREST_TEMPLE_MQ_GS_WELL] = HintText::Exclude({ //obscure text Text{"#draining a well# in Forest Temple uncovers a spider with", /*french*/"une #Skulltula au fond du Puits du Temple de la Forêt# a", /*spanish*/"#vaciar el pozo# del Templo del Bosque desvela una Skulltula que otorga"}, }); @@ -619,73 +619,73 @@ void HintTable_Init_Exclude_Dungeon() { /*-------------------------- | FIRE TEMPLE | ---------------------------*/ - hintTable[FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText::Exclude({ + hintTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText::Exclude({ //obscure text Text{"#near a dragon# is", /*french*/"#près d'un dragon# gît", /*spanish*/"#cerca de un dragón# yace"}, }); - hintTable[FIRE_TEMPLE_FLARE_DANCER_CHEST] = HintText::Exclude({ + hintTable[RHT_FIRE_TEMPLE_FLARE_DANCER_CHEST] = HintText::Exclude({ //obscure text Text{"the #Flare Dancer behind a totem# guards", /*french*/"le #Danse-Flamme derrière un totem# protège", /*spanish*/"el #Bailafuego tras unos tótems# esconde"}, }); - hintTable[FIRE_TEMPLE_BOSS_KEY_CHEST] = HintText::Exclude({ + hintTable[RHT_FIRE_TEMPLE_BOSS_KEY_CHEST] = HintText::Exclude({ //obscure text Text{"a #prison beyond a totem# holds", /*french*/"la #prison derrière un totem# contient", /*spanish*/"en una #prisión tras unos tótems# yace"}, }); - hintTable[FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST] = HintText::Exclude({ + hintTable[RHT_FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST] = HintText::Exclude({ //obscure text Text{"#explosives over a lava pit# unveil", /*french*/"des #explosifs dans un lac de lave# révèlent", /*spanish*/"los #explosivos en un mar de llamas# revelan"}, }); - hintTable[FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST] = HintText::Exclude({ + hintTable[RHT_FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST] = HintText::Exclude({ //obscure text Text{"a #Goron trapped near lava# holds", /*french*/"le #Goron emprisonné près de la lave# a", /*spanish*/"un #goron atrapado cerca de un mar de llamas# guarda"}, }); - hintTable[FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST] = HintText::Exclude({ + hintTable[RHT_FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST] = HintText::Exclude({ //obscure text Text{"a #Goron at the end of a maze# holds", /*french*/"le #Goron dans le labyrinthe# a", /*spanish*/"un #goron al final de un laberinto# guarda"}, }); - hintTable[FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST] = HintText::Exclude({ + hintTable[RHT_FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST] = HintText::Exclude({ //obscure text Text{"a #Goron above a maze# holds", /*french*/"le #Goron au dessus du labyrinthe# a", /*spanish*/"un #goron sobre un laberinto# guarda"}, }); - hintTable[FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST] = HintText::Exclude({ + hintTable[RHT_FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST] = HintText::Exclude({ //obscure text Text{"a #Goron hidden near a maze# holds", /*french*/"le #Goron caché près du labyrinthe# a", /*spanish*/"un #goron escondido tras un laberinto# guarda"}, }); - hintTable[FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST] = HintText::Exclude({ + hintTable[RHT_FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST] = HintText::Exclude({ //obscure text Text{"a #blocked path# in Fire Temple holds", /*french*/"un #sol fragile dans le Temple du Feu# contient", /*spanish*/"en un #camino bloqueado# del Templo del Fuego yace"}, }); - hintTable[FIRE_TEMPLE_MAP_CHEST] = HintText::Exclude({ + hintTable[RHT_FIRE_TEMPLE_MAP_CHEST] = HintText::Exclude({ //obscure text Text{"a #caged chest# in the Fire Temple hoards", /*french*/"un #coffre emprisonné# dans le Temple du Feu contient", /*spanish*/"un #cofre entre rejas# del Templo del Fuego contiene"}, }); - hintTable[FIRE_TEMPLE_COMPASS_CHEST] = HintText::Exclude({ + hintTable[RHT_FIRE_TEMPLE_COMPASS_CHEST] = HintText::Exclude({ //obscure text Text{"a #chest in a fiery maze# contains", /*french*/"un #coffre dans un labyrinthe enflammé# contient", /*spanish*/"un #cofre de un ardiente laberinto# contiene"}, }); - hintTable[FIRE_TEMPLE_HIGHEST_GORON_CHEST] = HintText::Exclude({ + hintTable[RHT_FIRE_TEMPLE_HIGHEST_GORON_CHEST] = HintText::Exclude({ //obscure text Text{"a #Goron atop the Fire Temple# holds", /*french*/"le #Goron au sommet du Temple du Feu# a", /*spanish*/"un #goron en lo alto del Templo del Fuego# guarda"}, }); - hintTable[FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST] = HintText::Exclude({ + hintTable[RHT_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST] = HintText::Exclude({ //obscure text Text{"#near a dragon# is", /*french*/"#près d'un dragon# gît", /*spanish*/"#cerca de un dragón# yace"}, }); - hintTable[FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST] = HintText::Exclude({ + hintTable[RHT_FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST] = HintText::Exclude({ //obscure text Text{"the #Flare Dancer in the depths of a volcano# guards", /*french*/"le #Danse-Flamme au coeur du volcan# a", /*spanish*/"el #Bailafuego en lo profundo del volcán# esconde"}, }, {}, @@ -693,52 +693,52 @@ void HintTable_Init_Exclude_Dungeon() { Text{"the #Flare Dancer in the depths of the Fire Temple# guards", /*french*/"le #Danse-Flamme au coeur du volcan# a", /*spanish*/"el #Bailafuego en lo profundo del Templo del Fuego# esconde"} ); - hintTable[FIRE_TEMPLE_MQ_COMPASS_CHEST] = HintText::Exclude({ + hintTable[RHT_FIRE_TEMPLE_MQ_COMPASS_CHEST] = HintText::Exclude({ //obscure text Text{"a #blocked path# in Fire Temple holds", /*french*/"le #chemin scellé# dans le Temple du Feu contient", /*spanish*/"en un #camino bloqueado# del Templo del Fuego yace"}, }); - hintTable[FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST] = HintText::Exclude({ + hintTable[RHT_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST] = HintText::Exclude({ //obscure text Text{"#crates in a maze# contain", /*french*/"des #boîtes dans le labyrinthe# contiennent", /*spanish*/"las #cajas de un laberinto# contienen"}, }); - hintTable[FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST] = HintText::Exclude({ + hintTable[RHT_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST] = HintText::Exclude({ //obscure text Text{"#crates in a maze# contain", /*french*/"des #boîtes dans le labyrinthe# contiennent", /*spanish*/"las #cajas de un laberinto# contienen"}, }); - hintTable[FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST] = HintText::Exclude({ + hintTable[RHT_FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST] = HintText::Exclude({ //obscure text Text{"a #falling slug# in the Fire Temple guards", /*french*/"la #limace tombante# dans le Temple du Feu protège", /*spanish*/"una #babosa del techo# del Templo del Fuego guarda"}, }); - hintTable[FIRE_TEMPLE_MQ_MAP_CHEST] = HintText::Exclude({ + hintTable[RHT_FIRE_TEMPLE_MQ_MAP_CHEST] = HintText::Exclude({ //obscure text Text{"using a #hammer in the depths of the Fire Temple# reveals", "frapper du #marteau au coeur du volcan# révèle", /*spanish*/"usar el #martillo en lo profundo del Templo del Fuego# revela"}, }); - hintTable[FIRE_TEMPLE_MQ_BOSS_KEY_CHEST] = HintText::Exclude({ + hintTable[RHT_FIRE_TEMPLE_MQ_BOSS_KEY_CHEST] = HintText::Exclude({ //obscure text Text{"#illuminating a lava pit# reveals the path to", /*french*/"#éclairer le lac de lave# révèle", /*spanish*/"#iluminar un mar de llamas# revela"}, }); - hintTable[FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST] = HintText::Exclude({ + hintTable[RHT_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST] = HintText::Exclude({ //obscure text Text{"#explosives over a lava pit# unveil", /*french*/"des #explosifs dans un lac de lave# révèlent", /*spanish*/"los #explosivos en un mar de llamas# revelan"}, }); - hintTable[FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST] = HintText::Exclude({ + hintTable[RHT_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST] = HintText::Exclude({ //obscure text Text{"a #Goron hidden near a maze# holds", /*french*/"le #Goron caché près du labyrinthe# a", /*spanish*/"un #goron cerca de un laberinto# guarda"}, }); - hintTable[FIRE_TEMPLE_MQ_FREESTANDING_KEY] = HintText::Exclude({ + hintTable[RHT_FIRE_TEMPLE_MQ_FREESTANDING_KEY] = HintText::Exclude({ //obscure text Text{"hidden #beneath a block of stone# lies", /*french*/"caché #derrière un bloc de pierre# gît", /*spanish*/"#bajo unos bloques de piedra# yace"}, }); - hintTable[FIRE_TEMPLE_VOLVAGIA_HEART] = HintText::Exclude({ + hintTable[RHT_FIRE_TEMPLE_VOLVAGIA_HEART] = HintText::Exclude({ //obscure text Text{"the #Subterranean Lava Dragon# holds", /*french*/"le #dragon des profondeurs# possède", /*spanish*/"el #dragón de lava subterráneo# porta"}, }, {}, @@ -746,22 +746,22 @@ void HintTable_Init_Exclude_Dungeon() { Text{"#Volvagia# holds", /*french*/"#Volvagia# possède", /*spanish*/"#Volvagia# porta"} ); - hintTable[FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM] = HintText::Exclude({ + hintTable[RHT_FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM] = HintText::Exclude({ //obscure text Text{"#eight tiles of malice# guard a spider holding", /*french*/"une #Skulltula protégée par huit tuiles dans le Temple du Feu# a", /*spanish*/"#ocho baldosas de maldad# custodian una Skulltula que otorga"}, }); - hintTable[FIRE_TEMPLE_GS_BOSS_KEY_LOOP] = HintText::Exclude({ + hintTable[RHT_FIRE_TEMPLE_GS_BOSS_KEY_LOOP] = HintText::Exclude({ //obscure text Text{"#five tiles of malice# guard a spider holding", /*french*/"une #Skulltula protégée par cinq tuiles dans le Temple du Feu# a", /*spanish*/"#cinco baldosas de maldad# custodian una Skulltula que otorga"}, }); - hintTable[FIRE_TEMPLE_GS_BOULDER_MAZE] = HintText::Exclude({ + hintTable[RHT_FIRE_TEMPLE_GS_BOULDER_MAZE] = HintText::Exclude({ //obscure text Text{"#explosives in a maze# unveil a spider hiding", /*french*/"une #Skulltula derrière un mur fragile du Temple du Feu# a", /*spanish*/"los #explosivos en un laberinto# desvelan una Skulltula que otorga"}, }); - hintTable[FIRE_TEMPLE_GS_SCARECROW_TOP] = HintText::Exclude({ + hintTable[RHT_FIRE_TEMPLE_GS_SCARECROW_TOP] = HintText::Exclude({ //obscure text Text{"a #spider-friendly scarecrow# atop a volcano hides", /*french*/"une #Skulltula repérée par l'épouvantail du volcan# a", /*spanish*/"un #espantapájaros en lo alto de un volcán# custodia una Skulltula que otorga"}, }, {}, @@ -769,7 +769,7 @@ void HintTable_Init_Exclude_Dungeon() { Text{"a #spider-friendly scarecrow# atop the Fire Temple hides", /*french*/"une #Skulltula repérée par l'épouvantail du Temple du Feu# a", /*spanish*/"un #espantapájaros del Templo del Fuego# custodia una Skulltula que otorga"} ); - hintTable[FIRE_TEMPLE_GS_SCARECROW_CLIMB] = HintText::Exclude({ + hintTable[RHT_FIRE_TEMPLE_GS_SCARECROW_CLIMB] = HintText::Exclude({ //obscure text Text{"a #spider-friendly scarecrow# atop a volcano hides", /*french*/"une #Skulltula repérée par l'épouvantail du volcan# a", /*spanish*/"un #espantapájaros en lo alto de un volcán# custodia una Skulltula que otorga"}, }, {}, @@ -778,22 +778,22 @@ void HintTable_Init_Exclude_Dungeon() { ); - hintTable[FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE] = HintText::Exclude({ + hintTable[RHT_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE] = HintText::Exclude({ //obscure text Text{"a #spider above a fiery maze# holds", /*french*/"une #Skulltula au dessus du labyrinthe enflammé du Temple du Feu# a", /*spanish*/"una #Skulltula sobre un ardiente laberinto# otorga"}, }); - hintTable[FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER] = HintText::Exclude({ + hintTable[RHT_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER] = HintText::Exclude({ //obscure text Text{"a #spider within a fiery maze# holds", /*french*/"une #Skulltula dans le labyrinthe enflammé du Temple du Feu# a", /*spanish*/"una #Skulltula en el interior de un ardiente laberinto# otorga"}, }); - hintTable[FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR] = HintText::Exclude({ + hintTable[RHT_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR] = HintText::Exclude({ //obscure text Text{"a #Goron trapped near lava# befriended a spider with", /*french*/"une #Skulltula emprisonnée près du lac de lave du Temple du Feu# a", /*spanish*/"una #Skulltula amiga de un Goron atrapado junto a la lava# otorga"}, }); - hintTable[FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM] = HintText::Exclude({ + hintTable[RHT_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM] = HintText::Exclude({ //obscure text Text{"a #spider beside a fiery maze# holds", /*french*/"une #Skulltula près du labyrinthe enflammé du Temple du Feu# a", /*spanish*/"una #Skulltula junto a un ardiente laberinto# otorga"}, }); @@ -801,42 +801,42 @@ void HintTable_Init_Exclude_Dungeon() { /*-------------------------- | WATER TEMPLE | ---------------------------*/ - hintTable[WATER_TEMPLE_MAP_CHEST] = HintText::Exclude({ + hintTable[RHT_WATER_TEMPLE_MAP_CHEST] = HintText::Exclude({ //obscure text Text{"#rolling spikes# in the Water Temple surround", /*french*/"des #Spikes# dans le Temple de l'Eau entourent", /*spanish*/"unas #rodantes púas# del Templo del Agua guardan"}, }); - hintTable[WATER_TEMPLE_COMPASS_CHEST] = HintText::Exclude({ + hintTable[RHT_WATER_TEMPLE_COMPASS_CHEST] = HintText::Exclude({ //obscure text Text{"#roaming stingers in the Water Temple# guard", /*french*/"des #raies dans le Temple de l'Eau# protègent", /*spanish*/"unos #errantes stingers# del Templo del Agua guardan"}, }); - hintTable[WATER_TEMPLE_TORCHES_CHEST] = HintText::Exclude({ + hintTable[RHT_WATER_TEMPLE_TORCHES_CHEST] = HintText::Exclude({ //obscure text Text{"#fire in the Water Temple# reveals", /*french*/"des #flammes dans le Temple de l'Eau# révèlent", /*spanish*/"el #fuego en el Templo del Agua# revela"}, }); - hintTable[WATER_TEMPLE_DRAGON_CHEST] = HintText::Exclude({ + hintTable[RHT_WATER_TEMPLE_DRAGON_CHEST] = HintText::Exclude({ //obscure text Text{"a #serpent's prize# in the Water Temple is", /*french*/"la #récompense du dragon submergé# est", /*spanish*/"el #escamado premio# del Templo del Agua se trata de"}, }); - hintTable[WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST] = HintText::Exclude({ + hintTable[RHT_WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST] = HintText::Exclude({ //obscure text Text{"#blinding an eye# in the Water Temple leads to", /*french*/"#l'oeil# du Temple de l'Eau voit", /*spanish*/"#cegar un ojo# del Templo del Agua conduce a"}, }); - hintTable[WATER_TEMPLE_CENTRAL_PILLAR_CHEST] = HintText::Exclude({ + hintTable[RHT_WATER_TEMPLE_CENTRAL_PILLAR_CHEST] = HintText::Exclude({ //obscure text Text{"in the #depths of the Water Temple# lies", /*french*/"le #coeur du Temple de l'Eau# cache", /*spanish*/"en las #profundidades del Templo del Agua# yace"}, }); - hintTable[WATER_TEMPLE_CRACKED_WALL_CHEST] = HintText::Exclude({ + hintTable[RHT_WATER_TEMPLE_CRACKED_WALL_CHEST] = HintText::Exclude({ //obscure text Text{"#through a crack# in the Water Temple is", /*french*/"le #mur fragile# du Temple de l'Eau cache", /*spanish*/"tras una #agrietada pared# del Templo del Agua yace"}, }); - hintTable[WATER_TEMPLE_LONGSHOT_CHEST] = HintText::Exclude({ + hintTable[RHT_WATER_TEMPLE_LONGSHOT_CHEST] = HintText::Exclude({ //obscure text Text{"#facing yourself# reveals", /*french*/"se #vaincre soi-même# révèle", /*spanish*/"#luchar contra ti mismo# revela"}, Text{"a #dark reflection# of yourself guards", /*french*/"son #propre reflet# cache", /*spanish*/"el #oscuro reflejo de ti mismo# guarda"}, @@ -846,32 +846,32 @@ void HintTable_Init_Exclude_Dungeon() { ); - hintTable[WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST] = HintText::Exclude({ + hintTable[RHT_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST] = HintText::Exclude({ //obscure text Text{"in the #depths of the Water Temple# lies", /*french*/"le #coeur du Temple de l'Eau# cache", /*spanish*/"en las #profundidades del Templo del Agua# yace"}, }); - hintTable[WATER_TEMPLE_MQ_BOSS_KEY_CHEST] = HintText::Exclude({ + hintTable[RHT_WATER_TEMPLE_MQ_BOSS_KEY_CHEST] = HintText::Exclude({ //obscure text Text{"fire in the Water Temple unlocks a #vast gate# revealing a chest with", /*french*/"des #flammes au coeur du Temple de l'Eau# révèlent", /*spanish*/"el fuego en el Templo del Agua alza una #gran valla# con"}, }); - hintTable[WATER_TEMPLE_MQ_LONGSHOT_CHEST] = HintText::Exclude({ + hintTable[RHT_WATER_TEMPLE_MQ_LONGSHOT_CHEST] = HintText::Exclude({ //obscure text Text{"#through a crack# in the Water Temple is", /*french*/"le #mur fragile# du Temple de l'Eau cache", /*spanish*/"tras una #agrietada pared# del Templo del Agua yace"}, }); - hintTable[WATER_TEMPLE_MQ_COMPASS_CHEST] = HintText::Exclude({ + hintTable[RHT_WATER_TEMPLE_MQ_COMPASS_CHEST] = HintText::Exclude({ //obscure text Text{"#fire in the Water Temple# reveals", /*french*/"des #flammes dans le Temple de l'Eau# révèlent", /*spanish*/"el #fuego en el Templo del Agua# revela"}, }); - hintTable[WATER_TEMPLE_MQ_MAP_CHEST] = HintText::Exclude({ + hintTable[RHT_WATER_TEMPLE_MQ_MAP_CHEST] = HintText::Exclude({ //obscure text Text{"#sparring soldiers# in the Water Temple guard", /*french*/"les #soldats du Temple de l'Eau# protègent", /*spanish*/"#acabar con unos soldados# del Templo del Agua revela"}, }); - hintTable[WATER_TEMPLE_MORPHA_HEART] = HintText::Exclude({ + hintTable[RHT_WATER_TEMPLE_MORPHA_HEART] = HintText::Exclude({ //obscure text Text{"the #Giant Aquatic Amoeba# holds", /*french*/"l'#amibe aquatique géante# possède", /*spanish*/"la #ameba acuática gigante# porta"}, }, {}, @@ -879,17 +879,17 @@ void HintTable_Init_Exclude_Dungeon() { Text{"#Morpha# holds", /*french*/"#Morpha# possède", /*spanish*/"#Morpha# porta"} ); - hintTable[WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM] = HintText::Exclude({ + hintTable[RHT_WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM] = HintText::Exclude({ //obscure text Text{"a #spider over a waterfall# in the Water Temple holds", /*french*/"une #Skulltula au dessus d'une cascade du Temple de l'Eau# a", /*spanish*/"una #Skulltula tras una cascada# del Templo del Agua otorga"}, }); - hintTable[WATER_TEMPLE_GS_CENTRAL_PILLAR] = HintText::Exclude({ + hintTable[RHT_WATER_TEMPLE_GS_CENTRAL_PILLAR] = HintText::Exclude({ //obscure text Text{"a #spider in the center of the Water Temple# holds", /*french*/"une #Skulltula au centre du Temple de l'Eau# a", /*spanish*/"una #Skulltula en el centro del Templo del Agua# otorga"}, }); - hintTable[WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST] = HintText::Exclude({ + hintTable[RHT_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST] = HintText::Exclude({ //obscure text Text{"a spider protected by #rolling boulders under the lake# hides", /*french*/"une #Skulltula derrière les rochers roulants sous le lac# a", /*spanish*/"una #Skulltula protegida por rocas rodantes# bajo el lago otorga"}, }, {}, @@ -897,23 +897,23 @@ void HintTable_Init_Exclude_Dungeon() { Text{"a spider protected by #rolling boulders in the Water Temple# hides", /*french*/"une #Skulltula derrière les rochers roulants du Temple de l'Eau# a", /*spanish*/"una #Skulltula protegida por rocas rodantes# del Templo del Agua otorga"} ); - hintTable[WATER_TEMPLE_GS_RIVER] = HintText::Exclude({ + hintTable[RHT_WATER_TEMPLE_GS_RIVER] = HintText::Exclude({ //obscure text Text{"a #spider over a river# in the Water Temple holds", /*french*/"une #Skulltula au dessus de la rivière du Temple de l'Eau# a", /*spanish*/"una #Skulltula sobre un río# del Templo del Agua otorga"}, }); - hintTable[WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH] = HintText::Exclude({ + hintTable[RHT_WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH] = HintText::Exclude({ //obscure text Text{"#beyond a pit of lizards# is a spider holding", /*french*/"une #Skulltula près des lézards du Temple de l'Eau# a", /*spanish*/"#más allá de un pozo de reptiles# una Skulltula otorga"}, }); - hintTable[WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY] = HintText::Exclude({ + hintTable[RHT_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY] = HintText::Exclude({ //obscure text Text{"#lizards guard a spider# in the Water Temple with", /*french*/"une #Skulltula dans les couloirs croisés du Temple de l'Eau# a", /*spanish*/"unos #reptiles custodian una Skulltula# del Templo del Agua que otorga"}, }); - hintTable[WATER_TEMPLE_MQ_GS_RIVER] = HintText::Exclude({ + hintTable[RHT_WATER_TEMPLE_MQ_GS_RIVER] = HintText::Exclude({ //obscure text Text{"a #spider over a river# in the Water Temple holds", /*french*/"une #Skulltula au dessus de la rivière du Temple de l'Eau# a", /*spanish*/"una #Skulltula sobre un río# del Templo del Agua otorga"}, }); @@ -921,183 +921,183 @@ void HintTable_Init_Exclude_Dungeon() { /*-------------------------- | SPIRIT TEMPLE | ---------------------------*/ - hintTable[SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST] = HintText::Exclude({ //obscure text Text{"a child conquers a #skull in green fire# in the Spirit Temple to reach", /*french*/"le #crâne au halo vert dans le colosse# cache", /*spanish*/"el joven que #baje el puente# del Templo del Espíritu encontrará"}, }); - hintTable[SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST] = HintText::Exclude({ //obscure text Text{"a child can find a #caged chest# in the Spirit Temple with", /*french*/"le #coffre embarré dans le colosse# contient", /*spanish*/"un joven puede encontrar un #cofre entre rejas# del Templo del Espíritu con"}, }); - hintTable[SPIRIT_TEMPLE_COMPASS_CHEST] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_COMPASS_CHEST] = HintText::Exclude({ //obscure text Text{"#across a pit of sand# in the Spirit Temple lies", /*french*/"le #trou sableux dans le colosse# a", /*spanish*/"tras un #pozo de arena# del Templo del Espíritu yace"}, }); - hintTable[SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST] = HintText::Exclude({ //obscure text Text{"#dodging boulders to collect silver rupees# in the Spirit Temple yields", /*french*/"les #pièces argentées entourées de rochers dans le colosse# révèlent", /*spanish*/"#esquivar rocas y conseguir plateadas rupias# en el Templo del Espíritu conduce a"}, }); - hintTable[SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST] = HintText::Exclude({ //obscure text Text{"a #shadow circling reflected light# in the Spirit Temple guards", /*french*/"l'#ombre près d'un miroir# protège", /*spanish*/"un #círculo de reflectante luz# del Templo del Espíritu guarda"}, }); - hintTable[SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST] = HintText::Exclude({ //obscure text Text{"a #shadow circling reflected light# in the Spirit Temple guards", /*french*/"l'#ombre près d'un miroir# protège", /*spanish*/"un #círculo de reflectante luz# del Templo del Espíritu guarda"}, }); - hintTable[SPIRIT_TEMPLE_MAP_CHEST] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_MAP_CHEST] = HintText::Exclude({ //obscure text Text{"#before a giant statue# in the Spirit Temple lies", /*french*/"#devant la statue# dans le colosse gît", /*spanish*/"#ante una gran estatua# del Templo del Espíritu aguarda"}, }); - hintTable[SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST] = HintText::Exclude({ //obscure text Text{"#lizards in the Spirit Temple# guard", /*french*/"les #lézards dans le colosse# protègent", /*spanish*/"los #reptiles del Templo del Espíritu# guardan"}, }); - hintTable[SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST] = HintText::Exclude({ //obscure text Text{"#lizards in the Spirit Temple# guard", /*french*/"les #lézards dans le colosse# protègent", /*spanish*/"los #reptiles del Templo del Espíritu# guardan"}, }); - hintTable[SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST] = HintText::Exclude({ //obscure text Text{"#torchlight among Beamos# in the Spirit Temple reveals", /*french*/"les #torches autour des Sentinelles# éclairent", /*spanish*/"las #antorchas junto a Beamos# del Templo del Espíritu revelan"}, }); - hintTable[SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST] = HintText::Exclude({ //obscure text Text{"a #statue in the Spirit Temple# holds", /*french*/"la #statue dans le colosse# tient", /*spanish*/"una #estatua del Templo del Espíritu# esconde"}, }); - hintTable[SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST] = HintText::Exclude({ //obscure text Text{"on a #ledge by a statue# in the Spirit Temple rests", /*french*/"#haut perché près de la statue# dans le colosse gît", /*spanish*/"al #borde de una estatua# del Templo del Espíritu yace"}, }); - hintTable[SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST] = HintText::Exclude({ //obscure text Text{"those who #show the light among statues# in the Spirit Temple find", /*french*/"le #soleil près des statues# cache", /*spanish*/"aquellos que #iluminen ante las estatuas# del Templo del Espíritu encontrarán"}, }); - hintTable[SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST] = HintText::Exclude({ //obscure text Text{"the #Eye of Truth in the Spirit Temple# reveals", /*french*/"le #trésor invisible près du Hache-Viande# contient", /*spanish*/"el #Ojo de la Verdad# en el Templo del Espíritu revela"}, }); - hintTable[SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST] = HintText::Exclude({ //obscure text Text{"the #Eye of Truth in the Spirit Temple# reveals", /*french*/"le #trésor invisible près du Hache-Viande# contient", /*spanish*/"el #Ojo de la Verdad# en el Templo del Espíritu revela"}, }); - hintTable[SPIRIT_TEMPLE_BOSS_KEY_CHEST] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_BOSS_KEY_CHEST] = HintText::Exclude({ //obscure text Text{"a #chest engulfed in flame# in the Spirit Temple holds", /*french*/"le #coffre enflammé dans le colosse# contient", /*spanish*/"un #cofre rodeado de llamas# del Templo del Espíritu contiene"}, }); - hintTable[SPIRIT_TEMPLE_TOPMOST_CHEST] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_TOPMOST_CHEST] = HintText::Exclude({ //obscure text Text{"those who #show the light above the Colossus# find", /*french*/"le #soleil au sommet du colosse# révèle", /*spanish*/"aquellos que #iluminen en lo alto del Coloso# encontrarán"}, }); - hintTable[SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST] = HintText::Exclude({ //obscure text Text{"#lying unguarded# in the Spirit Temple is", /*french*/"dans #l'entrée du colosse# se trouve", /*spanish*/"en la #entrada del Templo del Espíritu# yace"}, }); - hintTable[SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST] = HintText::Exclude({ //obscure text Text{"a #switch in a pillar# within the Spirit Temple drops", /*french*/"l'#interrupteur dans un pilier# du colosse cache", /*spanish*/"el #interruptor de un pilar# del Templo del Espíritu revela"}, }); - hintTable[SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST] = HintText::Exclude({ //obscure text Text{"#collecting rupees through a water jet# reveals", /*french*/"les #pièces argentées dans le jet d'eau# du colosse révèlent", /*spanish*/"#hacerte con rupias tras un géiser# revela"}, }); - hintTable[SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST] = HintText::Exclude({ //obscure text Text{"an #eye blinded by stone# within the Spirit Temple conceals", /*french*/"#l'oeil derrière le rocher# dans le colosse voit", /*spanish*/"#cegar a un ojo# del Templo del Espíritu revela"}, }); - hintTable[SPIRIT_TEMPLE_MQ_MAP_CHEST] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_MQ_MAP_CHEST] = HintText::Exclude({ //obscure text Text{"surrounded by #fire and wrappings# lies", /*french*/"près des #pierres tombales dans le colosse# gît", /*spanish*/"rodeado de #fuego y vendas# yace"}, }); - hintTable[SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST] = HintText::Exclude({ //obscure text Text{"a child defeats a #gauntlet of monsters# within the Spirit Temple to find", /*french*/"l'enfant qui vainc #plusieurs monstres# dans le colosse trouvera", /*spanish*/"el joven que derrote #unos monstruos# del Templo del Espíritu encontrará"}, }); - hintTable[SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST] = HintText::Exclude({ //obscure text Text{"#explosive sunlight# within the Spirit Temple uncovers", /*french*/"le #rayon de lumière explosif dans le colosse# révèle", /*spanish*/"una #explosiva luz solar# del Templo del Espíritu revela"}, }); - hintTable[SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST] = HintText::Exclude({ //obscure text Text{"#trapped by falling enemies# within the Spirit Temple is", /*french*/"des #ennemis tombants# dans le colosse protègent", /*spanish*/"#rodeado de enemigos del cielo# del Templo del Espíritu yace"}, }); - hintTable[SPIRIT_TEMPLE_MQ_COMPASS_CHEST] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_MQ_COMPASS_CHEST] = HintText::Exclude({ //obscure text Text{"#blinding the colossus# unveils", /*french*/"#l'oeil dans le colosse# voit", /*spanish*/"#cegar al coloso# revela"}, }); - hintTable[SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST] = HintText::Exclude({ //obscure text Text{"a #royal melody awakens the colossus# to reveal", /*french*/"la #mélodie royale éveille le colosse# et révèle", /*spanish*/"la #melodía real que despierte al coloso# revelará"}, }); - hintTable[SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST] = HintText::Exclude({ //obscure text Text{"the #Eye of Truth# finds the colossus's hidden", /*french*/"#l'oeil de vérité# verra dans le colosse", /*spanish*/"el #Ojo de la Verdad# en el Templo del Espíritu encontrará"}, }); - hintTable[SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST] = HintText::Exclude({ //obscure text Text{"#the old hide what the young find# to reveal", /*french*/"l'#oeil dans le trou du bloc argent# dans le colosse voit", /*spanish*/"el #adulto esconde lo que el joven anhela#, revelando"}, }); - hintTable[SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST] = HintText::Exclude({ //obscure text Text{"#sunlight in a maze of fire# hides", /*french*/"#la lumière dans le labyrinthe de feu# du colosse révèle", /*spanish*/"la #luz solar de un ígneo laberinto# esconde"}, }); - hintTable[SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST] = HintText::Exclude({ //obscure text Text{"#across a pit of sand# in the Spirit Temple lies", /*french*/"le #trou sableux# dans le colosse a", /*spanish*/"#a través del pozo de arena# del Templo del Espíritu yace"}, }); - hintTable[SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST] = HintText::Exclude({ //obscure text Text{"where #temporal stone blocks the path# within the Spirit Temple lies", /*french*/"les #pierres temporelles# dans le colosse cachent", /*spanish*/"donde los #bloques temporales bloquean# en el Templo del Espíritu yace"}, }); - hintTable[SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST] = HintText::Exclude({ //obscure text Text{"a #chest of double purpose# holds", /*french*/"le #coffre à usage double# du colosse contient", /*spanish*/"un #cofre de doble uso# contiene"}, }); - hintTable[SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST] = HintText::Exclude({ //obscure text Text{"a #temporal stone blocks the light# leading to", /*french*/"la #pierre temporelle# le colosse fait ombre sur", /*spanish*/"un #bloque temporal bloquea la luz# que conduce a"}, }); - hintTable[SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST] = HintText::Exclude({ //obscure text Text{"those who #show the light above the Colossus# find", /*french*/"le trésor invisible #au sommet du colosse# contient", /*spanish*/"aquellos que #revelen la luz sobre el Coloso# encontrarán"}, }); - hintTable[SPIRIT_TEMPLE_TWINROVA_HEART] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_TWINROVA_HEART] = HintText::Exclude({ //obscure text Text{"the #Sorceress Sisters# hold", /*french*/"#les sorcières jumelles# possède", /*spanish*/"las #hermanas hechiceras# portan"}, }, {}, @@ -1105,48 +1105,48 @@ void HintTable_Init_Exclude_Dungeon() { Text{"#Twinrova# holds", /*french*/"#Twinrova# possède", /*spanish*/"#Birova# porta"} ); - hintTable[SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM] = HintText::Exclude({ //obscure text Text{"a spider in the #hall of a knight# guards", /*french*/"une #Skulltula au dessus d'un escalier du Temple de l'Esprit# a", /*spanish*/"una #Skulltula en el salón de un guerrero# otorga"}, }); - hintTable[SPIRIT_TEMPLE_GS_BOULDER_ROOM] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_GS_BOULDER_ROOM] = HintText::Exclude({ //obscure text Text{"a #spider behind a temporal stone# in the Spirit Temple yields", /*french*/"une #Skulltula derrière une pierre temporelle du Temple de l'Esprit# a", /*spanish*/"una #Skulltula tras un bloque temporal# del Templo del Espíritu otorga"}, }); - hintTable[SPIRIT_TEMPLE_GS_LOBBY] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_GS_LOBBY] = HintText::Exclude({ //obscure text Text{"a #spider beside a statue# holds", /*french*/"une #Skulltula dans la grande salle du Temple de l'Esprit# a", /*spanish*/"una #Skulltula junto a una estatua# del Templo del Espíritu otorga"}, }); - hintTable[SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM] = HintText::Exclude({ //obscure text Text{"a #spider at the top of a deep shaft# in the Spirit Temple holds", /*french*/"une #Skulltula près d'un mur d'escalade du Temple de l'Esprit# a", /*spanish*/"una #Skulltula en lo alto de un gran hueco# del Templo del Espíritu otorga"}, }); - hintTable[SPIRIT_TEMPLE_GS_METAL_FENCE] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_GS_METAL_FENCE] = HintText::Exclude({ //obscure text Text{"a child defeats a #spider among bats# in the Spirit Temple to gain", /*french*/"une #Skulltula sur le grillage du Temple de l'Esprit# a", /*spanish*/"el joven que derrote la #Skulltula entre murciélagos# del Templo del Espíritu hallará"}, }); - hintTable[SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM] = HintText::Exclude({ //obscure text Text{"#above a pit of sand# in the Spirit Temple hides", /*french*/"une #Skulltula au dessus du trou sableux du Temple de l'Esprit# a", /*spanish*/"una #Skulltula sobre un pozo de arena# del Templo del Espíritu otorga"}, }); - hintTable[SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST] = HintText::Exclude({ //obscure text Text{"a spider in the #hall of a knight# guards", /*french*/"une #Skulltula dans la salle aux neuf trônes du Temple de l'Esprit# a", /*spanish*/"una #Skulltula en el salón de un guerrero# otorga"}, }); - hintTable[SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH] = HintText::Exclude({ //obscure text Text{"a spider in the #hall of a knight# guards", /*french*/"une #Skulltula dans la salle aux neuf trônes du Temple de l'Esprit# a", /*spanish*/"una #Skulltula en el salón de un guerrero# otorga"}, }); - hintTable[SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM] = HintText::Exclude({ + hintTable[RHT_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM] = HintText::Exclude({ //obscure text 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"}, }); @@ -1154,12 +1154,12 @@ void HintTable_Init_Exclude_Dungeon() { /*-------------------------- | SHADOW TEMPLE | ---------------------------*/ - hintTable[SHADOW_TEMPLE_MAP_CHEST] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText::Exclude({ //obscure text Text{"the #Eye of Truth# pierces a hall of faces to reveal", /*french*/"l'#oeil de vérité# voit dans les couloirs du Temple de l'Ombre", /*spanish*/"el #Ojo de la Verdad# descubrirá un pasillo de facetas con"}, }); - hintTable[SHADOW_TEMPLE_HOVER_BOOTS_CHEST] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_HOVER_BOOTS_CHEST] = HintText::Exclude({ //obscure text Text{"a #nether dweller in the Shadow Temple# holds", /*french*/"le #spectre du Temple de l'Ombre# a", /*spanish*/"un #temido morador del Templo de las Sombras# guarda"}, }, {}, @@ -1167,173 +1167,173 @@ void HintTable_Init_Exclude_Dungeon() { Text{"#Dead Hand in the Shadow Temple# holds", /*french*/"le #Poigneur dans le Temple de l'Ombre# cache", /*spanish*/"la #Mano Muerta del Templo de las Sombras# guarda"} ); - hintTable[SHADOW_TEMPLE_COMPASS_CHEST] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_COMPASS_CHEST] = HintText::Exclude({ //obscure text Text{"#mummies revealed by the Eye of Truth# guard", /*french*/"les #Gibdos dans les couloirs# du Temple de l'Ombre protègent", /*spanish*/"las #momias reveladas por el Ojo de la Verdad# guardan"}, }); - hintTable[SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST] = HintText::Exclude({ //obscure text Text{"#spinning scythes# protect", /*french*/"les #faucheurs danseurs# du Temple de l'Ombre protègent", /*spanish*/"las #giratorias guadañas# protegen"}, }); - hintTable[SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST] = HintText::Exclude({ //obscure text Text{"#invisible blades# guard", /*french*/"les #faucheurs invisibles# du Temple de l'Ombre protègent", /*spanish*/"las #hojas invisibles# guardan"}, }); - hintTable[SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST] = HintText::Exclude({ //obscure text Text{"#invisible blades# guard", /*french*/"les #faucheurs invisibles# du Temple de l'Ombre protègent", /*spanish*/"las #hojas invisibles# guardan"}, }); - hintTable[SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST] = HintText::Exclude({ //obscure text Text{"#falling spikes# block the path to", /*french*/"la #pluie de clous# surplombe", /*spanish*/"los #pinchos de un techo# conducen a"}, }); - hintTable[SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST] = HintText::Exclude({ //obscure text Text{"#falling spikes# block the path to", /*french*/"la #pluie de clous# surplombe", /*spanish*/"los #pinchos de un techo# conducen a"}, }); - hintTable[SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST] = HintText::Exclude({ //obscure text Text{"#falling spikes# block the path to", /*french*/"la #pluie de clous# surplombe", /*spanish*/"los #pinchos de un techo# conducen a"}, }); - hintTable[SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST] = HintText::Exclude({ //obscure text Text{"the #dead roam among invisible spikes# guarding", /*french*/"#parmi les clous invisibles# du Temple de l'Ombre se cache", /*spanish*/"los #muertos que vagan por pinchos invisibles# protegen"}, }); - hintTable[SHADOW_TEMPLE_WIND_HINT_CHEST] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_WIND_HINT_CHEST] = HintText::Exclude({ //obscure text Text{"an #invisible chest guarded by the dead# holds", /*french*/"le #trésor invisible du cul-de-sac# du Temple de l'Ombre contient", /*spanish*/"un #cofre invisible custodiado por los del más allá# contiene"}, }); - hintTable[SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST] = HintText::Exclude({ //obscure text Text{"#mummies guarding a ferry# hide", /*french*/"les #Gibdos qui bloquent le traversier# cachent", /*spanish*/"las #momias que protegen un navío# esconden"}, }); - hintTable[SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST] = HintText::Exclude({ //obscure text Text{"#mummies guarding a ferry# hide", /*french*/"les #Gibdos qui bloquent le traversier# cachent", /*spanish*/"las #momias que protegen un navío# esconden"}, }); - hintTable[SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST] = HintText::Exclude({ //obscure text Text{"#walls consumed by a ball of fire# reveal", /*french*/"le #piège de bois# du Temple de l'Ombre cache", /*spanish*/"las #paredes consumidas por una esfera ígnea# revelan"}, }); - hintTable[SHADOW_TEMPLE_BOSS_KEY_CHEST] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_BOSS_KEY_CHEST] = HintText::Exclude({ //obscure text Text{"#walls consumed by a ball of fire# reveal", /*french*/"le #piège de bois# du Temple de l'Ombre cache", /*spanish*/"las #paredes consumidas por una esfera ígnea# revelan"}, }); - hintTable[SHADOW_TEMPLE_FREESTANDING_KEY] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_FREESTANDING_KEY] = HintText::Exclude({ //obscure text Text{"#inside a burning skull# lies", /*french*/"#dans un crâne enflammé# gît", /*spanish*/"en el #interior de una calavera en llamas# aguarda"}, }); - hintTable[SHADOW_TEMPLE_MQ_COMPASS_CHEST] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_MQ_COMPASS_CHEST] = HintText::Exclude({ //obscure text Text{"the #Eye of Truth# pierces a hall of faces to reveal", /*french*/"l'#oeil de vérité# voit dans les couloirs du Temple de l'Ombre", /*spanish*/"el #Ojo de la Verdad# descubre un pasillo de facetas con"}, }); - hintTable[SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST] = HintText::Exclude({ //obscure text Text{"#Dead Hand in the Shadow Temple# holds", /*french*/"le #Poigneur dans le Temple de l'Ombre# cache", /*spanish*/"la #Mano Muerta del Templo de las Sombras# guarda"}, }); - hintTable[SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST] = HintText::Exclude({ //obscure text Text{"#mummies revealed by the Eye of Truth# guard", /*french*/"les #Gibdos dans les couloirs# du Temple de l'Ombre protègent", /*spanish*/"las #momias reveladas por el Ojo de la Verdad# guardan"}, }); - hintTable[SHADOW_TEMPLE_MQ_MAP_CHEST] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_MQ_MAP_CHEST] = HintText::Exclude({ //obscure text Text{"#spinning scythes# protect", /*french*/"les #faucheurs danseurs# du Temple de l'Ombre protègent", /*spanish*/"las #giratorias guadañas# protegen"}, }); - hintTable[SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST] = HintText::Exclude({ //obscure text Text{"#collecting rupees in a vast cavern# with the Shadow Temple unveils", /*french*/"les #pièces argentées dans le Temple de l'Ombre# révèlent", /*spanish*/"hacerte con las #rupias en una gran caverna# del Templo de las Sombras revela"}, }); - hintTable[SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST] = HintText::Exclude({ //obscure text Text{"#falling spikes# block the path to", /*french*/"la #pluie de clous# surplombe", /*spanish*/"los #pinchos de un techo# conducen a"}, }); - hintTable[SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST] = HintText::Exclude({ //obscure text Text{"#falling spikes# block the path to", /*french*/"la #pluie de clous# surplombe", /*spanish*/"los #pinchos de un techo# conducen a"}, }); - hintTable[SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST] = HintText::Exclude({ //obscure text Text{"#falling spikes# block the path to", /*french*/"la #pluie de clous# surplombe", /*spanish*/"los #pinchos de un techo# conducen a"}, }); - hintTable[SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST] = HintText::Exclude({ //obscure text Text{"the #dead roam among invisible spikes# guarding", /*french*/"#parmi les clous invisibles# du Temple de l'Ombre se cache", /*spanish*/"los #muertos que vagan por pinchos invisibles# protegen"}, }); - hintTable[SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST] = HintText::Exclude({ //obscure text Text{"#walls consumed by a ball of fire# reveal", /*french*/"le #piège de bois# du Temple de l'Ombre cache", /*spanish*/"las #paredes consumidas por una esfera ígnea# revelan"}, }); - hintTable[SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST] = HintText::Exclude({ //obscure text Text{"#walls consumed by a ball of fire# reveal", /*french*/"le #piège de bois# du Temple de l'Ombre cache", /*spanish*/"las #paredes consumidas por una esfera ígnea# revelan"}, }); - hintTable[SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST] = HintText::Exclude({ //obscure text Text{"near an #empty pedestal# within the Shadow Temple lies", /*french*/"#près d'un pédestal vide du Temple de l'Ombre# gît", /*spanish*/"cerca de un #vacío pedestal# del Templo de las Sombras yace"}, }); - hintTable[SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST] = HintText::Exclude({ //obscure text Text{"#invisible blades# guard", /*french*/"les #faucheurs invisibles# du Temple de l'Ombre protègent", /*spanish*/"unas #hojas invisibles# guardan"}, }); - hintTable[SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST] = HintText::Exclude({ //obscure text Text{"#invisible blades# guard", /*french*/"les #faucheurs invisibles# du Temple de l'Ombre protègent", /*spanish*/"unas #hojas invisibles# guardan"}, }); - hintTable[SHADOW_TEMPLE_MQ_WIND_HINT_CHEST] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_MQ_WIND_HINT_CHEST] = HintText::Exclude({ //obscure text Text{"an #invisible chest guarded by the dead# holds", /*french*/"le #trésor invisible du cul-de-sac# du Temple de l'Ombre contient", /*spanish*/"un #cofre invisible custodiado por los del más allá# contiene"}, }); - hintTable[SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST] = HintText::Exclude({ //obscure text Text{"#mummies guarding a ferry# hide", /*french*/"les #Gibdos qui bloquent le traversier# cachent", /*spanish*/"las #momias que protegen un navío# esconden"}, }); - hintTable[SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST] = HintText::Exclude({ //obscure text Text{"#mummies guarding a ferry# hide", /*french*/"les #Gibdos qui bloquent le traversier# cachent", /*spanish*/"las #momias que protegen un navío# esconden"}, }); - hintTable[SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST] = HintText::Exclude({ //obscure text Text{"#caged near a ship# lies", /*french*/"#dans une cage près du traversier# gît", /*spanish*/"#entre rejas al lado de un navío# yace"}, }); - hintTable[SHADOW_TEMPLE_MQ_FREESTANDING_KEY] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_MQ_FREESTANDING_KEY] = HintText::Exclude({ //obscure text Text{"#behind three burning skulls# lies", /*french*/"#derrière trois crânes enflammés# gît", /*spanish*/"tras #tres ardientes calaveras# yace"}, }); - hintTable[SHADOW_TEMPLE_BONGO_BONGO_HEART] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_BONGO_BONGO_HEART] = HintText::Exclude({ //obscure text Text{"the #Phantom Shadow Beast# holds", /*french*/"le #monstre de l'ombre# possède", /*spanish*/"la #alimaña oscura espectral# porta"}, }, {}, @@ -1341,53 +1341,53 @@ void HintTable_Init_Exclude_Dungeon() { Text{"#Bongo Bongo# holds", /*french*/"#Bongo Bongo# possède", /*spanish*/"#Bongo Bongo# porta"} ); - hintTable[SHADOW_TEMPLE_GS_SINGLE_GIANT_POT] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT] = HintText::Exclude({ //obscure text Text{"#beyond a burning skull# lies a spider with", /*french*/"une #Skulltula derrière un crâne enflammé du Temple de l'Ombre# a", /*spanish*/"#tras una ardiente calavera# yace una Skulltula que otorga"}, }); - hintTable[SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM] = HintText::Exclude({ //obscure text Text{"a #spider beyond falling spikes# holds", /*french*/"une #Skulltula au delà de la pluie de clous du Temple de l'Ombre# a", /*spanish*/"una #Skulltula tras los pinchos del techo# otorga"}, }); - hintTable[SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT] = HintText::Exclude({ //obscure text Text{"#beyond three burning skulls# lies a spider with", /*french*/"une #Skulltula derrière trois crânes enflammés du Temple de l'Ombre# a", /*spanish*/"#tras tres ardientes calaveras# yace una Skulltula que otorga"}, }); - hintTable[SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM] = HintText::Exclude({ //obscure text Text{"a spider guarded by #invisible blades# holds", /*french*/"une #Skulltula protégée par les faucheurs invisibles du Temple de l'Ombre# a", /*spanish*/"una #Skulltula custodiada por hojas invisibles# otorga"}, }); - hintTable[SHADOW_TEMPLE_GS_NEAR_SHIP] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_GS_NEAR_SHIP] = HintText::Exclude({ //obscure text Text{"a spider near a #docked ship# hoards", /*french*/"une #Skulltula près du traversier du Temple de l'Ombre# a", /*spanish*/"una #Skulltula cercana a un navío# otorga"}, }); - hintTable[SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM] = HintText::Exclude({ //obscure text Text{"a #spider beyond falling spikes# holds", /*french*/"une #Skulltula au delà de la pluie de clous du Temple de l'Ombre# a", /*spanish*/"una #Skulltula tras los pinchos del techo# otorga"}, }); - hintTable[SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM] = HintText::Exclude({ //obscure text Text{"a #spider amidst roaring winds# in the Shadow Temple holds", /*french*/"une #Skulltula près des vents du Temple de l'Ombre# a", /*spanish*/"una #Skulltula entre ventarrones# del Templo de las Sombras otorga"}, }); - hintTable[SHADOW_TEMPLE_MQ_GS_AFTER_WIND] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_MQ_GS_AFTER_WIND] = HintText::Exclude({ //obscure text Text{"a #spider beneath gruesome debris# in the Shadow Temple hides", /*french*/"une #Skulltula sous des débris du Temple de l'Ombre# a", /*spanish*/"una #Skulltula bajo unos horripilantes escombros# del Templo de las Sombras otorga"}, }); - hintTable[SHADOW_TEMPLE_MQ_GS_AFTER_SHIP] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP] = HintText::Exclude({ //obscure text Text{"a #fallen statue# reveals a spider with", /*french*/"une #Skulltula près de la statue écroulée du Temple de l'Ombre# a", /*spanish*/"una #estatua caída# revelará una Skulltula que otorgue"}, }); - hintTable[SHADOW_TEMPLE_MQ_GS_NEAR_BOSS] = HintText::Exclude({ + hintTable[RHT_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS] = HintText::Exclude({ //obscure text 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"}, }); @@ -1395,119 +1395,119 @@ void HintTable_Init_Exclude_Dungeon() { /*-------------------------- | BOTTOM OF THE WELL | ---------------------------*/ - hintTable[BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST] = HintText::Exclude({ + hintTable[RHT_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST] = HintText::Exclude({ //obscure text Text{"the #Eye of Truth in the well# reveals", /*french*/"l'#oeil de vérité dans le Puits# révèle", /*spanish*/"el #Ojo de la Verdad en el pozo# revela"}, }); - hintTable[BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST] = HintText::Exclude({ + hintTable[RHT_BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST] = HintText::Exclude({ //obscure text Text{"#gruesome debris# in the well hides", /*french*/"des #débris dans le Puits# cachent", /*spanish*/"unos #horripilantes escombros# del pozo esconden"}, }); - hintTable[BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST] = HintText::Exclude({ + hintTable[RHT_BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST] = HintText::Exclude({ //obscure text Text{"the #Eye of Truth in the well# reveals", /*french*/"l'#oeil de vérité dans le Puits# révèle", /*spanish*/"el #Ojo de la Verdad en el pozo# revela"}, }); - hintTable[BOTTOM_OF_THE_WELL_COMPASS_CHEST] = HintText::Exclude({ + hintTable[RHT_BOTTOM_OF_THE_WELL_COMPASS_CHEST] = HintText::Exclude({ //obscure text Text{"a #hidden entrance to a cage# in the well leads to", /*french*/"dans un #chemin caché dans le Puits# gît", /*spanish*/"la #entrada oculta de una celda# del pozo conduce a"}, }); - hintTable[BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST] = HintText::Exclude({ + hintTable[RHT_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST] = HintText::Exclude({ //obscure text Text{"a #spider guarding a cage# in the well protects", /*french*/"l'#araignée dans la cage du Puits# protège", /*spanish*/"una #araña protegiendo una celda# del pozo guarda"}, }); - hintTable[BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST] = HintText::Exclude({ + hintTable[RHT_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST] = HintText::Exclude({ //obscure text Text{"#gruesome debris# in the well hides", /*french*/"des #débris dans le Puits# cachent", /*spanish*/"unos #horripilantes escombros# del pozo esconden"}, }); - hintTable[BOTTOM_OF_THE_WELL_INVISIBLE_CHEST] = HintText::Exclude({ + hintTable[RHT_BOTTOM_OF_THE_WELL_INVISIBLE_CHEST] = HintText::Exclude({ //obscure text Text{"#Dead Hand's invisible secret# is", /*french*/"le #trésor invisible du Poigneur# est", /*spanish*/"el #secreto invisible de la Mano Muerta# esconde"}, }); - hintTable[BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST] = HintText::Exclude({ + hintTable[RHT_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST] = HintText::Exclude({ //obscure text Text{"a #royal melody in the well# uncovers", /*french*/"la #mélodie royale révèle dans le Puits#", /*spanish*/"una #melodía real en el pozo# revela"}, }); - hintTable[BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST] = HintText::Exclude({ + hintTable[RHT_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST] = HintText::Exclude({ //obscure text Text{"a #royal melody in the well# uncovers", /*french*/"la #mélodie royale révèle dans le Puits#", /*spanish*/"una #melodía real en el pozo# revela"}, }); - hintTable[BOTTOM_OF_THE_WELL_MAP_CHEST] = HintText::Exclude({ + hintTable[RHT_BOTTOM_OF_THE_WELL_MAP_CHEST] = HintText::Exclude({ //obscure text Text{"in the #depths of the well# lies", /*french*/"#dans le coeur du Puits# gît", /*spanish*/"en las #profundidades del pozo# yace"}, }); - hintTable[BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST] = HintText::Exclude({ + hintTable[RHT_BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST] = HintText::Exclude({ //obscure text Text{"#perilous pits# in the well guard the path to", /*french*/"#trois trous# dans le Puits protègent", /*spanish*/"#peligrosos fosos# del pozo conducen a"}, }); - hintTable[BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST] = HintText::Exclude({ + hintTable[RHT_BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST] = HintText::Exclude({ //obscure text Text{"#locked in a cage# in the well lies", /*french*/"#dans une cage# du Puits gît", /*spanish*/"#entre rejas# en el pozo yace"}, }); - hintTable[BOTTOM_OF_THE_WELL_FREESTANDING_KEY] = HintText::Exclude({ + hintTable[RHT_BOTTOM_OF_THE_WELL_FREESTANDING_KEY] = HintText::Exclude({ //obscure text Text{"#inside a coffin# hides", /*french*/"dans #un cercueil# gît", /*spanish*/"en el #interior de un ataúd# yace"}, }); - hintTable[BOTTOM_OF_THE_WELL_MQ_MAP_CHEST] = HintText::Exclude({ + hintTable[RHT_BOTTOM_OF_THE_WELL_MQ_MAP_CHEST] = HintText::Exclude({ //obscure text Text{"a #royal melody in the well# uncovers", /*french*/"la #mélodie royale révèle dans le Puits#", /*spanish*/"una #melodía real en el pozo# revela"}, }); - hintTable[BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST] = HintText::Exclude({ + hintTable[RHT_BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST] = HintText::Exclude({ //obscure text Text{"an #army of the dead# in the well guards", /*french*/"l'#armée des morts# dans le Puits protège", /*spanish*/"un #ejército del más allá# del pozo guarda"}, }); - hintTable[BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY] = HintText::Exclude({ + hintTable[RHT_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY] = HintText::Exclude({ //obscure text Text{"#Dead Hand's explosive secret# is", /*french*/"le #secret explosif du Poigneur# est", /*spanish*/"el #explosivo secreto de la Mano Muerta# esconde"}, }); - hintTable[BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY] = HintText::Exclude({ + hintTable[RHT_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY] = HintText::Exclude({ //obscure text Text{"an #invisible path in the well# leads to", /*french*/"dans un #chemin caché dans le Puits# gît", /*spanish*/"un #camino invisible del pozo# conduce a"}, }); - hintTable[BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE] = HintText::Exclude({ + hintTable[RHT_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE] = HintText::Exclude({ //obscure text Text{"a #spider locked in a cage# in the well holds", /*french*/"une #Skulltula dans une cage au fonds du Puits# a", /*spanish*/"una #Skulltula enjaulada# del pozo otorga"}, }); - hintTable[BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM] = HintText::Exclude({ + hintTable[RHT_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM] = HintText::Exclude({ //obscure text Text{"an #invisible path in the well# leads to", /*french*/"une #Skulltula dans le chemin invisible au fonds du Puits# a", /*spanish*/"un #camino invisible del pozo# conduce a una Skulltula que otorga"}, }); - hintTable[BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM] = HintText::Exclude({ + hintTable[RHT_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM] = HintText::Exclude({ //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[BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT] = HintText::Exclude({ + hintTable[RHT_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT] = HintText::Exclude({ //obscure text Text{"a #gauntlet of invisible spiders# protects", /*french*/"une #Skulltula protégée par les araignées invisibles au fonds du Puits# a", /*spanish*/"unas #arañas invisibles# custodian una Skulltula que otorga"}, }); - hintTable[BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM] = HintText::Exclude({ + hintTable[RHT_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM] = HintText::Exclude({ //obscure text Text{"a #spider crawling near the dead# in the well holds", /*french*/"une #Skulltula près des cercueils au fonds du Puits# a", /*spanish*/"una #Skulltula junto a los muertos# del pozo otorga"}, }); - hintTable[BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM] = HintText::Exclude({ + hintTable[RHT_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM] = HintText::Exclude({ //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"}, }); @@ -1515,74 +1515,74 @@ void HintTable_Init_Exclude_Dungeon() { /*-------------------------- | ICE CAVERN | ---------------------------*/ - hintTable[ICE_CAVERN_MAP_CHEST] = HintText::Exclude({ + hintTable[RHT_ICE_CAVERN_MAP_CHEST] = HintText::Exclude({ //obscure text Text{"#winds of ice# surround", /*french*/"#figé dans la glace rouge# gît", /*spanish*/"#heladas borrascas# rodean"}, }); - hintTable[ICE_CAVERN_COMPASS_CHEST] = HintText::Exclude({ + hintTable[RHT_ICE_CAVERN_COMPASS_CHEST] = HintText::Exclude({ //obscure text Text{"a #wall of ice# protects", /*french*/"#un mur de glace rouge# cache", /*spanish*/"una #gélida pared# protege"}, }); - hintTable[ICE_CAVERN_IRON_BOOTS_CHEST] = HintText::Exclude({ + hintTable[RHT_ICE_CAVERN_IRON_BOOTS_CHEST] = HintText::Exclude({ //obscure text Text{"a #monster in a frozen cavern# guards", /*french*/"le #monstre de la caverne de glace# protège", /*spanish*/"un #monstruo de una helada caverna# guarda"}, }); - hintTable[ICE_CAVERN_FREESTANDING_POH] = HintText::Exclude({ + hintTable[RHT_ICE_CAVERN_FREESTANDING_POH] = HintText::Exclude({ //obscure text Text{"a #wall of ice# protects", /*french*/"un #mur de glace rouge# cache", /*spanish*/"una #gélida pared# protege"}, }); - hintTable[ICE_CAVERN_MQ_IRON_BOOTS_CHEST] = HintText::Exclude({ + hintTable[RHT_ICE_CAVERN_MQ_IRON_BOOTS_CHEST] = HintText::Exclude({ //obscure text Text{"a #monster in a frozen cavern# guards", /*french*/"le #monstre de la caverne de glace# protège", /*spanish*/"un #monstruo de una helada caverna# guarda"}, }); - hintTable[ICE_CAVERN_MQ_COMPASS_CHEST] = HintText::Exclude({ + hintTable[RHT_ICE_CAVERN_MQ_COMPASS_CHEST] = HintText::Exclude({ //obscure text Text{"#winds of ice# surround", /*french*/"#entouré de vent glacial# gît", /*spanish*/"#heladas borrascas# rodean"}, }); - hintTable[ICE_CAVERN_MQ_MAP_CHEST] = HintText::Exclude({ + hintTable[RHT_ICE_CAVERN_MQ_MAP_CHEST] = HintText::Exclude({ //obscure text Text{"a #wall of ice# protects", /*french*/"#un mur de glace rouge# cache", /*spanish*/"una #gélida pared# protege"}, }); - hintTable[ICE_CAVERN_MQ_FREESTANDING_POH] = HintText::Exclude({ + hintTable[RHT_ICE_CAVERN_MQ_FREESTANDING_POH] = HintText::Exclude({ //obscure text Text{"#winds of ice# surround", /*french*/"#entouré de vent glacial# gît", /*spanish*/"#heladas borrascas# rodean"}, }); - hintTable[ICE_CAVERN_GS_PUSH_BLOCK_ROOM] = HintText::Exclude({ + hintTable[RHT_ICE_CAVERN_GS_PUSH_BLOCK_ROOM] = HintText::Exclude({ //obscure text Text{"a #spider above icy pits# holds", /*french*/"une #Skulltula au dessus d'un goufre glacial# a", /*spanish*/"una #Skulltula sobre gélidos vacíos# otorga"}, }); - hintTable[ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM] = HintText::Exclude({ + hintTable[RHT_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM] = HintText::Exclude({ //obscure text Text{"#spinning ice# guards a spider holding", /*french*/"une #Skulltula près de deux lames de glace# a", /*spanish*/"unos #témpanos giratorios# custodian una Skulltula que otorga"}, }); - hintTable[ICE_CAVERN_GS_HEART_PIECE_ROOM] = HintText::Exclude({ + hintTable[RHT_ICE_CAVERN_GS_HEART_PIECE_ROOM] = HintText::Exclude({ //obscure text Text{"a #spider behind a wall of ice# hides", /*french*/"une #Skulltula derrière un mur de glace# a", /*spanish*/"una #Skulltula tras una gélida pared# otorga"}, }); - hintTable[ICE_CAVERN_MQ_GS_SCARECROW] = HintText::Exclude({ + hintTable[RHT_ICE_CAVERN_MQ_GS_SCARECROW] = HintText::Exclude({ //obscure text Text{"a #spider above icy pits# holds", /*french*/"une #Skulltula au dessus d'un goufre glacial# a", /*spanish*/"una #Skulltula sobre gélidos vacíos# otorga"}, }); - hintTable[ICE_CAVERN_MQ_GS_ICE_BLOCK] = HintText::Exclude({ + hintTable[RHT_ICE_CAVERN_MQ_GS_ICE_BLOCK] = HintText::Exclude({ //obscure text Text{"a #web of ice# surrounds a spider with", /*french*/"une #Skulltula protégée d'une toile glacée# a", /*spanish*/"una #gélida red# rodea a una Skulltula que otorga"}, }); - hintTable[ICE_CAVERN_MQ_GS_RED_ICE] = HintText::Exclude({ + hintTable[RHT_ICE_CAVERN_MQ_GS_RED_ICE] = HintText::Exclude({ //obscure text 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"}, }); @@ -1590,178 +1590,178 @@ void HintTable_Init_Exclude_Dungeon() { /*-------------------------- | GERUDO TRAINING GROUNDS | ---------------------------*/ - hintTable[GERUDO_TRAINING_GROUNDS_LOBBY_LEFT_CHEST] = HintText::Exclude({ + hintTable[RHT_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST] = HintText::Exclude({ //obscure text Text{"a #blinded eye in the Gerudo Training Grounds# drops", /*french*/"l'#Oeil dans le Gymnase Gerudo# voit", /*spanish*/"#cegar un ojo en el Centro de Instrucción Gerudo# revela"}, }); - hintTable[GERUDO_TRAINING_GROUNDS_LOBBY_RIGHT_CHEST] = HintText::Exclude({ + hintTable[RHT_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST] = HintText::Exclude({ //obscure text Text{"a #blinded eye in the Gerudo Training Grounds# drops", /*french*/"l'#Oeil dans le Gymnase Gerudo# voit", /*spanish*/"#cegar un ojo en el Centro de Instrucción Gerudo# revela"}, }); - hintTable[GERUDO_TRAINING_GROUNDS_STALFOS_CHEST] = HintText::Exclude({ + hintTable[RHT_GERUDO_TRAINING_GROUND_STALFOS_CHEST] = HintText::Exclude({ //obscure text Text{"#soldiers walking on shifting sands# in the Gerudo Training Grounds guard", /*french*/"les #squelettes# du Gymnase Gerudo protègent", /*spanish*/"#soldados en resbaladizas arenas# del Centro de Instrucción Gerudo protegen"}, }); - hintTable[GERUDO_TRAINING_GROUNDS_BEAMOS_CHEST] = HintText::Exclude({ + hintTable[RHT_GERUDO_TRAINING_GROUND_BEAMOS_CHEST] = HintText::Exclude({ //obscure text Text{"#reptilian warriors# in the Gerudo Training Grounds protect", /*french*/"les #lézards# dans le Gymnase Gerudo protègent", /*spanish*/"#unos escamosos guerreros# del Centro de Instrucción Gerudo protegen"}, }); - hintTable[GERUDO_TRAINING_GROUNDS_HIDDEN_CEILING_CHEST] = HintText::Exclude({ + hintTable[RHT_GERUDO_TRAINING_GROUND_HIDDEN_CEILING_CHEST] = HintText::Exclude({ //obscure text Text{"the #Eye of Truth# in the Gerudo Training Grounds reveals", /*french*/"#bien caché# dans le Gymnase Gerudo gît", /*spanish*/"el #Ojo de la Verdad# en el Centro de Instrucción Gerudo revela"}, }); - hintTable[GERUDO_TRAINING_GROUNDS_MAZE_PATH_FIRST_CHEST] = HintText::Exclude({ + hintTable[RHT_GERUDO_TRAINING_GROUND_MAZE_PATH_FIRST_CHEST] = HintText::Exclude({ //obscure text Text{"the first prize of #the thieves' training# is", /*french*/"le #premier trésor du Gymnase Gerudo# est", /*spanish*/"el primer premio de la #instrucción bandida# se trata de"}, }); - hintTable[GERUDO_TRAINING_GROUNDS_MAZE_PATH_SECOND_CHEST] = HintText::Exclude({ + hintTable[RHT_GERUDO_TRAINING_GROUND_MAZE_PATH_SECOND_CHEST] = HintText::Exclude({ //obscure text Text{"the second prize of #the thieves' training# is", /*french*/"le #deuxième trésor du Gymnase Gerudo# est", /*spanish*/"el segundo premio de la #instrucción bandida# se trata de"}, }); - hintTable[GERUDO_TRAINING_GROUNDS_MAZE_PATH_THIRD_CHEST] = HintText::Exclude({ + hintTable[RHT_GERUDO_TRAINING_GROUND_MAZE_PATH_THIRD_CHEST] = HintText::Exclude({ //obscure text Text{"the third prize of #the thieves' training# is", /*french*/"le #troisième trésor du Gymnase Gerudo# est", /*spanish*/"el tercer premio de la #instrucción bandida# se trata de"}, }); - hintTable[GERUDO_TRAINING_GROUNDS_MAZE_RIGHT_CENTRAL_CHEST] = HintText::Exclude({ + hintTable[RHT_GERUDO_TRAINING_GROUND_MAZE_RIGHT_CENTRAL_CHEST] = HintText::Exclude({ //obscure text Text{"the #Song of Time# in the Gerudo Training Grounds leads to", /*french*/"le #chant du temps# révèle dans le Gymnase Gerudo", /*spanish*/"la #Canción del Tiempo# en el Centro de Instrucción Gerudo conduce a"}, }); - hintTable[GERUDO_TRAINING_GROUNDS_MAZE_RIGHT_SIDE_CHEST] = HintText::Exclude({ + hintTable[RHT_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST] = HintText::Exclude({ //obscure text Text{"the #Song of Time# in the Gerudo Training Grounds leads to", /*french*/"le #chant du temps# révèle dans le Gymnase Gerudo", /*spanish*/"la #Canción del Tiempo# en el Centro de Instrucción Gerudo conduce a"}, }); - hintTable[GERUDO_TRAINING_GROUNDS_HAMMER_ROOM_CLEAR_CHEST] = HintText::Exclude({ + hintTable[RHT_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST] = HintText::Exclude({ //obscure text Text{"#fiery foes# in the Gerudo Training Grounds guard", /*french*/"les #limaces de feu# du Gymnase Gerudo protègent", /*spanish*/"unos #flamígeros enemigos# del Centro de Instrucción Gerudo guardan"}, }); - hintTable[GERUDO_TRAINING_GROUNDS_HAMMER_ROOM_SWITCH_CHEST] = HintText::Exclude({ + hintTable[RHT_GERUDO_TRAINING_GROUND_HAMMER_ROOM_SWITCH_CHEST] = HintText::Exclude({ //obscure text Text{"#engulfed in flame# where thieves train lies", /*french*/"le #trésor enflammé# du Gymnase Gerudo est", /*spanish*/"donde entrenan las bandidas #entre llamas# yace"}, }); - hintTable[GERUDO_TRAINING_GROUNDS_EYE_STATUE_CHEST] = HintText::Exclude({ + hintTable[RHT_GERUDO_TRAINING_GROUND_EYE_STATUE_CHEST] = HintText::Exclude({ //obscure text Text{"thieves #blind four faces# to find", /*french*/"l'#épreuve d'archerie# du Gymnase Gerudo donne", /*spanish*/"las bandidas #ciegan cuatro bustos# para hallar"}, }); - hintTable[GERUDO_TRAINING_GROUNDS_NEAR_SCARECROW_CHEST] = HintText::Exclude({ + hintTable[RHT_GERUDO_TRAINING_GROUND_NEAR_SCARECROW_CHEST] = HintText::Exclude({ //obscure text Text{"thieves #blind four faces# to find", /*french*/"l'#épreuve d'archerie# du Gymnase Gerudo donne", /*spanish*/"las bandidas #ciegan cuatro bustos# para hallar"}, }); - hintTable[GERUDO_TRAINING_GROUNDS_BEFORE_HEAVY_BLOCK_CHEST] = HintText::Exclude({ + hintTable[RHT_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST] = HintText::Exclude({ //obscure text Text{"#before a block of silver# thieves can find", /*french*/"#près d'un bloc argent# dans le Gymnase Gerudo gît", /*spanish*/"#ante un plateado bloque# las bandidas hallan"}, }); - hintTable[GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_FIRST_CHEST] = HintText::Exclude({ + hintTable[RHT_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FIRST_CHEST] = HintText::Exclude({ //obscure text 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"}, }); - hintTable[GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_SECOND_CHEST] = HintText::Exclude({ + hintTable[RHT_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_SECOND_CHEST] = HintText::Exclude({ //obscure text 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"}, }); - hintTable[GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_THIRD_CHEST] = HintText::Exclude({ + hintTable[RHT_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST] = HintText::Exclude({ //obscure text 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"}, }); - hintTable[GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_FOURTH_CHEST] = HintText::Exclude({ + hintTable[RHT_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST] = HintText::Exclude({ //obscure text 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"}, }); - hintTable[GERUDO_TRAINING_GROUNDS_FREESTANDING_KEY] = HintText::Exclude({ + hintTable[RHT_GERUDO_TRAINING_GROUND_FREESTANDING_KEY] = HintText::Exclude({ //obscure text Text{"the #Song of Time# in the Gerudo Training Grounds leads to", /*french*/"le #chant du temps# révèle dans le Gymnase Gerudo", /*spanish*/"la #Canción del Tiempo# en el Centro de Instrucción Gerudo conduce a"}, }); - hintTable[GERUDO_TRAINING_GROUNDS_MQ_LOBBY_RIGHT_CHEST] = HintText::Exclude({ + hintTable[RHT_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_CHEST] = HintText::Exclude({ //obscure text Text{"#thieves prepare for training# with", /*french*/"dans #l'entrée du Gymnase Gerudo# gît", /*spanish*/"las #bandidas se instruyen# con"}, }); - hintTable[GERUDO_TRAINING_GROUNDS_MQ_LOBBY_LEFT_CHEST] = HintText::Exclude({ + hintTable[RHT_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_CHEST] = HintText::Exclude({ //obscure text Text{"#thieves prepare for training# with", /*french*/"dans #l'entrée du Gymnase Gerudo# gît", /*spanish*/"las #bandidas se instruyen# con"}, }); - hintTable[GERUDO_TRAINING_GROUNDS_MQ_FIRST_IRON_KNUCKLE_CHEST] = HintText::Exclude({ + hintTable[RHT_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST] = HintText::Exclude({ //obscure text Text{"#soldiers walking on shifting sands# in the Gerudo Training Grounds guard", /*french*/"les #squelettes# du Gymnase Gerudo protègent", /*spanish*/"#soldados en resbaladizas arenas# del Centro de Instrucción Gerudo protegen"}, }); - hintTable[GERUDO_TRAINING_GROUNDS_MQ_BEFORE_HEAVY_BLOCK_CHEST] = HintText::Exclude({ + hintTable[RHT_GERUDO_TRAINING_GROUND_MQ_BEFORE_HEAVY_BLOCK_CHEST] = HintText::Exclude({ //obscure text Text{"#before a block of silver# thieves can find", /*french*/"#près d'un bloc argent# dans le Gymnase Gerudo gît", /*spanish*/"#ante un plateado bloque# las bandidas hallan"}, }); - hintTable[GERUDO_TRAINING_GROUNDS_MQ_EYE_STATUE_CHEST] = HintText::Exclude({ + hintTable[RHT_GERUDO_TRAINING_GROUND_MQ_EYE_STATUE_CHEST] = HintText::Exclude({ //obscure text Text{"thieves #blind four faces# to find", /*french*/"l'#épreuve d'archerie# du Gymnase Gerudo donne", /*spanish*/"las bandidas #ciegan cuatro bustos# para hallar"}, }); - hintTable[GERUDO_TRAINING_GROUNDS_MQ_FLAME_CIRCLE_CHEST] = HintText::Exclude({ + hintTable[RHT_GERUDO_TRAINING_GROUND_MQ_FLAME_CIRCLE_CHEST] = HintText::Exclude({ //obscure text Text{"#engulfed in flame# where thieves train lies", /*french*/"le #trésor enflammé# du Gymnase Gerudo est", /*spanish*/"donde entrenan las bandidas #entre llamas# yace"}, }); - hintTable[GERUDO_TRAINING_GROUNDS_MQ_SECOND_IRON_KNUCKLE_CHEST] = HintText::Exclude({ + hintTable[RHT_GERUDO_TRAINING_GROUND_MQ_SECOND_IRON_KNUCKLE_CHEST] = HintText::Exclude({ //obscure text Text{"#fiery foes# in the Gerudo Training Grounds guard", /*french*/"les #ennemis de feu# du Gymnase Gerudo protègent", /*spanish*/"unos #flamígeros enemigos# del Centro de Instrucción Gerudo guardan"}, }); - hintTable[GERUDO_TRAINING_GROUNDS_MQ_DINOLFOS_CHEST] = HintText::Exclude({ + hintTable[RHT_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST] = HintText::Exclude({ //obscure text Text{"#reptilian warriors# in the Gerudo Training Grounds protect", /*french*/"les #lézards# dans le Gymnase Gerudo protègent", /*spanish*/"#unos escamosos guerreros# del Centro de Instrucción Gerudo protegen"}, }); - hintTable[GERUDO_TRAINING_GROUNDS_MQ_MAZE_RIGHT_CENTRAL_CHEST] = HintText::Exclude({ + hintTable[RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_CENTRAL_CHEST] = HintText::Exclude({ //obscure text Text{"a #path of fire# leads thieves to", /*french*/"dans le #chemin enflammé# dans le Gymnase Gerudo gît", /*spanish*/"un #camino de fuego# conduce a las bandidas a"}, }); - hintTable[GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_FIRST_CHEST] = HintText::Exclude({ + hintTable[RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_FIRST_CHEST] = HintText::Exclude({ //obscure text Text{"the first prize of #the thieves' training# is", /*french*/"le #premier trésor du Gymnase Gerudo# est", /*spanish*/"el primer premio de la #instrucción bandida# se trata de"}, }); - hintTable[GERUDO_TRAINING_GROUNDS_MQ_MAZE_RIGHT_SIDE_CHEST] = HintText::Exclude({ + hintTable[RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_SIDE_CHEST] = HintText::Exclude({ //obscure text Text{"a #path of fire# leads thieves to", /*french*/"dans le #chemin enflammé# dans le Gymnase Gerudo gît", /*spanish*/"un #camino de fuego# conduce a las bandidas a"}, }); - hintTable[GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_THIRD_CHEST] = HintText::Exclude({ + hintTable[RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST] = HintText::Exclude({ //obscure text Text{"the third prize of #the thieves' training# is", /*french*/"le #troisième trésor du Gymnase Gerudo# est", /*spanish*/"el tercer premio de la #instrucción bandida# se trata de"}, }); - hintTable[GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_SECOND_CHEST] = HintText::Exclude({ + hintTable[RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_SECOND_CHEST] = HintText::Exclude({ //obscure text Text{"the second prize of #the thieves' training# is", /*french*/"le #deuxième trésor du Gymnase Gerudo# est", /*spanish*/"el segundo premio de la #instrucción bandida# se trata de"}, }); - hintTable[GERUDO_TRAINING_GROUNDS_MQ_HIDDEN_CEILING_CHEST] = HintText::Exclude({ + hintTable[RHT_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST] = HintText::Exclude({ //obscure text Text{"the #Eye of Truth# in the Gerudo Training Grounds reveals", /*french*/"#bien caché# dans le Gymnase Gerudo gît", /*spanish*/"el #Ojo de la Verdad# en el Centro de Instrucción Gerudo revela"}, }); - hintTable[GERUDO_TRAINING_GROUNDS_MQ_HEAVY_BLOCK_CHEST] = HintText::Exclude({ + hintTable[RHT_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST] = HintText::Exclude({ //obscure text 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"}, }); @@ -1769,195 +1769,195 @@ void HintTable_Init_Exclude_Dungeon() { /*-------------------------- | GANONS CASTLE | ---------------------------*/ - hintTable[GANONS_TOWER_BOSS_KEY_CHEST] = HintText::Exclude({ + hintTable[RHT_GANONS_TOWER_BOSS_KEY_CHEST] = HintText::Exclude({ //obscure text Text{"the #Evil King# hoards", /*french*/"le #Roi du Mal# possède", /*spanish*/"el #Rey del Mal# acapara"}, }); - hintTable[GANONS_CASTLE_FOREST_TRIAL_CHEST] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_FOREST_TRIAL_CHEST] = HintText::Exclude({ //obscure text Text{"the #test of the wilds# holds", /*french*/"l'#épreuve des bois# contient", /*spanish*/"la #prueba de la naturaleza# brinda"}, }); - hintTable[GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST] = HintText::Exclude({ //obscure text Text{"the #test of the seas# holds", /*french*/"l'#épreuve des mers# contient", /*spanish*/"la #prueba del mar# brinda"}, }); - hintTable[GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST] = HintText::Exclude({ //obscure text Text{"the #test of the seas# holds", /*french*/"l'#épreuve des mers# contient", /*spanish*/"la #prueba del mar# brinda"}, }); - hintTable[GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST] = HintText::Exclude({ //obscure text Text{"#music in the test of darkness# unveils", /*french*/"la #musique dans l'épreuve des ténèbres# révèle", /*spanish*/"la #música en la prueba de la oscuridad# revela"}, }); - hintTable[GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST] = HintText::Exclude({ //obscure text Text{"#light in the test of darkness# unveils", /*french*/"la #lumière dans l'épreuve des ténèbres# révèle", /*spanish*/"la #luz en la prueba de la oscuridad# revela"}, }); - hintTable[GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST] = 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[GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST] = 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[GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST] = HintText::Exclude({ //obscure text Text{"the #test of radiance# holds", /*french*/"l'#épreuve du ciel# contient", /*spanish*/"la #prueba del resplandor# brinda"}, }); - hintTable[GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST] = HintText::Exclude({ //obscure text Text{"the #test of radiance# holds", /*french*/"l'#épreuve du ciel# contient", /*spanish*/"la #prueba del resplandor# brinda"}, }); - hintTable[GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST] = HintText::Exclude({ //obscure text Text{"the #test of radiance# holds", /*french*/"l'#épreuve du ciel# contient", /*spanish*/"la #prueba del resplandor# brinda"}, }); - hintTable[GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST] = HintText::Exclude({ //obscure text Text{"the #test of radiance# holds", /*french*/"l'#épreuve du ciel# contient", /*spanish*/"la #prueba del resplandor# brinda"}, }); - hintTable[GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST] = HintText::Exclude({ //obscure text Text{"the #test of radiance# holds", /*french*/"l'#épreuve du ciel# contient", /*spanish*/"la #prueba del resplandor# brinda"}, }); - hintTable[GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST] = HintText::Exclude({ //obscure text Text{"the #test of radiance# holds", /*french*/"l'#épreuve du ciel# contient", /*spanish*/"la #prueba del resplandor# brinda"}, }); - hintTable[GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST] = HintText::Exclude({ //obscure text Text{"the #test of radiance# holds", /*french*/"l'#épreuve du ciel# contient", /*spanish*/"la #prueba del resplandor# brinda"}, }); - hintTable[GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST] = HintText::Exclude({ //obscure text Text{"#music in the test of radiance# reveals", /*french*/"la #musique dans l'épreuve du ciel# révèle", /*spanish*/"la #música en la prueba del resplandor# revela"}, }); - hintTable[GANONS_CASTLE_MQ_WATER_TRIAL_CHEST] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST] = HintText::Exclude({ //obscure text Text{"the #test of the seas# holds", /*french*/"l'#épreuve des mers# contient", /*spanish*/"la #prueba del mar# brinda"}, }); - hintTable[GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST] = HintText::Exclude({ //obscure text Text{"the #test of the wilds# holds", /*french*/"l'#épreuve des bois# contient", /*spanish*/"la #prueba de la naturaleza# brinda"}, }); - hintTable[GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST] = HintText::Exclude({ //obscure text Text{"the #test of the wilds# holds", /*french*/"l'#épreuve des bois# contient", /*spanish*/"la #prueba de la naturaleza# brinda"}, }); - hintTable[GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST] = HintText::Exclude({ //obscure text Text{"#music in the test of radiance# reveals", /*french*/"la #musique dans l'épreuve du ciel# révèle", /*spanish*/"la #música en la prueba del resplandor# revela"}, }); - hintTable[GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST] = HintText::Exclude({ //obscure text Text{"the #test of darkness# holds", /*french*/"l'#épreuve des ténèbres# contient", /*spanish*/"la #prueba de la oscuridad# brinda"}, }); - hintTable[GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST] = HintText::Exclude({ //obscure text Text{"the #test of darkness# holds", /*french*/"l'#épreuve des ténèbres# contient", /*spanish*/"la #prueba de la oscuridad# brinda"}, }); - hintTable[GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST] = HintText::Exclude({ //obscure text Text{"#reflected light in the test of the sands# reveals", /*french*/"le #soleil dans l'épreuve des sables# révèle", /*spanish*/"#reflejar la luz en la prueba de las arenas# revela"}, }); - hintTable[GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST] = HintText::Exclude({ //obscure text Text{"#reflected light in the test of the sands# reveals", /*french*/"le #soleil dans l'épreuve des sables# révèle", /*spanish*/"#reflejar la luz en la prueba de las arenas# revela"}, }); - hintTable[GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST] = HintText::Exclude({ //obscure text Text{"#reflected light in the test of the sands# reveals", /*french*/"le #soleil dans l'épreuve des sables# révèle", /*spanish*/"#reflejar la luz en la prueba de las arenas# revela"}, }); - hintTable[GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST] = HintText::Exclude({ //obscure text Text{"#reflected light in the test of the sands# reveals", /*french*/"le #soleil dans l'épreuve des sables# révèle", /*spanish*/"#reflejar la luz en la prueba de las arenas# revela"}, }); - hintTable[GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST] = HintText::Exclude({ //obscure text Text{"#reflected light in the test of the sands# reveals", /*french*/"le #soleil dans l'épreuve des sables# révèle", /*spanish*/"#reflejar la luz en la prueba de las arenas# revela"}, }); - hintTable[GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST] = HintText::Exclude({ //obscure text Text{"#reflected light in the test of the sands# reveals", /*french*/"le #soleil dans l'épreuve des sables# révèle", /*spanish*/"#reflejar la luz en la prueba de las arenas# revela"}, }); - hintTable[GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY] = HintText::Exclude({ //obscure text Text{"the #test of the wilds# holds", /*french*/"l'#épreuve des bois# révèle", /*spanish*/"la #prueba de la naturaleza# brinda"}, }); - hintTable[GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT] = HintText::Exclude({ //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[GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT] = HintText::Exclude({ //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[GANONS_CASTLE_DEKU_SCRUB_RIGHT] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_DEKU_SCRUB_RIGHT] = HintText::Exclude({ //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[GANONS_CASTLE_DEKU_SCRUB_LEFT] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_DEKU_SCRUB_LEFT] = HintText::Exclude({ //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[GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT] = HintText::Exclude({ //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[GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT] = HintText::Exclude({ //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[GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER] = HintText::Exclude({ //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[GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT] = HintText::Exclude({ //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[GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT] = HintText::Exclude({ + hintTable[RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT] = HintText::Exclude({ //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"}, }); 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 8b9f37f9e..6e46c522a 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 @@ -1,12 +1,12 @@ #include "../hint_list.hpp" void HintTable_Init_Exclude_Overworld() { - hintTable[KF_KOKIRI_SWORD_CHEST] = HintText::Exclude({ + hintTable[RHT_KF_KOKIRI_SWORD_CHEST] = HintText::Exclude({ //obscure text Text{"the #hidden treasure of the Kokiri# is", /*french*/"le #trésor des Kokiri# est", /*spanish*/"el #tesoro oculto de los Kokiri# esconde"}, }); - hintTable[KF_MIDOS_TOP_LEFT_CHEST] = HintText::Exclude({ + hintTable[RHT_KF_MIDOS_TOP_LEFT_CHEST] = HintText::Exclude({ //obscure text Text{"the #leader of the Kokiri# hides", /*french*/"le #chef des Kokiri# possède", /*spanish*/"el #líder de los Kokiri# esconde"}, }, {}, @@ -14,7 +14,7 @@ void HintTable_Init_Exclude_Overworld() { Text{"#inside Mido's house# is", /*french*/"#dans la maison de Mido# gît", /*spanish*/"en la #casa de Mido# yace"} ); - hintTable[KF_MIDOS_TOP_RIGHT_CHEST] = HintText::Exclude({ + hintTable[RHT_KF_MIDOS_TOP_RIGHT_CHEST] = HintText::Exclude({ //obscure text Text{"the #leader of the Kokiri# hides", /*french*/"le #chef des Kokiri# possède", /*spanish*/"el #líder de los Kokiri# esconde"}, }, {}, @@ -22,7 +22,7 @@ void HintTable_Init_Exclude_Overworld() { Text{"#inside Mido's house# is", /*french*/"#dans la maison de Mido# gît", /*spanish*/"en la #casa de Mido# yace"} ); - hintTable[KF_MIDOS_BOTTOM_LEFT_CHEST] = HintText::Exclude({ + hintTable[RHT_KF_MIDOS_BOTTOM_LEFT_CHEST] = HintText::Exclude({ //obscure text Text{"the #leader of the Kokiri# hides", /*french*/"le #chef des Kokiri# possède", /*spanish*/"el #líder de los Kokiri# esconde"}, }, {}, @@ -30,7 +30,7 @@ void HintTable_Init_Exclude_Overworld() { Text{"#inside Mido's house# is", /*french*/"#dans la maison de Mido# gît", /*spanish*/"en la #casa de Mido# yace"} ); - hintTable[KF_MIDOS_BOTTOM_RIGHT_CHEST] = HintText::Exclude({ + hintTable[RHT_KF_MIDOS_BOTTOM_RIGHT_CHEST] = HintText::Exclude({ //obscure text Text{"the #leader of the Kokiri# hides", /*french*/"le #chef des Kokiri# possède", /*spanish*/"el #líder de los Kokiri# esconde"}, }, {}, @@ -38,32 +38,32 @@ void HintTable_Init_Exclude_Overworld() { Text{"#inside Mido's house# is", /*french*/"#dans la maison de Mido# gît", /*spanish*/"en la #casa de Mido# yace"} ); - hintTable[GRAVEYARD_SHIELD_GRAVE_CHEST] = HintText::Exclude({ + hintTable[RHT_GRAVEYARD_SHIELD_GRAVE_CHEST] = HintText::Exclude({ //obscure text Text{"the #treasure of a fallen soldier# is", /*french*/"le #trésor du soldat mort# est", /*spanish*/"el #tesoro de un soldado caído# esconde"}, }); - hintTable[DMT_CHEST] = HintText::Exclude({ + hintTable[RHT_DMT_CHEST] = HintText::Exclude({ //obscure text Text{"hidden behind a wall on a #mountain trail# is", /*french*/"derrière une façade du #chemin montagneux# est", /*spanish*/"tras una pared del #sendero de la montaña# yace"}, }); - hintTable[GC_MAZE_RIGHT_CHEST] = HintText::Exclude({ + hintTable[RHT_GC_MAZE_RIGHT_CHEST] = HintText::Exclude({ //obscure text Text{"in #Goron City# explosives unlock", /*french*/"des explosions dans le #village Goron# révèlent", /*spanish*/"en la #Ciudad Goron# unos explosivos desbloquean"}, }); - hintTable[GC_MAZE_CENTER_CHEST] = HintText::Exclude({ + hintTable[RHT_GC_MAZE_CENTER_CHEST] = HintText::Exclude({ //obscure text Text{"in #Goron City# explosives unlock", /*french*/"des explosions dans le #village Goron# révèlent", /*spanish*/"en la #Ciudad Goron# unos explosivos desbloquean"}, }); - hintTable[ZD_CHEST] = HintText::Exclude({ + hintTable[RHT_ZD_CHEST] = HintText::Exclude({ //obscure text Text{"fire #beyond a waterfall# reveals", /*french*/"du feu #derrière la cascade# éclaire", /*spanish*/"las #llamas tras una una cascada# revelan"}, }); - hintTable[GRAVEYARD_HOOKSHOT_CHEST] = HintText::Exclude({ + hintTable[RHT_GRAVEYARD_HOOKSHOT_CHEST] = HintText::Exclude({ //obscure text Text{"a chest hidden by a #speedy spectre# holds", /*french*/"le #coffre du rapide revenant# contient", /*spanish*/"un cofre custodiado por un #espectro veloz# contiene"}, }, {}, @@ -71,73 +71,73 @@ void HintTable_Init_Exclude_Overworld() { Text{"#dead Dampé's first prize# is", /*french*/"la #première course d'Igor# donne", /*spanish*/"el primer premio de #la carrera de Dampé# se trata de"} ); - hintTable[GF_CHEST] = HintText::Exclude({ + hintTable[RHT_GF_CHEST] = HintText::Exclude({ //obscure text Text{"on a #rooftop in the desert# lies", /*french*/"sur un #toit du désert# gît", /*spanish*/"en una #azotea del desierto# yace"}, }); - hintTable[KAK_REDEAD_GROTTO_CHEST] = HintText::Exclude({ + hintTable[RHT_KAK_REDEAD_GROTTO_CHEST] = HintText::Exclude({ //obscure text Text{"#zombies beneath the earth# guard", /*french*/"les #revenants sous terre# protègent", /*spanish*/"unos #zombis subterráneos# esconden"}, }); - hintTable[SFM_WOLFOS_GROTTO_CHEST] = HintText::Exclude({ + hintTable[RHT_SFM_WOLFOS_GROTTO_CHEST] = HintText::Exclude({ //obscure text Text{"#wolves beneath the earth# guard", /*french*/"les #loups sous terre# protègent", /*spanish*/"unos #lobos subterráneos# esconden"}, }); - hintTable[HF_NEAR_MARKET_GROTTO_CHEST] = HintText::Exclude({ + hintTable[RHT_HF_NEAR_MARKET_GROTTO_CHEST] = HintText::Exclude({ //obscure text Text{"a #hole in a field near a drawbridge# holds", /*french*/"la #grotte près d'un pont# contient", /*spanish*/"bajo el #hoyo de una llanura cercano a un puente# yace"}, }); - hintTable[HF_SOUTHEAST_GROTTO_CHEST] = HintText::Exclude({ + hintTable[RHT_HF_SOUTHEAST_GROTTO_CHEST] = HintText::Exclude({ //obscure text Text{"a #hole amongst trees in a field# holds", /*french*/"la #grotte près des arbres# contient", /*spanish*/"bajo el #hoyo de una llanura rodeado de árboles# yace"}, }); - hintTable[HF_OPEN_GROTTO_CHEST] = HintText::Exclude({ + hintTable[RHT_HF_OPEN_GROTTO_CHEST] = HintText::Exclude({ //obscure text Text{"an #open hole in a field# holds", /*french*/"la #grotte dans les plaines# contient", /*spanish*/"bajo el #hoyo descubierto de una llanura# yace"}, }); - hintTable[KAK_OPEN_GROTTO_CHEST] = HintText::Exclude({ + hintTable[RHT_KAK_OPEN_GROTTO_CHEST] = HintText::Exclude({ //obscure text Text{"an #open hole in a town# holds", /*french*/"la #grotte dans le village# contient", /*spanish*/"bajo el #hoyo descubierto de un pueblo# yace"}, }); - hintTable[ZR_OPEN_GROTTO_CHEST] = HintText::Exclude({ + hintTable[RHT_ZR_OPEN_GROTTO_CHEST] = HintText::Exclude({ //obscure text Text{"a #hole along a river# holds", /*french*/"la #grotte près du fleuve# contient", /*spanish*/"bajo un #hoyo junto a un río# yace"}, }); - hintTable[KF_STORMS_GROTTO_CHEST] = HintText::Exclude({ + hintTable[RHT_KF_STORMS_GROTTO_CHEST] = HintText::Exclude({ //obscure text Text{"a #hole in a forest village# holds", /*french*/"la #grotte inondée de pluie dans le Village Kokiri# révèle", /*spanish*/"bajo el #hoyo de una tribu del bosque# yace"}, }); - hintTable[LW_NEAR_SHORTCUTS_GROTTO_CHEST] = HintText::Exclude({ + hintTable[RHT_LW_NEAR_SHORTCUTS_GROTTO_CHEST] = HintText::Exclude({ //obscure text Text{"a #hole in a wooded maze# holds", /*french*/"la #grotte dans le labyrinthe sylvestre# contient", /*spanish*/"bajo un #hoyo de un laberinto forestal# yace"}, }); - hintTable[DMT_STORMS_GROTTO_CHEST] = HintText::Exclude({ + hintTable[RHT_DMT_STORMS_GROTTO_CHEST] = HintText::Exclude({ //obscure text Text{"#hole flooded with rain on a mountain# holds", /*french*/"la #grotte inondée de pluie sur la montagne# contient", /*spanish*/"bajo un #hoyo de una montaña inundado de lluvia# yace"}, }); - hintTable[DMC_UPPER_GROTTO_CHEST] = HintText::Exclude({ + hintTable[RHT_DMC_UPPER_GROTTO_CHEST] = HintText::Exclude({ //obscure text Text{"a #hole in a volcano# holds", /*french*/"la #grotte dans le volcan# contient", /*spanish*/"bajo el #hoyo de un volcán# yace"}, }); - hintTable[TOT_LIGHT_ARROWS_CUTSCENE] = HintText::Exclude({ + hintTable[RHT_TOT_LIGHT_ARROWS_CUTSCENE] = HintText::Exclude({ //obscure text Text{"the #final gift of a princess# is", /*french*/"le #cadeau d'adieu de la princesse# est", /*spanish*/"el #obsequio final de la princesa# se trata de"}, }); - hintTable[LW_GIFT_FROM_SARIA] = HintText::Exclude({ + hintTable[RHT_LW_GIFT_FROM_SARIA] = HintText::Exclude({ //obscure text Text{"a #potato hoarder# holds", /*french*/"le #panini mélodieux# est en fait", /*spanish*/"cierta #jovencita verde# concede"}, Text{"a rooty tooty #flutey cutey# gifts", /*french*/"la #patate musicale# est en fait", /*spanish*/"una #gran amiga# concede"}, @@ -146,69 +146,69 @@ void HintTable_Init_Exclude_Overworld() { Text{"#Saria's Gift# is", /*french*/"le #cadeau de Saria# est", /*spanish*/"el #regalo de Saria# se trata de"} ); - hintTable[ZF_GREAT_FAIRY_REWARD] = HintText::Exclude({ + hintTable[RHT_ZF_GREAT_FAIRY_REWARD] = HintText::Exclude({ //obscure text Text{"the #fairy of winds# holds", /*french*/"la #fée du vent# a", /*spanish*/"el #hada del viento# brinda"}, }); - hintTable[HC_GREAT_FAIRY_REWARD] = HintText::Exclude({ + hintTable[RHT_HC_GREAT_FAIRY_REWARD] = HintText::Exclude({ //obscure text Text{"the #fairy of fire# holds", /*french*/"la #fée du feu# a", /*spanish*/"el #hada del fuego# brinda"}, }); - hintTable[COLOSSUS_GREAT_FAIRY_REWARD] = HintText::Exclude({ + hintTable[RHT_COLOSSUS_GREAT_FAIRY_REWARD] = HintText::Exclude({ //obscure text Text{"the #fairy of love# holds", /*french*/"la #fée de l'amour# a", /*spanish*/"el #hada del amor# brinda"}, }); - hintTable[DMT_GREAT_FAIRY_REWARD] = HintText::Exclude({ + hintTable[RHT_DMT_GREAT_FAIRY_REWARD] = HintText::Exclude({ //obscure text Text{"a #magical fairy# gifts", /*french*/"la #fée de la magie# a", /*spanish*/"un #hada mágica# brinda"}, }); - hintTable[DMC_GREAT_FAIRY_REWARD] = HintText::Exclude({ + hintTable[RHT_DMC_GREAT_FAIRY_REWARD] = HintText::Exclude({ //obscure text Text{"a #magical fairy# gifts", /*french*/"la #fée de la magie# a", /*spanish*/"un #hada mágica# brinda"}, }); - hintTable[OGC_GREAT_FAIRY_REWARD] = HintText::Exclude({ + hintTable[RHT_OGC_GREAT_FAIRY_REWARD] = HintText::Exclude({ //obscure text Text{"the #fairy of strength# holds", /*french*/"la #fée de la force# a", /*spanish*/"el #hada de la fuerza# brinda"}, }); - hintTable[SONG_FROM_IMPA] = HintText::Exclude({ + hintTable[RHT_SONG_FROM_IMPA] = HintText::Exclude({ //obscure text Text{"#deep in a castle#, Impa teaches", /*french*/"#la gardienne de la princesse# donne", /*spanish*/"en el #jardín del castillo Impa enseña#"}, }); - hintTable[SONG_FROM_MALON] = HintText::Exclude({ + hintTable[RHT_SONG_FROM_MALON] = HintText::Exclude({ //obscure text Text{"#a farm girl# sings", /*french*/"la #fillette de la ferme# donne", /*spanish*/"una #chica rupestre# canta"}, }); - hintTable[SONG_FROM_SARIA] = HintText::Exclude({ + hintTable[RHT_SONG_FROM_SARIA] = HintText::Exclude({ //obscure text Text{"#deep in the forest#, Saria teaches", /*french*/"la #fille de la forêt# donne", /*spanish*/"al #fondo del bosque# Saria enseña"}, }); - hintTable[SONG_FROM_WINDMILL] = HintText::Exclude({ + hintTable[RHT_SONG_FROM_WINDMILL] = HintText::Exclude({ //obscure text Text{"a man #in a windmill# is obsessed with", /*french*/"l'#homme du moulin# donne", /*spanish*/"el #hombre del molino# está obsesionado con"}, }); - hintTable[HC_MALON_EGG] = HintText::Exclude({ + hintTable[RHT_HC_MALON_EGG] = HintText::Exclude({ //obscure text Text{"a #girl looking for her father# gives", /*french*/"la #fillette qui cherche son père# donne", /*spanish*/"una #chica en busca de su padre# otorga"}, }); - hintTable[HC_ZELDAS_LETTER] = HintText::Exclude({ + hintTable[RHT_HC_ZELDAS_LETTER] = HintText::Exclude({ //obscure text Text{"a #princess in a castle# gifts", /*french*/"la #princesse dans le château# donne", /*spanish*/"la #princesa de un castillo# otorga"}, }); - hintTable[ZD_DIVING_MINIGAME] = HintText::Exclude({ + hintTable[RHT_ZD_DIVING_MINIGAME] = HintText::Exclude({ //obscure text Text{"an #unsustainable business model# gifts", /*french*/"le #mauvais modèle d'affaires# donne", /*spanish*/"un #mal modelo de negocio# premia con"}, }, {}, @@ -216,22 +216,22 @@ void HintTable_Init_Exclude_Overworld() { Text{"those who #dive for Zora rupees# will find", /*french*/"ceux qui #plongent pour des rubis Zora# trouveront", /*spanish*/"aquellos que se #sumergan por las rupias zora# encontrarán"} ); - hintTable[LH_CHILD_FISHING] = HintText::Exclude({ + hintTable[RHT_LH_CHILD_FISHING] = HintText::Exclude({ //obscure text Text{"#fishing in youth# bestows", /*french*/"#pêcher dans sa jeunesse# promet", /*spanish*/"#pescar en la juventud# conduce a"}, }); - hintTable[LH_ADULT_FISHING] = HintText::Exclude({ + hintTable[RHT_LH_ADULT_FISHING] = HintText::Exclude({ //obscure text Text{"#fishing in maturity# bestows", /*french*/"#pêcher dans sa maturité# promet", /*spanish*/"#pescar en la madurez# conduce a"}, }); - hintTable[LH_LAB_DIVE] = HintText::Exclude({ + hintTable[RHT_LH_LAB_DIVE] = HintText::Exclude({ //obscure text Text{"a #diving experiment# is rewarded with", /*french*/"l'#expérience de plongée# donne", /*spanish*/"#bucear para un experimento# se premia con"}, }); - hintTable[GC_ROLLING_GORON_AS_ADULT] = HintText::Exclude({ + hintTable[RHT_GC_ROLLING_GORON_AS_ADULT] = HintText::Exclude({ //obscure text Text{"#comforting yourself# provides", /*french*/"se #réconforter soi-même# donne", /*spanish*/"#confrontarte a ti mismo# otorga"}, }, {}, @@ -239,17 +239,17 @@ void HintTable_Init_Exclude_Overworld() { Text{"#reassuring a young Goron# is rewarded with", /*french*/"#rassurer un jeune Goron# donne", /*spanish*/"#calmar a un joven Goron# otorga"} ); - hintTable[MARKET_BOMBCHU_BOWLING_FIRST_PRIZE] = HintText::Exclude({ + hintTable[RHT_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE] = HintText::Exclude({ //obscure text Text{"the #first explosive prize# is", /*french*/"le #premier prix explosif# est", /*spanish*/"el #primer premio explosivo# se trata de"}, }); - hintTable[MARKET_BOMBCHU_BOWLING_SECOND_PRIZE] = HintText::Exclude({ + hintTable[RHT_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE] = HintText::Exclude({ //obscure text Text{"the #second explosive prize# is", /*french*/"le #deuxième prix explosif# est", /*spanish*/"el #segundo premio explosivo# se trata de"}, }); - hintTable[MARKET_LOST_DOG] = HintText::Exclude({ + hintTable[RHT_MARKET_LOST_DOG] = HintText::Exclude({ //obscure text Text{"#puppy lovers# will find", /*french*/"les #amoureux canins# trouveront", /*spanish*/"los #amantes caninos# encontrarán"}, }, {}, @@ -257,7 +257,7 @@ void HintTable_Init_Exclude_Overworld() { Text{"#rescuing Richard the Dog# is rewarded with", /*french*/"#retrouver Kiki le chien# promet", /*spanish*/"#rescatar al perrito Ricardo# conduce a"} ); - hintTable[LW_OCARINA_MEMORY_GAME] = HintText::Exclude({ + hintTable[RHT_LW_OCARINA_MEMORY_GAME] = HintText::Exclude({ //obscure text Text{"the prize for a #game of Simon Says# is", /*french*/"la #récompense de Jean Dit# est", /*spanish*/"#repetir ciertas melodías# otorga"}, Text{"a #child sing-a-long# holds", /*french*/"les #jeunes flûtistes# donnent", /*spanish*/"#tocar junto a otros# otorga"}, @@ -266,7 +266,7 @@ void HintTable_Init_Exclude_Overworld() { Text{"#playing an Ocarina in Lost Woods# is rewarded with", /*french*/"#jouer l'ocarina dans les Bois Perdus# donne", /*spanish*/"#tocar la ocarina en el Bosque Perdido# otorga"} ); - hintTable[KAK_10_GOLD_SKULLTULA_REWARD] = HintText::Exclude({ + hintTable[RHT_KAK_10_GOLD_SKULLTULA_REWARD] = HintText::Exclude({ //obscure text Text{"#10 bug badges# rewards", /*french*/"#10 écussons# donnent", /*spanish*/"#10 medallas de insectos# otorgan"}, Text{"#10 spider souls# yields", /*french*/"#10 âmes# donnent", /*spanish*/"#10 almas de araña# otorgan"}, @@ -276,12 +276,12 @@ void HintTable_Init_Exclude_Overworld() { Text{"slaying #10 Gold Skulltulas# reveals", /*french*/"détruire #10 Skulltulas d'or# donne", /*spanish*/"#exterminar 10 skulltulas doradas# revela"} ); - hintTable[KAK_MAN_ON_ROOF] = HintText::Exclude({ + hintTable[RHT_KAK_MAN_ON_ROOF] = HintText::Exclude({ //obscure text Text{"a #rooftop wanderer# holds", /*french*/"une #rencontre sur un toit# donne", /*spanish*/"#alguien sobre un tejado# otorga"}, }); - hintTable[ZR_MAGIC_BEAN_SALESMAN] = HintText::Exclude({ + hintTable[RHT_ZR_MAGIC_BEAN_SALESMAN] = HintText::Exclude({ //obscure text Text{"a seller of #colorful crops# has", /*french*/"le #marchand de légumes# vend", /*spanish*/"el vendedor de un #colorido cultivo# ofrece"}, }, {}, @@ -289,11 +289,11 @@ void HintTable_Init_Exclude_Overworld() { Text{"a #bean seller# offers", /*french*/"le #marchand de haricots magiques# vend en fait", /*spanish*/"el #vendedor de judías# ofrece"} ); - hintTable[ZR_FROGS_IN_THE_RAIN] = HintText::Exclude({ + hintTable[RHT_ZR_FROGS_IN_THE_RAIN] = HintText::Exclude({ //obscure text Text{"#frogs in a storm# gift", /*french*/"#des grenouilles mouillées# donnent", /*spanish*/"las #ancas bajo la tormenta# otorgan"}, }); - hintTable[ZR_FROGS_ZELDAS_LULLABY] = HintText::Exclude( + hintTable[RHT_ZR_FROGS_ZELDAS_LULLABY] = HintText::Exclude( { // obscure text Text{ "#sleepy frogs# gift", /*french*/ "#les grenouilles somnolentes# donnent", @@ -308,7 +308,7 @@ void HintTable_Init_Exclude_Overworld() { /*french*/ "à l'écoute de #la berceuse de Zelda, les grenouilles# donnent", /*spanish*/ "después de escuchar #la Nana de Zelda, las ranas# regalan" }); - hintTable[ZR_FROGS_EPONAS_SONG] = HintText::Exclude( + hintTable[RHT_ZR_FROGS_EPONAS_SONG] = HintText::Exclude( { // obscure text Text{ "#equine frogs# gift", /*french*/ "#les grenouilles équestres# donnent", @@ -323,7 +323,7 @@ void HintTable_Init_Exclude_Overworld() { /*french*/ "à l'écoute du #chant d'Epona, les grenouilles# donnent", /*spanish*/ "después de escuchar #la Canción de Epona, las ranas# regalan" }); - hintTable[ZR_FROGS_SARIAS_SONG] = HintText::Exclude( + hintTable[RHT_ZR_FROGS_SARIAS_SONG] = HintText::Exclude( { // obscure text Text{ "#sylvan frogs# gift", /*french*/ "#les grenouilles sylvestres# donnent", @@ -338,7 +338,7 @@ void HintTable_Init_Exclude_Overworld() { /*french*/ "à l'écoute du #chant de Saria, les grenouilles# donnent", /*spanish*/ "después de escuchar #la Canción de Saria, las ranas# regalan" }); - hintTable[ZR_FROGS_SUNS_SONG] = HintText::Exclude( + hintTable[RHT_ZR_FROGS_SUNS_SONG] = HintText::Exclude( { // obscure text Text{ "#enlightened frogs# gift", /*french*/ "#les grenouilles éclairées# donnent", @@ -353,7 +353,7 @@ void HintTable_Init_Exclude_Overworld() { /*french*/ "à l'écoute du #chant du soleil, les grenouilles# donnent", /*spanish*/ "después de escuchar #la Canción del Sol, las ranas# regalan" }); - hintTable[ZR_FROGS_SONG_OF_TIME] = HintText::Exclude( + hintTable[RHT_ZR_FROGS_SONG_OF_TIME] = HintText::Exclude( { // obscure text Text{ "#time-traveling frogs# gift", /*french*/ "#les grenouilles voyageuses dans le temps# donnent", @@ -368,82 +368,82 @@ void HintTable_Init_Exclude_Overworld() { /*french*/ "à l'écoute du #chant du temps, les grenouilles# donnent", /*spanish*/ "después de escuchar #la Canción del tiempo, las ranas# regalan" }); - hintTable[GF_HBA_1000_POINTS] = HintText::Exclude({ + hintTable[RHT_GF_HBA_1000_POINTS] = HintText::Exclude({ //obscure text Text{"scoring 1000 in #horseback archery# grants", /*french*/"obtenir 1000 points dans l'#archerie équestre# donne", /*spanish*/"conseguir 1000 puntos en el #tiro con arco a caballo# premia"}, }); - hintTable[MARKET_SHOOTING_GALLERY_REWARD] = HintText::Exclude({ + hintTable[RHT_MARKET_SHOOTING_GALLERY_REWARD] = HintText::Exclude({ //obscure text Text{"#shooting in youth# grants", /*french*/"#faire du tir dans sa jeunesse# donne", /*spanish*/"#disparar en la juventud# otorga"}, }); - hintTable[KAK_SHOOTING_GALLERY_REWARD] = HintText::Exclude({ + hintTable[RHT_KAK_SHOOTING_GALLERY_REWARD] = HintText::Exclude({ //obscure text Text{"#shooting in maturity# grants", /*french*/"#faire du tir dans sa maturité# donne", /*spanish*/"#disparar en la madurez# otorga"}, }); - hintTable[LW_TARGET_IN_WOODS] = HintText::Exclude({ + hintTable[RHT_LW_TARGET_IN_WOODS] = HintText::Exclude({ //obscure text Text{"shooting a #target in the woods# grants", /*french*/"#tirer une cible dans les bois# donne", /*spanish*/"disparar a un #blanco forestal# brinda"}, }); - hintTable[KAK_ANJU_AS_ADULT] = HintText::Exclude({ + hintTable[RHT_KAK_ANJU_AS_ADULT] = HintText::Exclude({ //obscure text Text{"a #chicken caretaker# offers adults", /*french*/"devenir un #éleveur de Cocottes# donne", /*spanish*/"una #cuidadora de emplumados# le ofrece a los mayores"}, }); - hintTable[LLR_TALONS_CHICKENS] = HintText::Exclude({ + hintTable[RHT_LLR_TALONS_CHICKENS] = HintText::Exclude({ //obscure text Text{"#finding Super Cuccos# is rewarded with", /*french*/"#trouver des Super Cocottes# donne", /*spanish*/"#hallar los supercucos# conduce a"}, }); - hintTable[GC_ROLLING_GORON_AS_CHILD] = HintText::Exclude({ + hintTable[RHT_GC_ROLLING_GORON_AS_CHILD] = HintText::Exclude({ //obscure text Text{"the prize offered by a #large rolling Goron# is", /*french*/"la récompense d'un #gros Goron roulant# est", /*spanish*/"un #gran Goron rodante# otorga"}, }); - hintTable[LH_UNDERWATER_ITEM] = HintText::Exclude({ + hintTable[RHT_LH_UNDERWATER_ITEM] = HintText::Exclude({ //obscure text Text{"the #sunken treasure in a lake# is", /*french*/"le #trésor au fond du lac# est", /*spanish*/"el #tesoro hundido del lago# se trata de"}, }); - hintTable[GF_GERUDO_MEMBERSHIP_CARD] = HintText::Exclude({ + hintTable[RHT_GF_GERUDO_MEMBERSHIP_CARD] = HintText::Exclude({ //obscure text Text{"#rescuing captured carpenters# is rewarded with", /*french*/"#secourir les charpentiers capturés# assure", /*spanish*/"#rescatar los apresados carpinteros# se premia con"}, }); - hintTable[WASTELAND_BOMBCHU_SALESMAN] = HintText::Exclude({ + hintTable[RHT_WASTELAND_BOMBCHU_SALESMAN] = HintText::Exclude({ //obscure text Text{"a #carpet guru# sells", /*french*/"#un marchand du désert# vend", /*spanish*/"el #genio de una alfombra# vende"}, }); - hintTable[GC_MEDIGORON] = HintText::Exclude({ + hintTable[RHT_GC_MEDIGORON] = HintText::Exclude({ //obscure text Text{"#Medigoron# sells", /*french*/"#Medigoron# vend", /*spanish*/"#Medigoron# vende"}, }); - hintTable[KAK_GRANNYS_SHOP] = HintText::Exclude({ + hintTable[RHT_KAK_GRANNYS_SHOP] = HintText::Exclude({ // obscure text Text{"the #potion shop lady# sells", /*french*/"la #dame du magasin de potion# vend", /*spanish*/"la #señora de la tienda de pociones# vende" }, }); - hintTable[KAK_IMPAS_HOUSE_FREESTANDING_POH] = HintText::Exclude({ + hintTable[RHT_KAK_IMPAS_HOUSE_FREESTANDING_POH] = HintText::Exclude({ //obscure text Text{"#imprisoned in a house# lies", /*french*/"#encagé dans une maison# gît", /*spanish*/"#en una casa entre rejas# yace"}, }); - hintTable[HF_TEKTITE_GROTTO_FREESTANDING_POH] = HintText::Exclude({ + hintTable[RHT_HF_TEKTITE_GROTTO_FREESTANDING_POH] = HintText::Exclude({ //obscure text Text{"#deep underwater in a hole# is", /*french*/"#dans les profondeurs d'une grotte# gît", /*spanish*/"#en lo hondo bajo un hoyo# yace"}, }); - hintTable[KAK_WINDMILL_FREESTANDING_POH] = HintText::Exclude({ + hintTable[RHT_KAK_WINDMILL_FREESTANDING_POH] = HintText::Exclude({ //obscure text Text{"on a #windmill ledge# lies", /*french*/"#haut perché dans le moulin# gît", /*spanish*/"al #borde de un molino# yace"}, }); - hintTable[GRAVEYARD_DAMPE_RACE_FREESTANDING_POH] = HintText::Exclude({ + hintTable[RHT_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH] = HintText::Exclude({ //obscure text Text{"#racing a ghost# leads to", /*french*/"le défi du #revenant rapide# donne", /*spanish*/"#perseguir a un fantasma# conduce a"}, }, {}, @@ -451,405 +451,405 @@ void HintTable_Init_Exclude_Overworld() { Text{"#dead Dampe's second# prize is", /*french*/"la #deuxième course d'Igor# donne", /*spanish*/"el segundo premio de #la carrera de Dampé# se trata de"} ); - hintTable[LLR_FREESTANDING_POH] = HintText::Exclude({ + hintTable[RHT_LLR_FREESTANDING_POH] = HintText::Exclude({ //obscure text Text{"in a #ranch silo# lies", /*french*/"#dans l'entrepôt de la ferme# gît", /*spanish*/"en un #granero rupestre# yace"}, }); - hintTable[GRAVEYARD_FREESTANDING_POH] = HintText::Exclude({ + hintTable[RHT_GRAVEYARD_FREESTANDING_POH] = HintText::Exclude({ //obscure text Text{"a #crate in a graveyard# hides", /*french*/"#la boîte dans le Cimetière# contient", /*spanish*/"bajo la #caja de un cementerio# yace"}, }); - hintTable[GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR] = HintText::Exclude({ + hintTable[RHT_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR] = HintText::Exclude({ //obscure text Text{"a #gravekeeper digs up#", /*french*/"#le jeu du fossoyeur# cache", /*spanish*/"cierto #sepultero desentierra#"}, }); - hintTable[ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH] = HintText::Exclude({ + hintTable[RHT_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH] = HintText::Exclude({ //obscure text Text{"on top of a #pillar in a river# lies", /*french*/"#sur un pilier au dessus du fleuve# gît", /*spanish*/"en lo alto del #pilar de un río# yace"}, }); - hintTable[ZR_NEAR_DOMAIN_FREESTANDING_POH] = HintText::Exclude({ + hintTable[RHT_ZR_NEAR_DOMAIN_FREESTANDING_POH] = HintText::Exclude({ //obscure text Text{"on a #river ledge by a waterfall# lies", /*french*/"#sur la falaise au dessus du fleuve# gît", /*spanish*/"al borde de #la entrada a una cascada# yace"}, }); - hintTable[LH_FREESTANDING_POH] = HintText::Exclude({ + hintTable[RHT_LH_FREESTANDING_POH] = HintText::Exclude({ //obscure text Text{"high on a #lab rooftop# one can find", /*french*/"#la tour d'observation du lac# cache", /*spanish*/"en lo #alto de un laboratorio# yace"}, }); - hintTable[ZF_ICEBERG_FREESTANDING_POH] = HintText::Exclude({ + hintTable[RHT_ZF_ICEBERG_FREESTANDING_POH] = HintText::Exclude({ //obscure text Text{"#floating on ice# is", /*french*/"#gisant sur la glace# gît", /*spanish*/"#flotando sobre hielo# yace"}, }); - hintTable[GV_WATERFALL_FREESTANDING_POH] = HintText::Exclude({ + hintTable[RHT_GV_WATERFALL_FREESTANDING_POH] = HintText::Exclude({ //obscure text Text{"behind a #valley waterfall# is", /*french*/"#derrière la cascade du désert# se cache", /*spanish*/"tras una #desierta cascada# yace"}, }); - hintTable[GV_CRATE_FREESTANDING_POH] = HintText::Exclude({ + hintTable[RHT_GV_CRATE_FREESTANDING_POH] = HintText::Exclude({ //obscure text Text{"a #crate in a valley# hides", /*french*/"la #boîte dans la vallée# contient", /*spanish*/"bajo la #caja de un valle# yace"}, }); - hintTable[COLOSSUS_FREESTANDING_POH] = HintText::Exclude({ + hintTable[RHT_COLOSSUS_FREESTANDING_POH] = HintText::Exclude({ //obscure text Text{"on top of an #arch of stone# lies", /*french*/"#gisant sur une arche de pierre# gît", /*spanish*/"en lo alto de un #arco de piedra# yace"}, }); - hintTable[DMT_FREESTANDING_POH] = HintText::Exclude({ + hintTable[RHT_DMT_FREESTANDING_POH] = HintText::Exclude({ //obscure text Text{"above a #mountain cavern entrance# is", /*french*/"gisant #au dessus de la caverne montagneuse# gît", /*spanish*/"en lo alto de la #entrada de una cueva en la montaña# yace"}, }); - hintTable[DMC_WALL_FREESTANDING_POH] = HintText::Exclude({ + hintTable[RHT_DMC_WALL_FREESTANDING_POH] = HintText::Exclude({ //obscure text Text{"nestled in a #volcanic wall# is", /*french*/"dans une #alcove volcanique# gît", /*spanish*/"entre unas #murallas volcánicas# yace"}, }); - hintTable[DMC_VOLCANO_FREESTANDING_POH] = HintText::Exclude({ + hintTable[RHT_DMC_VOLCANO_FREESTANDING_POH] = HintText::Exclude({ //obscure text Text{"obscured by #volcanic ash# is", /*french*/"#recouvert de cendres volcaniques# gît", /*spanish*/"bajo la #ceniza volcánica# yace"}, }); - hintTable[GF_NORTH_F1_CARPENTER] = HintText::Exclude({ + hintTable[RHT_GF_NORTH_F1_CARPENTER] = HintText::Exclude({ //obscure text Text{"#defeating Gerudo guards# reveals", /*french*/"les #geôliers Gerudo# détiennent", /*spanish*/"#derrotar a las guardas Gerudo# revela"}, }); - hintTable[GF_NORTH_F2_CARPENTER] = HintText::Exclude({ + hintTable[RHT_GF_NORTH_F2_CARPENTER] = HintText::Exclude({ //obscure text Text{"#defeating Gerudo guards# reveals", /*french*/"les #geôliers Gerudo# détiennent", /*spanish*/"#derrotar a las guardas Gerudo# revela"}, }); - hintTable[GF_SOUTH_F1_CARPENTER] = HintText::Exclude({ + hintTable[RHT_GF_SOUTH_F1_CARPENTER] = HintText::Exclude({ //obscure text Text{"#defeating Gerudo guards# reveals", /*french*/"les #geôliers Gerudo# détiennent", /*spanish*/"#derrotar a las guardas Gerudo# revela"}, }); - hintTable[GF_SOUTH_F2_CARPENTER] = HintText::Exclude({ + hintTable[RHT_GF_SOUTH_F2_CARPENTER] = HintText::Exclude({ //obscure text Text{"#defeating Gerudo guards# reveals", /*french*/"les #geôliers Gerudo# détiennent", /*spanish*/"#derrotar a las guardas Gerudo# revela"}, }); - hintTable[HF_GS_NEAR_KAK_GROTTO] = HintText::Exclude({ + hintTable[RHT_HF_GS_NEAR_KAK_GROTTO] = HintText::Exclude({ //obscure text Text{"a #spider-guarded spider in a hole# hoards", /*french*/"une #Skulltula dans un trou d'arachnides# a", /*spanish*/"una #Skulltula custodiada por otra# de un hoyo otorga"}, }); - hintTable[LLR_GS_BACK_WALL] = HintText::Exclude({ + hintTable[RHT_LLR_GS_BACK_WALL] = HintText::Exclude({ //obscure text Text{"night reveals a #spider in a ranch# holding", /*french*/"une #Skulltula sur la façade de la ferme# a", /*spanish*/"la noche revela una #Skulltula del rancho# que otorga"}, }); - hintTable[LLR_GS_RAIN_SHED] = HintText::Exclude({ + hintTable[RHT_LLR_GS_RAIN_SHED] = HintText::Exclude({ //obscure text Text{"night reveals a #spider in a ranch# holding", /*french*/"une #Skulltula sur le mur de l'enclos# a", /*spanish*/"la noche revela una #Skulltula del rancho# que otorga"}, }); - hintTable[LLR_GS_HOUSE_WINDOW] = HintText::Exclude({ + hintTable[RHT_LLR_GS_HOUSE_WINDOW] = HintText::Exclude({ //obscure text Text{"night reveals a #spider in a ranch# holding", /*french*/"une #Skulltula sur la maison de ferme# a", /*spanish*/"la noche revela una #Skulltula del rancho# que otorga"}, }); - hintTable[LLR_GS_TREE] = HintText::Exclude({ + hintTable[RHT_LLR_GS_TREE] = HintText::Exclude({ //obscure text Text{"a spider hiding in a #ranch tree# holds", /*french*/"une #Skulltula dans l'arbre de la ferme# a", /*spanish*/"una Skulltula escondida en el #árbol de un rancho# otorga"}, }); - hintTable[KF_GS_BEAN_PATCH] = HintText::Exclude({ + hintTable[RHT_KF_GS_BEAN_PATCH] = HintText::Exclude({ //obscure text Text{"a #spider buried in a forest# holds", /*french*/"une #Skulltula enterrée dans la forêt# a", /*spanish*/"una #Skulltula enterrada en un bosque# otorga"}, }); - hintTable[KF_GS_KNOW_IT_ALL_HOUSE] = HintText::Exclude({ + hintTable[RHT_KF_GS_KNOW_IT_ALL_HOUSE] = HintText::Exclude({ //obscure text Text{"night in the past reveals a #spider in a forest# holding", /*french*/"une #Skulltula derrière une cabane de la forêt# a", /*spanish*/"la noche revela en el pasado una #Skulltula del bosque# que otorga"}, }); - hintTable[KF_GS_HOUSE_OF_TWINS] = HintText::Exclude({ + hintTable[RHT_KF_GS_HOUSE_OF_TWINS] = HintText::Exclude({ //obscure text Text{"night in the future reveals a #spider in a forest# holding", /*french*/"une #Skulltula sur une cabane de la forêt# a", /*spanish*/"la noche revela en el futuro una #Skulltula del rancho# que otorga"}, }); - hintTable[LW_GS_BEAN_PATCH_NEAR_BRIDGE] = HintText::Exclude({ + hintTable[RHT_LW_GS_BEAN_PATCH_NEAR_BRIDGE] = HintText::Exclude({ //obscure text Text{"a #spider buried deep in a forest maze# holds", /*french*/"une #Skulltula enterrée dans les bois# a", /*spanish*/"una #Skulltula enterrada en un laberinto forestal# otorga"}, }); - hintTable[LW_GS_BEAN_PATCH_NEAR_THEATER] = HintText::Exclude({ + hintTable[RHT_LW_GS_BEAN_PATCH_NEAR_THEATER] = HintText::Exclude({ //obscure text Text{"a #spider buried deep in a forest maze# holds", /*french*/"une #Skulltula enterrée dans les bois# a", /*spanish*/"una #Skulltula enterrada en un laberinto forestal# otorga"}, }); - hintTable[LW_GS_ABOVE_THEATER] = HintText::Exclude({ + hintTable[RHT_LW_GS_ABOVE_THEATER] = HintText::Exclude({ //obscure text Text{"night reveals a #spider deep in a forest maze# holding", /*french*/"une #Skulltula haut perchée dans les bois# a", /*spanish*/"la noche revela una #Skulltula del laberinto forestal# que otorga"}, }); - hintTable[SFM_GS] = HintText::Exclude({ + hintTable[RHT_SFM_GS] = HintText::Exclude({ //obscure text Text{"night reveals a #spider in a forest meadow# holding", /*french*/"une #Skulltula dans le sanctuaire des bois# a", /*spanish*/"la noche revela una #Skulltula de la pradera del bosque# que otorga"}, }); - hintTable[OGC_GS] = HintText::Exclude({ + hintTable[RHT_OGC_GS] = HintText::Exclude({ //obscure text Text{"a #spider outside a tyrant's tower# holds", /*french*/"une #Skulltula parmi les ruines du château# a", /*spanish*/"una #Skulltula a las afueras de la torre de un tirano# otorga"}, }); - hintTable[HC_GS_TREE] = HintText::Exclude({ + hintTable[RHT_HC_GS_TREE] = HintText::Exclude({ //obscure text Text{"a spider hiding in a #tree outside of a castle# holds", /*french*/"une #Skulltula dans l'arbre près du château# a", /*spanish*/"una Skulltula escondida en el #árbol de las afueras de un castillo# otorga"}, }); - hintTable[MARKET_GS_GUARD_HOUSE] = HintText::Exclude({ + hintTable[RHT_MARKET_GS_GUARD_HOUSE] = HintText::Exclude({ //obscure text Text{"a #spider in a guarded crate# holds", /*french*/"une #Skulltula dans une boîte en ville# a", /*spanish*/"una #Skulltula bajo una custodiada caja# otorga"}, }); - hintTable[DMC_GS_BEAN_PATCH] = HintText::Exclude({ + hintTable[RHT_DMC_GS_BEAN_PATCH] = HintText::Exclude({ //obscure text Text{"a #spider buried in a volcano# holds", /*french*/"une #Skulltula enterrée dans un volcan# a", /*spanish*/"una #Skulltula enterrada en un volcán# otorga"}, }); - hintTable[DMT_GS_BEAN_PATCH] = HintText::Exclude({ + hintTable[RHT_DMT_GS_BEAN_PATCH] = HintText::Exclude({ //obscure text Text{"a #spider buried outside a cavern# holds", /*french*/"une #Skulltula enterrée près d'une caverne# a", /*spanish*/"una #Skulltula enterrada a la entrada de una cueva# otorga"}, }); - hintTable[DMT_GS_NEAR_KAK] = HintText::Exclude({ + hintTable[RHT_DMT_GS_NEAR_KAK] = HintText::Exclude({ //obscure text Text{"a #spider hidden in a mountain nook# holds", /*french*/"une #Skulltula cachée dans le flanc d'une montagne# a", /*spanish*/"una #Skulltula oculta en el rincón de la montaña# otorga"}, }); - hintTable[DMT_GS_ABOVE_DODONGOS_CAVERN] = HintText::Exclude({ + hintTable[RHT_DMT_GS_ABOVE_DODONGOS_CAVERN] = HintText::Exclude({ //obscure text Text{"the hammer reveals a #spider on a mountain# holding", /*french*/"une #Skulltula derrière un rocher massif près d'une caverne# a", /*spanish*/"el martillo revela #una Skulltula de la montaña# que otorga"}, }); - hintTable[DMT_GS_FALLING_ROCKS_PATH] = HintText::Exclude({ + hintTable[RHT_DMT_GS_FALLING_ROCKS_PATH] = HintText::Exclude({ //obscure text Text{"the hammer reveals a #spider on a mountain# holding", /*french*/"une #Skulltula derrière un rocher massif près du sommet d'un volcan# a", /*spanish*/"el martillo revela #una Skulltula de la montaña# que otorga"}, }); - hintTable[GC_GS_CENTER_PLATFORM] = HintText::Exclude({ + hintTable[RHT_GC_GS_CENTER_PLATFORM] = HintText::Exclude({ //obscure text Text{"a #suspended spider# in Goron City holds", /*french*/"une #Skulltula perchée dans le village Goron# a", /*spanish*/"una #Skulltula suspendida# en la Ciudad Goron otorga"}, }); - hintTable[GC_GS_BOULDER_MAZE] = HintText::Exclude({ + hintTable[RHT_GC_GS_BOULDER_MAZE] = HintText::Exclude({ //obscure text Text{"a spider in a #Goron City crate# holds", /*french*/"une #Skulltula dans une boîte du village Goron# a", /*spanish*/"una #Skulltula bajo una caja# de la Ciudad Goron otorga"}, }); - hintTable[KAK_GS_HOUSE_UNDER_CONSTRUCTION] = HintText::Exclude({ + hintTable[RHT_KAK_GS_HOUSE_UNDER_CONSTRUCTION] = HintText::Exclude({ //obscure text Text{"night in the past reveals a #spider in a town# holding", /*french*/"une #Skulltula dans le chantier de construction# a", /*spanish*/"la noche del pasado revela una #Skulltula del pueblo# que otorga"}, }); - hintTable[KAK_GS_SKULLTULA_HOUSE] = HintText::Exclude({ + hintTable[RHT_KAK_GS_SKULLTULA_HOUSE] = HintText::Exclude({ //obscure text Text{"night in the past reveals a #spider in a town# holding", /*french*/"une #Skulltula sur une maison maudite# a", /*spanish*/"la noche del pasado revela una #Skulltula del pueblo# que otorga"}, }); - hintTable[KAK_GS_GUARDS_HOUSE] = HintText::Exclude({ + hintTable[RHT_KAK_GS_GUARDS_HOUSE] = HintText::Exclude({ //obscure text Text{"night in the past reveals a #spider in a town# holding", /*french*/"une #Skulltula sur une maison de village# a", /*spanish*/"la noche del pasado revela una #Skulltula del pueblo# que otorga"}, }); - hintTable[KAK_GS_TREE] = HintText::Exclude({ + hintTable[RHT_KAK_GS_TREE] = HintText::Exclude({ //obscure text Text{"night in the past reveals a #spider in a town# holding", /*french*/"une #Skulltula dans un arbre de village# a", /*spanish*/"la noche del pasado revela una #Skulltula del pueblo# que otorga"}, }); - hintTable[KAK_GS_WATCHTOWER] = HintText::Exclude({ + hintTable[RHT_KAK_GS_WATCHTOWER] = HintText::Exclude({ //obscure text Text{"night in the past reveals a #spider in a town# holding", /*french*/"une #Skulltula sur une échelle dans un village# a", /*spanish*/"la noche del pasado revela una #Skulltula del pueblo# que otorga"}, }); - hintTable[KAK_GS_ABOVE_IMPAS_HOUSE] = HintText::Exclude({ + hintTable[RHT_KAK_GS_ABOVE_IMPAS_HOUSE] = HintText::Exclude({ //obscure text Text{"night in the future reveals a #spider in a town# holding", /*french*/"une #Skulltula au dessus d'une grande maison# a", /*spanish*/"la noche del futuro revela una #Skulltula del pueblo# que otorga"}, }); - hintTable[GRAVEYARD_GS_WALL] = HintText::Exclude({ + hintTable[RHT_GRAVEYARD_GS_WALL] = HintText::Exclude({ //obscure text Text{"night reveals a #spider in a graveyard# holding", /*french*/"une #Skulltula sur une façade du Cimetière# a", /*spanish*/"la noche revela una #Skulltula del cementerio# que otorga"}, }); - hintTable[GRAVEYARD_GS_BEAN_PATCH] = HintText::Exclude({ + hintTable[RHT_GRAVEYARD_GS_BEAN_PATCH] = HintText::Exclude({ //obscure text Text{"a #spider buried in a graveyard# holds", /*french*/"une #Skulltula enterrée dans le Cimetière# a", /*spanish*/"una #Skulltula enterrada en el cementerio# otorga"}, }); - hintTable[ZR_GS_LADDER] = HintText::Exclude({ + hintTable[RHT_ZR_GS_LADDER] = HintText::Exclude({ //obscure text Text{"night in the past reveals a #spider in a river# holding", /*french*/"une #Skulltula sur une échelle près d'une cascade# a", /*spanish*/"la noche del pasado revela una #Skulltula del río# que otorga"}, }); - hintTable[ZR_GS_TREE] = HintText::Exclude({ + hintTable[RHT_ZR_GS_TREE] = HintText::Exclude({ //obscure text Text{"a spider hiding in a #tree by a river# holds", /*french*/"une #Skulltula dans un arbre près du fleuve# a", /*spanish*/"una Skulltula escondida en el #árbol de un río# otorga"}, }); - hintTable[ZR_GS_ABOVE_BRIDGE] = HintText::Exclude({ + hintTable[RHT_ZR_GS_ABOVE_BRIDGE] = HintText::Exclude({ //obscure text Text{"night in the future reveals a #spider in a river# holding", /*french*/"une #Skulltula sur une façade près d'une cascade# a", /*spanish*/"la noche del futuro revela una #Skulltula del río# que otorga"}, }); - hintTable[ZR_GS_NEAR_RAISED_GROTTOS] = HintText::Exclude({ + hintTable[RHT_ZR_GS_NEAR_RAISED_GROTTOS] = HintText::Exclude({ //obscure text Text{"night in the future reveals a #spider in a river# holding", /*french*/"une #Skulltula sur une façade près d'une grotte du fleuve# a", /*spanish*/"la noche del futuro revela una #Skulltula del río# que otorga"}, }); - hintTable[ZD_GS_FROZEN_WATERFALL] = HintText::Exclude({ + hintTable[RHT_ZD_GS_FROZEN_WATERFALL] = HintText::Exclude({ //obscure text Text{"night reveals a #spider by a frozen waterfall# holding", /*french*/"une #Skulltula près d'une cascade gelée# a", /*spanish*/"la noche revela una #Skulltula junto a una congelada cascada# que otorga"}, }); - hintTable[ZF_GS_ABOVE_THE_LOG] = HintText::Exclude({ + hintTable[RHT_ZF_GS_ABOVE_THE_LOG] = HintText::Exclude({ //obscure text Text{"night reveals a #spider near a deity# holding", /*french*/"une #Skulltula près du gardien aquatique# a", /*spanish*/"la noche revela una #Skulltula junto a cierta deidad# que otorga"}, }); - hintTable[ZF_GS_TREE] = HintText::Exclude({ + hintTable[RHT_ZF_GS_TREE] = HintText::Exclude({ //obscure text Text{"a spider hiding in a #tree near a deity# holds", /*french*/"une #Skulltula dans un arbre dans un réservoir# a", /*spanish*/"una Skulltula escondida en el #árbol junto a cierta deidad# otorga"}, }); - hintTable[LH_GS_BEAN_PATCH] = HintText::Exclude({ + hintTable[RHT_LH_GS_BEAN_PATCH] = HintText::Exclude({ //obscure text Text{"a #spider buried by a lake# holds", /*french*/"une #Skulltula enterrée près d'un lac# a", /*spanish*/"una #Skulltula enterrada junto a un lago# otorga"}, }); - hintTable[LH_GS_SMALL_ISLAND] = HintText::Exclude({ + hintTable[RHT_LH_GS_SMALL_ISLAND] = HintText::Exclude({ //obscure text Text{"night reveals a #spider by a lake# holding", /*french*/"une #Skulltula sur un îlot du lac# a", /*spanish*/"la noche revela una #Skulltula junto a un lago# que otorga"}, }); - hintTable[LH_GS_LAB_WALL] = HintText::Exclude({ + hintTable[RHT_LH_GS_LAB_WALL] = HintText::Exclude({ //obscure text Text{"night reveals a #spider by a lake# holding", /*french*/"une #Skulltula sur le mur d'un centre de recherche# a", /*spanish*/"la noche revela una #Skulltula junto a un lago# que otorga"}, }); - hintTable[LH_GS_LAB_CRATE] = HintText::Exclude({ + hintTable[RHT_LH_GS_LAB_CRATE] = HintText::Exclude({ //obscure text Text{"a spider deed underwater in a #lab crate# holds", /*french*/"une #Skulltula dans une boîte au fond d'une cuve d'eau# a", /*spanish*/"una #Skulltula bajo la sumergida caja de un laboratorio# otorga"}, }); - hintTable[LH_GS_TREE] = HintText::Exclude({ + hintTable[RHT_LH_GS_TREE] = HintText::Exclude({ //obscure text Text{"night reveals a #spider by a lake high in a tree# holding", /*french*/"une #Skulltula dans un grand arbre du lac# a", /*spanish*/"la noche revela #una Skulltula del lago sobre un árbol# que otorga"}, }); - hintTable[GV_GS_BEAN_PATCH] = HintText::Exclude({ + hintTable[RHT_GV_GS_BEAN_PATCH] = HintText::Exclude({ //obscure text Text{"a #spider buried in a valley# holds", /*french*/"une #Skulltula enterré dans une vallée# a", /*spanish*/"una #Skulltula enterrada en un valle# otorga"}, }); - hintTable[GV_GS_SMALL_BRIDGE] = HintText::Exclude({ + hintTable[RHT_GV_GS_SMALL_BRIDGE] = HintText::Exclude({ //obscure text Text{"night in the past reveals a #spider in a valley# holding", /*french*/"une #Skulltula au dessus d'une petite cascade# a", /*spanish*/"la noche del pasado revela una #Skulltula del valle# que otorga"}, }); - hintTable[GV_GS_PILLAR] = HintText::Exclude({ + hintTable[RHT_GV_GS_PILLAR] = HintText::Exclude({ //obscure text Text{"night in the future reveals a #spider in a valley# holding", /*french*/"une #Skulltula sur une arche de pierre dans une vallée# a", /*spanish*/"la noche del futuro revela una #Skulltula del valle# que otorga"}, }); - hintTable[GV_GS_BEHIND_TENT] = HintText::Exclude({ + hintTable[RHT_GV_GS_BEHIND_TENT] = HintText::Exclude({ //obscure text Text{"night in the future reveals a #spider in a valley# holding", /*french*/"une #Skulltula derrière une tente# a", /*spanish*/"la noche del futuro revela una #Skulltula del valle# que otorga"}, }); - hintTable[GF_GS_ARCHERY_RANGE] = HintText::Exclude({ + hintTable[RHT_GF_GS_ARCHERY_RANGE] = HintText::Exclude({ //obscure text Text{"night reveals a #spider in a fortress# holding", /*french*/"une #Skulltula sur une cible de tir# a", /*spanish*/"la noche revela una #Skulltula de una fortaleza# que otorga"}, }); - hintTable[GF_GS_TOP_FLOOR] = HintText::Exclude({ + hintTable[RHT_GF_GS_TOP_FLOOR] = HintText::Exclude({ //obscure text Text{"night reveals a #spider in a fortress# holding", /*french*/"une #Skulltula au sommet d'une forteresse# a", /*spanish*/"la noche revela una #Skulltula de una fortaleza# que otorga"}, }); - hintTable[COLOSSUS_GS_BEAN_PATCH] = HintText::Exclude({ + hintTable[RHT_COLOSSUS_GS_BEAN_PATCH] = HintText::Exclude({ //obscure text Text{"a #spider buried in the desert# holds", /*french*/"une #Skulltula enterrée au pied du colosse# a", /*spanish*/"una #Skulltula enterrada en el desierto# otorga"}, }); - hintTable[COLOSSUS_GS_HILL] = HintText::Exclude({ + hintTable[RHT_COLOSSUS_GS_HILL] = HintText::Exclude({ //obscure text Text{"night reveals a #spider deep in the desert# holding", /*french*/"une #Skulltula sur une colline dans le désert# a", /*spanish*/"la noche revela una #Skulltula en las profundidades del desierto# que otorga"}, }); - hintTable[COLOSSUS_GS_TREE] = HintText::Exclude({ + hintTable[RHT_COLOSSUS_GS_TREE] = HintText::Exclude({ //obscure text Text{"night reveals a #spider deep in the desert# holding", /*french*/"une #Skulltula dans un arbre du désert# a", /*spanish*/"la noche revela una #Skulltula en las profundidades del desierto# que otorga"}, }); - hintTable[KF_SHOP_ITEM_1] = HintText::Exclude({ + hintTable[RHT_KF_SHOP_ITEM_1] = HintText::Exclude({ //obscure text Text{"a #child shopkeeper# sells", /*french*/"la #boutique Kokiri# vend", /*spanish*/"un #joven dependiente# vende"}, }); - hintTable[KF_SHOP_ITEM_2] = HintText::Exclude({ + hintTable[RHT_KF_SHOP_ITEM_2] = HintText::Exclude({ //obscure text Text{"a #child shopkeeper# sells", /*french*/"la #boutique Kokiri# vend", /*spanish*/"un #joven dependiente# vende"}, }); - hintTable[KF_SHOP_ITEM_3] = HintText::Exclude({ + hintTable[RHT_KF_SHOP_ITEM_3] = HintText::Exclude({ //obscure text Text{"a #child shopkeeper# sells", /*french*/"la #boutique Kokiri# vend", /*spanish*/"un #joven dependiente# vende"}, }); - hintTable[KF_SHOP_ITEM_4] = HintText::Exclude({ + hintTable[RHT_KF_SHOP_ITEM_4] = HintText::Exclude({ //obscure text Text{"a #child shopkeeper# sells", /*french*/"la #boutique Kokiri# vend", /*spanish*/"un #joven dependiente# vende"}, }); - hintTable[KF_SHOP_ITEM_5] = HintText::Exclude({ + hintTable[RHT_KF_SHOP_ITEM_5] = HintText::Exclude({ //obscure text Text{"a #child shopkeeper# sells", /*french*/"la #boutique Kokiri# vend", /*spanish*/"un #joven dependiente# vende"}, }); - hintTable[KF_SHOP_ITEM_6] = HintText::Exclude({ + hintTable[RHT_KF_SHOP_ITEM_6] = HintText::Exclude({ //obscure text Text{"a #child shopkeeper# sells", /*french*/"la #boutique Kokiri# vend", /*spanish*/"un #joven dependiente# vende"}, }); - hintTable[KF_SHOP_ITEM_7] = HintText::Exclude({ + hintTable[RHT_KF_SHOP_ITEM_7] = HintText::Exclude({ //obscure text Text{"a #child shopkeeper# sells", /*french*/"la #boutique Kokiri# vend", /*spanish*/"un #joven dependiente# vende"}, }); - hintTable[KF_SHOP_ITEM_8] = HintText::Exclude({ + hintTable[RHT_KF_SHOP_ITEM_8] = HintText::Exclude({ //obscure text Text{"a #child shopkeeper# sells", /*french*/"la #boutique Kokiri# vend", /*spanish*/"un #joven dependiente# vende"}, }); - hintTable[KAK_POTION_SHOP_ITEM_1] = HintText::Exclude({ + hintTable[RHT_KAK_POTION_SHOP_ITEM_1] = HintText::Exclude({ //obscure text Text{"a #potion seller# offers", /*french*/"l'#apothicaire# vend", /*spanish*/"un #vendedor de pociones# ofrece"}, }, {}, @@ -857,7 +857,7 @@ void HintTable_Init_Exclude_Overworld() { Text{"the #Kakariko Potion Shop# offers", /*french*/"l'#apothicaire de Kakariko# vend", /*spanish*/"la #tienda de pociones de Kakariko# ofrece"} ); - hintTable[KAK_POTION_SHOP_ITEM_2] = HintText::Exclude({ + hintTable[RHT_KAK_POTION_SHOP_ITEM_2] = HintText::Exclude({ //obscure text Text{"a #potion seller# offers", /*french*/"l'#apothicaire# vend", /*spanish*/"un #vendedor de pociones# ofrece"}, }, {}, @@ -865,7 +865,7 @@ void HintTable_Init_Exclude_Overworld() { Text{"the #Kakariko Potion Shop# offers", /*french*/"l'#apothicaire de Kakariko# vend", /*spanish*/"la #tienda de pociones de Kakariko# ofrece"} ); - hintTable[KAK_POTION_SHOP_ITEM_3] = HintText::Exclude({ + hintTable[RHT_KAK_POTION_SHOP_ITEM_3] = HintText::Exclude({ //obscure text Text{"a #potion seller# offers", /*french*/"l'#apothicaire# vend", /*spanish*/"un #vendedor de pociones# ofrece"}, }, {}, @@ -873,7 +873,7 @@ void HintTable_Init_Exclude_Overworld() { Text{"the #Kakariko Potion Shop# offers", /*french*/"l'#apothicaire de Kakariko# vend", /*spanish*/"la #tienda de pociones de Kakariko# ofrece"} ); - hintTable[KAK_POTION_SHOP_ITEM_4] = HintText::Exclude({ + hintTable[RHT_KAK_POTION_SHOP_ITEM_4] = HintText::Exclude({ //obscure text Text{"a #potion seller# offers", /*french*/"l'#apothicaire# vend", /*spanish*/"un #vendedor de pociones# ofrece"}, }, {}, @@ -881,7 +881,7 @@ void HintTable_Init_Exclude_Overworld() { Text{"the #Kakariko Potion Shop# offers", /*french*/"l'#apothicaire de Kakariko# vend", /*spanish*/"la #tienda de pociones de Kakariko# ofrece"} ); - hintTable[KAK_POTION_SHOP_ITEM_5] = HintText::Exclude({ + hintTable[RHT_KAK_POTION_SHOP_ITEM_5] = HintText::Exclude({ //obscure text Text{"a #potion seller# offers", /*french*/"l'#apothicaire# vend", /*spanish*/"un #vendedor de pociones# ofrece"}, }, {}, @@ -889,7 +889,7 @@ void HintTable_Init_Exclude_Overworld() { Text{"the #Kakariko Potion Shop# offers", /*french*/"l'#apothicaire de Kakariko# vend", /*spanish*/"la #tienda de pociones de Kakariko# ofrece"} ); - hintTable[KAK_POTION_SHOP_ITEM_6] = HintText::Exclude({ + hintTable[RHT_KAK_POTION_SHOP_ITEM_6] = HintText::Exclude({ //obscure text Text{"a #potion seller# offers", /*french*/"l'#apothicaire# vend", /*spanish*/"un #vendedor de pociones# ofrece"}, }, {}, @@ -897,7 +897,7 @@ void HintTable_Init_Exclude_Overworld() { Text{"the #Kakariko Potion Shop# offers", /*french*/"l'#apothicaire de Kakariko# vend", /*spanish*/"la #tienda de pociones de Kakariko# ofrece"} ); - hintTable[KAK_POTION_SHOP_ITEM_7] = HintText::Exclude({ + hintTable[RHT_KAK_POTION_SHOP_ITEM_7] = HintText::Exclude({ //obscure text Text{"a #potion seller# offers", /*french*/"l'#apothicaire# vend", /*spanish*/"un #vendedor de pociones# ofrece"}, }, {}, @@ -905,7 +905,7 @@ void HintTable_Init_Exclude_Overworld() { Text{"the #Kakariko Potion Shop# offers", /*french*/"l'#apothicaire de Kakariko# vend", /*spanish*/"la #tienda de pociones de Kakariko# ofrece"} ); - hintTable[KAK_POTION_SHOP_ITEM_8] = HintText::Exclude({ + hintTable[RHT_KAK_POTION_SHOP_ITEM_8] = HintText::Exclude({ //obscure text Text{"a #potion seller# offers", /*french*/"l'#apothicaire# vend", /*spanish*/"un #vendedor de pociones# ofrece"}, }, {}, @@ -914,48 +914,48 @@ void HintTable_Init_Exclude_Overworld() { ); - hintTable[MARKET_BOMBCHU_SHOP_ITEM_1] = HintText::Exclude({ + hintTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_1] = HintText::Exclude({ //obscure text Text{"a #Bombchu merchant# sells", /*french*/"le #marchand de Missiles# vend", /*spanish*/"un #mercader de bombchus# vende"}, }); - hintTable[MARKET_BOMBCHU_SHOP_ITEM_2] = HintText::Exclude({ + hintTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_2] = HintText::Exclude({ //obscure text Text{"a #Bombchu merchant# sells", /*french*/"le #marchand de Missiles# vend", /*spanish*/"un #mercader de bombchus# vende"}, }); - hintTable[MARKET_BOMBCHU_SHOP_ITEM_3] = HintText::Exclude({ + hintTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_3] = HintText::Exclude({ //obscure text Text{"a #Bombchu merchant# sells", /*french*/"le #marchand de Missiles# vend", /*spanish*/"un #mercader de bombchus# vende"}, }); - hintTable[MARKET_BOMBCHU_SHOP_ITEM_4] = HintText::Exclude({ + hintTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_4] = HintText::Exclude({ //obscure text Text{"a #Bombchu merchant# sells", /*french*/"le #marchand de Missiles# vend", /*spanish*/"un #mercader de bombchus# vende"}, }); - hintTable[MARKET_BOMBCHU_SHOP_ITEM_5] = HintText::Exclude({ + hintTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_5] = HintText::Exclude({ //obscure text Text{"a #Bombchu merchant# sells", /*french*/"le #marchand de Missiles# vend", /*spanish*/"un #mercader de bombchus# vende"}, }); - hintTable[MARKET_BOMBCHU_SHOP_ITEM_6] = HintText::Exclude({ + hintTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_6] = HintText::Exclude({ //obscure text Text{"a #Bombchu merchant# sells", /*french*/"le #marchand de Missiles# vend", /*spanish*/"un #mercader de bombchus# vende"}, }); - hintTable[MARKET_BOMBCHU_SHOP_ITEM_7] = HintText::Exclude({ + hintTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_7] = HintText::Exclude({ //obscure text Text{"a #Bombchu merchant# sells", /*french*/"le #marchand de Missiles# vend", /*spanish*/"un #mercader de bombchus# vende"}, }); - hintTable[MARKET_BOMBCHU_SHOP_ITEM_8] = HintText::Exclude({ + hintTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_8] = HintText::Exclude({ //obscure text Text{"a #Bombchu merchant# sells", /*french*/"le #marchand de Missiles# vend", /*spanish*/"un #mercader de bombchus# vende"}, }); - hintTable[MARKET_POTION_SHOP_ITEM_1] = HintText::Exclude({ + hintTable[RHT_MARKET_POTION_SHOP_ITEM_1] = HintText::Exclude({ //obscure text Text{"a #potion seller# offers", /*french*/"l'#apothicaire# vend", /*spanish*/"un #vendedor de pociones# ofrece"}, }, {}, @@ -963,7 +963,7 @@ void HintTable_Init_Exclude_Overworld() { Text{"the #Market Potion Shop# offers", /*french*/"l'#apothicaire dans la Place du Marché# vend", /*spanish*/"la #tienda de pociones del mercado# ofrece"} ); - hintTable[MARKET_POTION_SHOP_ITEM_2] = HintText::Exclude({ + hintTable[RHT_MARKET_POTION_SHOP_ITEM_2] = HintText::Exclude({ //obscure text Text{"a #potion seller# offers", /*french*/"l'#apothicaire# vend", /*spanish*/"un #vendedor de pociones# ofrece"}, }, {}, @@ -971,7 +971,7 @@ void HintTable_Init_Exclude_Overworld() { Text{"the #Market Potion Shop# offers", /*french*/"l'#apothicaire dans la Place du Marché# vend", /*spanish*/"la #tienda de pociones del mercado# ofrece"} ); - hintTable[MARKET_POTION_SHOP_ITEM_3] = HintText::Exclude({ + hintTable[RHT_MARKET_POTION_SHOP_ITEM_3] = HintText::Exclude({ //obscure text Text{"a #potion seller# offers", /*french*/"l'#apothicaire# vend", /*spanish*/"un #vendedor de pociones# ofrece"}, }, {}, @@ -979,7 +979,7 @@ void HintTable_Init_Exclude_Overworld() { Text{"the #Market Potion Shop# offers", /*french*/"l'#apothicaire dans la Place du Marché# vend", /*spanish*/"la #tienda de pociones del mercado# ofrece"} ); - hintTable[MARKET_POTION_SHOP_ITEM_4] = HintText::Exclude({ + hintTable[RHT_MARKET_POTION_SHOP_ITEM_4] = HintText::Exclude({ //obscure text Text{"a #potion seller# offers", /*french*/"l'#apothicaire# vend", /*spanish*/"un #vendedor de pociones# ofrece"}, }, {}, @@ -987,7 +987,7 @@ void HintTable_Init_Exclude_Overworld() { Text{"the #Market Potion Shop# offers", /*french*/"l'#apothicaire dans la Place du Marché# vend", /*spanish*/"la #tienda de pociones del mercado# ofrece"} ); - hintTable[MARKET_POTION_SHOP_ITEM_5] = HintText::Exclude({ + hintTable[RHT_MARKET_POTION_SHOP_ITEM_5] = HintText::Exclude({ //obscure text Text{"a #potion seller# offers", /*french*/"l'#apothicaire# vend", /*spanish*/"un #vendedor de pociones# ofrece"}, }, {}, @@ -995,7 +995,7 @@ void HintTable_Init_Exclude_Overworld() { Text{"the #Market Potion Shop# offers", /*french*/"l'#apothicaire dans la Place du Marché# vend", /*spanish*/"la #tienda de pociones del mercado# ofrece"} ); - hintTable[MARKET_POTION_SHOP_ITEM_6] = HintText::Exclude({ + hintTable[RHT_MARKET_POTION_SHOP_ITEM_6] = HintText::Exclude({ //obscure text Text{"a #potion seller# offers", /*french*/"l'#apothicaire# vend", /*spanish*/"un #vendedor de pociones# ofrece"}, }, {}, @@ -1003,7 +1003,7 @@ void HintTable_Init_Exclude_Overworld() { Text{"the #Market Potion Shop# offers", /*french*/"l'#apothicaire dans la Place du Marché# vend", /*spanish*/"la #tienda de pociones del mercado# ofrece"} ); - hintTable[MARKET_POTION_SHOP_ITEM_7] = HintText::Exclude({ + hintTable[RHT_MARKET_POTION_SHOP_ITEM_7] = HintText::Exclude({ //obscure text Text{"a #potion seller# offers", /*french*/"l'#apothicaire# vend", /*spanish*/"un #vendedor de pociones# ofrece"}, }, {}, @@ -1011,7 +1011,7 @@ void HintTable_Init_Exclude_Overworld() { Text{"the #Market Potion Shop# offers", /*french*/"l'#apothicaire dans la Place du Marché# vend", /*spanish*/"la #tienda de pociones del mercado# ofrece"} ); - hintTable[MARKET_POTION_SHOP_ITEM_8] = HintText::Exclude({ + hintTable[RHT_MARKET_POTION_SHOP_ITEM_8] = HintText::Exclude({ //obscure text Text{"a #potion seller# offers", /*french*/"l'#apothicaire# vend", /*spanish*/"un #vendedor de pociones# ofrece"}, }, {}, @@ -1020,335 +1020,335 @@ void HintTable_Init_Exclude_Overworld() { ); - hintTable[MARKET_BAZAAR_ITEM_1] = HintText::Exclude({ + hintTable[RHT_MARKET_BAZAAR_ITEM_1] = HintText::Exclude({ //obscure text Text{"the #Market Bazaar# offers", /*french*/"le #bazar de la Place du Marché# vend", /*spanish*/"el #bazar del mercado# ofrece"}, }); - hintTable[MARKET_BAZAAR_ITEM_2] = HintText::Exclude({ + hintTable[RHT_MARKET_BAZAAR_ITEM_2] = HintText::Exclude({ //obscure text Text{"the #Market Bazaar# offers", /*french*/"le #bazar de la Place du Marché# vend", /*spanish*/"el #bazar del mercado# ofrece"}, }); - hintTable[MARKET_BAZAAR_ITEM_3] = HintText::Exclude({ + hintTable[RHT_MARKET_BAZAAR_ITEM_3] = HintText::Exclude({ //obscure text Text{"the #Market Bazaar# offers", /*french*/"le #bazar de la Place du Marché# vend", /*spanish*/"el #bazar del mercado# ofrece"}, }); - hintTable[MARKET_BAZAAR_ITEM_4] = HintText::Exclude({ + hintTable[RHT_MARKET_BAZAAR_ITEM_4] = HintText::Exclude({ //obscure text Text{"the #Market Bazaar# offers", /*french*/"le #bazar de la Place du Marché# vend", /*spanish*/"el #bazar del mercado# ofrece"}, }); - hintTable[MARKET_BAZAAR_ITEM_5] = HintText::Exclude({ + hintTable[RHT_MARKET_BAZAAR_ITEM_5] = HintText::Exclude({ //obscure text Text{"the #Market Bazaar# offers", /*french*/"le #bazar de la Place du Marché# vend", /*spanish*/"el #bazar del mercado# ofrece"}, }); - hintTable[MARKET_BAZAAR_ITEM_6] = HintText::Exclude({ + hintTable[RHT_MARKET_BAZAAR_ITEM_6] = HintText::Exclude({ //obscure text Text{"the #Market Bazaar# offers", /*french*/"le #bazar de la Place du Marché# vend", /*spanish*/"el #bazar del mercado# ofrece"}, }); - hintTable[MARKET_BAZAAR_ITEM_7] = HintText::Exclude({ + hintTable[RHT_MARKET_BAZAAR_ITEM_7] = HintText::Exclude({ //obscure text Text{"the #Market Bazaar# offers", /*french*/"le #bazar de la Place du Marché# vend", /*spanish*/"el #bazar del mercado# ofrece"}, }); - hintTable[MARKET_BAZAAR_ITEM_8] = HintText::Exclude({ + hintTable[RHT_MARKET_BAZAAR_ITEM_8] = HintText::Exclude({ //obscure text Text{"the #Market Bazaar# offers", /*french*/"le #bazar de la Place du Marché# vend", /*spanish*/"el #bazar del mercado# ofrece"}, }); - hintTable[KAK_BAZAAR_ITEM_1] = HintText::Exclude({ + hintTable[RHT_KAK_BAZAAR_ITEM_1] = HintText::Exclude({ //obscure text Text{"the #Kakariko Bazaar# offers", /*french*/"le #bazar de Kakariko# vend", /*spanish*/"el #bazar de Kakariko# ofrece"}, }); - hintTable[KAK_BAZAAR_ITEM_2] = HintText::Exclude({ + hintTable[RHT_KAK_BAZAAR_ITEM_2] = HintText::Exclude({ //obscure text Text{"the #Kakariko Bazaar# offers", /*french*/"le #bazar de Kakariko# vend", /*spanish*/"el #bazar de Kakariko# ofrece"}, }); - hintTable[KAK_BAZAAR_ITEM_3] = HintText::Exclude({ + hintTable[RHT_KAK_BAZAAR_ITEM_3] = HintText::Exclude({ //obscure text Text{"the #Kakariko Bazaar# offers", /*french*/"le #bazar de Kakariko# vend", /*spanish*/"el #bazar de Kakariko# ofrece"}, }); - hintTable[KAK_BAZAAR_ITEM_4] = HintText::Exclude({ + hintTable[RHT_KAK_BAZAAR_ITEM_4] = HintText::Exclude({ //obscure text Text{"the #Kakariko Bazaar# offers", /*french*/"le #bazar de Kakariko# vend", /*spanish*/"el #bazar de Kakariko# ofrece"}, }); - hintTable[KAK_BAZAAR_ITEM_5] = HintText::Exclude({ + hintTable[RHT_KAK_BAZAAR_ITEM_5] = HintText::Exclude({ //obscure text Text{"the #Kakariko Bazaar# offers", /*french*/"le #bazar de Kakariko# vend", /*spanish*/"el #bazar de Kakariko# ofrece"}, }); - hintTable[KAK_BAZAAR_ITEM_6] = HintText::Exclude({ + hintTable[RHT_KAK_BAZAAR_ITEM_6] = HintText::Exclude({ //obscure text Text{"the #Kakariko Bazaar# offers", /*french*/"le #bazar de Kakariko# vend", /*spanish*/"el #bazar de Kakariko# ofrece"}, }); - hintTable[KAK_BAZAAR_ITEM_7] = HintText::Exclude({ + hintTable[RHT_KAK_BAZAAR_ITEM_7] = HintText::Exclude({ //obscure text Text{"the #Kakariko Bazaar# offers", /*french*/"le #bazar de Kakariko# vend", /*spanish*/"el #bazar de Kakariko# ofrece"}, }); - hintTable[KAK_BAZAAR_ITEM_8] = HintText::Exclude({ + hintTable[RHT_KAK_BAZAAR_ITEM_8] = HintText::Exclude({ //obscure text Text{"the #Kakariko Bazaar# offers", /*french*/"le #bazar de Kakariko# vend", /*spanish*/"el #bazar de Kakariko# ofrece"}, }); - hintTable[ZD_SHOP_ITEM_1] = HintText::Exclude({ + hintTable[RHT_ZD_SHOP_ITEM_1] = HintText::Exclude({ //obscure text Text{"a #Zora shopkeeper# sells", /*french*/"la #boutique Zora# vend", /*spanish*/"el #dependiente Zora# vende"}, }); - hintTable[ZD_SHOP_ITEM_2] = HintText::Exclude({ + hintTable[RHT_ZD_SHOP_ITEM_2] = HintText::Exclude({ //obscure text Text{"a #Zora shopkeeper# sells", /*french*/"la #boutique Zora# vend", /*spanish*/"el #dependiente Zora# vende"}, }); - hintTable[ZD_SHOP_ITEM_3] = HintText::Exclude({ + hintTable[RHT_ZD_SHOP_ITEM_3] = HintText::Exclude({ //obscure text Text{"a #Zora shopkeeper# sells", /*french*/"la #boutique Zora# vend", /*spanish*/"el #dependiente Zora# vende"}, }); - hintTable[ZD_SHOP_ITEM_4] = HintText::Exclude({ + hintTable[RHT_ZD_SHOP_ITEM_4] = HintText::Exclude({ //obscure text Text{"a #Zora shopkeeper# sells", /*french*/"la #boutique Zora# vend", /*spanish*/"el #dependiente Zora# vende"}, }); - hintTable[ZD_SHOP_ITEM_5] = HintText::Exclude({ + hintTable[RHT_ZD_SHOP_ITEM_5] = HintText::Exclude({ //obscure text Text{"a #Zora shopkeeper# sells", /*french*/"la #boutique Zora# vend", /*spanish*/"el #dependiente Zora# vende"}, }); - hintTable[ZD_SHOP_ITEM_6] = HintText::Exclude({ + hintTable[RHT_ZD_SHOP_ITEM_6] = HintText::Exclude({ //obscure text Text{"a #Zora shopkeeper# sells", /*french*/"la #boutique Zora# vend", /*spanish*/"el #dependiente Zora# vende"}, }); - hintTable[ZD_SHOP_ITEM_7] = HintText::Exclude({ + hintTable[RHT_ZD_SHOP_ITEM_7] = HintText::Exclude({ //obscure text Text{"a #Zora shopkeeper# sells", /*french*/"la #boutique Zora# vend", /*spanish*/"el #dependiente Zora# vende"}, }); - hintTable[ZD_SHOP_ITEM_8] = HintText::Exclude({ + hintTable[RHT_ZD_SHOP_ITEM_8] = HintText::Exclude({ //obscure text Text{"a #Zora shopkeeper# sells", /*french*/"la #boutique Zora# vend", /*spanish*/"el #dependiente Zora# vende"}, }); - hintTable[GC_SHOP_ITEM_1] = HintText::Exclude({ + hintTable[RHT_GC_SHOP_ITEM_1] = HintText::Exclude({ //obscure text Text{"a #Goron shopkeeper# sells", /*french*/"la #boutique Goron# vend", /*spanish*/"el #dependiente Goron# vende"}, }); - hintTable[GC_SHOP_ITEM_2] = HintText::Exclude({ + hintTable[RHT_GC_SHOP_ITEM_2] = HintText::Exclude({ //obscure text Text{"a #Goron shopkeeper# sells", /*french*/"la #boutique Goron# vend", /*spanish*/"el #dependiente Goron# vende"}, }); - hintTable[GC_SHOP_ITEM_3] = HintText::Exclude({ + hintTable[RHT_GC_SHOP_ITEM_3] = HintText::Exclude({ //obscure text Text{"a #Goron shopkeeper# sells", /*french*/"la #boutique Goron# vend", /*spanish*/"el #dependiente Goron# vende"}, }); - hintTable[GC_SHOP_ITEM_4] = HintText::Exclude({ + hintTable[RHT_GC_SHOP_ITEM_4] = HintText::Exclude({ //obscure text Text{"a #Goron shopkeeper# sells", /*french*/"la #boutique Goron# vend", /*spanish*/"el #dependiente Goron# vende"}, }); - hintTable[GC_SHOP_ITEM_5] = HintText::Exclude({ + hintTable[RHT_GC_SHOP_ITEM_5] = HintText::Exclude({ //obscure text Text{"a #Goron shopkeeper# sells", /*french*/"la #boutique Goron# vend", /*spanish*/"el #dependiente Goron# vende"}, }); - hintTable[GC_SHOP_ITEM_6] = HintText::Exclude({ + hintTable[RHT_GC_SHOP_ITEM_6] = HintText::Exclude({ //obscure text Text{"a #Goron shopkeeper# sells", /*french*/"la #boutique Goron# vend", /*spanish*/"el #dependiente Goron# vende"}, }); - hintTable[GC_SHOP_ITEM_7] = HintText::Exclude({ + hintTable[RHT_GC_SHOP_ITEM_7] = HintText::Exclude({ //obscure text Text{"a #Goron shopkeeper# sells", /*french*/"la #boutique Goron# vend", /*spanish*/"el #dependiente Goron# vende"}, }); - hintTable[GC_SHOP_ITEM_8] = HintText::Exclude({ + hintTable[RHT_GC_SHOP_ITEM_8] = HintText::Exclude({ //obscure text Text{"a #Goron shopkeeper# sells", /*french*/"la #boutique Goron# vend", /*spanish*/"el #dependiente Goron# vende"}, }); - hintTable[HF_DEKU_SCRUB_GROTTO] = HintText::Exclude({ + hintTable[RHT_HF_DEKU_SCRUB_GROTTO] = HintText::Exclude({ //obscure text Text{"a lonely #scrub in a hole# sells", /*french*/"la #peste Mojo dans une grotte de la plaine# vend", /*spanish*/"un #singular deku bajo un hoyo# de la llanura vende"}, }); - hintTable[LLR_DEKU_SCRUB_GROTTO_LEFT] = HintText::Exclude({ + hintTable[RHT_LLR_DEKU_SCRUB_GROTTO_LEFT] = HintText::Exclude({ //obscure text Text{"a #trio of scrubs# sells", /*french*/"le #trio de peste Mojo à la ferme# vend", /*spanish*/"un #trío de dekus# de una granja venden"}, }); - hintTable[LLR_DEKU_SCRUB_GROTTO_RIGHT] = HintText::Exclude({ + hintTable[RHT_LLR_DEKU_SCRUB_GROTTO_RIGHT] = HintText::Exclude({ //obscure text Text{"a #trio of scrubs# sells", /*french*/"le #trio de peste Mojo à la ferme# vend", /*spanish*/"un #trío de dekus# de una granja venden"}, }); - hintTable[LLR_DEKU_SCRUB_GROTTO_CENTER] = HintText::Exclude({ + hintTable[RHT_LLR_DEKU_SCRUB_GROTTO_CENTER] = HintText::Exclude({ //obscure text Text{"a #trio of scrubs# sells", /*french*/"le #trio de peste Mojo à la ferme# vend", /*spanish*/"un #trío de dekus# de una granja venden"}, }); - hintTable[LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT] = HintText::Exclude({ + hintTable[RHT_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT] = HintText::Exclude({ //obscure text Text{"a pair of #scrubs in the woods# sells", /*french*/"le #duo de peste Mojo près du théâtre# vend", /*spanish*/"un par de #dekus del bosque# venden"}, }); - hintTable[LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT] = HintText::Exclude({ + hintTable[RHT_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT] = HintText::Exclude({ //obscure text Text{"a pair of #scrubs in the woods# sells", /*french*/"le #duo de peste Mojo près du théâtre# vend", /*spanish*/"un par de #dekus del bosque# venden"}, }); - hintTable[LW_DEKU_SCRUB_NEAR_BRIDGE] = HintText::Exclude({ + hintTable[RHT_LW_DEKU_SCRUB_NEAR_BRIDGE] = HintText::Exclude({ //obscure text Text{"a #scrub by a bridge# sells", /*french*/"la #peste Mojo près du pont dans les bois# vend", /*spanish*/"un #deku bajo un puente# del bosque venden"}, }); - hintTable[LW_DEKU_SCRUB_GROTTO_REAR] = HintText::Exclude({ + hintTable[RHT_LW_DEKU_SCRUB_GROTTO_REAR] = HintText::Exclude({ //obscure text Text{"a #scrub underground duo# sells", /*french*/"le #duo de peste Mojo dans les sous-bois# vend", /*spanish*/"un #par de dekus subterráneos# del bosque venden"}, }); - hintTable[LW_DEKU_SCRUB_GROTTO_FRONT] = HintText::Exclude({ + hintTable[RHT_LW_DEKU_SCRUB_GROTTO_FRONT] = HintText::Exclude({ //obscure text Text{"a #scrub underground duo# sells", /*french*/"le #duo de peste Mojo dans les sous-bois# vend", /*spanish*/"un #par de dekus subterráneos# del bosque venden"}, }); - hintTable[SFM_DEKU_SCRUB_GROTTO_REAR] = HintText::Exclude({ + hintTable[RHT_SFM_DEKU_SCRUB_GROTTO_REAR] = HintText::Exclude({ //obscure text Text{"a #scrub underground duo# sells", /*french*/"le #duo de peste Mojo au cœur du sanctuaire sylvestre# vend", /*spanish*/"un #par de dekus subterráneos# de la pradera sagrada venden"}, }); - hintTable[SFM_DEKU_SCRUB_GROTTO_FRONT] = HintText::Exclude({ + hintTable[RHT_SFM_DEKU_SCRUB_GROTTO_FRONT] = HintText::Exclude({ //obscure text Text{"a #scrub underground duo# sells", /*french*/"le #duo de peste Mojo au cœur du sanctuaire sylvestre# vend", /*spanish*/"un #par de dekus subterráneos# de la pradera sagrada venden"}, }); - hintTable[GC_DEKU_SCRUB_GROTTO_LEFT] = HintText::Exclude({ + hintTable[RHT_GC_DEKU_SCRUB_GROTTO_LEFT] = HintText::Exclude({ //obscure text Text{"a #trio of scrubs# sells", /*french*/"le #trio de peste Mojo dans le village Goron# vend", /*spanish*/"un #trío de dekus# de la Ciudad Goron venden"}, }); - hintTable[GC_DEKU_SCRUB_GROTTO_RIGHT] = HintText::Exclude({ + hintTable[RHT_GC_DEKU_SCRUB_GROTTO_RIGHT] = HintText::Exclude({ //obscure text Text{"a #trio of scrubs# sells", /*french*/"le #trio de peste Mojo dans le village Goron# vend", /*spanish*/"un #trío de dekus# de la Ciudad Goron venden"}, }); - hintTable[GC_DEKU_SCRUB_GROTTO_CENTER] = HintText::Exclude({ + hintTable[RHT_GC_DEKU_SCRUB_GROTTO_CENTER] = HintText::Exclude({ //obscure text Text{"a #trio of scrubs# sells", /*french*/"le #trio de peste Mojo dans le village Goron# vend", /*spanish*/"un #trío de dekus# de la Ciudad Goron venden"}, }); - hintTable[DMC_DEKU_SCRUB_GROTTO_LEFT] = HintText::Exclude({ + hintTable[RHT_DMC_DEKU_SCRUB_GROTTO_LEFT] = HintText::Exclude({ //obscure text Text{"a #trio of scrubs# sells", /*french*/"le #trio de peste Mojo dans le volcan# vend", /*spanish*/"un #trío de dekus# del volcán venden"}, }); - hintTable[DMC_DEKU_SCRUB_GROTTO_RIGHT] = HintText::Exclude({ + hintTable[RHT_DMC_DEKU_SCRUB_GROTTO_RIGHT] = HintText::Exclude({ //obscure text Text{"a #trio of scrubs# sells", /*french*/"le #trio de peste Mojo dans le volcan# vend", /*spanish*/"un #trío de dekus# del volcán venden"}, }); - hintTable[DMC_DEKU_SCRUB_GROTTO_CENTER] = HintText::Exclude({ + hintTable[RHT_DMC_DEKU_SCRUB_GROTTO_CENTER] = HintText::Exclude({ //obscure text Text{"a #trio of scrubs# sells", /*french*/"le #trio de peste Mojo dans le volcan# vend", /*spanish*/"un #trío de dekus# del volcán venden"}, }); - hintTable[ZR_DEKU_SCRUB_GROTTO_REAR] = HintText::Exclude({ + hintTable[RHT_ZR_DEKU_SCRUB_GROTTO_REAR] = HintText::Exclude({ //obscure text Text{"a #scrub underground duo# sells", /*french*/"le #duo de peste Mojo près du fleuve# vend", /*spanish*/"un #par de dekus subterráneos# del río venden"}, }); - hintTable[ZR_DEKU_SCRUB_GROTTO_FRONT] = HintText::Exclude({ + hintTable[RHT_ZR_DEKU_SCRUB_GROTTO_FRONT] = HintText::Exclude({ //obscure text Text{"a #scrub underground duo# sells", /*french*/"le #duo de peste Mojo près du fleuve# vend", /*spanish*/"un #par de dekus subterráneos# del río venden"}, }); - hintTable[LH_DEKU_SCRUB_GROTTO_LEFT] = HintText::Exclude({ + hintTable[RHT_LH_DEKU_SCRUB_GROTTO_LEFT] = HintText::Exclude({ //obscure text Text{"a #trio of scrubs# sells", /*french*/"le #trio de peste Mojo près du lac# vend", /*spanish*/"un #trío de dekus# del lago venden"}, }); - hintTable[LH_DEKU_SCRUB_GROTTO_RIGHT] = HintText::Exclude({ + hintTable[RHT_LH_DEKU_SCRUB_GROTTO_RIGHT] = HintText::Exclude({ //obscure text Text{"a #trio of scrubs# sells", /*french*/"le #trio de peste Mojo près du lac# vend", /*spanish*/"un #trío de dekus# del lago venden"}, }); - hintTable[LH_DEKU_SCRUB_GROTTO_CENTER] = HintText::Exclude({ + hintTable[RHT_LH_DEKU_SCRUB_GROTTO_CENTER] = HintText::Exclude({ //obscure text Text{"a #trio of scrubs# sells", /*french*/"le #trio de peste Mojo près du lac# vend", /*spanish*/"un #trío de dekus# del lago venden"}, }); - hintTable[GV_DEKU_SCRUB_GROTTO_REAR] = HintText::Exclude({ + hintTable[RHT_GV_DEKU_SCRUB_GROTTO_REAR] = HintText::Exclude({ //obscure text Text{"a #scrub underground duo# sells", /*french*/"le #duo de peste Mojo près de la vallée# vend", /*spanish*/"un #par de dekus subterráneos# del valle venden"}, }); - hintTable[GV_DEKU_SCRUB_GROTTO_FRONT] = HintText::Exclude({ + hintTable[RHT_GV_DEKU_SCRUB_GROTTO_FRONT] = HintText::Exclude({ //obscure text Text{"a #scrub underground duo# sells", /*french*/"le #duo de peste Mojo près de la vallée# vend", /*spanish*/"un #par de dekus subterráneos# del valle venden"}, }); - hintTable[COLOSSUS_DEKU_SCRUB_GROTTO_FRONT] = HintText::Exclude({ + hintTable[RHT_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT] = HintText::Exclude({ //obscure text Text{"a #scrub underground duo# sells", /*french*/"le #duo de peste Mojo dans le désert# vend", /*spanish*/"un #par de dekus subterráneos# del desierto venden"}, }); - hintTable[COLOSSUS_DEKU_SCRUB_GROTTO_REAR] = HintText::Exclude({ + hintTable[RHT_COLOSSUS_DEKU_SCRUB_GROTTO_REAR] = HintText::Exclude({ //obscure text Text{"a #scrub underground duo# sells", /*french*/"le #duo de peste Mojo dans le désert# vend", /*spanish*/"un #par de dekus subterráneos# del desierto venden"}, }); - hintTable[LLR_STABLES_LEFT_COW] = HintText::Exclude({ + hintTable[RHT_LLR_STABLES_LEFT_COW] = HintText::Exclude({ //obscure text Text{"a #cow in a stable# gifts", /*french*/"la #vache dans l'étable# donne", /*spanish*/"una #vaca del establo# brinda"}, }); - hintTable[LLR_STABLES_RIGHT_COW] = HintText::Exclude({ + hintTable[RHT_LLR_STABLES_RIGHT_COW] = HintText::Exclude({ //obscure text Text{"a #cow in a stable# gifts", /*french*/"la #vache dans l'étable# donne", /*spanish*/"una #vaca del establo# brinda"}, }); - hintTable[LLR_TOWER_RIGHT_COW] = HintText::Exclude({ + hintTable[RHT_LLR_TOWER_RIGHT_COW] = HintText::Exclude({ //obscure text Text{"a #cow in a ranch silo# gifts", /*french*/"la #vache dans le silo de la ferme# donne", /*spanish*/"una #vaca del granero# brinda"}, }); - hintTable[LLR_TOWER_LEFT_COW] = HintText::Exclude({ + hintTable[RHT_LLR_TOWER_LEFT_COW] = HintText::Exclude({ //obscure text Text{"a #cow in a ranch silo# gifts", /*french*/"la #vache dans le silo de la ferme# donne", /*spanish*/"una #vaca del granero# brinda"}, }); - hintTable[KAK_IMPAS_HOUSE_COW] = HintText::Exclude({ + hintTable[RHT_KAK_IMPAS_HOUSE_COW] = HintText::Exclude({ //obscure text Text{"a #cow imprisoned in a house# protects", /*french*/"la #vache en cage# donne", /*spanish*/"una #vaca enjaulada de una casa# brinda"}, }); - hintTable[DMT_COW_GROTTO_COW] = HintText::Exclude({ + hintTable[RHT_DMT_COW_GROTTO_COW] = HintText::Exclude({ //obscure text Text{"a #cow in a luxurious hole# offers", /*french*/"la #vache dans une grotte luxueuse# donne", /*spanish*/"una #vaca de un lujoso hoyo# 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 9b9913c8c..efe4a9424 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 @@ -1,7 +1,7 @@ #include "../hint_list.hpp" void HintTable_Init_Item() { - hintTable[KOKIRI_SWORD] = HintText::Item({ + hintTable[RHT_KOKIRI_SWORD] = HintText::Item({ //obscure text Text{"a butter knife", /*french*/"un couteau à beurre", /*spanish*/"un ágil puñal"}, Text{"a starter slasher", /*french*/"une arme de débutant", /*spanish*/"una hoja de principiantes"}, @@ -14,7 +14,7 @@ void HintTable_Init_Item() { Text{"the Kokiri Sword", /*french*/"l'Épée Kokiri", /*spanish*/"la Espada Kokiri"} ); - hintTable[MASTER_SWORD] = HintText::Item({ + hintTable[RHT_MASTER_SWORD] = HintText::Item({ //obscure text Text{"evil's bane", /*french*/"le fléau du mal", /*spanish*/"la destructora del mal"}, Text{"a seven year limbo", /*french*/"une stase de sept ans", /*spanish*/"unos siete años de espera"}, @@ -26,7 +26,7 @@ void HintTable_Init_Item() { Text{"the Master Sword", /*french*/"l'Épée de Légende", /*spanish*/"la Espada Maestra"} ); - hintTable[GIANTS_KNIFE] = HintText::Item({ + hintTable[RHT_GIANTS_KNIFE] = HintText::Item({ //obscure text Text{"a fragile blade", /*french*/"une lame fragile", /*spanish*/"una frágil hoja"}, Text{"a breakable cleaver", /*french*/"un espadon de verre", /*spanish*/"un rompible acero"}, @@ -38,7 +38,7 @@ void HintTable_Init_Item() { Text{"the Giant's Knife", /*french*/"la Lame des Géants", /*spanish*/"la daga gigante"} ); - hintTable[BIGGORON_SWORD] = HintText::Item({ + hintTable[RHT_BIGGORON_SWORD] = HintText::Item({ //obscure text Text{"the biggest blade", /*french*/"une lame gigantesque", /*spanish*/"el mayor mandoble"}, Text{"a colossal cleaver", /*french*/"un espadon colossal", /*spanish*/"un estoque colosal"}, @@ -50,7 +50,7 @@ void HintTable_Init_Item() { Text{"the Biggoron Sword", /*french*/"l'Épée de Biggoron", /*spanish*/"la Espada de Biggoron"} ); - hintTable[DEKU_SHIELD] = HintText::Item({ + hintTable[RHT_DEKU_SHIELD] = HintText::Item({ //obscure text Text{"a wooden ward", /*french*/"un écu d'écorce", /*spanish*/"una protección del bosque"}, Text{"a burnable barrier", /*french*/"une protection inflammable", /*spanish*/"una barrera quemable"}, @@ -62,7 +62,7 @@ void HintTable_Init_Item() { Text{"a Deku Shield", /*french*/"un Bouclier Mojo", /*spanish*/"un escudo deku"} ); - hintTable[HYLIAN_SHIELD] = HintText::Item({ + hintTable[RHT_HYLIAN_SHIELD] = HintText::Item({ //obscure text Text{"a steel safeguard", /*french*/"une carapace d'acier", /*spanish*/"una protección de acero"}, Text{"Like Like's metal meal", /*french*/"un amuse-gueule de Pudding", /*spanish*/"un alimento de Like Like"}, @@ -74,7 +74,7 @@ void HintTable_Init_Item() { Text{"a Hylian Shield", /*french*/"un Bouclier Hylien", /*spanish*/"un escudo hyliano"} ); - hintTable[MIRROR_SHIELD] = HintText::Item({ + hintTable[RHT_MIRROR_SHIELD] = HintText::Item({ //obscure text Text{"a reflective rampart", /*french*/"un capteur de lumière", /*spanish*/"una muralla reflectora"}, Text{"Medusa's weakness", /*french*/"la faiblesse de Méduse", /*spanish*/"la debilidad de Medusa"}, @@ -87,7 +87,7 @@ void HintTable_Init_Item() { Text{"the Mirror Shield", /*french*/"le Bouclier Miroir", /*spanish*/"el escudo espejo"} ); - hintTable[GORON_TUNIC] = HintText::Item({ + hintTable[RHT_GORON_TUNIC] = HintText::Item({ //obscure text Text{"ruby robes", /*french*/"un pigment rouge", /*spanish*/"una vestimenta rubí"}, Text{"fireproof fabric", /*french*/"un trésor anti-flamme", /*spanish*/"una ignífuga prenda"}, @@ -100,7 +100,7 @@ void HintTable_Init_Item() { Text{"a Goron Tunic", /*french*/"une Tunique Goron", /*spanish*/"un sayo goron"} ); - hintTable[ZORA_TUNIC] = HintText::Item({ + hintTable[RHT_ZORA_TUNIC] = HintText::Item({ //obscure text Text{"a sapphire suit", /*french*/"un pigment bleuté", /*spanish*/"una vestidura zafiro"}, Text{"scuba gear", /*french*/"un habit de plongée", /*spanish*/"un traje impermeable"}, @@ -114,7 +114,7 @@ void HintTable_Init_Item() { Text{"a Zora Tunic", /*french*/"une Tunique Zora", /*spanish*/"un sayo zora"} ); - hintTable[IRON_BOOTS] = HintText::Item({ + hintTable[RHT_IRON_BOOTS] = HintText::Item({ //obscure text Text{"sink shoes", /*french*/"un boulet de fer", /*spanish*/"un calzado de las profundidades"}, Text{"clank cleats", /*french*/"une paire de talons bruyants", /*spanish*/"unas suelas férreas"}, @@ -128,7 +128,7 @@ void HintTable_Init_Item() { Text{"the Iron Boots", /*french*/"une paire de Bottes de plomb", /*spanish*/"las botas de hierro"} ); - hintTable[HOVER_BOOTS] = HintText::Item({ + hintTable[RHT_HOVER_BOOTS] = HintText::Item({ //obscure text Text{"butter boots", /*french*/"une paire de patins de beurre", /*spanish*/"unas suelas resvaladizas"}, Text{"sacred slippers", /*french*/"une paire de pantoufles sacrées", /*spanish*/"unos escurridizos botines"}, @@ -142,7 +142,7 @@ void HintTable_Init_Item() { ); - hintTable[ZELDAS_LETTER] = HintText::Item({ + hintTable[RHT_ZELDAS_LETTER] = HintText::Item({ //obscure text Text{"an autograph", /*french*/"un autographe", /*spanish*/"un autógrafo"}, Text{"royal stationery", /*french*/"du papier royal", /*spanish*/"un escrito real"}, @@ -152,7 +152,7 @@ void HintTable_Init_Item() { Text{"Zelda's Letter", /*french*/"la Lettre de Zelda", /*spanish*/"la carta de Zelda"} ); - hintTable[WEIRD_EGG] = HintText::Item({ + hintTable[RHT_WEIRD_EGG] = HintText::Item({ //obscure text Text{"a chicken dilemma", /*french*/"un drôle d'ovale", /*spanish*/"el dilema de la gallina"}, }, { @@ -163,7 +163,7 @@ void HintTable_Init_Item() { Text{"the Weird Egg", /*french*/"l'Oeuf Curieux", /*spanish*/"el huevo extraño"} ); - hintTable[BOOMERANG] = HintText::Item({ + hintTable[RHT_BOOMERANG] = HintText::Item({ //obscure text Text{"a banana", /*french*/"une banane", /*spanish*/"un plátano"}, Text{"a stun stick", /*french*/"un bâton étourdissant", /*spanish*/"un palo aturdidor"}, @@ -177,7 +177,7 @@ void HintTable_Init_Item() { Text{"the Boomerang", /*french*/"le Boomerang", /*spanish*/"el bumerán"} ); - hintTable[LENS_OF_TRUTH] = HintText::Item({ + hintTable[RHT_LENS_OF_TRUTH] = HintText::Item({ //obscure text Text{"a lie detector", /*french*/"un détecteur de mensonges", /*spanish*/"el detector de ilusiones"}, Text{"a ghost tracker", /*french*/"un trouve-fantôme", /*spanish*/"el rastreador paranormal"}, @@ -191,7 +191,7 @@ void HintTable_Init_Item() { Text{"the Lens of Truth", /*french*/"le Monocle de Vérité", /*spanish*/"la Lupa de la Verdad"} ); - hintTable[MEGATON_HAMMER] = HintText::Item({ + hintTable[RHT_MEGATON_HAMMER] = HintText::Item({ //obscure text Text{"the dragon smasher", /*french*/"le tueur de dragons", /*spanish*/"un destructor de dragones"}, Text{"the metal mallet", /*french*/"un outil de construction", /*spanish*/"un mazo de metal"}, @@ -204,7 +204,7 @@ void HintTable_Init_Item() { Text{"the Megaton Hammer", /*french*/"la Masse des Titans", /*spanish*/"el martillo Megatón"} ); - hintTable[STONE_OF_AGONY] = HintText::Item({ + hintTable[RHT_STONE_OF_AGONY] = HintText::Item({ //obscure text Text{"the shake stone", /*french*/"le fragment vibrant", /*spanish*/"el fragmento tintineante"}, Text{"a gray alarm", /*french*/"une alerte bleue", /*spanish*/"una azul alarma"}, @@ -217,7 +217,7 @@ void HintTable_Init_Item() { Text{"the Stone of Agony", /*french*/"la Pierre de Souffrance", /*spanish*/"la Piedra de la Agonía"} ); - hintTable[DINS_FIRE] = HintText::Item({ + hintTable[RHT_DINS_FIRE] = HintText::Item({ //obscure text Text{"an inferno", /*french*/"un brasier", /*spanish*/"un incendio"}, Text{"a heat wave", /*french*/"une vague de chaleur", /*spanish*/"una onda de calor"}, @@ -230,7 +230,7 @@ void HintTable_Init_Item() { Text{"Din's Fire", /*french*/"le Feu de Din", /*spanish*/"el Fuego de Din"} ); - hintTable[FARORES_WIND] = HintText::Item({ + hintTable[RHT_FARORES_WIND] = HintText::Item({ //obscure text Text{"teleportation", /*french*/"la téléportation", /*spanish*/"un teletransportador"}, Text{"a relocation rune", /*french*/"une rune de relocation", /*spanish*/"una runa de transporte"}, @@ -243,7 +243,7 @@ void HintTable_Init_Item() { Text{"Farore's Wind", /*french*/"le Vent de Farore", /*spanish*/"el Viento de Farore"} ); - hintTable[NAYRUS_LOVE] = HintText::Item({ + hintTable[RHT_NAYRUS_LOVE] = HintText::Item({ //obscure text Text{"a safe space", /*french*/"une bulle de cristal", /*spanish*/"una seguridad temporal"}, Text{"an impregnable aura", /*french*/"un aura impénétrable", /*spanish*/"un aura impenetrable"}, @@ -256,7 +256,7 @@ void HintTable_Init_Item() { Text{"Nayru's Love", /*french*/"l'Amour de Nayru", /*spanish*/"el Amor de Nayru"} ); - hintTable[FIRE_ARROWS] = HintText::Item({ + hintTable[RHT_FIRE_ARROWS] = HintText::Item({ //obscure text Text{"the furnace firearm" , /*french*/"une fusée solaire", /*spanish*/"el ardiente aguijón"}, Text{"the burning bolts", /*french*/"un obus enflammé", /*spanish*/"las puntas ígneas"}, @@ -269,7 +269,7 @@ void HintTable_Init_Item() { Text{"the Fire Arrows", /*french*/"les Flèches de Feu", /*spanish*/"la flecha de fuego"} ); - hintTable[ICE_ARROWS] = HintText::Item({ + hintTable[RHT_ICE_ARROWS] = HintText::Item({ //obscure text Text{"the refrigerator rocket", /*french*/"un missile pétrifiant", /*spanish*/"el misil congelador"}, Text{"the frostbite bolts", /*french*/"un froid mordant", /*spanish*/"las puntas gélidas"}, @@ -283,7 +283,7 @@ void HintTable_Init_Item() { Text{"the Ice Arrows", /*french*/"les Flèches de Glace", /*spanish*/"la flecha de hielo"} ); - hintTable[LIGHT_ARROWS] = HintText::Item({ + hintTable[RHT_LIGHT_ARROWS] = HintText::Item({ //obscure text Text{"the shining shot", /*french*/"l'arme brillante", /*spanish*/"el haz de luz"}, Text{"the luminous launcher", /*french*/"un jet de lumière", /*spanish*/"el disparo luminoso"}, @@ -297,7 +297,7 @@ void HintTable_Init_Item() { Text{"the Light Arrows", /*french*/"les Flèches de Lumière", /*spanish*/"la flecha de luz"} ); - hintTable[GERUDO_MEMBERSHIP_CARD] = HintText::Item({ + hintTable[RHT_GERUDO_MEMBERSHIP_CARD] = HintText::Item({ //obscure text Text{"a girl club membership", /*french*/"une carte de membre", /*spanish*/"una fémina membresía"}, Text{"a desert tribe's pass", /*french*/"un laissez-passer", /*spanish*/"el vale del desierto"}, @@ -308,7 +308,7 @@ void HintTable_Init_Item() { Text{"the Gerudo Membership Card", /*french*/"la Carte Gerudo", /*spanish*/"el pase de socio gerudo"} ); - hintTable[MAGIC_BEAN] = HintText::Item({ + hintTable[RHT_MAGIC_BEAN] = HintText::Item({ //obscure text Text{"a wizardly legume", /*french*/"un légume ensorcelé", /*spanish*/"una legumbre hechizada"}, }, { @@ -319,7 +319,7 @@ void HintTable_Init_Item() { Text{"a Magic Bean", /*french*/"un Haricot Magique", /*spanish*/"una judía mágica"} ); - hintTable[MAGIC_BEAN_PACK] = HintText::Item({ + hintTable[RHT_MAGIC_BEAN_PACK] = HintText::Item({ //obscure text Text{"wizardly legumes", /*french*/"un paquet de légumes ensorcelés", /*spanish*/"unas legumbres hechizadas"}, }, { @@ -330,7 +330,7 @@ void HintTable_Init_Item() { Text{"Magic Beans", /*french*/"un Paquet de Haricots Magiques", /*spanish*/"unas judías mágicas"} ); - hintTable[DOUBLE_DEFENSE] = HintText::Item({ + hintTable[RHT_DOUBLE_DEFENSE] = HintText::Item({ //obscure text Text{"a white outline", /*french*/"un rebord blanc", /*spanish*/"un contorno blanco"}, Text{"damage decrease", /*french*/"une protection supplémentaire", /*spanish*/"una reducción de daño"}, @@ -344,7 +344,7 @@ void HintTable_Init_Item() { Text{"Double Defense", /*french*/"la Double Défence", /*spanish*/"la doble defensa"} ); - hintTable[GOLD_SKULLTULA_TOKEN] = HintText::Item({ + hintTable[RHT_GOLD_SKULLTULA_TOKEN] = HintText::Item({ //obscure text Text{"proof of destruction", /*french*/"un certificat d'élimination", /*spanish*/"una prueba de la destrucción"}, Text{"an arachnid chip", /*french*/"un symbole cranien", /*spanish*/"una figura arácnida"}, @@ -359,7 +359,7 @@ void HintTable_Init_Item() { Text{"a Gold Skulltula Token", /*french*/"un Symbole de Skulltula d'or", /*spanish*/"un símbolo de skulltula dorada"} ); - hintTable[POCKET_EGG] = HintText::Item({ + hintTable[RHT_POCKET_EGG] = HintText::Item({ //obscure text Text{"a Cucco container", /*french*/"un réservoir à Cocotte", /*spanish*/"cuco contenido"}, Text{"a Cucco, eventually", /*french*/"un poussin éventuel", /*spanish*/"un futuro cuco"}, @@ -373,7 +373,7 @@ void HintTable_Init_Item() { Text{"the Pocket Egg", /*french*/"l'Oeuf de Poche", /*spanish*/"el huevo de bolsillo"} ); - hintTable[POCKET_CUCCO] = HintText::Item({ + hintTable[RHT_POCKET_CUCCO] = HintText::Item({ //obscure text Text{"a little clucker", /*french*/"un petit glousseur", /*spanish*/"un pollito chiquito"}, }, { @@ -384,7 +384,7 @@ void HintTable_Init_Item() { Text{"the Pocket Cucco", /*french*/"la Cocotte de Poche", /*spanish*/"el cuco de bolsillo"} ); - hintTable[COJIRO] = HintText::Item({ + hintTable[RHT_COJIRO] = HintText::Item({ //obscure text Text{"a cerulean capon", /*french*/"un paon azur", /*spanish*/"un cerúleo capón"}, }, { @@ -395,7 +395,7 @@ void HintTable_Init_Item() { Text{"Cojiro", /*french*/"le p'tit poulet", /*spanish*/"a Cojiro"} ); - hintTable[ODD_MUSHROOM] = HintText::Item({ + hintTable[RHT_ODD_MUSHROOM] = HintText::Item({ //obscure text Text{"a powder ingredient", /*french*/"un ingrédient à poudre", /*spanish*/"un oloroso ingrediente"}, }, { @@ -406,7 +406,7 @@ void HintTable_Init_Item() { Text{"an Odd Mushroom", /*french*/"un Champignon Suspect", /*spanish*/"un champiñón extraño"} ); - hintTable[ODD_POTION] = HintText::Item({ + hintTable[RHT_ODD_POTION] = HintText::Item({ //obscure text Text{"Granny's goodies", /*french*/"la confiserie de mamie", /*spanish*/"la especialidad de la abuela"}, }, { @@ -419,7 +419,7 @@ void HintTable_Init_Item() { Text{"an Odd Potion", /*french*/"une Mixture Suspecte", /*spanish*/"una medicina rara"} ); - hintTable[POACHERS_SAW] = HintText::Item({ + hintTable[RHT_POACHERS_SAW] = HintText::Item({ //obscure text Text{"a tree killer", /*french*/"un coupeur d'arbres", /*spanish*/"un destructor de árboles"}, }, { @@ -430,7 +430,7 @@ void HintTable_Init_Item() { Text{"the Poacher's Saw", /*french*/"la Scie du Chasseur", /*spanish*/"la sierra del furtivo"} ); - hintTable[BROKEN_SWORD] = HintText::Item({ + hintTable[RHT_BROKEN_SWORD] = HintText::Item({ //obscure text Text{"a shattered slicer", /*french*/"une arme cassée", /*spanish*/"una rebanadora rota"}, }, { @@ -442,7 +442,7 @@ void HintTable_Init_Item() { Text{"the Broken Goron's Sword", /*french*/"l'Épée Brisée de Goron", /*spanish*/"la espada goron rota"} ); - hintTable[PRESCRIPTION] = HintText::Item({ + hintTable[RHT_PRESCRIPTION] = HintText::Item({ //obscure text Text{"a pill pamphlet", /*french*/"un document urgent", /*spanish*/"un instructivo medicinal"}, Text{"a doctor's note", /*french*/"un papier médical", /*spanish*/"unas notas del doctor"}, @@ -454,7 +454,7 @@ void HintTable_Init_Item() { Text{"the Prescription", /*french*/"une Ordonnance", /*spanish*/"la receta"} ); - hintTable[EYEBALL_FROG] = HintText::Item({ + hintTable[RHT_EYEBALL_FROG] = HintText::Item({ //obscure text Text{"a perceiving polliwog", /*french*/"un amphibien", /*spanish*/"un variopinto batracio"}, }, { @@ -465,7 +465,7 @@ void HintTable_Init_Item() { Text{"the Eyeball Frog", /*french*/"le Crapaud-qui-louche", /*spanish*/"la rana de ojos saltones"} ); - hintTable[EYEDROPS] = HintText::Item({ + hintTable[RHT_EYEDROPS] = HintText::Item({ //obscure text Text{"a vision vial", /*french*/"une solution oculaire", /*spanish*/"un remedio para la vista"}, }, { @@ -476,7 +476,7 @@ void HintTable_Init_Item() { Text{"the Eyedrops", /*french*/"une phiole de Super-Gouttes", /*spanish*/"las supergotas oculares"} ); - hintTable[CLAIM_CHECK] = HintText::Item({ + hintTable[RHT_CLAIM_CHECK] = HintText::Item({ //obscure text Text{"a three day wait", /*french*/"un rendez-vous dans trois jours", /*spanish*/"unos tres días de espera"}, }, { @@ -487,11 +487,11 @@ void HintTable_Init_Item() { Text{"the Claim Check", /*french*/"un Certificat", /*spanish*/"el recibo"} ); - hintTable[PROGRESSIVE_HOOKSHOT] = HintText::Item({ + hintTable[RHT_PROGRESSIVE_HOOKSHOT] = HintText::Item({ //obscure text Text{"Dampé's keepsake", /*french*/"l'héritage d'Igor", /*spanish*/"un recuerdo de Dampé"}, Text{"the Grapple Beam", /*french*/"le rayon grippeur", /*spanish*/"una garra metálica"}, - Text{"the BOING! chain", /*french*/"la chaîne de BOING!", /*spanish*/"una cadena retráctil"}, + Text{"the RHT_BOING! chain", /*french*/"la chaîne de RHT_BOING!", /*spanish*/"una cadena retráctil"}, }, { //ambiguous text Text{"something that can grab things", /*french*/"une chose qui peut attraper", /*spanish*/"algo que pueda agarrar cosas"}, @@ -501,7 +501,7 @@ void HintTable_Init_Item() { Text{"a Hookshot", /*french*/"un Grappin", /*spanish*/"un gancho"} ); - hintTable[PROGRESSIVE_STRENGTH] = HintText::Item({ + hintTable[RHT_PROGRESSIVE_STRENGTH] = HintText::Item({ //obscure text Text{"power gloves", /*french*/"une paire de gants de travail", /*spanish*/"unos poderosos guanteletes"}, Text{"metal mittens", /*french*/"une paire de mitaines", /*spanish*/"unas manoplas metálicas"}, @@ -514,7 +514,7 @@ void HintTable_Init_Item() { Text{"a Strength Upgrade", /*french*/"une Amélioration de Force", /*spanish*/"un aumento de fuerza"} ); - hintTable[PROGRESSIVE_BOMB_BAG] = HintText::Item({ + hintTable[RHT_PROGRESSIVE_BOMB_BAG] = HintText::Item({ //obscure text Text{"an explosive container", /*french*/"un porte-grenade", /*spanish*/"un recipiente explosivo"}, Text{"a blast bag", /*french*/"un estomac de Dodongo", /*spanish*/"un zurrón de estallidos"}, @@ -527,7 +527,7 @@ void HintTable_Init_Item() { Text{"a Bomb Bag", /*french*/"un Sac de Bombes", /*spanish*/"un saco de bombas"} ); - hintTable[PROGRESSIVE_BOW] = HintText::Item({ + hintTable[RHT_PROGRESSIVE_BOW] = HintText::Item({ //obscure text Text{"an archery enabler", /*french*/"un facilitateur de tir", /*spanish*/"un tiro al blanco"}, Text{"a danger dart launcher", /*french*/"un tire-fléchette", /*spanish*/"un peligroso lanzadardos"}, @@ -539,7 +539,7 @@ void HintTable_Init_Item() { Text{"a Bow", /*french*/"l'Arc des Fées", /*spanish*/"un arco de las hadas"} ); - hintTable[PROGRESSIVE_SLINGSHOT] = HintText::Item({ + hintTable[RHT_PROGRESSIVE_SLINGSHOT] = HintText::Item({ //obscure text Text{"a seed shooter", /*french*/"un lance-noix", /*spanish*/"un lanzasemillas"}, Text{"a rubberband", /*french*/"un élastique", /*spanish*/"un tirachinas"}, @@ -552,7 +552,7 @@ void HintTable_Init_Item() { Text{"a Slingshot", /*french*/"un Lance-Pierre", /*spanish*/"una resortera de las hadas"} ); - hintTable[PROGRESSIVE_WALLET] = HintText::Item({ + hintTable[RHT_PROGRESSIVE_WALLET] = HintText::Item({ //obscure text Text{"a mo' money holder", /*french*/"un sac à sous", /*spanish*/"una cartera de dinero"}, Text{"a gem purse", /*french*/"une sacoche", /*spanish*/"un zurrón de gemas"}, @@ -565,7 +565,7 @@ void HintTable_Init_Item() { Text{"a Wallet", /*french*/"une Bourse", /*spanish*/"una bolsa de rupias"} ); - hintTable[PROGRESSIVE_SCALE] = HintText::Item({ + hintTable[RHT_PROGRESSIVE_SCALE] = HintText::Item({ //obscure text Text{"a deeper dive", /*french*/"une bulle de plongée", /*spanish*/"un profundo buceo"}, Text{"a piece of Zora", /*french*/"un morceau de Zora", /*spanish*/"un fragmento de Zora"}, @@ -577,7 +577,7 @@ void HintTable_Init_Item() { Text{"a Zora Scale", /*french*/"une Écaille Zora", /*spanish*/"una escama Zora"} ); - hintTable[PROGRESSIVE_NUT_UPGRADE] = HintText::Item({ + hintTable[RHT_PROGRESSIVE_NUT_UPGRADE] = HintText::Item({ //obscure text Text{"more nuts", /*french*/"ecnore plus de noix", /*spanish*/"más semillas de nogal"}, Text{"flashbang storage", /*french*/"un sac à noix", /*spanish*/"más frutos aturdidores"}, @@ -590,7 +590,7 @@ void HintTable_Init_Item() { Text{"Deku Nut Capacity", /*french*/"une Augmentation de Noix Mojo", /*spanish*/"un aumento de nueces deku"} ); - hintTable[PROGRESSIVE_STICK_UPGRADE] = HintText::Item({ + hintTable[RHT_PROGRESSIVE_STICK_UPGRADE] = HintText::Item({ //obscure text Text{"a lumber rack", /*french*/"un paquet de bois", /*spanish*/"más bastones"}, Text{"more flammable twigs", /*french*/"beaucoup de branches", /*spanish*/"más varas"}, @@ -602,7 +602,7 @@ void HintTable_Init_Item() { Text{"Deku Stick Capacity", /*french*/"une augmentation de bâtons Mojo", /*spanish*/"un aumento de palos deku"} ); - hintTable[PROGRESSIVE_MAGIC_METER] = HintText::Item({ + hintTable[RHT_PROGRESSIVE_MAGIC_METER] = HintText::Item({ //obscure text Text{"mystic training", /*french*/"un potentiel magique", /*spanish*/"una maestría mística"}, Text{"pixie dust", /*french*/"de la poudre de fée", /*spanish*/"un polvo de hada"}, @@ -615,7 +615,7 @@ void HintTable_Init_Item() { Text{"a Magic Meter", /*french*/"une Jauge de Magie", /*spanish*/"un aumento de poder mágico"} ); - hintTable[PROGRESSIVE_OCARINA] = HintText::Item({ + hintTable[RHT_PROGRESSIVE_OCARINA] = HintText::Item({ //obscure text Text{"a flute", /*french*/"un bec musical", /*spanish*/"un utensilio musical"}, Text{"a music maker", /*french*/"un porteur de chansons", /*spanish*/"un instrumento"}, @@ -628,7 +628,7 @@ void HintTable_Init_Item() { Text{"an Ocarina", /*french*/"un ocarina", /*spanish*/"una ocarina"} ); - hintTable[PROGRESSIVE_BOMBCHUS] = HintText::Item({ + hintTable[RHT_PROGRESSIVE_BOMBCHUS] = HintText::Item({ //obscure text Text{"mice bombs", /*french*/"un adorable explosif", /*spanish*/"unas bombas roedoras"}, Text{"proximity mice", /*french*/"une mine anti-rongeur", /*spanish*/"unos explosivos ratoncitos"}, @@ -643,7 +643,7 @@ void HintTable_Init_Item() { Text{"Bombchus", /*french*/"un paquet de Missiles", /*spanish*/"unos bombchus"} ); - hintTable[PROGRESSIVE_GORONSWORD] = HintText::Item({ + hintTable[RHT_PROGRESSIVE_GORONSWORD] = HintText::Item({ //obscure text Text{"a long blade", /*french*/"une longue lame", /*spanish*/"una gran hoja"}, Text{"a Goron weapon", /*french*/"une arme Goron", /*spanish*/"un arma goron"}, @@ -655,7 +655,7 @@ void HintTable_Init_Item() { Text{"a Goron Sword", /*french*/"une épée Goron", /*spanish*/"una espada goron"} ); - hintTable[EMPTY_BOTTLE] = HintText::Item({ + hintTable[RHT_EMPTY_BOTTLE] = HintText::Item({ //obscure text Text{"a glass container", /*french*/"un cylindre de cristal", /*spanish*/"un recipiente de cristal"}, Text{"an empty jar", /*french*/"une jarre incassable", /*spanish*/"un frasco vacío"}, @@ -668,7 +668,7 @@ void HintTable_Init_Item() { Text{"a Bottle", /*french*/"un flacon vide", /*spanish*/"una botella"} ); - hintTable[BOTTLE_WITH_MILK] = HintText::Item({ + hintTable[RHT_BOTTLE_WITH_MILK] = HintText::Item({ //obscure text Text{"cow juice", /*french*/"une source de calcium", /*spanish*/"una fuente de calcio"}, Text{"a white liquid", /*french*/"un liquide blanc", /*spanish*/"una bebida nutritiva"}, @@ -681,7 +681,7 @@ void HintTable_Init_Item() { Text{"a Milk Bottle", /*french*/"un flacon de lait", /*spanish*/"una botella de leche"} ); - hintTable[BOTTLE_WITH_RED_POTION] = HintText::Item({ + hintTable[RHT_BOTTLE_WITH_RED_POTION] = HintText::Item({ //obscure text Text{"a vitality vial", /*french*/"un mélange de vitalité", /*spanish*/"una pócima vitalicia"}, Text{"a red liquid", /*french*/"un liquide rouge", /*spanish*/"un remedio rojizo"}, @@ -693,7 +693,7 @@ void HintTable_Init_Item() { Text{"a Red Potion Bottle", /*french*/"un flacon de potion rouge", /*spanish*/"una botella de poción roja"} ); - hintTable[BOTTLE_WITH_GREEN_POTION] = HintText::Item({ + hintTable[RHT_BOTTLE_WITH_GREEN_POTION] = HintText::Item({ //obscure text Text{"a magic mixture", /*french*/"une réserve magique", /*spanish*/"un potingue mágico"}, Text{"a green liquid", /*french*/"un liquide vert", /*spanish*/"un remedio verduzco"}, @@ -705,7 +705,7 @@ void HintTable_Init_Item() { Text{"a Green Potion Bottle", /*french*/"un flacon de potion verte", /*spanish*/"una botella de poción verde"} ); - hintTable[BOTTLE_WITH_BLUE_POTION] = HintText::Item({ + hintTable[RHT_BOTTLE_WITH_BLUE_POTION] = HintText::Item({ //obscure text Text{"an ailment antidote", /*french*/"l'élixir ultime", /*spanish*/"un antídoto para el dolor"}, Text{"a blue liquid", /*french*/"un liquide bleu", /*spanish*/"un remedio índigo"}, @@ -717,7 +717,7 @@ void HintTable_Init_Item() { Text{"a Blue Potion Bottle", /*french*/"un flacon de potion bleue", /*spanish*/"una botella de poción azul"} ); - hintTable[BOTTLE_WITH_FAIRY] = HintText::Item({ + hintTable[RHT_BOTTLE_WITH_FAIRY] = HintText::Item({ //obscure text Text{"an imprisoned fairy", /*french*/"une fée emprisonnée", /*spanish*/"un hada atrapada"}, Text{"an extra life", /*french*/"une vie de rechange", /*spanish*/"una oportunidad más"}, @@ -730,7 +730,7 @@ void HintTable_Init_Item() { Text{"a Fairy Bottle", /*french*/"une fée en flacon", /*spanish*/"un hada en una botella"} ); - hintTable[BOTTLE_WITH_FISH] = HintText::Item({ + hintTable[RHT_BOTTLE_WITH_FISH] = HintText::Item({ //obscure text Text{"an aquarium", /*french*/"un aquarium", /*spanish*/"un escamado ser"}, Text{"a deity's snack", /*french*/"le repas d'un dieu marin", /*spanish*/"un tentempié de cierta deidad"}, @@ -742,7 +742,7 @@ void HintTable_Init_Item() { Text{"a Fish Bottle", /*french*/"un poisson en flacon", /*spanish*/"un pez en una botella"} ); - hintTable[BOTTLE_WITH_BLUE_FIRE] = HintText::Item({ + hintTable[RHT_BOTTLE_WITH_BLUE_FIRE] = HintText::Item({ //obscure text Text{"a conflagration canteen", /*french*/"une mystérieuse flamme", /*spanish*/"un incendio retenido"}, Text{"an icemelt jar", /*french*/"un brasier glacial", /*spanish*/"unas brasas enfrascadas"}, @@ -754,7 +754,7 @@ void HintTable_Init_Item() { Text{"a Blue Fire Bottle", /*french*/"une flamme bleue en flacon", /*spanish*/"una botella de fuego azul"} ); - hintTable[BOTTLE_WITH_BUGS] = HintText::Item({ + hintTable[RHT_BOTTLE_WITH_BUGS] = HintText::Item({ //obscure text Text{"an insectarium", /*french*/"un insectarium", /*spanish*/"unos invertebrados seres"}, Text{"Skulltula finders", /*french*/"une poignée de trouve-Skulltula", /*spanish*/"unos rastreadores de skulltulas"}, @@ -766,7 +766,7 @@ void HintTable_Init_Item() { Text{"a Bug Bottle", /*french*/"un insecte en flacon", /*spanish*/"unos insectos en una botella"} ); - hintTable[BOTTLE_WITH_POE] = HintText::Item({ + hintTable[RHT_BOTTLE_WITH_POE] = HintText::Item({ //obscure text Text{"a spooky ghost", /*french*/"un effroyable fantôme", /*spanish*/"un espantoso espectro"}, Text{"a face in the jar", /*french*/"un visage dans un bocal", /*spanish*/"una expresión enfrascada"}, @@ -778,7 +778,7 @@ void HintTable_Init_Item() { Text{"a Poe Bottle", /*french*/"un Esprit en flacon", /*spanish*/"un Poe en una botella"} ); - hintTable[BOTTLE_WITH_BIG_POE] = HintText::Item({ + hintTable[RHT_BOTTLE_WITH_BIG_POE] = HintText::Item({ //obscure text Text{"the spookiest ghost", /*french*/"un épouvantable spectre", /*spanish*/"el espectro más espeluznante"}, Text{"a sidequest spirit", /*french*/"un précieux esprit", /*spanish*/"un buen valorado espíritu"}, @@ -790,11 +790,11 @@ void HintTable_Init_Item() { Text{"a Big Poe Bottle", /*french*/"une Ame en flacon", /*spanish*/"un Gran Poe en una botella"} ); - hintTable[RUTOS_LETTER] = HintText::Item({ + hintTable[RHT_RUTOS_LETTER] = HintText::Item({ //obscure text Text{"a call for help", /*french*/"un appel au secours", /*spanish*/"una llamada de auxilio"}, Text{"the note that Mweeps", /*french*/"un message qui fait mwip", /*spanish*/"un escrito mweep"}, - Text{"an SOS call", /*french*/"un signal SOS", /*spanish*/"una nota de socorro"}, + Text{"an RHT_SOS call", /*french*/"un signal RHT_SOS", /*spanish*/"una nota de socorro"}, Text{"a fishy stationery", /*french*/"un papier mouillé", /*spanish*/"un mensaje de ayuda"}, }, { //ambiguous text @@ -804,7 +804,7 @@ void HintTable_Init_Item() { Text{"Ruto's Letter", /*french*/"la lettre de Ruto", /*spanish*/"la carta de Ruto"} ); - hintTable[ZELDAS_LULLABY] = HintText::Item({ + hintTable[RHT_ZELDAS_LULLABY] = HintText::Item({ //obscure text Text{"a song of royal slumber", /*french*/"une chanson royale", /*spanish*/"la canción real"}, Text{"a triforce tune", /*french*/"la musique sacrée", /*spanish*/"la melodía de la trifuerza"}, @@ -817,7 +817,7 @@ void HintTable_Init_Item() { Text{"Zelda's Lullaby", /*french*/"la berceuse de Zelda", /*spanish*/"la Nana de Zelda"} ); - hintTable[EPONAS_SONG] = HintText::Item({ + hintTable[RHT_EPONAS_SONG] = HintText::Item({ //obscure text Text{"an equestrian etude", /*french*/"une hymne équestre", /*spanish*/"una copla ecuestre"}, Text{"Malon's melody", /*french*/"la mélodie des vaches", /*spanish*/"la sonata de Malon"}, @@ -830,7 +830,7 @@ void HintTable_Init_Item() { Text{"Epona's Song", /*french*/"le chant d'Epona", /*spanish*/"la Canción de Epona"} ); - hintTable[SARIAS_SONG] = HintText::Item({ + hintTable[RHT_SARIAS_SONG] = HintText::Item({ //obscure text Text{"a song of dancing Gorons", /*french*/"une chanson danceuse", /*spanish*/"un pegadizo tono goron"}, Text{"Saria's phone number", /*french*/"le téléphone d'une amie", /*spanish*/"una consulta de asistencia"}, @@ -843,7 +843,7 @@ void HintTable_Init_Item() { Text{"Saria's Song", /*french*/"le chant de Saria", /*spanish*/"la Canción de Saria"} ); - hintTable[SUNS_SONG] = HintText::Item({ + hintTable[RHT_SUNS_SONG] = HintText::Item({ //obscure text Text{"Sunny Day", /*french*/"Zénith", /*spanish*/"un día soleado"}, Text{"the ReDead's bane", /*french*/"le fléau des Éffrois", /*spanish*/"la destructora de Redeads"}, @@ -857,7 +857,7 @@ void HintTable_Init_Item() { Text{"the Sun's Song", /*french*/"le chant du soleil", /*spanish*/"la Canción del Sol"} ); - hintTable[SONG_OF_TIME] = HintText::Item({ + hintTable[RHT_SONG_OF_TIME] = HintText::Item({ //obscure text Text{"a song 7 years long", /*french*/"le flot du temps", /*spanish*/"la setenada canción"}, Text{"the tune of ages", /*french*/"le Chant des Âges", /*spanish*/"la melodía eónica"}, @@ -869,7 +869,7 @@ void HintTable_Init_Item() { Text{"the Song of Time", /*french*/"le chant du temps", /*spanish*/"la Canción del tiempo"} ); - hintTable[SONG_OF_STORMS] = HintText::Item({ + hintTable[RHT_SONG_OF_STORMS] = HintText::Item({ //obscure text Text{"Rain Dance", /*french*/"Danse Pluie", /*spanish*/"la danza de la lluvia"}, Text{"a thunderstorm tune", /*french*/"une hymne foudroyante", /*spanish*/"una sonata tormentosa"}, @@ -882,7 +882,7 @@ void HintTable_Init_Item() { Text{"the Song of Storms", /*french*/"le chant des tempêtes", /*spanish*/"la Canción de la Tormenta"} ); - hintTable[MINUET_OF_FOREST] = HintText::Item({ + hintTable[RHT_MINUET_OF_FOREST] = HintText::Item({ //obscure text Text{"the song of tall trees", /*french*/"le bruit des arbres", /*spanish*/"la canción de las copas"}, Text{"an arboreal anthem", /*french*/"l'hymne sylvestre", /*spanish*/"el himno forestal"}, @@ -895,7 +895,7 @@ void HintTable_Init_Item() { Text{"the Minuet of Forest", /*french*/"le menuet de la forêt", /*spanish*/"el Minueto del bosque"} ); - hintTable[BOLERO_OF_FIRE] = HintText::Item({ + hintTable[RHT_BOLERO_OF_FIRE] = HintText::Item({ //obscure text Text{"a song of lethal lava", /*french*/"une musique enflammée", /*spanish*/"la canción de la lava"}, Text{"a red spark trail", /*french*/"une comète rouge", /*spanish*/"el sendero rubí"}, @@ -908,7 +908,7 @@ void HintTable_Init_Item() { Text{"the Bolero of Fire", /*french*/"le boléro du feu", /*spanish*/"el Bolero del fuego"} ); - hintTable[SERENADE_OF_WATER] = HintText::Item({ + hintTable[RHT_SERENADE_OF_WATER] = HintText::Item({ //obscure text Text{"a song of a damp ditch", /*french*/"le calme de l'eau", /*spanish*/"la canción del estanque"}, Text{"a blue spark trail", /*french*/"une comète bleue", /*spanish*/"el sendero zafiro"}, @@ -921,7 +921,7 @@ void HintTable_Init_Item() { Text{"the Serenade of Water", /*french*/"la sérénade de l'eau", /*spanish*/"la Serenata del agua"} ); - hintTable[REQUIEM_OF_SPIRIT] = HintText::Item({ + hintTable[RHT_REQUIEM_OF_SPIRIT] = HintText::Item({ //obscure text Text{"a song of sandy statues", /*french*/"la mélodie d'une grande statue", /*spanish*/"la canción de la gran estatua"}, Text{"an orange spark trail", /*french*/"une comète orange", /*spanish*/"el sendero ámbar"}, @@ -934,7 +934,7 @@ void HintTable_Init_Item() { Text{"the Requiem of Spirit", /*french*/"le requiem des esprits", /*spanish*/"el Réquiem del espíritu"} ); - hintTable[NOCTURNE_OF_SHADOW] = HintText::Item({ + hintTable[RHT_NOCTURNE_OF_SHADOW] = HintText::Item({ //obscure text Text{"a song of spooky spirits", /*french*/"une hymne de chair de poule", /*spanish*/"la canción de los espectros"}, Text{"a graveyard boogie", /*french*/"un boogie de fantômes", /*spanish*/"una honra fúnebre"}, @@ -948,7 +948,7 @@ void HintTable_Init_Item() { Text{"the Nocturne of Shadow", /*french*/"le nocturne de l'ombre", /*spanish*/"el Nocturno de la sombra"} ); - hintTable[PRELUDE_OF_LIGHT] = HintText::Item({ + hintTable[RHT_PRELUDE_OF_LIGHT] = HintText::Item({ //obscure text Text{"a luminous prologue melody", /*french*/"une matine illuminée", /*spanish*/"la melodía refulgente"}, Text{"a yellow spark trail", /*french*/"une comète jaune", /*spanish*/"el sendero resplandeciente"}, @@ -960,7 +960,7 @@ void HintTable_Init_Item() { //clear text Text{"the Prelude of Light", /*french*/"le prélude de la lumière", /*spanish*/"el Preludio de la luz"} ); - hintTable[DEKU_TREE_MAP] = HintText::Item({ + hintTable[RHT_DEKU_TREE_MAP] = HintText::Item({ //obscure text Text{"a mossy atlas", /*french*/"un atlas boisé", /*spanish*/"un atlas musgoso"}, Text{"some mossy blueprints", /*french*/"un plan boisé", /*spanish*/"unos planos musgosos"}, @@ -971,7 +971,7 @@ void HintTable_Init_Item() { //clear text Text{"the Deku Tree Map", /*french*/"la carte de l'Arbre Mojo", /*spanish*/"el mapa del Gran Árbol Deku"} ); - hintTable[DODONGOS_CAVERN_MAP] = HintText::Item({ + hintTable[RHT_DODONGOS_CAVERN_MAP] = HintText::Item({ //obscure text Text{"a rocky atlas", /*french*/"un atlas rocheux", /*spanish*/"un atlas rocoso"}, Text{"some rocky blueprints", /*french*/"un plan rocheux", /*spanish*/"unos planos rocosos"}, @@ -982,7 +982,7 @@ void HintTable_Init_Item() { //clear text Text{"the Dodongo's Cavern Map", /*french*/"la carte de la Caverne Dodongo", /*spanish*/"el mapa de la Cueva de los Dodongos"} ); - hintTable[JABU_JABUS_BELLY_MAP] = HintText::Item({ + hintTable[RHT_JABU_JABUS_BELLY_MAP] = HintText::Item({ //obscure text Text{"a fishy atlas", /*french*/"un atlas digéré", /*spanish*/"un atlas digesto"}, Text{"some fishy blueprints", /*french*/"un plan digéré", /*spanish*/"unos planos digestos"}, @@ -993,7 +993,7 @@ void HintTable_Init_Item() { //clear text Text{"the Jabu-Jabu's Belly Map", /*french*/"la carte de Jabu-Jabu", /*spanish*/"el mapa de la Tripa de Jabu-Jabu"} ); - hintTable[FOREST_TEMPLE_MAP] = HintText::Item({ + hintTable[RHT_FOREST_TEMPLE_MAP] = HintText::Item({ //obscure text Text{"a sylvan atlas", /*french*/"un atlas sylvestre", /*spanish*/"un atlas enselvado"}, Text{"some sylvan blueprints", /*french*/"un plan sylvestre", /*spanish*/"unos planos enselvados"}, @@ -1004,7 +1004,7 @@ void HintTable_Init_Item() { //clear text Text{"the Forest Temple Map", /*french*/"la carte du Temple de la Forêt", /*spanish*/"el mapa del Templo del Bosque"} ); - hintTable[FIRE_TEMPLE_MAP] = HintText::Item({ + hintTable[RHT_FIRE_TEMPLE_MAP] = HintText::Item({ //obscure text Text{"a molten atlas", /*french*/"un atlas fondu", /*spanish*/"un atlas fundido"}, Text{"some molten blueprints", /*french*/"un plan fondu", /*spanish*/"unos planos fundidos"}, @@ -1015,7 +1015,7 @@ void HintTable_Init_Item() { //clear text Text{"the Fire Temple Map", /*french*/"la carte du Temple du Feu", /*spanish*/"el mapa del Templo del Fuego"} ); - hintTable[WATER_TEMPLE_MAP] = HintText::Item({ + hintTable[RHT_WATER_TEMPLE_MAP] = HintText::Item({ //obscure text Text{"a wet atlas", /*french*/"un atlas humide", /*spanish*/"un atlas mojado"}, Text{"some wet blueprints", /*french*/"un plan humide", /*spanish*/"unos planos mojados"}, @@ -1026,7 +1026,7 @@ void HintTable_Init_Item() { //clear text Text{"the Water Temple Map", /*french*/"la carte du Temple de l'Eau", /*spanish*/"el mapa del Templo del Agua"} ); - hintTable[SPIRIT_TEMPLE_MAP] = HintText::Item({ + hintTable[RHT_SPIRIT_TEMPLE_MAP] = HintText::Item({ //obscure text Text{"a sandy atlas", /*french*/"un atlas sableux", /*spanish*/"un atlas arenoso"}, Text{"some sandy blueprints", /*french*/"un plan sableux", /*spanish*/"unos planos arenosos"}, @@ -1037,7 +1037,7 @@ void HintTable_Init_Item() { //clear text Text{"the Spirit Temple Map", /*french*/"la carte du Temple de l'Esprit", /*spanish*/"el mapa del Templo del Espíritu"} ); - hintTable[SHADOW_TEMPLE_MAP] = HintText::Item({ + hintTable[RHT_SHADOW_TEMPLE_MAP] = HintText::Item({ //obscure text Text{"a creepy atlas", /*french*/"un atlas sinistre", /*spanish*/"un atlas siniestra"}, Text{"some creepy blueprints", /*french*/"un plan sinistre", /*spanish*/"unos planos siniestras"}, @@ -1048,7 +1048,7 @@ void HintTable_Init_Item() { //clear text Text{"the Shadow Temple Map", /*french*/"la carte du Temple de l'Ombre", /*spanish*/"el mapa del Templo de las Sombras"} ); - hintTable[BOTTOM_OF_THE_WELL_MAP] = HintText::Item({ + hintTable[RHT_BOTTOM_OF_THE_WELL_MAP] = HintText::Item({ //obscure text Text{"a moldy atlas", /*french*/"un atlas moisi", /*spanish*/"un atlas mohoso"}, Text{"some moldy blueprints", /*french*/"un plan moisi", /*spanish*/"unos planos mohosos"}, @@ -1059,7 +1059,7 @@ void HintTable_Init_Item() { //clear text Text{"the Bottom of the Well Map", /*french*/"la carte du fond du Puits", /*spanish*/"el mapa del Fondo del pozo"} ); - hintTable[ICE_CAVERN_MAP] = HintText::Item({ + hintTable[RHT_ICE_CAVERN_MAP] = HintText::Item({ //obscure text Text{"a polar atlas", /*french*/"un atlas polaire", /*spanish*/"un atlas polar"}, Text{"some polar blueprints", /*french*/"un plan polaire", /*spanish*/"unos planos polars"}, @@ -1070,7 +1070,7 @@ void HintTable_Init_Item() { //clear text Text{"the Ice Cavern Map", /*french*/"la carte de la Caverne Polaire", /*spanish*/"el mapa de la Caverna de hielo"} ); - hintTable[DEKU_TREE_COMPASS] = HintText::Item({ + hintTable[RHT_DEKU_TREE_COMPASS] = HintText::Item({ //obscure text Text{"a mossy treasure tracker", /*french*/"un cherche-trésor boisé", /*spanish*/"un zahorí musgoso"}, Text{"a mossy magnetic needle", /*french*/"une aimant boisée", /*spanish*/"un imán musgoso"}, @@ -1081,7 +1081,7 @@ void HintTable_Init_Item() { //clear text Text{"the Deku Tree Compass", /*french*/"la boussole de l'Arbre Mojo", /*spanish*/"la brújula del Gran Árbol Deku"} ); - hintTable[DODONGOS_CAVERN_COMPASS] = HintText::Item({ + hintTable[RHT_DODONGOS_CAVERN_COMPASS] = HintText::Item({ //obscure text Text{"a rocky treasure tracker", /*french*/"un cherche-trésor rocheux", /*spanish*/"un zahorí rocoso"}, Text{"a rocky magnetic needle", /*french*/"une aimant rocheux", /*spanish*/"un imán rocoso"}, @@ -1092,7 +1092,7 @@ void HintTable_Init_Item() { //clear text Text{"the Dodongo's Cavern Compass", /*french*/"la boussole de la Caverne Dodongo", /*spanish*/"la brújula de la Cueva de los Dodongos"} ); - hintTable[JABU_JABUS_BELLY_COMPASS] = HintText::Item({ + hintTable[RHT_JABU_JABUS_BELLY_COMPASS] = HintText::Item({ //obscure text Text{"a fishy treasure tracker", /*french*/"un cherche-trésor digéré", /*spanish*/"un zahorí digesto"}, Text{"a fishy magnetic needle", /*french*/"une aimant digéré", /*spanish*/"un imán digesto"}, @@ -1103,7 +1103,7 @@ void HintTable_Init_Item() { //clear text Text{"the Jabu-Jabu's Belly Compass", /*french*/"la boussole de Jabu-Jabu", /*spanish*/"la brújula de la Tripa de Jabu-Jabu"} ); - hintTable[FOREST_TEMPLE_COMPASS] = HintText::Item({ + hintTable[RHT_FOREST_TEMPLE_COMPASS] = HintText::Item({ //obscure text Text{"a sylvan treasure tracker", /*french*/"un cherche-trésor sylvestre", /*spanish*/"un zahorí enselvado"}, Text{"a sylvan magnetic needle", /*french*/"une aimant sylvestre", /*spanish*/"un imán enselvado"}, @@ -1114,7 +1114,7 @@ void HintTable_Init_Item() { //clear text Text{"the Forest Temple Compass", /*french*/"la boussole du Temple de la Forêt", /*spanish*/"la brújula del Templo del Bosque"} ); - hintTable[FIRE_TEMPLE_COMPASS] = HintText::Item({ + hintTable[RHT_FIRE_TEMPLE_COMPASS] = HintText::Item({ //obscure text Text{"a molten treasure tracker", /*french*/"un cherche-trésor fondu", /*spanish*/"un zahorí fundido"}, Text{"a molten magnetic needle", /*french*/"une aimant fondu", /*spanish*/"un imán fundido"}, @@ -1125,7 +1125,7 @@ void HintTable_Init_Item() { //clear text Text{"the Fire Temple Compass", /*french*/"la boussole du Temple du Feu", /*spanish*/"la brújula del Templo del Fuego"} ); - hintTable[WATER_TEMPLE_COMPASS] = HintText::Item({ + hintTable[RHT_WATER_TEMPLE_COMPASS] = HintText::Item({ //obscure text Text{"a wet treasure tracker", /*french*/"un cherche-trésor humide", /*spanish*/"un zahorí mojado"}, Text{"a wet magnetic needle", /*french*/"une aimant humide", /*spanish*/"un imán mojado"}, @@ -1136,7 +1136,7 @@ void HintTable_Init_Item() { //clear text Text{"the Water Temple Compass", /*french*/"la boussole du Temple de l'Eau", /*spanish*/"la brújula del Templo del Agua"} ); - hintTable[SPIRIT_TEMPLE_COMPASS] = HintText::Item({ + hintTable[RHT_SPIRIT_TEMPLE_COMPASS] = HintText::Item({ //obscure text Text{"a sandy treasure tracker", /*french*/"un cherche-trésor sableux", /*spanish*/"un zahorí arenoso"}, Text{"a sandy magnetic needle", /*french*/"une aimant sableux", /*spanish*/"un imán arenoso"}, @@ -1147,7 +1147,7 @@ void HintTable_Init_Item() { //clear text Text{"the Spirit Temple Compass", /*french*/"la boussole du Temple de l'Esprit", /*spanish*/"la brújula del Templo del Espíritu"} ); - hintTable[SHADOW_TEMPLE_COMPASS] = HintText::Item({ + hintTable[RHT_SHADOW_TEMPLE_COMPASS] = HintText::Item({ //obscure text Text{"a creepy treasure tracker", /*french*/"un cherche-trésor sinistre", /*spanish*/"un zahorí siniestra"}, Text{"a creepy magnetic needle", /*french*/"une aimant sinistre", /*spanish*/"un imán siniestra"}, @@ -1158,7 +1158,7 @@ void HintTable_Init_Item() { //clear text Text{"the Shadow Temple Compass", /*french*/"la boussole du Temple de l'Ombre", /*spanish*/"la brújula del Templo de las Sombras"} ); - hintTable[BOTTOM_OF_THE_WELL_COMPASS] = HintText::Item({ + hintTable[RHT_BOTTOM_OF_THE_WELL_COMPASS] = HintText::Item({ //obscure text Text{"a dank treasure tracker", /*french*/"un cherche-trésor moisi", /*spanish*/"un zahorí mohoso"}, Text{"a dank magnetic needle", /*french*/"une aimant moisi", /*spanish*/"un imán mohoso"}, @@ -1169,7 +1169,7 @@ void HintTable_Init_Item() { //clear text Text{"the Bottom of the Well Compass", /*french*/"la boussole du fond du Puits", /*spanish*/"la brújula del Fondo del pozo"} ); - hintTable[ICE_CAVERN_COMPASS] = HintText::Item({ + hintTable[RHT_ICE_CAVERN_COMPASS] = HintText::Item({ //obscure text Text{"a polar treasure tracker", /*french*/"un cherche-trésor polaire", /*spanish*/"un zahorí polar"}, Text{"a polar magnetic needle", /*french*/"une aimant polaire", /*spanish*/"un imán polar"}, @@ -1180,7 +1180,7 @@ void HintTable_Init_Item() { //clear text Text{"the Ice Cavern Compass", /*french*/"la Boussole de la Caverne Polaire", /*spanish*/"la brújula de la Caverna de hielo"} ); - hintTable[FOREST_TEMPLE_BOSS_KEY] = HintText::Item({ + hintTable[RHT_FOREST_TEMPLE_BOSS_KEY] = HintText::Item({ //obscure text Text{"a sylvan master of unlocking", /*french*/"un anti-grosse porte sylvestre", /*spanish*/"la clave enselvada de un jefe"}, Text{"a sylvan dungeon's master pass", /*french*/"une clé maléfique sylvestree", /*spanish*/"el pase maestro enselvado"}, @@ -1191,7 +1191,7 @@ void HintTable_Init_Item() { //clear text Text{"the Forest Temple Boss Key", /*french*/"la Clé d'Or du Temple de la Forêt", /*spanish*/"la gran llave del Templo del Bosque"} ); - hintTable[FIRE_TEMPLE_BOSS_KEY] = HintText::Item({ + hintTable[RHT_FIRE_TEMPLE_BOSS_KEY] = HintText::Item({ //obscure text Text{"a molten master of unlocking", /*french*/"un anti-grosse porte fondu", /*spanish*/"la clave fundido de un jefe"}, Text{"a molten dungeon's master pass", /*french*/"une clé maléfique fondu", /*spanish*/"el pase maestro fundido"}, @@ -1202,7 +1202,7 @@ void HintTable_Init_Item() { //clear text Text{"the Fire Temple Boss Key", /*french*/"la Clé d'Or du Temple du Feu", /*spanish*/"la gran llave del Templo del Fuego"} ); - hintTable[WATER_TEMPLE_BOSS_KEY] = HintText::Item({ + hintTable[RHT_WATER_TEMPLE_BOSS_KEY] = HintText::Item({ //obscure text Text{"a wet master of unlocking", /*french*/"un anti-grosse porte humide", /*spanish*/"la clave mojado de un jefe"}, Text{"a wet dungeon's master pass", /*french*/"une clé maléfique humide", /*spanish*/"el pase maestro mojado"}, @@ -1213,7 +1213,7 @@ void HintTable_Init_Item() { //clear text Text{"the Water Temple Boss Key", /*french*/"la Clé d'Or du Temple de l'Eau", /*spanish*/"la gran llave del Templo del Agua"} ); - hintTable[SPIRIT_TEMPLE_BOSS_KEY] = HintText::Item({ + hintTable[RHT_SPIRIT_TEMPLE_BOSS_KEY] = HintText::Item({ //obscure text Text{"a sandy master of unlocking", /*french*/"un anti-grosse porte sableux", /*spanish*/"la clave arenoso de un jefe"}, Text{"a sandy dungeon's master pass", /*french*/"une clé maléfique sableux", /*spanish*/"el pase maestro arenoso"}, @@ -1224,7 +1224,7 @@ void HintTable_Init_Item() { //clear text Text{"the Spirit Temple Boss Key", /*french*/"la Clé d'Or du Temple de l'Esprit", /*spanish*/"la gran llave del Templo del Espíritu"} ); - hintTable[SHADOW_TEMPLE_BOSS_KEY] = HintText::Item({ + hintTable[RHT_SHADOW_TEMPLE_BOSS_KEY] = HintText::Item({ //obscure text Text{"a creepy master of unlocking", /*french*/"un anti-grosse porte sinistre", /*spanish*/"la clave siniestra de un jefe"}, Text{"a creepy dungeon's master pass", /*french*/"une clé maléfique sinistre", /*spanish*/"el pase maestro siniestra"}, @@ -1235,7 +1235,7 @@ void HintTable_Init_Item() { //clear text Text{"the Shadow Temple Boss Key", /*french*/"la Clé d'Or du Temple de l'Ombre", /*spanish*/"la gran llave del Templo de las Sombras"} ); - hintTable[GANONS_CASTLE_BOSS_KEY] = HintText::Item({ + hintTable[RHT_GANONS_CASTLE_BOSS_KEY] = HintText::Item({ //obscure text Text{"a final master of unlocking", /*french*/"un anti-grosse porte final", /*spanish*/"la clave final de un jefe"}, Text{"a final dungeon's master pass", /*french*/"une clé maléfique final", /*spanish*/"el pase maestro final"}, @@ -1246,7 +1246,7 @@ void HintTable_Init_Item() { //clear text Text{"the Ganon's Castle Boss Key", /*french*/"la Clé d'Or du Château de Ganon", /*spanish*/"la gran llave del Castillo de Ganon"} ); - hintTable[FOREST_TEMPLE_SMALL_KEY] = HintText::Item({ + hintTable[RHT_FOREST_TEMPLE_SMALL_KEY] = HintText::Item({ //obscure text Text{"a sylvan tool for unlocking", /*french*/"un anti-porte sylvestre", /*spanish*/"una clave de una entrada enselvada"}, Text{"a sylvan dungeon pass", /*french*/"le rêve sylvestre d'un prisonnier", /*spanish*/"un pase de una mazmorra enselvada"}, @@ -1259,7 +1259,7 @@ void HintTable_Init_Item() { //clear text Text{"a Forest Temple Small Key", /*french*/"une petite clé du Temple de la Forêt", /*spanish*/"una llave pequeña del Templo del Bosque"} ); - hintTable[FIRE_TEMPLE_SMALL_KEY] = HintText::Item({ + hintTable[RHT_FIRE_TEMPLE_SMALL_KEY] = HintText::Item({ //obscure text Text{"a molten tool for unlocking", /*french*/"un anti-porte fondu", /*spanish*/"una clave de una entrada fundida"}, Text{"a molten dungeon pass", /*french*/"le rêve fondu d'un prisonnier", /*spanish*/"un pase de una mazmorra fundida"}, @@ -1272,7 +1272,7 @@ void HintTable_Init_Item() { //clear text Text{"a Fire Temple Small Key", /*french*/"une petite clé du Temple du Feu", /*spanish*/"una llave pequeña del Templo del Fuego"} ); - hintTable[WATER_TEMPLE_SMALL_KEY] = HintText::Item({ + hintTable[RHT_WATER_TEMPLE_SMALL_KEY] = HintText::Item({ //obscure text Text{"a wet tool for unlocking", /*french*/"un anti-porte humide", /*spanish*/"una clave de una entrada mojada"}, Text{"a wet dungeon pass", /*french*/"le rêve humide d'un prisonnier", /*spanish*/"un pase de una mazmorra mojada"}, @@ -1285,7 +1285,7 @@ void HintTable_Init_Item() { //clear text Text{"a Water Temple Small Key", /*french*/"une petite clé du Temple de l'Eau", /*spanish*/"una llave pequeña del Templo del Agua"} ); - hintTable[SPIRIT_TEMPLE_SMALL_KEY] = HintText::Item({ + hintTable[RHT_SPIRIT_TEMPLE_SMALL_KEY] = HintText::Item({ //obscure text Text{"a sandy tool for unlocking", /*french*/"un anti-porte sableux", /*spanish*/"una clave de una entrada arenosa"}, Text{"a sandy dungeon pass", /*french*/"le rêve sableux d'un prisonnier", /*spanish*/"un pase de una mazmorra arenosa"}, @@ -1298,7 +1298,7 @@ void HintTable_Init_Item() { //clear text Text{"a Spirit Temple Small Key", /*french*/"une petite clé du Temple de l'Esprit", /*spanish*/"una llave pequeña del Templo del Espíritu"} ); - hintTable[SHADOW_TEMPLE_SMALL_KEY] = HintText::Item({ + hintTable[RHT_SHADOW_TEMPLE_SMALL_KEY] = HintText::Item({ //obscure text Text{"a creepy tool for unlocking", /*french*/"un anti-porte sinistre", /*spanish*/"una clave de una entrada siniestra:a"}, Text{"a creepy dungeon pass", /*french*/"le rêve sinistre d'un prisonnier", /*spanish*/"un pase de una mazmorra siniestra:a"}, @@ -1311,7 +1311,7 @@ void HintTable_Init_Item() { //clear text Text{"a Shadow Temple Small Key", /*french*/"une petite clé du Temple de l'Ombre", /*spanish*/"una llave pequeña del Templo de las Sombras"} ); - hintTable[GERUDO_TRAINING_GROUNDS_SMALL_KEY] = HintText::Item({ + hintTable[RHT_GERUDO_TRAINING_GROUNDS_SMALL_KEY] = HintText::Item({ //obscure text Text{"a labyrinthian tool for unlocking", /*french*/"un anti-porte labyrinthique", /*spanish*/"una clave de una entrada laberíntica"}, Text{"a labyrinthian dungeon pass", /*french*/"le rêve labyrinthique d'un prisonnier", /*spanish*/"un pase de una mazmorra laberíntica"}, @@ -1324,7 +1324,7 @@ void HintTable_Init_Item() { //clear text Text{"a Gerudo Training Ground Small Key", /*french*/"une petite clé du Gymnase Gerudo", /*spanish*/"una llave pequeña del Centro de Instrucción Gerudo"} ); - hintTable[GERUDO_FORTRESS_SMALL_KEY] = HintText::Item({ + hintTable[RHT_GERUDO_FORTRESS_SMALL_KEY] = HintText::Item({ //obscure text Text{"an imprisoned tool for unlocking", /*french*/"un anti-porte emprisonné", /*spanish*/"una clave de una entrada encarcelada"}, Text{"an imprisoned dungeon pass", /*french*/"le rêve emprisonné d'un prisonnier", /*spanish*/"un pase de una mazmorra encarcelada"}, @@ -1337,7 +1337,7 @@ void HintTable_Init_Item() { //clear text Text{"a Gerudo Fortress Small Key", /*french*/"une petite clé de la Repaire des Voleurs", /*spanish*/"una llave pequeña de la Fortaleza Gerudo"} ); - hintTable[BOTTOM_OF_THE_WELL_SMALL_KEY] = HintText::Item({ + hintTable[RHT_BOTTOM_OF_THE_WELL_SMALL_KEY] = HintText::Item({ //obscure text Text{"a moldy tool for unlocking", /*french*/"un anti-porte moisi", /*spanish*/"una clave de una entrada mohosa"}, Text{"a moldy dungeon pass", /*french*/"le rêve moisi d'un prisonnier", /*spanish*/"un pase de una mazmorra mohosa"}, @@ -1350,7 +1350,7 @@ void HintTable_Init_Item() { //clear text Text{"a Bottom of the Well Small Key", /*french*/"une petite clé du fond du Puits", /*spanish*/"una llave pequeña del Fondo del pozo"} ); - hintTable[GANONS_CASTLE_SMALL_KEY] = HintText::Item({ + hintTable[RHT_GANONS_CASTLE_SMALL_KEY] = HintText::Item({ //obscure text Text{"a final tool for unlocking", /*french*/"un anti-porte final", /*spanish*/"una clave de una entrada final"}, Text{"a final dungeon pass", /*french*/"le rêve final d'un prisonnier", /*spanish*/"un pase de una mazmorra final"}, @@ -1363,7 +1363,7 @@ void HintTable_Init_Item() { //clear text Text{"a Ganon's Castle Small Key", /*french*/"une petite clé du Château de Ganon", /*spanish*/"una llave pequeña del Castillo de Ganon"} ); - hintTable[FOREST_TEMPLE_KEY_RING] = HintText::Item({ + hintTable[RHT_FOREST_TEMPLE_KEY_RING] = HintText::Item({ //obscure text Text{"a sylvan toolbox for unlocking", /*french*/"des anti-portes sylvestres", /*spanish*/"un conjunto silvestre de cerrajero"}, Text{"a sylvan dungeon season pass", /*french*/"les rêves sylvestres d'un prisonnier", /*spanish*/"un pase vip de mazmorras silvestre"}, @@ -1376,7 +1376,7 @@ void HintTable_Init_Item() { //clear text Text{"a Forest Temple Key Ring", /*french*/"un trousseau de clés du Temple de la Forêt", /*spanish*/"un llavero del Templo del Bosque"} ); - hintTable[FIRE_TEMPLE_KEY_RING] = HintText::Item({ + hintTable[RHT_FIRE_TEMPLE_KEY_RING] = HintText::Item({ //obscure text Text{"a molten toolbox for unlocking", /*french*/"des anti-portes fondus", /*spanish*/"un conjunto fundido de cerrajero"}, Text{"a molten dungeon season pass", /*french*/"les rêves fondus d'un prisonnier", /*spanish*/"un pase vip de mazmorras fundido"}, @@ -1389,7 +1389,7 @@ void HintTable_Init_Item() { //clear text Text{"a Fire Temple Key Ring", /*french*/"un trousseau de clés du Temple du Feu", /*spanish*/"un llavero del Templo del Fuego"} ); - hintTable[WATER_TEMPLE_KEY_RING] = HintText::Item({ + hintTable[RHT_WATER_TEMPLE_KEY_RING] = HintText::Item({ //obscure text Text{"a wet toolbox for unlocking", /*french*/"des anti-portes humides", /*spanish*/"un conjunto abisal de cerrajero"}, Text{"a wet dungeon season pass", /*french*/"les rêves humides d'un prisonnier", /*spanish*/"un pase vip de mazmorras abisal"}, @@ -1402,7 +1402,7 @@ void HintTable_Init_Item() { //clear text Text{"a Water Temple Key Ring", /*french*/"un trousseau de clés du Temple de l'Eau", /*spanish*/"un llavero del Templo del Agua"} ); - hintTable[SPIRIT_TEMPLE_KEY_RING] = HintText::Item({ + hintTable[RHT_SPIRIT_TEMPLE_KEY_RING] = HintText::Item({ //obscure text Text{"a sandy toolbox for unlocking", /*french*/"des anti-portes sableux", /*spanish*/"un conjunto arenoso de cerrajero"}, Text{"a sandy dungeon season pass", /*french*/"les rêves sableux d'un prisonnier", /*spanish*/"un pase vip de mazmorras arenoso"}, @@ -1415,7 +1415,7 @@ void HintTable_Init_Item() { //clear text Text{"a Spirit Temple Key Ring", /*french*/"un trousseau de clés du Temple de l'Esprit", /*spanish*/"un llavero del Templo del Espíritu"} ); - hintTable[SHADOW_TEMPLE_KEY_RING] = HintText::Item({ + hintTable[RHT_SHADOW_TEMPLE_KEY_RING] = HintText::Item({ //obscure text Text{"a creepy toolbox for unlocking", /*french*/"des anti-portes sinistres", /*spanish*/"un conjunto tenebroso de cerrajero"}, Text{"a creepy dungeon season pass", /*french*/"les rêves sinistres d'un prisonnier", /*spanish*/"un pase vip de mazmorras tenebroso"}, @@ -1428,7 +1428,7 @@ void HintTable_Init_Item() { //clear text Text{"a Shadow Temple Key Ring", /*french*/"un trousseau de clés du Temple de l'Ombre", /*spanish*/"un llavero del Templo de las Sombras"} ); - hintTable[GERUDO_TRAINING_GROUNDS_KEY_RING] = HintText::Item({ + hintTable[RHT_GERUDO_TRAINING_GROUNDS_KEY_RING] = HintText::Item({ //obscure text Text{"a labyrinthian toolbox for unlocking", /*french*/"des anti-portes labyrinthiques", /*spanish*/"un conjunto laberíntico de cerrajero"}, Text{"a labyrinthian dungeon season pass", /*french*/"les rêves labyrinthiques d'un prisonnier", /*spanish*/"un pase vip de mazmorras laberíntico"}, @@ -1441,7 +1441,7 @@ void HintTable_Init_Item() { //clear text Text{"a Gerudo Training Ground Key Ring", /*french*/"un trousseau de clés du Gymnase Gerudo", /*spanish*/"un llavero del Centro de Instrucción Gerudo"} ); - hintTable[GERUDO_FORTRESS_KEY_RING] = HintText::Item({ + hintTable[RHT_GERUDO_FORTRESS_KEY_RING] = HintText::Item({ //obscure text Text{"an imprisoned toolbox for unlocking", /*french*/"des anti-portes emprisonnés", /*spanish*/"un conjunto enjaulado de cerrajero"}, Text{"an imprisoned dungeon season pass", /*french*/"les rêves emprisonnés d'un prisonnier", /*spanish*/"un pase vip de una mazmorra enjaulado"}, @@ -1454,7 +1454,7 @@ void HintTable_Init_Item() { //clear text Text{"a Gerudo Fortress Key Ring", /*french*/"un trousseau de clés de la Repaire des Voleurs", /*spanish*/"un llavero de la Fortaleza Gerudo"} ); - hintTable[BOTTOM_OF_THE_WELL_KEY_RING] = HintText::Item({ + hintTable[RHT_BOTTOM_OF_THE_WELL_KEY_RING] = HintText::Item({ //obscure text Text{"a moldy toolbox for unlocking", /*french*/"des anti-portes moisis", /*spanish*/"un conjunto subterráneo de cerrajero"}, Text{"a moldy dungeon season pass", /*french*/"les rêves moisis d'un prisonnier", /*spanish*/"un pase vip de una mazmorra subterráneo"}, @@ -1467,7 +1467,7 @@ void HintTable_Init_Item() { //clear text Text{"a Bottom of the Well Key Ring", /*french*/"un trousseau de clés du fond du Puits", /*spanish*/"un llavero del Fondo del pozo"} ); - hintTable[GANONS_CASTLE_KEY_RING] = HintText::Item({ + hintTable[RHT_GANONS_CASTLE_KEY_RING] = HintText::Item({ //obscure text Text{"a final toolbox for unlocking", /*french*/"des anti-portes finaux", /*spanish*/"un conjunto decisivo de cerrajero"}, Text{"a final dungeon season pass", /*french*/"les rêves finaux d'un prisonnier", /*spanish*/"un pase vip de una mazmorra decisivo"}, @@ -1481,7 +1481,7 @@ void HintTable_Init_Item() { Text{"a Ganon's Castle Key Ring", /*french*/"un trousseau de clés du Château de Ganon", /*spanish*/"un llavero del Castillo de Ganon"} ); - hintTable[TREASURE_GAME_SMALL_KEY] = HintText::Item({ + hintTable[RHT_TREASURE_GAME_SMALL_KEY] = HintText::Item({ //obscure text Text{"a gambler's tool for unlocking", /*french*/"un anti-porte de parieur", /*spanish*/"una clave de un juego de azar"}, Text{"a gambler's dungeon pass", /*french*/"le rêve d'un prisonnier parieur", /*spanish*/"un pase de un juego de azar"}, @@ -1495,7 +1495,7 @@ void HintTable_Init_Item() { Text{"a Treasure Chest Shop Small Key", /*french*/"une petite clé de la chasse aux trésors", /*spanish*/"una llave pequeña del Cofre del Tesoro"} ); - hintTable[KOKIRI_EMERALD] = HintText::Item({ + hintTable[RHT_KOKIRI_EMERALD] = HintText::Item({ //obscure text Text{"a green stone", /*french*/"une pierre verte", /*spanish*/"una piedra verde"}, Text{"a gift before death", /*french*/"le dernier souffle d'un arbre", /*spanish*/"un obsequio testamentario"}, @@ -1507,7 +1507,7 @@ void HintTable_Init_Item() { Text{"the Kokiri Emerald", /*french*/"l'Émeraude Kokiri", /*spanish*/"la Esmeralda de los Kokiri"} ); - hintTable[GORON_RUBY] = HintText::Item({ + hintTable[RHT_GORON_RUBY] = HintText::Item({ //obscure text Text{"a red stone", /*french*/"une pierre rouge", /*spanish*/"una piedra carmín"}, Text{"sworn brotherhood", /*french*/"un serment de fraternité", /*spanish*/"el juramento de hermanos de sangre"}, @@ -1519,7 +1519,7 @@ void HintTable_Init_Item() { Text{"the Goron Ruby", /*french*/"le Rubis Goron", /*spanish*/"el Rubí de los Goron"} ); - hintTable[ZORA_SAPPHIRE] = HintText::Item({ + hintTable[RHT_ZORA_SAPPHIRE] = HintText::Item({ //obscure text Text{"a blue stone", /*french*/"une pierre bleue", /*spanish*/"una piedra celeste"}, Text{"an engagement gift", /*french*/"un cadeau de mariage", /*spanish*/"un regalo de compromiso"}, @@ -1531,7 +1531,7 @@ void HintTable_Init_Item() { Text{"the Zora Sapphire", /*french*/"le Saphir Zora", /*spanish*/"el Zafiro de los Zora"} ); - hintTable[FOREST_MEDALLION] = HintText::Item({ + hintTable[RHT_FOREST_MEDALLION] = HintText::Item({ //obscure text Text{"a green coin", /*french*/"une pièce verte", /*spanish*/"una moneda esmeralda"}, Text{"Saria's friendship", /*french*/"l'amitié de Saria", /*spanish*/"la amistad de Saria"}, @@ -1543,7 +1543,7 @@ void HintTable_Init_Item() { Text{"the Forest Medallion", /*french*/"le Médaillon de la Forêt", /*spanish*/"el Medallón del Bosque"} ); - hintTable[FIRE_MEDALLION] = HintText::Item({ + hintTable[RHT_FIRE_MEDALLION] = HintText::Item({ //obscure text Text{"a red coin", /*french*/"une pièce rouge", /*spanish*/"una moneda rubí"}, Text{"Darunia's power", /*french*/"la fraternité de Darunia", /*spanish*/"la fraternidad de Darunia"}, @@ -1555,7 +1555,7 @@ void HintTable_Init_Item() { Text{"the Fire Medallion", /*french*/"le Médaillon du Feu", /*spanish*/"el Medallón del Fuego"} ); - hintTable[WATER_MEDALLION] = HintText::Item({ + hintTable[RHT_WATER_MEDALLION] = HintText::Item({ //obscure text Text{"a blue coin", /*french*/"une pièce bleue", /*spanish*/"una moneda zafiro"}, Text{"Ruto's power", /*french*/"l'amour de Ruto", /*spanish*/"el amor de Ruto"}, @@ -1567,7 +1567,7 @@ void HintTable_Init_Item() { Text{"the Water Medallion", /*french*/"le Médaillon de l'Eau", /*spanish*/"el Medallón del Agua"} ); - hintTable[SPIRIT_MEDALLION] = HintText::Item({ + hintTable[RHT_SPIRIT_MEDALLION] = HintText::Item({ //obscure text Text{"an orange coin", /*french*/"une pièce orange", /*spanish*/"una moneda ámbar"}, Text{"Nabooru's power", /*french*/"le respect de Nabooru", /*spanish*/"el respeto de Nabooru"}, @@ -1579,7 +1579,7 @@ void HintTable_Init_Item() { Text{"the Spirit Medallion", /*french*/"le Médaillon de l'Esprit", /*spanish*/"el Medallón del Espíritu"} ); - hintTable[SHADOW_MEDALLION] = HintText::Item({ + hintTable[RHT_SHADOW_MEDALLION] = HintText::Item({ //obscure text Text{"a purple coin", /*french*/"une pièce pourpre", /*spanish*/"una moneda malva"}, Text{"Impa's power", /*french*/"la confiance d'Impa", /*spanish*/"la confianza de Impa"}, @@ -1591,7 +1591,7 @@ void HintTable_Init_Item() { Text{"the Shadow Medallion", /*french*/"le Médaillon de l'Ombre", /*spanish*/"el Medallón de la Sombra"} ); - hintTable[LIGHT_MEDALLION] = HintText::Item({ + hintTable[RHT_LIGHT_MEDALLION] = HintText::Item({ //obscure text Text{"a yellow coin", /*french*/"une pièce jaune", /*spanish*/"una moneda resplandeciente"}, Text{"Rauru's power", /*french*/"la foi de Rauru", /*spanish*/"la fe de Rauru"}, @@ -1603,7 +1603,7 @@ void HintTable_Init_Item() { Text{"the Light Medallion", /*french*/"le Médaillon de la Lumière", /*spanish*/"el Medallón de la Luz"} ); - hintTable[RECOVERY_HEART] = HintText::Item({ + hintTable[RHT_RECOVERY_HEART] = HintText::Item({ //obscure text Text{"a free heal", /*french*/"un bec-au-bobo", /*spanish*/"una cura de regalo"}, Text{"a hearty meal", /*french*/"un petit amour", /*spanish*/"una sanación romántica"}, @@ -1616,7 +1616,7 @@ void HintTable_Init_Item() { Text{"a Recovery Heart", /*french*/"un coeur de vie", /*spanish*/"un corazón"} ); - hintTable[GREEN_RUPEE] = HintText::Item({ + hintTable[RHT_GREEN_RUPEE] = HintText::Item({ //obscure text Text{"a unique coin", /*french*/"un rubis bien mérité", /*spanish*/"una singular moneda"}, Text{"a penny", /*french*/"un sou", /*spanish*/"un peso hyliano"}, @@ -1629,7 +1629,7 @@ void HintTable_Init_Item() { Text{"a Green Rupee", /*french*/"un rubis vert", /*spanish*/"una rupia verde"} ); - hintTable[GREG_RUPEE] = HintText::Item({ + hintTable[RHT_GREG_RUPEE] = HintText::Item({ //obscure text Text{"an old friend", /*french*/"Greg", /*spanish*/"Greg"}, Text{"a glorious gem", /*french*/"Greg", /*spanish*/"Greg"}, @@ -1641,7 +1641,7 @@ void HintTable_Init_Item() { Text{"Greg", /*french*/"Greg", /*spanish*/"Greg"} ); - hintTable[BLUE_RUPEE] = HintText::Item({ + hintTable[RHT_BLUE_RUPEE] = HintText::Item({ //obscure text Text{"a common coin", /*french*/"quelques sous", /*spanish*/"una moneda usual"}, Text{"a blue gem", /*french*/"un joyau bleu", /*spanish*/"una gema azul"}, @@ -1653,7 +1653,7 @@ void HintTable_Init_Item() { Text{"a Blue Rupee", /*french*/"un rubis bleu", /*spanish*/"una rupia azul"} ); - hintTable[RED_RUPEE] = HintText::Item({ + hintTable[RHT_RED_RUPEE] = HintText::Item({ //obscure text Text{"couch cash", /*french*/"un peu de fric", /*spanish*/"una buena moneda"}, Text{"a red gem", /*french*/"un joyau rouge", /*spanish*/"una gema roja"}, @@ -1665,7 +1665,7 @@ void HintTable_Init_Item() { Text{"a Red Rupee", /*french*/"un rubis rouge", /*spanish*/"una rupia roja"} ); - hintTable[PURPLE_RUPEE] = HintText::Item({ + hintTable[RHT_PURPLE_RUPEE] = HintText::Item({ //obscure text Text{"big bucks", /*french*/"plein de fric", /*spanish*/"plata de calidad"}, Text{"a purple gem", /*french*/"un joyau mauve", /*spanish*/"una gema morada"}, @@ -1678,7 +1678,7 @@ void HintTable_Init_Item() { Text{"a Purple Rupee", /*french*/"un rubis pourpre", /*spanish*/"una rupia morada"} ); - hintTable[HUGE_RUPEE] = HintText::Item({ + hintTable[RHT_HUGE_RUPEE] = HintText::Item({ //obscure text Text{"a juicy jackpot", /*french*/"le jackpot", /*spanish*/"el premio gordo"}, Text{"a yellow gem", /*french*/"un joyau doré", /*spanish*/"una gema amarilla"}, @@ -1692,7 +1692,7 @@ void HintTable_Init_Item() { Text{"a Huge Rupee", /*french*/"un énorme rubis", /*spanish*/"una rupia gigante"} ); - hintTable[PIECE_OF_HEART] = HintText::Item({ + hintTable[RHT_PIECE_OF_HEART] = HintText::Item({ //obscure text Text{"a little love", /*french*/"un peu plus d'amour", /*spanish*/"un cuarto de amor"}, Text{"a broken heart", /*french*/"un coeur brisé", /*spanish*/"un corazón roto"}, @@ -1704,7 +1704,7 @@ void HintTable_Init_Item() { Text{"a Piece of Heart", /*french*/"un Quart de Coeur", /*spanish*/"una pieza de corazón"} ); - hintTable[HEART_CONTAINER] = HintText::Item({ + hintTable[RHT_HEART_CONTAINER] = HintText::Item({ //obscure text Text{"a lot of love", /*french*/"le grand amour", /*spanish*/"amor por doquier"}, Text{"a Valentine's gift", /*french*/"un cadeau de Saint-Valentin", /*spanish*/"un contenedor de afección"}, @@ -1717,7 +1717,7 @@ void HintTable_Init_Item() { Text{"a Heart Container", /*french*/"un Réceptacle de Coeur", /*spanish*/"un contenedor de corazón"} ); - hintTable[ICE_TRAP] = HintText::Item({ + hintTable[RHT_ICE_TRAP] = HintText::Item({ //obscure text Text{"a gift from Ganon", /*french*/"un cadeau de Ganon", /*spanish*/"un regalo de Ganon"}, Text{"a chilling discovery", /*french*/"une frissonante découverte", /*spanish*/"un escalofriante hallazgo"}, @@ -1734,9 +1734,9 @@ void HintTable_Init_Item() { Text{"an Ice Trap", /*french*/"un Piège de Glace", /*spanish*/"una trampa de hielo"} ); - //MILK + //RHT_MILK - hintTable[BOMBS_5] = HintText::Item({ + hintTable[RHT_BOMBS_5] = HintText::Item({ //obscure text Text{"a few explosives", /*french*/"une poignée de pétards", /*spanish*/"un par de explosivos"}, Text{"a few blast balls", /*french*/"une poignée de boules bleues", /*spanish*/"un par de estallidos"}, @@ -1748,7 +1748,7 @@ void HintTable_Init_Item() { Text{"Bombs (5 pieces)", /*french*/"une demi-dizaine de bombes", /*spanish*/"unas (5) bombas"} ); - hintTable[BOMBS_10] = HintText::Item({ + hintTable[RHT_BOMBS_10] = HintText::Item({ //obscure text Text{"some explosives", /*french*/"un paquet de pétards", /*spanish*/"unos cuantos explosivos"}, Text{"some blast balls", /*french*/"un paquet de boules bleues", /*spanish*/"unos cuantos estallidos"}, @@ -1760,7 +1760,7 @@ void HintTable_Init_Item() { Text{"Bombs (10 pieces)", /*french*/"une dizaine de bombes", /*spanish*/"unas (10) bombas"} ); - hintTable[BOMBS_20] = HintText::Item({ + hintTable[RHT_BOMBS_20] = HintText::Item({ //obscure text Text{"lots-o-explosives", /*french*/"une abondance de pétards", /*spanish*/"un puñado de explosivos"}, Text{"plenty of blast balls", /*french*/"une abondance de boules bleues", /*spanish*/"bastantes estallidos"}, @@ -1772,7 +1772,7 @@ void HintTable_Init_Item() { Text{"Bombs (20 pieces)", /*french*/"une vingtaine de bombes", /*spanish*/"unas (20) bombas"} ); - hintTable[BOMBCHU_5] = HintText::Item({ + hintTable[RHT_BOMBCHU_5] = HintText::Item({ //obscure text Text{"a few mice bombs", /*french*/"une poignée de mignons explosifs", /*spanish*/"un par de bombas roedoras"}, Text{"a few proximity mice", /*french*/"une poignée de jouets à remonter", /*spanish*/"un par de explosivos ratoncitos"}, @@ -1787,7 +1787,7 @@ void HintTable_Init_Item() { Text{"Bombchus (5 pieces)", /*french*/"une demi-dizaine de Missiles", /*spanish*/"unos (5) bombchus"} ); - hintTable[BOMBCHU_10] = HintText::Item({ + hintTable[RHT_BOMBCHU_10] = HintText::Item({ //obscure text Text{"some mice bombs", /*french*/"un paquet de mignons explosifs", /*spanish*/"unas cuantas bombas roedoras"}, Text{"some proximity mice", /*french*/"un paquet de jouets à remonter", /*spanish*/"unos cuantos explosivos ratoncitos"}, @@ -1802,7 +1802,7 @@ void HintTable_Init_Item() { Text{"Bombchus (10 pieces)", /*french*/"une dizaine de Missiles", /*spanish*/"unos (10) bombchus"} ); - hintTable[BOMBCHU_20] = HintText::Item({ + hintTable[RHT_BOMBCHU_20] = HintText::Item({ //obscure text Text{"plenty of mice bombs", /*french*/"une abondance de mignons explosifs", /*spanish*/"bastantes bombas roedoras"}, Text{"plenty of proximity mice", /*french*/"une abondance de jouets à remonter", /*spanish*/"bastantes explosivos ratoncitos"}, @@ -1817,9 +1817,9 @@ void HintTable_Init_Item() { Text{"Bombchus (20 pieces)", /*french*/"une vingtaine de Missiles", /*spanish*/"unos (20) bombchus"} ); - //BOMBCHU_DROP + //RHT_BOMBCHU_DROP - hintTable[ARROWS_5] = HintText::Item({ + hintTable[RHT_ARROWS_5] = HintText::Item({ //obscure text Text{"a few danger darts", /*french*/"une poignée d'obus", /*spanish*/"un par de peligrosos dardos"}, Text{"a few sharp shafts", /*french*/"une poignée de piquets", /*spanish*/"un par de puntas afiladas"}, @@ -1831,7 +1831,7 @@ void HintTable_Init_Item() { Text{"Arrows (5 pieces)", /*french*/"une demi-dizaine de flèches", /*spanish*/"unas (5) flechas"} ); - hintTable[ARROWS_10] = HintText::Item({ + hintTable[RHT_ARROWS_10] = HintText::Item({ //obscure text Text{"some danger darts", /*french*/"un paquet d'obus", /*spanish*/"unos cuantos peligrosos dardos"}, Text{"some sharp shafts", /*french*/"un paquet de piquets", /*spanish*/"unas cuantas puntas afiladas"}, @@ -1843,7 +1843,7 @@ void HintTable_Init_Item() { Text{"Arrows (10 pieces)", /*french*/"une dizaine de flèches", /*spanish*/"unas (10) flechas"} ); - hintTable[ARROWS_30] = HintText::Item({ + hintTable[RHT_ARROWS_30] = HintText::Item({ //obscure text Text{"plenty of danger darts", /*french*/"une abondance d'obus", /*spanish*/"bastantes peligrosos dardos"}, Text{"plenty of sharp shafts", /*french*/"une abondance de piquets", /*spanish*/"bastantes puntas afiladas"}, @@ -1855,7 +1855,7 @@ void HintTable_Init_Item() { Text{"Arrows (30 pieces)", /*french*/"une trentaine de flèches", /*spanish*/"unas (30) flechas"} ); - hintTable[DEKU_NUTS_5] = HintText::Item({ + hintTable[RHT_DEKU_NUTS_5] = HintText::Item({ //obscure text Text{"some nuts", /*french*/"une poignée de noisettes", /*spanish*/"un par de nueces"}, Text{"some flashbangs", /*french*/"une poignée d'éclats", /*spanish*/"un par de semillas aturdidoras"}, @@ -1869,7 +1869,7 @@ void HintTable_Init_Item() { Text{"Deku Nuts (5 pieces)", /*french*/"une demi-dizaine de noix Mojo", /*spanish*/"unas (5) nueces deku"} ); - hintTable[DEKU_NUTS_10] = HintText::Item({ + hintTable[RHT_DEKU_NUTS_10] = HintText::Item({ //obscure text Text{"lots-o-nuts", /*french*/"un paquet de noisettes", /*spanish*/"un puñado de nueces"}, Text{"plenty of flashbangs", /*french*/"un paquet d'éclats", /*spanish*/"unas cuantas semillas aturdidoras"}, @@ -1883,7 +1883,7 @@ void HintTable_Init_Item() { Text{"Deku Nuts (10 pieces)", /*french*/"une dizaine de noix Mojo", /*spanish*/"unas (10) nueces deku"} ); - hintTable[DEKU_SEEDS_30] = HintText::Item({ + hintTable[RHT_DEKU_SEEDS_30] = HintText::Item({ //obscure text Text{"catapult ammo", /*french*/"un paquet de délicieuses munitions", /*spanish*/"un par de munición infantil"}, Text{"lots-o-seeds", /*french*/"un paquet de germes séchés", /*spanish*/"un puñado de semillas"}, @@ -1896,7 +1896,7 @@ void HintTable_Init_Item() { Text{"Deku Seeds (30 pieces)", /*french*/"une trentaine de graines Mojo", /*spanish*/"unas (30) semillas deku"} ); - hintTable[DEKU_STICK_1] = HintText::Item({ + hintTable[RHT_DEKU_STICK_1] = HintText::Item({ //obscure text Text{"a breakable branch", /*french*/"un bout de bois", /*spanish*/"un pequeño báculo"}, }, { @@ -1907,7 +1907,7 @@ void HintTable_Init_Item() { Text{"a Deku Stick", /*french*/"un bâton Mojo", /*spanish*/"un palo deku"} ); - hintTable[TREASURE_GAME_HEART] = HintText::Item({ + hintTable[RHT_TREASURE_GAME_HEART] = HintText::Item({ //obscure text Text{"a victory valentine", /*french*/"un amour gagnant", /*spanish*/"el amor victorioso"}, }, { @@ -1918,7 +1918,7 @@ void HintTable_Init_Item() { Text{"a Piece of Heart", /*french*/"un Quart de Coeur", /*spanish*/"el amor de la victoria"} ); - hintTable[TREASURE_GAME_GREEN_RUPEE] = HintText::Item({ + hintTable[RHT_TREASURE_GAME_GREEN_RUPEE] = HintText::Item({ //obscure text Text{"the dollar of defeat", /*french*/"le rubis de la défaite", /*spanish*/"el peso de la derrota"}, }, { @@ -1929,7 +1929,7 @@ void HintTable_Init_Item() { Text{"a Green Rupee", /*french*/"un rubis vert", /*spanish*/"una rupia verde"} ); - hintTable[TRIFORCE_PIECE] = HintText::Item({ + hintTable[RHT_TRIFORCE_PIECE] = HintText::Item({ //obscure text Text{"a triumph fork", /*french*/"la Tribosse", /*spanish*/"un trígono del triunfo"}, Text{"cheese", /*french*/"du fromage", /*spanish*/"un porción de queso"}, @@ -1939,7 +1939,7 @@ void HintTable_Init_Item() { Text{"a Piece of the Triforce", /*french*/"un fragment de la Triforce", /*spanish*/"un fragmento de la Trifuerza"} ); - hintTable[EPONA] = HintText::Item({ + hintTable[RHT_EPONA] = HintText::Item({ //obscure text Text{"a horse", /*french*/"un fidèle destrier", /*spanish*/"una yegua"}, Text{"a four legged friend", /*french*/"un puissant animal", /*spanish*/"una amiga cuadrúpeda"}, @@ -1953,7 +1953,7 @@ void HintTable_Init_Item() { Text{"Epona", /*french*/"Epona", /*spanish*/"a Epona"} ); - // [HINT_ERROR] = HintText::Item({ + // [RHT_HINT_ERROR] = HintText::Item({ // //obscure text // Text{"something mysterious", /*french*/"un sacré mystère", /*spanish*/"algo misterioso"}, // Text{"an unknown treasure", /*french*/"un trésor inconnu", /*spanish*/"un desconocido tesoro"}, diff --git a/soh/soh/Enhancements/randomizer/3drando/hints.cpp b/soh/soh/Enhancements/randomizer/3drando/hints.cpp index dea7833fc..e0ae47dd0 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hints.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hints.cpp @@ -2,7 +2,6 @@ #include "custom_messages.hpp" #include "dungeon.hpp" -#include "item_location.hpp" #include "item_pool.hpp" #include "logic.hpp" #include "random.hpp" @@ -14,6 +13,7 @@ #include "z64item.h" #include #include "../randomizerTypes.h" +#include "../context.h" using namespace CustomMessages; using namespace Logic; @@ -215,24 +215,24 @@ std::string GetSariaHintLoc() { return sariaHintLoc; } -Area* GetHintRegion(const uint32_t area) { +Area* GetHintRegion(const RandomizerRegion area) { - std::vector alreadyChecked = {}; - std::vector spotQueue = {area}; + std::vector alreadyChecked = {}; + std::vector spotQueue = {area}; while (!spotQueue.empty()) { - uint32_t region = spotQueue.back(); + RandomizerRegion region = spotQueue.back(); alreadyChecked.push_back(region); spotQueue.pop_back(); - if (AreaTable(region)->hintKey != NONE) { + if (AreaTable(region)->hintKey != RHT_NONE) { return AreaTable(region); } //add unchecked entrances to spot queue bool checked = false; for (auto& entrance : AreaTable(region)->entrances) { - for (uint32_t checkedEntrance : alreadyChecked) { + for (RandomizerRegion checkedEntrance : alreadyChecked) { if (entrance->GetParentRegionKey() == checkedEntrance) { checked = true; break; @@ -245,60 +245,63 @@ Area* GetHintRegion(const uint32_t area) { } } - return AreaTable(NONE); + return AreaTable(RR_NONE); } -uint32_t GetHintRegionHintKey(const uint32_t area) { +RandomizerHintTextKey GetHintRegionHintKey(const RandomizerRegion area) { return GetHintRegion(area)->hintKey; } -uint32_t GetHintRegionuint32_t(const uint32_t area) { +uint32_t GetHintRegionuint32_t(const RandomizerRegion area) { return GetHintRegion(area)->hintKey; } -uint32_t GetLocationRegionuint32_t(const uint32_t location) { - return GetHintRegion(Location(location)->GetParentRegionKey())->hintKey; +uint32_t GetLocationRegionuint32_t(const RandomizerCheck location) { + return GetHintRegion(Rando::Context::GetInstance()->GetItemLocation(location)->GetParentRegionKey())->hintKey; } -static std::vector GetAccessibleGossipStones(const uint32_t hintedLocation = GANON) { +static std::vector GetAccessibleGossipStones(const RandomizerCheck hintedLocation = RC_GANON) { + auto ctx = Rando::Context::GetInstance(); //temporarily remove the hinted location's item, and then perform a //reachability search for gossip stone locations. - uint32_t originalItem = Location(hintedLocation)->GetPlaceduint32_t(); - Location(hintedLocation)->SetPlacedItem(NONE); + RandomizerGet originalItem = ctx->GetItemLocation(hintedLocation)->GetPlacedRandomizerGet(); + ctx->GetItemLocation(hintedLocation)->SetPlacedItem(RG_NONE); LogicReset(); - auto accessibleGossipStones = GetAccessibleLocations(gossipStoneLocations); + auto accessibleGossipStones = GetAccessibleLocations(Rando::StaticData::gossipStoneLocations); //Give the item back to the location - Location(hintedLocation)->SetPlacedItem(originalItem); + ctx->GetItemLocation(hintedLocation)->SetPlacedItem(originalItem); return accessibleGossipStones; } -static void AddHint(Text hint, const uint32_t gossipStone, const std::vector& colors = {}, HintType hintType = HINT_TYPE_ITEM, const uint32_t hintedLocation = NONE) { +static void AddHint(Text hint, const RandomizerCheck gossipStone, const std::vector& colors = {}, HintType hintType = HINT_TYPE_ITEM, const RandomizerCheck hintedLocation = RC_UNKNOWN_CHECK) { //save hints as dummy items for writing to the spoiler log - NewItem(gossipStone, Item{RG_HINT, hint, ITEMTYPE_EVENT, GI_RUPEE_BLUE_LOSE, false, &noVariable, NONE}); - Location(gossipStone)->SetPlacedItem(gossipStone); - Location(gossipStone)->SetHintedLocation(hintedLocation); - Location(gossipStone)->SetHintType(hintType); - Location(gossipStone)->SetHintedRegion(GetHintRegion(Location(hintedLocation)->GetParentRegionKey())->GetHint().GetText().GetEnglish()); + //NewItem(gossipStone, Item{RG_HINT, hint, ITEMTYPE_EVENT, GI_RUPEE_BLUE_LOSE, false, &noVariable, NONE}); + //GetLocation(gossipStone)->SetPlacedItem(gossipStone); + + auto ctx = Rando::Context::GetInstance(); + ctx->AddHint((RandomizerHintKey)((gossipStone - RC_DMC_GOSSIP_STONE) + 1), hint, hintedLocation, hintType, GetHintRegion(ctx->GetItemLocation(hintedLocation)->GetParentRegionKey())->GetHint().GetText()); + ctx->GetItemLocation(gossipStone)->SetPlacedItem(RG_HINT); } -static void CreateLocationHint(const std::vector& possibleHintLocations) { +static void CreateLocationHint(const std::vector& possibleHintLocations) { + auto ctx = Rando::Context::GetInstance(); //return if there aren't any hintable locations or gossip stones available if (possibleHintLocations.empty()) { SPDLOG_DEBUG("\tNO LOCATIONS TO HINT\n\n"); return; } - uint32_t hintedLocation = RandomElement(possibleHintLocations); - const std::vector accessibleGossipStones = GetAccessibleGossipStones(hintedLocation); + RandomizerCheck hintedLocation = RandomElement(possibleHintLocations); + const std::vector accessibleGossipStones = GetAccessibleGossipStones(hintedLocation); SPDLOG_DEBUG("\tLocation: "); - SPDLOG_DEBUG(Location(hintedLocation)->GetName()); + SPDLOG_DEBUG(Rando::StaticData::GetLocation(hintedLocation)->GetName()); SPDLOG_DEBUG("\n"); SPDLOG_DEBUG("\tItem: "); - SPDLOG_DEBUG(Location(hintedLocation)->GetPlacedItemName().GetEnglish()); + SPDLOG_DEBUG(ctx->GetItemLocation(hintedLocation)->GetPlacedItemName().GetEnglish()); SPDLOG_DEBUG("\n"); if (accessibleGossipStones.empty()) { @@ -306,13 +309,13 @@ static void CreateLocationHint(const std::vector& possibleHintLocation return; } - uint32_t gossipStone = RandomElement(accessibleGossipStones); - Location(hintedLocation)->SetAsHinted(); + RandomizerCheck gossipStone = RandomElement(accessibleGossipStones); + ctx->GetItemLocation(hintedLocation)->SetAsHinted(); //make hint text - Text locationHintText = Location(hintedLocation)->GetHint().GetText(); - Text itemHintText = Location(hintedLocation)->GetPlacedItem().GetHint().GetText(); - Text prefix = Hint(PREFIX).GetText(); + Text locationHintText = Rando::StaticData::GetLocation(hintedLocation)->GetHint()->GetText(); + Text itemHintText = ctx->GetItemLocation(hintedLocation)->GetPlacedItem().GetHint().GetText(); + Text prefix = Hint(RHT_PREFIX).GetText(); Text finalHint = prefix + "%r" + locationHintText + " #%g" + itemHintText + "#%w."; SPDLOG_DEBUG("\tMessage: "); @@ -323,15 +326,16 @@ static void CreateLocationHint(const std::vector& possibleHintLocation } static void CreateWothHint(uint8_t* remainingDungeonWothHints) { + auto ctx = Rando::Context::GetInstance(); // get locations that are in the current playthrough - std::vector possibleHintLocations = {}; + std::vector possibleHintLocations = {}; // iterate through playthrough locations by sphere - std::vector wothHintLocations = - FilterFromPool(wothLocations, [remainingDungeonWothHints](uint32_t loc) { - return Location(loc)->IsHintable() && // only filter hintable locations - !(Location(loc)->IsHintedAt()) && // only filter locations that haven't been hinted at - (Location(loc)->IsOverworld() || - (Location(loc)->IsDungeon() && + std::vector wothHintLocations = + FilterFromPool(ctx->wothLocations, [remainingDungeonWothHints, ctx](RandomizerCheck loc) { + return ctx->GetItemLocation(loc)->IsHintable() && // only filter hintable locations + !(ctx->GetItemLocation(loc)->IsHintedAt()) && // only filter locations that haven't been hinted at + (Rando::StaticData::GetLocation(loc)->IsOverworld() || + (Rando::StaticData::GetLocation(loc)->IsDungeon() && (*remainingDungeonWothHints) > 0)); // make sure we haven't surpassed the woth dungeon limit }); AddElementsToPool(possibleHintLocations, wothHintLocations); @@ -341,129 +345,133 @@ static void CreateWothHint(uint8_t* remainingDungeonWothHints) { SPDLOG_DEBUG("\tNO LOCATIONS TO HINT\n\n"); return; } - uint32_t hintedLocation = RandomElement(possibleHintLocations); + RandomizerCheck hintedLocation = RandomElement(possibleHintLocations); SPDLOG_DEBUG("\tLocation: "); - SPDLOG_DEBUG(Location(hintedLocation)->GetName()); + SPDLOG_DEBUG(Rando::StaticData::GetLocation(hintedLocation)->GetName()); SPDLOG_DEBUG("\n"); SPDLOG_DEBUG("\tItem: "); - SPDLOG_DEBUG(Location(hintedLocation)->GetPlacedItemName().GetEnglish()); + SPDLOG_DEBUG(ctx->GetItemLocation(hintedLocation)->GetPlacedItemName().GetEnglish()); SPDLOG_DEBUG("\n"); // get an accessible gossip stone - const std::vector gossipStoneLocations = GetAccessibleGossipStones(hintedLocation); + const std::vector gossipStoneLocations = GetAccessibleGossipStones(hintedLocation); if (gossipStoneLocations.empty()) { SPDLOG_DEBUG("\tNO GOSSIP STONES TO PLACE HINT\n\n"); return; } - Location(hintedLocation)->SetAsHinted(); - uint32_t gossipStone = RandomElement(gossipStoneLocations); + ctx->GetItemLocation(hintedLocation)->SetAsHinted(); + RandomizerCheck gossipStone = RandomElement(gossipStoneLocations); - if (Location(hintedLocation)->IsDungeon()) { + if (Rando::StaticData::GetLocation(hintedLocation)->IsDungeon()) { *remainingDungeonWothHints -= 1; } // form hint text - Text locationText = GetHintRegion(Location(hintedLocation)->GetParentRegionKey())->GetHint().GetText(); - Text finalWothHint = Hint(PREFIX).GetText() + "%r#" + locationText + "#%w" + Hint(WAY_OF_THE_HERO).GetText(); + Text locationText = GetHintRegion(ctx->GetItemLocation(hintedLocation)->GetParentRegionKey())->GetHint().GetText(); + Text finalWothHint = Hint(RHT_PREFIX).GetText() + "%r#" + locationText + "#%w" + Hint(RHT_WAY_OF_THE_HERO).GetText(); SPDLOG_DEBUG("\tMessage: "); SPDLOG_DEBUG(finalWothHint.english); SPDLOG_DEBUG("\n\n"); AddHint(finalWothHint, gossipStone, { QM_LBLUE }, HINT_TYPE_WOTH, hintedLocation); } -static void CreateBarrenHint(uint8_t* remainingDungeonBarrenHints, std::vector& barrenLocations) { +static void CreateBarrenHint(uint8_t* remainingDungeonBarrenHints, std::vector& barrenLocations) { + auto ctx = Rando::Context::GetInstance(); // remove dungeon locations if necessary if (*remainingDungeonBarrenHints < 1) { barrenLocations = - FilterFromPool(barrenLocations, [](const uint32_t loc) { return !(Location(loc)->IsDungeon()); }); + FilterFromPool(barrenLocations, [](const RandomizerCheck loc) { + return !(Rando::StaticData::GetLocation(loc)->IsDungeon()); + }); } if (barrenLocations.empty()) { return; } - uint32_t hintedLocation = RandomElement(barrenLocations, true); + RandomizerCheck hintedLocation = RandomElement(barrenLocations, true); SPDLOG_DEBUG("\tLocation: "); - SPDLOG_DEBUG(Location(hintedLocation)->GetName()); + SPDLOG_DEBUG(Rando::StaticData::GetLocation(hintedLocation)->GetName()); SPDLOG_DEBUG("\n"); SPDLOG_DEBUG("\tItem: "); - SPDLOG_DEBUG(Location(hintedLocation)->GetPlacedItemName().GetEnglish()); + SPDLOG_DEBUG(ctx->GetItemLocation(hintedLocation)->GetPlacedItemName().GetEnglish()); SPDLOG_DEBUG("\n"); // get an accessible gossip stone - const std::vector gossipStoneLocations = GetAccessibleGossipStones(hintedLocation); + const std::vector gossipStoneLocations = GetAccessibleGossipStones(hintedLocation); if (gossipStoneLocations.empty()) { SPDLOG_DEBUG("\tNO GOSSIP STONES TO PLACE HINT\n\n"); return; } - Location(hintedLocation)->SetAsHinted(); - uint32_t gossipStone = RandomElement(gossipStoneLocations); + ctx->GetItemLocation(hintedLocation)->SetAsHinted(); + RandomizerCheck gossipStone = RandomElement(gossipStoneLocations); - if (Location(hintedLocation)->IsDungeon()) { + if (Rando::StaticData::GetLocation(hintedLocation)->IsDungeon()) { *remainingDungeonBarrenHints -= 1; } // form hint text - Text locationText = GetHintRegion(Location(hintedLocation)->GetParentRegionKey())->GetHint().GetText(); + Text locationText = GetHintRegion(ctx->GetItemLocation(hintedLocation)->GetParentRegionKey())->GetHint().GetText(); Text finalBarrenHint = - Hint(PREFIX).GetText() + Hint(PLUNDERING).GetText() + "%r#" + locationText + "#%w" + Hint(FOOLISH).GetText(); + Hint(RHT_PREFIX).GetText() + Hint(RHT_PLUNDERING).GetText() + "%r#" + locationText + "#%w" + Hint(RHT_FOOLISH).GetText(); SPDLOG_DEBUG("\tMessage: "); SPDLOG_DEBUG(finalBarrenHint.english); SPDLOG_DEBUG("\n\n"); AddHint(finalBarrenHint, gossipStone, { QM_PINK }, HINT_TYPE_BARREN, hintedLocation); // get rid of all other locations in this same barren region - barrenLocations = FilterFromPool(barrenLocations, [hintedLocation](uint32_t loc) { - return GetHintRegion(Location(loc)->GetParentRegionKey())->hintKey != - GetHintRegion(Location(hintedLocation)->GetParentRegionKey())->hintKey; + barrenLocations = FilterFromPool(barrenLocations, [hintedLocation, ctx](RandomizerCheck loc) { + return GetHintRegion(ctx->GetItemLocation(loc)->GetParentRegionKey())->hintKey != + GetHintRegion(ctx->GetItemLocation(hintedLocation)->GetParentRegionKey())->hintKey; }); } static void CreateRandomLocationHint(const bool goodItem = false) { - const std::vector possibleHintLocations = FilterFromPool(allLocations, [goodItem](const uint32_t loc) { - return Location(loc)->IsHintable() && !(Location(loc)->IsHintedAt()) && (!goodItem || Location(loc)->GetPlacedItem().IsMajorItem()); + auto ctx = Rando::Context::GetInstance(); + const std::vector possibleHintLocations = FilterFromPool(ctx->allLocations, [goodItem, ctx](const RandomizerCheck loc) { + return ctx->GetItemLocation(loc)->IsHintable() && !(ctx->GetItemLocation(loc)->IsHintedAt()) && (!goodItem || ctx->GetItemLocation(loc)->GetPlacedItem().IsMajorItem()); }); //If no more locations can be hinted at, then just try to get another hint if (possibleHintLocations.empty()) { SPDLOG_DEBUG("\tNO LOCATIONS TO HINT\n\n"); return; } - uint32_t hintedLocation = RandomElement(possibleHintLocations); + RandomizerCheck hintedLocation = RandomElement(possibleHintLocations); SPDLOG_DEBUG("\tLocation: "); - SPDLOG_DEBUG(Location(hintedLocation)->GetName()); + SPDLOG_DEBUG(Rando::StaticData::GetLocation(hintedLocation)->GetName()); SPDLOG_DEBUG("\n"); SPDLOG_DEBUG("\tItem: "); - SPDLOG_DEBUG(Location(hintedLocation)->GetPlacedItemName().GetEnglish()); + SPDLOG_DEBUG(ctx->GetItemLocation(hintedLocation)->GetPlacedItemName().GetEnglish()); SPDLOG_DEBUG("\n"); //get an acessible gossip stone - const std::vector gossipStoneLocations = GetAccessibleGossipStones(hintedLocation); + const std::vector gossipStoneLocations = GetAccessibleGossipStones(hintedLocation); if (gossipStoneLocations.empty()) { SPDLOG_DEBUG("\tNO GOSSIP STONES TO PLACE HINT\n\n"); return; } - Location(hintedLocation)->SetAsHinted(); - uint32_t gossipStone = RandomElement(gossipStoneLocations); + ctx->GetItemLocation(hintedLocation)->SetAsHinted(); + RandomizerCheck gossipStone = RandomElement(gossipStoneLocations); //form hint text - Text itemText = Location(hintedLocation)->GetPlacedItem().GetHint().GetText(); - Text locationText = GetHintRegion(Location(hintedLocation)->GetParentRegionKey())->GetHint().GetText(); + Text itemText = ctx->GetItemLocation(hintedLocation)->GetPlacedItem().GetHint().GetText(); + Text locationText = GetHintRegion(ctx->GetItemLocation(hintedLocation)->GetParentRegionKey())->GetHint().GetText(); // RANDOTODO: reconsider dungeon vs non-dungeon item location hints when boss shuffle mixed pools happens - if (Location(hintedLocation)->IsDungeon()) { - Text finalHint = Hint(PREFIX).GetText()+"%r#"+locationText+"#%w "+Hint(HOARDS).GetText()+" %g#"+itemText+"#%w."; + if (Rando::StaticData::GetLocation(hintedLocation)->IsDungeon()) { + Text finalHint = Hint(RHT_PREFIX).GetText()+"%r#"+locationText+"#%w "+Hint(RHT_HOARDS).GetText()+" %g#"+itemText+"#%w."; SPDLOG_DEBUG("\tMessage: "); SPDLOG_DEBUG(finalHint.english); SPDLOG_DEBUG("\n\n"); AddHint(finalHint, gossipStone, {QM_GREEN, QM_RED}, HINT_TYPE_NAMED_ITEM, hintedLocation); } else { - Text finalHint = Hint(PREFIX).GetText()+"%r#"+itemText+"#%w "+Hint(CAN_BE_FOUND_AT).GetText()+" %g#"+locationText+"#%w."; + Text finalHint = Hint(RHT_PREFIX).GetText()+"%r#"+itemText+"#%w "+Hint(RHT_CAN_BE_FOUND_AT).GetText()+" %g#"+locationText+"#%w."; SPDLOG_DEBUG("\tMessage: "); SPDLOG_DEBUG(finalHint.english); SPDLOG_DEBUG("\n\n"); @@ -479,12 +487,12 @@ static void CreateJunkHint() { //duplicate junk hints are possible for now const HintText junkHint = RandomElement(GetHintCategory(HintCategory::Junk)); LogicReset(); - const std::vector gossipStones = GetAccessibleLocations(gossipStoneLocations); + const std::vector gossipStones = GetAccessibleLocations(Rando::StaticData::gossipStoneLocations); if (gossipStones.empty()) { SPDLOG_DEBUG("\tNO GOSSIP STONES TO PLACE HINT\n\n"); return; } - uint32_t gossipStone = RandomElement(gossipStones); + RandomizerCheck gossipStone = RandomElement(gossipStones); Text hint = junkHint.GetText(); SPDLOG_DEBUG("\tMessage: "); @@ -494,26 +502,27 @@ static void CreateJunkHint() { AddHint(hint, gossipStone, { QM_PINK }, HINT_TYPE_JUNK); } -static std::vector CalculateBarrenRegions() { - std::vector barrenLocations = {}; - std::vector potentiallyUsefulLocations = {}; +static std::vector CalculateBarrenRegions() { + auto ctx = Rando::Context::GetInstance(); + std::vector barrenLocations = {}; + std::vector potentiallyUsefulLocations = {}; - for (uint32_t loc : allLocations) { + for (RandomizerCheck loc : ctx->allLocations) { // If a location has a major item or is a way of the hero location, it is not barren - if (Location(loc)->GetPlacedItem().IsMajorItem() || ElementInContainer(loc, wothLocations)) { + if (ctx->GetItemLocation(loc)->GetPlacedItem().IsMajorItem() || ElementInContainer(loc, ctx->wothLocations)) { AddElementsToPool(potentiallyUsefulLocations, std::vector{loc}); } else { // Link's Pocket & Triforce Hunt "reward" shouldn't be considered for barren areas because it's clear what // they have to a player. - if (loc != LINKS_POCKET && loc != TRIFORCE_COMPLETED) { + if (loc != RC_LINKS_POCKET && loc != RC_TRIFORCE_COMPLETED) { AddElementsToPool(barrenLocations, std::vector{loc}); } } } // Leave only locations at barren regions in the list - auto finalBarrenLocations = FilterFromPool(barrenLocations, [&potentiallyUsefulLocations](uint32_t loc){ - for (uint32_t usefulLoc : potentiallyUsefulLocations) { + auto finalBarrenLocations = FilterFromPool(barrenLocations, [&potentiallyUsefulLocations](RandomizerCheck loc){ + for (RandomizerCheck usefulLoc : potentiallyUsefulLocations) { uint32_t barrenKey = GetLocationRegionuint32_t(loc); uint32_t usefulKey = GetLocationRegionuint32_t(usefulLoc); if (barrenKey == usefulKey) { @@ -535,7 +544,7 @@ static void CreateTrialHints() { auto gossipStone = RandomElement(gossipStones, false); //make hint - auto hint = Hint(PREFIX).GetText() + Hint(SIX_TRIALS).GetText(); + auto hint = Hint(RHT_PREFIX).GetText() + Hint(RHT_SIX_TRIALS).GetText(); AddHint(hint, gossipStone, { QM_PINK }, HINT_TYPE_TRIAL); //zero trials @@ -546,7 +555,7 @@ static void CreateTrialHints() { auto gossipStone = RandomElement(gossipStones, false); //make hint - auto hint = Hint(PREFIX).GetText() + Hint(ZERO_TRIALS).GetText(); + auto hint = Hint(RHT_PREFIX).GetText() + Hint(RHT_ZERO_TRIALS).GetText(); AddHint(hint, gossipStone, { QM_YELLOW }, HINT_TYPE_TRIAL); //4 or 5 required trials @@ -564,7 +573,7 @@ static void CreateTrialHints() { auto gossipStone = RandomElement(gossipStones, false); //make hint - auto hint = Hint(PREFIX).GetText()+"#"+trial->GetName()+"#"+Hint(FOUR_TO_FIVE_TRIALS).GetText(); + auto hint = Hint(RHT_PREFIX).GetText()+"#"+trial->GetName()+"#"+Hint(RHT_FOUR_TO_FIVE_TRIALS).GetText(); AddHint(hint, gossipStone, { QM_YELLOW }, HINT_TYPE_TRIAL); } //1 to 3 trials @@ -581,44 +590,54 @@ static void CreateTrialHints() { auto gossipStone = RandomElement(gossipStones, false); //make hint - auto hint = Hint(PREFIX).GetText()+"#"+trial->GetName()+"#"+Hint(ONE_TO_THREE_TRIALS).GetText(); + auto hint = Hint(RHT_PREFIX).GetText()+"#"+trial->GetName()+"#"+Hint(RHT_ONE_TO_THREE_TRIALS).GetText(); AddHint(hint, gossipStone, { QM_PINK }, HINT_TYPE_TRIAL); } } } void CreateGanonText() { - + auto ctx = Rando::Context::GetInstance(); //funny ganon line ganonText = RandomElement(GetHintCategory(HintCategory::GanonLine)).GetText(); CreateMessageFromTextObject(0x70CB, 0, 2, 3, AddColorsAndFormat(ganonText)); //Get the location of the light arrows - auto lightArrowLocation = FilterFromPool(allLocations, [](const uint32_t loc){return Location(loc)->GetPlaceduint32_t() == LIGHT_ARROWS;}); + auto lightArrowLocation = FilterFromPool(ctx->allLocations, [ctx](const RandomizerCheck loc) { + return ctx->GetItemLocation(loc)->GetPlacedRandomizerGet() == RG_LIGHT_ARROWS; + }); //If there is no light arrow location, it was in the player's inventory at the start - auto hint = Hint(LIGHT_ARROW_LOCATION_HINT); + auto hint = Hint(RHT_LIGHT_ARROW_LOCATION_HINT); if (lightArrowLocation.empty()) { - ganonHintText = hint.GetText()+Hint(YOUR_POCKET).GetText(); + ganonHintText = hint.GetText()+Hint(RHT_YOUR_POCKET).GetText(); lightArrowHintLoc = "Link's Pocket"; } else { - ganonHintText = hint.GetText() + "%r" + GetHintRegion(Location(lightArrowLocation[0])->GetParentRegionKey())->GetHint().GetText(); - lightArrowHintLoc = Location(lightArrowLocation[0])->GetName(); + ganonHintText = + hint.GetText() + "%r" + + GetHintRegion(ctx->GetItemLocation(lightArrowLocation[0])->GetParentRegionKey())->GetHint().GetText(); + lightArrowHintLoc = Rando::StaticData::GetLocation(lightArrowLocation[0])->GetName(); } ganonHintText = ganonHintText + "!"; CreateMessageFromTextObject(0x70CC, 0, 2, 3, AddColorsAndFormat(ganonHintText)); + ctx->AddHint(RH_GANONDORF_HINT, ganonHintText, lightArrowLocation[0], HINT_TYPE_STATIC, GetHintRegion(ctx->GetItemLocation(lightArrowLocation[0])->GetParentRegionKey())->GetHint().GetText()); } //Find the location which has the given itemKey and create the generic altar text for the reward -static Text BuildDungeonRewardText(const uint32_t itemKey) { - uint32_t location = FilterFromPool(allLocations, [itemKey](const uint32_t loc){return Location(loc)->GetPlaceduint32_t() == itemKey;})[0]; - Location(location)->SetAsHinted(); +static Text BuildDungeonRewardText(const RandomizerGet itemKey) { + auto ctx = Rando::Context::GetInstance(); + RandomizerCheck location = FilterFromPool(ctx->allLocations, [itemKey, ctx](const RandomizerCheck loc) { + return ctx->GetItemLocation(loc)->GetPlacedRandomizerGet() == itemKey; + })[0]; + ctx->GetItemLocation(location)->SetAsHinted(); - std::string rewardString = "$" + std::to_string(itemKey - KOKIRI_EMERALD); + std::string rewardString = "$" + std::to_string(itemKey - RG_KOKIRI_EMERALD); - // RANDOTODO implement colors for locations - return Text()+rewardString+GetHintRegion(Location(location)->GetParentRegionKey())->GetHint().GetText().Capitalize()+"...^"; + // RANDOTODO implement colors for locations + return Text() + rewardString + + GetHintRegion(ctx->GetItemLocation(location)->GetParentRegionKey())->GetHint().GetText().Capitalize() + + "...^"; } static Text BuildDoorOfTimeText() { @@ -627,22 +646,22 @@ static Text BuildDoorOfTimeText() { if (OpenDoorOfTime.Is(OPENDOOROFTIME_OPEN)) { itemObtained = "$o"; - doorOfTimeText = Hint(CHILD_ALTAR_TEXT_END_DOTOPEN).GetText(); + doorOfTimeText = Hint(RHT_CHILD_ALTAR_TEXT_END_DOTOPEN).GetText(); } else if (OpenDoorOfTime.Is(OPENDOOROFTIME_SONGONLY)) { itemObtained = "$c"; - doorOfTimeText = Hint(CHILD_ALTAR_TEXT_END_DOTSONGONLY).GetText(); + doorOfTimeText = Hint(RHT_CHILD_ALTAR_TEXT_END_DOTSONGONLY).GetText(); } else if (OpenDoorOfTime.Is(OPENDOOROFTIME_CLOSED)) { itemObtained = "$i"; - doorOfTimeText = Hint(CHILD_ALTAR_TEXT_END_DOTCLOSED).GetText(); + doorOfTimeText = Hint(RHT_CHILD_ALTAR_TEXT_END_DOTCLOSED).GetText(); } return Text()+itemObtained+doorOfTimeText; } //insert the required number into the hint and set the singular/plural form -static Text BuildCountReq(const uint32_t req, const Option& count) { +static Text BuildCountReq(const RandomizerHintTextKey req, const Option& count) { Text requirement = Hint(req).GetTextCopy(); if (count.Value() == 1) { requirement.SetForm(SINGULAR); @@ -657,28 +676,28 @@ static Text BuildBridgeReqsText() { Text bridgeText; if (Bridge.Is(RAINBOWBRIDGE_OPEN)) { - bridgeText = Hint(BRIDGE_OPEN_HINT).GetText(); + bridgeText = Hint(RHT_BRIDGE_OPEN_HINT).GetText(); } else if (Bridge.Is(RAINBOWBRIDGE_VANILLA)) { - bridgeText = Hint(BRIDGE_VANILLA_HINT).GetText(); + bridgeText = Hint(RHT_BRIDGE_VANILLA_HINT).GetText(); } else if (Bridge.Is(RAINBOWBRIDGE_STONES)) { - bridgeText = BuildCountReq(BRIDGE_STONES_HINT, BridgeStoneCount); + bridgeText = BuildCountReq(RHT_BRIDGE_STONES_HINT, BridgeStoneCount); } else if (Bridge.Is(RAINBOWBRIDGE_MEDALLIONS)) { - bridgeText = BuildCountReq(BRIDGE_MEDALLIONS_HINT, BridgeMedallionCount); + bridgeText = BuildCountReq(RHT_BRIDGE_MEDALLIONS_HINT, BridgeMedallionCount); } else if (Bridge.Is(RAINBOWBRIDGE_REWARDS)) { - bridgeText = BuildCountReq(BRIDGE_REWARDS_HINT, BridgeRewardCount); + bridgeText = BuildCountReq(RHT_BRIDGE_REWARDS_HINT, BridgeRewardCount); } else if (Bridge.Is(RAINBOWBRIDGE_DUNGEONS)) { - bridgeText = BuildCountReq(BRIDGE_DUNGEONS_HINT, BridgeDungeonCount); + bridgeText = BuildCountReq(RHT_BRIDGE_DUNGEONS_HINT, BridgeDungeonCount); } else if (Bridge.Is(RAINBOWBRIDGE_TOKENS)) { - bridgeText = BuildCountReq(BRIDGE_TOKENS_HINT, BridgeTokenCount); + bridgeText = BuildCountReq(RHT_BRIDGE_TOKENS_HINT, BridgeTokenCount); } else if (Bridge.Is(RAINBOWBRIDGE_GREG)) { - bridgeText = Hint(BRIDGE_GREG_HINT).GetText(); + bridgeText = Hint(RHT_BRIDGE_GREG_HINT).GetText(); } return Text()+"$l"+bridgeText+"^"; @@ -688,88 +707,90 @@ static Text BuildGanonBossKeyText() { Text ganonBossKeyText; if (GanonsBossKey.Is(GANONSBOSSKEY_START_WITH)) { - ganonBossKeyText = Hint(GANON_BK_START_WITH_HINT).GetText(); + ganonBossKeyText = Hint(RHT_GANON_BK_START_WITH_HINT).GetText(); } else if (GanonsBossKey.Is(GANONSBOSSKEY_VANILLA)) { - ganonBossKeyText = Hint(GANON_BK_VANILLA_HINT).GetText(); + ganonBossKeyText = Hint(RHT_GANON_BK_VANILLA_HINT).GetText(); } else if (GanonsBossKey.Is(GANONSBOSSKEY_OWN_DUNGEON)) { - ganonBossKeyText = Hint(GANON_BK_OWN_DUNGEON_HINT).GetText(); + ganonBossKeyText = Hint(RHT_GANON_BK_OWN_DUNGEON_HINT).GetText(); } else if (GanonsBossKey.Is(GANONSBOSSKEY_ANY_DUNGEON)) { - ganonBossKeyText = Hint(GANON_BK_ANY_DUNGEON_HINT).GetText(); + ganonBossKeyText = Hint(RHT_GANON_BK_ANY_DUNGEON_HINT).GetText(); } else if (GanonsBossKey.Is(GANONSBOSSKEY_OVERWORLD)) { - ganonBossKeyText = Hint(GANON_BK_OVERWORLD_HINT).GetText(); + ganonBossKeyText = Hint(RHT_GANON_BK_OVERWORLD_HINT).GetText(); } else if (GanonsBossKey.Is(GANONSBOSSKEY_ANYWHERE)) { - ganonBossKeyText = Hint(GANON_BK_ANYWHERE_HINT).GetText(); + ganonBossKeyText = Hint(RHT_GANON_BK_ANYWHERE_HINT).GetText(); } else if (GanonsBossKey.Is(GANONSBOSSKEY_FINAL_GS_REWARD)) { - ganonBossKeyText = Hint(GANON_BK_SKULLTULA_HINT).GetText(); + ganonBossKeyText = Hint(RHT_GANON_BK_SKULLTULA_HINT).GetText(); } else if (GanonsBossKey.Is(GANONSBOSSKEY_LACS_VANILLA)) { - ganonBossKeyText = Hint(LACS_VANILLA_HINT).GetText(); + ganonBossKeyText = Hint(RHT_LACS_VANILLA_HINT).GetText(); } else if (GanonsBossKey.Is(GANONSBOSSKEY_LACS_STONES)) { - ganonBossKeyText = BuildCountReq(LACS_STONES_HINT, LACSStoneCount); + ganonBossKeyText = BuildCountReq(RHT_LACS_STONES_HINT, LACSStoneCount); } else if (GanonsBossKey.Is(GANONSBOSSKEY_LACS_MEDALLIONS)) { - ganonBossKeyText = BuildCountReq(LACS_MEDALLIONS_HINT, LACSMedallionCount); + ganonBossKeyText = BuildCountReq(RHT_LACS_MEDALLIONS_HINT, LACSMedallionCount); } else if (GanonsBossKey.Is(GANONSBOSSKEY_LACS_REWARDS)) { - ganonBossKeyText = BuildCountReq(LACS_REWARDS_HINT, LACSRewardCount); + ganonBossKeyText = BuildCountReq(RHT_LACS_REWARDS_HINT, LACSRewardCount); } else if (GanonsBossKey.Is(GANONSBOSSKEY_LACS_DUNGEONS)) { - ganonBossKeyText = BuildCountReq(LACS_DUNGEONS_HINT, LACSDungeonCount); + ganonBossKeyText = BuildCountReq(RHT_LACS_DUNGEONS_HINT, LACSDungeonCount); } else if (GanonsBossKey.Is(GANONSBOSSKEY_LACS_TOKENS)) { - ganonBossKeyText = BuildCountReq(LACS_TOKENS_HINT, LACSTokenCount); + ganonBossKeyText = BuildCountReq(RHT_LACS_TOKENS_HINT, LACSTokenCount); } else if (GanonsBossKey.Is(GANONSBOSSKEY_TRIFORCE_HUNT)) { - ganonBossKeyText = Hint(GANON_BK_TRIFORCE_HINT).GetText(); + ganonBossKeyText = Hint(RHT_GANON_BK_TRIFORCE_HINT).GetText(); } return Text()+"$b"+ganonBossKeyText+"^"; } void CreateAltarText() { + auto ctx = Rando::Context::GetInstance(); //Child Altar Text if (AltarHintText) { - childAltarText = Hint(SPIRITUAL_STONE_TEXT_START).GetText()+"^"+ + childAltarText = Hint(RHT_SPIRITUAL_STONE_TEXT_START).GetText()+"^"+ //Spiritual Stones (StartingKokiriEmerald.Value() ? Text{ "##", "##", "##" } - : BuildDungeonRewardText(KOKIRI_EMERALD)) + + : BuildDungeonRewardText(RG_KOKIRI_EMERALD)) + (StartingGoronRuby.Value() ? Text{ "##", "##", "##" } - : BuildDungeonRewardText(GORON_RUBY)) + + : BuildDungeonRewardText(RG_GORON_RUBY)) + (StartingZoraSapphire.Value() ? Text{ "##", "##", "##" } - : BuildDungeonRewardText(ZORA_SAPPHIRE)) + + : BuildDungeonRewardText(RG_ZORA_SAPPHIRE)) + //How to open Door of Time, the event trigger is necessary to read the altar multiple times BuildDoorOfTimeText(); } else { childAltarText = BuildDoorOfTimeText(); } + ctx->AddHint(RH_ALTAR_CHILD, childAltarText, RC_UNKNOWN_CHECK, HINT_TYPE_STATIC, Text()); CreateMessageFromTextObject(0x7040, 0, 2, 3, AddColorsAndFormat(childAltarText, {QM_GREEN, QM_RED, QM_BLUE})); //Adult Altar Text - adultAltarText = Hint(ADULT_ALTAR_TEXT_START).GetText() + "^"; + adultAltarText = Hint(RHT_ADULT_ALTAR_TEXT_START).GetText() + "^"; if (AltarHintText) { adultAltarText = adultAltarText + //Medallion Areas (StartingLightMedallion.Value() ? Text{ "##", "##", "##" } - : BuildDungeonRewardText(LIGHT_MEDALLION)) + + : BuildDungeonRewardText(RG_LIGHT_MEDALLION)) + (StartingForestMedallion.Value() ? Text{ "##", "##", "##" } - : BuildDungeonRewardText(FOREST_MEDALLION)) + + : BuildDungeonRewardText(RG_FOREST_MEDALLION)) + (StartingFireMedallion.Value() ? Text{ "##", "##", "##" } - : BuildDungeonRewardText(FIRE_MEDALLION)) + + : BuildDungeonRewardText(RG_FIRE_MEDALLION)) + (StartingWaterMedallion.Value() ? Text{ "##", "##", "##" } - : BuildDungeonRewardText(WATER_MEDALLION)) + + : BuildDungeonRewardText(RG_WATER_MEDALLION)) + (StartingSpiritMedallion.Value() ? Text{ "##", "##", "##" } - : BuildDungeonRewardText(SPIRIT_MEDALLION)) + + : BuildDungeonRewardText(RG_SPIRIT_MEDALLION)) + (StartingShadowMedallion.Value() ? Text{ "##", "##", "##" } - : BuildDungeonRewardText(SHADOW_MEDALLION)); + : BuildDungeonRewardText(RG_SHADOW_MEDALLION)); } adultAltarText = adultAltarText + //Bridge requirement @@ -779,40 +800,53 @@ void CreateAltarText() { BuildGanonBossKeyText()+ //End - Hint(ADULT_ALTAR_TEXT_END).GetText(); + Hint(RHT_ADULT_ALTAR_TEXT_END).GetText(); CreateMessageFromTextObject(0x7088, 0, 2, 3, AddColorsAndFormat(adultAltarText, {QM_RED, QM_YELLOW, QM_GREEN, QM_RED, QM_BLUE, QM_YELLOW, QM_PINK, QM_RED, QM_RED, QM_RED, QM_RED})); + ctx->AddHint(RH_ALTAR_ADULT, adultAltarText, RC_UNKNOWN_CHECK, HINT_TYPE_STATIC, Text()); } void CreateMerchantsHints() { + auto ctx = Rando::Context::GetInstance(); + Text medigoronItemText = ctx->GetItemLocation(RC_GC_MEDIGORON)->GetPlacedItem().GetHint().GetText(); + Text grannyItemText = ctx->GetItemLocation(RC_KAK_GRANNYS_SHOP)->GetPlacedItem().GetHint().GetText(); + Text carpetSalesmanItemText = + ctx->GetItemLocation(RC_WASTELAND_BOMBCHU_SALESMAN)->GetPlacedItem().GetHint().GetText(); + Text carpetSalesmanItemClearText = + ctx->GetItemLocation(RC_WASTELAND_BOMBCHU_SALESMAN)->GetPlacedItem().GetHint().GetClear(); - Text medigoronItemText = Location(GC_MEDIGORON)->GetPlacedItem().GetHint().GetText(); - Text grannyItemText = Location(KAK_GRANNYS_SHOP)->GetPlacedItem().GetHint().GetText(); - Text carpetSalesmanItemText = Location(WASTELAND_BOMBCHU_SALESMAN)->GetPlacedItem().GetHint().GetText(); - Text carpetSalesmanItemClearText = Location(WASTELAND_BOMBCHU_SALESMAN)->GetPlacedItem().GetHint().GetClear(); + Text grannyCapitalItemText = grannyItemText.Capitalize(); - Text grannyCapitalItemText = grannyItemText.Capitalize(); + Text medigoronText = + Hint(RHT_MEDIGORON_DIALOG_FIRST).GetText() + medigoronItemText + Hint(RHT_MEDIGORON_DIALOG_SECOND).GetText(); + Text grannyText = grannyCapitalItemText + Hint(RHT_GRANNY_DIALOG).GetText(); + Text carpetSalesmanTextOne = Hint(RHT_CARPET_SALESMAN_DIALOG_FIRST).GetText() + carpetSalesmanItemText + + Hint(RHT_CARPET_SALESMAN_DIALOG_SECOND).GetText(); + Text carpetSalesmanTextTwo = Hint(RHT_CARPET_SALESMAN_DIALOG_THIRD).GetText() + carpetSalesmanItemClearText + + Hint(RHT_CARPET_SALESMAN_DIALOG_FOURTH).GetText(); - Text medigoronText = Hint(MEDIGORON_DIALOG_FIRST).GetText()+medigoronItemText+Hint(MEDIGORON_DIALOG_SECOND).GetText(); - Text grannyText = grannyCapitalItemText+Hint(GRANNY_DIALOG).GetText(); - Text carpetSalesmanTextOne = Hint(CARPET_SALESMAN_DIALOG_FIRST).GetText()+carpetSalesmanItemText+Hint(CARPET_SALESMAN_DIALOG_SECOND).GetText(); - Text carpetSalesmanTextTwo = Hint(CARPET_SALESMAN_DIALOG_THIRD).GetText()+carpetSalesmanItemClearText+Hint(CARPET_SALESMAN_DIALOG_FOURTH).GetText(); - - CreateMessageFromTextObject(0x9120, 0, 2, 3, AddColorsAndFormat(medigoronText, {QM_RED, QM_GREEN})); - CreateMessageFromTextObject(0x9121, 0, 2, 3, AddColorsAndFormat(grannyText, {QM_RED, QM_GREEN})); - CreateMessageFromTextObject(0x6077, 0, 2, 3, AddColorsAndFormat(carpetSalesmanTextOne, {QM_RED, QM_GREEN})); - CreateMessageFromTextObject(0x6078, 0, 2, 3, AddColorsAndFormat(carpetSalesmanTextTwo, {QM_RED, QM_YELLOW, QM_RED})); + CreateMessageFromTextObject(0x9120, 0, 2, 3, AddColorsAndFormat(medigoronText, { QM_RED, QM_GREEN })); + CreateMessageFromTextObject(0x9121, 0, 2, 3, AddColorsAndFormat(grannyText, { QM_RED, QM_GREEN })); + CreateMessageFromTextObject(0x6077, 0, 2, 3, AddColorsAndFormat(carpetSalesmanTextOne, { QM_RED, QM_GREEN })); + CreateMessageFromTextObject(0x6078, 0, 2, 3, + AddColorsAndFormat(carpetSalesmanTextTwo, { QM_RED, QM_YELLOW, QM_RED })); + ctx->AddHint(RH_MEDIGORON, medigoronText, RC_GC_MEDIGORON, HINT_TYPE_STATIC, GetHintRegion(RR_GORON_CITY)->GetHint().GetText()); + ctx->AddHint(RH_GRANNYS_SHOP, grannyText, RC_KAK_GRANNYS_SHOP, HINT_TYPE_STATIC, GetHintRegion(RR_KAKARIKO_VILLAGE)->GetHint().GetText()); + ctx->AddHint(RH_WASTELAND_BOMBCHU_SALESMAN, carpetSalesmanTextOne, RC_WASTELAND_BOMBCHU_SALESMAN, HINT_TYPE_STATIC, GetHintRegion(RR_HAUNTED_WASTELAND)->GetHint().GetText()); } void CreateDampesDiaryText() { + auto ctx = Rando::Context::GetInstance(); if (!DampeHintText) { dampesText = Text(); dampeHintLoc = ""; return; } - uint32_t item = PROGRESSIVE_HOOKSHOT; - uint32_t location = FilterFromPool(allLocations, [item](const uint32_t loc){return Location(loc)->GetPlaceduint32_t() == item;})[0]; - Text area = GetHintRegion(Location(location)->GetParentRegionKey())->GetHint().GetText(); + RandomizerGet item = RG_PROGRESSIVE_HOOKSHOT; + RandomizerCheck location = FilterFromPool(ctx->allLocations, [item, ctx](const RandomizerCheck loc) { + return ctx->GetItemLocation(loc)->GetPlacedRandomizerGet() == item; + })[0]; + Text area = GetHintRegion(ctx->GetItemLocation(location)->GetParentRegionKey())->GetHint().GetText(); Text temp1 = Text{ "Whoever reads this, please enter %r", "Toi qui lit ce journal, rends-toi dans %r", @@ -826,17 +860,21 @@ void CreateDampesDiaryText() { }; dampesText = temp1 + area + temp2; - dampeHintLoc = Location(location)->GetName(); + dampeHintLoc = Rando::StaticData::GetLocation(location)->GetName(); + ctx->AddHint(RH_DAMPES_DIARY, dampesText, location, HINT_TYPE_STATIC, area); } void CreateGregRupeeHint() { + auto ctx = Rando::Context::GetInstance(); if (!GregHintText) { gregText = Text(); return; } - uint32_t location = FilterFromPool(allLocations, [](const uint32_t loc){return Location(loc)->GetPlacedItemKey() == GREG_RUPEE;})[0]; - Text area = GetHintRegion(Location(location)->GetParentRegionKey())->GetHint().GetText(); + RandomizerCheck location = FilterFromPool(ctx->allLocations, [ctx](const RandomizerCheck loc) { + return ctx->GetItemLocation(loc)->GetPlacedRandomizerGet() == RG_GREG_RUPEE; + })[0]; + Text area = GetHintRegion(ctx->GetItemLocation(location)->GetParentRegionKey())->GetHint().GetText(); Text temp1 = Text{ "By the way, if you're interested, I saw the shiniest %gGreen Rupee%w somewhere in%r ", @@ -851,13 +889,15 @@ void CreateGregRupeeHint() { }; gregText = temp1 + area + temp2; + ctx->AddHint(RH_GREG_RUPEE, gregText, location, HINT_TYPE_STATIC, area); } void CreateSheikText() { + auto ctx = Rando::Context::GetInstance(); //Get the location of the light arrows - auto lightArrowLocation = FilterFromPool(allLocations, [](const uint32_t loc){return Location(loc)->GetPlaceduint32_t() == LIGHT_ARROWS;}); - lightArrowHintLoc = Location(lightArrowLocation[0])->GetName(); - Text area = GetHintRegion(Location(lightArrowLocation[0])->GetParentRegionKey())->GetHint().GetText(); + auto lightArrowLocation = FilterFromPool(ctx->allLocations, [ctx](const RandomizerCheck loc){return ctx->GetItemLocation(loc)->GetPlacedRandomizerGet() == RG_LIGHT_ARROWS;}); + lightArrowHintLoc = Rando::StaticData::GetLocation(lightArrowLocation[0])->GetName(); + Text area = GetHintRegion(ctx->GetItemLocation(lightArrowLocation[0])->GetParentRegionKey())->GetHint().GetText(); Text temp1 = Text{ "I overheard Ganondorf say that he misplaced the %yLight Arrows%w in&%r", "J'ai entendu dire que Ganondorf aurait caché les %yFlèches de Lumière%w dans %r", @@ -868,10 +908,11 @@ void CreateSheikText() { } void CreateSariaText() { - //Get the location of the light arrows - auto magicLocation = FilterFromPool(allLocations, [](const uint32_t loc){return Location(loc)->GetPlaceduint32_t() == PROGRESSIVE_MAGIC_METER;}); - sariaHintLoc = Location(magicLocation[0])->GetName(); - Text area = GetHintRegion(Location(magicLocation[0])->GetParentRegionKey())->GetHint().GetText(); + auto ctx = Rando::Context::GetInstance(); + //Get the location of a magic upgrade + auto magicLocation = FilterFromPool(ctx->allLocations, [ctx](const RandomizerCheck loc){return ctx->GetItemLocation(loc)->GetPlacedRandomizerGet() == RG_PROGRESSIVE_MAGIC_METER;}); + sariaHintLoc = Rando::StaticData::GetLocation(magicLocation[0])->GetName(); + Text area = GetHintRegion(ctx->GetItemLocation(magicLocation[0])->GetParentRegionKey())->GetHint().GetText(); Text temp1 = Text{ "Did you feel the %gsurge of magic%w recently? A mysterious bird told me it came from %r", "As-tu récemment ressenti une vague de %gpuissance magique%w? Un mystérieux hibou m'a dit qu'elle provenait du %r", @@ -935,7 +976,7 @@ void CreateWarpSongTexts() { } void CreateAllHints() { - + auto ctx = Rando::Context::GetInstance(); SPDLOG_DEBUG("\nNOW CREATING HINTS\n"); const HintSetting& hintSetting = hintSettingTable[Settings::HintDistribution.Value()]; @@ -944,24 +985,26 @@ void CreateAllHints() { // Add 'always' location hints if (hintSetting.distTable[static_cast(HINT_TYPE_ALWAYS)].copies > 0) { - // Only filter locations that had a random item placed at them (e.g. don't get cow locations if shuffle cows is off) - auto alwaysHintLocations = FilterFromPool(allLocations, [](const uint32_t loc){ - return ((Location(loc)->GetHint().GetType() == HintCategory::Always) || - // If we have Rainbow Bridge set to Greg, add a hint for where Greg is - (Bridge.Is(RAINBOWBRIDGE_GREG) && !GregHintText && Location(loc)->GetPlacedItemKey() == GREG_RUPEE)) && - Location(loc)->IsHintable() && !(Location(loc)->IsHintedAt()); - }); + // Only filter locations that had a random item placed at them (e.g. don't get cow locations if shuffle cows is + // off) + auto alwaysHintLocations = FilterFromPool(ctx->allLocations, [ctx](const RandomizerCheck loc) { + return ((Rando::StaticData::GetLocation(loc)->GetHint()->GetType() == HintCategory::Always) || + // If we have Rainbow Bridge set to Greg, add a hint for where Greg is + (Bridge.Is(RAINBOWBRIDGE_GREG) && !GregHintText && + ctx->GetItemLocation(loc)->GetPlacedRandomizerGet() == RG_GREG_RUPEE)) && + ctx->GetItemLocation(loc)->IsHintable() && !(ctx->GetItemLocation(loc)->IsHintedAt()); + }); - for (auto& hint : conditionalAlwaysHints) { - uint32_t loc = hint.first; - if (hint.second() && Location(loc)->IsHintable() && !Location(loc)->IsHintedAt()) { - alwaysHintLocations.push_back(loc); - } - } + for (auto& hint : conditionalAlwaysHints) { + RandomizerCheck loc = hint.first; + if (hint.second() && ctx->GetItemLocation(loc)->IsHintable() && !ctx->GetItemLocation(loc)->IsHintedAt()) { + alwaysHintLocations.push_back(loc); + } + } - for (uint32_t location : alwaysHintLocations) { - CreateLocationHint({location}); - } + for (RandomizerCheck location : alwaysHintLocations) { + CreateLocationHint({ location }); + } } //Add 'trial' location hints @@ -987,8 +1030,8 @@ void CreateAllHints() { "Water Temple", "Spirit Temple", "Shadow Temple", "Bottom of the Well", "Ice Cavern"}; //Get list of all barren dungeons std::vector barrenDungeons; - for (uint32_t barrenLocation : barrenLocations) { - std::string barrenRegion = GetHintRegion(Location(barrenLocation)->GetParentRegionKey())->scene; + for (RandomizerCheck barrenLocation : barrenLocations) { + std::string barrenRegion = GetHintRegion(ctx->GetItemLocation(barrenLocation)->GetParentRegionKey())->scene; bool isDungeon = std::find(dungeonNames.begin(), dungeonNames.end(), barrenRegion) != dungeonNames.end(); //If it hasn't already been added to the list and is a dungeon, add to list if (isDungeon && std::find(barrenDungeons.begin(), barrenDungeons.end(), barrenRegion) == barrenDungeons.end()) { @@ -1002,8 +1045,8 @@ void CreateAllHints() { //Get list of all woth dungeons std::vector wothDungeons; - for (uint32_t wothLocation : wothLocations) { - std::string wothRegion = GetHintRegion(Location(wothLocation)->GetParentRegionKey())->scene; + for (RandomizerCheck wothLocation : ctx->wothLocations) { + std::string wothRegion = GetHintRegion(ctx->GetItemLocation(wothLocation)->GetParentRegionKey())->scene; bool isDungeon = std::find(dungeonNames.begin(), dungeonNames.end(), wothRegion) != dungeonNames.end(); //If it hasn't already been added to the list and is a dungeon, add to list if (isDungeon && std::find(wothDungeons.begin(), wothDungeons.end(), wothRegion) == wothDungeons.end()) { @@ -1028,58 +1071,78 @@ void CreateAllHints() { } //while there are still gossip stones remaining - while (FilterFromPool(gossipStoneLocations, [](const uint32_t loc){return Location(loc)->GetPlaceduint32_t() == NONE;}).size() != 0) { - //TODO: fixed hint types + while (FilterFromPool(Rando::StaticData::gossipStoneLocations, [ctx](const RandomizerCheck loc) { + return ctx->GetItemLocation(loc)->GetPlacedRandomizerGet() == RG_NONE; + }).size() != 0) { + // TODO: fixed hint types - if (remainingHintTypes.empty()) { - break; - } + if (remainingHintTypes.empty()) { + break; + } - //get a random hint type from the remaining hints - HintType type = RandomElement(remainingHintTypes, true); + // get a random hint type from the remaining hints + HintType type = RandomElement(remainingHintTypes, true); - SPDLOG_DEBUG("Attempting to make hint of type: "); - SPDLOG_DEBUG(hintTypeNames.find(type)->second); - SPDLOG_DEBUG("\n"); + SPDLOG_DEBUG("Attempting to make hint of type: "); + SPDLOG_DEBUG(hintTypeNames.find(type)->second); + SPDLOG_DEBUG("\n"); - //create the appropriate hint for the type - if (type == HINT_TYPE_WOTH) { - CreateWothHint(&remainingDungeonWothHints); + // create the appropriate hint for the type + if (type == HINT_TYPE_WOTH) { + CreateWothHint(&remainingDungeonWothHints); - } else if (type == HINT_TYPE_BARREN) { - CreateBarrenHint(&remainingDungeonBarrenHints, barrenLocations); + } else if (type == HINT_TYPE_BARREN) { + CreateBarrenHint(&remainingDungeonBarrenHints, barrenLocations); - } else if (type == HINT_TYPE_SOMETIMES){ - std::vector sometimesHintLocations = FilterFromPool(allLocations, [](const uint32_t loc){return Location(loc)->GetHint().GetType() == HintCategory::Sometimes && Location(loc)->IsHintable() && !(Location(loc)->IsHintedAt());}); - CreateLocationHint(sometimesHintLocations); + } else if (type == HINT_TYPE_SOMETIMES) { + std::vector sometimesHintLocations = + FilterFromPool(ctx->allLocations, [ctx](const RandomizerCheck loc) { + return ctx->GetHint(ctx->GetItemLocation(loc)->GetHintKey())->GetHintType() == HINT_TYPE_SOMETIMES && + ctx->GetItemLocation(loc)->IsHintable() && !(ctx->GetItemLocation(loc)->IsHintedAt()); + }); + CreateLocationHint(sometimesHintLocations); - } else if (type == HINT_TYPE_RANDOM) { - CreateRandomLocationHint(); + } else if (type == HINT_TYPE_RANDOM) { + CreateRandomLocationHint(); - } else if (type == HINT_TYPE_ITEM) { - CreateGoodItemHint(); + } else if (type == HINT_TYPE_ITEM) { + CreateGoodItemHint(); - } else if (type == HINT_TYPE_SONG){ - std::vector songHintLocations = FilterFromPool(allLocations, [](const uint32_t loc){return Location(loc)->IsCategory(Category::cSong) && Location(loc)->IsHintable() && !(Location(loc)->IsHintedAt());}); - CreateLocationHint(songHintLocations); + } else if (type == HINT_TYPE_SONG) { + std::vector songHintLocations = + FilterFromPool(ctx->allLocations, [ctx](const RandomizerCheck loc) { + return Rando::StaticData::GetLocation(loc)->IsCategory(Category::cSong) && + ctx->GetItemLocation(loc)->IsHintable() && !(ctx->GetItemLocation(loc)->IsHintedAt()); + }); + CreateLocationHint(songHintLocations); - } else if (type == HINT_TYPE_OVERWORLD){ - std::vector overworldHintLocations = FilterFromPool(allLocations, [](const uint32_t loc){return Location(loc)->IsOverworld() && Location(loc)->IsHintable() && !(Location(loc)->IsHintedAt());}); - CreateLocationHint(overworldHintLocations); + } else if (type == HINT_TYPE_OVERWORLD) { + std::vector overworldHintLocations = + FilterFromPool(ctx->allLocations, [ctx](const RandomizerCheck loc) { + return Rando::StaticData::GetLocation(loc)->IsOverworld() && ctx->GetItemLocation(loc)->IsHintable() && + !(ctx->GetItemLocation(loc)->IsHintedAt()); + }); + CreateLocationHint(overworldHintLocations); - } else if (type == HINT_TYPE_DUNGEON){ - std::vector dungeonHintLocations = FilterFromPool(allLocations, [](const uint32_t loc){return Location(loc)->IsDungeon() && Location(loc)->IsHintable() && !(Location(loc)->IsHintedAt());}); - CreateLocationHint(dungeonHintLocations); + } else if (type == HINT_TYPE_DUNGEON) { + std::vector dungeonHintLocations = + FilterFromPool(ctx->allLocations, [ctx](const RandomizerCheck loc) { + return Rando::StaticData::GetLocation(loc)->IsDungeon() && ctx->GetItemLocation(loc)->IsHintable() && + !(ctx->GetItemLocation(loc)->IsHintedAt()); + }); + CreateLocationHint(dungeonHintLocations); - } else if (type == HINT_TYPE_JUNK) { - CreateJunkHint(); - } + } else if (type == HINT_TYPE_JUNK) { + CreateJunkHint(); + } } //If any gossip stones failed to have a hint placed on them for some reason, place a junk hint as a failsafe. - for (uint32_t gossipStone : FilterFromPool(gossipStoneLocations, [](const uint32_t loc){return Location(loc)->GetPlaceduint32_t() == NONE;})) { - const HintText junkHint = RandomElement(GetHintCategory(HintCategory::Junk)); - AddHint(junkHint.GetText(), gossipStone, {QM_PINK}); + for (RandomizerCheck gossipStone : FilterFromPool(Rando::StaticData::gossipStoneLocations, [ctx](const RandomizerCheck loc) { + return ctx->GetItemLocation(loc)->GetPlacedRandomizerGet() == RG_NONE; + })) { + const HintText junkHint = RandomElement(GetHintCategory(HintCategory::Junk)); + AddHint(junkHint.GetText(), gossipStone, { QM_PINK }); } //Getting gossip stone locations temporarily sets one location to not be reachable. diff --git a/soh/soh/Enhancements/randomizer/3drando/hints.hpp b/soh/soh/Enhancements/randomizer/3drando/hints.hpp index 83985c0da..ea942909c 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hints.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/hints.hpp @@ -4,10 +4,10 @@ #include #include -#include "keys.hpp" #include "text.hpp" #include "random.hpp" #include "settings.hpp" +#include "dungeon.hpp" #include struct HintDistributionSetting { @@ -193,14 +193,14 @@ private: HintCategory type; }; -using ConditionalAlwaysHint = std::pair>; +using ConditionalAlwaysHint = std::pair>; //10 dungeons as GTG and GC are excluded extern std::array dungeonInfoData; extern std::array conditionalAlwaysHints; -extern uint32_t GetHintRegionHintKey(const uint32_t area); +extern RandomizerHintTextKey GetHintRegionHintKey(const RandomizerRegion area); extern void CreateAllHints(); extern void CreateMerchantsHints(); extern void CreateWarpSongTexts(); diff --git a/soh/soh/Enhancements/randomizer/3drando/item.cpp b/soh/soh/Enhancements/randomizer/3drando/item.cpp deleted file mode 100644 index 3e10a165c..000000000 --- a/soh/soh/Enhancements/randomizer/3drando/item.cpp +++ /dev/null @@ -1,86 +0,0 @@ -#include "item.hpp" - -#include - -#include "item_location.hpp" -#include "logic.hpp" -#include "random.hpp" -#include "item_pool.hpp" -#include "settings.hpp" -#include "z64item.h" - -Item::Item(RandomizerGet randomizerGet_, Text name_, ItemType type_, int getItemId_, bool advancement_, bool* logicVar_, uint32_t hintKey_, - uint16_t price_) - : randomizerGet(randomizerGet_), - name(std::move(name_)), - type(type_), - getItemId(getItemId_), - advancement(advancement_), - logicVar(logicVar_), - hintKey(hintKey_), - price(price_) {} - -Item::Item(RandomizerGet randomizerGet_, Text name_, ItemType type_, int getItemId_, bool advancement_, uint8_t* logicVar_, uint32_t hintKey_, - uint16_t price_) - : randomizerGet(randomizerGet_), - name(std::move(name_)), - type(type_), - getItemId(getItemId_), - advancement(advancement_), - logicVar(logicVar_), - hintKey(hintKey_), - price(price_) {} - -Item::~Item() = default; - -void Item::ApplyEffect() { - //If this is a key ring, logically add as many keys as we could need - if (FOREST_TEMPLE_KEY_RING <= hintKey && hintKey <= GANONS_CASTLE_KEY_RING) { - *std::get(logicVar) += 10; - } - else { - if (std::holds_alternative(logicVar)) { - *std::get(logicVar) = true; - } else { - *std::get(logicVar) += 1; - } - } - Logic::UpdateHelpers(); -} - -void Item::UndoEffect() { - if (FOREST_TEMPLE_KEY_RING <= hintKey && hintKey <= GANONS_CASTLE_KEY_RING) { - *std::get(logicVar) -= 10; - } - else { - if (std::holds_alternative(logicVar)) { - *std::get(logicVar) = false; - } else { - *std::get(logicVar) -= 1; - } - } - Logic::UpdateHelpers(); -} - -ItemOverride_Value Item::Value() const { - ItemOverride_Value val; - - val.all = 0; - val.itemId = getItemId; - if (getItemId == GI_ICE_TRAP) { - val.looksLikeItemId = RandomElement(IceTrapModels); - } - if (getItemId >= 0x95 && getItemId <= 0x9A) { //Boss keys - val.looksLikeItemId = GI_KEY_BOSS; - } - if (getItemId >= 0xAF && getItemId <= 0xB7) { //Small keys - val.looksLikeItemId = GI_KEY_SMALL; - } - if (type == ITEMTYPE_SHOP) { - // With the current shopsanity implementation, we need a way to detect - // regular shop items. This method should have no unintended side effects - // unless there was a multiworld with 256 players... so, it should be fine. - val.player = 0xFF; - } - return val; -} diff --git a/soh/soh/Enhancements/randomizer/3drando/item.hpp b/soh/soh/Enhancements/randomizer/3drando/item.hpp deleted file mode 100644 index ee7bfc783..000000000 --- a/soh/soh/Enhancements/randomizer/3drando/item.hpp +++ /dev/null @@ -1,156 +0,0 @@ -#pragma once - -#include -#include - -#include "keys.hpp" -#include "hint_list.hpp" -#include "settings.hpp" -#include "../randomizerTypes.h" - -union ItemOverride_Value; - -enum ItemType { - ITEMTYPE_ITEM, - ITEMTYPE_MAP, - ITEMTYPE_COMPASS, - ITEMTYPE_BOSSKEY, - ITEMTYPE_SMALLKEY, - ITEMTYPE_TOKEN, - ITEMTYPE_FORTRESS_SMALLKEY, - ITEMTYPE_EVENT, - ITEMTYPE_DROP, - ITEMTYPE_REFILL, - ITEMTYPE_SONG, - ITEMTYPE_SHOP, - ITEMTYPE_DUNGEONREWARD -}; - -class Item { -public: - Item() = default; - Item(RandomizerGet randomizerGet_, Text name_, ItemType type_, int getItemId_, bool advancement_, bool* logicVar_, uint32_t hintKey_, - uint16_t price_ = 0); - Item(RandomizerGet randomizerGet_, Text name_, ItemType type_, int getItemId_, bool advancement_, uint8_t* logicVar_, uint32_t hintKey_, - uint16_t price_ = 0); - ~Item(); - - void ApplyEffect(); - void UndoEffect(); - - ItemOverride_Value Value() const; - - const Text& GetName() const { - return name; - } - - bool IsAdvancement() const { - return advancement; - } - - int GetItemID() const { - return getItemId; - } - - ItemType GetItemType() const { - return type; - } - - RandomizerGet GetRandomizerGet() { - return randomizerGet; - } - - uint16_t GetPrice() const { - return price; - } - - void SetPrice(uint16_t price_) { - price = price_; - } - - void SetAsPlaythrough() { - playthrough = true; - } - - bool IsPlaythrough() const { - return playthrough; - } - - bool IsBottleItem() const { - return getItemId == 0x0F || //Empty Bottle - getItemId == 0X14 || //Bottle with Milk - (getItemId >= 0x8C && getItemId <= 0x94); //Rest of bottled contents - } - - bool IsMajorItem() const { - using namespace Settings; - if (type == ITEMTYPE_TOKEN) { - return Bridge.Is(RAINBOWBRIDGE_TOKENS) || LACSCondition == LACSCONDITION_TOKENS; - } - - if (type == ITEMTYPE_DROP || type == ITEMTYPE_EVENT || type == ITEMTYPE_SHOP || type == ITEMTYPE_MAP || type == ITEMTYPE_COMPASS) { - return false; - } - - if (type == ITEMTYPE_DUNGEONREWARD && (ShuffleRewards.Is(REWARDSHUFFLE_END_OF_DUNGEON))) { - return false; - } - - if ((randomizerGet == RG_BOMBCHU_5 || randomizerGet == RG_BOMBCHU_10 || randomizerGet == RG_BOMBCHU_20) && !BombchusInLogic) { - return false; - } - - if (hintKey == HEART_CONTAINER || hintKey == PIECE_OF_HEART || hintKey == TREASURE_GAME_HEART) { - return false; - } - - if (type == ITEMTYPE_SMALLKEY && (Keysanity.Is(KEYSANITY_VANILLA) || Keysanity.Is(KEYSANITY_OWN_DUNGEON))) { - return false; - } - - if (type == ITEMTYPE_FORTRESS_SMALLKEY && GerudoKeys.Is(GERUDOKEYS_VANILLA)) { - return false; - } - - if ((type == ITEMTYPE_BOSSKEY && getItemId != 0xAD) && (BossKeysanity.Is(BOSSKEYSANITY_VANILLA) || BossKeysanity.Is(BOSSKEYSANITY_OWN_DUNGEON))) { - return false; - } - //Ganons Castle Boss Key - if (getItemId == 0xAD && (GanonsBossKey.Is(GANONSBOSSKEY_VANILLA) || GanonsBossKey.Is(GANONSBOSSKEY_OWN_DUNGEON))) { - return false; - } - - if (randomizerGet == RG_GREG_RUPEE) { - return Bridge.Is(RAINBOWBRIDGE_GREG); - } - - return IsAdvancement(); - } - - uint32_t GetHintKey() const { - return hintKey; - } - - const HintText& GetHint() const { - return Hint(hintKey); - } - - bool operator== (const Item& right) const { - return type == right.GetItemType() && getItemId == right.GetItemID(); - } - - bool operator!= (const Item& right) const { - return !operator==(right); - } - -private: - RandomizerGet randomizerGet; - Text name; - ItemType type; - int getItemId; - bool advancement; - std::variant logicVar; - uint32_t hintKey; - uint16_t price; - bool playthrough = false; -}; diff --git a/soh/soh/Enhancements/randomizer/3drando/item_list.cpp b/soh/soh/Enhancements/randomizer/3drando/item_list.cpp deleted file mode 100644 index 417203a5b..000000000 --- a/soh/soh/Enhancements/randomizer/3drando/item_list.cpp +++ /dev/null @@ -1,311 +0,0 @@ -#include "item_list.hpp" - -#include "logic.hpp" -#include -#include "z64item.h" -#include "../randomizerTypes.h" - -using namespace Logic; - -static std::array itemTable; - -void ItemTable_Init() { // RandomizerGet English name French Spanish Item Type getItemID advancement logic hint key - itemTable[NONE] = Item(RG_NONE, Text{"No Item", "Rien", "Sin Objeto"}, ITEMTYPE_EVENT, GI_RUPEE_GREEN, false, &noVariable, NONE); - itemTable[KOKIRI_SWORD] = Item(RG_KOKIRI_SWORD, Text{"Kokiri Sword", "Épée Kokiri", "Espada Kokiri"}, ITEMTYPE_ITEM, GI_SWORD_KOKIRI, true, &KokiriSword, KOKIRI_SWORD); - //[MASTER_SWORD] - itemTable[GIANTS_KNIFE] = Item(RG_GIANTS_KNIFE, Text{"Giant's Knife", "Lame des Géants", "Espada de Biggoron"}, ITEMTYPE_ITEM, GI_SWORD_KNIFE, false, &noVariable, GIANTS_KNIFE); - itemTable[BIGGORON_SWORD] = Item(RG_BIGGORON_SWORD, Text{"Biggoron's Sword", "Épée de Biggoron", "Espada de Biggoron"}, ITEMTYPE_ITEM, GI_SWORD_BGS, true, &BiggoronSword, BIGGORON_SWORD); - itemTable[DEKU_SHIELD] = Item(RG_DEKU_SHIELD, Text{"Deku Shield", "Bouclier Mojo", "Escudo deku"}, ITEMTYPE_ITEM, GI_SHIELD_DEKU, false, &noVariable, DEKU_SHIELD); - itemTable[HYLIAN_SHIELD] = Item(RG_HYLIAN_SHIELD, Text{"Hylian Shield", "Bouclier Hylien", "Escudo hyliano"}, ITEMTYPE_ITEM, GI_SHIELD_HYLIAN, false, &noVariable, HYLIAN_SHIELD); - itemTable[MIRROR_SHIELD] = Item(RG_MIRROR_SHIELD, Text{"Mirror Shield", "Bouclier Miroir", "Escudo espejo"}, ITEMTYPE_ITEM, GI_SHIELD_MIRROR, true, &MirrorShield, MIRROR_SHIELD); - itemTable[GORON_TUNIC] = Item(RG_GORON_TUNIC, Text{"Goron Tunic", "Tunique Goron", "Sayo goron"}, ITEMTYPE_ITEM, GI_TUNIC_GORON, true, &GoronTunic, GORON_TUNIC); - itemTable[ZORA_TUNIC] = Item(RG_ZORA_TUNIC, Text{"Zora Tunic", "Tunique Zora", "Sayo zora"}, ITEMTYPE_ITEM, GI_TUNIC_ZORA, true, &ZoraTunic, ZORA_TUNIC); - itemTable[IRON_BOOTS] = Item(RG_IRON_BOOTS, Text{"Iron Boots", "Bottes de plomb", "Botas de hierro"}, ITEMTYPE_ITEM, GI_BOOTS_IRON, true, &IronBoots, IRON_BOOTS); - itemTable[HOVER_BOOTS] = Item(RG_HOVER_BOOTS, Text{"Hover Boots", "Bottes des airs", "Botas voladoras"}, ITEMTYPE_ITEM, GI_BOOTS_HOVER, true, &HoverBoots, HOVER_BOOTS); - - - itemTable[BOOMERANG] = Item(RG_BOOMERANG, Text{"Boomerang", "Boomerang", "Búmeran"}, ITEMTYPE_ITEM, GI_BOOMERANG, true, &Boomerang, BOOMERANG); - itemTable[LENS_OF_TRUTH] = Item(RG_LENS_OF_TRUTH, Text{"Lens of Truth", "Monocle de Vérité", "Lupa de la Verdad"}, ITEMTYPE_ITEM, GI_LENS, true, &LensOfTruth, LENS_OF_TRUTH); - itemTable[MEGATON_HAMMER] = Item(RG_MEGATON_HAMMER, Text{"Megaton Hammer", "Masse des Titans", "Martillo Megatón"}, ITEMTYPE_ITEM, GI_HAMMER, true, &Hammer, MEGATON_HAMMER); - itemTable[STONE_OF_AGONY] = Item(RG_STONE_OF_AGONY, Text{"Stone of Agony", "Pierre de Souffrance", "Piedra de la Agonía"}, ITEMTYPE_ITEM, GI_STONE_OF_AGONY, true, &ShardOfAgony, STONE_OF_AGONY); - itemTable[DINS_FIRE] = Item(RG_DINS_FIRE, Text{"Din's Fire", "Feu de Din", "Fuego de Din"}, ITEMTYPE_ITEM, GI_DINS_FIRE, true, &DinsFire, DINS_FIRE); - itemTable[FARORES_WIND] = Item(RG_FARORES_WIND, Text{"Farore's Wind", "Vent de Farore", "Viento de Farore"}, ITEMTYPE_ITEM, GI_FARORES_WIND, true, &FaroresWind, FARORES_WIND); - itemTable[NAYRUS_LOVE] = Item(RG_NAYRUS_LOVE, Text{"Nayru's Love", "Amour de Nayru", "Amor de Nayru"}, ITEMTYPE_ITEM, GI_NAYRUS_LOVE, true, &NayrusLove, NAYRUS_LOVE); - itemTable[FIRE_ARROWS] = Item(RG_FIRE_ARROWS, Text{"Fire Arrow", "Flèche de Feu", "Flecha de fuego"}, ITEMTYPE_ITEM, GI_ARROW_FIRE, true, &FireArrows, FIRE_ARROWS); - itemTable[ICE_ARROWS] = Item(RG_ICE_ARROWS, Text{"Ice Arrow", "Flèche de Glace", "Flecha de hielo"}, ITEMTYPE_ITEM, GI_ARROW_ICE, true, &IceArrows, ICE_ARROWS); - itemTable[LIGHT_ARROWS] = Item(RG_LIGHT_ARROWS, Text{"Light Arrow", "Flèche de Lumière", "Flecha de luz"}, ITEMTYPE_ITEM, GI_ARROW_LIGHT, true, &LightArrows, LIGHT_ARROWS); - itemTable[GERUDO_MEMBERSHIP_CARD] = Item(RG_GERUDO_MEMBERSHIP_CARD, Text{"Gerudo Membership Card", "Carte Gerudo", "Pase de socio gerudo"}, ITEMTYPE_ITEM, GI_GERUDO_CARD, true, &GerudoToken, GERUDO_MEMBERSHIP_CARD); - itemTable[MAGIC_BEAN] = Item(RG_MAGIC_BEAN, Text{"Magic Bean", "Haricots Magiques", "Habichuelas mágicas"}, ITEMTYPE_ITEM, GI_BEAN, true, &MagicBean, MAGIC_BEAN); - itemTable[MAGIC_BEAN_PACK] = Item(RG_MAGIC_BEAN_PACK, Text{"Magic Bean Pack", "Paquet de Haricots Magiques", "Lote de habichuelas mágicas"}, ITEMTYPE_ITEM, 0xC9, true, &MagicBeanPack, MAGIC_BEAN_PACK); - itemTable[DOUBLE_DEFENSE] = Item(RG_DOUBLE_DEFENSE, Text{"Double Defense", "Double Défence", "Doble poder defensivo"}, ITEMTYPE_ITEM, 0xB8, true, &DoubleDefense, DOUBLE_DEFENSE); - - itemTable[WEIRD_EGG] = Item(RG_WEIRD_EGG, Text{"Weird Egg", "Oeuf Curieux", "Huevo extraño"}, ITEMTYPE_ITEM, GI_WEIRD_EGG, true, &WeirdEgg, WEIRD_EGG); -// itemTable[CUCCO] = Item(RG_CUCCO, Text{"Cucco", "Cocotte", "Cuco"}, ITEMTYPE_ITEM, GI_CUCCO, true, &Cucco, CUCCO); - itemTable[ZELDAS_LETTER] = Item(RG_ZELDAS_LETTER, Text{"Zelda's Letter", "Lettre de Zelda", "Carta de Zelda"}, ITEMTYPE_ITEM, GI_LETTER_ZELDA, true, &ZeldasLetter, ZELDAS_LETTER); -// itemTable[KEATON_MASK] = Item(RG_KEATON_MASK, Text{"Keaton Mask", "Masque du Renard", "Careta de Keaton"}, ITEMTYPE_ITEM, GI_MASK_KEATON, true, &KeatonMask, KEATON_MASK); -// itemTable[SKULL_MASK] = Item(RG_SKULL_MASK, Text{"Skull Mask", "Masque de Mort", "Máscara de calavera"}, ITEMTYPE_ITEM, GI_MASK_SKULL, true, &SkullMask, SKULL_MASK); -// itemTable[SPOOKY_MASK] = Item(RG_SPOOKY_MASK, Text{"Spooky Mask", "Masque d'Effroi", "Máscara tenebrosa"}, ITEMTYPE_ITEM, GI_MASK_SPOOKY, true, &SpookyMask, SPOOKY_MASK); -// itemTable[BUNNY_HOOD] = Item(RG_BUNNY_HOOD, Text{"Bunny Hood", "Masque du Lapin", "Capucha de conejo"}, ITEMTYPE_ITEM, GI_MASK_BUNNY, true, &BunnyHood, BUNNY_HOOD); -// itemTable[GORON_MASK] = Item(RG_GORON_MASK, Text{"Goron Mask", "Masque de Goron", "Máscara Goron"}, ITEMTYPE_ITEM, GI_MASK_GORON, true, &GoronMask, GORON_MASK); -// itemTable[ZORA_MASK] = Item(RG_ZORA_MASK, Text{"Zora Mask", "Masque de Zora", "Máscara Zora"}, ITEMTYPE_ITEM, GI_MASK_ZORA, true, &ZoraMask, ZORA_MASK); -// itemTable[GERUDO_MASK] = Item(RG_GERUDO_MASK, Text{"Gerudo Mask", "Masque de Gerudo", "Máscara Gerudo"}, ITEMTYPE_ITEM, GI_MASK_GERUDO, true, &GerudoMask, GERUDO_MASK); -// itemTable[MASK_OF_TRUTH] = Item(RG_MASK_OF_TRUTH, Text{"Mask of Truth", "Masque de Vérité", "Máscara de la Verdad"}, ITEMTYPE_ITEM, GI_MASK_MASK, true, &MaskofTruth, MASK_OF_TRUTH); - itemTable[POCKET_EGG] = Item(RG_POCKET_EGG, Text{"Pocket Egg", "Oeuf de poche", "Huevo de bolsillo"}, ITEMTYPE_ITEM, GI_POCKET_EGG, true, &PocketEgg, POCKET_EGG); -// itemTable[POCKET_CUCCO] = Item(RG_POCKET_CUCCO, Text{"Pocket Cucco", "Cocotte de poche", "Cuco de bolsillo"}, ITEMTYPE_ITEM, GI_POCKET_CUCCO, true, &PocketCucco, POCKET_CUCCO); - itemTable[COJIRO] = Item(RG_COJIRO, Text{"Cojiro", "P'tit Poulet", "Cojiro"}, ITEMTYPE_ITEM, GI_COJIRO, true, &Cojiro, COJIRO); - itemTable[ODD_MUSHROOM] = Item(RG_ODD_MUSHROOM, Text{"Odd Mushroom", "Champignon Suspect", "Champiñón extraño"}, ITEMTYPE_ITEM, GI_ODD_MUSHROOM, true, &OddMushroom, ODD_MUSHROOM); - itemTable[ODD_POTION] = Item(RG_ODD_POTION, Text{"Odd Potion", "Mixture Suspecte", "Medicina rara"}, ITEMTYPE_ITEM, GI_ODD_POTION, true, &OddPoultice, ODD_POTION); - itemTable[POACHERS_SAW] = Item(RG_POACHERS_SAW, Text{"Poacher's Saw", "Scie du Chasseur", "Sierra del furtivo"}, ITEMTYPE_ITEM, GI_SAW, true, &PoachersSaw, POACHERS_SAW); - itemTable[BROKEN_SWORD] = Item(RG_BROKEN_SWORD, Text{"Broken Goron's Sword", "Épée Brisée de Goron", "Espada goron rota"}, ITEMTYPE_ITEM, GI_SWORD_BROKEN, true, &BrokenSword, BROKEN_SWORD); - itemTable[PRESCRIPTION] = Item(RG_PRESCRIPTION, Text{"Prescription", "Ordonnance", "Receta"}, ITEMTYPE_ITEM, GI_PRESCRIPTION, true, &Prescription, PRESCRIPTION); - itemTable[EYEBALL_FROG] = Item(RG_EYEBALL_FROG, Text{"Eyeball Frog", "Crapaud-qui-louche", "Rana de ojos saltones"}, ITEMTYPE_ITEM, GI_FROG, true, &EyeballFrog, EYEBALL_FROG); - itemTable[EYEDROPS] = Item(RG_EYEDROPS, Text{"World's Finest Eyedrops", "Super Gouttes", "Supergotas oculares"}, ITEMTYPE_ITEM, GI_EYEDROPS, true, &Eyedrops, EYEDROPS); - itemTable[CLAIM_CHECK] = Item(RG_CLAIM_CHECK, Text{"Claim Check", "Certificat", "Recibo"}, ITEMTYPE_ITEM, GI_CLAIM_CHECK, true, &ClaimCheck, CLAIM_CHECK); - - itemTable[GOLD_SKULLTULA_TOKEN] = Item(RG_GOLD_SKULLTULA_TOKEN, Text{"Gold Skulltula Token", "Symbole de Skulltula d'Or", "Símbolo de skulltula dorada"}, ITEMTYPE_TOKEN, GI_SKULL_TOKEN, true, &GoldSkulltulaTokens, GOLD_SKULLTULA_TOKEN); - - //Progression Items - itemTable[PROGRESSIVE_HOOKSHOT] = Item(RG_PROGRESSIVE_HOOKSHOT, Text{"Progressive Hookshot", "Grappin (prog.)", "Gancho progresivo"}, ITEMTYPE_ITEM, 0x80, true, &ProgressiveHookshot, PROGRESSIVE_HOOKSHOT); - itemTable[PROGRESSIVE_STRENGTH] = Item(RG_PROGRESSIVE_STRENGTH, Text{"Strength Upgrade", "Amélioration de Force (prog.)", "Fuerza progresiva"}, ITEMTYPE_ITEM, 0x81, true, &ProgressiveStrength, PROGRESSIVE_STRENGTH); - itemTable[PROGRESSIVE_BOMB_BAG] = Item(RG_PROGRESSIVE_BOMB_BAG, Text{"Progressive Bomb Bag", "Sac de Bombes (prog.)", "Saco de bombas progresivo"}, ITEMTYPE_ITEM, 0x82, true, &ProgressiveBombBag, PROGRESSIVE_BOMB_BAG); - itemTable[PROGRESSIVE_BOW] = Item(RG_PROGRESSIVE_BOW, Text{"Progressive Bow", "Arc (prog.)", "Arco progresivo"}, ITEMTYPE_ITEM, 0x83, true, &ProgressiveBow, PROGRESSIVE_BOW); - itemTable[PROGRESSIVE_SLINGSHOT] = Item(RG_PROGRESSIVE_SLINGSHOT, Text{"Progressive Slingshot", "Lance-Pierre (prog.)", "Resortera progresiva"}, ITEMTYPE_ITEM, 0x84, true, &ProgressiveBulletBag, PROGRESSIVE_SLINGSHOT); - itemTable[PROGRESSIVE_WALLET] = Item(RG_PROGRESSIVE_WALLET, Text{"Progressive Wallet", "Bourse (prog.)", "Bolsa de rupias progresiva"}, ITEMTYPE_ITEM, 0x85, true, &ProgressiveWallet, PROGRESSIVE_WALLET); - itemTable[PROGRESSIVE_SCALE] = Item(RG_PROGRESSIVE_SCALE, Text{"Progressive Scale", "Écaille (prog.)", "Escama progresiva"}, ITEMTYPE_ITEM, 0x86, true, &ProgressiveScale, PROGRESSIVE_SCALE); - itemTable[PROGRESSIVE_NUT_UPGRADE] = Item(RG_PROGRESSIVE_NUT_UPGRADE, Text{"Progressive Nut Capacity", "Capacité de Noix (prog.)", "Capacidad de nueces deku progresiva"}, ITEMTYPE_ITEM, 0x87, false, &noVariable, PROGRESSIVE_NUT_UPGRADE); - itemTable[PROGRESSIVE_STICK_UPGRADE] = Item(RG_PROGRESSIVE_STICK_UPGRADE, Text{"Progressive Stick Capacity", "Capacité de Bâtons (prog.)", "Capacidad de palos deku progresiva"}, ITEMTYPE_ITEM, 0x88, false, &noVariable, PROGRESSIVE_STICK_UPGRADE); - itemTable[PROGRESSIVE_BOMBCHUS] = Item(RG_PROGRESSIVE_BOMBCHUS, Text{"Progressive Bombchu", "Missiles (prog.)", "Bombchus progresivos"}, ITEMTYPE_ITEM, 0x89, true, &Bombchus, PROGRESSIVE_BOMBCHUS); - itemTable[PROGRESSIVE_MAGIC_METER] = Item(RG_PROGRESSIVE_MAGIC_METER, Text{"Progressive Magic Meter", "Jauge de Magie (prog.)", "Poder mágico progresivo"}, ITEMTYPE_ITEM, 0x8A, true, &ProgressiveMagic, PROGRESSIVE_MAGIC_METER); - itemTable[PROGRESSIVE_OCARINA] = Item(RG_PROGRESSIVE_OCARINA, Text{"Progressive Ocarina", "Ocarina (prog.)", "Ocarina progresiva"}, ITEMTYPE_ITEM, 0x8B, true, &ProgressiveOcarina, PROGRESSIVE_OCARINA); - itemTable[PROGRESSIVE_GORONSWORD] = Item(RG_PROGRESSIVE_GORONSWORD, Text{"Progressive Goron Sword", "Épée Goron (prog.)", "Espada Goron progresiva"}, ITEMTYPE_ITEM, 0xD4, true, &ProgressiveGiantKnife, PROGRESSIVE_GORONSWORD); - - //Bottles - itemTable[EMPTY_BOTTLE] = Item(RG_EMPTY_BOTTLE, Text{"Empty Bottle", "Bouteille Vide", "Botella vacía"}, ITEMTYPE_ITEM, 0x0F, true, &Bottles, EMPTY_BOTTLE); - itemTable[BOTTLE_WITH_MILK] = Item(RG_BOTTLE_WITH_MILK, Text{"Bottle with Milk", "Bouteille avec du Lait", "Botella de leche Lon Lon"}, ITEMTYPE_ITEM, 0x14, true, &Bottles, BOTTLE_WITH_MILK); - itemTable[BOTTLE_WITH_RED_POTION] = Item(RG_BOTTLE_WITH_RED_POTION, Text{"Bottle with Red Potion", "Bouteille avec une Potion Rouge", "Botella de poción roja"}, ITEMTYPE_ITEM, 0x8C, true, &Bottles, BOTTLE_WITH_RED_POTION); - itemTable[BOTTLE_WITH_GREEN_POTION] = Item(RG_BOTTLE_WITH_GREEN_POTION, Text{"Bottle with Green Potion", "Bouteille avec une Potion Verte", "Botella de poción verde"}, ITEMTYPE_ITEM, 0x8D, true, &Bottles, BOTTLE_WITH_GREEN_POTION); - itemTable[BOTTLE_WITH_BLUE_POTION] = Item(RG_BOTTLE_WITH_BLUE_POTION, Text{"Bottle with Blue Potion", "Bouteille avec une Potion Bleue", "Botella de poción azul"}, ITEMTYPE_ITEM, 0x8E, true, &Bottles, BOTTLE_WITH_BLUE_POTION); - itemTable[BOTTLE_WITH_FAIRY] = Item(RG_BOTTLE_WITH_FAIRY, Text{"Bottle with Fairy", "Bouteille avec une Fée", "Hada en una botella"}, ITEMTYPE_ITEM, 0x8F, true, &Bottles, BOTTLE_WITH_FAIRY); - itemTable[BOTTLE_WITH_FISH] = Item(RG_BOTTLE_WITH_FISH, Text{"Bottle with Fish", "Bouteille avec un Poisson", "Pez en una botella"}, ITEMTYPE_ITEM, 0x90, true, &Bottles, BOTTLE_WITH_FISH); - itemTable[BOTTLE_WITH_BLUE_FIRE] = Item(RG_BOTTLE_WITH_BLUE_FIRE, Text{"Bottle with Blue Fire", "Bouteille avec une Flamme Bleue", "Botella de fuego azul"}, ITEMTYPE_ITEM, 0x91, true, &Bottles, BOTTLE_WITH_BLUE_FIRE); - itemTable[BOTTLE_WITH_BUGS] = Item(RG_BOTTLE_WITH_BUGS, Text{"Bottle with Bugs", "Bouteille avec des Insectes", "Insecto en una botella"}, ITEMTYPE_ITEM, 0x92, true, &Bottles, BOTTLE_WITH_BUGS); - itemTable[BOTTLE_WITH_POE] = Item(RG_BOTTLE_WITH_POE, Text{"Bottle with Poe", "Bouteille avec un Esprit", "Poe en una botella"}, ITEMTYPE_ITEM, 0x94, true, &Bottles, BOTTLE_WITH_POE); - - //Special bottles that can't immediately dump contents - itemTable[RUTOS_LETTER] = Item(RG_RUTOS_LETTER, Text{"Bottle with Ruto's Letter", "Bouteille avec la Lettre de Ruto", "Carta de Ruto"}, ITEMTYPE_ITEM, 0x15, true, &RutosLetter, RUTOS_LETTER); - itemTable[BOTTLE_WITH_BIG_POE] = Item(RG_BOTTLE_WITH_BIG_POE, Text{"Bottle with Big Poe", "Bouteille avec une Âme", "Gran Poe en una botella"}, ITEMTYPE_ITEM, 0x93, true, &BottleWithBigPoe, BOTTLE_WITH_BIG_POE); - - //Songs - itemTable[ZELDAS_LULLABY] = Item(RG_ZELDAS_LULLABY, Text{"Zelda's Lullaby", "Berceuse de Zelda", "Nana de Zelda"}, ITEMTYPE_SONG, 0xC1, true, &ZeldasLullaby, ZELDAS_LULLABY); - itemTable[EPONAS_SONG] = Item(RG_EPONAS_SONG, Text{"Epona's Song", "Chant d'Épona", "Canción de Epona"}, ITEMTYPE_SONG, 0xC2, true, &EponasSong, EPONAS_SONG); - itemTable[SARIAS_SONG] = Item(RG_SARIAS_SONG, Text{"Saria's Song", "Chant de Saria", "Canción de Saria"}, ITEMTYPE_SONG, 0xC3, true, &SariasSong, SARIAS_SONG); - itemTable[SUNS_SONG] = Item(RG_SUNS_SONG, Text{"Sun's Song", "Chant du Soleil", "Canción del Sol"}, ITEMTYPE_SONG, 0xC4, true, &SunsSong, SUNS_SONG); - itemTable[SONG_OF_TIME] = Item(RG_SONG_OF_TIME, Text{"Song of Time", "Chant du Temps", "Canción del tiempo"}, ITEMTYPE_SONG, 0xC5, true, &SongOfTime, SONG_OF_TIME); - itemTable[SONG_OF_STORMS] = Item(RG_SONG_OF_STORMS, Text{"Song of Storms", "Chant des Tempêtes", "Canción de la tormenta"}, ITEMTYPE_SONG, 0xC6, true, &SongOfStorms, SONG_OF_STORMS); - itemTable[MINUET_OF_FOREST] = Item(RG_MINUET_OF_FOREST, Text{"Minuet of Forest", "Menuet des Bois", "Minueto del bosque"}, ITEMTYPE_SONG, 0xBB, true, &MinuetOfForest, MINUET_OF_FOREST); - itemTable[BOLERO_OF_FIRE] = Item(RG_BOLERO_OF_FIRE, Text{"Bolero of Fire", "Boléro du Feu", "Bolero del fuego"}, ITEMTYPE_SONG, 0xBC, true, &BoleroOfFire, BOLERO_OF_FIRE); - itemTable[SERENADE_OF_WATER] = Item(RG_SERENADE_OF_WATER, Text{"Serenade of Water", "Sérénade de l'Eau", "Serenata del agua"}, ITEMTYPE_SONG, 0xBD, true, &SerenadeOfWater, SERENADE_OF_WATER); - itemTable[REQUIEM_OF_SPIRIT] = Item(RG_REQUIEM_OF_SPIRIT, Text{"Requiem of Spirit", "Requiem des Esprits", "Réquiem del espíritu"}, ITEMTYPE_SONG, 0xBE, true, &RequiemOfSpirit, REQUIEM_OF_SPIRIT); - itemTable[NOCTURNE_OF_SHADOW] = Item(RG_NOCTURNE_OF_SHADOW, Text{"Nocturne of Shadow", "Nocturne de l'Ombre", "Nocturno de la sombra"}, ITEMTYPE_SONG, 0xBF, true, &NocturneOfShadow, NOCTURNE_OF_SHADOW); - itemTable[PRELUDE_OF_LIGHT] = Item(RG_PRELUDE_OF_LIGHT, Text{"Prelude of Light", "Prélude de la Lumière", "Preludio de la luz"}, ITEMTYPE_SONG, 0xC0, true, &PreludeOfLight, PRELUDE_OF_LIGHT); - - //Maps and Compasses - itemTable[DEKU_TREE_MAP] = Item(RG_DEKU_TREE_MAP, Text{"Great Deku Tree Map", "Carte de l'Arbre Mojo", "Mapa del Gran Árbol Deku"}, ITEMTYPE_MAP, 0xA5, false, &noVariable, DEKU_TREE_MAP); - itemTable[DODONGOS_CAVERN_MAP] = Item(RG_DODONGOS_CAVERN_MAP, Text{"Dodongo's Cavern Map", "Carte de la Caverne Dodongo", "Mapa de la Cueva de los Dodongos"}, ITEMTYPE_MAP, 0xA6, false, &noVariable, DODONGOS_CAVERN_MAP); - itemTable[JABU_JABUS_BELLY_MAP] = Item(RG_JABU_JABUS_BELLY_MAP, Text{"Jabu-Jabu's Belly Map", "Carte du Ventre de Jabu-Jabu", "Mapa de la tripa de Jabu-Jabu"}, ITEMTYPE_MAP, 0xA7, false, &noVariable, JABU_JABUS_BELLY_MAP); - itemTable[FOREST_TEMPLE_MAP] = Item(RG_FOREST_TEMPLE_MAP, Text{"Forest Temple Map", "Carte du Temple de la Forêt", "Mapa del Templo del Bosque"}, ITEMTYPE_MAP, 0xA8, false, &noVariable, FOREST_TEMPLE_MAP); - itemTable[FIRE_TEMPLE_MAP] = Item(RG_FIRE_TEMPLE_MAP, Text{"Fire Temple Map", "Carte du Temple du Feu", "Mapa del Templo del Fuego"}, ITEMTYPE_MAP, 0xA9, false, &noVariable, FIRE_TEMPLE_MAP); - itemTable[WATER_TEMPLE_MAP] = Item(RG_WATER_TEMPLE_MAP, Text{"Water Temple Map", "Carte du Temple de l'Eau", "Mapa del Templo del Agua"}, ITEMTYPE_MAP, 0xAA, false, &noVariable, WATER_TEMPLE_MAP); - itemTable[SPIRIT_TEMPLE_MAP] = Item(RG_SPIRIT_TEMPLE_MAP, Text{"Spirit Temple Map", "Carte du Temple de l'Esprit", "Mapa del Templo del Espíritu"}, ITEMTYPE_MAP, 0xAB, false, &noVariable, SPIRIT_TEMPLE_MAP); - itemTable[SHADOW_TEMPLE_MAP] = Item(RG_SHADOW_TEMPLE_MAP, Text{"Shadow Temple Map", "Carte du Temple de l'Ombre", "Mapa del Templo de la Sombra"}, ITEMTYPE_MAP, 0xAC, false, &noVariable, SHADOW_TEMPLE_MAP); - itemTable[BOTTOM_OF_THE_WELL_MAP] = Item(RG_BOTTOM_OF_THE_WELL_MAP, Text{"Bottom of the Well Map", "Carte du Puits", "Mapa del fondo del pozo"}, ITEMTYPE_MAP, 0xAD, false, &noVariable, BOTTOM_OF_THE_WELL_MAP); - itemTable[ICE_CAVERN_MAP] = Item(RG_ICE_CAVERN_MAP, Text{"Ice Cavern Map", "Carte de la Caverne Polaire", "Mapa de la caverna de hielo"}, ITEMTYPE_MAP, 0xAE, false, &noVariable, ICE_CAVERN_MAP); - - itemTable[DEKU_TREE_COMPASS] = Item(RG_DEKU_TREE_COMPASS, Text{"Great Deku Tree Compass", "Boussole de l'Arbre Mojo", "Brújula del Gran Árbol Deku"}, ITEMTYPE_COMPASS, 0x9B, false, &noVariable, DEKU_TREE_COMPASS); - itemTable[DODONGOS_CAVERN_COMPASS] = Item(RG_DODONGOS_CAVERN_COMPASS, Text{"Dodongo's Cavern Compass", "Boussole de la Caverne Dodongo", "Brújula de la Cueva de los Dodongos"}, ITEMTYPE_COMPASS, 0x9C, false, &noVariable, DODONGOS_CAVERN_COMPASS); - itemTable[JABU_JABUS_BELLY_COMPASS] = Item(RG_JABU_JABUS_BELLY_COMPASS, Text{"Jabu-Jabu's Belly Compass", "Boussole du Ventre de Jabu-Jabu", "Brújula de la tripa de Jabu-Jabu"}, ITEMTYPE_COMPASS, 0x9D, false, &noVariable, JABU_JABUS_BELLY_COMPASS); - itemTable[FOREST_TEMPLE_COMPASS] = Item(RG_FOREST_TEMPLE_COMPASS, Text{"Forest Temple Compass", "Boussole du Temple de la Forêt", "Brújula del Templo del Bosque"}, ITEMTYPE_COMPASS, 0x9E, false, &noVariable, FOREST_TEMPLE_COMPASS); - itemTable[FIRE_TEMPLE_COMPASS] = Item(RG_FIRE_TEMPLE_COMPASS, Text{"Fire Temple Compass", "Boussole du Temple du Feu", "Brújula del Templo del Fuego"}, ITEMTYPE_COMPASS, 0x9F, false, &noVariable, FIRE_TEMPLE_COMPASS); - itemTable[WATER_TEMPLE_COMPASS] = Item(RG_WATER_TEMPLE_COMPASS, Text{"Water Temple Compass", "Boussole du Temple de l'Eau", "Brújula del Templo del Agua"}, ITEMTYPE_COMPASS, 0xA0, false, &noVariable, WATER_TEMPLE_COMPASS); - itemTable[SPIRIT_TEMPLE_COMPASS] = Item(RG_SPIRIT_TEMPLE_COMPASS, Text{"Spirit Temple Compass", "Boussole du Temple de l'Esprit", "Brújula del Templo del Espíritu"}, ITEMTYPE_COMPASS, 0xA1, false, &noVariable, SPIRIT_TEMPLE_COMPASS); - itemTable[SHADOW_TEMPLE_COMPASS] = Item(RG_SHADOW_TEMPLE_COMPASS, Text{"Shadow Temple Compass", "Boussole du Temple de l'Ombre", "Brújula del Templo de las Sombras"}, ITEMTYPE_COMPASS, 0xA2, false, &noVariable, SHADOW_TEMPLE_COMPASS); - itemTable[BOTTOM_OF_THE_WELL_COMPASS] = Item(RG_BOTTOM_OF_THE_WELL_COMPASS, Text{"Bottom of the Well Compass", "Boussole du Puits", "Brújula del fondo del pozo"}, ITEMTYPE_COMPASS, 0xA3, false, &noVariable, BOTTOM_OF_THE_WELL_COMPASS); - itemTable[ICE_CAVERN_COMPASS] = Item(RG_ICE_CAVERN_COMPASS, Text{"Ice Cavern Compass", "Boussole de la Caverne Polaire", "Brújula de la caverna de hielo"}, ITEMTYPE_COMPASS, 0xA4, false, &noVariable, ICE_CAVERN_COMPASS); - - //Boss Keys - itemTable[FOREST_TEMPLE_BOSS_KEY] = Item(RG_FOREST_TEMPLE_BOSS_KEY, Text{"Forest Temple Boss Key", "Clé d'Or du Temple de la Forêt", "Gran llave del Templo del Bosque"}, ITEMTYPE_BOSSKEY, 0x95, true, &BossKeyForestTemple, FOREST_TEMPLE_BOSS_KEY); - itemTable[FIRE_TEMPLE_BOSS_KEY] = Item(RG_FIRE_TEMPLE_BOSS_KEY, Text{"Fire Temple Boss Key", "Clé d'Or du Temple du Feu", "Gran llave del Templo del Fuego"}, ITEMTYPE_BOSSKEY, 0x96, true, &BossKeyFireTemple, FIRE_TEMPLE_BOSS_KEY); - itemTable[WATER_TEMPLE_BOSS_KEY] = Item(RG_WATER_TEMPLE_BOSS_KEY, Text{"Water Temple Boss Key", "Clé d'Or du Temple de l'Eau", "Gran llave del Templo del Agua"}, ITEMTYPE_BOSSKEY, 0x97, true, &BossKeyWaterTemple, WATER_TEMPLE_BOSS_KEY); - itemTable[SPIRIT_TEMPLE_BOSS_KEY] = Item(RG_SPIRIT_TEMPLE_BOSS_KEY, Text{"Spirit Temple Boss Key", "Clé d'Or du Temple de l'Esprit", "Gran llave del Templo del Espíritu"}, ITEMTYPE_BOSSKEY, 0x98, true, &BossKeySpiritTemple, SPIRIT_TEMPLE_BOSS_KEY); - itemTable[SHADOW_TEMPLE_BOSS_KEY] = Item(RG_SHADOW_TEMPLE_BOSS_KEY, Text{"Shadow Temple Boss Key", "Clé d'Or du Temple de l'Ombre", "Gran llave del Templo de las Sombras"}, ITEMTYPE_BOSSKEY, 0x99, true, &BossKeyShadowTemple, SHADOW_TEMPLE_BOSS_KEY); - itemTable[GANONS_CASTLE_BOSS_KEY] = Item(RG_GANONS_CASTLE_BOSS_KEY, Text{"Ganon's Castle Boss Key", "Clé d'Or du Château de Ganon", "Gran llave del Castillo de Ganon"}, ITEMTYPE_BOSSKEY, 0x9A, true, &BossKeyGanonsCastle, GANONS_CASTLE_BOSS_KEY); - - //Small Keys - itemTable[FOREST_TEMPLE_SMALL_KEY] = Item(RG_FOREST_TEMPLE_SMALL_KEY, Text{"Forest Temple Small Key", "Petite Clé du Temple de la Forêt", "Llave del Templo del Bosque"}, ITEMTYPE_SMALLKEY, 0xAF, true, &ForestTempleKeys, FOREST_TEMPLE_SMALL_KEY); - itemTable[FIRE_TEMPLE_SMALL_KEY] = Item(RG_FIRE_TEMPLE_SMALL_KEY, Text{"Fire Temple Small Key", "Petite Clé du Temple du Feu", "Llave del Templo del Fuego"}, ITEMTYPE_SMALLKEY, 0xB0, true, &FireTempleKeys, FIRE_TEMPLE_SMALL_KEY); - itemTable[WATER_TEMPLE_SMALL_KEY] = Item(RG_WATER_TEMPLE_SMALL_KEY, Text{"Water Temple Small Key", "Petite Clé du Temple de l'Eau", "Llave del Templo del Agua"}, ITEMTYPE_SMALLKEY, 0xB1, true, &WaterTempleKeys, WATER_TEMPLE_SMALL_KEY); - itemTable[SPIRIT_TEMPLE_SMALL_KEY] = Item(RG_SPIRIT_TEMPLE_SMALL_KEY, Text{"Spirit Temple Small Key", "Petite Clé du Temple de l'Esprit", "Llave del Templo del Espíritu"}, ITEMTYPE_SMALLKEY, 0xB2, true, &SpiritTempleKeys, SPIRIT_TEMPLE_SMALL_KEY); - itemTable[SHADOW_TEMPLE_SMALL_KEY] = Item(RG_SHADOW_TEMPLE_SMALL_KEY, Text{"Shadow Temple Small Key", "Petite Clé du Temple de l'Ombre", "Llave del Templo de las Sombras"}, ITEMTYPE_SMALLKEY, 0xB3, true, &ShadowTempleKeys, SHADOW_TEMPLE_SMALL_KEY); - itemTable[BOTTOM_OF_THE_WELL_SMALL_KEY] = Item(RG_BOTTOM_OF_THE_WELL_SMALL_KEY, Text{"Bottom of the Well Small Key", "Petite Clé du Puits", "Llave del fondo del pozo"}, ITEMTYPE_SMALLKEY, 0xB4, true, &BottomOfTheWellKeys, BOTTOM_OF_THE_WELL_SMALL_KEY); - itemTable[GERUDO_TRAINING_GROUNDS_SMALL_KEY] = Item(RG_GERUDO_TRAINING_GROUNDS_SMALL_KEY, Text{"Training Grounds Small Key", "Petite Clé du Gymnase Gerudo", "Llave del Centro de Instrucción"}, ITEMTYPE_SMALLKEY, 0xB5, true, &GerudoTrainingGroundsKeys, GERUDO_TRAINING_GROUNDS_SMALL_KEY); - itemTable[GERUDO_FORTRESS_SMALL_KEY] = Item(RG_GERUDO_FORTRESS_SMALL_KEY, Text{"Gerudo Fortress Small Key", "Petite Clé du Repaire des Voleurs","Llave de la Fortaleza Gerudo"}, ITEMTYPE_FORTRESS_SMALLKEY, 0xB6, true, &GerudoFortressKeys, GERUDO_FORTRESS_SMALL_KEY); - itemTable[GANONS_CASTLE_SMALL_KEY] = Item(RG_GANONS_CASTLE_SMALL_KEY, Text{"Ganon's Castle Small Key", "Petite Clé du Château de Ganon", "Llave del Castillo de Ganon"}, ITEMTYPE_SMALLKEY, 0xB7, true, &GanonsCastleKeys, GANONS_CASTLE_SMALL_KEY); - itemTable[TREASURE_GAME_SMALL_KEY] = Item(RG_TREASURE_GAME_SMALL_KEY, Text{"Chest Game Small Key", "Petite Clé du jeu la Chasse-aux-Trésors","Llave del Cofre del Tesoro"}, ITEMTYPE_ITEM, 0xDE, true, &TreasureGameKeys, TREASURE_GAME_SMALL_KEY); - - // Key Rings - itemTable[FOREST_TEMPLE_KEY_RING] = Item(RG_FOREST_TEMPLE_KEY_RING, Text{"Forest Temple Key Ring", "Trousseau du Temple de la Forêt", "Llavero del Templo del Bosque"}, ITEMTYPE_SMALLKEY, 0xD5, true, &ForestTempleKeys, FOREST_TEMPLE_KEY_RING); - itemTable[FIRE_TEMPLE_KEY_RING] = Item(RG_FIRE_TEMPLE_KEY_RING, Text{"Fire Temple Key Ring", "Trousseau du Temple du Feu", "Llavero del Templo del Fuego"}, ITEMTYPE_SMALLKEY, 0xD6, true, &FireTempleKeys, FIRE_TEMPLE_KEY_RING); - itemTable[WATER_TEMPLE_KEY_RING] = Item(RG_WATER_TEMPLE_KEY_RING, Text{"Water Temple Key Ring", "Trousseau du Temple de l'Eau", "Llavero del Templo del Agua"}, ITEMTYPE_SMALLKEY, 0xD7, true, &WaterTempleKeys, WATER_TEMPLE_KEY_RING); - itemTable[SPIRIT_TEMPLE_KEY_RING] = Item(RG_SPIRIT_TEMPLE_KEY_RING, Text{"Spirit Temple Key Ring", "Trousseau du Temple de l'Esprit", "Llavero del Templo del Espíritu"}, ITEMTYPE_SMALLKEY, 0xD8, true, &SpiritTempleKeys, SPIRIT_TEMPLE_KEY_RING); - itemTable[SHADOW_TEMPLE_KEY_RING] = Item(RG_SHADOW_TEMPLE_KEY_RING, Text{"Shadow Temple Key Ring", "Trousseau du Temple de l'Ombre", "Llavero del Templo de las Sombras"}, ITEMTYPE_SMALLKEY, 0xD9, true, &ShadowTempleKeys, SHADOW_TEMPLE_KEY_RING); - itemTable[BOTTOM_OF_THE_WELL_KEY_RING] = Item(RG_BOTTOM_OF_THE_WELL_KEY_RING, Text{"Bottom of the Well Key Ring", "Trousseau du Puits", "Llavero del fondo del pozo"}, ITEMTYPE_SMALLKEY, 0xDA, true, &BottomOfTheWellKeys, BOTTOM_OF_THE_WELL_KEY_RING); - itemTable[GERUDO_TRAINING_GROUNDS_KEY_RING] = Item(RG_GERUDO_TRAINING_GROUNDS_KEY_RING, Text{"Training Grounds Key Ring", "Trousseau du Gymnase Gerudo", "Llavero del Centro de Instrucción"}, ITEMTYPE_SMALLKEY, 0xDB, true, &GerudoTrainingGroundsKeys, GERUDO_TRAINING_GROUNDS_KEY_RING); - itemTable[GERUDO_FORTRESS_KEY_RING] = Item(RG_GERUDO_FORTRESS_KEY_RING, Text{"Gerudo Fortress Key Ring", "Trousseau du Repaire des Voleurs", "Llavero de la Fortaleza Gerudo"}, ITEMTYPE_FORTRESS_SMALLKEY, 0xDC, true, &GerudoFortressKeys, GERUDO_FORTRESS_KEY_RING); - itemTable[GANONS_CASTLE_KEY_RING] = Item(RG_GANONS_CASTLE_KEY_RING, Text{"Ganon's Castle Key Ring", "Trousseau du Château de Ganon", "Llavero del Castillo de Ganon"}, ITEMTYPE_SMALLKEY, 0xDD, true, &GanonsCastleKeys, GANONS_CASTLE_KEY_RING); - - //Stones and Medallions - itemTable[KOKIRI_EMERALD] = Item(RG_KOKIRI_EMERALD, Text{"Kokiri's Emerald", "Émeraude Kokiri", "Esmeralda de los Kokiri"}, ITEMTYPE_DUNGEONREWARD, 0xCB, true, &KokiriEmerald, KOKIRI_EMERALD); - itemTable[GORON_RUBY] = Item(RG_GORON_RUBY, Text{"Goron's Ruby", "Rubis Goron", "Rubí de los Goron"}, ITEMTYPE_DUNGEONREWARD, 0xCC, true, &GoronRuby, GORON_RUBY); - itemTable[ZORA_SAPPHIRE] = Item(RG_ZORA_SAPPHIRE, Text{"Zora's Sapphire", "Saphir Zora", "Zafiro de los Zora"}, ITEMTYPE_DUNGEONREWARD, 0xCD, true, &ZoraSapphire, ZORA_SAPPHIRE); - itemTable[FOREST_MEDALLION] = Item(RG_FOREST_MEDALLION, Text{"Forest Medallion", "Médaillon de la Forêt", "Medallón del Bosque"}, ITEMTYPE_DUNGEONREWARD, 0xCE, true, &ForestMedallion, FOREST_MEDALLION); - itemTable[FIRE_MEDALLION] = Item(RG_FIRE_MEDALLION, Text{"Fire Medallion", "Médaillon du Feu", "Medallón del Fuego"}, ITEMTYPE_DUNGEONREWARD, 0xCF, true, &FireMedallion, FIRE_MEDALLION); - itemTable[WATER_MEDALLION] = Item(RG_WATER_MEDALLION, Text{"Water Medallion", "Médaillon de l'Eau", "Medallón del Agua"}, ITEMTYPE_DUNGEONREWARD, 0xD0, true, &WaterMedallion, WATER_MEDALLION); - itemTable[SPIRIT_MEDALLION] = Item(RG_SPIRIT_MEDALLION, Text{"Spirit Medallion", "Médaillon de l'Esprit", "Medallón del Espíritu"}, ITEMTYPE_DUNGEONREWARD, 0xD1, true, &SpiritMedallion, SPIRIT_MEDALLION); - itemTable[SHADOW_MEDALLION] = Item(RG_SHADOW_MEDALLION, Text{"Shadow Medallion", "Médaillon de l'Ombre", "Medallón de la Sombra"}, ITEMTYPE_DUNGEONREWARD, 0xD2, true, &ShadowMedallion, SHADOW_MEDALLION); - itemTable[LIGHT_MEDALLION] = Item(RG_LIGHT_MEDALLION, Text{"Light Medallion", "Médaillon de la Lumière", "Medallón de la Luz"}, ITEMTYPE_DUNGEONREWARD, 0xD3, true, &LightMedallion, LIGHT_MEDALLION); - - //Generic Items - itemTable[RECOVERY_HEART] = Item(RG_RECOVERY_HEART, Text{"Recovery Heart", "Coeur de Vie", "Corazón"}, ITEMTYPE_ITEM, GI_HEART, false, &noVariable, RECOVERY_HEART); - itemTable[GREEN_RUPEE] = Item(RG_GREEN_RUPEE, Text{"Green Rupee", "Rubis Vert", "Rupia verde"}, ITEMTYPE_ITEM, GI_RUPEE_GREEN, false, &noVariable, GREEN_RUPEE); - itemTable[GREG_RUPEE] = Item(RG_GREG_RUPEE, Text{"Greg the Green Rupee", "Rubis Greg", "Rupia Greg"}, ITEMTYPE_ITEM, GI_RUPEE_GREEN, true, &Greg, GREG_RUPEE); - itemTable[BLUE_RUPEE] = Item(RG_BLUE_RUPEE, Text{"Blue Rupee", "Rubis Bleu", "Rupia azul"}, ITEMTYPE_ITEM, GI_RUPEE_BLUE, false, &noVariable, BLUE_RUPEE); - itemTable[RED_RUPEE] = Item(RG_RED_RUPEE, Text{"Red Rupee", "Rubis Rouge", "Rupia roja"}, ITEMTYPE_ITEM, GI_RUPEE_RED, false, &noVariable, RED_RUPEE); - itemTable[PURPLE_RUPEE] = Item(RG_PURPLE_RUPEE, Text{"Purple Rupee", "Rubis Pourpre", "Rupia morada"}, ITEMTYPE_ITEM, GI_RUPEE_PURPLE, false, &noVariable, PURPLE_RUPEE); - itemTable[HUGE_RUPEE] = Item(RG_HUGE_RUPEE, Text{"Huge Rupee", "Énorme Rubis", "Rupia gigante"}, ITEMTYPE_ITEM, GI_RUPEE_GOLD, false, &noVariable, HUGE_RUPEE); - itemTable[PIECE_OF_HEART] = Item(RG_PIECE_OF_HEART, Text{"Piece of Heart", "Quart de Coeur", "Pieza de corazón"}, ITEMTYPE_ITEM, GI_HEART_PIECE, true, &PieceOfHeart, PIECE_OF_HEART); - itemTable[HEART_CONTAINER] = Item(RG_HEART_CONTAINER, Text{"Heart Container", "Réceptacle de Coeur", "Contenedor de corazón"}, ITEMTYPE_ITEM, GI_HEART_CONTAINER_2, true, &HeartContainer, HEART_CONTAINER); - itemTable[ICE_TRAP] = Item(RG_ICE_TRAP, Text{"Ice Trap", "Piège de Glace", "Trampa de hielo"}, ITEMTYPE_ITEM, GI_ICE_TRAP, false, &noVariable, ICE_TRAP); - itemTable[MILK] = Item(RG_MILK, Text{"Milk", "Lait", "Leche Lon Lon"}, ITEMTYPE_ITEM, GI_MILK, false, &noVariable, NONE); - - //Refills - itemTable[BOMBS_5] = Item(RG_BOMBS_5, Text{"Bombs (5)", "Bombes (5)", "Bombas (5)"}, ITEMTYPE_REFILL, GI_BOMBS_5, false, &noVariable, BOMBS_5); - itemTable[BOMBS_10] = Item(RG_BOMBS_10, Text{"Bombs (10)", "Bombes (10)", "Bombas (10)"}, ITEMTYPE_REFILL, GI_BOMBS_10, false, &noVariable, BOMBS_10); - itemTable[BOMBS_20] = Item(RG_BOMBS_20, Text{"Bombs (20)", "Bombes (20)", "Bombas (20)"}, ITEMTYPE_REFILL, GI_BOMBS_20, false, &noVariable, BOMBS_20); - itemTable[BOMBCHU_5] = Item(RG_BOMBCHU_5, Text{"Bombchus (5)", "Missiles (5)", "Bombchus (5)"}, ITEMTYPE_REFILL, GI_BOMBCHUS_5, true, &Bombchus5, BOMBCHU_5); - itemTable[BOMBCHU_10] = Item(RG_BOMBCHU_10, Text{"Bombchus (10)", "Missiles (10)", "Bombchus (10)"}, ITEMTYPE_REFILL, GI_BOMBCHUS_10, true, &Bombchus10, BOMBCHU_10); - itemTable[BOMBCHU_20] = Item(RG_BOMBCHU_20, Text{"Bombchus (20)", "Missiles (20)", "Bombchus (20)"}, ITEMTYPE_REFILL, GI_BOMBCHUS_20, true, &Bombchus20, BOMBCHU_20); - itemTable[BOMBCHU_DROP] = Item(RG_BOMBCHU_DROP, Text{"Bombchu Drop", "Drop Missiles", "Bombchus"}, ITEMTYPE_DROP, GI_BOMBCHUS_10, true, &BombchuDrop, NONE); - itemTable[ARROWS_5] = Item(RG_ARROWS_5, Text{"Arrows (5)", "Flèches (5)", "Flechas (5)"}, ITEMTYPE_REFILL, GI_ARROWS_SMALL, false, &noVariable, ARROWS_5); - itemTable[ARROWS_10] = Item(RG_ARROWS_10, Text{"Arrows (10)", "Flèches (10)", "Flechas (10)"}, ITEMTYPE_REFILL, GI_ARROWS_MEDIUM, false, &noVariable, ARROWS_10); - itemTable[ARROWS_30] = Item(RG_ARROWS_30, Text{"Arrows (30)", "Flèches (30)", "Flechas (30)"}, ITEMTYPE_REFILL, GI_ARROWS_LARGE, false, &noVariable, ARROWS_30); - itemTable[DEKU_NUTS_5] = Item(RG_DEKU_NUTS_5, Text{"Deku Nuts (5)", "Noix Mojo (5)", "Nueces deku (5)"}, ITEMTYPE_REFILL, GI_NUTS_5, false, &noVariable, DEKU_NUTS_5); - itemTable[DEKU_NUTS_10] = Item(RG_DEKU_NUTS_10, Text{"Deku Nuts (10)", "Noix Mojo (10)", "Nueces deku (10)"}, ITEMTYPE_REFILL, GI_NUTS_10, false, &noVariable, DEKU_NUTS_10); - itemTable[DEKU_SEEDS_30] = Item(RG_DEKU_SEEDS_30, Text{"Deku Seeds (30)", "Graines Mojo (30)", "Semillas deku (30)"}, ITEMTYPE_REFILL, GI_SEEDS_30, false, &noVariable, DEKU_SEEDS_30); - itemTable[DEKU_STICK_1] = Item(RG_DEKU_STICK_1, Text{"Deku Stick (1)", "Bâton Mojo (1)", "Palo deku (1)"}, ITEMTYPE_REFILL, GI_STICKS_1, false, &noVariable, DEKU_STICK_1); - itemTable[RED_POTION_REFILL] = Item(RG_RED_POTION_REFILL, Text{"Red Potion Refill", "Recharge de Potion Rouge", "Recarga de poción roja"}, ITEMTYPE_REFILL, GI_POTION_RED, false, &noVariable, NONE); - itemTable[GREEN_POTION_REFILL] = Item(RG_GREEN_POTION_REFILL, Text{"Green Potion Refill", "Recharge de Potion Verte", "Recarga de poción verde"}, ITEMTYPE_REFILL, GI_POTION_GREEN, false, &noVariable, NONE); - itemTable[BLUE_POTION_REFILL] = Item(RG_BLUE_POTION_REFILL, Text{"Blue Potion Refill", "Recharge de Potion Bleue", "Recarga de poción azul"}, ITEMTYPE_REFILL, GI_POTION_BLUE, false, &noVariable, NONE); - - //Treasure Game - itemTable[TREASURE_GAME_HEART] = Item(RG_TREASURE_GAME_HEART, Text{"Piece of Heart (WINNER)", "Quart de Coeur (Chasse-aux-Trésors)", "Pieza de corazón (Cofre del Tesoro)"}, ITEMTYPE_ITEM, GI_HEART_PIECE_WIN, true, &PieceOfHeart, TREASURE_GAME_HEART); - itemTable[TREASURE_GAME_GREEN_RUPEE] = Item(RG_TREASURE_GAME_GREEN_RUPEE, Text{"Green Rupee (LOSER)", "Rubis Vert (Chasse-aux-Trésors)", "Rupia Verde (Cofre del Tesoro)"}, ITEMTYPE_ITEM, GI_RUPEE_GREEN_LOSE, false, &noVariable, TREASURE_GAME_GREEN_RUPEE); - - //Shop Items price - itemTable[BUY_DEKU_NUT_5] = Item(RG_BUY_DEKU_NUT_5, Text{"Buy Deku Nut (5)", "Acheter: Noix Mojo (5)", "Comprar nueces deku (5)"}, ITEMTYPE_SHOP, 0x00, true, &Nuts, DEKU_NUTS_5, 15); - itemTable[BUY_ARROWS_30] = Item(RG_BUY_ARROWS_30, Text{"Buy Arrows (30)", "Acheter: Flèches (30)", "Comprar flechas (30)"}, ITEMTYPE_SHOP, 0x01, true, &BuyArrow, ARROWS_30, 60); - itemTable[BUY_ARROWS_50] = Item(RG_BUY_ARROWS_50, Text{"Buy Arrows (50)", "Acheter: Flèches (50)", "Comprar flechas (50)"}, ITEMTYPE_SHOP, 0x02, true, &BuyArrow, ARROWS_30, 90); - itemTable[BUY_BOMBS_525] = Item(RG_BUY_BOMBS_525, Text{"Buy Bombs (5) [25]", "Acheter: Bombes (5) [25]", "Comprar bombas (5) [25]"}, ITEMTYPE_SHOP, 0x03, true, &BuyBomb, BOMBS_5, 25); - itemTable[BUY_DEKU_NUT_10] = Item(RG_BUY_DEKU_NUT_10, Text{"Buy Deku Nut (10)", "Acheter: Noix Mojo (10)", "Comprar Nueces deku (10)"}, ITEMTYPE_SHOP, 0x04, true, &Nuts, DEKU_NUTS_10, 30); - itemTable[BUY_DEKU_STICK_1] = Item(RG_BUY_DEKU_STICK_1, Text{"Buy Deku Stick (1)", "Acheter: Bâton Mojo (1)", "Comprar palos deku (1)"}, ITEMTYPE_SHOP, 0x05, true, &Sticks, DEKU_STICK_1, 10); - itemTable[BUY_BOMBS_10] = Item(RG_BUY_BOMBS_10, Text{"Buy Bombs (10)", "Acheter: Bombes (10)", "Comprar Bombas (10)"}, ITEMTYPE_SHOP, 0x06, true, &BuyBomb, BOMBS_10, 50); - itemTable[BUY_FISH] = Item(RG_BUY_FISH, Text{"Buy Fish", "Acheter: Poisson", "Comprar pez"}, ITEMTYPE_SHOP, 0x07, true, &FishAccess, BOTTLE_WITH_FISH, 200); - itemTable[BUY_RED_POTION_30] = Item(RG_BUY_RED_POTION_30, Text{"Buy Red Potion [30]", "Acheter: Potion Rouge [30]", "Comprar poción roja [30]"}, ITEMTYPE_SHOP, 0x08, false, &noVariable, BOTTLE_WITH_RED_POTION, 30); - itemTable[BUY_GREEN_POTION] = Item(RG_BUY_GREEN_POTION, Text{"Buy Green Potion", "Acheter: Potion Verte", "Comprar poción verde"}, ITEMTYPE_SHOP, 0x09, true, &BuyGPotion, BOTTLE_WITH_GREEN_POTION, 30); - itemTable[BUY_BLUE_POTION] = Item(RG_BUY_BLUE_POTION, Text{"Buy Blue Potion", "Acheter: Potion Bleue", "Comprar poción azul"}, ITEMTYPE_SHOP, 0x0A, true, &BuyBPotion, BOTTLE_WITH_BLUE_POTION, 100); - itemTable[BUY_HYLIAN_SHIELD] = Item(RG_BUY_HYLIAN_SHIELD, Text{"Buy Hylian Shield", "Acheter: Bouclier Hylien", "Comprar escudo hyliano"}, ITEMTYPE_SHOP, 0x0C, true, &HylianShield, HYLIAN_SHIELD, 80); - itemTable[BUY_DEKU_SHIELD] = Item(RG_BUY_DEKU_SHIELD, Text{"Buy Deku Shield", "Acheter: Bouclier Mojo", "Comprar escudo deku"}, ITEMTYPE_SHOP, 0x0D, true, &DekuShield, DEKU_SHIELD, 40); - itemTable[BUY_GORON_TUNIC] = Item(RG_BUY_GORON_TUNIC, Text{"Buy Goron Tunic", "Acheter: Tunique Goron", "Comprar sayo goron"}, ITEMTYPE_SHOP, 0x0E, true, &GoronTunic, GORON_TUNIC, 200); - itemTable[BUY_ZORA_TUNIC] = Item(RG_BUY_ZORA_TUNIC, Text{"Buy Zora Tunic", "Acheter: Tunique Zora", "Comprar sayo zora"}, ITEMTYPE_SHOP, 0x0F, true, &ZoraTunic, ZORA_TUNIC, 300); - itemTable[BUY_HEART] = Item(RG_BUY_HEART, Text{"Buy Heart", "Acheter: Coeur de Vie", "Comprar corazón"}, ITEMTYPE_SHOP, 0x10, false, &noVariable, RECOVERY_HEART, 10); - itemTable[BUY_BOMBCHU_10] = Item(RG_BUY_BOMBCHU_10, Text{"Buy Bombchu (10)", "Acheter: Missiles (10)", "Comprar bombchus (10)"}, ITEMTYPE_SHOP, 0x15, true, &BuyBombchus10, BOMBCHU_10, 99); - itemTable[BUY_BOMBCHU_20] = Item(RG_BUY_BOMBCHU_20, Text{"Buy Bombchu (20)", "Acheter: Missiles (20)", "Comprar bombchus (20)"}, ITEMTYPE_SHOP, 0x16, true, &BuyBombchus20, BOMBCHU_20, 180); - itemTable[BUY_DEKU_SEEDS_30] = Item(RG_BUY_DEKU_SEEDS_30, Text{"Buy Deku Seeds (30)", "Acheter: Graines Mojo (30)", "Comprar semillas deku (30)"}, ITEMTYPE_SHOP, 0x1D, true, &BuySeed, DEKU_SEEDS_30, 30); - itemTable[SOLD_OUT] = Item(RG_SOLD_OUT, Text{"Sold Out", "Rupture de stock", "Vendido"}, ITEMTYPE_SHOP, 0x26, false, &noVariable, NONE, 0); - itemTable[BUY_BLUE_FIRE] = Item(RG_BUY_BLUE_FIRE, Text{"Buy Blue Fire", "Acheter: Flamme Bleue", "Comprar fuego azul"}, ITEMTYPE_SHOP, 0x27, true, &BlueFireAccess, BOTTLE_WITH_BLUE_FIRE, 300); - itemTable[BUY_BOTTLE_BUG] = Item(RG_BUY_BOTTLE_BUG, Text{"Buy Bottle Bug", "Acheter: Insecte en bouteille", "Comprar bichos"}, ITEMTYPE_SHOP, 0x28, true, &BugsAccess, BOTTLE_WITH_BUGS, 50); - itemTable[BUY_POE] = Item(RG_BUY_POE, Text{"Buy Poe", "Acheter: Esprit", "Comprar Poe"}, ITEMTYPE_SHOP, 0x2A, false, &noVariable, BOTTLE_WITH_BIG_POE, 30); - itemTable[BUY_FAIRYS_SPIRIT] = Item(RG_BUY_FAIRYS_SPIRIT, Text{"Buy Fairy's Spirit", "Acheter: Esprit de Fée", "Comprar hada"}, ITEMTYPE_SHOP, 0x2B, true, &FairyAccess, BOTTLE_WITH_FAIRY, 50); - itemTable[BUY_ARROWS_10] = Item(RG_BUY_ARROWS_10, Text{"Buy Arrows (10)", "Acheter: Flèches (10)", "Comprar flechas (10)"}, ITEMTYPE_SHOP, 0x2C, true, &BuyArrow, ARROWS_10, 20); - itemTable[BUY_BOMBS_20] = Item(RG_BUY_BOMBS_20, Text{"Buy Bombs (20)", "Acheter: Bombes (20)", "Comprar bombas (20)"}, ITEMTYPE_SHOP, 0x2D, true, &BuyBomb, BOMBS_20, 80); - itemTable[BUY_BOMBS_30] = Item(RG_BUY_BOMBS_30, Text{"Buy Bombs (30)", "Acheter: Bombes (30)", "Comprar bombas (30)"}, ITEMTYPE_SHOP, 0x2E, true, &BuyBomb, BOMBS_20, 120); - itemTable[BUY_BOMBS_535] = Item(RG_BUY_BOMBS_535, Text{"Buy Bombs (5) [35]", "Acheter: Bombes (5) [35]", "Comprar bombas (5) [35]"}, ITEMTYPE_SHOP, 0x2F, true, &BuyBomb, BOMBS_5, 35); - itemTable[BUY_RED_POTION_40] = Item(RG_BUY_RED_POTION_40, Text{"Buy Red Potion [40]", "Acheter: Potion Rouge [40]", "Comprar poción roja [40]"}, ITEMTYPE_SHOP, 0x30, false, &noVariable, BOTTLE_WITH_RED_POTION, 40); - itemTable[BUY_RED_POTION_50] = Item(RG_BUY_RED_POTION_50, Text{"Buy Red Potion [50]", "Acheter: Potion Rouge [50]", "Comprar poción roja [50]"}, ITEMTYPE_SHOP, 0x31, false, &noVariable, BOTTLE_WITH_RED_POTION, 50); - - itemTable[TRIFORCE_PIECE] = Item(RG_TRIFORCE_PIECE, Text{"Triforce Piece", "Triforce Piece", "Triforce Piece"}, ITEMTYPE_ITEM, 0xDF, true, &TriforcePieces, TRIFORCE_PIECE); - itemTable[TRIFORCE] = Item(RG_TRIFORCE, Text{"Triforce", "Triforce", "Trifuerza"}, ITEMTYPE_EVENT, GI_RUPEE_RED_LOSE, false, &noVariable, NONE); - itemTable[HINT] = Item(RG_HINT, Text{"Hint", "Indice", "Pista"}, ITEMTYPE_EVENT, GI_RUPEE_BLUE_LOSE, false, &noVariable, NONE); - -// itemTable[HOOKSHOT] = Item(RG_HOOKSHOT, Text{"Hookshot", "Grappin", "Gancho"}, ITEMTYPE_ITEM, 0x80, true, &ProgressiveHookshot, HOOKSHOT); -// itemTable[LONGSHOT] = Item(RG_LONGSHOT, Text{"Longshot", "Super-Grappin", "Supergancho"}, ITEMTYPE_ITEM, 0x80, true, &ProgressiveHookshot, LONGSHOT); -// itemTable[FAIRY_OCARINA] = Item(RG_FAIRY_OCARINA, Text{"Fairy Ocarina", "Ocarina des fées", "Ocarina de las Hadas"}, ITEMTYPE_ITEM, 0x8B, true, &ProgressiveOcarina, FAIRY_OCARINA); -// itemTable[OCARINA_OF_TIME] = Item(RG_OCARINA_OF_TIME, Text{"Ocarina of Time", "Ocarina du Temps", "Ocarina del Tiempo"}, ITEMTYPE_ITEM, 0x8B, true, &ProgressiveOcarina, OCARINA_OF_TIME); -// itemTable[BOMB_BAG] = Item(RG_BOMB_BAG, Text{"Bomb Bag", "Sac de Bombes", "Saco de bombas"}, ITEMTYPE_ITEM, 0x82, true, &ProgressiveBombBag, BOMB_BAG); -// itemTable[BIG_BOMB_BAG] = Item(RG_BIG_BOMB_BAG, Text{"Big Bomb Bag", "Grand Sac de Bombes", "Saco de bombas grande"}, ITEMTYPE_ITEM, 0x82, true, &ProgressiveBombBag, BIG_BOMB_BAG); -// itemTable[BIGGEST_BOMB_BAG] = Item(RG_BIGGEST_BOMB_BAG, Text{"Biggest Bomb Bag", "Énorme Sac de Bombes", "Saco de bombas gigante"}, ITEMTYPE_ITEM, 0x82, true, &ProgressiveBombBag, BIGGEST_BOMB_BAG); -// itemTable[FAIRY_BOW] = Item(RG_FAIRY_BOW, Text{"Fairy Bow", "Arc des Fées", "Arco de las Hadas"}, ITEMTYPE_ITEM, 0x83, true, &ProgressiveBow, FAIRY_BOW); -// itemTable[BIG_QUIVER] = Item(RG_BIG_QUIVER, Text{"Big Quiver", "Grand carquois", "Carcaj grande"}, ITEMTYPE_ITEM, 0x83, true, &ProgressiveBow, BIG_QUIVER); -// itemTable[BIGGEST_QUIVER] = Item(RG_BIGGEST_QUIVER, Text{"Biggest Quiver", "Énorme carquois", "Carcaj gigante"}, ITEMTYPE_ITEM, 0x83, true, &ProgressiveBow, BIGGEST_QUIVER); -// itemTable[FAIRY_SLINGSHOT] = Item(RG_FAIRY_SLINGSHOT, Text{"Fairy Slingshot", "Lance-Pierre des Fées", "Resortera de las hadas"}, ITEMTYPE_ITEM, 0x84, true, &ProgressiveBulletBag, FAIRY_SLINGSHOT); -// itemTable[BIG_BULLET_BAG] = Item(RG_BIG_BULLET_BAG, Text{"Big Deku Seed Bullet Bag", "Grand sac de graines mojo", "Bolsa de semillas deku grande"}, ITEMTYPE_ITEM, 0x84, true, &ProgressiveBulletBag, BIG_BULLET_BAG); -// itemTable[BIGGEST_BULLET_BAD] = Item(RG_BIGGEST_BULLET_BAD, Text{"Biggest Deku Seed Bullet Bag", "Énorme sac de graines mojo", "Bolsa de semillas deku gigante"}, ITEMTYPE_ITEM, 0x84, true, &ProgressiveBulletBag, BIGGEST_BULLET_BAD); -// itemTable[GORONS_BRACELET] = Item(RG_GORONS_BRACELET, Text{"Goron's Bracelet", "Bracelet Goron", "Brazalete de los Goron"}, ITEMTYPE_ITEM, 0x81, true, &ProgressiveStrength, GORONS_BRACELET); -// itemTable[SILVER_GAUNTLETS] = Item(RG_SILVER_GAUNTLETS, Text{"Silver Gauntlets", "Gantelets d'argent", "Guantes de plata"}, ITEMTYPE_ITEM, 0x81, true, &ProgressiveStrength, SILVER_GAUNTLETS); -// itemTable[GOLDEN_GAUNTLETS] = Item(RG_GOLDEN_GAUNTLETS, Text{"Golden Gauntlets", "Gantelets d'or", "Guantes de oro"}, ITEMTYPE_ITEM, 0x81, true, &ProgressiveStrength, GOLDEN_GAUNTLETS); -// itemTable[SILVER_SCALE] = Item(RG_SILVER_SCALE, Text{"Silver Scale", "Écaille d'argent", "Escama de Plata"}, ITEMTYPE_ITEM, 0x86, true, &ProgressiveScale, SILVER_SCALE); -// itemTable[GOLDEN_SCALE] = Item(RG_GOLDEN_SCALE, Text{"Golden Scale", "Écaille d'or", "Escama de Oro"}, ITEMTYPE_ITEM, 0x86, true, &ProgressiveScale, GOLDEN_SCALE); -// itemTable[ADULT_WALLET] = Item(RG_ADULT_WALLET, Text{"Adult Wallet", "Grande Bourse", "Bolsa de adulto"}, ITEMTYPE_ITEM, 0x85, true, &ProgressiveWallet, ADULT_WALLET); -// itemTable[GIANT_WALLET] = Item(RG_GIANT_WALLET, Text{"Giant Wallet", "Bourse de Géant", "Bolsa gigante"}, ITEMTYPE_ITEM, 0x85, true, &ProgressiveWallet, GIANT_WALLET); -// itemTable[TYCOON_WALLET] = Item(RG_TYCOON_WALLET, Text{"Tycoon Wallet", "Bourse de Magnat", "Bolsa de ricachón"}, ITEMTYPE_ITEM, 0x85, true, &ProgressiveWallet, TYCOON_WALLET); -// itemTable[DEKU_NUT_CAPACITY_30] = Item(RG_DEKU_NUT_CAPACITY_30, Text{"Deku Nut Capacity (30)", "Capacité de noix Mojo (20)", "Capacidad de nueces deku (40)"}, ITEMTYPE_ITEM, 0x87, false, &noVariable, DEKU_NUT_CAPACITY_30); -// itemTable[DEKU_NUT_CAPACITY_40] = Item(RG_DEKU_NUT_CAPACITY_40, Text{"Deku Nut Capacity (40)", "Capacité de noix Mojo (30)", "Capacidad de nueces deku (50)"}, ITEMTYPE_ITEM, 0x87, false, &noVariable, DEKU_NUT_CAPACITY_40); -// itemTable[DEKU_NUT_CAPACITY_20] = Item(RG_DEKU_NUT_CAPACITY_20, Text{"Deku Stick Capacity (20)", "Capacité de Bâtons Mojo (20)", "Capacidad de palos deku (20)"}, ITEMTYPE_ITEM, 0x88, false, &noVariable, DEKU_NUT_CAPACITY_20); -// itemTable[DEKU_NUT_CAPACITY_30] = Item(RG_DEKU_NUT_CAPACITY_30, Text{"Deku Nut Capacity (30)", "Capacité de noix Mojo (20)", "Capacidad de nueces deku (40)"}, ITEMTYPE_ITEM, 0x88, false, &noVariable, DEKU_NUT_CAPACITY_30); -// itemTable[MAGIC_METER] = Item(RG_MAGIC_METER, Text{"Magic Meter", "Jauge de Magie", "Poder mágico"}, ITEMTYPE_ITEM, 0x8A, true, &ProgressiveMagic, MAGIC_METER); -// itemTable[ENHANCED_MAGIC_METER] = Item(RG_ENHANCED_MAGIC_METER, Text{"Enhanced Magic Meter", "Jauge de Magie améliorée", "Poder mágico mejorado"}, ITEMTYPE_ITEM, 0x8A, true, &ProgressiveMagic, ENHANCED_MAGIC_METER); - -} - -Item& ItemTable(const uint32_t itemKey) { - return itemTable[itemKey]; -} - -Item& ItemFromGIID(const int giid) { - uint32_t index = 0; - while (index < KEY_ENUM_MAX) { - if (itemTable[index].GetItemID() == giid) { - return itemTable[index]; - } - index++; - } - - // there are vanilla items that don't exist in the item table we're reading from here - // if we made it this far, it means we didn't find an item in the table - // if we don't return anything, the game will crash, so, as a workaround, return greg - return itemTable[GREEN_RUPEE]; -} - -//This function should only be used to place items containing hint text -//at gossip stone locations. -void NewItem(const uint32_t itemKey, const Item item) { - if (itemKey <= BUY_RED_POTION_50) { - printf("\x1b[25;0HWARNING: ATTEMPTED TO OVERWRITE ITEM %lu\n", itemKey); - return; - } - - itemTable[itemKey] = item; -} - -std::array* GetFullItemTable_() { - return &itemTable; -} diff --git a/soh/soh/Enhancements/randomizer/3drando/item_list.hpp b/soh/soh/Enhancements/randomizer/3drando/item_list.hpp deleted file mode 100644 index 2bcea700a..000000000 --- a/soh/soh/Enhancements/randomizer/3drando/item_list.hpp +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once - -#include "item.hpp" -#include "keys.hpp" - -void ItemTable_Init(); -Item& ItemTable(uint32_t itemKey); -Item& ItemFromGIID(int giid); -void NewItem(uint32_t itemKey, Item item); -std::array* GetFullItemTable_(); diff --git a/soh/soh/Enhancements/randomizer/3drando/item_location.cpp b/soh/soh/Enhancements/randomizer/3drando/item_location.cpp deleted file mode 100644 index 1c085021c..000000000 --- a/soh/soh/Enhancements/randomizer/3drando/item_location.cpp +++ /dev/null @@ -1,1658 +0,0 @@ -#include "item_location.hpp" - -#include "dungeon.hpp" -#include "settings.hpp" -#include "spoiler_log.hpp" -#include "shops.hpp" -#include "keys.hpp" -#include -#include "../randomizerTypes.h" - -//Location definitions -static std::array locationTable; -static std::unordered_map locationLookupTable; - -void LocationTable_Init() { - locationTable[NONE] = ItemLocation::Base (RC_UNKNOWN_CHECK, 0xFF, "Invalid Location", NONE, NONE, {}, SpoilerCollectionCheck::None()); - //Kokiri Forest scene flag name hint key (hint_list.cpp) vanilla item categories collection check (if needed) collection check group - locationTable[KF_KOKIRI_SWORD_CHEST] = ItemLocation::Chest (RC_KF_KOKIRI_SWORD_CHEST, 0x55, 0x00, "KF Kokiri Sword Chest", KF_KOKIRI_SWORD_CHEST, KOKIRI_SWORD, {}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - locationTable[KF_MIDOS_TOP_LEFT_CHEST] = ItemLocation::Chest (RC_KF_MIDOS_TOP_LEFT_CHEST, 0x28, 0x00, "KF Mido Top Left Chest", KF_MIDOS_TOP_LEFT_CHEST, BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - locationTable[KF_MIDOS_TOP_RIGHT_CHEST] = ItemLocation::Chest (RC_KF_MIDOS_TOP_RIGHT_CHEST, 0x28, 0x01, "KF Mido Top Right Chest", KF_MIDOS_TOP_RIGHT_CHEST, BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - locationTable[KF_MIDOS_BOTTOM_LEFT_CHEST] = ItemLocation::Chest (RC_KF_MIDOS_BOTTOM_LEFT_CHEST, 0x28, 0x02, "KF Mido Bottom Left Chest", KF_MIDOS_BOTTOM_LEFT_CHEST, GREG_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - locationTable[KF_MIDOS_BOTTOM_RIGHT_CHEST] = ItemLocation::Chest (RC_KF_MIDOS_BOTTOM_RIGHT_CHEST, 0x28, 0x03, "KF Mido Bottom Right Chest", KF_MIDOS_BOTTOM_RIGHT_CHEST, RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - locationTable[KF_STORMS_GROTTO_CHEST] = ItemLocation::Chest (RC_KF_STORMS_GROTTO_CHEST, 0x3E, 0x0C, "KF Storms Grotto Chest", KF_STORMS_GROTTO_CHEST, RED_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - - //Lost Woods - locationTable[LW_NEAR_SHORTCUTS_GROTTO_CHEST] = ItemLocation::Chest (RC_LW_NEAR_SHORTCUTS_GROTTO_CHEST, 0x3E, 0x14, "LW Near Shortcuts Grotto Chest", LW_NEAR_SHORTCUTS_GROTTO_CHEST, BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[LW_SKULL_KID] = ItemLocation::Base (RC_LW_SKULL_KID, 0x5B, "LW Skull Kid", LW_SKULL_KID, PIECE_OF_HEART, {}, SpoilerCollectionCheck::ItemGetInf(30), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[LW_TRADE_COJIRO] = ItemLocation::Base (RC_LW_TRADE_COJIRO, 0x5B, "LW Trade Cojiro", LW_TRADE_COJIRO, ODD_MUSHROOM, {Category::cAdultTrade}, SpoilerCollectionCheck::RandomizerInf(), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[LW_TRADE_ODD_POTION] = ItemLocation::Base (RC_LW_TRADE_ODD_POTION, 0x5B, "LW Trade Odd Potion", LW_TRADE_ODD_POTION, ODD_POTION, {Category::cAdultTrade}, SpoilerCollectionCheck::ItemGetInf(57), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[LW_OCARINA_MEMORY_GAME] = ItemLocation::Base (RC_LW_OCARINA_MEMORY_GAME, 0x5B, "LW Ocarina Memory Game", LW_OCARINA_MEMORY_GAME, PIECE_OF_HEART, {}, SpoilerCollectionCheck::ItemGetInf(31), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[LW_TARGET_IN_WOODS] = ItemLocation::Base (RC_LW_TARGET_IN_WOODS, 0x5B, "LW Target in Woods", LW_TARGET_IN_WOODS, PROGRESSIVE_SLINGSHOT, {}, SpoilerCollectionCheck::ItemGetInf(21), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT] = ItemLocation::Base (RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, 0x5B, "LW Deku Scrub Near Deku Theater Right",LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, BUY_DEKU_NUT_5, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT] = ItemLocation::Base (RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, 0x5B, "LW Deku Scrub Near Deku Theater Left", LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, BUY_DEKU_STICK_1, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[LW_DEKU_SCRUB_NEAR_BRIDGE] = ItemLocation::Base (RC_LW_DEKU_SCRUB_NEAR_BRIDGE, 0x5B, "LW Deku Scrub Near Bridge", LW_DEKU_SCRUB_NEAR_BRIDGE, PROGRESSIVE_STICK_UPGRADE, {Category::cDekuScrub, Category::cDekuScrubUpgrades}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[LW_DEKU_SCRUB_GROTTO_REAR] = ItemLocation::GrottoScrub(RC_LW_DEKU_SCRUB_GROTTO_REAR, 0xF5, "LW Deku Scrub Grotto Rear", LW_DEKU_SCRUB_GROTTO_REAR, BUY_DEKU_SEEDS_30, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[LW_DEKU_SCRUB_GROTTO_FRONT] = ItemLocation::GrottoScrub(RC_LW_DEKU_SCRUB_GROTTO_FRONT, 0xF5, "LW Deku Scrub Grotto Front", LW_DEKU_SCRUB_GROTTO_FRONT, PROGRESSIVE_NUT_UPGRADE, {Category::cDekuScrub, Category::cDekuScrubUpgrades}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[DEKU_THEATER_SKULL_MASK] = ItemLocation::Base (RC_DEKU_THEATER_SKULL_MASK, 0x3E, "Deku Theater Skull Mask", DEKU_THEATER_SKULL_MASK, PROGRESSIVE_STICK_UPGRADE, {}, SpoilerCollectionCheck::Chest(0x3E, 0x1F), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[DEKU_THEATER_MASK_OF_TRUTH] = ItemLocation::Base (RC_DEKU_THEATER_MASK_OF_TRUTH, 0x3E, "Deku Theater Mask of Truth", DEKU_THEATER_MASK_OF_TRUTH, PROGRESSIVE_NUT_UPGRADE, {}, SpoilerCollectionCheck::Chest(0x3E, 0x1E), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - - //Sacred Forest Meadow - locationTable[SFM_WOLFOS_GROTTO_CHEST] = ItemLocation::Chest (RC_SFM_WOLFOS_GROTTO_CHEST, 0x3E, 0x11, "SFM Wolfos Grotto Chest", SFM_WOLFOS_GROTTO_CHEST, PURPLE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[SFM_DEKU_SCRUB_GROTTO_REAR] = ItemLocation::GrottoScrub(RC_SFM_DEKU_SCRUB_GROTTO_REAR, 0xEE, "SFM Deku Scrub Grotto Rear", SFM_DEKU_SCRUB_GROTTO_REAR, BUY_RED_POTION_30, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[SFM_DEKU_SCRUB_GROTTO_FRONT] = ItemLocation::GrottoScrub(RC_SFM_DEKU_SCRUB_GROTTO_FRONT, 0xEE, "SFM Deku Scrub Grotto Front", SFM_DEKU_SCRUB_GROTTO_FRONT, BUY_GREEN_POTION, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - - //Hyrule Field - locationTable[HF_SOUTHEAST_GROTTO_CHEST] = ItemLocation::Chest (RC_HF_SOUTHEAST_GROTTO_CHEST, 0x3E, 0x02, "HF Southeast Grotto Chest", HF_SOUTHEAST_GROTTO_CHEST, RED_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); - locationTable[HF_OPEN_GROTTO_CHEST] = ItemLocation::Chest (RC_HF_OPEN_GROTTO_CHEST, 0x3E, 0x03, "HF Open Grotto Chest", HF_OPEN_GROTTO_CHEST, BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); - locationTable[HF_NEAR_MARKET_GROTTO_CHEST] = ItemLocation::Chest (RC_HF_NEAR_MARKET_GROTTO_CHEST, 0x3E, 0x00, "HF Near Market Grotto Chest", HF_NEAR_MARKET_GROTTO_CHEST, BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); - locationTable[HF_OCARINA_OF_TIME_ITEM] = ItemLocation::Base (RC_HF_OCARINA_OF_TIME_ITEM, 0x51, "HF Ocarina of Time Item", HF_OCARINA_OF_TIME_ITEM, PROGRESSIVE_OCARINA, {}, SpoilerCollectionCheck::EventChkInf(0x43), SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); - locationTable[HF_TEKTITE_GROTTO_FREESTANDING_POH] = ItemLocation::Collectable(RC_HF_TEKTITE_GROTTO_FREESTANDING_POH, 0x3E, 0x01, "HF Tektite Grotto Freestanding PoH", HF_TEKTITE_GROTTO_FREESTANDING_POH, PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); - locationTable[HF_DEKU_SCRUB_GROTTO] = ItemLocation::GrottoScrub(RC_HF_DEKU_SCRUB_GROTTO, 0xE6, "HF Deku Scrub Grotto", HF_DEKU_SCRUB_GROTTO, PIECE_OF_HEART, {Category::cDekuScrub, Category::cDekuScrubUpgrades}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); - - //Lake Hylia - locationTable[LH_CHILD_FISHING] = ItemLocation::Base (RC_LH_CHILD_FISHING, 0x49, "LH Child Fishing", LH_CHILD_FISHING, PIECE_OF_HEART, {}, SpoilerCollectionCheck::RandomizerInf(), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); - locationTable[LH_ADULT_FISHING] = ItemLocation::Base (RC_LH_ADULT_FISHING, 0x49, "LH Adult Fishing", LH_ADULT_FISHING, PROGRESSIVE_SCALE, {}, SpoilerCollectionCheck::RandomizerInf(), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); - locationTable[LH_LAB_DIVE] = ItemLocation::Base (RC_LH_LAB_DIVE, 0x38, "LH Lab Dive", LH_LAB_DIVE, PIECE_OF_HEART, {}, SpoilerCollectionCheck::ItemGetInf(24), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); - locationTable[LH_TRADE_FROG] = ItemLocation::Base (RC_LH_TRADE_FROG, 0x38, "LH Lab Trade Eyeball Frog", LH_TRADE_FROG, EYEDROPS, {Category::cAdultTrade}, SpoilerCollectionCheck::RandomizerInf(), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); - locationTable[LH_UNDERWATER_ITEM] = ItemLocation::Base (RC_LH_UNDERWATER_ITEM, 0x57, "LH Underwater Item", LH_UNDERWATER_ITEM, RUTOS_LETTER, {}, SpoilerCollectionCheck::EventChkInf(0x31), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); - locationTable[LH_SUN] = ItemLocation::Base (RC_LH_SUN, 0x57, "LH Sun", LH_SUN, FIRE_ARROWS, {}, SpoilerCollectionCheck::Chest(0x57, 0x1F), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); - locationTable[LH_FREESTANDING_POH] = ItemLocation::Collectable(RC_LH_FREESTANDING_POH, 0x57, 0x1E, "LH Freestanding PoH", LH_FREESTANDING_POH, PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); - locationTable[LH_DEKU_SCRUB_GROTTO_LEFT] = ItemLocation::GrottoScrub(RC_LH_DEKU_SCRUB_GROTTO_LEFT, 0xEF, "LH Deku Scrub Grotto Left", LH_DEKU_SCRUB_GROTTO_LEFT, BUY_DEKU_NUT_5, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); - locationTable[LH_DEKU_SCRUB_GROTTO_RIGHT] = ItemLocation::GrottoScrub(RC_LH_DEKU_SCRUB_GROTTO_RIGHT, 0xEF, "LH Deku Scrub Grotto Right", LH_DEKU_SCRUB_GROTTO_RIGHT, BUY_BOMBS_535, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); - locationTable[LH_DEKU_SCRUB_GROTTO_CENTER] = ItemLocation::GrottoScrub(RC_LH_DEKU_SCRUB_GROTTO_CENTER, 0xEF, "LH Deku Scrub Grotto Center", LH_DEKU_SCRUB_GROTTO_CENTER, BUY_DEKU_SEEDS_30, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); - - //Gerudo Valley - locationTable[GV_CHEST] = ItemLocation::Chest (RC_GV_CHEST, 0x5A, 0x00, "GV Chest", GV_CHEST, PURPLE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[GV_TRADE_SAW] = ItemLocation::Base (RC_GV_TRADE_SAW, 0x5A, "GV Trade Saw", GV_TRADE_SAW, BROKEN_SWORD, {Category::cAdultTrade}, SpoilerCollectionCheck::RandomizerInf(), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[GV_WATERFALL_FREESTANDING_POH] = ItemLocation::Collectable(RC_GV_WATERFALL_FREESTANDING_POH, 0x5A, 0x01, "GV Waterfall Freestanding PoH", GV_WATERFALL_FREESTANDING_POH, PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[GV_CRATE_FREESTANDING_POH] = ItemLocation::Collectable(RC_GV_CRATE_FREESTANDING_POH, 0x5A, 0x02, "GV Crate Freestanding PoH", GV_CRATE_FREESTANDING_POH, PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[GV_DEKU_SCRUB_GROTTO_REAR] = ItemLocation::GrottoScrub(RC_GV_DEKU_SCRUB_GROTTO_REAR, 0xF0, "GV Deku Scrub Grotto Rear", GV_DEKU_SCRUB_GROTTO_REAR, BUY_RED_POTION_30, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[GV_DEKU_SCRUB_GROTTO_FRONT] = ItemLocation::GrottoScrub(RC_GV_DEKU_SCRUB_GROTTO_FRONT, 0xF0, "GV Deku Scrub Grotto Front", GV_DEKU_SCRUB_GROTTO_FRONT, BUY_GREEN_POTION, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - - //Gerudo Fortress - locationTable[GF_CHEST] = ItemLocation::Chest (RC_GF_CHEST, 0x5D, 0x00, "GF Chest", GF_CHEST, PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[GF_HBA_1000_POINTS] = ItemLocation::Base (RC_GF_HBA_1000_POINTS, 0x5D, "GF HBA 1000 Points", GF_HBA_1000_POINTS, PIECE_OF_HEART, {}, SpoilerCollectionCheck::InfTable(0x19, 0x08), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[GF_HBA_1500_POINTS] = ItemLocation::Base (RC_GF_HBA_1500_POINTS, 0x5D, "GF HBA 1500 Points", GF_HBA_1500_POINTS, PROGRESSIVE_BOW, {}, SpoilerCollectionCheck::ItemGetInf(7), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[GF_GERUDO_MEMBERSHIP_CARD] = ItemLocation::Base (RC_GF_GERUDO_MEMBERSHIP_CARD, 0x0C, "GF Gerudo Membership Card", GF_GERUDO_MEMBERSHIP_CARD, GERUDO_MEMBERSHIP_CARD, {}, SpoilerCollectionCheck::GerudoToken(), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[GF_NORTH_F1_CARPENTER] = ItemLocation::Collectable(RC_GF_NORTH_F1_CARPENTER, 0x0C, 0x0C, "GF North F1 Carpenter", GF_NORTH_F1_CARPENTER, GERUDO_FORTRESS_SMALL_KEY, {Category::cVanillaGFSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[GF_NORTH_F2_CARPENTER] = ItemLocation::Collectable(RC_GF_NORTH_F2_CARPENTER, 0x0C, 0x0A, "GF North F2 Carpenter", GF_NORTH_F2_CARPENTER, GERUDO_FORTRESS_SMALL_KEY, {Category::cVanillaGFSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[GF_SOUTH_F1_CARPENTER] = ItemLocation::Collectable(RC_GF_SOUTH_F1_CARPENTER, 0x0C, 0x0E, "GF South F1 Carpenter", GF_SOUTH_F1_CARPENTER, GERUDO_FORTRESS_SMALL_KEY, {Category::cVanillaGFSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[GF_SOUTH_F2_CARPENTER] = ItemLocation::Collectable(RC_GF_SOUTH_F2_CARPENTER, 0x0C, 0x0F, "GF South F2 Carpenter", GF_SOUTH_F2_CARPENTER, GERUDO_FORTRESS_SMALL_KEY, {Category::cVanillaGFSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - - //Haunted Wasteland - locationTable[WASTELAND_CHEST] = ItemLocation::Chest (RC_WASTELAND_CHEST, 0x5E, 0x00, "Wasteland Chest", WASTELAND_CHEST, PURPLE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[WASTELAND_BOMBCHU_SALESMAN] = ItemLocation::Base (RC_WASTELAND_BOMBCHU_SALESMAN, 0x5E, "Wasteland Carpet Salesman", WASTELAND_BOMBCHU_SALESMAN, BOMBCHU_10, {Category::cMerchant}, SpoilerCollectionCheck::Merchant(), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - - //Desert Colossus - locationTable[COLOSSUS_FREESTANDING_POH] = ItemLocation::Collectable(RC_COLOSSUS_FREESTANDING_POH, 0x5C, 0x0D, "Colossus Freestanding PoH", COLOSSUS_FREESTANDING_POH, PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[COLOSSUS_DEKU_SCRUB_GROTTO_REAR] = ItemLocation::GrottoScrub(RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, 0xFD, "Colossus Deku Scrub Grotto Rear", COLOSSUS_DEKU_SCRUB_GROTTO_REAR, BUY_RED_POTION_30, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[COLOSSUS_DEKU_SCRUB_GROTTO_FRONT] = ItemLocation::GrottoScrub(RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, 0xFD, "Colossus Deku Scrub Grotto Front", COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, BUY_GREEN_POTION, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - - //Market - locationTable[MARKET_TREASURE_CHEST_GAME_REWARD] = ItemLocation::Chest (RC_MARKET_TREASURE_CHEST_GAME_REWARD, 0x10, "MK Treasure Chest Game Reward", MARKET_TREASURE_CHEST_GAME_REWARD, TREASURE_GAME_HEART, {}, SpoilerCollectionCheck::ItemGetInf(19), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BOMBCHU_BOWLING_FIRST_PRIZE] = ItemLocation::Base (RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, 0x4B, "MK Bombchu Bowling First Prize", MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, PROGRESSIVE_BOMB_BAG, {}, SpoilerCollectionCheck::ItemGetInf(25), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BOMBCHU_BOWLING_SECOND_PRIZE] = ItemLocation::Base (RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, 0x4B, "MK Bombchu Bowling Second Prize", MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, PIECE_OF_HEART, {}, SpoilerCollectionCheck::ItemGetInf(26), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BOMBCHU_BOWLING_BOMBCHUS] = ItemLocation::Base (RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS, 0x4B, "MK Bombchu Bowling Bombchus", NONE, BOMBCHU_DROP, {}, SpoilerCollectionCheck::None(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_LOST_DOG] = ItemLocation::Base (RC_MARKET_LOST_DOG, 0x35, "MK Lost Dog", MARKET_LOST_DOG, PIECE_OF_HEART, {}, SpoilerCollectionCheck::InfTable(0x19, 0x09), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_SHOOTING_GALLERY_REWARD] = ItemLocation::Base (RC_MARKET_SHOOTING_GALLERY_REWARD, 0x42, "MK Shooting Gallery", MARKET_SHOOTING_GALLERY_REWARD, PROGRESSIVE_SLINGSHOT, {}, SpoilerCollectionCheck::ItemGetInf(5), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_10_BIG_POES] = ItemLocation::Base (RC_MARKET_10_BIG_POES, 0x4D, "MK 10 Big Poes", MARKET_10_BIG_POES, EMPTY_BOTTLE, {}, SpoilerCollectionCheck::RandomizerInf(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_TREASURE_CHEST_GAME_ITEM_1] = ItemLocation::Chest (RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, 0x10, 0x01, "MK Chest Game First Room Chest", MARKET_TREASURE_CHEST_GAME_ITEM_1, TREASURE_GAME_SMALL_KEY, {Category::cChestMinigame}, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_TREASURE_CHEST_GAME_ITEM_2] = ItemLocation::Chest (RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, 0x10, 0x03, "MK Chest Game Second Room Chest", MARKET_TREASURE_CHEST_GAME_ITEM_2, TREASURE_GAME_SMALL_KEY, {Category::cChestMinigame}, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_TREASURE_CHEST_GAME_ITEM_3] = ItemLocation::Chest (RC_MARKET_TREASURE_CHEST_GAME_ITEM_3, 0x10, 0x05, "MK Chest Game Third Room Chest", MARKET_TREASURE_CHEST_GAME_ITEM_3, TREASURE_GAME_SMALL_KEY, {Category::cChestMinigame}, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_TREASURE_CHEST_GAME_ITEM_4] = ItemLocation::Chest (RC_MARKET_TREASURE_CHEST_GAME_ITEM_4, 0x10, 0x07, "MK Chest Game Fourth Room Chest", MARKET_TREASURE_CHEST_GAME_ITEM_4, TREASURE_GAME_SMALL_KEY, {Category::cChestMinigame}, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_TREASURE_CHEST_GAME_ITEM_5] = ItemLocation::Chest (RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, 0x10, 0x09, "MK Chest Game Fifth Room Chest", MARKET_TREASURE_CHEST_GAME_ITEM_5, TREASURE_GAME_SMALL_KEY, {Category::cChestMinigame}, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - - //Hyrule Castle - locationTable[HC_MALON_EGG] = ItemLocation::Base (RC_HC_MALON_EGG, 0x5F, "HC Malon Egg", HC_MALON_EGG, WEIRD_EGG, {}, SpoilerCollectionCheck::EventChkInf(0x12), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[HC_ZELDAS_LETTER] = ItemLocation::Base (RC_HC_ZELDAS_LETTER, 0x4A, "HC Zeldas Letter", HC_ZELDAS_LETTER, ZELDAS_LETTER, {}, SpoilerCollectionCheck::EventChkInf(0x40), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - - //Kakariko - locationTable[KAK_REDEAD_GROTTO_CHEST] = ItemLocation::Chest (RC_KAK_REDEAD_GROTTO_CHEST, 0x3E, 0x0A, "Kak Redead Grotto Chest", KAK_REDEAD_GROTTO_CHEST, HUGE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_OPEN_GROTTO_CHEST] = ItemLocation::Chest (RC_KAK_OPEN_GROTTO_CHEST, 0x3E, 0x08, "Kak Open Grotto Chest", KAK_OPEN_GROTTO_CHEST, RED_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_10_GOLD_SKULLTULA_REWARD] = ItemLocation::Base (RC_KAK_10_GOLD_SKULLTULA_REWARD, 0x50, "Kak 10 Gold Skulltula Reward", KAK_10_GOLD_SKULLTULA_REWARD, PROGRESSIVE_WALLET, {}, SpoilerCollectionCheck::EventChkInf(0xDA), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_20_GOLD_SKULLTULA_REWARD] = ItemLocation::Base (RC_KAK_20_GOLD_SKULLTULA_REWARD, 0x50, "Kak 20 Gold Skulltula Reward", KAK_20_GOLD_SKULLTULA_REWARD, STONE_OF_AGONY, {}, SpoilerCollectionCheck::EventChkInf(0xDB), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_30_GOLD_SKULLTULA_REWARD] = ItemLocation::Base (RC_KAK_30_GOLD_SKULLTULA_REWARD, 0x50, "Kak 30 Gold Skulltula Reward", KAK_30_GOLD_SKULLTULA_REWARD, PROGRESSIVE_WALLET, {}, SpoilerCollectionCheck::EventChkInf(0xDC), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_40_GOLD_SKULLTULA_REWARD] = ItemLocation::Base (RC_KAK_40_GOLD_SKULLTULA_REWARD, 0x50, "Kak 40 Gold Skulltula Reward", KAK_40_GOLD_SKULLTULA_REWARD, BOMBCHU_10, {}, SpoilerCollectionCheck::EventChkInf(0xDD), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_50_GOLD_SKULLTULA_REWARD] = ItemLocation::Base (RC_KAK_50_GOLD_SKULLTULA_REWARD, 0x50, "Kak 50 Gold Skulltula Reward", KAK_50_GOLD_SKULLTULA_REWARD, PIECE_OF_HEART, {}, SpoilerCollectionCheck::EventChkInf(0xDE), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_100_GOLD_SKULLTULA_REWARD] = ItemLocation::Base (RC_KAK_100_GOLD_SKULLTULA_REWARD, 0x50, "Kak 100 Gold Skulltula Reward", KAK_100_GOLD_SKULLTULA_REWARD, HUGE_RUPEE, {}, SpoilerCollectionCheck::EventChkInf(0xDF), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_MAN_ON_ROOF] = ItemLocation::Base (RC_KAK_MAN_ON_ROOF, 0x52, "Kak Man on Roof", KAK_MAN_ON_ROOF, PIECE_OF_HEART, {}, SpoilerCollectionCheck::ItemGetInf(29), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_SHOOTING_GALLERY_REWARD] = ItemLocation::Base (RC_KAK_SHOOTING_GALLERY_REWARD, 0x42, "Kak Shooting Gallery Reward", KAK_SHOOTING_GALLERY_REWARD, PROGRESSIVE_BOW, {}, SpoilerCollectionCheck::Chest(0x42, 0x1F), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_TRADE_ODD_MUSHROOM] = ItemLocation::Base (RC_KAK_TRADE_ODD_MUSHROOM, 0x4E, "Kak Trade Odd Mushroom", KAK_TRADE_ODD_MUSHROOM, ODD_POTION, {Category::cAdultTrade}, SpoilerCollectionCheck::ItemGetInf(56), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_GRANNYS_SHOP] = ItemLocation::Base (RC_KAK_GRANNYS_SHOP, 0x4E, "Kak Granny's Shop", KAK_GRANNYS_SHOP, BLUE_POTION_REFILL, {Category::cMerchant}, SpoilerCollectionCheck::RandomizerInf(), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_ANJU_AS_ADULT] = ItemLocation::Base (RC_KAK_ANJU_AS_ADULT, 0x52, "Kak Anju as Adult", KAK_ANJU_AS_ADULT, CLAIM_CHECK, {}, SpoilerCollectionCheck::ItemGetInf(36), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_ANJU_AS_CHILD] = ItemLocation::Base (RC_KAK_ANJU_AS_CHILD, 0x52, "Kak Anju as Child", KAK_ANJU_AS_CHILD, EMPTY_BOTTLE, {}, SpoilerCollectionCheck::ItemGetInf(4), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_TRADE_POCKET_CUCCO] = ItemLocation::Base (RC_KAK_TRADE_POCKET_CUCCO, 0x52, "Kak Trade Pocket Cucco", KAK_TRADE_POCKET_CUCCO, COJIRO, {Category::cAdultTrade}, SpoilerCollectionCheck::ItemGetInf(38), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_IMPAS_HOUSE_FREESTANDING_POH] = ItemLocation::Collectable(RC_KAK_IMPAS_HOUSE_FREESTANDING_POH, 0x37, 0x01, "Kak Impas House Freestanding PoH", KAK_IMPAS_HOUSE_FREESTANDING_POH, PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_WINDMILL_FREESTANDING_POH] = ItemLocation::Collectable(RC_KAK_WINDMILL_FREESTANDING_POH, 0x48, 0x01, "Kak Windmill Freestanding PoH", KAK_WINDMILL_FREESTANDING_POH, PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - - //Graveyard - locationTable[GRAVEYARD_SHIELD_GRAVE_CHEST] = ItemLocation::Chest (RC_GRAVEYARD_SHIELD_GRAVE_CHEST, 0x40, 0x00, "GY Shield Grave Chest", GRAVEYARD_SHIELD_GRAVE_CHEST, HYLIAN_SHIELD, {}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[GRAVEYARD_HEART_PIECE_GRAVE_CHEST] = ItemLocation::Chest (RC_GRAVEYARD_HEART_PIECE_GRAVE_CHEST, 0x3F, 0x00, "GY Heart Piece Grave Chest", GRAVEYARD_HEART_PIECE_GRAVE_CHEST, PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[GRAVEYARD_COMPOSERS_GRAVE_CHEST] = ItemLocation::Chest (RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST, 0x41, 0x00, "GY Composers Grave Chest", GRAVEYARD_COMPOSERS_GRAVE_CHEST, BOMBS_5, {}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[GRAVEYARD_HOOKSHOT_CHEST] = ItemLocation::Chest (RC_GRAVEYARD_HOOKSHOT_CHEST, 0x48, 0x00, "GY Hookshot Chest", GRAVEYARD_HOOKSHOT_CHEST, PROGRESSIVE_HOOKSHOT, {}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[GRAVEYARD_DAMPE_RACE_FREESTANDING_POH] = ItemLocation::Collectable(RC_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, 0x48, 0x07, "GY Dampe Race Freestanding PoH", GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[GRAVEYARD_FREESTANDING_POH] = ItemLocation::Collectable(RC_GRAVEYARD_FREESTANDING_POH, 0x53, 0x04, "GY Freestanding PoH", GRAVEYARD_FREESTANDING_POH, PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR] = ItemLocation::Collectable(RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, 0x53, "GY Dampe Gravedigging Tour", GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, PIECE_OF_HEART, {}, SpoilerCollectionCheck::Gravedigger(0x53, 0x1F), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - - //Death Mountain - locationTable[DMT_CHEST] = ItemLocation::Chest (RC_DMT_CHEST, 0x60, 0x01, "DMT Chest", DMT_CHEST, PURPLE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[DMT_STORMS_GROTTO_CHEST] = ItemLocation::Chest (RC_DMT_STORMS_GROTTO_CHEST, 0x3E, 0x17, "DMT Storms Grotto Chest", DMT_STORMS_GROTTO_CHEST, HUGE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[DMT_TRADE_BROKEN_SWORD] = ItemLocation::Base (RC_DMT_TRADE_BROKEN_SWORD, 0x60, "DMT Trade Broken Sword", DMT_TRADE_BROKEN_SWORD, PRESCRIPTION, {Category::cAdultTrade}, SpoilerCollectionCheck::RandomizerInf(), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[DMT_TRADE_EYEDROPS] = ItemLocation::Base (RC_DMT_TRADE_EYEDROPS, 0x60, "DMT Trade Eyedrops", DMT_TRADE_EYEDROPS, CLAIM_CHECK, {Category::cAdultTrade}, SpoilerCollectionCheck::RandomizerInf(), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[DMT_TRADE_CLAIM_CHECK] = ItemLocation::Base (RC_DMT_TRADE_CLAIM_CHECK, 0x60, "DMT Trade Claim Check", DMT_TRADE_CLAIM_CHECK, BIGGORON_SWORD, {}, SpoilerCollectionCheck::Chest(0x60, 0x1F), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[DMT_FREESTANDING_POH] = ItemLocation::Collectable(RC_DMT_FREESTANDING_POH, 0x60, 0x1E, "DMT Freestanding PoH", DMT_FREESTANDING_POH, PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - - //Goron City - locationTable[GC_MAZE_LEFT_CHEST] = ItemLocation::Chest (RC_GC_MAZE_LEFT_CHEST, 0x62, 0x00, "GC Maze Left Chest", GC_MAZE_LEFT_CHEST, HUGE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_MAZE_RIGHT_CHEST] = ItemLocation::Chest (RC_GC_MAZE_RIGHT_CHEST, 0x62, 0x01, "GC Maze Right Chest", GC_MAZE_RIGHT_CHEST, PURPLE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_MAZE_CENTER_CHEST] = ItemLocation::Chest (RC_GC_MAZE_CENTER_CHEST, 0x62, 0x02, "GC Maze Center Chest", GC_MAZE_CENTER_CHEST, PURPLE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_ROLLING_GORON_AS_CHILD] = ItemLocation::Base (RC_GC_ROLLING_GORON_AS_CHILD, 0x62, "GC Rolling Goron as Child", GC_ROLLING_GORON_AS_CHILD, PROGRESSIVE_BOMB_BAG, {}, SpoilerCollectionCheck::InfTable(0x11, 0x06), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_ROLLING_GORON_AS_ADULT] = ItemLocation::Base (RC_GC_ROLLING_GORON_AS_ADULT, 0x62, "GC Rolling Goron as Adult", GC_ROLLING_GORON_AS_ADULT, GORON_TUNIC, {}, SpoilerCollectionCheck::InfTable(0x10, 0x01), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_DARUNIAS_JOY] = ItemLocation::Base (RC_GC_DARUNIAS_JOY, 0x62, "GC Darunias Joy", GC_DARUNIAS_JOY, PROGRESSIVE_STRENGTH, {}, SpoilerCollectionCheck::Chest(0x62, 0x1E), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_POT_FREESTANDING_POH] = ItemLocation::Collectable(RC_GC_POT_FREESTANDING_POH, 0x62, 0x1F, "GC Pot Freestanding PoH", GC_POT_FREESTANDING_POH, PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_DEKU_SCRUB_GROTTO_LEFT] = ItemLocation::GrottoScrub(RC_GC_DEKU_SCRUB_GROTTO_LEFT, 0xFB, "GC Deku Scrub Grotto Left", GC_DEKU_SCRUB_GROTTO_LEFT, BUY_DEKU_NUT_5, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_DEKU_SCRUB_GROTTO_RIGHT] = ItemLocation::GrottoScrub(RC_GC_DEKU_SCRUB_GROTTO_RIGHT, 0xFB, "GC Deku Scrub Grotto Right", GC_DEKU_SCRUB_GROTTO_RIGHT, BUY_BOMBS_535, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_DEKU_SCRUB_GROTTO_CENTER] = ItemLocation::GrottoScrub(RC_GC_DEKU_SCRUB_GROTTO_CENTER, 0xFB, "GC Deku Scrub Grotto Center", GC_DEKU_SCRUB_GROTTO_CENTER, BUY_ARROWS_30, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_MEDIGORON] = ItemLocation::Base (RC_GC_MEDIGORON, 0x62, "GC Medigoron", GC_MEDIGORON, GIANTS_KNIFE, {Category::cMerchant}, SpoilerCollectionCheck::Merchant(), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - - //Death Mountain Crater - locationTable[DMC_UPPER_GROTTO_CHEST] = ItemLocation::Chest (RC_DMC_UPPER_GROTTO_CHEST, 0x3E, 0x1A, "DMC Upper Grotto Chest", DMC_UPPER_GROTTO_CHEST, BOMBS_20, {}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[DMC_WALL_FREESTANDING_POH] = ItemLocation::Collectable(RC_DMC_WALL_FREESTANDING_POH, 0x61, 0x02, "DMC Wall Freestanding PoH", DMC_WALL_FREESTANDING_POH, PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[DMC_VOLCANO_FREESTANDING_POH] = ItemLocation::Collectable(RC_DMC_VOLCANO_FREESTANDING_POH, 0x61, 0x08, "DMC Volcano Freestanding PoH", DMC_VOLCANO_FREESTANDING_POH, PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[DMC_DEKU_SCRUB] = ItemLocation::Base (RC_DMC_DEKU_SCRUB, 0x61, "DMC Deku Scrub", DMC_DEKU_SCRUB, BUY_BOMBS_535, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[DMC_DEKU_SCRUB_GROTTO_LEFT] = ItemLocation::GrottoScrub(RC_DMC_DEKU_SCRUB_GROTTO_LEFT, 0xF9, "DMC Deku Scrub Grotto Left", DMC_DEKU_SCRUB_GROTTO_LEFT, BUY_DEKU_NUT_5, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[DMC_DEKU_SCRUB_GROTTO_RIGHT] = ItemLocation::GrottoScrub(RC_DMC_DEKU_SCRUB_GROTTO_RIGHT, 0xF9, "DMC Deku Scrub Grotto Right", DMC_DEKU_SCRUB_GROTTO_RIGHT, BUY_BOMBS_535, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[DMC_DEKU_SCRUB_GROTTO_CENTER] = ItemLocation::GrottoScrub(RC_DMC_DEKU_SCRUB_GROTTO_CENTER, 0xF9, "DMC Deku Scrub Grotto Center", DMC_DEKU_SCRUB_GROTTO_CENTER, BUY_ARROWS_30, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - - //Zoras River - locationTable[ZR_OPEN_GROTTO_CHEST] = ItemLocation::Chest (RC_ZR_OPEN_GROTTO_CHEST, 0x3E, 0x09, "ZR Open Grotto Chest", ZR_OPEN_GROTTO_CHEST, RED_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); - locationTable[ZR_MAGIC_BEAN_SALESMAN] = ItemLocation::Base (RC_ZR_MAGIC_BEAN_SALESMAN, 0x54, "ZR Magic Bean Salesman", ZR_MAGIC_BEAN_SALESMAN, MAGIC_BEAN, {}, SpoilerCollectionCheck::MagicBeans(), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); - locationTable[ZR_FROGS_ZELDAS_LULLABY] = ItemLocation::Base (RC_ZR_FROGS_ZELDAS_LULLABY, 0x54, "ZR Frogs Zelda's Lullaby", ZR_FROGS_ZELDAS_LULLABY, PURPLE_RUPEE, {}, SpoilerCollectionCheck::EventChkInf(0xD1), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); - locationTable[ZR_FROGS_EPONAS_SONG] = ItemLocation::Base (RC_ZR_FROGS_EPONAS_SONG, 0x54, "ZR Frogs Epona's Song", ZR_FROGS_EPONAS_SONG, PURPLE_RUPEE, {}, SpoilerCollectionCheck::EventChkInf(0xD2), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); - locationTable[ZR_FROGS_SARIAS_SONG] = ItemLocation::Base (RC_ZR_FROGS_SARIAS_SONG, 0x54, "ZR Frogs Saria's Song", ZR_FROGS_SARIAS_SONG, PURPLE_RUPEE, {}, SpoilerCollectionCheck::EventChkInf(0xD4), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); - locationTable[ZR_FROGS_SUNS_SONG] = ItemLocation::Base (RC_ZR_FROGS_SUNS_SONG, 0x54, "ZR Frogs Sun's Song", ZR_FROGS_SUNS_SONG, PURPLE_RUPEE, {}, SpoilerCollectionCheck::EventChkInf(0xD3), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); - locationTable[ZR_FROGS_SONG_OF_TIME] = ItemLocation::Base (RC_ZR_FROGS_SONG_OF_TIME, 0x54, "ZR Frogs Song of Time", ZR_FROGS_SONG_OF_TIME, PURPLE_RUPEE, {}, SpoilerCollectionCheck::EventChkInf(0xD5), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); - locationTable[ZR_FROGS_IN_THE_RAIN] = ItemLocation::Base (RC_ZR_FROGS_IN_THE_RAIN, 0x54, "ZR Frogs in the Rain", ZR_FROGS_IN_THE_RAIN, PIECE_OF_HEART, {}, SpoilerCollectionCheck::EventChkInf(0xD6), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); - locationTable[ZR_FROGS_OCARINA_GAME] = ItemLocation::Base (RC_ZR_FROGS_OCARINA_GAME, 0x54, "ZR Frogs Ocarina Game", ZR_FROGS_OCARINA_GAME, PIECE_OF_HEART, {}, SpoilerCollectionCheck::EventChkInf(0xD0), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); - locationTable[ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH] = ItemLocation::Collectable(RC_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, 0x54, 0x04, "ZR Near Open Grotto Freestanding PoH", ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); - locationTable[ZR_NEAR_DOMAIN_FREESTANDING_POH] = ItemLocation::Collectable(RC_ZR_NEAR_DOMAIN_FREESTANDING_POH, 0x54, 0x0B, "ZR Near Domain Freestanding PoH", ZR_NEAR_DOMAIN_FREESTANDING_POH, PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); - locationTable[ZR_DEKU_SCRUB_GROTTO_REAR] = ItemLocation::GrottoScrub(RC_ZR_DEKU_SCRUB_GROTTO_REAR, 0xEB, "ZR Deku Scrub Grotto Rear", ZR_DEKU_SCRUB_GROTTO_REAR, BUY_RED_POTION_30, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); - locationTable[ZR_DEKU_SCRUB_GROTTO_FRONT] = ItemLocation::GrottoScrub(RC_ZR_DEKU_SCRUB_GROTTO_FRONT, 0xEB, "ZR Deku Scrub Grotto Front", ZR_DEKU_SCRUB_GROTTO_FRONT, BUY_GREEN_POTION, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); - - //Zoras Domain - locationTable[ZD_CHEST] = ItemLocation::Chest (RC_ZD_CHEST, 0x58, 0x00, "ZD Chest", ZD_CHEST, PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[ZD_DIVING_MINIGAME] = ItemLocation::Base (RC_ZD_DIVING_MINIGAME, 0x58, "ZD Diving Minigame", ZD_DIVING_MINIGAME, PROGRESSIVE_SCALE, {}, SpoilerCollectionCheck::EventChkInf(0x38), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[ZD_KING_ZORA_THAWED] = ItemLocation::Base (RC_ZD_KING_ZORA_THAWED, 0x58, "ZD King Zora Thawed", ZD_KING_ZORA_THAWED, ZORA_TUNIC, {}, SpoilerCollectionCheck::InfTable(0x13, 0x01), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[ZD_TRADE_PRESCRIPTION] = ItemLocation::Base (RC_ZD_TRADE_PRESCRIPTION, 0x58, "ZD Trade Prescription", ZD_TRADE_PRESCRIPTION, EYEBALL_FROG, {Category::cAdultTrade}, SpoilerCollectionCheck::Chest(0x58, 0x1F), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - - //Zoras Fountain - locationTable[ZF_ICEBERG_FREESTANDING_POH] = ItemLocation::Collectable(RC_ZF_ICEBERC_FREESTANDING_POH, 0x59, 0x01, "ZF Iceberg Freestanding PoH", ZF_ICEBERG_FREESTANDING_POH, PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[ZF_BOTTOM_FREESTANDING_POH] = ItemLocation::Collectable(RC_ZF_BOTTOM_FREESTANDING_POH, 0x59, 0x14, "ZF Bottom Freestanding PoH", ZF_BOTTOM_FREESTANDING_POH, PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - - //Lon Lon Ranch - locationTable[LLR_TALONS_CHICKENS] = ItemLocation::Base (RC_LLR_TALONS_CHICKENS, 0x4C, "LLR Talons Chickens", LLR_TALONS_CHICKENS, BOTTLE_WITH_MILK, {}, SpoilerCollectionCheck::ItemGetInf(10), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); - locationTable[LLR_FREESTANDING_POH] = ItemLocation::Collectable(RC_LLR_FREESTANDING_POH, 0x4C, 0x01, "LLR Freestanding PoH", LLR_FREESTANDING_POH, PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); - locationTable[LLR_DEKU_SCRUB_GROTTO_LEFT] = ItemLocation::GrottoScrub(RC_LLR_DEKU_SCRUB_GROTTO_LEFT, 0xFC, "LLR Deku Scrub Grotto Left", LLR_DEKU_SCRUB_GROTTO_LEFT, BUY_DEKU_NUT_5, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); - locationTable[LLR_DEKU_SCRUB_GROTTO_RIGHT] = ItemLocation::GrottoScrub(RC_LLR_DEKU_SCRUB_GROTTO_RIGHT, 0xFC, "LLR Deku Scrub Grotto Right", LLR_DEKU_SCRUB_GROTTO_RIGHT, BUY_BOMBS_535, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); - locationTable[LLR_DEKU_SCRUB_GROTTO_CENTER] = ItemLocation::GrottoScrub(RC_LLR_DEKU_SCRUB_GROTTO_CENTER, 0xFC, "LLR Deku Scrub Grotto Center", LLR_DEKU_SCRUB_GROTTO_CENTER, BUY_DEKU_SEEDS_30, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); - - /*------------------- - --- DUNGEONS --- - -------------------*/ - - //Deku Tree Vanilla - locationTable[DEKU_TREE_MAP_CHEST] = ItemLocation::Chest (RC_DEKU_TREE_MAP_CHEST, 0x00, 0x03, "Deku Tree Map Chest", DEKU_TREE_MAP_CHEST, DEKU_TREE_MAP, {Category::cVanillaMap}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_COMPASS_CHEST] = ItemLocation::Chest (RC_DEKU_TREE_COMPASS_CHEST, 0x00, 0x02, "Deku Tree Compass Chest", DEKU_TREE_COMPASS_CHEST, DEKU_TREE_COMPASS, {Category::cVanillaCompass}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_COMPASS_ROOM_SIDE_CHEST] = ItemLocation::Chest (RC_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, 0x00, 0x06, "Deku Tree Compass Room Side Chest", DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_BASEMENT_CHEST] = ItemLocation::Chest (RC_DEKU_TREE_BASEMENT_CHEST, 0x00, 0x04, "Deku Tree Basement Chest", DEKU_TREE_BASEMENT_CHEST, RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_SLINGSHOT_CHEST] = ItemLocation::Chest (RC_DEKU_TREE_SLINGSHOT_CHEST, 0x00, 0x01, "Deku Tree Slingshot Chest", DEKU_TREE_SLINGSHOT_CHEST, PROGRESSIVE_SLINGSHOT, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST] = ItemLocation::Chest (RC_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, 0x00, 0x05, "Deku Tree Slingshot Room Side Chest", DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - //Deku Tree MQ - locationTable[DEKU_TREE_MQ_MAP_CHEST] = ItemLocation::Chest (RC_DEKU_TREE_MQ_MAP_CHEST, 0x00, 0x03, "Deku Tree MQ Map Chest", DEKU_TREE_MQ_MAP_CHEST, DEKU_TREE_MAP, {Category::cVanillaMap}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_MQ_COMPASS_CHEST] = ItemLocation::Chest (RC_DEKU_TREE_MQ_COMPASS_CHEST, 0x00, 0x01, "Deku Tree MQ Compass Chest", DEKU_TREE_MQ_COMPASS_CHEST, DEKU_TREE_COMPASS, {Category::cVanillaCompass}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_MQ_SLINGSHOT_CHEST] = ItemLocation::Chest (RC_DEKU_TREE_MQ_SLINGSHOT_CHEST, 0x00, 0x06, "Deku Tree MQ Slingshot Chest", DEKU_TREE_MQ_SLINGSHOT_CHEST, PROGRESSIVE_SLINGSHOT, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST] = ItemLocation::Chest (RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, 0x00, 0x02, "Deku Tree MQ Slingshot Room Back Chest", DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, DEKU_SHIELD, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_MQ_BASEMENT_CHEST] = ItemLocation::Chest (RC_DEKU_TREE_MQ_BASEMENT_CHEST, 0x00, 0x04, "Deku Tree MQ Basement Chest", DEKU_TREE_MQ_BASEMENT_CHEST, DEKU_SHIELD, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST] = ItemLocation::Chest (RC_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, 0x00, 0x05, "Deku Tree MQ Before Spinning Log Chest", DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST] = ItemLocation::Chest (RC_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, 0x00, 0x00, "Deku Tree MQ After Spinning Log Chest", DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, PURPLE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_MQ_DEKU_SCRUB] = ItemLocation::Base (RC_DEKU_TREE_MQ_DEKU_SCRUB, 0x00, "Deku Tree MQ Deku Scrub", DEKU_TREE_MQ_DEKU_SCRUB, BUY_DEKU_SHIELD, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - - //Dodongos Cavern Shared - locationTable[DODONGOS_CAVERN_BOSS_ROOM_CHEST] = ItemLocation::Chest (RC_DODONGOS_CAVERN_BOSS_ROOM_CHEST, 0x12, 0x00, "Dodongos Cavern Boss Room Chest", DODONGOS_CAVERN_BOSS_ROOM_CHEST, BOMBS_5, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - //Dodongos Cavern Vanilla - locationTable[DODONGOS_CAVERN_MAP_CHEST] = ItemLocation::Chest (RC_DODONGOS_CAVERN_MAP_CHEST, 0x01, 0x08, "Dodongos Cavern Map Chest", DODONGOS_CAVERN_MAP_CHEST, DODONGOS_CAVERN_MAP, {Category::cVanillaMap}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_COMPASS_CHEST] = ItemLocation::Chest (RC_DODONGOS_CAVERN_COMPASS_CHEST, 0x01, 0x05, "Dodongos Cavern Compass Chest", DODONGOS_CAVERN_COMPASS_CHEST, DODONGOS_CAVERN_COMPASS, {Category::cVanillaCompass}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST] = ItemLocation::Chest (RC_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, 0x01, 0x06, "Dodongos Cavern Bomb Flower Platform Chest", DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, RED_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_BOMB_BAG_CHEST] = ItemLocation::Chest (RC_DODONGOS_CAVERN_BOMB_BAG_CHEST, 0x01, 0x04, "Dodongos Cavern Bomb Bag Chest", DODONGOS_CAVERN_BOMB_BAG_CHEST, PROGRESSIVE_BOMB_BAG, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_END_OF_BRIDGE_CHEST] = ItemLocation::Chest (RC_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, 0x01, 0x0A, "Dodongos Cavern End Of Bridge Chest", DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, DEKU_SHIELD, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT] = ItemLocation::Base (RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, 0x01, "Dodongos Cavern Deku Scrub Near Bomb Bag Left", DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, BUY_DEKU_NUT_5, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS] = ItemLocation::Base (RC_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, 0x01, "Dodongos Cavern Deku Scrub Side Room Near Dodongos", DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, BUY_DEKU_STICK_1, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT] = ItemLocation::Base (RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, 0x01, "Dodongos Cavern Deku Scrub Near Bomb Bag Right", DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, BUY_DEKU_SEEDS_30, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_DEKU_SCRUB_LOBBY] = ItemLocation::Base (RC_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, 0x01, "Dodongos Cavern Deku Scrub Lobby", DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, BUY_DEKU_SHIELD, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - //Dodongos Cavern MQ - locationTable[DODONGOS_CAVERN_MQ_MAP_CHEST] = ItemLocation::Chest (RC_DODONGOS_CAVERN_MQ_MAP_CHEST, 0x01, 0x00, "Dodongos Cavern MQ Map Chest", DODONGOS_CAVERN_MQ_MAP_CHEST, DODONGOS_CAVERN_MAP, {Category::cVanillaMap}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST] = ItemLocation::Chest (RC_DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST, 0x01, 0x04, "Dodongos Cavern MQ Bomb Bag Chest", DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST, PROGRESSIVE_BOMB_BAG, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_MQ_COMPASS_CHEST] = ItemLocation::Chest (RC_DODONGOS_CAVERN_MQ_COMPASS_CHEST, 0x01, 0x05, "Dodongos Cavern MQ Compass Chest", DODONGOS_CAVERN_MQ_COMPASS_CHEST, DODONGOS_CAVERN_COMPASS, {Category::cVanillaCompass}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST] = ItemLocation::Chest (RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, 0x01, 0x02, "Dodongos Cavern MQ Larvae Room Chest", DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, DEKU_SHIELD, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST] = ItemLocation::Chest (RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST, 0x01, 0x03, "Dodongos Cavern MQ Torch Puzzle Room Chest", DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST, BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST] = ItemLocation::Chest (RC_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, 0x01, 0x01, "Dodongos Cavern MQ Under Grave Chest", DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, HYLIAN_SHIELD, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR] = ItemLocation::Base (RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, 0x01, "Dodongos Cavern Deku Scrub Lobby Rear", DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, BUY_DEKU_STICK_1, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT] = ItemLocation::Base (RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, 0x01, "Dodongos Cavern Deku Scrub Lobby Front", DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, BUY_DEKU_SEEDS_30, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE] = ItemLocation::Base (RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, 0x01, "Dodongos Cavern Deku Scrub Staircase", DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, BUY_DEKU_SHIELD, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS] = ItemLocation::Base (RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, 0x01, "Dodongos Cavern Deku Scrub Side Room Near Lower Lizalfos",DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, BUY_RED_POTION_30, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - - //Jabu Jabus Belly Vanilla - locationTable[JABU_JABUS_BELLY_MAP_CHEST] = ItemLocation::Chest (RC_JABU_JABUS_BELLY_MAP_CHEST, 0x02, 0x02, "Jabu Jabus Belly Map Chest", JABU_JABUS_BELLY_MAP_CHEST, JABU_JABUS_BELLY_MAP, {Category::cVanillaMap}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_COMPASS_CHEST] = ItemLocation::Chest (RC_JABU_JABUS_BELLY_COMPASS_CHEST, 0x02, 0x04, "Jabu Jabus Belly Compass Chest", JABU_JABUS_BELLY_COMPASS_CHEST, JABU_JABUS_BELLY_COMPASS, {Category::cVanillaCompass}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_BOOMERANG_CHEST] = ItemLocation::Chest (RC_JABU_JABUS_BELLY_BOOMERANG_CHEST, 0x02, 0x01, "Jabu Jabus Belly Boomerang Chest", JABU_JABUS_BELLY_BOOMERANG_CHEST, BOOMERANG, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_DEKU_SCRUB] = ItemLocation::Base (RC_JABU_JABUS_BELLY_DEKU_SCRUB, 0x02, "Jabu Jabus Belly Deku Scrub", JABU_JABUS_BELLY_DEKU_SCRUB, BUY_DEKU_NUT_5, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - //Jabu Jabus Belly MQ - locationTable[JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST] = ItemLocation::Chest (RC_JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, 0x02, 0x05, "Jabu Jabus Belly MQ First Room Side Chest", JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, DEKU_NUTS_5, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_MQ_MAP_CHEST] = ItemLocation::Chest (RC_JABU_JABUS_BELLY_MQ_MAP_CHEST, 0x02, 0x03, "Jabu Jabus Belly MQ Map Chest", JABU_JABUS_BELLY_MQ_MAP_CHEST, JABU_JABUS_BELLY_MAP, {Category::cVanillaMap}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST] = ItemLocation::Chest (RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST, 0x02, 0x02, "Jabu Jabus Belly MQ Second Room Lower Chest", JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST, DEKU_NUTS_5, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_MQ_COMPASS_CHEST] = ItemLocation::Chest (RC_JABU_JABUS_BELLY_MQ_COMPASS_CHEST, 0x02, 0x00, "Jabu Jabus Belly MQ Compass Chest", JABU_JABUS_BELLY_MQ_COMPASS_CHEST, JABU_JABUS_BELLY_COMPASS, {Category::cVanillaCompass}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST] = ItemLocation::Chest (RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST, 0x02, 0x07, "Jabu Jabus Belly MQ Second Room Upper Chest", JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST, RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST] = ItemLocation::Chest (RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, 0x02, 0x08, "Jabu Jabus Belly MQ Basement Near Switches Chest", JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, DEKU_NUTS_5, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST] = ItemLocation::Chest (RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, 0x02, 0x04, "Jabu Jabus Belly MQ Basement Near Vines Chest", JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, BOMBCHU_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST] = ItemLocation::Chest (RC_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, 0x02, 0x0A, "Jabu Jabus Belly MQ Near Boss Chest", JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, DEKU_SHIELD, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST] = ItemLocation::Chest (RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, 0x02, 0x09, "Jabu Jabus Belly MQ Falling Like Like Room Chest", JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, DEKU_STICK_1, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST] = ItemLocation::Chest (RC_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, 0x02, 0x01, "Jabu Jabus Belly MQ Boomerang Room Small Chest", JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, DEKU_NUTS_5, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST] = ItemLocation::Chest (RC_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, 0x02, 0x06, "Jabu Jabus Belly MQ Boomerang Chest", JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, BOOMERANG, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - //COW - - //Forest Temple Vanilla - locationTable[FOREST_TEMPLE_FIRST_ROOM_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_FIRST_ROOM_CHEST, 0x03, 0x03, "Forest Temple First Room Chest", FOREST_TEMPLE_FIRST_ROOM_CHEST, FOREST_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_FIRST_STALFOS_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_FIRST_STALFOS_CHEST, 0x03, 0x00, "Forest Temple First Stalfos Chest", FOREST_TEMPLE_FIRST_STALFOS_CHEST, FOREST_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, 0x03, 0x05, "Forest Temple Raised Island Courtyard Chest", FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_MAP_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_MAP_CHEST, 0x03, 0x01, "Forest Temple Map Chest", FOREST_TEMPLE_MAP_CHEST, FOREST_TEMPLE_MAP, {Category::cVanillaMap}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_WELL_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_WELL_CHEST, 0x03, 0x09, "Forest Temple Well Chest", FOREST_TEMPLE_WELL_CHEST, FOREST_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST, 0x03, 0x07, "Forest Temple Falling Ceiling Room Chest", FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST, ARROWS_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_EYE_SWITCH_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_EYE_SWITCH_CHEST, 0x03, 0x04, "Forest Temple Eye Switch Chest", FOREST_TEMPLE_EYE_SWITCH_CHEST, ARROWS_30, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_BOSS_KEY_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_BOSS_KEY_CHEST, 0x03, 0x0E, "Forest Temple Boss Key Chest", FOREST_TEMPLE_BOSS_KEY_CHEST, FOREST_TEMPLE_BOSS_KEY, {Category::cVanillaBossKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_FLOORMASTER_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_FLOORMASTER_CHEST, 0x03, 0x02, "Forest Temple Floormaster Chest", FOREST_TEMPLE_FLOORMASTER_CHEST, FOREST_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_BOW_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_BOW_CHEST, 0x03, 0x0C, "Forest Temple Bow Chest", FOREST_TEMPLE_BOW_CHEST, PROGRESSIVE_BOW, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_RED_POE_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_RED_POE_CHEST, 0x03, 0x0D, "Forest Temple Red Poe Chest", FOREST_TEMPLE_RED_POE_CHEST, FOREST_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_BLUE_POE_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_BLUE_POE_CHEST, 0x03, 0x0F, "Forest Temple Blue Poe Chest", FOREST_TEMPLE_BLUE_POE_CHEST, FOREST_TEMPLE_COMPASS, {Category::cVanillaCompass}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_BASEMENT_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_BASEMENT_CHEST, 0x03, 0x0B, "Forest Temple Basement Chest", FOREST_TEMPLE_BASEMENT_CHEST, ARROWS_5, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - //Forest Temple MQ - locationTable[FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST, 0x03, 0x03, "Forest Temple MQ First Room Chest", FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST, FOREST_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_MQ_WOLFOS_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_MQ_WOLFOS_CHEST, 0x03, 0x00, "Forest Temple MQ Wolfos Chest", FOREST_TEMPLE_MQ_WOLFOS_CHEST, FOREST_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_MQ_BOW_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_MQ_BOW_CHEST, 0x03, 0x0C, "Forest Temple MQ Bow Chest", FOREST_TEMPLE_MQ_BOW_CHEST, PROGRESSIVE_BOW, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST, 0x03, 0x01, "Forest Temple MQ Raised Island Courtyard Lower Chest", FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST, FOREST_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST, 0x03, 0x05, "Forest Temple MQ Raised Island Courtyard Upper Chest", FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST, FOREST_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_MQ_WELL_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_MQ_WELL_CHEST, 0x03, 0x09, "Forest Temple MQ Well Chest", FOREST_TEMPLE_MQ_WELL_CHEST, FOREST_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_MQ_MAP_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_MQ_MAP_CHEST, 0x03, 0x0D, "Forest Temple MQ Map Chest", FOREST_TEMPLE_MQ_MAP_CHEST, FOREST_TEMPLE_MAP, {Category::cVanillaMap}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_MQ_COMPASS_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_MQ_COMPASS_CHEST, 0x03, 0x0F, "Forest Temple MQ Compass Chest", FOREST_TEMPLE_MQ_COMPASS_CHEST, FOREST_TEMPLE_COMPASS, {Category::cVanillaCompass}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST, 0x03, 0x06, "Forest Temple MQ Falling Ceiling Room Chest", FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST, ARROWS_5, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_MQ_BASEMENT_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_MQ_BASEMENT_CHEST, 0x03, 0x0B, "Forest Temple MQ Basement Chest", FOREST_TEMPLE_MQ_BASEMENT_CHEST, ARROWS_5, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_MQ_REDEAD_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_MQ_REDEAD_CHEST, 0x03, 0x02, "Forest Temple MQ Redead Chest", FOREST_TEMPLE_MQ_REDEAD_CHEST, FOREST_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_MQ_BOSS_KEY_CHEST] = ItemLocation::Chest (RC_FOREST_TEMPLE_MQ_BOSS_KEY_CHEST, 0x03, 0x0E, "Forest Temple MQ Boss Key Chest", FOREST_TEMPLE_MQ_BOSS_KEY_CHEST, FOREST_TEMPLE_BOSS_KEY, {Category::cVanillaBossKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - - //Fire Temple Vanilla - locationTable[FIRE_TEMPLE_NEAR_BOSS_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_NEAR_BOSS_CHEST, 0x04, 0x01, "Fire Temple Near Boss Chest", FIRE_TEMPLE_NEAR_BOSS_CHEST, FIRE_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_FLARE_DANCER_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_FLARE_DANCER_CHEST, 0x04, 0x00, "Fire Temple Flare Dancer Chest", FIRE_TEMPLE_FLARE_DANCER_CHEST, BOMBS_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_BOSS_KEY_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_BOSS_KEY_CHEST, 0x04, 0x0C, "Fire Temple Boss Key Chest", FIRE_TEMPLE_BOSS_KEY_CHEST, FIRE_TEMPLE_BOSS_KEY, {Category::cVanillaBossKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, 0x04, 0x02, "Fire Temple Big Lava Room Blocked Door Chest", FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, FIRE_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST, 0x04, 0x04, "Fire Temple Big Lava Room Lower Open Door Chest", FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST, FIRE_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST, 0x04, 0x03, "Fire Temple Boulder Maze Lower Chest", FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST, FIRE_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST, 0x04, 0x06, "Fire Temple Boulder Maze Upper Chest", FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST, FIRE_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST, 0x04, 0x08, "Fire Temple Boulder Maze Side Room Chest", FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST, FIRE_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST, 0x04, 0x0B, "Fire Temple Boulder Maze Shortcut Chest", FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST, FIRE_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_SCARECROW_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_SCARECROW_CHEST, 0x04, 0x0D, "Fire Temple Scarecrow Chest", FIRE_TEMPLE_SCARECROW_CHEST, HUGE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_MAP_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_MAP_CHEST, 0x04, 0x0A, "Fire Temple Map Chest", FIRE_TEMPLE_MAP_CHEST, FIRE_TEMPLE_MAP, {Category::cVanillaMap}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_COMPASS_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_COMPASS_CHEST, 0x04, 0x07, "Fire Temple Compass Chest", FIRE_TEMPLE_COMPASS_CHEST, FIRE_TEMPLE_COMPASS, {Category::cVanillaCompass}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_HIGHEST_GORON_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_HIGHEST_GORON_CHEST, 0x04, 0x09, "Fire Temple Highest Goron Chest", FIRE_TEMPLE_HIGHEST_GORON_CHEST, FIRE_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_MEGATON_HAMMER_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_MEGATON_HAMMER_CHEST, 0x04, 0x05, "Fire Temple Megaton Hammer Chest", FIRE_TEMPLE_MEGATON_HAMMER_CHEST, MEGATON_HAMMER, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - //Fire Temple MQ - locationTable[FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, 0x04, 0x07, "Fire Temple MQ Near Boss Chest", FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, FIRE_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, 0x04, 0x00, "Fire Temple MQ Megaton Hammer Chest", FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, MEGATON_HAMMER, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_MQ_COMPASS_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_MQ_COMPASS_CHEST, 0x04, 0x0B, "Fire Temple MQ Compass Chest", FIRE_TEMPLE_MQ_COMPASS_CHEST, FIRE_TEMPLE_COMPASS, {Category::cVanillaCompass}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, 0x04, 0x03, "Fire Temple MQ Lizalfos Maze Lower Chest", FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, BOMBS_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, 0x04, 0x06, "Fire Temple MQ Lizalfos Maze Upper Chest", FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, BOMBS_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_MQ_CHEST_ON_FIRE] = ItemLocation::Chest (RC_FIRE_TEMPLE_MQ_CHEST_ON_FIRE, 0x04, 0x05, "Fire Temple MQ Chest on Fire", FIRE_TEMPLE_MQ_CHEST_ON_FIRE, FIRE_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, 0x04, 0x02, "Fire Temple MQ Map Room Side Chest", FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, HYLIAN_SHIELD, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_MQ_MAP_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_MQ_MAP_CHEST, 0x04, 0x0C, "Fire Temple MQ Map Chest", FIRE_TEMPLE_MQ_MAP_CHEST, FIRE_TEMPLE_MAP, {Category::cVanillaMap}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_MQ_BOSS_KEY_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_MQ_BOSS_KEY_CHEST, 0x04, 0x04, "Fire Temple MQ Boss Key Chest", FIRE_TEMPLE_MQ_BOSS_KEY_CHEST, FIRE_TEMPLE_BOSS_KEY, {Category::cVanillaBossKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, 0x04, 0x01, "Fire Temple MQ Big Lava Room Blocked Door Chest", FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, FIRE_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST] = ItemLocation::Chest (RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, 0x04, 0x08, "Fire Temple MQ Lizalfos Maze Side Room Chest", FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, FIRE_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_MQ_FREESTANDING_KEY] = ItemLocation::Collectable(RC_FIRE_TEMPLE_MQ_FREESTANDING_KEY, 0x04, 0x1C, "Fire Temple MQ Freestanding Key", FIRE_TEMPLE_MQ_FREESTANDING_KEY, FIRE_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - - //Water Temple Vanilla - locationTable[WATER_TEMPLE_MAP_CHEST] = ItemLocation::Chest (RC_WATER_TEMPLE_MAP_CHEST, 0x05, 0x02, "Water Temple Map Chest", WATER_TEMPLE_MAP_CHEST, WATER_TEMPLE_MAP, {Category::cVanillaMap}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_COMPASS_CHEST] = ItemLocation::Chest (RC_WATER_TEMPLE_COMPASS_CHEST, 0x05, 0x09, "Water Temple Compass Chest", WATER_TEMPLE_COMPASS_CHEST, WATER_TEMPLE_COMPASS, {Category::cVanillaCompass}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_TORCHES_CHEST] = ItemLocation::Chest (RC_WATER_TEMPLE_TORCHES_CHEST, 0x05, 0x01, "Water Temple Torches Chest", WATER_TEMPLE_TORCHES_CHEST, WATER_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_DRAGON_CHEST] = ItemLocation::Chest (RC_WATER_TEMPLE_DRAGON_CHEST, 0x05, 0x0A, "Water Temple Dragon Chest", WATER_TEMPLE_DRAGON_CHEST, WATER_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST] = ItemLocation::Chest (RC_WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST, 0x05, 0x08, "Water Temple Central Bow Target Chest", WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST, WATER_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_CENTRAL_PILLAR_CHEST] = ItemLocation::Chest (RC_WATER_TEMPLE_CENTRAL_PILLAR_CHEST, 0x05, 0x06, "Water Temple Central Pillar Chest", WATER_TEMPLE_CENTRAL_PILLAR_CHEST, WATER_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_CRACKED_WALL_CHEST] = ItemLocation::Chest (RC_WATER_TEMPLE_CRACKED_WALL_CHEST, 0x05, 0x00, "Water Temple Cracked Wall Chest", WATER_TEMPLE_CRACKED_WALL_CHEST, WATER_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_BOSS_KEY_CHEST] = ItemLocation::Chest (RC_WATER_TEMPLE_BOSS_KEY_CHEST, 0x05, 0x05, "Water Temple Boss Key Chest", WATER_TEMPLE_BOSS_KEY_CHEST, WATER_TEMPLE_BOSS_KEY, {Category::cVanillaBossKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_LONGSHOT_CHEST] = ItemLocation::Chest (RC_WATER_TEMPLE_LONGSHOT_CHEST, 0x05, 0x07, "Water Temple Longshot Chest", WATER_TEMPLE_LONGSHOT_CHEST, PROGRESSIVE_HOOKSHOT, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_RIVER_CHEST] = ItemLocation::Chest (RC_WATER_TEMPLE_RIVER_CHEST, 0x05, 0x03, "Water Temple River Chest", WATER_TEMPLE_RIVER_CHEST, WATER_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - //Water Temple MQ - locationTable[WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST] = ItemLocation::Chest (RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, 0x05, 0x06, "Water Temple MQ Central Pillar Chest", WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, WATER_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_MQ_BOSS_KEY_CHEST] = ItemLocation::Chest (RC_WATER_TEMPLE_MQ_BOSS_KEY_CHEST, 0x05, 0x05, "Water Temple MQ Boss Key Chest", WATER_TEMPLE_MQ_BOSS_KEY_CHEST, WATER_TEMPLE_BOSS_KEY, {Category::cVanillaBossKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_MQ_LONGSHOT_CHEST] = ItemLocation::Chest (RC_WATER_TEMPLE_MQ_LONGSHOT_CHEST, 0x05, 0x00, "Water Temple MQ Longshot Chest", WATER_TEMPLE_MQ_LONGSHOT_CHEST, PROGRESSIVE_HOOKSHOT, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_MQ_COMPASS_CHEST] = ItemLocation::Chest (RC_WATER_TEMPLE_MQ_COMPASS_CHEST, 0x05, 0x01, "Water Temple MQ Compass Chest", WATER_TEMPLE_MQ_COMPASS_CHEST, WATER_TEMPLE_COMPASS, {Category::cVanillaCompass}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_MQ_MAP_CHEST] = ItemLocation::Chest (RC_WATER_TEMPLE_MQ_MAP_CHEST, 0x05, 0x02, "Water Temple MQ Map Chest", WATER_TEMPLE_MQ_MAP_CHEST, WATER_TEMPLE_MAP, {Category::cVanillaMap}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_MQ_FREESTANDING_KEY] = ItemLocation::Collectable(RC_WATER_TEMPLE_MQ_FREESTANDING_KEY, 0x05, 0x01, "Water Temple MQ Freestanding Key", WATER_TEMPLE_MQ_FREESTANDING_KEY, WATER_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - - //Spirit Temple Shared - locationTable[SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, 0x5C, 0x0B, "Spirit Temple Silver Gauntlets Chest", SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, PROGRESSIVE_STRENGTH, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, 0x5C, 0x09, "Spirit Temple Mirror Shield Chest", SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, MIRROR_SHIELD, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - //Spirit Temple Vanilla - locationTable[SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, 0x06, 0x08, "Spirit Temple Child Bridge Chest", SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, DEKU_SHIELD, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, 0x06, 0x00, "Spirit Temple Child Early Torches Chest", SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, SPIRIT_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_COMPASS_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_COMPASS_CHEST, 0x06, 0x04, "Spirit Temple Compass Chest", SPIRIT_TEMPLE_COMPASS_CHEST, SPIRIT_TEMPLE_COMPASS, {Category::cVanillaCompass}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, 0x06, 0x07, "Spirit Temple Early Adult Right Chest", SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, SPIRIT_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, 0x06, 0x0D, "Spirit Temple First Mirror Left Chest", SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, ICE_TRAP, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, 0x06, 0x0E, "Spirit Temple First Mirror Right Chest", SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MAP_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MAP_CHEST, 0x06, 0x03, "Spirit Temple Map Chest", SPIRIT_TEMPLE_MAP_CHEST, SPIRIT_TEMPLE_MAP, {Category::cVanillaMap}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, 0x06, 0x06, "Spirit Temple Child Climb North Chest", SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, BOMBCHU_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, 0x06, 0x0C, "Spirit Temple Child Climb East Chest", SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, DEKU_SHIELD, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST, 0x06, 0x01, "Spirit Temple Sun Block Room Chest", SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST, SPIRIT_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST, 0x06, 0x02, "Spirit Temple Statue Room Hand Chest", SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST, SPIRIT_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST, 0x06, 0x0F, "Spirit Temple Statue Room Northeast Chest", SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST, BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, 0x06, 0x05, "Spirit Temple Near Four Armos Chest", SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, SPIRIT_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, 0x06, 0x14, "Spirit Temple Hallway Right Invisible Chest", SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, 0x06, 0x15, "Spirit Temple Hallway Left Invisible Chest", SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_BOSS_KEY_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_BOSS_KEY_CHEST, 0x06, 0x0A, "Spirit Temple Boss Key Chest", SPIRIT_TEMPLE_BOSS_KEY_CHEST, SPIRIT_TEMPLE_BOSS_KEY, {Category::cVanillaBossKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_TOPMOST_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_TOPMOST_CHEST, 0x06, 0x12, "Spirit Temple Topmost Chest", SPIRIT_TEMPLE_TOPMOST_CHEST, BOMBS_20, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - //Spirit Temple MQ - locationTable[SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST, 0x06, 0x1A, "Spirit Temple MQ Entrance Front Left Chest", SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST, BOMBCHU_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST, 0x06, 0x1F, "Spirit Temple MQ Entrance Back Right Chest", SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST, BOMBCHU_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST, 0x06, 0x1B, "Spirit Temple MQ Entrance Front Right Chest", SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST, SPIRIT_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST, 0x06, 0x1E, "Spirit Temple MQ Entrance Back Left Chest", SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST, SPIRIT_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST, 0x06, 0x1D, "Spirit Temple MQ Child Hammer Switch Chest", SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST, SPIRIT_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_MAP_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_MAP_CHEST, 0x06, 0x00, "Spirit Temple MQ Map Chest", SPIRIT_TEMPLE_MQ_MAP_CHEST, SPIRIT_TEMPLE_MAP, {Category::cVanillaMap}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST, 0x06, 0x08, "Spirit Temple MQ Map Room Enemy Chest", SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST, SPIRIT_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST, 0x06, 0x06, "Spirit Temple MQ Child Climb North Chest", SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST, BOMBCHU_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST, 0x06, 0x0C, "Spirit Temple MQ Child Climb South Chest", SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST, SPIRIT_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_COMPASS_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_COMPASS_CHEST, 0x06, 0x03, "Spirit Temple MQ Compass Chest", SPIRIT_TEMPLE_MQ_COMPASS_CHEST, SPIRIT_TEMPLE_COMPASS, {Category::cVanillaCompass}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, 0x06, 0x0F, "Spirit Temple MQ Statue Room Lullaby Chest", SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST, 0x06, 0x02, "Spirit Temple MQ Statue Room Invisible Chest", SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST, RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, 0x06, 0x1C, "Spirit Temple MQ Silver Block Hallway Chest", SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, SPIRIT_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST, 0x06, 0x01, "Spirit Temple MQ Sun Block Room Chest", SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST, RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST, 0x06, 0x07, "Spirit Temple MQ Symphony Room Chest", SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST, PURPLE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST, 0x06, 0x04, "Spirit Temple MQ Leever Room Chest", SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST, PURPLE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, 0x06, 0x19, "Spirit Temple MQ Beamos Room Chest", SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST, 0x06, 0x18, "Spirit Temple MQ Chest Switch Chest", SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST, ICE_TRAP, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST, 0x06, 0x05, "Spirit Temple MQ Boss Key Chest", SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST, SPIRIT_TEMPLE_BOSS_KEY, {Category::cVanillaBossKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST] = ItemLocation::Chest (RC_SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST, 0x06, 0x12, "Spirit Temple MQ Mirror Puzzle Invisible Chest", SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST, SPIRIT_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - - //Shadow Temple Vanilla - locationTable[SHADOW_TEMPLE_MAP_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MAP_CHEST, 0x07, 0x01, "Shadow Temple Map Chest", SHADOW_TEMPLE_MAP_CHEST, SHADOW_TEMPLE_MAP, {Category::cVanillaMap}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_HOVER_BOOTS_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_HOVER_BOOTS_CHEST, 0x07, 0x07, "Shadow Temple Hover Boots Chest", SHADOW_TEMPLE_HOVER_BOOTS_CHEST, HOVER_BOOTS, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_COMPASS_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_COMPASS_CHEST, 0x07, 0x03, "Shadow Temple Compass Chest", SHADOW_TEMPLE_COMPASS_CHEST, SHADOW_TEMPLE_COMPASS, {Category::cVanillaCompass}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, 0x07, 0x02, "Shadow Temple Early Silver Rupee Chest", SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, SHADOW_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, 0x07, 0x0C, "Shadow Temple Invisible Blades Visible Chest", SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, 0x07, 0x16, "Shadow Temple Invisible Blades Invisible Chest", SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, ARROWS_30, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST, 0x07, 0x05, "Shadow Temple Falling Spikes Lower Chest", SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST, ARROWS_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST, 0x07, 0x06, "Shadow Temple Falling Spikes Upper Chest", SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST, BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST, 0x07, 0x04, "Shadow Temple Falling Spikes Switch Chest", SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST, SHADOW_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST, 0x07, 0x09, "Shadow Temple Invisible Spikes Chest", SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST, BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_WIND_HINT_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_WIND_HINT_CHEST, 0x07, 0x15, "Shadow Temple Wind Hint Chest", SHADOW_TEMPLE_WIND_HINT_CHEST, ARROWS_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, 0x07, 0x08, "Shadow Temple After Wind Enemy Chest", SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, 0x07, 0x14, "Shadow Temple After Wind Hidden Chest", SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, SHADOW_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, 0x07, 0x0A, "Shadow Temple Spike Walls Left Chest", SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_BOSS_KEY_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_BOSS_KEY_CHEST, 0x07, 0x0B, "Shadow Temple Boss Key Chest", SHADOW_TEMPLE_BOSS_KEY_CHEST, SHADOW_TEMPLE_BOSS_KEY, {Category::cVanillaBossKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, 0x07, 0x0D, "Shadow Temple Invisible Floormaster Chest", SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, SHADOW_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_FREESTANDING_KEY] = ItemLocation::Collectable(RC_SHADOW_TEMPLE_FREESTANDING_KEY, 0x07, 0x01, "Shadow Temple Freestanding Key", SHADOW_TEMPLE_FREESTANDING_KEY, SHADOW_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - //Shadow Temple MQ - locationTable[SHADOW_TEMPLE_MQ_COMPASS_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_COMPASS_CHEST, 0x07, 0x01, "Shadow Temple MQ Compass Chest", SHADOW_TEMPLE_MQ_COMPASS_CHEST, SHADOW_TEMPLE_COMPASS, {Category::cVanillaCompass}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST, 0x07, 0x07, "Shadow Temple MQ Hover Boots Chest", SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST, HOVER_BOOTS, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, 0x07, 0x03, "Shadow Temple MQ Early Gibdos Chest", SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, SHADOW_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_MAP_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_MAP_CHEST, 0x07, 0x02, "Shadow Temple MQ Map Chest", SHADOW_TEMPLE_MQ_MAP_CHEST, SHADOW_TEMPLE_MAP, {Category::cVanillaMap}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, 0x07, 0x0F, "Shadow Temple MQ Beamos Silver Rupees Chest", SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, ARROWS_5, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST, 0x07, 0x04, "Shadow Temple MQ Falling Spikes Switch Chest", SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST, SHADOW_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST, 0x07, 0x05, "Shadow Temple MQ Falling Spikes Lower Chest", SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST, ARROWS_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST, 0x07, 0x06, "Shadow Temple MQ Falling Spikes Upper Chest", SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST, ARROWS_5, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST, 0x07, 0x09, "Shadow Temple MQ Invisible Spikes Chest", SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST, BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST, 0x07, 0x0B, "Shadow Temple MQ Boss Key Chest", SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST, SHADOW_TEMPLE_BOSS_KEY, {Category::cVanillaBossKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST, 0x07, 0x0A, "Shadow Temple MQ Spike Walls Left Chest", SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST, BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST, 0x07, 0x10, "Shadow Temple MQ Stalfos Room Chest", SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST, RED_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST, 0x07, 0x16, "Shadow Temple MQ Invisible Blades Invisible Chest", SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST, SHADOW_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST, 0x07, 0x0C, "Shadow Temple MQ Invisible Blades Visible Chest", SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST, BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST, 0x07, 0x0D, "Shadow Temple MQ Bomb Flower Chest", SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST, ARROWS_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_WIND_HINT_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_WIND_HINT_CHEST, 0x07, 0x15, "Shadow Temple MQ Wind Hint Chest", SHADOW_TEMPLE_MQ_WIND_HINT_CHEST, SHADOW_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST, 0x07, 0x14, "Shadow Temple MQ After Wind Hidden Chest", SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST, ARROWS_5, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST, 0x07, 0x08, "Shadow Temple MQ After Wind Enemy Chest", SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST, BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST] = ItemLocation::Chest (RC_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, 0x07, 0x0E, "Shadow Temple MQ Near Ship Invisible Chest", SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, SHADOW_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_FREESTANDING_KEY] = ItemLocation::Collectable(RC_SHADOW_TEMPLE_MQ_FREESTANDING_KEY, 0x07, 0x06, "Shadow Temple MQ Freestanding Key", SHADOW_TEMPLE_MQ_FREESTANDING_KEY, SHADOW_TEMPLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - - //Bottom of the Well Vanilla - locationTable[BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST] = ItemLocation::Chest (RC_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, 0x08, 0x08, "Bottom of the Well Front Left Fake Wall Chest", BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, BOTTOM_OF_THE_WELL_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST] = ItemLocation::Chest (RC_BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST, 0x08, 0x02, "Bottom of the Well Front Center Bombable Chest", BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST, BOMBCHU_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST] = ItemLocation::Chest (RC_BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST, 0x08, 0x05, "Bottom of the Well Right Bottom Fake Wall Chest", BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST, BOTTOM_OF_THE_WELL_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_COMPASS_CHEST] = ItemLocation::Chest (RC_BOTTOM_OF_THE_WELL_COMPASS_CHEST, 0x08, 0x01, "Bottom of the Well Compass Chest", BOTTOM_OF_THE_WELL_COMPASS_CHEST, BOTTOM_OF_THE_WELL_COMPASS, {Category::cVanillaCompass}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST] = ItemLocation::Chest (RC_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST, 0x08, 0x0E, "Bottom of the Well Center Skulltula Chest", BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST, DEKU_NUTS_5, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST] = ItemLocation::Chest (RC_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST, 0x08, 0x04, "Bottom of the Well Back Left Bombable Chest", BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST, DEKU_NUTS_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST] = ItemLocation::Chest (RC_BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST, 0x08, 0x03, "Bottom of the Well Lens of Truth Chest", BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST, LENS_OF_TRUTH, {Category::cSongDungeonReward}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_INVISIBLE_CHEST] = ItemLocation::Chest (RC_BOTTOM_OF_THE_WELL_INVISIBLE_CHEST, 0x08, 0x14, "Bottom of the Well Invisible Chest", BOTTOM_OF_THE_WELL_INVISIBLE_CHEST, HUGE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST] = ItemLocation::Chest (RC_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST, 0x08, 0x10, "Bottom of the Well Underwater Front Chest", BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST, BOMBS_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST] = ItemLocation::Chest (RC_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST, 0x08, 0x09, "Bottom of the Well Underwater Left Chest", BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST, RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_MAP_CHEST] = ItemLocation::Chest (RC_BOTTOM_OF_THE_WELL_MAP_CHEST, 0x08, 0x07, "Bottom of the Well Map Chest", BOTTOM_OF_THE_WELL_MAP_CHEST, BOTTOM_OF_THE_WELL_MAP, {Category::cVanillaMap}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST] = ItemLocation::Chest (RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST, 0x08, 0x0A, "Bottom of the Well Fire Keese Chest", BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST, DEKU_SHIELD, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST] = ItemLocation::Chest (RC_BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST, 0x08, 0x0C, "Bottom of the Well Like Like Chest", BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST, HYLIAN_SHIELD, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_FREESTANDING_KEY] = ItemLocation::Collectable(RC_BOTTOM_OF_THE_WELL_FREESTANDING_KEY, 0x08, 0x01, "Bottom of the Well Freestanding Key", BOTTOM_OF_THE_WELL_FREESTANDING_KEY, BOTTOM_OF_THE_WELL_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - //Bottom of the Well MQBottomOfTheWell] - locationTable[BOTTOM_OF_THE_WELL_MQ_MAP_CHEST] = ItemLocation::Chest (RC_BOTTOM_OF_THE_WELL_MQ_MAP_CHEST, 0x08, 0x03, "Bottom of the Well MQ Map Chest", BOTTOM_OF_THE_WELL_MQ_MAP_CHEST, BOTTOM_OF_THE_WELL_MAP, {Category::cVanillaMap}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST] = ItemLocation::Chest (RC_BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST, 0x08, 0x01, "Bottom of the Well MQ Lens of Truth Chest", BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST, LENS_OF_TRUTH, {Category::cSongDungeonReward}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST] = ItemLocation::Chest (RC_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, 0x08, 0x02, "Bottom of the Well MQ Compass Chest", BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, BOTTOM_OF_THE_WELL_COMPASS, {Category::cVanillaCompass}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY] = ItemLocation::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY, 0x08, 0x02, "Bottom of the Well MQ Dead Hand Freestanding Key", BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY, BOTTOM_OF_THE_WELL_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY] = ItemLocation::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY, 0x08, 0x01, "Bottom of the Well MQ East Inner Room Freestanding Key",BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY, BOTTOM_OF_THE_WELL_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - - //Ice Cavern Vanilla - locationTable[ICE_CAVERN_MAP_CHEST] = ItemLocation::Chest (RC_ICE_CAVERN_MAP_CHEST, 0x09, 0x00, "Ice Cavern Map Chest", ICE_CAVERN_MAP_CHEST, ICE_CAVERN_MAP, {Category::cVanillaMap}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - locationTable[ICE_CAVERN_COMPASS_CHEST] = ItemLocation::Chest (RC_ICE_CAVERN_COMPASS_CHEST, 0x09, 0x01, "Ice Cavern Compass Chest", ICE_CAVERN_COMPASS_CHEST, ICE_CAVERN_COMPASS, {Category::cVanillaCompass}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - locationTable[ICE_CAVERN_IRON_BOOTS_CHEST] = ItemLocation::Chest (RC_ICE_CAVERN_IRON_BOOTS_CHEST, 0x09, 0x02, "Ice Cavern Iron Boots Chest", ICE_CAVERN_IRON_BOOTS_CHEST, IRON_BOOTS, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - locationTable[ICE_CAVERN_FREESTANDING_POH] = ItemLocation::Collectable(RC_ICE_CAVERN_FREESTANDING_POH, 0x09, 0x01, "Ice Cavern Freestanding PoH", ICE_CAVERN_FREESTANDING_POH, PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - //Ice Cavern MQIceCavern] - locationTable[ICE_CAVERN_MQ_IRON_BOOTS_CHEST] = ItemLocation::Chest (RC_ICE_CAVERN_MQ_IRON_BOOTS_CHEST, 0x09, 0x02, "Ice Cavern MQ Iron Boots Chest", ICE_CAVERN_MQ_IRON_BOOTS_CHEST, IRON_BOOTS, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - locationTable[ICE_CAVERN_MQ_COMPASS_CHEST] = ItemLocation::Chest (RC_ICE_CAVERN_MQ_COMPASS_CHEST, 0x09, 0x00, "Ice Cavern MQ Compass Chest", ICE_CAVERN_MQ_COMPASS_CHEST, ICE_CAVERN_COMPASS, {Category::cVanillaCompass}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - locationTable[ICE_CAVERN_MQ_MAP_CHEST] = ItemLocation::Chest (RC_ICE_CAVERN_MQ_MAP_CHEST, 0x09, 0x01, "Ice Cavern MQ Map Chest", ICE_CAVERN_MQ_MAP_CHEST, ICE_CAVERN_MAP, {Category::cVanillaMap}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - locationTable[ICE_CAVERN_MQ_FREESTANDING_POH] = ItemLocation::Collectable(RC_ICE_CAVERN_MQ_FREESTANDING_POH, 0x09, 0x01, "Ice Cavern MQ Freestanding PoH", ICE_CAVERN_MQ_FREESTANDING_POH, PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - - //Gerudo Training Ground Vanilla - locationTable[GERUDO_TRAINING_GROUNDS_LOBBY_LEFT_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST, 0x0B, 0x13, "Gerudo Training Grounds Lobby Left Chest", GERUDO_TRAINING_GROUNDS_LOBBY_LEFT_CHEST, BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_LOBBY_RIGHT_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST, 0x0B, 0x07, "Gerudo Training Grounds Lobby Right Chest", GERUDO_TRAINING_GROUNDS_LOBBY_RIGHT_CHEST, ARROWS_10, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_STALFOS_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_STALFOS_CHEST, 0x0B, 0x00, "Gerudo Training Grounds Stalfos Chest", GERUDO_TRAINING_GROUNDS_STALFOS_CHEST, GERUDO_TRAINING_GROUNDS_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_BEAMOS_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_BEAMOS_CHEST, 0x0B, 0x01, "Gerudo Training Grounds Beamos Chest", GERUDO_TRAINING_GROUNDS_BEAMOS_CHEST, GERUDO_TRAINING_GROUNDS_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_HIDDEN_CEILING_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_HIDDEN_CEILING_CHEST, 0x0B, 0x0B, "Gerudo Training Grounds Hidden Ceiling Chest", GERUDO_TRAINING_GROUNDS_HIDDEN_CEILING_CHEST, GERUDO_TRAINING_GROUNDS_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MAZE_PATH_FIRST_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FIRST_CHEST, 0x0B, 0x06, "Gerudo Training Grounds Maze Path First Chest", GERUDO_TRAINING_GROUNDS_MAZE_PATH_FIRST_CHEST, PURPLE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MAZE_PATH_SECOND_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MAZE_PATH_SECOND_CHEST, 0x0B, 0x0A, "Gerudo Training Grounds Maze Path Second Chest", GERUDO_TRAINING_GROUNDS_MAZE_PATH_SECOND_CHEST, RED_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MAZE_PATH_THIRD_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MAZE_PATH_THIRD_CHEST, 0x0B, 0x09, "Gerudo Training Grounds Maze Path Third Chest", GERUDO_TRAINING_GROUNDS_MAZE_PATH_THIRD_CHEST, ARROWS_30, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MAZE_PATH_FINAL_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FINAL_CHEST, 0x0B, 0x0C, "Gerudo Training Grounds Maze Path Final Chest", GERUDO_TRAINING_GROUNDS_MAZE_PATH_FINAL_CHEST, ICE_ARROWS, {Category::cSongDungeonReward}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MAZE_RIGHT_CENTRAL_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_CENTRAL_CHEST, 0x0B, 0x05, "Gerudo Training Grounds Maze Right Central Chest", GERUDO_TRAINING_GROUNDS_MAZE_RIGHT_CENTRAL_CHEST, BOMBCHU_5, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MAZE_RIGHT_SIDE_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST, 0x0B, 0x08, "Gerudo Training Grounds Maze Right Side Chest", GERUDO_TRAINING_GROUNDS_MAZE_RIGHT_SIDE_CHEST, ARROWS_30, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_UNDERWATER_SILVER_RUPEE_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_UNDERWATER_SILVER_RUPEE_CHEST, 0x0B, 0x0D, "Gerudo Training Grounds Underwater Silver Rupee Chest", GERUDO_TRAINING_GROUNDS_UNDERWATER_SILVER_RUPEE_CHEST, GERUDO_TRAINING_GROUNDS_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_HAMMER_ROOM_CLEAR_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST, 0x0B, 0x12, "Gerudo Training Grounds Hammer Room Clear Chest", GERUDO_TRAINING_GROUNDS_HAMMER_ROOM_CLEAR_CHEST, ARROWS_10, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_HAMMER_ROOM_SWITCH_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_SWITCH_CHEST, 0x0B, 0x10, "Gerudo Training Grounds Hammer Room Switch Chest", GERUDO_TRAINING_GROUNDS_HAMMER_ROOM_SWITCH_CHEST, GERUDO_TRAINING_GROUNDS_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_EYE_STATUE_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_EYE_STATUE_CHEST, 0x0B, 0x03, "Gerudo Training Grounds Eye Statue Chest", GERUDO_TRAINING_GROUNDS_EYE_STATUE_CHEST, GERUDO_TRAINING_GROUNDS_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_NEAR_SCARECROW_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_NEAR_SCARECROW_CHEST, 0x0B, 0x04, "Gerudo Training Grounds Near Scarecrow Chest", GERUDO_TRAINING_GROUNDS_NEAR_SCARECROW_CHEST, GERUDO_TRAINING_GROUNDS_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_BEFORE_HEAVY_BLOCK_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST, 0x0B, 0x11, "Gerudo Training Grounds Before Heavy Block Chest", GERUDO_TRAINING_GROUNDS_BEFORE_HEAVY_BLOCK_CHEST, ARROWS_30, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_FIRST_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FIRST_CHEST, 0x0B, 0x0F, "Gerudo Training Grounds Heavy Block First Chest", GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_FIRST_CHEST, HUGE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_SECOND_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_SECOND_CHEST, 0x0B, 0x0E, "Gerudo Training Grounds Heavy Block Second Chest", GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_SECOND_CHEST, BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_THIRD_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST, 0x0B, 0x14, "Gerudo Training Grounds Heavy Block Third Chest", GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_THIRD_CHEST, GERUDO_TRAINING_GROUNDS_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_FOURTH_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST, 0x0B, 0x02, "Gerudo Training Grounds Heavy Block Fourth Chest", GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_FOURTH_CHEST, ICE_TRAP, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_FREESTANDING_KEY] = ItemLocation::Collectable(RC_GERUDO_TRAINING_GROUND_FREESTANDING_KEY, 0x0B, 0x01, "Gerudo Training Grounds Freestanding Key", GERUDO_TRAINING_GROUNDS_FREESTANDING_KEY, GERUDO_TRAINING_GROUNDS_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - //Gerudo Training Grounds MQ - locationTable[GERUDO_TRAINING_GROUNDS_MQ_LOBBY_RIGHT_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_CHEST, 0x0B, 0x07, "Gerudo Training Grounds MQ Lobby Right Chest", GERUDO_TRAINING_GROUNDS_MQ_LOBBY_RIGHT_CHEST, BOMBCHU_5, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MQ_LOBBY_LEFT_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_CHEST, 0x0B, 0x13, "Gerudo Training Grounds MQ Lobby Left Chest", GERUDO_TRAINING_GROUNDS_MQ_LOBBY_LEFT_CHEST, ARROWS_10, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MQ_FIRST_IRON_KNUCKLE_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST, 0x0B, 0x00, "Gerudo Training Grounds MQ First Iron Knuckle Chest", GERUDO_TRAINING_GROUNDS_MQ_FIRST_IRON_KNUCKLE_CHEST, BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MQ_BEFORE_HEAVY_BLOCK_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_BEFORE_HEAVY_BLOCK_CHEST, 0x0B, 0x11, "Gerudo Training Grounds MQ Before Heavy Block Chest", GERUDO_TRAINING_GROUNDS_MQ_BEFORE_HEAVY_BLOCK_CHEST, ARROWS_10, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MQ_EYE_STATUE_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_EYE_STATUE_CHEST, 0x0B, 0x03, "Gerudo Training Grounds MQ Eye Statue Chest", GERUDO_TRAINING_GROUNDS_MQ_EYE_STATUE_CHEST, BOMBCHU_10, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MQ_FLAME_CIRCLE_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_FLAME_CIRCLE_CHEST, 0x0B, 0x0E, "Gerudo Training Grounds MQ Flame Circle Chest", GERUDO_TRAINING_GROUNDS_MQ_FLAME_CIRCLE_CHEST, GERUDO_TRAINING_GROUNDS_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MQ_SECOND_IRON_KNUCKLE_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_SECOND_IRON_KNUCKLE_CHEST, 0x0B, 0x12, "Gerudo Training Grounds MQ Second Iron Knuckle Chest", GERUDO_TRAINING_GROUNDS_MQ_SECOND_IRON_KNUCKLE_CHEST, ARROWS_10, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MQ_DINOLFOS_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST, 0x0B, 0x01, "Gerudo Training Grounds MQ Dinolfos Chest", GERUDO_TRAINING_GROUNDS_MQ_DINOLFOS_CHEST, GERUDO_TRAINING_GROUNDS_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MQ_ICE_ARROWS_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_ICE_ARROWS_CHEST, 0x0B, 0x04, "Gerudo Training Grounds MQ Ice Arrows Chest", GERUDO_TRAINING_GROUNDS_MQ_ICE_ARROWS_CHEST, ICE_ARROWS, {Category::cSongDungeonReward}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MQ_MAZE_RIGHT_CENTRAL_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_CENTRAL_CHEST, 0x0B, 0x05, "Gerudo Training Grounds MQ Maze Right Central Chest", GERUDO_TRAINING_GROUNDS_MQ_MAZE_RIGHT_CENTRAL_CHEST, BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_FIRST_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_FIRST_CHEST, 0x0B, 0x06, "Gerudo Training Grounds MQ Maze Path First Chest", GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_FIRST_CHEST, GREEN_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MQ_MAZE_RIGHT_SIDE_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_SIDE_CHEST, 0x0B, 0x08, "Gerudo Training Grounds MQ Maze Right Side Chest", GERUDO_TRAINING_GROUNDS_MQ_MAZE_RIGHT_SIDE_CHEST, TREASURE_GAME_GREEN_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_THIRD_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST, 0x0B, 0x09, "Gerudo Training Grounds MQ Maze Path Third Chest", GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_THIRD_CHEST, TREASURE_GAME_GREEN_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_SECOND_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_SECOND_CHEST, 0x0B, 0x0A, "Gerudo Training Grounds MQ Maze Path Second Chest", GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_SECOND_CHEST, RED_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MQ_HIDDEN_CEILING_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST, 0x0B, 0x0B, "Gerudo Training Grounds MQ Hidden Ceiling Chest", GERUDO_TRAINING_GROUNDS_MQ_HIDDEN_CEILING_CHEST, PURPLE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MQ_UNDERWATER_SILVER_RUPEE_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, 0x0B, 0x0D, "Gerudo Training Grounds MQ Underwater Silver Rupee Chest",GERUDO_TRAINING_GROUNDS_MQ_UNDERWATER_SILVER_RUPEE_CHEST, TREASURE_GAME_GREEN_RUPEE, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MQ_HEAVY_BLOCK_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST, 0x0B, 0x02, "Gerudo Training Grounds MQ Heavy Block Chest", GERUDO_TRAINING_GROUNDS_MQ_HEAVY_BLOCK_CHEST, PURPLE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - - //Ganons Castle Shared - locationTable[GANONS_TOWER_BOSS_KEY_CHEST] = ItemLocation::Chest (RC_GANONS_TOWER_BOSS_KEY_CHEST, 0x0A, 0x0B, "Ganon's Tower Boss Key Chest", GANONS_TOWER_BOSS_KEY_CHEST, GANONS_CASTLE_BOSS_KEY, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - //Ganons Castle Vanilla - locationTable[GANONS_CASTLE_FOREST_TRIAL_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_FOREST_TRIAL_CHEST, 0x0D, 0x09, "Ganon's Castle Forest Trial Chest", GANONS_CASTLE_FOREST_TRIAL_CHEST, BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST, 0x0D, 0x07, "Ganon's Castle Water Trial Left Chest", GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST, ICE_TRAP, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST, 0x0D, 0x06, "Ganon's Castle Water Trial Right Chest", GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST, RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST, 0x0D, 0x08, "Ganon's Castle Shadow Trial Front Chest", GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST, BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST, 0x0D, 0x05, "Ganon's Castle Shadow Trial Golden Gauntlets Chest", GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST, PROGRESSIVE_STRENGTH, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, 0x0D, 0x12, "Ganon's Castle Spirit Trial Crystal Switch Chest", GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, BOMBCHU_20, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, 0x0D, 0x14, "Ganon's Castle Spirit Trial Invisible Chest", GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, ARROWS_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST, 0x0D, 0x0C, "Ganon's Castle Light Trial First Left Chest", GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST, BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST, 0x0D, 0x0B, "Ganon's Castle Light Trial Second Left Chest", GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST, ICE_TRAP, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST, 0x0D, 0x0D, "Ganon's Castle Light Trial Third Left Chest", GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST, RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST, 0x0D, 0x0E, "Ganon's Castle Light Trial First Right Chest", GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST, ICE_TRAP, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST, 0x0D, 0x0A, "Ganon's Castle Light Trial Second Right Chest", GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST, ARROWS_30, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST, 0x0D, 0x0F, "Ganon's Castle Light Trial Third Right Chest", GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST, ICE_TRAP, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST, 0x0D, 0x10, "Ganon's Castle Light Trial Invisible Enemies Chest", GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST, GANONS_CASTLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST, 0x0D, 0x11, "Ganon's Castle Light Trial Lullaby Chest", GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST, GANONS_CASTLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT] = ItemLocation::Base (RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, 0x0D, "Ganon's Castle Deku Scrub Center-Left", GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, BUY_BOMBS_535, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT] = ItemLocation::Base (RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, 0x0D, "Ganon's Castle Deku Scrub Center-Right", GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, BUY_ARROWS_30, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_DEKU_SCRUB_RIGHT] = ItemLocation::Base (RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT, 0x0D, "Ganon's Castle Deku Scrub Right", GANONS_CASTLE_DEKU_SCRUB_RIGHT, BUY_RED_POTION_30, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_DEKU_SCRUB_LEFT] = ItemLocation::Base (RC_GANONS_CASTLE_DEKU_SCRUB_LEFT, 0x0D, "Ganon's Castle Deku Scrub Left", GANONS_CASTLE_DEKU_SCRUB_LEFT, BUY_GREEN_POTION, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - //Ganons Castle MQ - locationTable[GANONS_CASTLE_MQ_WATER_TRIAL_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, 0x0D, 0x01, "Ganon's Castle MQ Water Trial Chest", GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, RED_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, 0x0D, 0x02, "Ganon's Castle MQ Forest Trial Eye Switch Chest", GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, ARROWS_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST, 0x0D, 0x03, "Ganon's Castle MQ Forest Trial Frozen Eye Switch Chest",GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST, BOMBS_5, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, 0x0D, 0x04, "Ganon's Castle MQ Light Trial Lullaby Chest", GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST, 0x0D, 0x00, "Ganon's Castle MQ Shadow Trial Bomb Flower Chest", GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST, ARROWS_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, 0x0D, 0x05, "Ganon's Castle MQ Shadow Trial Eye Switch Chest", GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, GANONS_CASTLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST, 0x0D, 0x06, "Ganon's Castle MQ Spirit Trial Golden Gauntlets Chest", GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST, PROGRESSIVE_STRENGTH, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST, 0x0D, 0x07, "Ganon's Castle MQ Spirit Trial Sun Back Right Chest", GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST, RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST, 0x0D, 0x08, "Ganon's Castle MQ Spirit Trial Sun Back Left Chest", GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST, GANONS_CASTLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST, 0x0D, 0x09, "Ganon's Castle MQ Spirit Trial Sun Front Left Chest", GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST, RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST, 0x0D, 0x0A, "Ganon's Castle MQ Spirit Trial First Chest", GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST, BOMBCHU_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST] = ItemLocation::Chest (RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, 0x0D, 0x14, "Ganon's Castle MQ Spirit Trial Invisible Chest", GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, ARROWS_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY] = ItemLocation::Collectable(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, 0x0D, 0x01, "Ganon's Castle MQ Forest Trial Freestanding Key", GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, GANONS_CASTLE_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT] = ItemLocation::Base (RC_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, 0x0D, "Ganon's Castle MQ Deku Scrub Right", GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, BUY_DEKU_NUT_5, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT] = ItemLocation::Base (RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, 0x0D, "Ganon's Castle MQ Deku Scrub Center-Left", GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, BUY_BOMBS_535, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER] = ItemLocation::Base (RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, 0x0D, "Ganon's Castle MQ Deku Scrub Center", GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, BUY_ARROWS_30, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT] = ItemLocation::Base (RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, 0x0D, "Ganon's Castle MQ Deku Scrub Center-Right", GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, BUY_RED_POTION_30, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT] = ItemLocation::Base (RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, 0x0D, "Ganon's Castle MQ Deku Scrub Left", GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, BUY_GREEN_POTION, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - - /*------------------------------- - --- GOLD SKULLTULA TOKENS --- - -------------------------------*/ - - //Dungeons - locationTable[DEKU_TREE_GS_BASEMENT_BACK_ROOM] = ItemLocation::GSToken(RC_DEKU_TREE_GS_BASEMENT_BACK_ROOM, 0x00, 0x01, "Deku Tree GS Basement Back Room", DEKU_TREE_GS_BASEMENT_BACK_ROOM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_GS_BASEMENT_GATE] = ItemLocation::GSToken(RC_DEKU_TREE_GS_BASEMENT_GATE, 0x00, 0x02, "Deku Tree GS Basement Gate", DEKU_TREE_GS_BASEMENT_GATE, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_GS_BASEMENT_VINES] = ItemLocation::GSToken(RC_DEKU_TREE_GS_BASEMENT_VINES, 0x00, 0x04, "Deku Tree GS Basement Vines", DEKU_TREE_GS_BASEMENT_VINES, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_GS_COMPASS_ROOM] = ItemLocation::GSToken(RC_DEKU_TREE_GS_COMPASS_ROOM, 0x00, 0x08, "Deku Tree GS Compass Room", DEKU_TREE_GS_COMPASS_ROOM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - - locationTable[DEKU_TREE_MQ_GS_LOBBY] = ItemLocation::GSToken(RC_DEKU_TREE_MQ_GS_LOBBY, 0x00, 0x02, "Deku Tree MQ GS Lobby", DEKU_TREE_MQ_GS_LOBBY, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_MQ_GS_COMPASS_ROOM] = ItemLocation::GSToken(RC_DEKU_TREE_MQ_GS_COMPASS_ROOM, 0x00, 0x08, "Deku Tree MQ GS Compass Room", DEKU_TREE_MQ_GS_COMPASS_ROOM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM] = ItemLocation::GSToken(RC_DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, 0x00, 0x04, "Deku Tree MQ GS Basement Graves Room", DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM] = ItemLocation::GSToken(RC_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, 0x00, 0x01, "Deku Tree MQ GS Basement Back Room", DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - - locationTable[DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS] = ItemLocation::GSToken(RC_DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS, 0x01, 0x01, "Dodongos Cavern GS Vines Above Stairs", DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_GS_SCARECROW] = ItemLocation::GSToken(RC_DODONGOS_CAVERN_GS_SCARECROW, 0x01, 0x02, "Dodongos Cavern GS Scarecrow", DODONGOS_CAVERN_GS_SCARECROW, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS] = ItemLocation::GSToken(RC_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, 0x01, 0x04, "Dodongos Cavern GS Alcove Above Stairs", DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_GS_BACK_ROOM] = ItemLocation::GSToken(RC_DODONGOS_CAVERN_GS_BACK_ROOM, 0x01, 0x08, "Dodongos Cavern GS Back Room", DODONGOS_CAVERN_GS_BACK_ROOM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS] = ItemLocation::GSToken(RC_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, 0x01, 0x10, "Dodongos Cavern GS Side Room Near Lower Lizalfos", DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - - locationTable[DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM] = ItemLocation::GSToken(RC_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, 0x01, 0x02, "Dodongos Cavern MQ GS Scrub Room", DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM] = ItemLocation::GSToken(RC_DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, 0x01, 0x08, "Dodongos Cavern MQ GS Song of Time Block Room", DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM] = ItemLocation::GSToken(RC_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, 0x01, 0x04, "Dodongos Cavern MQ GS Lizalfos Room", DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM] = ItemLocation::GSToken(RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, 0x01, 0x10, "Dodongos Cavern MQ GS Larvae Room", DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_MQ_GS_BACK_AREA] = ItemLocation::GSToken(RC_DODONGOS_CAVERN_MQ_GS_BACK_AREA, 0x01, 0x01, "Dodongos Cavern MQ GS Back Room", DODONGOS_CAVERN_MQ_GS_BACK_AREA, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - - locationTable[JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER] = ItemLocation::GSToken(RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER, 0x02, 0x01, "Jabu Jabus Belly GS Lobby Basement Lower", JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER] = ItemLocation::GSToken(RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER, 0x02, 0x02, "Jabu Jabus Belly GS Lobby Basement Upper", JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_GS_NEAR_BOSS] = ItemLocation::GSToken(RC_JABU_JABUS_BELLY_GS_NEAR_BOSS, 0x02, 0x04, "Jabu Jabus Belly GS Near Boss", JABU_JABUS_BELLY_GS_NEAR_BOSS, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM] = ItemLocation::GSToken(RC_JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM, 0x02, 0x08, "Jabu Jabus Belly GS Water Switch Room", JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - - locationTable[JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM] = ItemLocation::GSToken(RC_JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, 0x02, 0x04, "Jabu Jabus Belly MQ GS Tail Parasan Room", JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM] = ItemLocation::GSToken(RC_JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, 0x02, 0x08, "Jabu Jabus Belly MQ GS Invisible Enemies Room", JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM] = ItemLocation::GSToken(RC_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, 0x02, 0x01, "Jabu Jabus Belly MQ GS Boomerang Chest Room", JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS] = ItemLocation::GSToken(RC_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, 0x02, 0x02, "Jabu Jabus Belly MQ GS Near Boss", JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - - locationTable[FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD] = ItemLocation::GSToken(RC_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, 0x03, 0x01, "Forest Temple GS Raised Island Courtyard", FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_GS_FIRST_ROOM] = ItemLocation::GSToken(RC_FOREST_TEMPLE_GS_FIRST_ROOM, 0x03, 0x02, "Forest Temple GS First Room", FOREST_TEMPLE_GS_FIRST_ROOM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD] = ItemLocation::GSToken(RC_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, 0x03, 0x04, "Forest Temple GS Level Island Courtyard", FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_GS_LOBBY] = ItemLocation::GSToken(RC_FOREST_TEMPLE_GS_LOBBY, 0x03, 0x08, "Forest Temple GS Lobby", FOREST_TEMPLE_GS_LOBBY, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_GS_BASEMENT] = ItemLocation::GSToken(RC_FOREST_TEMPLE_GS_BASEMENT, 0x03, 0x10, "Forest Temple GS Basement", FOREST_TEMPLE_GS_BASEMENT, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - - locationTable[FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY] = ItemLocation::GSToken(RC_FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY, 0x03, 0x02, "Forest Temple MQ GS First Hallway", FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM] = ItemLocation::GSToken(RC_FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM, 0x03, 0x10, "Forest Temple MQ GS Block Push Room", FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD] = ItemLocation::GSToken(RC_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, 0x03, 0x01, "Forest Temple MQ GS Raised Island Courtyard", FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD] = ItemLocation::GSToken(RC_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, 0x03, 0x04, "Forest Temple MQ GS Level Island Courtyard", FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FOREST_TEMPLE_MQ_GS_WELL] = ItemLocation::GSToken(RC_FOREST_TEMPLE_MQ_GS_WELL, 0x03, 0x08, "Forest Temple MQ GS Well", FOREST_TEMPLE_MQ_GS_WELL, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - - locationTable[FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM] = ItemLocation::GSToken(RC_FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM, 0x04, 0x01, "Fire Temple GS Song of Time Room", FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_GS_BOSS_KEY_LOOP] = ItemLocation::GSToken(RC_FIRE_TEMPLE_GS_BOSS_KEY_LOOP, 0x04, 0x02, "Fire Temple GS Boss Key Loop", FIRE_TEMPLE_GS_BOSS_KEY_LOOP, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_GS_BOULDER_MAZE] = ItemLocation::GSToken(RC_FIRE_TEMPLE_GS_BOULDER_MAZE, 0x04, 0x04, "Fire Temple GS Boulder Maze", FIRE_TEMPLE_GS_BOULDER_MAZE, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_GS_SCARECROW_TOP] = ItemLocation::GSToken(RC_FIRE_TEMPLE_GS_SCARECROW_TOP, 0x04, 0x08, "Fire Temple GS Scarecrow Top", FIRE_TEMPLE_GS_SCARECROW_TOP, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_GS_SCARECROW_CLIMB] = ItemLocation::GSToken(RC_FIRE_TEMPLE_GS_SCARECROW_CLIMB, 0x04, 0x10, "Fire Temple GS Scarecrow Climb", FIRE_TEMPLE_GS_SCARECROW_CLIMB, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - - locationTable[FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE] = ItemLocation::GSToken(RC_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE, 0x04, 0x02, "Fire Temple MQ GS Above Fire Wall Maze", FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER] = ItemLocation::GSToken(RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER, 0x04, 0x08, "Fire Temple MQ GS Fire Wall Maze Center", FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR] = ItemLocation::GSToken(RC_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, 0x04, 0x01, "Fire Temple MQ GS Big Lava Room Open Door", FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM] = ItemLocation::GSToken(RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, 0x04, 0x10, "Fire Temple MQ GS Fire Wall Maze Side Room", FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE] = ItemLocation::GSToken(RC_FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE, 0x04, 0x04, "Fire Temple MQ GS Skull on Fire", FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - - locationTable[WATER_TEMPLE_GS_BEHIND_GATE] = ItemLocation::GSToken(RC_WATER_TEMPLE_GS_BEHIND_GATE, 0x05, 0x01, "Water Temple GS Behind Gate", WATER_TEMPLE_GS_BEHIND_GATE, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM] = ItemLocation::GSToken(RC_WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM, 0x05, 0x02, "Water Temple GS Falling Platform Room", WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_GS_CENTRAL_PILLAR] = ItemLocation::GSToken(RC_WATER_TEMPLE_GS_CENTRAL_PILLAR, 0x05, 0x04, "Water Temple GS Central Pillar", WATER_TEMPLE_GS_CENTRAL_PILLAR, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST] = ItemLocation::GSToken(RC_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST, 0x05, 0x08, "Water Temple GS Near Boss Key Chest", WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_GS_RIVER] = ItemLocation::GSToken(RC_WATER_TEMPLE_GS_RIVER, 0x05, 0x10, "Water Temple GS River", WATER_TEMPLE_GS_RIVER, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - - locationTable[WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH] = ItemLocation::GSToken(RC_WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH, 0x05, 0x04, "Water Temple MQ GS Before Upper Water Switch", WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA] = ItemLocation::GSToken(RC_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, 0x05, 0x08, "Water Temple MQ GS Freestanding Key Area", WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY] = ItemLocation::GSToken(RC_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, 0x05, 0x01, "Water Temple MQ GS Lizalfos Hallway", WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_MQ_GS_RIVER] = ItemLocation::GSToken(RC_WATER_TEMPLE_MQ_GS_RIVER, 0x05, 0x02, "Water Temple MQ GS River", WATER_TEMPLE_MQ_GS_RIVER, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH] = ItemLocation::GSToken(RC_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, 0x05, 0x10, "Water Temple MQ GS Triple Wall Torch", WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - - locationTable[SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM] = ItemLocation::GSToken(RC_SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM, 0x06, 0x01, "Spirit Temple GS Hall After Sun Block Room", SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_GS_BOULDER_ROOM] = ItemLocation::GSToken(RC_SPIRIT_TEMPLE_GS_BOULDER_ROOM, 0x06, 0x02, "Spirit Temple GS Boulder Room", SPIRIT_TEMPLE_GS_BOULDER_ROOM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_GS_LOBBY] = ItemLocation::GSToken(RC_SPIRIT_TEMPLE_GS_LOBBY, 0x06, 0x04, "Spirit Temple GS Lobby", SPIRIT_TEMPLE_GS_LOBBY, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM] = ItemLocation::GSToken(RC_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, 0x06, 0x08, "Spirit Temple GS Sun on Floor Room", SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_GS_METAL_FENCE] = ItemLocation::GSToken(RC_SPIRIT_TEMPLE_GS_METAL_FENCE, 0x06, 0x10, "Spirit Temple GS Metal Fence", SPIRIT_TEMPLE_GS_METAL_FENCE, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - - locationTable[SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM] = ItemLocation::GSToken(RC_SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM, 0x06, 0x08, "Spirit Temple MQ GS Symphony Room", SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM] = ItemLocation::GSToken(RC_SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM, 0x06, 0x02, "Spirit Temple MQ GS Leever Room", SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST] = ItemLocation::GSToken(RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, 0x06, 0x04, "Spirit Temple MQ GS Nine Thrones Room West", SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH] = ItemLocation::GSToken(RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, 0x06, 0x10, "Spirit Temple MQ GS Nine Thrones Room North", SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM] = ItemLocation::GSToken(RC_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM, 0x06, 0x01, "Spirit Temple MQ GS Sun Block Room", SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - - locationTable[SHADOW_TEMPLE_GS_SINGLE_GIANT_POT] = ItemLocation::GSToken(RC_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, 0x07, 0x01, "Shadow Temple GS Single Giant Pot", SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM] = ItemLocation::GSToken(RC_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, 0x07, 0x02, "Shadow Temple GS Falling Spikes Room", SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT] = ItemLocation::GSToken(RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, 0x07, 0x04, "Shadow Temple GS Triple Giant Pot", SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM] = ItemLocation::GSToken(RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, 0x07, 0x08, "Shadow Temple GS Like Like Room", SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_GS_NEAR_SHIP] = ItemLocation::GSToken(RC_SHADOW_TEMPLE_GS_NEAR_SHIP, 0x07, 0x10, "Shadow Temple GS Near Ship", SHADOW_TEMPLE_GS_NEAR_SHIP, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - - locationTable[SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM] = ItemLocation::GSToken(RC_SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM, 0x07, 0x02, "Shadow Temple MQ GS Falling Spikes Room", SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM] = ItemLocation::GSToken(RC_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, 0x07, 0x01, "Shadow Temple MQ GS Wind Hint Room", SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_GS_AFTER_WIND] = ItemLocation::GSToken(RC_SHADOW_TEMPLE_MQ_GS_AFTER_WIND, 0x07, 0x08, "Shadow Temple MQ GS After Wind", SHADOW_TEMPLE_MQ_GS_AFTER_WIND, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_GS_AFTER_SHIP] = ItemLocation::GSToken(RC_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, 0x07, 0x10, "Shadow Temple MQ GS After Ship", SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[SHADOW_TEMPLE_MQ_GS_NEAR_BOSS] = ItemLocation::GSToken(RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, 0x07, 0x04, "Shadow Temple MQ GS Near Boss", SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - - locationTable[BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE] = ItemLocation::GSToken(RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, 0x08, 0x01, "Bottom of the Well GS Like Like Cage", BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM] = ItemLocation::GSToken(RC_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, 0x08, 0x02, "Bottom of the Well GS East Inner Room", BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM] = ItemLocation::GSToken(RC_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, 0x08, 0x04, "Bottom of the Well GS West Inner Room", BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - - locationTable[BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT] = ItemLocation::GSToken(RC_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, 0x08, 0x01, "Bottom of the Well MQ GS Basement", BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM] = ItemLocation::GSToken(RC_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, 0x08, 0x04, "Bottom of the Well MQ GS Coffin Room", BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM] = ItemLocation::GSToken(RC_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM, 0x08, 0x02, "Bottom of the Well MQ GS West Inner Room", BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - - locationTable[ICE_CAVERN_GS_PUSH_BLOCK_ROOM] = ItemLocation::GSToken(RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, 0x09, 0x01, "Ice Cavern GS Push Block Room", ICE_CAVERN_GS_PUSH_BLOCK_ROOM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - locationTable[ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM] = ItemLocation::GSToken(RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, 0x09, 0x02, "Ice Cavern GS Spinning Scythe Room", ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - locationTable[ICE_CAVERN_GS_HEART_PIECE_ROOM] = ItemLocation::GSToken(RC_ICE_CAVERN_GS_HEART_PIECE_ROOM, 0x09, 0x04, "Ice Cavern GS Heart Piece Room", ICE_CAVERN_GS_HEART_PIECE_ROOM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - - locationTable[ICE_CAVERN_MQ_GS_SCARECROW] = ItemLocation::GSToken(RC_ICE_CAVERN_MQ_GS_SCARECROW, 0x09, 0x01, "Ice Cavern MQ GS Scarecrow", ICE_CAVERN_MQ_GS_SCARECROW, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - locationTable[ICE_CAVERN_MQ_GS_ICE_BLOCK] = ItemLocation::GSToken(RC_ICE_CAVERN_MQ_GS_ICE_BLOCK, 0x09, 0x04, "Ice Cavern MQ GS Ice Block", ICE_CAVERN_MQ_GS_ICE_BLOCK, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - locationTable[ICE_CAVERN_MQ_GS_RED_ICE] = ItemLocation::GSToken(RC_ICE_CAVERN_MQ_GS_RED_ICE, 0x09, 0x02, "Ice Cavern MQ GS Red Ice", ICE_CAVERN_MQ_GS_RED_ICE, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - - //Overworld - locationTable[KF_GS_BEAN_PATCH] = ItemLocation::GSToken(RC_KF_GS_BEAN_PATCH, 0x0C, 0x01, "KF GS Bean Patch", KF_GS_BEAN_PATCH, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - locationTable[KF_GS_KNOW_IT_ALL_HOUSE] = ItemLocation::GSToken(RC_KF_GS_KNOW_IT_ALL_HOUSE, 0x0C, 0x02, "KF GS Know It All House", KF_GS_KNOW_IT_ALL_HOUSE, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - locationTable[KF_GS_HOUSE_OF_TWINS] = ItemLocation::GSToken(RC_KF_GS_HOUSE_OF_TWINS, 0x0C, 0x04, "KF GS House of Twins", KF_GS_HOUSE_OF_TWINS, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - - locationTable[LW_GS_BEAN_PATCH_NEAR_BRIDGE] = ItemLocation::GSToken(RC_LW_GS_BEAN_PATCH_NEAR_BRIDGE, 0x0D, 0x01, "LW GS Bean Patch Near Bridge", LW_GS_BEAN_PATCH_NEAR_BRIDGE, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[LW_GS_BEAN_PATCH_NEAR_THEATER] = ItemLocation::GSToken(RC_LW_GS_BEAN_PATCH_NEAR_THEATER, 0x0D, 0x02, "LW GS Bean Patch Near Theater", LW_GS_BEAN_PATCH_NEAR_THEATER, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[LW_GS_ABOVE_THEATER] = ItemLocation::GSToken(RC_LW_GS_ABOVE_THEATER, 0x0D, 0x04, "LW GS Above Theater", LW_GS_ABOVE_THEATER, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[SFM_GS] = ItemLocation::GSToken(RC_SFM_GS, 0x0D, 0x08, "SFM GS", SFM_GS, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - - locationTable[HF_GS_COW_GROTTO] = ItemLocation::GSToken(RC_HF_GS_COW_GROTTO, 0x0A, 0x01, "HF GS Cow Grotto", HF_GS_COW_GROTTO, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); - locationTable[HF_GS_NEAR_KAK_GROTTO] = ItemLocation::GSToken(RC_HF_GS_NEAR_KAK_GROTTO, 0x0A, 0x02, "HF GS Near Kak Grotto", HF_GS_NEAR_KAK_GROTTO, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); - - locationTable[LH_GS_BEAN_PATCH] = ItemLocation::GSToken(RC_LH_GS_BEAN_PATCH, 0x12, 0x01, "LH GS Bean Patch", LH_GS_BEAN_PATCH, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); - locationTable[LH_GS_SMALL_ISLAND] = ItemLocation::GSToken(RC_LH_GS_SMALL_ISLAND, 0x12, 0x02, "LH GS Small Island", LH_GS_SMALL_ISLAND, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); - locationTable[LH_GS_LAB_WALL] = ItemLocation::GSToken(RC_LH_GS_LAB_WALL, 0x12, 0x04, "LH GS Lab Wall", LH_GS_LAB_WALL, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); - locationTable[LH_GS_LAB_CRATE] = ItemLocation::GSToken(RC_LH_GS_LAB_CRATE, 0x12, 0x08, "LH GS Lab Crate", LH_GS_LAB_CRATE, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); - locationTable[LH_GS_TREE] = ItemLocation::GSToken(RC_LH_GS_TREE, 0x12, 0x10, "LH GS Tree", LH_GS_TREE, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); - - locationTable[GV_GS_BEAN_PATCH] = ItemLocation::GSToken(RC_GV_GS_BEAN_PATCH, 0x13, 0x01, "GV GS Bean Patch", GV_GS_BEAN_PATCH, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[GV_GS_SMALL_BRIDGE] = ItemLocation::GSToken(RC_GV_GS_SMALL_BRIDGE, 0x13, 0x02, "GV GS Small Bridge", GV_GS_SMALL_BRIDGE, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[GV_GS_PILLAR] = ItemLocation::GSToken(RC_GV_GS_PILLAR, 0x13, 0x04, "GV GS Pillar", GV_GS_PILLAR, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[GV_GS_BEHIND_TENT] = ItemLocation::GSToken(RC_GV_GS_BEHIND_TENT, 0x13, 0x08, "GV GS Behind Tent", GV_GS_BEHIND_TENT, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - - locationTable[GF_GS_ARCHERY_RANGE] = ItemLocation::GSToken(RC_GF_GS_ARCHERY_RANGE, 0x14, 0x01, "GF GS Archery Range", GF_GS_ARCHERY_RANGE, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[GF_GS_TOP_FLOOR] = ItemLocation::GSToken(RC_GF_GS_TOP_FLOOR, 0x14, 0x02, "GF GS Top Floor", GF_GS_TOP_FLOOR, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - - locationTable[WASTELAND_GS] = ItemLocation::GSToken(RC_WASTELAND_GS, 0x15, 0x02, "Wasteland GS", WASTELAND_GS, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[COLOSSUS_GS_BEAN_PATCH] = ItemLocation::GSToken(RC_COLOSSUS_GS_BEAN_PATCH, 0x15, 0x01, "Colossus GS Bean Patch", COLOSSUS_GS_BEAN_PATCH, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[COLOSSUS_GS_HILL] = ItemLocation::GSToken(RC_COLOSSUS_GS_HILL, 0x15, 0x04, "Colossus GS Hill", COLOSSUS_GS_HILL, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[COLOSSUS_GS_TREE] = ItemLocation::GSToken(RC_COLOSSUS_GS_TREE, 0x15, 0x08, "Colossus GS Tree", COLOSSUS_GS_TREE, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - - locationTable[OGC_GS] = ItemLocation::GSToken(RC_OGC_GS, 0x0E, 0x01, "OGC GS", OGC_GS, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[HC_GS_STORMS_GROTTO] = ItemLocation::GSToken(RC_HC_GS_STORMS_GROTTO, 0x0E, 0x02, "HC GS Storms Grotto", HC_GS_STORMS_GROTTO, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[HC_GS_TREE] = ItemLocation::GSToken(RC_HC_GS_TREE, 0x0E, 0x04, "HC GS Tree", HC_GS_TREE, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_GS_GUARD_HOUSE] = ItemLocation::GSToken(RC_MARKET_GS_GUARD_HOUSE, 0x0E, 0x08, "Market GS Guard House", MARKET_GS_GUARD_HOUSE, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - - locationTable[KAK_GS_HOUSE_UNDER_CONSTRUCTION] = ItemLocation::GSToken(RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION, 0x10, 0x08, "Kak GS House Under Construction", KAK_GS_HOUSE_UNDER_CONSTRUCTION, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_GS_SKULLTULA_HOUSE] = ItemLocation::GSToken(RC_KAK_GS_SKULLTULA_HOUSE, 0x10, 0x10, "Kak GS Skulltula House", KAK_GS_SKULLTULA_HOUSE, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_GS_GUARDS_HOUSE] = ItemLocation::GSToken(RC_KAK_GS_GUARDS_HOUSE, 0x10, 0x02, "Kak GS Guards House", KAK_GS_GUARDS_HOUSE, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_GS_TREE] = ItemLocation::GSToken(RC_KAK_GS_TREE, 0x10, 0x20, "Kak GS Tree", KAK_GS_TREE, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_GS_WATCHTOWER] = ItemLocation::GSToken(RC_KAK_GS_WATCHTOWER, 0x10, 0x04, "Kak GS Watchtower", KAK_GS_WATCHTOWER, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_GS_ABOVE_IMPAS_HOUSE] = ItemLocation::GSToken(RC_KAK_GS_ABOVE_IMPAS_HOUSE, 0x10, 0x40, "Kak GS Above Impas House", KAK_GS_ABOVE_IMPAS_HOUSE, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - - locationTable[GRAVEYARD_GS_WALL] = ItemLocation::GSToken(RC_GRAVEYARD_GS_WALL, 0x10, 0x80, "Graveyard GS Wall", GRAVEYARD_GS_WALL, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[GRAVEYARD_GS_BEAN_PATCH] = ItemLocation::GSToken(RC_GRAVEYARD_GS_BEAN_PATCH, 0x10, 0x01, "Graveyard GS Bean Patch", GRAVEYARD_GS_BEAN_PATCH, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - - locationTable[DMC_GS_BEAN_PATCH] = ItemLocation::GSToken(RC_DMC_GS_BEAN_PATCH, 0x0F, 0x01, "DMC GS Bean Patch", DMC_GS_BEAN_PATCH, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[DMC_GS_CRATE] = ItemLocation::GSToken(RC_DMC_GS_CRATE, 0x0F, 0x80, "DMC GS Crate", DMC_GS_CRATE, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - - locationTable[DMT_GS_BEAN_PATCH] = ItemLocation::GSToken(RC_DMT_GS_BEAN_PATCH, 0x0F, 0x02, "DMT GS Bean Patch", DMT_GS_BEAN_PATCH, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[DMT_GS_NEAR_KAK] = ItemLocation::GSToken(RC_DMT_GS_NEAR_KAK, 0x0F, 0x04, "DMT GS Near Kak", DMT_GS_NEAR_KAK, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[DMT_GS_ABOVE_DODONGOS_CAVERN] = ItemLocation::GSToken(RC_DMT_GS_ABOVE_DODONGOS_CAVERN, 0x0F, 0x08, "DMT GS Above Dodongos Cavern", DMT_GS_ABOVE_DODONGOS_CAVERN, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[DMT_GS_FALLING_ROCKS_PATH] = ItemLocation::GSToken(RC_DMT_GS_FALLING_ROCKS_PATH, 0x0F, 0x10, "DMT GS Falling Rocks Path", DMT_GS_FALLING_ROCKS_PATH, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - - locationTable[GC_GS_CENTER_PLATFORM] = ItemLocation::GSToken(RC_GC_GS_CENTER_PLATFORM, 0x0F, 0x20, "GC GS Center Platform", GC_GS_CENTER_PLATFORM, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_GS_BOULDER_MAZE] = ItemLocation::GSToken(RC_GC_GS_BOULDER_MAZE, 0x0F, 0x40, "GC GS Boulder Maze", GC_GS_BOULDER_MAZE, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - - locationTable[ZR_GS_LADDER] = ItemLocation::GSToken(RC_ZR_GS_LADDER, 0x11, 0x01, "ZR GS Ladder", ZR_GS_LADDER, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); - locationTable[ZR_GS_TREE] = ItemLocation::GSToken(RC_ZR_GS_TREE, 0x11, 0x02, "ZR GS Tree", ZR_GS_TREE, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); - locationTable[ZR_GS_ABOVE_BRIDGE] = ItemLocation::GSToken(RC_ZR_GS_ABOVE_BRIDGE, 0x11, 0x08, "ZR GS Above Bridge", ZR_GS_ABOVE_BRIDGE, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); - locationTable[ZR_GS_NEAR_RAISED_GROTTOS] = ItemLocation::GSToken(RC_ZR_GS_NEAR_RAISED_GROTTOS, 0x11, 0x10, "ZR GS Near Raised Grottos", ZR_GS_NEAR_RAISED_GROTTOS, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); - - locationTable[ZD_GS_FROZEN_WATERFALL] = ItemLocation::GSToken(RC_ZD_GS_FROZEN_WATERFALL, 0x11, 0x40, "ZD GS Frozen Waterfall", ZD_GS_FROZEN_WATERFALL, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[ZF_GS_ABOVE_THE_LOG] = ItemLocation::GSToken(RC_ZF_GS_ABOVE_THE_LOG, 0x11, 0x04, "ZF GS Above The Log", ZF_GS_ABOVE_THE_LOG, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[ZF_GS_HIDDEN_CAVE] = ItemLocation::GSToken(RC_ZF_GS_HIDDEN_CAVE, 0x11, 0x20, "ZF GS Hidden Cave", ZF_GS_HIDDEN_CAVE, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[ZF_GS_TREE] = ItemLocation::GSToken(RC_ZF_GS_TREE, 0x11, 0x80, "ZF GS Tree", ZF_GS_TREE, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - - locationTable[LLR_GS_BACK_WALL] = ItemLocation::GSToken(RC_LLR_GS_BACK_WALL, 0x0B, 0x01, "LLR GS Back Wall", LLR_GS_BACK_WALL, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); - locationTable[LLR_GS_RAIN_SHED] = ItemLocation::GSToken(RC_LLR_GS_RAIN_SHED, 0x0B, 0x02, "LLR GS Rain Shed", LLR_GS_RAIN_SHED, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); - locationTable[LLR_GS_HOUSE_WINDOW] = ItemLocation::GSToken(RC_LLR_GS_HOUSE_WINDOW, 0x0B, 0x04, "LLR GS House Window", LLR_GS_HOUSE_WINDOW, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); - locationTable[LLR_GS_TREE] = ItemLocation::GSToken(RC_LLR_GS_TREE, 0x0B, 0x08, "LLR GS Tree", LLR_GS_TREE, {Category::cSkulltula}, SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); - - /*------------------------------- - --- BOSSES --- - -------------------------------*/ - - locationTable[LINKS_POCKET] = ItemLocation::Reward (RC_LINKS_POCKET, 0xFF, "Link's Pocket", LINKS_POCKET, LIGHT_MEDALLION, {}, SpoilerCollectionCheck::AlwaysCollected(), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - locationTable[QUEEN_GOHMA] = ItemLocation::Reward (RC_QUEEN_GOHMA, 0xFF, "Queen Gohma", QUEEN_GOHMA, KOKIRI_EMERALD, {}, SpoilerCollectionCheck::Chest(0x11, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[KING_DODONGO] = ItemLocation::Reward (RC_KING_DODONGO, 0xFF, "King Dodongo", KING_DODONGO, GORON_RUBY, {}, SpoilerCollectionCheck::Chest(0x12, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[BARINADE] = ItemLocation::Reward (RC_BARINADE, 0xFF, "Barinade", BARINADE, ZORA_SAPPHIRE, {}, SpoilerCollectionCheck::Chest(0x13, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[PHANTOM_GANON] = ItemLocation::Reward (RC_PHANTOM_GANON, 0xFF, "Phantom Ganon", PHANTOM_GANON, FOREST_MEDALLION, {}, SpoilerCollectionCheck::Chest(0x14, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[VOLVAGIA] = ItemLocation::Reward (RC_VOLVAGIA, 0xFF, "Volvagia", VOLVAGIA, FIRE_MEDALLION, {}, SpoilerCollectionCheck::Chest(0x15, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[MORPHA] = ItemLocation::Reward (RC_MORPHA, 0xFF, "Morpha", MORPHA, WATER_MEDALLION, {}, SpoilerCollectionCheck::Chest(0x16, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[TWINROVA] = ItemLocation::Reward (RC_TWINROVA, 0xFF, "Twinrova", TWINROVA, SPIRIT_MEDALLION, {}, SpoilerCollectionCheck::Chest(0x17, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[BONGO_BONGO] = ItemLocation::Reward (RC_BONGO_BONGO, 0xFF, "Bongo Bongo", BONGO_BONGO, SHADOW_MEDALLION, {}, SpoilerCollectionCheck::Chest(0x18, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[GANON] = ItemLocation::Reward (RC_GANON, 0xFF, "Ganon", NONE, TRIFORCE, {}, SpoilerCollectionCheck::None(), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - - /*------------------------------- - ---HEART CONTAINERS --- - -------------------------------*/ - - locationTable[DEKU_TREE_QUEEN_GOHMA_HEART] = ItemLocation::Base (RC_DEKU_TREE_QUEEN_GOHMA_HEART, 0x11, "Deku Tree Queen Gohma Heart Container", DEKU_TREE_QUEEN_GOHMA_HEART, HEART_CONTAINER, {Category::cSongDungeonReward}, SpoilerCollectionCheck::Collectable(0x11, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DODONGOS_CAVERN_KING_DODONGO_HEART] = ItemLocation::Base (RC_DODONGOS_CAVERN_KING_DODONGO_HEART, 0x12, "Dodongos Cavern King Dodongo Heart Container", DODONGOS_CAVERN_KING_DODONGO_HEART, HEART_CONTAINER, {Category::cSongDungeonReward}, SpoilerCollectionCheck::Collectable(0x12, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[JABU_JABUS_BELLY_BARINADE_HEART] = ItemLocation::Base (RC_JABU_JABUS_BELLY_BARINADE_HEART, 0x13, "Jabu Jabus Belly Barinade Heart Container", JABU_JABUS_BELLY_BARINADE_HEART, HEART_CONTAINER, {Category::cSongDungeonReward}, SpoilerCollectionCheck::Collectable(0x13, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[FOREST_TEMPLE_PHANTOM_GANON_HEART] = ItemLocation::Base (RC_FOREST_TEMPLE_PHANTOM_GANON_HEART, 0x14, "Forest Temple Phantom Ganon Heart Container", FOREST_TEMPLE_PHANTOM_GANON_HEART, HEART_CONTAINER, {Category::cSongDungeonReward}, SpoilerCollectionCheck::Collectable(0x14, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); - locationTable[FIRE_TEMPLE_VOLVAGIA_HEART] = ItemLocation::Base (RC_FIRE_TEMPLE_VOLVAGIA_HEART, 0x15, "Fire Temple Volvagia Heart Container", FIRE_TEMPLE_VOLVAGIA_HEART, HEART_CONTAINER, {Category::cSongDungeonReward}, SpoilerCollectionCheck::Collectable(0x15, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); - locationTable[WATER_TEMPLE_MORPHA_HEART] = ItemLocation::Base (RC_WATER_TEMPLE_MORPHA_HEART, 0x16, "Water Temple Morpha Heart Container", WATER_TEMPLE_MORPHA_HEART, HEART_CONTAINER, {Category::cSongDungeonReward}, SpoilerCollectionCheck::Collectable(0x16, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[SPIRIT_TEMPLE_TWINROVA_HEART] = ItemLocation::Base (RC_SPIRIT_TEMPLE_TWINROVA_HEART, 0x17, "Spirit Temple Twinrova Heart Container", SPIRIT_TEMPLE_TWINROVA_HEART, HEART_CONTAINER, {Category::cSongDungeonReward}, SpoilerCollectionCheck::Collectable(0x17, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[SHADOW_TEMPLE_BONGO_BONGO_HEART] = ItemLocation::Base (RC_SHADOW_TEMPLE_BONGO_BONGO_HEART, 0x18, "Shadow Temple Bongo Bongo Heart Container", SHADOW_TEMPLE_BONGO_BONGO_HEART, HEART_CONTAINER, {Category::cSongDungeonReward}, SpoilerCollectionCheck::Collectable(0x18, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - - /*------------------------------- - --- CUTSCENES --- - -------------------------------*/ - - locationTable[TOT_LIGHT_ARROWS_CUTSCENE] = ItemLocation::Delayed(RC_TOT_LIGHT_ARROWS_CUTSCENE, 0xFF, "ToT Light Arrow Cutscene", TOT_LIGHT_ARROWS_CUTSCENE, LIGHT_ARROWS, {}, SpoilerCollectionCheck::Chest(0x43, 0x1E), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[LW_GIFT_FROM_SARIA] = ItemLocation::Delayed(RC_LW_GIFT_FROM_SARIA, 0xFF, "LW Gift From Saria", LW_GIFT_FROM_SARIA, PROGRESSIVE_OCARINA, {}, SpoilerCollectionCheck::EventChkInf(0xC1), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[ZF_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(RC_ZF_GREAT_FAIRY_REWARD, 0xFF, "ZF Great Fairy Reward", ZF_GREAT_FAIRY_REWARD, FARORES_WIND, {}, SpoilerCollectionCheck::Chest(0x3D, 0x01), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[HC_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(RC_HC_GREAT_FAIRY_REWARD, 0xFF, "HC Great Fairy Reward", HC_GREAT_FAIRY_REWARD, DINS_FIRE, {}, SpoilerCollectionCheck::Chest(0x3D, 0x02), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[COLOSSUS_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(RC_COLOSSUS_GREAT_FAIRY_REWARD, 0xFF, "Colossus Great Fairy Reward", COLOSSUS_GREAT_FAIRY_REWARD, NAYRUS_LOVE, {}, SpoilerCollectionCheck::Chest(0x3D, 0x03), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[DMT_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(RC_DMT_GREAT_FAIRY_REWARD, 0xFF, "DMT Great Fairy Reward", DMT_GREAT_FAIRY_REWARD, PROGRESSIVE_MAGIC_METER, {}, SpoilerCollectionCheck::Chest(0x3B, 0x01), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[DMC_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(RC_DMC_GREAT_FAIRY_REWARD, 0xFF, "DMC Great Fairy Reward", DMC_GREAT_FAIRY_REWARD, PROGRESSIVE_MAGIC_METER, {}, SpoilerCollectionCheck::Chest(0x3B, 0x02), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[OGC_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(RC_OGC_GREAT_FAIRY_REWARD, 0xFF, "OGC Great Fairy Reward", OGC_GREAT_FAIRY_REWARD, DOUBLE_DEFENSE, {}, SpoilerCollectionCheck::Chest(0x3B, 0x03), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - - locationTable[SHEIK_IN_FOREST] = ItemLocation::Delayed(RC_SHEIK_IN_FOREST, 0xFF, "Sheik in Forest", SHEIK_IN_FOREST, MINUET_OF_FOREST, {Category::cSong}, SpoilerCollectionCheck::EventChkInf(0x50), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[SHEIK_IN_CRATER] = ItemLocation::Delayed(RC_SHEIK_IN_CRATER, 0xFF, "Sheik in Crater", SHEIK_IN_CRATER, BOLERO_OF_FIRE, {Category::cSong}, SpoilerCollectionCheck::EventChkInf(0x51), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[SHEIK_IN_ICE_CAVERN] = ItemLocation::Delayed(RC_SHEIK_IN_ICE_CAVERN, 0xFF, "Sheik in Ice Cavern", SHEIK_IN_ICE_CAVERN, SERENADE_OF_WATER, {Category::cSong, Category::cSongDungeonReward}, SpoilerCollectionCheck::EventChkInf(0x52), SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - locationTable[SHEIK_AT_COLOSSUS] = ItemLocation::Delayed(RC_SHEIK_AT_COLOSSUS, 0xFF, "Sheik at Colossus", SHEIK_AT_COLOSSUS, REQUIEM_OF_SPIRIT, {Category::cSong}, SpoilerCollectionCheck::EventChkInf(0xAC), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[SHEIK_IN_KAKARIKO] = ItemLocation::Delayed(RC_SHEIK_IN_KAKARIKO, 0xFF, "Sheik in Kakariko", SHEIK_IN_KAKARIKO, NOCTURNE_OF_SHADOW, {Category::cSong}, SpoilerCollectionCheck::EventChkInf(0xAA), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[SHEIK_AT_TEMPLE] = ItemLocation::Delayed(RC_SHEIK_AT_TEMPLE, 0xFF, "Sheik at Temple", SHEIK_AT_TEMPLE, PRELUDE_OF_LIGHT, {Category::cSong}, SpoilerCollectionCheck::Chest(0x43, 0x1F), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[SONG_FROM_IMPA] = ItemLocation::Delayed(RC_SONG_FROM_IMPA, 0xFF, "Song from Impa", SONG_FROM_IMPA, ZELDAS_LULLABY, {Category::cSong, Category::cSongDungeonReward}, SpoilerCollectionCheck::EventChkInf(0x59), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[SONG_FROM_MALON] = ItemLocation::Delayed(RC_SONG_FROM_MALON, 0xFF, "Song from Malon", SONG_FROM_MALON, EPONAS_SONG, {Category::cSong}, SpoilerCollectionCheck::Chest(0x63, 0x1F), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); - locationTable[SONG_FROM_SARIA] = ItemLocation::Delayed(RC_SONG_FROM_SARIA, 0xFF, "Song from Saria", SONG_FROM_SARIA, SARIAS_SONG, {Category::cSong}, SpoilerCollectionCheck::Chest(0x56, 0x1F), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[SONG_FROM_COMPOSERS_GRAVE] = ItemLocation::Delayed(RC_SONG_FROM_ROYAL_FAMILYS_TOMB, 0xFF, "Song from Composers Grave", SONG_FROM_COMPOSERS_GRAVE, SUNS_SONG, {Category::cSong}, SpoilerCollectionCheck::Chest(0x41, 0x1F), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[SONG_FROM_OCARINA_OF_TIME] = ItemLocation::Delayed(RC_SONG_FROM_OCARINA_OF_TIME, 0xFF, "Song from Ocarina of Time", SONG_FROM_OCARINA_OF_TIME, SONG_OF_TIME, {Category::cSong}, SpoilerCollectionCheck::Chest(0x51, 0x1F), SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); - locationTable[SONG_FROM_WINDMILL] = ItemLocation::Delayed(RC_SONG_FROM_WINDMILL, 0xFF, "Song from Windmill", SONG_FROM_WINDMILL, SONG_OF_STORMS, {Category::cSong}, SpoilerCollectionCheck::EventChkInf(0x5B), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - - /*------------------------------- - --- COWS --- - -------------------------------*/ - - locationTable[KF_LINKS_HOUSE_COW] = ItemLocation::Base (RC_KF_LINKS_HOUSE_COW, 0x34, "KF Links House Cow", KF_LINKS_HOUSE_COW, MILK, {Category::cCow}, SpoilerCollectionCheck::Cow(), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - locationTable[HF_COW_GROTTO_COW] = ItemLocation::Base (RC_HF_COW_GROTTO_COW, 0x3E, "HF Cow Grotto Cow", HF_COW_GROTTO_COW, MILK, {Category::cCow}, SpoilerCollectionCheck::Cow(), SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); - locationTable[LLR_STABLES_LEFT_COW] = ItemLocation::Base (RC_LLR_STABLES_LEFT_COW, 0x36, "LLR Stables Left Cow", LLR_STABLES_LEFT_COW, MILK, {Category::cCow}, SpoilerCollectionCheck::Cow(), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); - locationTable[LLR_STABLES_RIGHT_COW] = ItemLocation::Base (RC_LLR_STABLES_RIGHT_COW, 0x36, "LLR Stables Right Cow", LLR_STABLES_RIGHT_COW, MILK, {Category::cCow}, SpoilerCollectionCheck::Cow(), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); - locationTable[LLR_TOWER_LEFT_COW] = ItemLocation::Base (RC_LLR_TOWER_LEFT_COW, 0x4C, "LLR Tower Left Cow", LLR_TOWER_LEFT_COW, MILK, {Category::cCow}, SpoilerCollectionCheck::Cow(), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); - locationTable[LLR_TOWER_RIGHT_COW] = ItemLocation::Base (RC_LLR_TOWER_RIGHT_COW, 0x4C, "LLR Tower Right Cow", LLR_TOWER_RIGHT_COW, MILK, {Category::cCow}, SpoilerCollectionCheck::Cow(), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); - locationTable[KAK_IMPAS_HOUSE_COW] = ItemLocation::Base (RC_KAK_IMPAS_HOUSE_COW, 0x37, "Kak Impas House Cow", KAK_IMPAS_HOUSE_COW, MILK, {Category::cCow}, SpoilerCollectionCheck::Cow(), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[DMT_COW_GROTTO_COW] = ItemLocation::Base (RC_DMT_COW_GROTTO_COW, 0x3E, "DMT Cow Grotto Cow", DMT_COW_GROTTO_COW, MILK, {Category::cCow}, SpoilerCollectionCheck::Cow(), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[GV_COW] = ItemLocation::Base (RC_GV_COW, 0x5A, "GV Cow", GV_COW, MILK, {Category::cCow}, SpoilerCollectionCheck::Cow(), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[JABU_JABUS_BELLY_MQ_COW] = ItemLocation::Base (RC_JABU_JABUS_BELLY_MQ_COW, 0x02, "Jabu Jabus Belly MQ Cow", JABU_JABUS_BELLY_MQ_COW, MILK, {Category::cCow}, SpoilerCollectionCheck::Cow(), SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - - /*------------------------------- - --- SHOPS --- - 8 6 2 4 - - 7 5 1 3 - -------------------------------*/ - - locationTable[KF_SHOP_ITEM_1] = ItemLocation::Base(RC_KF_SHOP_ITEM_1, 0x2D, "KF Shop Item 1", KF_SHOP_ITEM_1, BUY_DEKU_SHIELD, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - locationTable[KF_SHOP_ITEM_2] = ItemLocation::Base(RC_KF_SHOP_ITEM_2, 0x2D, "KF Shop Item 2", KF_SHOP_ITEM_2, BUY_DEKU_NUT_5, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - locationTable[KF_SHOP_ITEM_3] = ItemLocation::Base(RC_KF_SHOP_ITEM_3, 0x2D, "KF Shop Item 3", KF_SHOP_ITEM_3, BUY_DEKU_NUT_10, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - locationTable[KF_SHOP_ITEM_4] = ItemLocation::Base(RC_KF_SHOP_ITEM_4, 0x2D, "KF Shop Item 4", KF_SHOP_ITEM_4, BUY_DEKU_STICK_1, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - locationTable[KF_SHOP_ITEM_5] = ItemLocation::Base(RC_KF_SHOP_ITEM_5, 0x2D, "KF Shop Item 5", KF_SHOP_ITEM_5, BUY_DEKU_SEEDS_30, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - locationTable[KF_SHOP_ITEM_6] = ItemLocation::Base(RC_KF_SHOP_ITEM_6, 0x2D, "KF Shop Item 6", KF_SHOP_ITEM_6, BUY_ARROWS_10, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - locationTable[KF_SHOP_ITEM_7] = ItemLocation::Base(RC_KF_SHOP_ITEM_7, 0x2D, "KF Shop Item 7", KF_SHOP_ITEM_7, BUY_ARROWS_30, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - locationTable[KF_SHOP_ITEM_8] = ItemLocation::Base(RC_KF_SHOP_ITEM_8, 0x2D, "KF Shop Item 8", KF_SHOP_ITEM_8, BUY_HEART, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); - - locationTable[KAK_POTION_SHOP_ITEM_1] = ItemLocation::Base(RC_KAK_POTION_SHOP_ITEM_1, 0x30, "Kak Potion Shop Item 1", KAK_POTION_SHOP_ITEM_1, BUY_GREEN_POTION, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_POTION_SHOP_ITEM_2] = ItemLocation::Base(RC_KAK_POTION_SHOP_ITEM_2, 0x30, "Kak Potion Shop Item 2", KAK_POTION_SHOP_ITEM_2, BUY_BLUE_FIRE, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_POTION_SHOP_ITEM_3] = ItemLocation::Base(RC_KAK_POTION_SHOP_ITEM_3, 0x30, "Kak Potion Shop Item 3", KAK_POTION_SHOP_ITEM_3, BUY_RED_POTION_30, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_POTION_SHOP_ITEM_4] = ItemLocation::Base(RC_KAK_POTION_SHOP_ITEM_4, 0x30, "Kak Potion Shop Item 4", KAK_POTION_SHOP_ITEM_4, BUY_FAIRYS_SPIRIT, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_POTION_SHOP_ITEM_5] = ItemLocation::Base(RC_KAK_POTION_SHOP_ITEM_5, 0x30, "Kak Potion Shop Item 5", KAK_POTION_SHOP_ITEM_5, BUY_DEKU_NUT_5, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_POTION_SHOP_ITEM_6] = ItemLocation::Base(RC_KAK_POTION_SHOP_ITEM_6, 0x30, "Kak Potion Shop Item 6", KAK_POTION_SHOP_ITEM_6, BUY_BOTTLE_BUG, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_POTION_SHOP_ITEM_7] = ItemLocation::Base(RC_KAK_POTION_SHOP_ITEM_7, 0x30, "Kak Potion Shop Item 7", KAK_POTION_SHOP_ITEM_7, BUY_POE, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_POTION_SHOP_ITEM_8] = ItemLocation::Base(RC_KAK_POTION_SHOP_ITEM_8, 0x30, "Kak Potion Shop Item 8", KAK_POTION_SHOP_ITEM_8, BUY_FISH, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - - locationTable[MARKET_BOMBCHU_SHOP_ITEM_1] = ItemLocation::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_1, 0x32, "MK Bombchu Shop Item 1", MARKET_BOMBCHU_SHOP_ITEM_1, BUY_BOMBCHU_10, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BOMBCHU_SHOP_ITEM_2] = ItemLocation::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_2, 0x32, "MK Bombchu Shop Item 2", MARKET_BOMBCHU_SHOP_ITEM_2, BUY_BOMBCHU_10, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BOMBCHU_SHOP_ITEM_3] = ItemLocation::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_3, 0x32, "MK Bombchu Shop Item 3", MARKET_BOMBCHU_SHOP_ITEM_3, BUY_BOMBCHU_10, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BOMBCHU_SHOP_ITEM_4] = ItemLocation::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_4, 0x32, "MK Bombchu Shop Item 4", MARKET_BOMBCHU_SHOP_ITEM_4, BUY_BOMBCHU_10, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BOMBCHU_SHOP_ITEM_5] = ItemLocation::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_5, 0x32, "MK Bombchu Shop Item 5", MARKET_BOMBCHU_SHOP_ITEM_5, BUY_BOMBCHU_20, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BOMBCHU_SHOP_ITEM_6] = ItemLocation::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_6, 0x32, "MK Bombchu Shop Item 6", MARKET_BOMBCHU_SHOP_ITEM_6, BUY_BOMBCHU_20, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BOMBCHU_SHOP_ITEM_7] = ItemLocation::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_7, 0x32, "MK Bombchu Shop Item 7", MARKET_BOMBCHU_SHOP_ITEM_7, BUY_BOMBCHU_20, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BOMBCHU_SHOP_ITEM_8] = ItemLocation::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_8, 0x32, "MK Bombchu Shop Item 8", MARKET_BOMBCHU_SHOP_ITEM_8, BUY_BOMBCHU_20, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - - locationTable[MARKET_POTION_SHOP_ITEM_1] = ItemLocation::Base(RC_MARKET_POTION_SHOP_ITEM_1, 0x31, "MK Potion Shop Item 1", MARKET_POTION_SHOP_ITEM_1, BUY_GREEN_POTION, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_POTION_SHOP_ITEM_2] = ItemLocation::Base(RC_MARKET_POTION_SHOP_ITEM_2, 0x31, "MK Potion Shop Item 2", MARKET_POTION_SHOP_ITEM_2, BUY_BLUE_FIRE, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_POTION_SHOP_ITEM_3] = ItemLocation::Base(RC_MARKET_POTION_SHOP_ITEM_3, 0x31, "MK Potion Shop Item 3", MARKET_POTION_SHOP_ITEM_3, BUY_RED_POTION_30, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_POTION_SHOP_ITEM_4] = ItemLocation::Base(RC_MARKET_POTION_SHOP_ITEM_4, 0x31, "MK Potion Shop Item 4", MARKET_POTION_SHOP_ITEM_4, BUY_FAIRYS_SPIRIT, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_POTION_SHOP_ITEM_5] = ItemLocation::Base(RC_MARKET_POTION_SHOP_ITEM_5, 0x31, "MK Potion Shop Item 5", MARKET_POTION_SHOP_ITEM_5, BUY_DEKU_NUT_5, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_POTION_SHOP_ITEM_6] = ItemLocation::Base(RC_MARKET_POTION_SHOP_ITEM_6, 0x31, "MK Potion Shop Item 6", MARKET_POTION_SHOP_ITEM_6, BUY_BOTTLE_BUG, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_POTION_SHOP_ITEM_7] = ItemLocation::Base(RC_MARKET_POTION_SHOP_ITEM_7, 0x31, "MK Potion Shop Item 7", MARKET_POTION_SHOP_ITEM_7, BUY_POE, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_POTION_SHOP_ITEM_8] = ItemLocation::Base(RC_MARKET_POTION_SHOP_ITEM_8, 0x31, "MK Potion Shop Item 8", MARKET_POTION_SHOP_ITEM_8, BUY_FISH, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - - locationTable[MARKET_BAZAAR_ITEM_1] = ItemLocation::Base(RC_MARKET_BAZAAR_ITEM_1, 0x2C, "MK Bazaar Item 1", MARKET_BAZAAR_ITEM_1, BUY_HYLIAN_SHIELD, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BAZAAR_ITEM_2] = ItemLocation::Base(RC_MARKET_BAZAAR_ITEM_2, 0x2C, "MK Bazaar Item 2", MARKET_BAZAAR_ITEM_2, BUY_BOMBS_535, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BAZAAR_ITEM_3] = ItemLocation::Base(RC_MARKET_BAZAAR_ITEM_3, 0x2C, "MK Bazaar Item 3", MARKET_BAZAAR_ITEM_3, BUY_DEKU_NUT_5, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BAZAAR_ITEM_4] = ItemLocation::Base(RC_MARKET_BAZAAR_ITEM_4, 0x2C, "MK Bazaar Item 4", MARKET_BAZAAR_ITEM_4, BUY_HEART, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BAZAAR_ITEM_5] = ItemLocation::Base(RC_MARKET_BAZAAR_ITEM_5, 0x2C, "MK Bazaar Item 5", MARKET_BAZAAR_ITEM_5, BUY_ARROWS_10, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BAZAAR_ITEM_6] = ItemLocation::Base(RC_MARKET_BAZAAR_ITEM_6, 0x2C, "MK Bazaar Item 6", MARKET_BAZAAR_ITEM_6, BUY_ARROWS_50, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BAZAAR_ITEM_7] = ItemLocation::Base(RC_MARKET_BAZAAR_ITEM_7, 0x2C, "MK Bazaar Item 7", MARKET_BAZAAR_ITEM_7, BUY_DEKU_STICK_1, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BAZAAR_ITEM_8] = ItemLocation::Base(RC_MARKET_BAZAAR_ITEM_8, 0x2C, "MK Bazaar Item 8", MARKET_BAZAAR_ITEM_8, BUY_ARROWS_30, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - - locationTable[KAK_BAZAAR_ITEM_1] = ItemLocation::Base(RC_KAK_BAZAAR_ITEM_1, 0x2C, "Kak Bazaar Item 1", KAK_BAZAAR_ITEM_1, BUY_HYLIAN_SHIELD, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_BAZAAR_ITEM_2] = ItemLocation::Base(RC_KAK_BAZAAR_ITEM_2, 0x2C, "Kak Bazaar Item 2", KAK_BAZAAR_ITEM_2, BUY_BOMBS_535, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_BAZAAR_ITEM_3] = ItemLocation::Base(RC_KAK_BAZAAR_ITEM_3, 0x2C, "Kak Bazaar Item 3", KAK_BAZAAR_ITEM_3, BUY_DEKU_NUT_5, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_BAZAAR_ITEM_4] = ItemLocation::Base(RC_KAK_BAZAAR_ITEM_4, 0x2C, "Kak Bazaar Item 4", KAK_BAZAAR_ITEM_4, BUY_HEART, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_BAZAAR_ITEM_5] = ItemLocation::Base(RC_KAK_BAZAAR_ITEM_5, 0x2C, "Kak Bazaar Item 5", KAK_BAZAAR_ITEM_5, BUY_ARROWS_10, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_BAZAAR_ITEM_6] = ItemLocation::Base(RC_KAK_BAZAAR_ITEM_6, 0x2C, "Kak Bazaar Item 6", KAK_BAZAAR_ITEM_6, BUY_ARROWS_50, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_BAZAAR_ITEM_7] = ItemLocation::Base(RC_KAK_BAZAAR_ITEM_7, 0x2C, "Kak Bazaar Item 7", KAK_BAZAAR_ITEM_7, BUY_DEKU_STICK_1, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_BAZAAR_ITEM_8] = ItemLocation::Base(RC_KAK_BAZAAR_ITEM_8, 0x2C, "Kak Bazaar Item 8", KAK_BAZAAR_ITEM_8, BUY_ARROWS_30, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - - locationTable[ZD_SHOP_ITEM_1] = ItemLocation::Base(RC_ZD_SHOP_ITEM_1, 0x2F, "ZD Shop Item 1", ZD_SHOP_ITEM_1, BUY_ZORA_TUNIC, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[ZD_SHOP_ITEM_2] = ItemLocation::Base(RC_ZD_SHOP_ITEM_2, 0x2F, "ZD Shop Item 2", ZD_SHOP_ITEM_2, BUY_ARROWS_10, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[ZD_SHOP_ITEM_3] = ItemLocation::Base(RC_ZD_SHOP_ITEM_3, 0x2F, "ZD Shop Item 3", ZD_SHOP_ITEM_3, BUY_HEART, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[ZD_SHOP_ITEM_4] = ItemLocation::Base(RC_ZD_SHOP_ITEM_4, 0x2F, "ZD Shop Item 4", ZD_SHOP_ITEM_4, BUY_ARROWS_30, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[ZD_SHOP_ITEM_5] = ItemLocation::Base(RC_ZD_SHOP_ITEM_5, 0x2F, "ZD Shop Item 5", ZD_SHOP_ITEM_5, BUY_DEKU_NUT_5, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[ZD_SHOP_ITEM_6] = ItemLocation::Base(RC_ZD_SHOP_ITEM_6, 0x2F, "ZD Shop Item 6", ZD_SHOP_ITEM_6, BUY_ARROWS_50, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[ZD_SHOP_ITEM_7] = ItemLocation::Base(RC_ZD_SHOP_ITEM_7, 0x2F, "ZD Shop Item 7", ZD_SHOP_ITEM_7, BUY_FISH, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[ZD_SHOP_ITEM_8] = ItemLocation::Base(RC_ZD_SHOP_ITEM_8, 0x2F, "ZD Shop Item 8", ZD_SHOP_ITEM_8, BUY_RED_POTION_50, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - - locationTable[GC_SHOP_ITEM_1] = ItemLocation::Base(RC_GC_SHOP_ITEM_1, 0x2E, "GC Shop Item 1", GC_SHOP_ITEM_1, BUY_BOMBS_525, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_SHOP_ITEM_2] = ItemLocation::Base(RC_GC_SHOP_ITEM_2, 0x2E, "GC Shop Item 2", GC_SHOP_ITEM_2, BUY_BOMBS_10, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_SHOP_ITEM_3] = ItemLocation::Base(RC_GC_SHOP_ITEM_3, 0x2E, "GC Shop Item 3", GC_SHOP_ITEM_3, BUY_BOMBS_20, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_SHOP_ITEM_4] = ItemLocation::Base(RC_GC_SHOP_ITEM_4, 0x2E, "GC Shop Item 4", GC_SHOP_ITEM_4, BUY_BOMBS_30, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_SHOP_ITEM_5] = ItemLocation::Base(RC_GC_SHOP_ITEM_5, 0x2E, "GC Shop Item 5", GC_SHOP_ITEM_5, BUY_GORON_TUNIC, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_SHOP_ITEM_6] = ItemLocation::Base(RC_GC_SHOP_ITEM_6, 0x2E, "GC Shop Item 6", GC_SHOP_ITEM_6, BUY_HEART, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_SHOP_ITEM_7] = ItemLocation::Base(RC_GC_SHOP_ITEM_7, 0x2E, "GC Shop Item 7", GC_SHOP_ITEM_7, BUY_RED_POTION_40, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_SHOP_ITEM_8] = ItemLocation::Base(RC_GC_SHOP_ITEM_8, 0x2E, "GC Shop Item 8", GC_SHOP_ITEM_8, BUY_HEART, {Category::cShop}, SpoilerCollectionCheck::ShopItem(), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - - /*------------------------------- - --- GOSSIP STONES --- - -------------------------------*/ - // These are not actual locations, but are filler spots used for hint reachability. - OoT Randomizer - locationTable[DMC_GOSSIP_STONE] = ItemLocation::HintStone(RC_DMC_GOSSIP_STONE, "DMC Gossip Stone"); - locationTable[DMT_GOSSIP_STONE] = ItemLocation::HintStone(RC_DMT_GOSSIP_STONE, "DMT Gossip Stone"); - locationTable[COLOSSUS_GOSSIP_STONE] = ItemLocation::HintStone(RC_COLOSSUS_GOSSIP_STONE, "Colossus Gossip Stone"); - locationTable[DODONGOS_CAVERN_GOSSIP_STONE] = ItemLocation::HintStone(RC_DODONGOS_CAVERN_GOSSIP_STONE, "Dodongo's Cavern Gossip Stone"); - locationTable[GV_GOSSIP_STONE] = ItemLocation::HintStone(RC_GV_GOSSIP_STONE, "GV Gossip Stone"); - locationTable[GC_MAZE_GOSSIP_STONE] = ItemLocation::HintStone(RC_GC_MAZE_GOSSIP_STONE, "GC Maze Gossip Stone"); - locationTable[GC_MEDIGORON_GOSSIP_STONE] = ItemLocation::HintStone(RC_GC_MEDIGORON_GOSSIP_STONE, "GC Medigoron Gossip Stone"); - locationTable[GRAVEYARD_GOSSIP_STONE] = ItemLocation::HintStone(RC_GY_GOSSIP_STONE, "GY Gossip Stone"); - locationTable[HC_MALON_GOSSIP_STONE] = ItemLocation::HintStone(RC_HC_MALON_GOSSIP_STONE, "HC Malon Gossip Stone"); - locationTable[HC_ROCK_WALL_GOSSIP_STONE] = ItemLocation::HintStone(RC_HC_ROCK_WALL_GOSSIP_STONE, "HC Rock Wall Gossip Stone"); - locationTable[HC_STORMS_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(RC_HC_STORMS_GROTTO_GOSSIP_STONE, "HC Storms Grotto Gossip Stone"); - locationTable[KF_DEKU_TREE_GOSSIP_STONE_LEFT] = ItemLocation::HintStone(RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE, "KF Deku Tree Left Gossip Stone"); - locationTable[KF_DEKU_TREE_GOSSIP_STONE_RIGHT] = ItemLocation::HintStone(RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE, "KF Deku Tree Right Gossip Stone"); - locationTable[KF_GOSSIP_STONE] = ItemLocation::HintStone(RC_KF_GOSSIP_STONE, "KF Gossip Stone"); - locationTable[LH_LAB_GOSSIP_STONE] = ItemLocation::HintStone(RC_LH_LAB_GOSSIP_STONE, "LH Lab Gossip Stone"); - locationTable[LH_GOSSIP_STONE_SOUTHEAST] = ItemLocation::HintStone(RC_LH_SOUTHEAST_GOSSIP_STONE, "LH Southeast Gossip Stone"); - locationTable[LH_GOSSIP_STONE_SOUTHWEST] = ItemLocation::HintStone(RC_LH_SOUTHWEST_GOSSIP_STONE, "LH Southwest Gossip Stone"); - locationTable[LW_GOSSIP_STONE] = ItemLocation::HintStone(RC_LW_GOSSIP_STONE, "LW Gossip Stone"); - locationTable[SFM_MAZE_GOSSIP_STONE_LOWER] = ItemLocation::HintStone(RC_SFM_MAZE_LOWER_GOSSIP_STONE, "SFM Maze Lower Gossip Stone"); - locationTable[SFM_MAZE_GOSSIP_STONE_UPPER] = ItemLocation::HintStone(RC_SFM_MAZE_UPPER_GOSSIP_STONE, "SFM Maze Upper Gossip Stone"); - locationTable[SFM_SARIA_GOSSIP_STONE] = ItemLocation::HintStone(RC_SFM_SARIA_GOSSIP_STONE, "SFM Saria Gossip Stone"); - locationTable[TOT_GOSSIP_STONE_LEFT] = ItemLocation::HintStone(RC_TOT_LEFT_GOSSIP_STONE, "ToT Left Gossip Stone"); - locationTable[TOT_GOSSIP_STONE_RIGHT] = ItemLocation::HintStone(RC_TOT_RIGHT_GOSSIP_STONE, "ToT Left Center Gossip Stone"); - locationTable[TOT_GOSSIP_STONE_RIGHT_CENTER] = ItemLocation::HintStone(RC_TOT_RIGHT_CENTER_GOSSIP_STONE, "ToT Right Center Gossip Stone"); - locationTable[TOT_GOSSIP_STONE_LEFT_CENTER] = ItemLocation::HintStone(RC_TOT_LEFT_CENTER_GOSSIP_STONE, "ToT Right Gossip Stone"); - locationTable[ZD_GOSSIP_STONE] = ItemLocation::HintStone(RC_ZD_GOSSIP_STONE, "ZD Gossip Stone"); - locationTable[ZF_FAIRY_GOSSIP_STONE] = ItemLocation::HintStone(RC_FAIRY_GOSSIP_STONE, "Fairy Gossip Stone"); - locationTable[ZF_JABU_GOSSIP_STONE] = ItemLocation::HintStone(RC_JABU_GOSSIP_STONE, "Jabu Gossip Stone"); - locationTable[ZR_NEAR_GROTTOS_GOSSIP_STONE] = ItemLocation::HintStone(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, "ZR Near Grottos Gossip Stone"); - locationTable[ZR_NEAR_DOMAIN_GOSSIP_STONE] = ItemLocation::HintStone(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, "ZR Near Domain Gossip Stone"); - locationTable[HF_COW_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(RC_HF_COW_GROTTO_GOSSIP_STONE, "HF Cow Grotto Gossip Stone"); - - locationTable[HF_NEAR_MARKET_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(RC_HF_NEAR_MARKET_GOSSIP_STONE, "HF Near Market Gossip Stone"); - locationTable[HF_SOUTHEAST_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(RC_HF_SOUTHEAST_GOSSIP_STONE, "HF Southeast Gossip Stone"); - locationTable[HF_OPEN_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(RC_HF_OPEN_GROTTO_GOSSIP_STONE, "HF Open Grotto Gossip Stone"); - locationTable[KAK_OPEN_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(RC_KAK_OPEN_GROTTO_GOSSIP_STONE, "Kak Open Grotto Gossip Stone"); - locationTable[ZR_OPEN_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(RC_ZR_OPEN_GROTTO_GOSSIP_STONE, "ZR Open Grotto Gossip Stone"); - locationTable[KF_STORMS_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(RC_KF_STORMS_GOSSIP_STONE, "KF Storms Gossip Stone"); - locationTable[LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(RC_LW_NEAR_SHORTCUTS_GOSSIP_STONE, "LW Near Shortcuts Gossip Stone"); - locationTable[DMT_STORMS_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(RC_DMT_STORMS_GROTTO_GOSSIP_STONE, "DMT Storms Grotto Gossip Stone"); - locationTable[DMC_UPPER_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(RC_DMC_UPPER_GROTTO_GOSSIP_STONE, "DMC Upper Grotto Gossip Stone"); - - locationTable[GANONDORF_HINT] = ItemLocation::OtherHint(RC_GANONDORF_HINT, "Ganondorf Hint"); - locationTable[TRIFORCE_COMPLETED] = ItemLocation::Reward (RC_TRIFORCE_COMPLETED, 0xFF, "Completed Triforce", NONE, TRIFORCE_COMPLETED, {}, SpoilerCollectionCheck::None(), SpoilerCollectionCheckGroup::GROUP_NO_GROUP); - - for (int i = NONE; i != KEY_ENUM_MAX; i++) - locationLookupTable.insert(std::make_pair(locationTable[i].GetRandomizerCheck(), static_cast(i))); -} - -std::vector KF_ShopLocations = { - KF_SHOP_ITEM_1, - KF_SHOP_ITEM_2, - KF_SHOP_ITEM_3, - KF_SHOP_ITEM_4, - KF_SHOP_ITEM_5, - KF_SHOP_ITEM_6, - KF_SHOP_ITEM_7, - KF_SHOP_ITEM_8, -}; -std::vector Kak_PotionShopLocations = { - KAK_POTION_SHOP_ITEM_1, - KAK_POTION_SHOP_ITEM_2, - KAK_POTION_SHOP_ITEM_3, - KAK_POTION_SHOP_ITEM_4, - KAK_POTION_SHOP_ITEM_5, - KAK_POTION_SHOP_ITEM_6, - KAK_POTION_SHOP_ITEM_7, - KAK_POTION_SHOP_ITEM_8, -}; -std::vector MK_BombchuShopLocations = { - MARKET_BOMBCHU_SHOP_ITEM_1, - MARKET_BOMBCHU_SHOP_ITEM_2, - MARKET_BOMBCHU_SHOP_ITEM_3, - MARKET_BOMBCHU_SHOP_ITEM_4, - MARKET_BOMBCHU_SHOP_ITEM_5, - MARKET_BOMBCHU_SHOP_ITEM_6, - MARKET_BOMBCHU_SHOP_ITEM_7, - MARKET_BOMBCHU_SHOP_ITEM_8, -}; -std::vector MK_PotionShopLocations = { - MARKET_POTION_SHOP_ITEM_1, - MARKET_POTION_SHOP_ITEM_2, - MARKET_POTION_SHOP_ITEM_3, - MARKET_POTION_SHOP_ITEM_4, - MARKET_POTION_SHOP_ITEM_5, - MARKET_POTION_SHOP_ITEM_6, - MARKET_POTION_SHOP_ITEM_7, - MARKET_POTION_SHOP_ITEM_8, -}; -std::vector MK_BazaarLocations = { - MARKET_BAZAAR_ITEM_1, - MARKET_BAZAAR_ITEM_2, - MARKET_BAZAAR_ITEM_3, - MARKET_BAZAAR_ITEM_4, - MARKET_BAZAAR_ITEM_5, - MARKET_BAZAAR_ITEM_6, - MARKET_BAZAAR_ITEM_7, - MARKET_BAZAAR_ITEM_8, -}; -std::vector Kak_BazaarLocations = { - KAK_BAZAAR_ITEM_1, - KAK_BAZAAR_ITEM_2, - KAK_BAZAAR_ITEM_3, - KAK_BAZAAR_ITEM_4, - KAK_BAZAAR_ITEM_5, - KAK_BAZAAR_ITEM_6, - KAK_BAZAAR_ITEM_7, - KAK_BAZAAR_ITEM_8, -}; -std::vector ZD_ShopLocations = { - ZD_SHOP_ITEM_1, - ZD_SHOP_ITEM_2, - ZD_SHOP_ITEM_3, - ZD_SHOP_ITEM_4, - ZD_SHOP_ITEM_5, - ZD_SHOP_ITEM_6, - ZD_SHOP_ITEM_7, - ZD_SHOP_ITEM_8, -}; -std::vector GC_ShopLocations = { - GC_SHOP_ITEM_1, - GC_SHOP_ITEM_2, - GC_SHOP_ITEM_3, - GC_SHOP_ITEM_4, - GC_SHOP_ITEM_5, - GC_SHOP_ITEM_6, - GC_SHOP_ITEM_7, - GC_SHOP_ITEM_8, -}; -//List of shop location lists, used for shop shuffle -std::vector> ShopLocationLists = { - KF_ShopLocations, - Kak_PotionShopLocations, - MK_BombchuShopLocations, - MK_PotionShopLocations, - MK_BazaarLocations, - Kak_BazaarLocations, - ZD_ShopLocations, - GC_ShopLocations, -}; - -//List of scrubs, used for pricing the scrubs -std::vector ScrubLocations = { - LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, - LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, - LW_DEKU_SCRUB_NEAR_BRIDGE, - LW_DEKU_SCRUB_GROTTO_REAR, - LW_DEKU_SCRUB_GROTTO_FRONT, - SFM_DEKU_SCRUB_GROTTO_REAR, - SFM_DEKU_SCRUB_GROTTO_FRONT, - HF_DEKU_SCRUB_GROTTO, - LH_DEKU_SCRUB_GROTTO_LEFT, - LH_DEKU_SCRUB_GROTTO_RIGHT, - LH_DEKU_SCRUB_GROTTO_CENTER, - GV_DEKU_SCRUB_GROTTO_REAR, - GV_DEKU_SCRUB_GROTTO_FRONT, - COLOSSUS_DEKU_SCRUB_GROTTO_REAR, - COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, - GC_DEKU_SCRUB_GROTTO_LEFT, - GC_DEKU_SCRUB_GROTTO_RIGHT, - GC_DEKU_SCRUB_GROTTO_CENTER, - DMC_DEKU_SCRUB, - DMC_DEKU_SCRUB_GROTTO_LEFT, - DMC_DEKU_SCRUB_GROTTO_RIGHT, - DMC_DEKU_SCRUB_GROTTO_CENTER, - ZR_DEKU_SCRUB_GROTTO_REAR, - ZR_DEKU_SCRUB_GROTTO_FRONT, - LLR_DEKU_SCRUB_GROTTO_LEFT, - LLR_DEKU_SCRUB_GROTTO_RIGHT, - LLR_DEKU_SCRUB_GROTTO_CENTER, - DEKU_TREE_MQ_DEKU_SCRUB, - DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, - DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, - DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, - DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, - DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, - DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, - DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, - DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, - JABU_JABUS_BELLY_DEKU_SCRUB, - GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, - GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, - GANONS_CASTLE_DEKU_SCRUB_RIGHT, - GANONS_CASTLE_DEKU_SCRUB_LEFT, - GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, - GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, - GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, - GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, - GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, -}; - -//List of gossip stone locations for hints -std::vector gossipStoneLocations = { - DMC_GOSSIP_STONE, - DMT_GOSSIP_STONE, - COLOSSUS_GOSSIP_STONE, - DODONGOS_CAVERN_GOSSIP_STONE, - GV_GOSSIP_STONE, - GC_MAZE_GOSSIP_STONE, - GC_MEDIGORON_GOSSIP_STONE, - GRAVEYARD_GOSSIP_STONE, - HC_MALON_GOSSIP_STONE, - HC_ROCK_WALL_GOSSIP_STONE, - HC_STORMS_GROTTO_GOSSIP_STONE, - KF_DEKU_TREE_GOSSIP_STONE_LEFT, - KF_DEKU_TREE_GOSSIP_STONE_RIGHT, - KF_GOSSIP_STONE, - LH_LAB_GOSSIP_STONE, - LH_GOSSIP_STONE_SOUTHEAST, - LH_GOSSIP_STONE_SOUTHWEST, - LW_GOSSIP_STONE, - SFM_MAZE_GOSSIP_STONE_LOWER, - SFM_MAZE_GOSSIP_STONE_UPPER, - SFM_SARIA_GOSSIP_STONE, - TOT_GOSSIP_STONE_LEFT, - TOT_GOSSIP_STONE_RIGHT, - TOT_GOSSIP_STONE_RIGHT_CENTER, - TOT_GOSSIP_STONE_LEFT_CENTER, - ZD_GOSSIP_STONE, - ZF_FAIRY_GOSSIP_STONE, - ZF_JABU_GOSSIP_STONE, - ZR_NEAR_GROTTOS_GOSSIP_STONE, - ZR_NEAR_DOMAIN_GOSSIP_STONE, - HF_COW_GROTTO_GOSSIP_STONE, - HF_NEAR_MARKET_GROTTO_GOSSIP_STONE, - HF_SOUTHEAST_GROTTO_GOSSIP_STONE, - HF_OPEN_GROTTO_GOSSIP_STONE, - KAK_OPEN_GROTTO_GOSSIP_STONE, - ZR_OPEN_GROTTO_GOSSIP_STONE, - KF_STORMS_GROTTO_GOSSIP_STONE, - LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE, - DMT_STORMS_GROTTO_GOSSIP_STONE, - DMC_UPPER_GROTTO_GOSSIP_STONE, -}; - -std::vector dungeonRewardLocations = { - //Bosses - QUEEN_GOHMA, - KING_DODONGO, - BARINADE, - PHANTOM_GANON, - VOLVAGIA, - MORPHA, - TWINROVA, - BONGO_BONGO, - LINKS_POCKET, -}; -std::vector overworldLocations = { - //Kokiri Forest - KF_KOKIRI_SWORD_CHEST, - KF_MIDOS_TOP_LEFT_CHEST, - KF_MIDOS_TOP_RIGHT_CHEST, - KF_MIDOS_BOTTOM_LEFT_CHEST, - KF_MIDOS_BOTTOM_RIGHT_CHEST, - KF_STORMS_GROTTO_CHEST, - KF_LINKS_HOUSE_COW, - - //Shop - KF_SHOP_ITEM_1, - KF_SHOP_ITEM_2, - KF_SHOP_ITEM_3, - KF_SHOP_ITEM_4, - KF_SHOP_ITEM_5, - KF_SHOP_ITEM_6, - KF_SHOP_ITEM_7, - KF_SHOP_ITEM_8, - - //Lost Woods - LW_GIFT_FROM_SARIA, - LW_SKULL_KID, - LW_TRADE_COJIRO, - LW_TRADE_ODD_POTION, - LW_OCARINA_MEMORY_GAME, - LW_TARGET_IN_WOODS, - LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, - LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, - LW_DEKU_SCRUB_NEAR_BRIDGE, - LW_NEAR_SHORTCUTS_GROTTO_CHEST, - LW_DEKU_SCRUB_GROTTO_REAR, - LW_DEKU_SCRUB_GROTTO_FRONT, - DEKU_THEATER_SKULL_MASK, - DEKU_THEATER_MASK_OF_TRUTH, - - //Sacred Forest Meadow - SONG_FROM_SARIA, - SHEIK_IN_FOREST, - SFM_WOLFOS_GROTTO_CHEST, - SFM_DEKU_SCRUB_GROTTO_REAR, - SFM_DEKU_SCRUB_GROTTO_FRONT, - - //Hyrule Field - HF_SOUTHEAST_GROTTO_CHEST, - HF_OPEN_GROTTO_CHEST, - HF_NEAR_MARKET_GROTTO_CHEST, - HF_OCARINA_OF_TIME_ITEM, - SONG_FROM_OCARINA_OF_TIME, - HF_TEKTITE_GROTTO_FREESTANDING_POH, - HF_DEKU_SCRUB_GROTTO, - HF_COW_GROTTO_COW, - - //Lake Hylia - LH_CHILD_FISHING, - LH_ADULT_FISHING, - LH_LAB_DIVE, - LH_TRADE_FROG, - LH_UNDERWATER_ITEM, - LH_SUN, - LH_FREESTANDING_POH, - LH_DEKU_SCRUB_GROTTO_LEFT, - LH_DEKU_SCRUB_GROTTO_RIGHT, - LH_DEKU_SCRUB_GROTTO_CENTER, - - //Gerudo Valley - GV_CHEST, - GV_TRADE_SAW, - GV_WATERFALL_FREESTANDING_POH, - GV_CRATE_FREESTANDING_POH, - GV_DEKU_SCRUB_GROTTO_REAR, - GV_DEKU_SCRUB_GROTTO_FRONT, - GV_COW, - - //Gerudo Fortress - GF_CHEST, - GF_HBA_1000_POINTS, - GF_HBA_1500_POINTS, - GF_NORTH_F1_CARPENTER, - GF_NORTH_F2_CARPENTER, - GF_SOUTH_F1_CARPENTER, - GF_SOUTH_F2_CARPENTER, - GF_GERUDO_MEMBERSHIP_CARD, - - //Haunted Wasteland - WASTELAND_CHEST, - WASTELAND_BOMBCHU_SALESMAN, - - //Desert Colossus - SHEIK_AT_COLOSSUS, - COLOSSUS_FREESTANDING_POH, - COLOSSUS_GREAT_FAIRY_REWARD, - COLOSSUS_DEKU_SCRUB_GROTTO_REAR, - COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, - - //Market - MARKET_TREASURE_CHEST_GAME_REWARD, - MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, - MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, - MARKET_BOMBCHU_BOWLING_BOMBCHUS, - MARKET_LOST_DOG, - MARKET_SHOOTING_GALLERY_REWARD, - MARKET_10_BIG_POES, - MARKET_TREASURE_CHEST_GAME_ITEM_1, - MARKET_TREASURE_CHEST_GAME_ITEM_2, - MARKET_TREASURE_CHEST_GAME_ITEM_3, - MARKET_TREASURE_CHEST_GAME_ITEM_4, - MARKET_TREASURE_CHEST_GAME_ITEM_5, - - //Market Shops - MARKET_BOMBCHU_SHOP_ITEM_1, - MARKET_BOMBCHU_SHOP_ITEM_2, - MARKET_BOMBCHU_SHOP_ITEM_3, - MARKET_BOMBCHU_SHOP_ITEM_4, - MARKET_BOMBCHU_SHOP_ITEM_5, - MARKET_BOMBCHU_SHOP_ITEM_6, - MARKET_BOMBCHU_SHOP_ITEM_7, - MARKET_BOMBCHU_SHOP_ITEM_8, - MARKET_POTION_SHOP_ITEM_1, - MARKET_POTION_SHOP_ITEM_2, - MARKET_POTION_SHOP_ITEM_3, - MARKET_POTION_SHOP_ITEM_4, - MARKET_POTION_SHOP_ITEM_5, - MARKET_POTION_SHOP_ITEM_6, - MARKET_POTION_SHOP_ITEM_7, - MARKET_POTION_SHOP_ITEM_8, - MARKET_BAZAAR_ITEM_1, - MARKET_BAZAAR_ITEM_2, - MARKET_BAZAAR_ITEM_3, - MARKET_BAZAAR_ITEM_4, - MARKET_BAZAAR_ITEM_5, - MARKET_BAZAAR_ITEM_6, - MARKET_BAZAAR_ITEM_7, - MARKET_BAZAAR_ITEM_8, - - //Hyrule Castle - HC_MALON_EGG, - HC_ZELDAS_LETTER, - SONG_FROM_IMPA, - HC_GREAT_FAIRY_REWARD, - OGC_GREAT_FAIRY_REWARD, - - //Temple of Time - SHEIK_AT_TEMPLE, - TOT_LIGHT_ARROWS_CUTSCENE, - - //Kakariko - SHEIK_IN_KAKARIKO, - KAK_REDEAD_GROTTO_CHEST, - KAK_OPEN_GROTTO_CHEST, - KAK_10_GOLD_SKULLTULA_REWARD, - KAK_20_GOLD_SKULLTULA_REWARD, - KAK_30_GOLD_SKULLTULA_REWARD, - KAK_40_GOLD_SKULLTULA_REWARD, - KAK_50_GOLD_SKULLTULA_REWARD, - KAK_100_GOLD_SKULLTULA_REWARD, - KAK_MAN_ON_ROOF, - KAK_SHOOTING_GALLERY_REWARD, - KAK_TRADE_ODD_MUSHROOM, - KAK_GRANNYS_SHOP, - KAK_ANJU_AS_CHILD, - KAK_ANJU_AS_ADULT, - KAK_TRADE_POCKET_CUCCO, - KAK_IMPAS_HOUSE_FREESTANDING_POH, - KAK_WINDMILL_FREESTANDING_POH, - SONG_FROM_WINDMILL, - KAK_IMPAS_HOUSE_COW, - - //Kakariko Shops - KAK_POTION_SHOP_ITEM_1, - KAK_POTION_SHOP_ITEM_2, - KAK_POTION_SHOP_ITEM_3, - KAK_POTION_SHOP_ITEM_4, - KAK_POTION_SHOP_ITEM_5, - KAK_POTION_SHOP_ITEM_6, - KAK_POTION_SHOP_ITEM_7, - KAK_POTION_SHOP_ITEM_8, - KAK_BAZAAR_ITEM_1, - KAK_BAZAAR_ITEM_2, - KAK_BAZAAR_ITEM_3, - KAK_BAZAAR_ITEM_4, - KAK_BAZAAR_ITEM_5, - KAK_BAZAAR_ITEM_6, - KAK_BAZAAR_ITEM_7, - KAK_BAZAAR_ITEM_8, - - //Graveyard - GRAVEYARD_HOOKSHOT_CHEST, - GRAVEYARD_SHIELD_GRAVE_CHEST, - GRAVEYARD_HEART_PIECE_GRAVE_CHEST, - GRAVEYARD_COMPOSERS_GRAVE_CHEST, - SONG_FROM_COMPOSERS_GRAVE, - GRAVEYARD_FREESTANDING_POH, - GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, - GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, - - //Death Mountain Trail - DMT_CHEST, - DMT_STORMS_GROTTO_CHEST, - DMT_TRADE_BROKEN_SWORD, - DMT_TRADE_EYEDROPS, - DMT_TRADE_CLAIM_CHECK, - DMT_GREAT_FAIRY_REWARD, - DMT_FREESTANDING_POH, - DMT_COW_GROTTO_COW, - - //Goron City - GC_MAZE_LEFT_CHEST, - GC_MAZE_CENTER_CHEST, - GC_MAZE_RIGHT_CHEST, - GC_ROLLING_GORON_AS_CHILD, - GC_ROLLING_GORON_AS_ADULT, - GC_DARUNIAS_JOY, - GC_POT_FREESTANDING_POH, - GC_DEKU_SCRUB_GROTTO_LEFT, - GC_DEKU_SCRUB_GROTTO_RIGHT, - GC_DEKU_SCRUB_GROTTO_CENTER, - GC_MEDIGORON, - - //Goron City Shop - GC_SHOP_ITEM_1, - GC_SHOP_ITEM_2, - GC_SHOP_ITEM_3, - GC_SHOP_ITEM_4, - GC_SHOP_ITEM_5, - GC_SHOP_ITEM_6, - GC_SHOP_ITEM_7, - GC_SHOP_ITEM_8, - - //Death Mountain - DMC_UPPER_GROTTO_CHEST, - DMC_WALL_FREESTANDING_POH, - DMC_VOLCANO_FREESTANDING_POH, - SHEIK_IN_CRATER, - DMC_DEKU_SCRUB, - DMC_GREAT_FAIRY_REWARD, - DMC_DEKU_SCRUB_GROTTO_LEFT, - DMC_DEKU_SCRUB_GROTTO_RIGHT, - DMC_DEKU_SCRUB_GROTTO_CENTER, - - //Zoras River - ZR_OPEN_GROTTO_CHEST, - ZR_MAGIC_BEAN_SALESMAN, - ZR_FROGS_ZELDAS_LULLABY, - ZR_FROGS_EPONAS_SONG, - ZR_FROGS_SARIAS_SONG, - ZR_FROGS_SUNS_SONG, - ZR_FROGS_SONG_OF_TIME, - ZR_FROGS_IN_THE_RAIN, - ZR_FROGS_OCARINA_GAME, - ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, - ZR_NEAR_DOMAIN_FREESTANDING_POH, - ZR_DEKU_SCRUB_GROTTO_REAR, - ZR_DEKU_SCRUB_GROTTO_FRONT, - - //Zoras Domain - ZD_CHEST, - ZD_DIVING_MINIGAME, - ZD_KING_ZORA_THAWED, - ZD_TRADE_PRESCRIPTION, - - //Zora's Domain Shop - ZD_SHOP_ITEM_1, - ZD_SHOP_ITEM_2, - ZD_SHOP_ITEM_3, - ZD_SHOP_ITEM_4, - ZD_SHOP_ITEM_5, - ZD_SHOP_ITEM_6, - ZD_SHOP_ITEM_7, - ZD_SHOP_ITEM_8, - - //Zoras Fountain - ZF_ICEBERG_FREESTANDING_POH, - ZF_BOTTOM_FREESTANDING_POH, - ZF_GREAT_FAIRY_REWARD, - - //Lon Lon Ranch - SONG_FROM_MALON, - LLR_TALONS_CHICKENS, - LLR_FREESTANDING_POH, - LLR_DEKU_SCRUB_GROTTO_LEFT, - LLR_DEKU_SCRUB_GROTTO_RIGHT, - LLR_DEKU_SCRUB_GROTTO_CENTER, - LLR_STABLES_LEFT_COW, - LLR_STABLES_RIGHT_COW, - LLR_TOWER_LEFT_COW, - LLR_TOWER_RIGHT_COW, - - /*------------------------------- - --- GOLD SKULLTULA TOKENS --- - -------------------------------*/ - - //Overworld - KF_GS_BEAN_PATCH, - KF_GS_KNOW_IT_ALL_HOUSE, - KF_GS_HOUSE_OF_TWINS, - - LW_GS_BEAN_PATCH_NEAR_BRIDGE, - LW_GS_BEAN_PATCH_NEAR_THEATER, - LW_GS_ABOVE_THEATER, - SFM_GS, - - HF_GS_COW_GROTTO, - HF_GS_NEAR_KAK_GROTTO, - - LH_GS_BEAN_PATCH, - LH_GS_SMALL_ISLAND, - LH_GS_LAB_WALL, - LH_GS_LAB_CRATE, - LH_GS_TREE, - - GV_GS_BEAN_PATCH, - GV_GS_SMALL_BRIDGE, - GV_GS_PILLAR, - GV_GS_BEHIND_TENT, - - GF_GS_ARCHERY_RANGE, - GF_GS_TOP_FLOOR, - - WASTELAND_GS, - COLOSSUS_GS_BEAN_PATCH, - COLOSSUS_GS_HILL, - COLOSSUS_GS_TREE, - - OGC_GS, - HC_GS_STORMS_GROTTO, - HC_GS_TREE, - MARKET_GS_GUARD_HOUSE, - - KAK_GS_HOUSE_UNDER_CONSTRUCTION, - KAK_GS_SKULLTULA_HOUSE, - KAK_GS_GUARDS_HOUSE, - KAK_GS_TREE, - KAK_GS_WATCHTOWER, - KAK_GS_ABOVE_IMPAS_HOUSE, - - DMC_GS_BEAN_PATCH, - DMC_GS_CRATE, - - DMT_GS_BEAN_PATCH, - DMT_GS_NEAR_KAK, - DMT_GS_ABOVE_DODONGOS_CAVERN, - DMT_GS_FALLING_ROCKS_PATH, - - GC_GS_CENTER_PLATFORM, - GC_GS_BOULDER_MAZE, - GRAVEYARD_GS_WALL, - GRAVEYARD_GS_BEAN_PATCH, - - ZR_GS_LADDER, - ZR_GS_TREE, - ZR_GS_ABOVE_BRIDGE, - ZR_GS_NEAR_RAISED_GROTTOS, - - ZD_GS_FROZEN_WATERFALL, - ZF_GS_ABOVE_THE_LOG, - ZF_GS_HIDDEN_CAVE, - ZF_GS_TREE, - - LLR_GS_BACK_WALL, - LLR_GS_RAIN_SHED, - LLR_GS_HOUSE_WINDOW, - LLR_GS_TREE, -}; - -ItemLocation* Location(uint32_t locKey) { - return &(locationTable[locKey]); -} - -ItemLocation* Location(RandomizerCheck rc) { - return &(locationTable[locationLookupTable[rc]]); -} - -std::vector allLocations = {}; -std::vector everyPossibleLocation = {}; - -//set of overrides to write to the patch -std::set overrides = {}; -std::unordered_map iceTrapModels = {}; - -std::vector> playthroughLocations; -std::vector wothLocations; -bool playthroughBeatable = false; -bool allLocationsReachable = false; -bool showItemProgress = false; - -uint16_t itemsPlaced = 0; - -void AddLocation(uint32_t loc, std::vector* destination = &allLocations) { - destination->push_back(loc); -} - -template -void AddLocations(const Container& locations, std::vector* destination = &allLocations) { - destination->insert(destination->end(), std::cbegin(locations), std::cend(locations)); -} - -//sort through Vanilla and MQ dungeon locations -void GenerateLocationPool() { - - allLocations.clear(); - AddLocation(LINKS_POCKET); - if (Settings::TriforceHunt.Is(TRIFORCE_HUNT_ON)) { - AddLocation(TRIFORCE_COMPLETED); - } - AddLocations(overworldLocations); - - for (auto dungeon : Dungeon::dungeonList) { - AddLocations(dungeon->GetDungeonLocations()); - } -} - -void PlaceItemInLocation(uint32_t locKey, uint32_t item, bool applyEffectImmediately /*= false*/, bool setHidden /*= false*/) { - auto loc = Location(locKey); - SPDLOG_DEBUG("\n"); - SPDLOG_DEBUG(ItemTable(item).GetName().GetEnglish()); - SPDLOG_DEBUG(" placed at "); - SPDLOG_DEBUG(loc->GetName()); - SPDLOG_DEBUG("\n\n"); - - if (applyEffectImmediately || Settings::Logic.Is(LOGIC_NONE) || Settings::Logic.Is(LOGIC_VANILLA)) { - ItemTable(item).ApplyEffect(); - } - - itemsPlaced++; - if (showItemProgress) { - double completion = (double) itemsPlaced / (double)(allLocations.size() + dungeonRewardLocations.size()); - std::string message = "\x1b[8;10HPlacing Items."; - message += completion > 0.25 ? "." : " "; - message += completion > 0.50 ? "." : " "; - printf("%s", message.c_str()); - } - - //If we're placing a non-shop item in a shop location, we want to record it for custom messages - if (ItemTable(item).GetItemType() != ITEMTYPE_SHOP && loc->IsCategory(Category::cShop)) { - int index = TransformShopIndex(GetShopIndex(locKey)); - NonShopItems[index].Name = ItemTable(item).GetName(); - NonShopItems[index].Repurchaseable = ItemTable(item).GetItemType() == ITEMTYPE_REFILL || ItemTable(item).GetHintKey() == PROGRESSIVE_BOMBCHUS; - } - - loc->SetPlacedItem(item); - if (setHidden) { - loc->SetHidden(true); - } -} - -std::vector GetLocations(const std::vector& locationPool, Category categoryInclude, Category categoryExclude /*= Category::cNull*/) { - std::vector locationsInCategory; - for (uint32_t locKey : locationPool) { - if (Location(locKey)->IsCategory(categoryInclude) && !Location(locKey)->IsCategory(categoryExclude)) { - locationsInCategory.push_back(locKey); - } - } - return locationsInCategory; -} - -void LocationReset() { - for (uint32_t il : allLocations) { - Location(il)->RemoveFromPool(); - } - - for (uint32_t il : dungeonRewardLocations) { - Location(il)->RemoveFromPool(); - } - - for (uint32_t il : gossipStoneLocations) { - Location(il)->RemoveFromPool(); - } - - Location(GANONDORF_HINT)->RemoveFromPool(); -} - -void ItemReset() { - for (uint32_t il : allLocations) { - Location(il)->ResetVariables(); - } - - for (uint32_t il : dungeonRewardLocations) { - Location(il)->ResetVariables(); - } - - itemsPlaced = 0; -} - -void HintReset() { - for (uint32_t il : gossipStoneLocations) { - Location(il)->ResetVariables(); - } -} - -//Fills everyPossibleLocation and creates an exclusion option for each location. -//everyPossibleLocation is used in the menu to lock/hide excluding locations -void AddExcludedOptions() { - AddLocations(overworldLocations, &everyPossibleLocation); - - for (auto dungeon : Dungeon::dungeonList) { - AddLocations(dungeon->GetEveryLocation(), &everyPossibleLocation); - } - - for (uint32_t il: everyPossibleLocation) { - Location(il)->AddExcludeOption(); - } -} - -void CreateItemOverrides() { - SPDLOG_DEBUG("NOW CREATING OVERRIDES\n\n"); - for (uint32_t locKey : allLocations) { - auto loc = Location(locKey); - ItemOverride_Value val = ItemTable(loc->GetPlaceduint32_t()).Value(); - // If this is an ice trap, store the disguise model in iceTrapModels - if (loc->GetPlaceduint32_t() == ICE_TRAP) { - iceTrapModels[loc->GetRandomizerCheck()] = val.looksLikeItemId; - // If this is ice trap is in a shop, change the name based on what the model will look like - if (loc->IsCategory(Category::cShop)) { - NonShopItems[TransformShopIndex(GetShopIndex(locKey))].Name = GetIceTrapName(val.looksLikeItemId); - } - } - overrides.insert({ - .key = loc->Key(), - .value = val, - }); - SPDLOG_DEBUG("\tScene: "); - SPDLOG_DEBUG(std::to_string(loc->Key().scene)); - SPDLOG_DEBUG("\tType: "); - SPDLOG_DEBUG(std::to_string(loc->Key().type)); - SPDLOG_DEBUG("\t"); - SPDLOG_DEBUG(loc->GetName()); - SPDLOG_DEBUG(": "); - SPDLOG_DEBUG(loc->GetPlacedItemName().GetEnglish()); - SPDLOG_DEBUG("\n"); - } - SPDLOG_DEBUG("Overrides Created: "); - SPDLOG_DEBUG(std::to_string(overrides.size())); -} diff --git a/soh/soh/Enhancements/randomizer/3drando/item_location.hpp b/soh/soh/Enhancements/randomizer/3drando/item_location.hpp deleted file mode 100644 index e900ab941..000000000 --- a/soh/soh/Enhancements/randomizer/3drando/item_location.hpp +++ /dev/null @@ -1,529 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include "spoiler_log.hpp" -#include "item_list.hpp" -#include "../randomizerTypes.h" - -enum ItemOverride_Type { - OVR_BASE_ITEM = 0, - OVR_CHEST = 1, - OVR_COLLECTABLE = 2, - OVR_SKULL = 3, - OVR_GROTTO_SCRUB = 4, - OVR_DELAYED = 5, - OVR_TEMPLE = 6, -}; - -typedef enum { - DUNGEON_DEKU_TREE = 0, - DUNGEON_DODONGOS_CAVERN, - DUNGEON_JABUJABUS_BELLY, - DUNGEON_FOREST_TEMPLE, - DUNGEON_FIRE_TEMPLE, - DUNGEON_WATER_TEMPLE, - DUNGEON_SPIRIT_TEMPLE, - DUNGEON_SHADOW_TEMPLE, - DUNGEON_BOTTOM_OF_THE_WELL, - DUNGEON_ICE_CAVERN, - DUNGEON_GANONS_CASTLE_SECOND_PART, - DUNGEON_GERUDO_TRAINING_GROUNDS, - DUNGEON_GERUDO_FORTRESS, - DUNGEON_GANONS_CASTLE_FIRST_PART, - DUNGEON_GANONS_CASTLE_FLOOR_BENEATH_BOSS_CHAMBER, - DUNGEON_GANONS_CASTLE_CRUMBLING, - DUNGEON_TREASURE_CHEST_SHOP, - DUNGEON_DEKU_TREE_BOSS_ROOM, - DUNGEON_DODONGOS_CAVERN_BOSS_ROOM, - DUNGEON_JABUJABUS_BELLY_BOSS_ROOM, -} DungeonId; - -typedef union ItemOverride_Key { - uint32_t all; - struct { - char pad_; - uint8_t scene; - uint8_t type; - }; -} ItemOverride_Key; - -typedef union ItemOverride_Value { - uint32_t all; - struct { - uint16_t itemId; - uint8_t player; - uint8_t looksLikeItemId; - }; -} ItemOverride_Value; - -typedef struct ItemOverride { - ItemOverride_Key key; - ItemOverride_Value value; -} ItemOverride; - -class Entrance; - -enum class ItemLocationType { - Base, - Chest, - Collectable, - GSToken, - GrottoScrub, - Delayed, - TempleReward, - HintStone, - OtherHint, -}; - -class SpoilerCollectionCheck { - public: - SpoilerCollectionCheckType type = SpoilerCollectionCheckType::SPOILER_CHK_NONE; - uint8_t scene = 0; - uint8_t flag = 0; - - SpoilerCollectionCheck() {} - SpoilerCollectionCheck(SpoilerCollectionCheckType type_, uint8_t scene_, uint8_t flag_) : type(type_), scene(scene_), flag(flag_) {} - - static auto None() { - return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_NONE, 0x00, 0x00); - } - - static auto AlwaysCollected() { - return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_ALWAYS_COLLECTED, 0x00, 0x00); - } - - static auto ItemGetInf(uint8_t slot) { - return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_ITEM_GET_INF, 0x00, slot); - } - - static auto EventChkInf(uint8_t flag) { - return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_EVENT_CHK_INF, 0xFF, flag); - } - - static auto InfTable(uint8_t offset, uint8_t bit) { - return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_INF_TABLE, offset, bit); - } - - static auto Collectable(uint8_t scene, uint8_t flag) { - return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_COLLECTABLE, scene, flag); - } - - static auto Chest(uint8_t scene, uint8_t flag) { - return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_CHEST, scene, flag); - } - - static auto Cow() { - return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_COW, 0x00, 0x00); - } - - static auto Fishing() { - return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_MINIGAME, 0x00, 0x00); - } - - static auto Scrub() { - return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_SCRUB, 0x00, 0x00); - } - - static auto GerudoToken() { - return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_GERUDO_MEMBERSHIP_CARD, 0x00, 0x00); - } - - static auto BigPoePoints() { - return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_POE_POINTS, 0x00, 0x00); - } - - static auto Gravedigger(uint8_t scene, uint8_t flag) { - return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_GRAVEDIGGER, scene, flag); - } - - static auto ShopItem() { - return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_SHOP_ITEM, 0x00, 0x00); - } - - static auto MagicBeans() { - return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_MAGIC_BEANS, 0x00, 0x00); - } - - static auto Merchant() { - return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_MERCHANT, 0x00, 0x00); - } - - static auto RandomizerInf() { - return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_RANDOMIZER_INF, 0x00, 0x00); - } -}; - -class ItemLocation { -public: - ItemLocation() = default; - ItemLocation(RandomizerCheck rc_, uint8_t scene_, ItemLocationType type_, std::string name_, uint32_t hintKey_, uint32_t vanillaItem_, std::vector categories_, uint16_t price_ = 0, SpoilerCollectionCheck collectionCheck_ = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup_ = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) - : rc(rc_), scene(scene_), type(type_), name(std::move(name_)), hintKey(hintKey_), vanillaItem(vanillaItem_), categories(std::move(categories_)), price(price_), collectionCheck(collectionCheck_), collectionCheckGroup(collectionCheckGroup_) {} - - ItemOverride_Key Key() const { - ItemOverride_Key key; - key.all = 0; - - key.scene = scene; - key.type = static_cast(type); //TODO make sure these match up - return key; - } - - RandomizerCheck GetRandomizerCheck() const { - return rc; - } - - SpoilerCollectionCheck GetCollectionCheck() const { - return collectionCheck; - } - - SpoilerCollectionCheckGroup GetCollectionCheckGroup() const { - return collectionCheckGroup; - } - - uint8_t GetScene() const { - return scene; - } - - bool IsAddedToPool() const { - return addedToPool; - } - - void AddToPool() { - addedToPool = true; - } - - uint32_t GetHintKey() const { - return hintKey; - } - - void RemoveFromPool() { - addedToPool = false; - } - - const std::string& GetName() const { - return name; - } - - const Text& GetPlacedItemName() const { - return ItemTable(placedItem).GetName(); - } - - const Item& GetPlacedItem() const { - return ItemTable(placedItem); - } - - uint32_t GetPlacedItemKey() const { - return placedItem; - } - - uint32_t GetPlaceduint32_t() const { - return placedItem; - } - - void SetPlacedItem(const uint32_t item) { - placedItem = item; - SetPrice(ItemTable(placedItem).GetPrice()); - } - - //Saves an item to be set as placedItem later - void SetDelayedItem(const uint32_t item) { - delayedItem = item; - } - - //Place the vanilla item in this location - void PlaceVanillaItem() { - placedItem = vanillaItem; - } - - void ApplyPlacedItemEffect() { - ItemTable(placedItem).ApplyEffect(); - } - - //Set placedItem as item saved in SetDelayedItem - void SaveDelayedItem() { - placedItem = delayedItem; - delayedItem = NONE; - } - - uint16_t GetPrice() const { - if (ItemTable(placedItem).GetItemType() == ITEMTYPE_SHOP) { - return ItemTable(placedItem).GetPrice(); - } - return price; - } - - void SetPrice(uint16_t price_) { - //don't override price if the price was set for shopsanity/scrubsanity - if (hasShopsanityPrice || hasScrubsanityPrice) { - return; - } - price = price_; - } - - void SetShopsanityPrice(uint16_t price_) { - price = price_; - hasShopsanityPrice = true; - } - - void SetScrubsanityPrice(uint16_t price_) { - price = price_; - hasScrubsanityPrice = true; - } - - bool HasShopsanityPrice() const { - return hasShopsanityPrice; - } - - bool HasScrubsanityPrice() const { - return hasScrubsanityPrice; - } - - bool IsExcluded() const { - return excludedOption.Value(); - } - - bool IsCategory(Category category) const { - return std::any_of(categories.begin(), categories.end(), - [category](auto entry) { return entry == category; }); - } - - bool IsDungeon() const { - return (type != ItemLocationType::GSToken && (scene < 0x0E || (scene > 0x10 && scene < 0x1A))) || (type == ItemLocationType::GSToken && scene < 0x0A); - } - - bool IsOverworld() const { - return !IsDungeon(); - } - - bool IsShop() const { - return (scene >= 0x2C && scene <= 0x32); - } - - Option * GetExcludedOption() { - return &excludedOption; - } - - uint32_t Getuint32_t() const { - return hintKey; - } - - const HintText& GetHint() const { - return Hint(hintKey); - } - - bool IsHintedAt() const { - return hintedAt; - } - - void SetAsHinted() { - hintedAt = true; - } - - bool IsHidden() const { - return hidden; - } - - void SetHidden(const bool hidden_) { - hidden = hidden_; - } - - bool IsHintable() const { - return isHintable; - } - - void SetHintedLocation(uint32_t location) { - hintedLocation = location; - } - - uint32_t GetHintedLocation() { - return hintedLocation; - } - - void SetHintType(HintType type) { - hintType = type; - } - - HintType GetHintType() { - return hintType; - } - - void SetHintedRegion (std::string region) { - hintedRegion = region; - } - - std::string GetHintedRegion() { - return hintedRegion; - } - - void SetAsHintable() { - isHintable = true; - } - - void SetParentRegion(uint32_t region) { - parentRegion = region; - } - - uint32_t GetParentRegionKey() const { - return parentRegion; - } - - void AddExcludeOption() { - //add option to forbid any location from progress items - if (name.length() < 23) { - excludedOption = Option::Bool(name, {"Include", "Exclude"}); - } else { - //insert a newline character if the text is too long for one row - size_t lastSpace = name.rfind(' ', 23); - std::string settingText = name; - settingText.replace(lastSpace, 1, "\n "); - - excludedOption = Option::Bool(settingText, {"Include", "Exclude"}); - } - - // RANDOTODO: this without string compares and loops - bool alreadyAdded = false; - for(const Option* location : Settings::excludeLocationsOptionsVector[collectionCheckGroup]) { - if (location->GetName() == excludedOption.GetName()) { - alreadyAdded = true; - } - } - if (!alreadyAdded) { - Settings::excludeLocationsOptionsVector[collectionCheckGroup].push_back(&excludedOption); - } - } - - static auto Base(RandomizerCheck rc, uint8_t scene, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { - return ItemLocation{rc, scene, ItemLocationType::Base, std::move(name), hintKey, vanillaItem, std::move(categories), 0, collectionCheck, collectionCheckGroup}; - } - - static auto Chest(RandomizerCheck rc, uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector&& categories, SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { - return ItemLocation{rc, scene, ItemLocationType::Chest, std::move(name), hintKey, vanillaItem, std::move(categories), 0, SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_CHEST, scene, flag), collectionCheckGroup}; - } - - static auto Chest(RandomizerCheck rc, uint8_t scene, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck, SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { - return ItemLocation{rc, scene, ItemLocationType::Chest, std::move(name), hintKey, vanillaItem, std::move(categories), 0, collectionCheck, collectionCheckGroup}; - } - - static auto Collectable(RandomizerCheck rc, uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector&& categories, SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { - return ItemLocation{rc, scene, ItemLocationType::Collectable, std::move(name), hintKey, vanillaItem, std::move(categories), 0, SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_COLLECTABLE, scene, flag), collectionCheckGroup}; - } - - static auto Collectable(RandomizerCheck rc, uint8_t scene, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck, SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { - return ItemLocation{rc, scene, ItemLocationType::Collectable, std::move(name), hintKey, vanillaItem, std::move(categories), 0, collectionCheck, collectionCheckGroup}; - } - - static auto GSToken(RandomizerCheck rc, uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, std::vector&& categories, SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { - return ItemLocation{rc, scene, ItemLocationType::GSToken, std::move(name), hintKey, GOLD_SKULLTULA_TOKEN, std::move(categories), 0, SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_GOLD_SKULLTULA, scene, flag), collectionCheckGroup}; - } - - static auto GrottoScrub(RandomizerCheck rc, uint8_t scene, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { - return ItemLocation{rc, scene, ItemLocationType::GrottoScrub, std::move(name), hintKey, vanillaItem, std::move(categories), 0, collectionCheck, collectionCheckGroup}; - } - - static auto Delayed(RandomizerCheck rc, uint8_t scene, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { - return ItemLocation{rc, scene, ItemLocationType::Delayed, std::move(name), hintKey, vanillaItem, std::move(categories), 0, collectionCheck, collectionCheckGroup}; - } - - static auto Reward(RandomizerCheck rc, uint8_t scene, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { - return ItemLocation{rc, scene, ItemLocationType::TempleReward, std::move(name), hintKey, vanillaItem, std::move(categories), 0, collectionCheck, collectionCheckGroup}; - } - - static auto OtherHint(RandomizerCheck rc, std::string&& name) { - return ItemLocation{rc, 0, ItemLocationType::OtherHint, std::move(name), NONE, NONE, {}}; - } - - static auto HintStone(RandomizerCheck rc, std::string&& name) { - return ItemLocation{rc, 0, ItemLocationType::HintStone, std::move(name), NONE, NONE, {}}; - } - - void ResetVariables() { - checked = false; - addedToPool = false; - placedItem = NONE; - delayedItem = NONE; - hintedAt = false; - isHintable = false; - price = 0; - hasShopsanityPrice = false; - hasScrubsanityPrice = false; - hidden = false; - } - -private: - RandomizerCheck rc; - uint8_t scene; - ItemLocationType type; - bool checked = false; - - std::string name; - uint32_t hintKey = NONE; - uint32_t vanillaItem = NONE; - bool hintedAt = false; - std::vector categories; - bool addedToPool = false; - uint32_t placedItem = NONE; - uint32_t hintedLocation = NONE; - HintType hintType; - std::string hintedRegion; - uint32_t delayedItem = NONE; - Option excludedOption = Option::Bool(name, {"Include", "Exclude"}); - uint16_t price = 0; - SpoilerCollectionCheck collectionCheck; - SpoilerCollectionCheckGroup collectionCheckGroup; - bool isHintable = false; - uint32_t parentRegion = NONE; - bool hasShopsanityPrice = false; - bool hasScrubsanityPrice = false; - bool hidden = false; -}; - -class ItemOverride_Compare { -public: - bool operator()(ItemOverride lhs, ItemOverride rhs) const { - return lhs.key.all < rhs.key.all; - } -}; - -void LocationTable_Init(); - -ItemLocation* Location(uint32_t locKey); -ItemLocation* Location(RandomizerCheck rc); - -extern std::vector> ShopLocationLists; - -extern std::vector ScrubLocations; - -extern std::vector gossipStoneLocations; - -extern std::vector dungeonRewardLocations; -extern std::vector overworldLocations; -extern std::vector allLocations; -extern std::vector everyPossibleLocation; - -//set of overrides to write to the patch -extern std::set overrides; -extern std::unordered_map iceTrapModels; - -extern std::vector> playthroughLocations; -extern std::vector wothLocations; -extern bool playthroughBeatable; -extern bool allLocationsReachable; -extern bool showItemProgress; - -extern uint16_t itemsPlaced; - -void GenerateLocationPool(); -void PlaceItemInLocation(uint32_t loc, uint32_t item, bool applyEffectImmediately = false, bool setHidden = false); -std::vector GetLocations(const std::vector& locationPool, Category categoryInclude, - Category categoryExclude = Category::cNull); -void LocationReset(); -void ItemReset(); -void HintReset(); -void AddExcludedOptions(); -void CreateItemOverrides(); diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index 485fc4154..eb3e9246d 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -2,8 +2,8 @@ #include "dungeon.hpp" #include "fill.hpp" -#include "item_list.hpp" -#include "item_location.hpp" +#include "../static_data.h" +#include "../context.h" #include "pool_functions.hpp" #include "random.hpp" #include "settings.hpp" @@ -15,424 +15,424 @@ using namespace Settings; using namespace Dungeon; -std::vector ItemPool = {}; -std::vector PendingJunkPool = {}; +std::vector ItemPool = {}; +std::vector PendingJunkPool = {}; std::vector IceTrapModels = {}; -const std::array dungeonRewards = { - KOKIRI_EMERALD, - GORON_RUBY, - ZORA_SAPPHIRE, - FOREST_MEDALLION, - FIRE_MEDALLION, - WATER_MEDALLION, - SPIRIT_MEDALLION, - SHADOW_MEDALLION, - LIGHT_MEDALLION, +const std::array dungeonRewards = { + RG_KOKIRI_EMERALD, + RG_GORON_RUBY, + RG_ZORA_SAPPHIRE, + RG_FOREST_MEDALLION, + RG_FIRE_MEDALLION, + RG_WATER_MEDALLION, + RG_SPIRIT_MEDALLION, + RG_SHADOW_MEDALLION, + RG_LIGHT_MEDALLION, }; -const std::array JunkPoolItems = { - BOMBS_5, - BOMBS_10, - BOMBS_20, - DEKU_NUTS_5, - DEKU_STICK_1, - DEKU_SEEDS_30, - RECOVERY_HEART, - ARROWS_5, - ARROWS_10, - ARROWS_30, - BLUE_RUPEE, - RED_RUPEE, - PURPLE_RUPEE, - HUGE_RUPEE, - DEKU_NUTS_10, - ICE_TRAP, +const std::array JunkPoolItems = { + RG_BOMBS_5, + RG_BOMBS_10, + RG_BOMBS_20, + RG_DEKU_NUTS_5, + RG_DEKU_STICK_1, + RG_DEKU_SEEDS_30, + RG_RECOVERY_HEART, + RG_ARROWS_5, + RG_ARROWS_10, + RG_ARROWS_30, + RG_BLUE_RUPEE, + RG_RED_RUPEE, + RG_PURPLE_RUPEE, + RG_HUGE_RUPEE, + RG_DEKU_NUTS_10, + RG_ICE_TRAP, }; -const std::array alwaysItems = { - BIGGORON_SWORD, - BOOMERANG, - LENS_OF_TRUTH, - MEGATON_HAMMER, - IRON_BOOTS, - GORON_TUNIC, - ZORA_TUNIC, - HOVER_BOOTS, - MIRROR_SHIELD, - STONE_OF_AGONY, - FIRE_ARROWS, - ICE_ARROWS, - LIGHT_ARROWS, - DINS_FIRE, - FARORES_WIND, - NAYRUS_LOVE, - GREG_RUPEE, - PROGRESSIVE_HOOKSHOT, //2 progressive hookshots - PROGRESSIVE_HOOKSHOT, - DEKU_SHIELD, - HYLIAN_SHIELD, - PROGRESSIVE_STRENGTH, //3 progressive strength upgrades - PROGRESSIVE_STRENGTH, - PROGRESSIVE_STRENGTH, - PROGRESSIVE_SCALE, //2 progressive scales - PROGRESSIVE_SCALE, - PROGRESSIVE_BOW, //3 progressive Bows - PROGRESSIVE_BOW, - PROGRESSIVE_BOW, - PROGRESSIVE_SLINGSHOT, //3 progressive bullet bags - PROGRESSIVE_SLINGSHOT, - PROGRESSIVE_SLINGSHOT, - PROGRESSIVE_BOMB_BAG, //3 progressive bomb bags - PROGRESSIVE_BOMB_BAG, - PROGRESSIVE_BOMB_BAG, - PROGRESSIVE_WALLET, //2 progressive wallets - PROGRESSIVE_WALLET, - PROGRESSIVE_MAGIC_METER, //2 progressive magic meters - PROGRESSIVE_MAGIC_METER, - DOUBLE_DEFENSE, - PROGRESSIVE_STICK_UPGRADE, //2 stick upgrades - PROGRESSIVE_STICK_UPGRADE, - PROGRESSIVE_NUT_UPGRADE, //2 nut upgrades - PROGRESSIVE_NUT_UPGRADE, - RECOVERY_HEART, //6 recovery hearts - RECOVERY_HEART, - RECOVERY_HEART, - RECOVERY_HEART, - RECOVERY_HEART, - RECOVERY_HEART, - BOMBS_5, //2 - BOMBS_5, - BOMBS_10, - BOMBS_20, - ARROWS_5, - ARROWS_10, //5 - ARROWS_10, - ARROWS_10, - TREASURE_GAME_HEART, +const std::array alwaysItems = { + RG_BIGGORON_SWORD, + RG_BOOMERANG, + RG_LENS_OF_TRUTH, + RG_MEGATON_HAMMER, + RG_IRON_BOOTS, + RG_GORON_TUNIC, + RG_ZORA_TUNIC, + RG_HOVER_BOOTS, + RG_MIRROR_SHIELD, + RG_STONE_OF_AGONY, + RG_FIRE_ARROWS, + RG_ICE_ARROWS, + RG_LIGHT_ARROWS, + RG_DINS_FIRE, + RG_FARORES_WIND, + RG_NAYRUS_LOVE, + RG_GREG_RUPEE, + RG_PROGRESSIVE_HOOKSHOT, //2 progressive hookshots + RG_PROGRESSIVE_HOOKSHOT, + RG_DEKU_SHIELD, + RG_HYLIAN_SHIELD, + RG_PROGRESSIVE_STRENGTH, //3 progressive strength upgrades + RG_PROGRESSIVE_STRENGTH, + RG_PROGRESSIVE_STRENGTH, + RG_PROGRESSIVE_SCALE, //2 progressive scales + RG_PROGRESSIVE_SCALE, + RG_PROGRESSIVE_BOW, //3 progressive Bows + RG_PROGRESSIVE_BOW, + RG_PROGRESSIVE_BOW, + RG_PROGRESSIVE_SLINGSHOT, //3 progressive bullet bags + RG_PROGRESSIVE_SLINGSHOT, + RG_PROGRESSIVE_SLINGSHOT, + RG_PROGRESSIVE_BOMB_BAG, //3 progressive bomb bags + RG_PROGRESSIVE_BOMB_BAG, + RG_PROGRESSIVE_BOMB_BAG, + RG_PROGRESSIVE_WALLET, //2 progressive wallets + RG_PROGRESSIVE_WALLET, + RG_PROGRESSIVE_MAGIC_METER, //2 progressive magic meters + RG_PROGRESSIVE_MAGIC_METER, + RG_DOUBLE_DEFENSE, + RG_PROGRESSIVE_STICK_UPGRADE, //2 stick upgrades + RG_PROGRESSIVE_STICK_UPGRADE, + RG_PROGRESSIVE_NUT_UPGRADE, //2 nut upgrades + RG_PROGRESSIVE_NUT_UPGRADE, + RG_RECOVERY_HEART, //6 recovery hearts + RG_RECOVERY_HEART, + RG_RECOVERY_HEART, + RG_RECOVERY_HEART, + RG_RECOVERY_HEART, + RG_RECOVERY_HEART, + RG_BOMBS_5, //2 + RG_BOMBS_5, + RG_BOMBS_10, + RG_BOMBS_20, + RG_ARROWS_5, + RG_ARROWS_10, //5 + RG_ARROWS_10, + RG_ARROWS_10, + RG_TREASURE_GAME_HEART, }; -const std::array easyItems = { - BIGGORON_SWORD, - KOKIRI_SWORD, - BOOMERANG, - LENS_OF_TRUTH, - MEGATON_HAMMER, - IRON_BOOTS, - GORON_TUNIC, - ZORA_TUNIC, - HOVER_BOOTS, - MIRROR_SHIELD, - FIRE_ARROWS, - LIGHT_ARROWS, - DINS_FIRE, - PROGRESSIVE_HOOKSHOT, - PROGRESSIVE_STRENGTH, - PROGRESSIVE_SCALE, - PROGRESSIVE_WALLET, - PROGRESSIVE_MAGIC_METER, - PROGRESSIVE_STICK_UPGRADE, - PROGRESSIVE_NUT_UPGRADE, - PROGRESSIVE_BOW, - PROGRESSIVE_SLINGSHOT, - PROGRESSIVE_BOMB_BAG, - DOUBLE_DEFENSE, - HEART_CONTAINER, //16 Heart Containers - HEART_CONTAINER, - HEART_CONTAINER, - HEART_CONTAINER, - HEART_CONTAINER, - HEART_CONTAINER, - HEART_CONTAINER, - HEART_CONTAINER, - HEART_CONTAINER, - HEART_CONTAINER, - HEART_CONTAINER, - HEART_CONTAINER, - HEART_CONTAINER, - HEART_CONTAINER, - HEART_CONTAINER, - HEART_CONTAINER, - PIECE_OF_HEART, //3 heart pieces - PIECE_OF_HEART, - PIECE_OF_HEART, +const std::array easyItems = { + RG_BIGGORON_SWORD, + RG_KOKIRI_SWORD, + RG_BOOMERANG, + RG_LENS_OF_TRUTH, + RG_MEGATON_HAMMER, + RG_IRON_BOOTS, + RG_GORON_TUNIC, + RG_ZORA_TUNIC, + RG_HOVER_BOOTS, + RG_MIRROR_SHIELD, + RG_FIRE_ARROWS, + RG_LIGHT_ARROWS, + RG_DINS_FIRE, + RG_PROGRESSIVE_HOOKSHOT, + RG_PROGRESSIVE_STRENGTH, + RG_PROGRESSIVE_SCALE, + RG_PROGRESSIVE_WALLET, + RG_PROGRESSIVE_MAGIC_METER, + RG_PROGRESSIVE_STICK_UPGRADE, + RG_PROGRESSIVE_NUT_UPGRADE, + RG_PROGRESSIVE_BOW, + RG_PROGRESSIVE_SLINGSHOT, + RG_PROGRESSIVE_BOMB_BAG, + RG_DOUBLE_DEFENSE, + RG_HEART_CONTAINER, //16 Heart Containers + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_PIECE_OF_HEART, //3 heart pieces + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, }; -const std::array normalItems = { - PIECE_OF_HEART, //35 pieces of heart - PIECE_OF_HEART, - PIECE_OF_HEART, - PIECE_OF_HEART, - PIECE_OF_HEART, - PIECE_OF_HEART, - PIECE_OF_HEART, - PIECE_OF_HEART, - PIECE_OF_HEART, - PIECE_OF_HEART, - PIECE_OF_HEART, - PIECE_OF_HEART, - PIECE_OF_HEART, - PIECE_OF_HEART, - PIECE_OF_HEART, - PIECE_OF_HEART, - PIECE_OF_HEART, - PIECE_OF_HEART, - PIECE_OF_HEART, - PIECE_OF_HEART, - PIECE_OF_HEART, - PIECE_OF_HEART, - PIECE_OF_HEART, - PIECE_OF_HEART, - PIECE_OF_HEART, - PIECE_OF_HEART, - PIECE_OF_HEART, - PIECE_OF_HEART, - PIECE_OF_HEART, - PIECE_OF_HEART, - PIECE_OF_HEART, - PIECE_OF_HEART, - PIECE_OF_HEART, - PIECE_OF_HEART, - PIECE_OF_HEART, - HEART_CONTAINER, //8 heart containers - HEART_CONTAINER, - HEART_CONTAINER, - HEART_CONTAINER, - HEART_CONTAINER, - HEART_CONTAINER, - HEART_CONTAINER, - HEART_CONTAINER, +const std::array normalItems = { + RG_PIECE_OF_HEART, //35 pieces of heart + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_HEART_CONTAINER, //8 heart containers + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, }; -const std::array DT_Vanilla = { - RECOVERY_HEART, - RECOVERY_HEART, +const std::array DT_Vanilla = { + RG_RECOVERY_HEART, + RG_RECOVERY_HEART, }; -const std::array DT_MQ = { - DEKU_SHIELD, - DEKU_SHIELD, - PURPLE_RUPEE, +const std::array DT_MQ = { + RG_DEKU_SHIELD, + RG_DEKU_SHIELD, + RG_PURPLE_RUPEE, }; -const std::array DC_Vanilla = { - RED_RUPEE, +const std::array DC_Vanilla = { + RG_RED_RUPEE, }; -const std::array DC_MQ = { - HYLIAN_SHIELD, - BLUE_RUPEE, +const std::array DC_MQ = { + RG_HYLIAN_SHIELD, + RG_BLUE_RUPEE, }; -const std::array JB_MQ = { - DEKU_NUTS_5, - DEKU_NUTS_5, - DEKU_NUTS_5, - DEKU_NUTS_5, - RECOVERY_HEART, - DEKU_SHIELD, - DEKU_STICK_1, +const std::array JB_MQ = { + RG_DEKU_NUTS_5, + RG_DEKU_NUTS_5, + RG_DEKU_NUTS_5, + RG_DEKU_NUTS_5, + RG_RECOVERY_HEART, + RG_DEKU_SHIELD, + RG_DEKU_STICK_1, }; -const std::array FoT_Vanilla = { - RECOVERY_HEART, - ARROWS_10, - ARROWS_30, +const std::array FoT_Vanilla = { + RG_RECOVERY_HEART, + RG_ARROWS_10, + RG_ARROWS_30, }; -const std::array FoT_MQ = { - ARROWS_5, +const std::array FoT_MQ = { + RG_ARROWS_5, }; -const std::array FiT_Vanilla = { - HUGE_RUPEE, +const std::array FiT_Vanilla = { + RG_HUGE_RUPEE, }; -const std::array FiT_MQ = { - BOMBS_20, - HYLIAN_SHIELD, +const std::array FiT_MQ = { + RG_BOMBS_20, + RG_HYLIAN_SHIELD, }; -const std::array SpT_Vanilla = { - DEKU_SHIELD, - DEKU_SHIELD, - RECOVERY_HEART, - BOMBS_20, +const std::array SpT_Vanilla = { + RG_DEKU_SHIELD, + RG_DEKU_SHIELD, + RG_RECOVERY_HEART, + RG_BOMBS_20, }; -const std::array SpT_MQ = { - PURPLE_RUPEE, - PURPLE_RUPEE, - ARROWS_30, +const std::array SpT_MQ = { + RG_PURPLE_RUPEE, + RG_PURPLE_RUPEE, + RG_ARROWS_30, }; -const std::array ShT_Vanilla = { - ARROWS_30, +const std::array ShT_Vanilla = { + RG_ARROWS_30, }; -const std::array ShT_MQ = { - ARROWS_5, - ARROWS_5, - RED_RUPEE, +const std::array ShT_MQ = { + RG_ARROWS_5, + RG_ARROWS_5, + RG_RED_RUPEE, }; -const std::array BW_Vanilla = { - RECOVERY_HEART, - BOMBS_10, - HUGE_RUPEE, - DEKU_NUTS_5, - DEKU_NUTS_10, - DEKU_SHIELD, - HYLIAN_SHIELD, +const std::array BW_Vanilla = { + RG_RECOVERY_HEART, + RG_BOMBS_10, + RG_HUGE_RUPEE, + RG_DEKU_NUTS_5, + RG_DEKU_NUTS_10, + RG_DEKU_SHIELD, + RG_HYLIAN_SHIELD, }; -const std::array GTG_Vanilla = { - ARROWS_30, - ARROWS_30, - ARROWS_30, - HUGE_RUPEE, +const std::array GTG_Vanilla = { + RG_ARROWS_30, + RG_ARROWS_30, + RG_ARROWS_30, + RG_HUGE_RUPEE, }; -const std::array GTG_MQ = { - TREASURE_GAME_GREEN_RUPEE, - TREASURE_GAME_GREEN_RUPEE, - ARROWS_10, - GREEN_RUPEE, - PURPLE_RUPEE, +const std::array GTG_MQ = { + RG_TREASURE_GAME_GREEN_RUPEE, + RG_TREASURE_GAME_GREEN_RUPEE, + RG_ARROWS_10, + RG_GREEN_RUPEE, + RG_PURPLE_RUPEE, }; -const std::array GC_Vanilla = { - BLUE_RUPEE, - BLUE_RUPEE, - BLUE_RUPEE, - ARROWS_30, +const std::array GC_Vanilla = { + RG_BLUE_RUPEE, + RG_BLUE_RUPEE, + RG_BLUE_RUPEE, + RG_ARROWS_30, }; -const std::array GC_MQ = { - ARROWS_10, - ARROWS_10, - BOMBS_5, - RED_RUPEE, - RECOVERY_HEART, +const std::array GC_MQ = { + RG_ARROWS_10, + RG_ARROWS_10, + RG_BOMBS_5, + RG_RED_RUPEE, + RG_RECOVERY_HEART, }; -const std::array normalBottles = { - EMPTY_BOTTLE, - BOTTLE_WITH_MILK, - BOTTLE_WITH_RED_POTION, - BOTTLE_WITH_GREEN_POTION, - BOTTLE_WITH_BLUE_POTION, - BOTTLE_WITH_FAIRY, - BOTTLE_WITH_FISH, - BOTTLE_WITH_BUGS, - BOTTLE_WITH_POE, - BOTTLE_WITH_BIG_POE, - BOTTLE_WITH_BLUE_FIRE, +const std::array normalBottles = { + RG_EMPTY_BOTTLE, + RG_BOTTLE_WITH_MILK, + RG_BOTTLE_WITH_RED_POTION, + RG_BOTTLE_WITH_GREEN_POTION, + RG_BOTTLE_WITH_BLUE_POTION, + RG_BOTTLE_WITH_FAIRY, + RG_BOTTLE_WITH_FISH, + RG_BOTTLE_WITH_BUGS, + RG_BOTTLE_WITH_POE, + RG_BOTTLE_WITH_BIG_POE, + RG_BOTTLE_WITH_BLUE_FIRE, }; -const std::array normalRupees = { - BLUE_RUPEE, - BLUE_RUPEE, - BLUE_RUPEE, - BLUE_RUPEE, - BLUE_RUPEE, - BLUE_RUPEE, - BLUE_RUPEE, - BLUE_RUPEE, - BLUE_RUPEE, - BLUE_RUPEE, - BLUE_RUPEE, - BLUE_RUPEE, - BLUE_RUPEE, - RED_RUPEE, - RED_RUPEE, - RED_RUPEE, - RED_RUPEE, - RED_RUPEE, - PURPLE_RUPEE, - PURPLE_RUPEE, - PURPLE_RUPEE, - PURPLE_RUPEE, - PURPLE_RUPEE, - PURPLE_RUPEE, - PURPLE_RUPEE, - HUGE_RUPEE, - HUGE_RUPEE, - HUGE_RUPEE, +const std::array normalRupees = { + RG_BLUE_RUPEE, + RG_BLUE_RUPEE, + RG_BLUE_RUPEE, + RG_BLUE_RUPEE, + RG_BLUE_RUPEE, + RG_BLUE_RUPEE, + RG_BLUE_RUPEE, + RG_BLUE_RUPEE, + RG_BLUE_RUPEE, + RG_BLUE_RUPEE, + RG_BLUE_RUPEE, + RG_BLUE_RUPEE, + RG_BLUE_RUPEE, + RG_RED_RUPEE, + RG_RED_RUPEE, + RG_RED_RUPEE, + RG_RED_RUPEE, + RG_RED_RUPEE, + RG_PURPLE_RUPEE, + RG_PURPLE_RUPEE, + RG_PURPLE_RUPEE, + RG_PURPLE_RUPEE, + RG_PURPLE_RUPEE, + RG_PURPLE_RUPEE, + RG_PURPLE_RUPEE, + RG_HUGE_RUPEE, + RG_HUGE_RUPEE, + RG_HUGE_RUPEE, }; -const std::array shopsanityRupees = { - BLUE_RUPEE, - BLUE_RUPEE, - RED_RUPEE, - RED_RUPEE, - RED_RUPEE, - RED_RUPEE, - RED_RUPEE, - RED_RUPEE, - RED_RUPEE, - RED_RUPEE, - RED_RUPEE, - RED_RUPEE, - PURPLE_RUPEE, - PURPLE_RUPEE, - PURPLE_RUPEE, - PURPLE_RUPEE, - PURPLE_RUPEE, - PURPLE_RUPEE, - PURPLE_RUPEE, - PURPLE_RUPEE, - PURPLE_RUPEE, - PURPLE_RUPEE, - HUGE_RUPEE, - HUGE_RUPEE, - HUGE_RUPEE, - HUGE_RUPEE, - HUGE_RUPEE, - PROGRESSIVE_WALLET, +const std::array shopsanityRupees = { + RG_BLUE_RUPEE, + RG_BLUE_RUPEE, + RG_RED_RUPEE, + RG_RED_RUPEE, + RG_RED_RUPEE, + RG_RED_RUPEE, + RG_RED_RUPEE, + RG_RED_RUPEE, + RG_RED_RUPEE, + RG_RED_RUPEE, + RG_RED_RUPEE, + RG_RED_RUPEE, + RG_PURPLE_RUPEE, + RG_PURPLE_RUPEE, + RG_PURPLE_RUPEE, + RG_PURPLE_RUPEE, + RG_PURPLE_RUPEE, + RG_PURPLE_RUPEE, + RG_PURPLE_RUPEE, + RG_PURPLE_RUPEE, + RG_PURPLE_RUPEE, + RG_PURPLE_RUPEE, + RG_HUGE_RUPEE, + RG_HUGE_RUPEE, + RG_HUGE_RUPEE, + RG_HUGE_RUPEE, + RG_HUGE_RUPEE, + RG_PROGRESSIVE_WALLET, }; -const std::array dekuScrubItems = { - DEKU_NUTS_5, - DEKU_NUTS_5, - DEKU_NUTS_5, - DEKU_NUTS_5, - DEKU_NUTS_5, - DEKU_STICK_1, - BOMBS_5, - BOMBS_5, - BOMBS_5, - BOMBS_5, - BOMBS_5, - RECOVERY_HEART, - RECOVERY_HEART, - RECOVERY_HEART, - RECOVERY_HEART, - BLUE_RUPEE, - BLUE_RUPEE, - BLUE_RUPEE, - BLUE_RUPEE, +const std::array dekuScrubItems = { + RG_DEKU_NUTS_5, + RG_DEKU_NUTS_5, + RG_DEKU_NUTS_5, + RG_DEKU_NUTS_5, + RG_DEKU_NUTS_5, + RG_DEKU_STICK_1, + RG_BOMBS_5, + RG_BOMBS_5, + RG_BOMBS_5, + RG_BOMBS_5, + RG_BOMBS_5, + RG_RECOVERY_HEART, + RG_RECOVERY_HEART, + RG_RECOVERY_HEART, + RG_RECOVERY_HEART, + RG_BLUE_RUPEE, + RG_BLUE_RUPEE, + RG_BLUE_RUPEE, + RG_BLUE_RUPEE, }; -const std::array songList = { - ZELDAS_LULLABY, - EPONAS_SONG, - SUNS_SONG, - SARIAS_SONG, - SONG_OF_TIME, - SONG_OF_STORMS, - MINUET_OF_FOREST, - PRELUDE_OF_LIGHT, - BOLERO_OF_FIRE, - SERENADE_OF_WATER, - NOCTURNE_OF_SHADOW, - REQUIEM_OF_SPIRIT, +const std::array songList = { + RG_ZELDAS_LULLABY, + RG_EPONAS_SONG, + RG_SUNS_SONG, + RG_SARIAS_SONG, + RG_SONG_OF_TIME, + RG_SONG_OF_STORMS, + RG_MINUET_OF_FOREST, + RG_PRELUDE_OF_LIGHT, + RG_BOLERO_OF_FIRE, + RG_SERENADE_OF_WATER, + RG_NOCTURNE_OF_SHADOW, + RG_REQUIEM_OF_SPIRIT, }; -const std::array tradeItems = { - POCKET_EGG, - //POCKET_CUCCO, - COJIRO, - ODD_MUSHROOM, - POACHERS_SAW, - BROKEN_SWORD, - PRESCRIPTION, - EYEBALL_FROG, - EYEDROPS, - CLAIM_CHECK, +const std::array tradeItems = { + RG_POCKET_EGG, + //RG_POCKET_CUCCO, + RG_COJIRO, + RG_ODD_MUSHROOM, + RG_POACHERS_SAW, + RG_BROKEN_SWORD, + RG_PRESCRIPTION, + RG_EYEBALL_FROG, + RG_EYEDROPS, + RG_CLAIM_CHECK, }; -void AddItemToPool(std::vector& pool, uint32_t item, size_t count /*= 1*/) { +void AddItemToPool(std::vector& pool, RandomizerGet item, size_t count /*= 1*/) { pool.insert(pool.end(), count, item); } template -static void AddItemsToPool(std::vector& toPool, const FromPool& fromPool) { +static void AddItemsToPool(std::vector& toPool, const FromPool& fromPool) { AddElementsToPool(toPool, fromPool); } -static void AddItemToMainPool(const uint32_t item, size_t count = 1) { +static void AddItemToMainPool(const RandomizerGet item, size_t count = 1) { ItemPool.insert(ItemPool.end(), count, item); } -static void AddRandomBottle(std::vector& bottlePool) { +static void AddRandomBottle(std::vector& bottlePool) { AddItemToMainPool(RandomElement(bottlePool, true)); } -uint32_t GetJunkItem() { +RandomizerGet GetJunkItem() { if (IceTrapValue.Is(ICETRAPS_MAYHEM) || IceTrapValue.Is(ICETRAPS_ONSLAUGHT)) { - return ICE_TRAP; + return RG_ICE_TRAP; } else if (IceTrapValue.Is(ICETRAPS_EXTRA)) { return RandomElement(JunkPoolItems); } @@ -441,7 +441,7 @@ uint32_t GetJunkItem() { return JunkPoolItems[idx]; } -static uint32_t GetPendingJunkItem() { +static RandomizerGet GetPendingJunkItem() { if (PendingJunkPool.empty()) { return GetJunkItem(); } @@ -450,7 +450,7 @@ static uint32_t GetPendingJunkItem() { } //Replace junk items in the pool with pending junk -static void ReplaceMaxItem(const uint32_t itemToReplace, int max) { +static void ReplaceMaxItem(const RandomizerGet itemToReplace, int max) { int itemCount = 0; for (size_t i = 0; i < ItemPool.size(); i++) { if (ItemPool[i] == itemToReplace) { @@ -462,11 +462,12 @@ static void ReplaceMaxItem(const uint32_t itemToReplace, int max) { } } -void PlaceJunkInExcludedLocation(const uint32_t il) { +void PlaceJunkInExcludedLocation(const RandomizerCheck il) { //place a non-advancement item in this location + auto ctx = Rando::Context::GetInstance(); for (size_t i = 0; i < ItemPool.size(); i++) { - if (!ItemTable(ItemPool[i]).IsAdvancement()) { - PlaceItemInLocation(il, ItemPool[i]); + if (!Rando::StaticData::RetrieveItem(ItemPool[i]).IsAdvancement()) { + ctx->PlaceItemInLocation(il, ItemPool[i]); ItemPool.erase(ItemPool.begin() + i); return; } @@ -475,60 +476,62 @@ void PlaceJunkInExcludedLocation(const uint32_t il) { } static void PlaceVanillaDekuScrubItems() { - PlaceItemInLocation(ZR_DEKU_SCRUB_GROTTO_REAR, RED_POTION_REFILL, false, true); - PlaceItemInLocation(ZR_DEKU_SCRUB_GROTTO_FRONT, GREEN_POTION_REFILL, false, true); - PlaceItemInLocation(SFM_DEKU_SCRUB_GROTTO_REAR, RED_POTION_REFILL, false, true); - PlaceItemInLocation(SFM_DEKU_SCRUB_GROTTO_FRONT, GREEN_POTION_REFILL, false, true); - PlaceItemInLocation(LH_DEKU_SCRUB_GROTTO_LEFT, DEKU_NUTS_5, false, true); - PlaceItemInLocation(LH_DEKU_SCRUB_GROTTO_RIGHT, BOMBS_5, false, true); - PlaceItemInLocation(LH_DEKU_SCRUB_GROTTO_CENTER, DEKU_SEEDS_30, false, true); - PlaceItemInLocation(GV_DEKU_SCRUB_GROTTO_REAR, RED_POTION_REFILL, false, true); - PlaceItemInLocation(GV_DEKU_SCRUB_GROTTO_FRONT, GREEN_POTION_REFILL, false, true); - PlaceItemInLocation(LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, DEKU_NUTS_5, false, true); - PlaceItemInLocation(LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, DEKU_STICK_1, false, true); - PlaceItemInLocation(LW_DEKU_SCRUB_GROTTO_REAR, DEKU_SEEDS_30, false, true); - PlaceItemInLocation(COLOSSUS_DEKU_SCRUB_GROTTO_REAR, RED_POTION_REFILL, false, true); - PlaceItemInLocation(COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, GREEN_POTION_REFILL, false, true); - PlaceItemInLocation(DMC_DEKU_SCRUB, BOMBS_5, false, true); - PlaceItemInLocation(DMC_DEKU_SCRUB_GROTTO_LEFT, DEKU_NUTS_5, false, true); - PlaceItemInLocation(DMC_DEKU_SCRUB_GROTTO_RIGHT, BOMBS_5, false, true); - PlaceItemInLocation(DMC_DEKU_SCRUB_GROTTO_CENTER, DEKU_SEEDS_30, false, true); - PlaceItemInLocation(GC_DEKU_SCRUB_GROTTO_LEFT, DEKU_NUTS_5, false, true); - PlaceItemInLocation(GC_DEKU_SCRUB_GROTTO_RIGHT, BOMBS_5, false, true); - PlaceItemInLocation(GC_DEKU_SCRUB_GROTTO_CENTER, DEKU_SEEDS_30, false, true); - PlaceItemInLocation(LLR_DEKU_SCRUB_GROTTO_LEFT, DEKU_NUTS_5, false, true); - PlaceItemInLocation(LLR_DEKU_SCRUB_GROTTO_RIGHT, BOMBS_5, false, true); - PlaceItemInLocation(LLR_DEKU_SCRUB_GROTTO_CENTER, DEKU_SEEDS_30, false, true); + auto ctx = Rando::Context::GetInstance(); + ctx->PlaceItemInLocation(RC_ZR_DEKU_SCRUB_GROTTO_REAR, RG_RED_POTION_REFILL, false, true); + ctx->PlaceItemInLocation(RC_ZR_DEKU_SCRUB_GROTTO_FRONT, RG_GREEN_POTION_REFILL, false, true); + ctx->PlaceItemInLocation(RC_SFM_DEKU_SCRUB_GROTTO_REAR, RG_RED_POTION_REFILL, false, true); + ctx->PlaceItemInLocation(RC_SFM_DEKU_SCRUB_GROTTO_FRONT, RG_GREEN_POTION_REFILL, false, true); + ctx->PlaceItemInLocation(RC_LH_DEKU_SCRUB_GROTTO_LEFT, RG_DEKU_NUTS_5, false, true); + ctx->PlaceItemInLocation(RC_LH_DEKU_SCRUB_GROTTO_RIGHT, RG_BOMBS_5, false, true); + ctx->PlaceItemInLocation(RC_LH_DEKU_SCRUB_GROTTO_CENTER, RG_DEKU_SEEDS_30, false, true); + ctx->PlaceItemInLocation(RC_GV_DEKU_SCRUB_GROTTO_REAR, RG_RED_POTION_REFILL, false, true); + ctx->PlaceItemInLocation(RC_GV_DEKU_SCRUB_GROTTO_FRONT, RG_GREEN_POTION_REFILL, false, true); + ctx->PlaceItemInLocation(RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, RG_DEKU_NUTS_5, false, true); + ctx->PlaceItemInLocation(RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, RG_DEKU_STICK_1, false, true); + ctx->PlaceItemInLocation(RC_LW_DEKU_SCRUB_GROTTO_REAR, RG_DEKU_SEEDS_30, false, true); + ctx->PlaceItemInLocation(RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, RG_RED_POTION_REFILL, false, true); + ctx->PlaceItemInLocation(RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, RG_GREEN_POTION_REFILL, false, true); + ctx->PlaceItemInLocation(RC_DMC_DEKU_SCRUB, RG_BOMBS_5, false, true); + ctx->PlaceItemInLocation(RC_DMC_DEKU_SCRUB_GROTTO_LEFT, RG_DEKU_NUTS_5, false, true); + ctx->PlaceItemInLocation(RC_DMC_DEKU_SCRUB_GROTTO_RIGHT, RG_BOMBS_5, false, true); + ctx->PlaceItemInLocation(RC_DMC_DEKU_SCRUB_GROTTO_CENTER, RG_DEKU_SEEDS_30, false, true); + ctx->PlaceItemInLocation(RC_GC_DEKU_SCRUB_GROTTO_LEFT, RG_DEKU_NUTS_5, false, true); + ctx->PlaceItemInLocation(RC_GC_DEKU_SCRUB_GROTTO_RIGHT, RG_BOMBS_5, false, true); + ctx->PlaceItemInLocation(RC_GC_DEKU_SCRUB_GROTTO_CENTER, RG_DEKU_SEEDS_30, false, true); + ctx->PlaceItemInLocation(RC_LLR_DEKU_SCRUB_GROTTO_LEFT, RG_DEKU_NUTS_5, false, true); + ctx->PlaceItemInLocation(RC_LLR_DEKU_SCRUB_GROTTO_RIGHT, RG_BOMBS_5, false, true); + ctx->PlaceItemInLocation(RC_LLR_DEKU_SCRUB_GROTTO_CENTER, RG_DEKU_SEEDS_30, false, true); //Dungeon Scrubs if (DekuTree.IsMQ()) { - PlaceItemInLocation(DEKU_TREE_MQ_DEKU_SCRUB, DEKU_SHIELD, false, true); + ctx->PlaceItemInLocation(RC_DEKU_TREE_MQ_DEKU_SCRUB, RG_DEKU_SHIELD, false, true); } if (DodongosCavern.IsMQ()) { - PlaceItemInLocation(DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, DEKU_STICK_1, false, true); - PlaceItemInLocation(DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, DEKU_SEEDS_30, false, true); - PlaceItemInLocation(DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, DEKU_SHIELD, false, true); - PlaceItemInLocation(DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, RED_POTION_REFILL, false, true); + ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, RG_DEKU_STICK_1, false, true); + ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, RG_DEKU_SEEDS_30, false, true); + ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, RG_DEKU_SHIELD, false, true); + ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, RG_RED_POTION_REFILL, + false, true); } else { - PlaceItemInLocation(DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, DEKU_NUTS_5, false, true); - PlaceItemInLocation(DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, DEKU_STICK_1, false, true); - PlaceItemInLocation(DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, DEKU_SEEDS_30, false, true); - PlaceItemInLocation(DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, DEKU_SHIELD, false, true); + ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, RG_DEKU_NUTS_5, false, true); + ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, RG_DEKU_STICK_1, false, true); + ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, RG_DEKU_SEEDS_30, false, true); + ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, RG_DEKU_SHIELD, false, true); } if (JabuJabusBelly.IsVanilla()) { - PlaceItemInLocation(JABU_JABUS_BELLY_DEKU_SCRUB, DEKU_NUTS_5); + ctx->PlaceItemInLocation(RC_JABU_JABUS_BELLY_DEKU_SCRUB, RG_DEKU_NUTS_5, false, true); } if (GanonsCastle.IsMQ()) { - PlaceItemInLocation(GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, GREEN_POTION_REFILL, false, true); - PlaceItemInLocation(GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, BOMBS_5, false, true); - PlaceItemInLocation(GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, ARROWS_30, false, true); - PlaceItemInLocation(GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, RED_POTION_REFILL, false, true); - PlaceItemInLocation(GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, DEKU_NUTS_5, false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, RG_GREEN_POTION_REFILL, false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, RG_BOMBS_5, false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, RG_ARROWS_30, false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, RG_RED_POTION_REFILL, false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, RG_DEKU_NUTS_5, false, true); } else { - PlaceItemInLocation(GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, BOMBS_5, false, true); - PlaceItemInLocation(GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, DEKU_SEEDS_30, false, true); - PlaceItemInLocation(GANONS_CASTLE_DEKU_SCRUB_RIGHT, RED_POTION_REFILL, false, true); - PlaceItemInLocation(GANONS_CASTLE_DEKU_SCRUB_LEFT, GREEN_POTION_REFILL, false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, RG_BOMBS_5, false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, RG_DEKU_SEEDS_30, false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT, RG_RED_POTION_REFILL, false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_DEKU_SCRUB_LEFT, RG_GREEN_POTION_REFILL, false, true); } @@ -554,56 +557,57 @@ static void PlaceVanillaBossKeys() { } static void PlaceVanillaCowMilk() { - PlaceItemInLocation(KF_LINKS_HOUSE_COW, MILK, false, true); - PlaceItemInLocation(HF_COW_GROTTO_COW, MILK, false, true); - PlaceItemInLocation(GV_COW, MILK, false, true); - PlaceItemInLocation(KAK_IMPAS_HOUSE_COW, MILK, false, true); - PlaceItemInLocation(DMT_COW_GROTTO_COW, MILK, false, true); - PlaceItemInLocation(LLR_STABLES_LEFT_COW, MILK, false, true); - PlaceItemInLocation(LLR_STABLES_RIGHT_COW, MILK, false, true); - PlaceItemInLocation(LLR_TOWER_LEFT_COW, MILK, false, true); - PlaceItemInLocation(LLR_TOWER_RIGHT_COW, MILK, false, true); + auto ctx = Rando::Context::GetInstance(); + ctx->PlaceItemInLocation(RC_KF_LINKS_HOUSE_COW, RG_MILK, false, true); + ctx->PlaceItemInLocation(RC_HF_COW_GROTTO_COW, RG_MILK, false, true); + ctx->PlaceItemInLocation(RC_GV_COW, RG_MILK, false, true); + ctx->PlaceItemInLocation(RC_KAK_IMPAS_HOUSE_COW, RG_MILK, false, true); + ctx->PlaceItemInLocation(RC_DMT_COW_GROTTO_COW, RG_MILK, false, true); + ctx->PlaceItemInLocation(RC_LLR_STABLES_LEFT_COW, RG_MILK, false, true); + ctx->PlaceItemInLocation(RC_LLR_STABLES_RIGHT_COW, RG_MILK, false, true); + ctx->PlaceItemInLocation(RC_LLR_TOWER_LEFT_COW, RG_MILK, false, true); + ctx->PlaceItemInLocation(RC_LLR_TOWER_RIGHT_COW, RG_MILK, false, true); if (JabuJabusBelly.IsMQ()) { - PlaceItemInLocation(JABU_JABUS_BELLY_MQ_COW, MILK, false, true); + ctx->PlaceItemInLocation(RC_JABU_JABUS_BELLY_MQ_COW, RG_MILK, false, true); } } static void SetScarceItemPool() { - ReplaceMaxItem(PROGRESSIVE_BOMBCHUS, 3); - ReplaceMaxItem(BOMBCHU_5, 1); - ReplaceMaxItem(BOMBCHU_10, 2); - ReplaceMaxItem(BOMBCHU_20, 0); - ReplaceMaxItem(PROGRESSIVE_MAGIC_METER, 1); - ReplaceMaxItem(DOUBLE_DEFENSE, 0); - ReplaceMaxItem(PROGRESSIVE_STICK_UPGRADE, 1); - ReplaceMaxItem(PROGRESSIVE_NUT_UPGRADE, 1); - ReplaceMaxItem(PROGRESSIVE_BOW, 2); - ReplaceMaxItem(PROGRESSIVE_SLINGSHOT, 2); - ReplaceMaxItem(PROGRESSIVE_BOMB_BAG, 2); - ReplaceMaxItem(HEART_CONTAINER, 0); + ReplaceMaxItem(RG_PROGRESSIVE_BOMBCHUS, 3); + ReplaceMaxItem(RG_BOMBCHU_5, 1); + ReplaceMaxItem(RG_BOMBCHU_10, 2); + ReplaceMaxItem(RG_BOMBCHU_20, 0); + ReplaceMaxItem(RG_PROGRESSIVE_MAGIC_METER, 1); + ReplaceMaxItem(RG_DOUBLE_DEFENSE, 0); + ReplaceMaxItem(RG_PROGRESSIVE_STICK_UPGRADE, 1); + ReplaceMaxItem(RG_PROGRESSIVE_NUT_UPGRADE, 1); + ReplaceMaxItem(RG_PROGRESSIVE_BOW, 2); + ReplaceMaxItem(RG_PROGRESSIVE_SLINGSHOT, 2); + ReplaceMaxItem(RG_PROGRESSIVE_BOMB_BAG, 2); + ReplaceMaxItem(RG_HEART_CONTAINER, 0); } static void SetMinimalItemPool() { - ReplaceMaxItem(PROGRESSIVE_BOMBCHUS, 1); - ReplaceMaxItem(BOMBCHU_5, 1); - ReplaceMaxItem(BOMBCHU_10, 0); - ReplaceMaxItem(BOMBCHU_20, 0); - ReplaceMaxItem(NAYRUS_LOVE, 0); - ReplaceMaxItem(PROGRESSIVE_MAGIC_METER, 1); - ReplaceMaxItem(DOUBLE_DEFENSE, 0); - ReplaceMaxItem(PROGRESSIVE_STICK_UPGRADE, 0); - ReplaceMaxItem(PROGRESSIVE_NUT_UPGRADE, 0); - ReplaceMaxItem(PROGRESSIVE_BOW, 1); - ReplaceMaxItem(PROGRESSIVE_SLINGSHOT, 1); - ReplaceMaxItem(PROGRESSIVE_BOMB_BAG, 1); - ReplaceMaxItem(PIECE_OF_HEART, 0); + ReplaceMaxItem(RG_PROGRESSIVE_BOMBCHUS, 1); + ReplaceMaxItem(RG_BOMBCHU_5, 1); + ReplaceMaxItem(RG_BOMBCHU_10, 0); + ReplaceMaxItem(RG_BOMBCHU_20, 0); + ReplaceMaxItem(RG_NAYRUS_LOVE, 0); + ReplaceMaxItem(RG_PROGRESSIVE_MAGIC_METER, 1); + ReplaceMaxItem(RG_DOUBLE_DEFENSE, 0); + ReplaceMaxItem(RG_PROGRESSIVE_STICK_UPGRADE, 0); + ReplaceMaxItem(RG_PROGRESSIVE_NUT_UPGRADE, 0); + ReplaceMaxItem(RG_PROGRESSIVE_BOW, 1); + ReplaceMaxItem(RG_PROGRESSIVE_SLINGSHOT, 1); + ReplaceMaxItem(RG_PROGRESSIVE_BOMB_BAG, 1); + ReplaceMaxItem(RG_PIECE_OF_HEART, 0); // Need an extra heart container when starting with 1 heart to be able to reach 3 hearts - ReplaceMaxItem(HEART_CONTAINER, (StartingHearts.Value() == 18)? 1 : 0); + ReplaceMaxItem(RG_HEART_CONTAINER, (StartingHearts.Value() == 18)? 1 : 0); } void GenerateItemPool() { - + auto ctx = Rando::Context::GetInstance(); ItemPool.clear(); PendingJunkPool.clear(); @@ -664,40 +668,40 @@ void GenerateItemPool() { if (TriforceHunt.Is(TRIFORCE_HUNT_ON)) { IceTrapModels.push_back(0xDF); - AddItemToMainPool(TRIFORCE_PIECE, Settings::TriforceHuntTotal.Value()); - PlaceItemInLocation(TRIFORCE_COMPLETED, TRIFORCE); // Win condition - PlaceItemInLocation(GANON, GetJunkItem(), false, true); + AddItemToMainPool(RG_TRIFORCE_PIECE, Settings::TriforceHuntTotal.Value()); + ctx->PlaceItemInLocation(RC_TRIFORCE_COMPLETED, RG_TRIFORCE); // Win condition + ctx->PlaceItemInLocation(RC_GANON, GetJunkItem(), false, true); } else { - PlaceItemInLocation(GANON, TRIFORCE); // Win condition + ctx->PlaceItemInLocation(RC_GANON, RG_TRIFORCE); // Win condition } //Fixed item locations - PlaceItemInLocation(HC_ZELDAS_LETTER, ZELDAS_LETTER); - PlaceItemInLocation(MARKET_BOMBCHU_BOWLING_BOMBCHUS, BOMBCHU_DROP); + ctx->PlaceItemInLocation(RC_HC_ZELDAS_LETTER, RG_ZELDAS_LETTER); + ctx->PlaceItemInLocation(RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS, RG_BOMBCHU_DROP); if (ShuffleKokiriSword) { - AddItemToMainPool(KOKIRI_SWORD); + AddItemToMainPool(RG_KOKIRI_SWORD); IceTrapModels.push_back(GI_SWORD_KOKIRI); } else { - PlaceItemInLocation(KF_KOKIRI_SWORD_CHEST, KOKIRI_SWORD, false, true); + ctx->PlaceItemInLocation(RC_KF_KOKIRI_SWORD_CHEST, RG_KOKIRI_SWORD, false, true); } if (ShuffleWeirdEgg) { - AddItemToMainPool(WEIRD_EGG); + AddItemToMainPool(RG_WEIRD_EGG); IceTrapModels.push_back(GI_WEIRD_EGG); } else { - PlaceItemInLocation(HC_MALON_EGG, WEIRD_EGG, false, true); + ctx->PlaceItemInLocation(RC_HC_MALON_EGG, RG_WEIRD_EGG, false, true); } if (ShuffleOcarinas) { - AddItemToMainPool(PROGRESSIVE_OCARINA, 2); + AddItemToMainPool(RG_PROGRESSIVE_OCARINA, 2); if (ItemPoolValue.Is(ITEMPOOL_PLENTIFUL)) { - AddItemToPool(PendingJunkPool, PROGRESSIVE_OCARINA); + AddItemToPool(PendingJunkPool, RG_PROGRESSIVE_OCARINA); } IceTrapModels.push_back(0x8B); //Progressive ocarina } else { - PlaceItemInLocation(LW_GIFT_FROM_SARIA, PROGRESSIVE_OCARINA, false, true); - PlaceItemInLocation(HF_OCARINA_OF_TIME_ITEM, PROGRESSIVE_OCARINA, false, true); + ctx->PlaceItemInLocation(RC_LW_GIFT_FROM_SARIA, RG_PROGRESSIVE_OCARINA, false, true); + ctx->PlaceItemInLocation(RC_HF_OCARINA_OF_TIME_ITEM, RG_PROGRESSIVE_OCARINA, false, true); } if (ShuffleCows) { @@ -714,179 +718,179 @@ void GenerateItemPool() { } if (ShuffleMagicBeans) { - AddItemToMainPool(MAGIC_BEAN_PACK); + AddItemToMainPool(RG_MAGIC_BEAN_PACK); if (ItemPoolValue.Is(ITEMPOOL_PLENTIFUL)) { - AddItemToPool(PendingJunkPool, MAGIC_BEAN_PACK); + AddItemToPool(PendingJunkPool, RG_MAGIC_BEAN_PACK); } IceTrapModels.push_back(0xC9); //Magic bean pack } else { - PlaceItemInLocation(ZR_MAGIC_BEAN_SALESMAN, MAGIC_BEAN, false, true); + ctx->PlaceItemInLocation(RC_ZR_MAGIC_BEAN_SALESMAN, RG_MAGIC_BEAN, false, true); } if (ShuffleMerchants.IsNot(SHUFFLEMERCHANTS_OFF)) { if (!ProgressiveGoronSword) { - AddItemToMainPool(GIANTS_KNIFE); + AddItemToMainPool(RG_GIANTS_KNIFE); } if (BombchusInLogic) { - AddItemToMainPool(PROGRESSIVE_BOMBCHUS); + AddItemToMainPool(RG_PROGRESSIVE_BOMBCHUS); } else { - AddItemToMainPool(BOMBCHU_10); + AddItemToMainPool(RG_BOMBCHU_10); } } else { - PlaceItemInLocation(KAK_GRANNYS_SHOP, BLUE_POTION_REFILL, false, true); - PlaceItemInLocation(GC_MEDIGORON, GIANTS_KNIFE, false, true); - PlaceItemInLocation(WASTELAND_BOMBCHU_SALESMAN, BOMBCHU_10, false, true); + ctx->PlaceItemInLocation(RC_KAK_GRANNYS_SHOP, RG_BLUE_POTION_REFILL, false, true); + ctx->PlaceItemInLocation(RC_GC_MEDIGORON, RG_GIANTS_KNIFE, false, true); + ctx->PlaceItemInLocation(RC_WASTELAND_BOMBCHU_SALESMAN, RG_BOMBCHU_10, false, true); } if (ShuffleFrogSongRupees) { - AddItemToMainPool(PURPLE_RUPEE, 5); + AddItemToMainPool(RG_PURPLE_RUPEE, 5); } else { - PlaceItemInLocation(ZR_FROGS_ZELDAS_LULLABY, PURPLE_RUPEE, false, true); - PlaceItemInLocation(ZR_FROGS_EPONAS_SONG, PURPLE_RUPEE, false, true); - PlaceItemInLocation(ZR_FROGS_SARIAS_SONG, PURPLE_RUPEE, false, true); - PlaceItemInLocation(ZR_FROGS_SUNS_SONG, PURPLE_RUPEE, false, true); - PlaceItemInLocation(ZR_FROGS_SONG_OF_TIME, PURPLE_RUPEE, false, true); + ctx->PlaceItemInLocation(RC_ZR_FROGS_ZELDAS_LULLABY, RG_PURPLE_RUPEE, false, true); + ctx->PlaceItemInLocation(RC_ZR_FROGS_EPONAS_SONG, RG_PURPLE_RUPEE, false, true); + ctx->PlaceItemInLocation(RC_ZR_FROGS_SARIAS_SONG, RG_PURPLE_RUPEE, false, true); + ctx->PlaceItemInLocation(RC_ZR_FROGS_SUNS_SONG, RG_PURPLE_RUPEE, false, true); + ctx->PlaceItemInLocation(RC_ZR_FROGS_SONG_OF_TIME, RG_PURPLE_RUPEE, false, true); } if (ShuffleAdultTradeQuest) { - AddItemToMainPool(POCKET_EGG); - AddItemToMainPool(COJIRO); - AddItemToMainPool(ODD_MUSHROOM); - AddItemToMainPool(ODD_POTION); - AddItemToMainPool(POACHERS_SAW); - AddItemToMainPool(BROKEN_SWORD); - AddItemToMainPool(PRESCRIPTION); - AddItemToMainPool(EYEBALL_FROG); - AddItemToMainPool(EYEDROPS); + AddItemToMainPool(RG_POCKET_EGG); + AddItemToMainPool(RG_COJIRO); + AddItemToMainPool(RG_ODD_MUSHROOM); + AddItemToMainPool(RG_ODD_POTION); + AddItemToMainPool(RG_POACHERS_SAW); + AddItemToMainPool(RG_BROKEN_SWORD); + AddItemToMainPool(RG_PRESCRIPTION); + AddItemToMainPool(RG_EYEBALL_FROG); + AddItemToMainPool(RG_EYEDROPS); } else { - PlaceItemInLocation(KAK_TRADE_POCKET_CUCCO, COJIRO, false, true); - PlaceItemInLocation(LW_TRADE_COJIRO, ODD_MUSHROOM, false, true); - PlaceItemInLocation(KAK_TRADE_ODD_MUSHROOM, ODD_POTION, false, true); - PlaceItemInLocation(LW_TRADE_ODD_POTION, POACHERS_SAW, false, true); - PlaceItemInLocation(GV_TRADE_SAW, BROKEN_SWORD, false, true); - PlaceItemInLocation(DMT_TRADE_BROKEN_SWORD, PRESCRIPTION, false, true); - PlaceItemInLocation(ZD_TRADE_PRESCRIPTION, EYEBALL_FROG, false, true); - PlaceItemInLocation(LH_TRADE_FROG, EYEDROPS, false, true); - PlaceItemInLocation(DMT_TRADE_EYEDROPS, CLAIM_CHECK, false, true); + ctx->PlaceItemInLocation(RC_KAK_TRADE_POCKET_CUCCO, RG_COJIRO, false, true); + ctx->PlaceItemInLocation(RC_LW_TRADE_COJIRO, RG_ODD_MUSHROOM, false, true); + ctx->PlaceItemInLocation(RC_KAK_TRADE_ODD_MUSHROOM, RG_ODD_POTION, false, true); + ctx->PlaceItemInLocation(RC_LW_TRADE_ODD_POTION, RG_POACHERS_SAW, false, true); + ctx->PlaceItemInLocation(RC_GV_TRADE_SAW, RG_BROKEN_SWORD, false, true); + ctx->PlaceItemInLocation(RC_DMT_TRADE_BROKEN_SWORD, RG_PRESCRIPTION, false, true); + ctx->PlaceItemInLocation(RC_ZD_TRADE_PRESCRIPTION, RG_EYEBALL_FROG, false, true); + ctx->PlaceItemInLocation(RC_LH_TRADE_FROG, RG_EYEDROPS, false, true); + ctx->PlaceItemInLocation(RC_DMT_TRADE_EYEDROPS, RG_CLAIM_CHECK, false, true); } - AddItemToMainPool(CLAIM_CHECK); + AddItemToMainPool(RG_CLAIM_CHECK); if (ShuffleChestMinigame.Is(SHUFFLECHESTMINIGAME_SINGLE_KEYS)) { - AddItemToMainPool(TREASURE_GAME_SMALL_KEY, 6); // 6 individual keys + AddItemToMainPool(RG_TREASURE_GAME_SMALL_KEY, 6); // 6 individual keys } else if (ShuffleChestMinigame.Is(SHUFFLECHESTMINIGAME_PACK)) { - AddItemToMainPool(TREASURE_GAME_SMALL_KEY); // 1 key which will behave as a pack of 6 + AddItemToMainPool(RG_TREASURE_GAME_SMALL_KEY); // 1 key which will behave as a pack of 6 } else { - PlaceItemInLocation(MARKET_TREASURE_CHEST_GAME_ITEM_1, TREASURE_GAME_SMALL_KEY, false, true); - PlaceItemInLocation(MARKET_TREASURE_CHEST_GAME_ITEM_2, TREASURE_GAME_SMALL_KEY, false, true); - PlaceItemInLocation(MARKET_TREASURE_CHEST_GAME_ITEM_3, TREASURE_GAME_SMALL_KEY, false, true); - PlaceItemInLocation(MARKET_TREASURE_CHEST_GAME_ITEM_4, TREASURE_GAME_SMALL_KEY, false, true); - PlaceItemInLocation(MARKET_TREASURE_CHEST_GAME_ITEM_5, TREASURE_GAME_SMALL_KEY, false, true); + ctx->PlaceItemInLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, RG_TREASURE_GAME_SMALL_KEY, false, true); + ctx->PlaceItemInLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, RG_TREASURE_GAME_SMALL_KEY, false, true); + ctx->PlaceItemInLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_3, RG_TREASURE_GAME_SMALL_KEY, false, true); + ctx->PlaceItemInLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_4, RG_TREASURE_GAME_SMALL_KEY, false, true); + ctx->PlaceItemInLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, RG_TREASURE_GAME_SMALL_KEY, false, true); }; if (Tokensanity.Is(TOKENSANITY_OFF)) { - for (uint32_t loc : GetLocations(allLocations, Category::cSkulltula)) { - PlaceItemInLocation(loc, GOLD_SKULLTULA_TOKEN, false, true); + for (RandomizerCheck loc : ctx->GetLocations(ctx->allLocations, Category::cSkulltula)) { + ctx->PlaceItemInLocation(loc, RG_GOLD_SKULLTULA_TOKEN, false, true); } } else if (Tokensanity.Is(TOKENSANITY_DUNGEONS)) { - for (uint32_t loc : GetLocations(allLocations, Category::cSkulltula)) { - if (Location(loc)->IsOverworld()) { - PlaceItemInLocation(loc, GOLD_SKULLTULA_TOKEN, false, true); + for (RandomizerCheck loc : ctx->GetLocations(ctx->allLocations, Category::cSkulltula)) { + if (Rando::StaticData::GetLocation(loc)->IsOverworld()) { + ctx->PlaceItemInLocation((RandomizerCheck)loc, RG_GOLD_SKULLTULA_TOKEN, false, true); } else { - AddItemToMainPool(GOLD_SKULLTULA_TOKEN); + AddItemToMainPool(RG_GOLD_SKULLTULA_TOKEN); } } } else if (Tokensanity.Is(TOKENSANITY_OVERWORLD)) { - for (uint32_t loc : GetLocations(allLocations, Category::cSkulltula)) { - if (Location(loc)->IsDungeon()) { - PlaceItemInLocation(loc, GOLD_SKULLTULA_TOKEN, false, true); + for (RandomizerCheck loc : ctx->GetLocations(ctx->allLocations, Category::cSkulltula)) { + if (Rando::StaticData::GetLocation(loc)->IsDungeon()) { + ctx->PlaceItemInLocation((RandomizerCheck)loc, RG_GOLD_SKULLTULA_TOKEN, false, true); } else { - AddItemToMainPool(GOLD_SKULLTULA_TOKEN); + AddItemToMainPool(RG_GOLD_SKULLTULA_TOKEN); } } } else { - AddItemToMainPool(GOLD_SKULLTULA_TOKEN, 100); + AddItemToMainPool(RG_GOLD_SKULLTULA_TOKEN, 100); } if (Shuffle100GSReward) { if (Tokensanity.IsNot(TOKENSANITY_OFF) && ItemPoolValue.Is(ITEMPOOL_PLENTIFUL)) { - AddItemToPool(PendingJunkPool, GOLD_SKULLTULA_TOKEN, 10); + AddItemToPool(PendingJunkPool, RG_GOLD_SKULLTULA_TOKEN, 10); } - AddItemToMainPool(HUGE_RUPEE); + AddItemToMainPool(RG_HUGE_RUPEE); } else { - PlaceItemInLocation(KAK_100_GOLD_SKULLTULA_REWARD, HUGE_RUPEE, false, true); + ctx->PlaceItemInLocation(RC_KAK_100_GOLD_SKULLTULA_REWARD, RG_HUGE_RUPEE, false, true); } if (BombchusInLogic) { - AddItemToMainPool(PROGRESSIVE_BOMBCHUS, 5); + AddItemToMainPool(RG_PROGRESSIVE_BOMBCHUS, 5); } else { - AddItemToMainPool(BOMBCHU_5); - AddItemToMainPool(BOMBCHU_10, 3); - AddItemToMainPool(BOMBCHU_20); + AddItemToMainPool(RG_BOMBCHU_5); + AddItemToMainPool(RG_BOMBCHU_10, 3); + AddItemToMainPool(RG_BOMBCHU_20); } //Ice Traps - AddItemToMainPool(ICE_TRAP); + AddItemToMainPool(RG_ICE_TRAP); if (GerudoTrainingGrounds.IsVanilla()) { - AddItemToMainPool(ICE_TRAP); + AddItemToMainPool(RG_ICE_TRAP); } if (GanonsCastle.IsVanilla()) { - AddItemToMainPool(ICE_TRAP, 4); + AddItemToMainPool(RG_ICE_TRAP, 4); } //Gerudo Fortress if (GerudoFortress.Is(GERUDOFORTRESS_OPEN)) { - PlaceItemInLocation(GF_NORTH_F1_CARPENTER, RECOVERY_HEART, false, true); - PlaceItemInLocation(GF_NORTH_F2_CARPENTER, RECOVERY_HEART, false, true); - PlaceItemInLocation(GF_SOUTH_F1_CARPENTER, RECOVERY_HEART, false, true); - PlaceItemInLocation(GF_SOUTH_F2_CARPENTER, RECOVERY_HEART, false, true); + ctx->PlaceItemInLocation(RC_GF_NORTH_F1_CARPENTER, RG_RECOVERY_HEART, false, true); + ctx->PlaceItemInLocation(RC_GF_NORTH_F2_CARPENTER, RG_RECOVERY_HEART, false, true); + ctx->PlaceItemInLocation(RC_GF_SOUTH_F1_CARPENTER, RG_RECOVERY_HEART, false, true); + ctx->PlaceItemInLocation(RC_GF_SOUTH_F2_CARPENTER, RG_RECOVERY_HEART, false, true); } else if (GerudoKeys.IsNot(GERUDOKEYS_VANILLA)) { if (GerudoFortress.Is(GERUDOFORTRESS_FAST)) { - AddItemToMainPool(GERUDO_FORTRESS_SMALL_KEY); - PlaceItemInLocation(GF_NORTH_F2_CARPENTER, RECOVERY_HEART, false, true); - PlaceItemInLocation(GF_SOUTH_F1_CARPENTER, RECOVERY_HEART, false, true); - PlaceItemInLocation(GF_SOUTH_F2_CARPENTER, RECOVERY_HEART, false, true); + AddItemToMainPool(RG_GERUDO_FORTRESS_SMALL_KEY); + ctx->PlaceItemInLocation(RC_GF_NORTH_F2_CARPENTER, RG_RECOVERY_HEART, false, true); + ctx->PlaceItemInLocation(RC_GF_SOUTH_F1_CARPENTER, RG_RECOVERY_HEART, false, true); + ctx->PlaceItemInLocation(RC_GF_SOUTH_F2_CARPENTER, RG_RECOVERY_HEART, false, true); } else { //Only add key ring if 4 Fortress keys necessary if (RingFortress) { - AddItemToMainPool(GERUDO_FORTRESS_KEY_RING); + AddItemToMainPool(RG_GERUDO_FORTRESS_KEY_RING); //Add junk to make up for missing keys for (uint8_t i = 0; i < 3; i++) { AddItemToMainPool(GetJunkItem()); } } else { - AddItemToMainPool(GERUDO_FORTRESS_SMALL_KEY, 4); + AddItemToMainPool(RG_GERUDO_FORTRESS_SMALL_KEY, 4); } } if (ItemPoolValue.Is(ITEMPOOL_PLENTIFUL)) { if (RingFortress && GerudoFortress.Is(GERUDOFORTRESS_NORMAL)) { - AddItemToPool(PendingJunkPool, GERUDO_FORTRESS_KEY_RING); + AddItemToPool(PendingJunkPool, RG_GERUDO_FORTRESS_KEY_RING); } else { - AddItemToPool(PendingJunkPool, GERUDO_FORTRESS_SMALL_KEY); + AddItemToPool(PendingJunkPool, RG_GERUDO_FORTRESS_SMALL_KEY); } } } else { if (GerudoFortress.Is(GERUDOFORTRESS_FAST)) { - PlaceItemInLocation(GF_NORTH_F1_CARPENTER, GERUDO_FORTRESS_SMALL_KEY, false, true); - PlaceItemInLocation(GF_NORTH_F2_CARPENTER, RECOVERY_HEART, false, true); - PlaceItemInLocation(GF_SOUTH_F1_CARPENTER, RECOVERY_HEART, false, true); - PlaceItemInLocation(GF_SOUTH_F2_CARPENTER, RECOVERY_HEART, false, true); + ctx->PlaceItemInLocation(RC_GF_NORTH_F1_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, false, true); + ctx->PlaceItemInLocation(RC_GF_NORTH_F2_CARPENTER, RG_RECOVERY_HEART, false, true); + ctx->PlaceItemInLocation(RC_GF_SOUTH_F1_CARPENTER, RG_RECOVERY_HEART, false, true); + ctx->PlaceItemInLocation(RC_GF_SOUTH_F2_CARPENTER, RG_RECOVERY_HEART, false, true); } else { - PlaceItemInLocation(GF_NORTH_F1_CARPENTER, GERUDO_FORTRESS_SMALL_KEY, false, true); - PlaceItemInLocation(GF_NORTH_F2_CARPENTER, GERUDO_FORTRESS_SMALL_KEY, false, true); - PlaceItemInLocation(GF_SOUTH_F1_CARPENTER, GERUDO_FORTRESS_SMALL_KEY, false, true); - PlaceItemInLocation(GF_SOUTH_F2_CARPENTER, GERUDO_FORTRESS_SMALL_KEY, false, true); + ctx->PlaceItemInLocation(RC_GF_NORTH_F1_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, false, true); + ctx->PlaceItemInLocation(RC_GF_NORTH_F2_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, false, true); + ctx->PlaceItemInLocation(RC_GF_SOUTH_F1_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, false, true); + ctx->PlaceItemInLocation(RC_GF_SOUTH_F2_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, false, true); } } //Gerudo Membership Card if (ShuffleGerudoToken && GerudoFortress.IsNot(GERUDOFORTRESS_OPEN)) { - AddItemToMainPool(GERUDO_MEMBERSHIP_CARD); + AddItemToMainPool(RG_GERUDO_MEMBERSHIP_CARD); IceTrapModels.push_back(GI_GERUDO_CARD); } else if (ShuffleGerudoToken) { - AddItemToPool(PendingJunkPool, GERUDO_MEMBERSHIP_CARD); - PlaceItemInLocation(GF_GERUDO_MEMBERSHIP_CARD, ICE_TRAP, false, true); + AddItemToPool(PendingJunkPool, RG_GERUDO_MEMBERSHIP_CARD); + ctx->PlaceItemInLocation(RC_GF_GERUDO_MEMBERSHIP_CARD, RG_ICE_TRAP, false, true); } else { - PlaceItemInLocation(GF_GERUDO_MEMBERSHIP_CARD, GERUDO_MEMBERSHIP_CARD, false, true); + ctx->PlaceItemInLocation(RC_GF_GERUDO_MEMBERSHIP_CARD, RG_GERUDO_MEMBERSHIP_CARD, false, true); } //Keys @@ -906,63 +910,63 @@ void GenerateItemPool() { if (ItemPoolValue.Is(ITEMPOOL_PLENTIFUL)) { if (ShuffleGerudoToken) { - AddItemToPool(PendingJunkPool, GERUDO_MEMBERSHIP_CARD); + AddItemToPool(PendingJunkPool, RG_GERUDO_MEMBERSHIP_CARD); } //Plentiful small keys if (Keysanity.Is(KEYSANITY_ANYWHERE) || Keysanity.Is(KEYSANITY_ANY_DUNGEON) || Keysanity.Is(KEYSANITY_OVERWORLD)) { if (BottomOfTheWell.HasKeyRing()) { - AddItemToPool(PendingJunkPool, BOTTOM_OF_THE_WELL_KEY_RING); + AddItemToPool(PendingJunkPool, RG_BOTTOM_OF_THE_WELL_KEY_RING); } else { - AddItemToPool(PendingJunkPool, BOTTOM_OF_THE_WELL_SMALL_KEY); + AddItemToPool(PendingJunkPool, RG_BOTTOM_OF_THE_WELL_SMALL_KEY); } if (ForestTemple.HasKeyRing()) { - AddItemToPool(PendingJunkPool, FOREST_TEMPLE_KEY_RING); + AddItemToPool(PendingJunkPool, RG_FOREST_TEMPLE_KEY_RING); } else { - AddItemToPool(PendingJunkPool, FOREST_TEMPLE_SMALL_KEY); + AddItemToPool(PendingJunkPool, RG_FOREST_TEMPLE_SMALL_KEY); } if (FireTemple.HasKeyRing()) { - AddItemToPool(PendingJunkPool, FIRE_TEMPLE_KEY_RING); + AddItemToPool(PendingJunkPool, RG_FIRE_TEMPLE_KEY_RING); } else { - AddItemToPool(PendingJunkPool, FIRE_TEMPLE_SMALL_KEY); + AddItemToPool(PendingJunkPool, RG_FIRE_TEMPLE_SMALL_KEY); } if (WaterTemple.HasKeyRing()) { - AddItemToPool(PendingJunkPool, WATER_TEMPLE_KEY_RING); + AddItemToPool(PendingJunkPool, RG_WATER_TEMPLE_KEY_RING); } else { - AddItemToPool(PendingJunkPool, WATER_TEMPLE_SMALL_KEY); + AddItemToPool(PendingJunkPool, RG_WATER_TEMPLE_SMALL_KEY); } if (SpiritTemple.HasKeyRing()) { - AddItemToPool(PendingJunkPool, SPIRIT_TEMPLE_KEY_RING); + AddItemToPool(PendingJunkPool, RG_SPIRIT_TEMPLE_KEY_RING); } else { - AddItemToPool(PendingJunkPool, SPIRIT_TEMPLE_SMALL_KEY); + AddItemToPool(PendingJunkPool, RG_SPIRIT_TEMPLE_SMALL_KEY); } if (ShadowTemple.HasKeyRing()) { - AddItemToPool(PendingJunkPool, SHADOW_TEMPLE_KEY_RING); + AddItemToPool(PendingJunkPool, RG_SHADOW_TEMPLE_KEY_RING); } else { - AddItemToPool(PendingJunkPool, SHADOW_TEMPLE_SMALL_KEY); + AddItemToPool(PendingJunkPool, RG_SHADOW_TEMPLE_SMALL_KEY); } if (GerudoTrainingGrounds.HasKeyRing()) { - AddItemToPool(PendingJunkPool, GERUDO_TRAINING_GROUNDS_KEY_RING); + AddItemToPool(PendingJunkPool, RG_GERUDO_TRAINING_GROUNDS_KEY_RING); } else { - AddItemToPool(PendingJunkPool, GERUDO_TRAINING_GROUNDS_SMALL_KEY); + AddItemToPool(PendingJunkPool, RG_GERUDO_TRAINING_GROUNDS_SMALL_KEY); } if (GanonsCastle.HasKeyRing()) { - AddItemToPool(PendingJunkPool, GANONS_CASTLE_KEY_RING); + AddItemToPool(PendingJunkPool, RG_GANONS_CASTLE_KEY_RING); } else { - AddItemToPool(PendingJunkPool, GANONS_CASTLE_SMALL_KEY); + AddItemToPool(PendingJunkPool, RG_GANONS_CASTLE_SMALL_KEY); } } if (BossKeysanity.Is(BOSSKEYSANITY_ANYWHERE) || BossKeysanity.Is(BOSSKEYSANITY_ANY_DUNGEON) || BossKeysanity.Is(BOSSKEYSANITY_OVERWORLD)) { - AddItemToPool(PendingJunkPool, FOREST_TEMPLE_BOSS_KEY); - AddItemToPool(PendingJunkPool, FIRE_TEMPLE_BOSS_KEY); - AddItemToPool(PendingJunkPool, WATER_TEMPLE_BOSS_KEY); - AddItemToPool(PendingJunkPool, SPIRIT_TEMPLE_BOSS_KEY); - AddItemToPool(PendingJunkPool, SHADOW_TEMPLE_BOSS_KEY); + AddItemToPool(PendingJunkPool, RG_FOREST_TEMPLE_BOSS_KEY); + AddItemToPool(PendingJunkPool, RG_FIRE_TEMPLE_BOSS_KEY); + AddItemToPool(PendingJunkPool, RG_WATER_TEMPLE_BOSS_KEY); + AddItemToPool(PendingJunkPool, RG_SPIRIT_TEMPLE_BOSS_KEY); + AddItemToPool(PendingJunkPool, RG_SHADOW_TEMPLE_BOSS_KEY); } if (GanonsBossKey.Is(GANONSBOSSKEY_ANYWHERE) || GanonsBossKey.Is(GANONSBOSSKEY_ANY_DUNGEON) || GanonsBossKey.Is(GANONSBOSSKEY_OVERWORLD)) { - AddItemToPool(PendingJunkPool, GANONS_CASTLE_BOSS_KEY); + AddItemToPool(PendingJunkPool, RG_GANONS_CASTLE_BOSS_KEY); } } @@ -977,29 +981,29 @@ void GenerateItemPool() { if (Settings::Scrubsanity.IsNot(SCRUBSANITY_OFF)) { //Deku Tree if (DekuTree.IsMQ()) { - AddItemToMainPool(DEKU_SHIELD); + AddItemToMainPool(RG_DEKU_SHIELD); } //Dodongos Cavern - AddItemToMainPool(DEKU_STICK_1); - AddItemToMainPool(DEKU_SHIELD); + AddItemToMainPool(RG_DEKU_STICK_1); + AddItemToMainPool(RG_DEKU_SHIELD); if (DodongosCavern.IsMQ()) { - AddItemToMainPool(RECOVERY_HEART); + AddItemToMainPool(RG_RECOVERY_HEART); } else { - AddItemToMainPool(DEKU_NUTS_5); + AddItemToMainPool(RG_DEKU_NUTS_5); } //Jabu Jabus Belly if (JabuJabusBelly.IsVanilla()) { - AddItemToMainPool(DEKU_NUTS_5); + AddItemToMainPool(RG_DEKU_NUTS_5); } //Ganons Castle - AddItemToMainPool(BOMBS_5); - AddItemToMainPool(RECOVERY_HEART); - AddItemToMainPool(BLUE_RUPEE); + AddItemToMainPool(RG_BOMBS_5); + AddItemToMainPool(RG_RECOVERY_HEART); + AddItemToMainPool(RG_BLUE_RUPEE); if (GanonsCastle.IsMQ()) { - AddItemToMainPool(DEKU_NUTS_5); + AddItemToMainPool(RG_DEKU_NUTS_5); } //Overworld Scrubs @@ -1008,9 +1012,9 @@ void GenerateItemPool() { //I'm not sure what this is for, but it was in ootr so I copied it for (uint8_t i = 0; i < 7; i++) { if (Random(0, 3)) { - AddItemToMainPool(ARROWS_30); + AddItemToMainPool(RG_ARROWS_30); } else { - AddItemToMainPool(DEKU_SEEDS_30); + AddItemToMainPool(RG_DEKU_SEEDS_30); } } } else { @@ -1075,18 +1079,19 @@ void GenerateItemPool() { //Add 4 total bottles uint8_t bottleCount = 4; - std::vector bottles; + std::vector bottles; bottles.assign(normalBottles.begin(), normalBottles.end()); - IceTrapModels.push_back(ItemTable(RandomElement(bottles)).GetItemID()); //Get one random bottle type for ice traps + IceTrapModels.push_back( + Rando::StaticData::RetrieveItem(RandomElement(bottles)).GetItemID()); // Get one random bottle type for ice traps for (uint8_t i = 0; i < bottleCount; i++) { if (i >= rutoBottles) { if ((i == bottleCount - 1) && ShuffleMerchants.IsNot(SHUFFLEMERCHANTS_OFF)) { - AddItemToMainPool(BOTTLE_WITH_BLUE_POTION); + AddItemToMainPool(RG_BOTTLE_WITH_BLUE_POTION); } else { AddRandomBottle(bottles); } } else { - AddItemToMainPool(RUTOS_LETTER); + AddItemToMainPool(RG_RUTOS_LETTER); } } @@ -1107,11 +1112,11 @@ void GenerateItemPool() { PlaceVanillaMapsAndCompasses(); } else { for (auto dungeon : dungeonList) { - if (dungeon->GetMap() != NONE) { + if (dungeon->GetMap() != RG_NONE) { AddItemToMainPool(dungeon->GetMap()); } - if (dungeon->GetCompass() != NONE) { + if (dungeon->GetCompass() != RG_NONE) { AddItemToMainPool(dungeon->GetCompass()); } } @@ -1134,21 +1139,21 @@ void GenerateItemPool() { if (BossKeysanity.Is(BOSSKEYSANITY_VANILLA)) { PlaceVanillaBossKeys(); } else { - AddItemToMainPool(FOREST_TEMPLE_BOSS_KEY); - AddItemToMainPool(FIRE_TEMPLE_BOSS_KEY); - AddItemToMainPool(WATER_TEMPLE_BOSS_KEY); - AddItemToMainPool(SPIRIT_TEMPLE_BOSS_KEY); - AddItemToMainPool(SHADOW_TEMPLE_BOSS_KEY); + AddItemToMainPool(RG_FOREST_TEMPLE_BOSS_KEY); + AddItemToMainPool(RG_FIRE_TEMPLE_BOSS_KEY); + AddItemToMainPool(RG_WATER_TEMPLE_BOSS_KEY); + AddItemToMainPool(RG_SPIRIT_TEMPLE_BOSS_KEY); + AddItemToMainPool(RG_SHADOW_TEMPLE_BOSS_KEY); } if (GanonsBossKey.Is(GANONSBOSSKEY_FINAL_GS_REWARD)) { - PlaceItemInLocation(KAK_100_GOLD_SKULLTULA_REWARD, GANONS_CASTLE_BOSS_KEY); + ctx->PlaceItemInLocation(RC_KAK_100_GOLD_SKULLTULA_REWARD, RG_GANONS_CASTLE_BOSS_KEY); } else if (GanonsBossKey.Value() >= GANONSBOSSKEY_LACS_VANILLA && GanonsBossKey.IsNot(GANONSBOSSKEY_TRIFORCE_HUNT)) { - PlaceItemInLocation(TOT_LIGHT_ARROWS_CUTSCENE, GANONS_CASTLE_BOSS_KEY); + ctx->PlaceItemInLocation(RC_TOT_LIGHT_ARROWS_CUTSCENE, RG_GANONS_CASTLE_BOSS_KEY); } else if (GanonsBossKey.Is(GANONSBOSSKEY_VANILLA)) { - PlaceItemInLocation(GANONS_TOWER_BOSS_KEY_CHEST, GANONS_CASTLE_BOSS_KEY); + ctx->PlaceItemInLocation(RC_GANONS_TOWER_BOSS_KEY_CHEST, RG_GANONS_CASTLE_BOSS_KEY); } else { - AddItemToMainPool(GANONS_CASTLE_BOSS_KEY); + AddItemToMainPool(RG_GANONS_CASTLE_BOSS_KEY); } if (ItemPoolValue.Is(ITEMPOOL_PLENTIFUL)) { @@ -1158,12 +1163,12 @@ void GenerateItemPool() { } if (!ShuffleKokiriSword) { - ReplaceMaxItem(KOKIRI_SWORD, 0); + ReplaceMaxItem(RG_KOKIRI_SWORD, 0); } if (ProgressiveGoronSword) { - ReplaceMaxItem(BIGGORON_SWORD, 0); - AddItemToMainPool(PROGRESSIVE_GORONSWORD, 2); + ReplaceMaxItem(RG_BIGGORON_SWORD, 0); + AddItemToMainPool(RG_PROGRESSIVE_GORONSWORD, 2); IceTrapModels.push_back(0xD4); // Progressive Goron Sword } else { IceTrapModels.push_back(GI_SWORD_BGS); @@ -1171,7 +1176,7 @@ void GenerateItemPool() { //Replace ice traps with junk from the pending junk pool if necessary if (IceTrapValue.Is(ICETRAPS_OFF)) { - ReplaceMaxItem(ICE_TRAP, 0); + ReplaceMaxItem(RG_ICE_TRAP, 0); } //Replace all junk items with ice traps for onslaught mode else if (IceTrapValue.Is(ICETRAPS_ONSLAUGHT)) { @@ -1185,17 +1190,17 @@ void GenerateItemPool() { } else if (ItemPoolValue.Is(ITEMPOOL_MINIMAL)) { SetMinimalItemPool(); } else if (RemoveDoubleDefense) { - ReplaceMaxItem(DOUBLE_DEFENSE, 0); + ReplaceMaxItem(RG_DOUBLE_DEFENSE, 0); } //this feels ugly and there's probably a better way, but //it replaces random junk with pending junk. bool junkSet; - for (uint32_t pendingJunk : PendingJunkPool) { + for (RandomizerGet pendingJunk : PendingJunkPool) { junkSet = false; - for (uint32_t& item : ItemPool) { - for (uint32_t junk : JunkPoolItems) { - if (item == junk && item != HUGE_RUPEE && item != DEKU_NUTS_10) { + for (RandomizerGet& item : ItemPool) { + for (RandomizerGet junk : JunkPoolItems) { + if (item == junk && item != RG_HUGE_RUPEE && item != RG_DEKU_NUTS_10) { item = pendingJunk; junkSet = true; break; diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.hpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.hpp index d71e4cb2f..749a2a46d 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.hpp @@ -1,18 +1,17 @@ #pragma once -#include "keys.hpp" - #include #include #include +#include "../randomizerTypes.h" class ItemLocation; -void AddItemToPool(std::vector& pool, const uint32_t item, size_t count = 1); -uint32_t GetJunkItem(); -void PlaceJunkInExcludedLocation(const uint32_t il); +void AddItemToPool(std::vector& pool, const RandomizerGet item, size_t count = 1); +RandomizerGet GetJunkItem(); +void PlaceJunkInExcludedLocation(const RandomizerCheck il); void GenerateItemPool(); void AddJunk(); -extern std::vector ItemPool; +extern std::vector ItemPool; extern std::vector IceTrapModels; diff --git a/soh/soh/Enhancements/randomizer/3drando/keys.hpp b/soh/soh/Enhancements/randomizer/3drando/keys.hpp deleted file mode 100644 index 6e9e87f4e..000000000 --- a/soh/soh/Enhancements/randomizer/3drando/keys.hpp +++ /dev/null @@ -1,1831 +0,0 @@ -#pragma once - -#include - -using HintKey = uint32_t; -using ItemKey = uint32_t; -using LocationKey = uint32_t; -using AreaKey = uint32_t; - -typedef enum { - NONE, - KOKIRI_SWORD, - MASTER_SWORD, - GIANTS_KNIFE, - BIGGORON_SWORD, - DEKU_SHIELD, - HYLIAN_SHIELD, - MIRROR_SHIELD, - GORON_TUNIC, - ZORA_TUNIC, - IRON_BOOTS, - HOVER_BOOTS, - WEIRD_EGG, - ZELDAS_LETTER, - BOOMERANG, - LENS_OF_TRUTH, - MEGATON_HAMMER, - STONE_OF_AGONY, - DINS_FIRE, - FARORES_WIND, - NAYRUS_LOVE, - FIRE_ARROWS, - ICE_ARROWS, - LIGHT_ARROWS, - GERUDO_MEMBERSHIP_CARD, - MAGIC_BEAN, - MAGIC_BEAN_PACK, - DOUBLE_DEFENSE, - GOLD_SKULLTULA_TOKEN, - - POCKET_EGG, - POCKET_CUCCO, - COJIRO, - ODD_MUSHROOM, - ODD_POTION, - POACHERS_SAW, - BROKEN_SWORD, - PRESCRIPTION, - EYEBALL_FROG, - EYEDROPS, - CLAIM_CHECK, - - PROGRESSIVE_HOOKSHOT, - PROGRESSIVE_STRENGTH, - PROGRESSIVE_BOMB_BAG, - PROGRESSIVE_BOW, - PROGRESSIVE_SLINGSHOT, - PROGRESSIVE_WALLET, - PROGRESSIVE_SCALE, - PROGRESSIVE_NUT_UPGRADE, - PROGRESSIVE_STICK_UPGRADE, - PROGRESSIVE_MAGIC_METER, - PROGRESSIVE_OCARINA, - PROGRESSIVE_BOMBCHUS, - PROGRESSIVE_GORONSWORD, - - //Keys just used for logic - BOW, - SLINGSHOT, - HOOKSHOT, - LONGSHOT, - SILVER_GAUNTLETS, - GOLDEN_GAUNTLETS, - SILVER_SCALE, - GOLD_SCALE, - SCARECROW, - DISTANT_SCARECROW, - STICKS, - - EMPTY_BOTTLE, - BOTTLE_WITH_MILK, - BOTTLE_WITH_RED_POTION, - BOTTLE_WITH_GREEN_POTION, - BOTTLE_WITH_BLUE_POTION, - BOTTLE_WITH_FAIRY, - BOTTLE_WITH_FISH, - BOTTLE_WITH_BLUE_FIRE, - BOTTLE_WITH_BUGS, - BOTTLE_WITH_POE, - BOTTLE_WITH_BIG_POE, - RUTOS_LETTER, - - ZELDAS_LULLABY, - EPONAS_SONG, - SARIAS_SONG, - SUNS_SONG, - SONG_OF_TIME, - SONG_OF_STORMS, - MINUET_OF_FOREST, - BOLERO_OF_FIRE, - SERENADE_OF_WATER, - REQUIEM_OF_SPIRIT, - NOCTURNE_OF_SHADOW, - PRELUDE_OF_LIGHT, - - MAP, - DEKU_TREE_MAP, - DODONGOS_CAVERN_MAP, - JABU_JABUS_BELLY_MAP, - FOREST_TEMPLE_MAP, - FIRE_TEMPLE_MAP, - WATER_TEMPLE_MAP, - SPIRIT_TEMPLE_MAP, - SHADOW_TEMPLE_MAP, - BOTTOM_OF_THE_WELL_MAP, - ICE_CAVERN_MAP, - - COMPASS, - DEKU_TREE_COMPASS, - DODONGOS_CAVERN_COMPASS, - JABU_JABUS_BELLY_COMPASS, - FOREST_TEMPLE_COMPASS, - FIRE_TEMPLE_COMPASS, - WATER_TEMPLE_COMPASS, - SPIRIT_TEMPLE_COMPASS, - SHADOW_TEMPLE_COMPASS, - BOTTOM_OF_THE_WELL_COMPASS, - ICE_CAVERN_COMPASS, - - BOSS_KEY, - FOREST_TEMPLE_BOSS_KEY, - FIRE_TEMPLE_BOSS_KEY, - WATER_TEMPLE_BOSS_KEY, - SPIRIT_TEMPLE_BOSS_KEY, - SHADOW_TEMPLE_BOSS_KEY, - GANONS_CASTLE_BOSS_KEY, - - SMALL_KEY, - FOREST_TEMPLE_SMALL_KEY, - FIRE_TEMPLE_SMALL_KEY, - WATER_TEMPLE_SMALL_KEY, - SPIRIT_TEMPLE_SMALL_KEY, - SHADOW_TEMPLE_SMALL_KEY, - BOTTOM_OF_THE_WELL_SMALL_KEY, - GERUDO_TRAINING_GROUNDS_SMALL_KEY, - GERUDO_FORTRESS_SMALL_KEY, - GANONS_CASTLE_SMALL_KEY, - TREASURE_GAME_SMALL_KEY, - - FOREST_TEMPLE_KEY_RING, - FIRE_TEMPLE_KEY_RING, - WATER_TEMPLE_KEY_RING, - SPIRIT_TEMPLE_KEY_RING, - SHADOW_TEMPLE_KEY_RING, - BOTTOM_OF_THE_WELL_KEY_RING, - GERUDO_TRAINING_GROUNDS_KEY_RING, - GERUDO_FORTRESS_KEY_RING, - GANONS_CASTLE_KEY_RING, - - KOKIRI_EMERALD, - GORON_RUBY, - ZORA_SAPPHIRE, - FOREST_MEDALLION, - FIRE_MEDALLION, - WATER_MEDALLION, - SPIRIT_MEDALLION, - SHADOW_MEDALLION, - LIGHT_MEDALLION, - - RECOVERY_HEART, - GREEN_RUPEE, - GREG_RUPEE, - BLUE_RUPEE, - RED_RUPEE, - PURPLE_RUPEE, - HUGE_RUPEE, - PIECE_OF_HEART, - HEART_CONTAINER, - ICE_TRAP, - MILK, - - BOMBS_5, - BOMBS_10, - BOMBS_20, - BOMBCHU_5, - BOMBCHU_10, - BOMBCHU_20, - BOMBCHU_DROP, - ARROWS_5, - ARROWS_10, - ARROWS_30, - DEKU_NUTS_5, - DEKU_NUTS_10, - DEKU_SEEDS_30, - DEKU_STICK_1, - RED_POTION_REFILL, - GREEN_POTION_REFILL, - BLUE_POTION_REFILL, - - TREASURE_GAME_HEART, - TREASURE_GAME_GREEN_RUPEE, - - TRIFORCE, - TRIFORCE_PIECE, - TRIFORCE_COMPLETED, - EPONA, - HINT, - - //SHOP ITEMS - BUY_DEKU_NUT_5, - BUY_ARROWS_30, - BUY_ARROWS_50, - BUY_BOMBS_525, - BUY_DEKU_NUT_10, - BUY_DEKU_STICK_1, - BUY_BOMBS_10, - BUY_FISH, - BUY_RED_POTION_30, - BUY_GREEN_POTION, - BUY_BLUE_POTION, - BUY_HYLIAN_SHIELD, - BUY_DEKU_SHIELD, - BUY_GORON_TUNIC, - BUY_ZORA_TUNIC, - BUY_HEART, - BUY_BOMBCHU_10, - BUY_BOMBCHU_20, - BUY_DEKU_SEEDS_30, - SOLD_OUT, - BUY_BLUE_FIRE, - BUY_BOTTLE_BUG, - BUY_POE, - BUY_FAIRYS_SPIRIT, - BUY_ARROWS_10, - BUY_BOMBS_20, - BUY_BOMBS_30, - BUY_BOMBS_535, - BUY_RED_POTION_40, - BUY_RED_POTION_50, - - //ITEMLOCATIONS - - //DUNGEON REWARDS - LINKS_POCKET, - QUEEN_GOHMA, - KING_DODONGO, - BARINADE, - PHANTOM_GANON, - VOLVAGIA, - MORPHA, - BONGO_BONGO, - TWINROVA, - GANON, - - //SONGS - SONG_FROM_IMPA, - SONG_FROM_MALON, - SONG_FROM_SARIA, - SONG_FROM_COMPOSERS_GRAVE, - SONG_FROM_OCARINA_OF_TIME, - SONG_FROM_WINDMILL, - SHEIK_IN_FOREST, - SHEIK_IN_CRATER, - SHEIK_IN_ICE_CAVERN, - SHEIK_AT_COLOSSUS, - SHEIK_IN_KAKARIKO, - SHEIK_AT_TEMPLE, - -//// Overworld -// Kokiri Forest - KF_MIDOS_TOP_LEFT_CHEST, - KF_MIDOS_TOP_RIGHT_CHEST, - KF_MIDOS_BOTTOM_LEFT_CHEST, - KF_MIDOS_BOTTOM_RIGHT_CHEST, - KF_KOKIRI_SWORD_CHEST, - KF_STORMS_GROTTO_CHEST, - KF_LINKS_HOUSE_COW, - KF_GS_KNOW_IT_ALL_HOUSE, - KF_GS_BEAN_PATCH, - KF_GS_HOUSE_OF_TWINS, - KF_SHOP_ITEM_1, - KF_SHOP_ITEM_2, - KF_SHOP_ITEM_3, - KF_SHOP_ITEM_4, - KF_SHOP_ITEM_5, - KF_SHOP_ITEM_6, - KF_SHOP_ITEM_7, - KF_SHOP_ITEM_8, -//LOST_WOODS - LW_GIFT_FROM_SARIA, - LW_OCARINA_MEMORY_GAME, - LW_TARGET_IN_WOODS, - LW_NEAR_SHORTCUTS_GROTTO_CHEST, - DEKU_THEATER_SKULL_MASK, - DEKU_THEATER_MASK_OF_TRUTH, - LW_SKULL_KID, - LW_TRADE_COJIRO, - LW_TRADE_ODD_POTION, - LW_DEKU_SCRUB_NEAR_BRIDGE, - LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, - LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, - LW_DEKU_SCRUB_GROTTO_FRONT, - LW_DEKU_SCRUB_GROTTO_REAR, - LW_GS_BEAN_PATCH_NEAR_BRIDGE, - LW_GS_BEAN_PATCH_NEAR_THEATER, - LW_GS_ABOVE_THEATER, -//SACRED_FOREST_MEADOW - SFM_WOLFOS_GROTTO_CHEST, - SFM_DEKU_SCRUB_GROTTO_FRONT, - SFM_DEKU_SCRUB_GROTTO_REAR, - SFM_GS, -//HYRULE_FIELD - HF_OCARINA_OF_TIME_ITEM, - HF_NEAR_MARKET_GROTTO_CHEST, - HF_TEKTITE_GROTTO_FREESTANDING_POH, - HF_SOUTHEAST_GROTTO_CHEST, - HF_OPEN_GROTTO_CHEST, - HF_DEKU_SCRUB_GROTTO, - HF_COW_GROTTO_COW, - HF_GS_COW_GROTTO, - HF_GS_NEAR_KAK_GROTTO, -//MARKET - MARKET_SHOOTING_GALLERY_REWARD, - MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, - MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, - MARKET_BOMBCHU_BOWLING_BOMBCHUS, - MARKET_LOST_DOG, - MARKET_TREASURE_CHEST_GAME_REWARD, - MARKET_TREASURE_CHEST_GAME_ITEM_1, - MARKET_TREASURE_CHEST_GAME_ITEM_2, - MARKET_TREASURE_CHEST_GAME_ITEM_3, - MARKET_TREASURE_CHEST_GAME_ITEM_4, - MARKET_TREASURE_CHEST_GAME_ITEM_5, - MARKET_10_BIG_POES, - MARKET_GS_GUARD_HOUSE, - MARKET_BAZAAR_ITEM_1, - MARKET_BAZAAR_ITEM_2, - MARKET_BAZAAR_ITEM_3, - MARKET_BAZAAR_ITEM_4, - MARKET_BAZAAR_ITEM_5, - MARKET_BAZAAR_ITEM_6, - MARKET_BAZAAR_ITEM_7, - MARKET_BAZAAR_ITEM_8, - MARKET_POTION_SHOP_ITEM_1, - MARKET_POTION_SHOP_ITEM_2, - MARKET_POTION_SHOP_ITEM_3, - MARKET_POTION_SHOP_ITEM_4, - MARKET_POTION_SHOP_ITEM_5, - MARKET_POTION_SHOP_ITEM_6, - MARKET_POTION_SHOP_ITEM_7, - MARKET_POTION_SHOP_ITEM_8, - MARKET_BOMBCHU_SHOP_ITEM_1, - MARKET_BOMBCHU_SHOP_ITEM_2, - MARKET_BOMBCHU_SHOP_ITEM_3, - MARKET_BOMBCHU_SHOP_ITEM_4, - MARKET_BOMBCHU_SHOP_ITEM_5, - MARKET_BOMBCHU_SHOP_ITEM_6, - MARKET_BOMBCHU_SHOP_ITEM_7, - MARKET_BOMBCHU_SHOP_ITEM_8, - TOT_LIGHT_ARROWS_CUTSCENE, -//HYRULE_CASTLE - HC_MALON_EGG, - HC_ZELDAS_LETTER, - HC_GREAT_FAIRY_REWARD, - HC_GS_TREE, - HC_GS_STORMS_GROTTO, -//LON_LON_RANCH - LLR_TALONS_CHICKENS, - LLR_FREESTANDING_POH, - LLR_DEKU_SCRUB_GROTTO_LEFT, - LLR_DEKU_SCRUB_GROTTO_CENTER, - LLR_DEKU_SCRUB_GROTTO_RIGHT, - LLR_STABLES_LEFT_COW, - LLR_STABLES_RIGHT_COW, - LLR_TOWER_LEFT_COW, - LLR_TOWER_RIGHT_COW, - LLR_GS_HOUSE_WINDOW, - LLR_GS_TREE, - LLR_GS_RAIN_SHED, - LLR_GS_BACK_WALL, -//KAKARIKO - KAK_ANJU_AS_CHILD, - KAK_ANJU_AS_ADULT, - KAK_TRADE_POCKET_CUCCO, - KAK_IMPAS_HOUSE_FREESTANDING_POH, - KAK_WINDMILL_FREESTANDING_POH, - KAK_MAN_ON_ROOF, - KAK_OPEN_GROTTO_CHEST, - KAK_REDEAD_GROTTO_CHEST, - KAK_SHOOTING_GALLERY_REWARD, - KAK_TRADE_ODD_MUSHROOM, - KAK_GRANNYS_SHOP, - KAK_10_GOLD_SKULLTULA_REWARD, - KAK_20_GOLD_SKULLTULA_REWARD, - KAK_30_GOLD_SKULLTULA_REWARD, - KAK_40_GOLD_SKULLTULA_REWARD, - KAK_50_GOLD_SKULLTULA_REWARD, - KAK_100_GOLD_SKULLTULA_REWARD, - KAK_IMPAS_HOUSE_COW, - KAK_GS_TREE, - KAK_GS_GUARDS_HOUSE, - KAK_GS_WATCHTOWER, - KAK_GS_SKULLTULA_HOUSE, - KAK_GS_HOUSE_UNDER_CONSTRUCTION, - KAK_GS_ABOVE_IMPAS_HOUSE, - KAK_BAZAAR_ITEM_1, - KAK_BAZAAR_ITEM_2, - KAK_BAZAAR_ITEM_3, - KAK_BAZAAR_ITEM_4, - KAK_BAZAAR_ITEM_5, - KAK_BAZAAR_ITEM_6, - KAK_BAZAAR_ITEM_7, - KAK_BAZAAR_ITEM_8, - KAK_POTION_SHOP_ITEM_1, - KAK_POTION_SHOP_ITEM_2, - KAK_POTION_SHOP_ITEM_3, - KAK_POTION_SHOP_ITEM_4, - KAK_POTION_SHOP_ITEM_5, - KAK_POTION_SHOP_ITEM_6, - KAK_POTION_SHOP_ITEM_7, - KAK_POTION_SHOP_ITEM_8, -//GRAVEYARD - GRAVEYARD_SHIELD_GRAVE_CHEST, - GRAVEYARD_HEART_PIECE_GRAVE_CHEST, - GRAVEYARD_COMPOSERS_GRAVE_CHEST, - GRAVEYARD_FREESTANDING_POH, - GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, - GRAVEYARD_HOOKSHOT_CHEST, - GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, - GRAVEYARD_GS_BEAN_PATCH, - GRAVEYARD_GS_WALL, -//DEATH_MOUNTAIN_TRAIL - DMT_FREESTANDING_POH, - DMT_CHEST, - DMT_STORMS_GROTTO_CHEST, - DMT_GREAT_FAIRY_REWARD, - DMT_TRADE_BROKEN_SWORD, - DMT_TRADE_EYEDROPS, - DMT_TRADE_CLAIM_CHECK, - DMT_COW_GROTTO_COW, - DMT_GS_NEAR_KAK, - DMT_GS_BEAN_PATCH, - DMT_GS_ABOVE_DODONGOS_CAVERN, - DMT_GS_FALLING_ROCKS_PATH, -//GORON_CITY - GC_DARUNIAS_JOY, - GC_POT_FREESTANDING_POH, - GC_ROLLING_GORON_AS_CHILD, - GC_ROLLING_GORON_AS_ADULT, - GC_MEDIGORON, - GC_MAZE_LEFT_CHEST, - GC_MAZE_RIGHT_CHEST, - GC_MAZE_CENTER_CHEST, - GC_DEKU_SCRUB_GROTTO_LEFT, - GC_DEKU_SCRUB_GROTTO_CENTER, - GC_DEKU_SCRUB_GROTTO_RIGHT, - GC_GS_CENTER_PLATFORM, - GC_GS_BOULDER_MAZE, - GC_SHOP_ITEM_1, - GC_SHOP_ITEM_2, - GC_SHOP_ITEM_3, - GC_SHOP_ITEM_4, - GC_SHOP_ITEM_5, - GC_SHOP_ITEM_6, - GC_SHOP_ITEM_7, - GC_SHOP_ITEM_8, -//DEATH_MOUNTAIN_CRATER - DMC_VOLCANO_FREESTANDING_POH, - DMC_WALL_FREESTANDING_POH, - DMC_UPPER_GROTTO_CHEST, - DMC_GREAT_FAIRY_REWARD, - DMC_DEKU_SCRUB, - DMC_DEKU_SCRUB_GROTTO_LEFT, - DMC_DEKU_SCRUB_GROTTO_CENTER, - DMC_DEKU_SCRUB_GROTTO_RIGHT, - DMC_GS_CRATE, - DMC_GS_BEAN_PATCH, -//ZORA'S_RIVER - ZR_MAGIC_BEAN_SALESMAN, - ZR_OPEN_GROTTO_CHEST, - ZR_FROGS_ZELDAS_LULLABY, - ZR_FROGS_EPONAS_SONG, - ZR_FROGS_SARIAS_SONG, - ZR_FROGS_SUNS_SONG, - ZR_FROGS_SONG_OF_TIME, - ZR_FROGS_IN_THE_RAIN, - ZR_FROGS_OCARINA_GAME, - ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, - ZR_NEAR_DOMAIN_FREESTANDING_POH, - ZR_DEKU_SCRUB_GROTTO_FRONT, - ZR_DEKU_SCRUB_GROTTO_REAR, - ZR_GS_TREE, - ZR_GS_LADDER, - ZR_GS_NEAR_RAISED_GROTTOS, - ZR_GS_ABOVE_BRIDGE, -//ZORA'S_DOMAIN - ZD_DIVING_MINIGAME, - ZD_CHEST, - ZD_KING_ZORA_THAWED, - ZD_TRADE_PRESCRIPTION, - ZD_GS_FROZEN_WATERFALL, - ZD_SHOP_ITEM_1, - ZD_SHOP_ITEM_2, - ZD_SHOP_ITEM_3, - ZD_SHOP_ITEM_4, - ZD_SHOP_ITEM_5, - ZD_SHOP_ITEM_6, - ZD_SHOP_ITEM_7, - ZD_SHOP_ITEM_8, -//ZORA'S_FOUNTAIN - ZF_GREAT_FAIRY_REWARD, - ZF_ICEBERG_FREESTANDING_POH, - ZF_BOTTOM_FREESTANDING_POH, - ZF_GS_ABOVE_THE_LOG, - ZF_GS_TREE, - ZF_GS_HIDDEN_CAVE, -//LAKE_HYLIA - LH_UNDERWATER_ITEM, - LH_CHILD_FISHING, - LH_ADULT_FISHING, - LH_LAB_DIVE, - LH_TRADE_FROG, - LH_FREESTANDING_POH, - LH_SUN, - LH_DEKU_SCRUB_GROTTO_LEFT, - LH_DEKU_SCRUB_GROTTO_CENTER, - LH_DEKU_SCRUB_GROTTO_RIGHT, - LH_GS_BEAN_PATCH, - LH_GS_LAB_WALL, - LH_GS_SMALL_ISLAND, - LH_GS_LAB_CRATE, - LH_GS_TREE, -//GERUDO_VALLEY - GV_CRATE_FREESTANDING_POH, - GV_WATERFALL_FREESTANDING_POH, - GV_CHEST, - GV_TRADE_SAW, - GV_DEKU_SCRUB_GROTTO_FRONT, - GV_DEKU_SCRUB_GROTTO_REAR, - GV_COW, - GV_GS_SMALL_BRIDGE, - GV_GS_BEAN_PATCH, - GV_GS_BEHIND_TENT, - GV_GS_PILLAR, -//GERUDO'S_FORTRESS - GF_NORTH_F1_CARPENTER, - GF_NORTH_F2_CARPENTER, - GF_SOUTH_F1_CARPENTER, - GF_SOUTH_F2_CARPENTER, - GF_GERUDO_MEMBERSHIP_CARD, - GF_CHEST, - GF_HBA_1000_POINTS, - GF_HBA_1500_POINTS, - GF_GS_TOP_FLOOR, - GF_GS_ARCHERY_RANGE, -//WASTELAND - WASTELAND_BOMBCHU_SALESMAN, - WASTELAND_CHEST, - WASTELAND_GS, -//COLOSSUS - COLOSSUS_GREAT_FAIRY_REWARD, - COLOSSUS_FREESTANDING_POH, - COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, - COLOSSUS_DEKU_SCRUB_GROTTO_REAR, - COLOSSUS_GS_BEAN_PATCH, - COLOSSUS_GS_TREE, - COLOSSUS_GS_HILL, -//OUTSIDE_GANON'S_CASTLE - OGC_GREAT_FAIRY_REWARD, - OGC_GS, - -////DUNGEONS -//DEKU_TREE_VANILLA - DEKU_TREE_MAP_CHEST, - DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, - DEKU_TREE_SLINGSHOT_CHEST, - DEKU_TREE_COMPASS_CHEST, - DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, - DEKU_TREE_BASEMENT_CHEST, - DEKU_TREE_GS_COMPASS_ROOM, - DEKU_TREE_GS_BASEMENT_VINES, - DEKU_TREE_GS_BASEMENT_GATE, - DEKU_TREE_GS_BASEMENT_BACK_ROOM, -//DEKU_TREE_MQ - DEKU_TREE_MQ_MAP_CHEST, - DEKU_TREE_MQ_SLINGSHOT_CHEST, - DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, - DEKU_TREE_MQ_COMPASS_CHEST, - DEKU_TREE_MQ_BASEMENT_CHEST, - DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, - DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, - DEKU_TREE_MQ_DEKU_SCRUB, - DEKU_TREE_MQ_GS_LOBBY, - DEKU_TREE_MQ_GS_COMPASS_ROOM, - DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, - DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, -//DEKU_TREE_SHARED - DEKU_TREE_QUEEN_GOHMA_HEART, -//DODONGO'S_CAVERN_VANILLA - DODONGOS_CAVERN_MAP_CHEST, - DODONGOS_CAVERN_COMPASS_CHEST, - DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, - DODONGOS_CAVERN_BOMB_BAG_CHEST, - DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, - DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, - DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, - DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, - DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, - DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, - DODONGOS_CAVERN_GS_SCARECROW, - DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, - DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS, - DODONGOS_CAVERN_GS_BACK_ROOM, -//DODONGO'S_CAVERN_MQ - DODONGOS_CAVERN_MQ_MAP_CHEST, - DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST, - DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST, - DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, - DODONGOS_CAVERN_MQ_COMPASS_CHEST, - DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, - DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, - DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, - DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, - DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, - DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, - DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, - DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, - DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, - DODONGOS_CAVERN_MQ_GS_BACK_AREA, -//DODONGO'S_CAVERN_SHARED - DODONGOS_CAVERN_BOSS_ROOM_CHEST, - DODONGOS_CAVERN_KING_DODONGO_HEART, -//JABU_JABU'S_BELLY_VANILLA - JABU_JABUS_BELLY_BOOMERANG_CHEST, - JABU_JABUS_BELLY_MAP_CHEST, - JABU_JABUS_BELLY_COMPASS_CHEST, - JABU_JABUS_BELLY_DEKU_SCRUB, - JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM, - JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER, - JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER, - JABU_JABUS_BELLY_GS_NEAR_BOSS, -//JABU_JABU'S_BELLY_MQ - JABU_JABUS_BELLY_MQ_MAP_CHEST, - JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, - JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST, - JABU_JABUS_BELLY_MQ_COMPASS_CHEST, - JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, - JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, - JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, - JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, - JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, - JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST, - JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, - JABU_JABUS_BELLY_MQ_COW, - JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, - JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, - JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, - JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, -//JABU_JABU'S_BELLY_SHARED - JABU_JABUS_BELLY_BARINADE_HEART, -//BOTTOM_OF_THE_WELL_VANILLA - BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, - BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST, - BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST, - BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST, - BOTTOM_OF_THE_WELL_FREESTANDING_KEY, - BOTTOM_OF_THE_WELL_COMPASS_CHEST, - BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST, - BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST, - BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST, - BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST, - BOTTOM_OF_THE_WELL_MAP_CHEST, - BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST, - BOTTOM_OF_THE_WELL_INVISIBLE_CHEST, - BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST, - BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, - BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, - BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, -//BOTTOM_OF_THE_WELL_MQ - BOTTOM_OF_THE_WELL_MQ_MAP_CHEST, - BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY, - BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, - BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY, - BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST, - BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, - BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM, - BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, -//FOREST_TEMPLE_VANILLA - FOREST_TEMPLE_FIRST_ROOM_CHEST, - FOREST_TEMPLE_FIRST_STALFOS_CHEST, - FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, - FOREST_TEMPLE_MAP_CHEST, - FOREST_TEMPLE_WELL_CHEST, - FOREST_TEMPLE_EYE_SWITCH_CHEST, - FOREST_TEMPLE_BOSS_KEY_CHEST, - FOREST_TEMPLE_FLOORMASTER_CHEST, - FOREST_TEMPLE_RED_POE_CHEST, - FOREST_TEMPLE_BOW_CHEST, - FOREST_TEMPLE_BLUE_POE_CHEST, - FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST, - FOREST_TEMPLE_BASEMENT_CHEST, - FOREST_TEMPLE_GS_FIRST_ROOM, - FOREST_TEMPLE_GS_LOBBY, - FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, - FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, - FOREST_TEMPLE_GS_BASEMENT, -//FOREST_TEMPLE_MQ - FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST, - FOREST_TEMPLE_MQ_WOLFOS_CHEST, - FOREST_TEMPLE_MQ_WELL_CHEST, - FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST, - FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST, - FOREST_TEMPLE_MQ_BOSS_KEY_CHEST, - FOREST_TEMPLE_MQ_REDEAD_CHEST, - FOREST_TEMPLE_MQ_MAP_CHEST, - FOREST_TEMPLE_MQ_BOW_CHEST, - FOREST_TEMPLE_MQ_COMPASS_CHEST, - FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST, - FOREST_TEMPLE_MQ_BASEMENT_CHEST, - FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY, - FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, - FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, - FOREST_TEMPLE_MQ_GS_WELL, - FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM, -//FOREST_TEMPLE_SHARED - FOREST_TEMPLE_PHANTOM_GANON_HEART, -//FIRE_TEMPLE_VANILLA - FIRE_TEMPLE_NEAR_BOSS_CHEST, - FIRE_TEMPLE_FLARE_DANCER_CHEST, - FIRE_TEMPLE_BOSS_KEY_CHEST, - FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST, - FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, - FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST, - FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST, - FIRE_TEMPLE_MAP_CHEST, - FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST, - FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST, - FIRE_TEMPLE_SCARECROW_CHEST, - FIRE_TEMPLE_COMPASS_CHEST, - FIRE_TEMPLE_MEGATON_HAMMER_CHEST, - FIRE_TEMPLE_HIGHEST_GORON_CHEST, - FIRE_TEMPLE_GS_BOSS_KEY_LOOP, - FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM, - FIRE_TEMPLE_GS_BOULDER_MAZE, - FIRE_TEMPLE_GS_SCARECROW_CLIMB, - FIRE_TEMPLE_GS_SCARECROW_TOP, -//FIRE_TEMPLE_MQ - FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, - FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, - FIRE_TEMPLE_MQ_MAP_CHEST, - FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, - FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, - FIRE_TEMPLE_MQ_BOSS_KEY_CHEST, - FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, - FIRE_TEMPLE_MQ_COMPASS_CHEST, - FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, - FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, - FIRE_TEMPLE_MQ_FREESTANDING_KEY, - FIRE_TEMPLE_MQ_CHEST_ON_FIRE, - FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, - FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE, - FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER, - FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, - FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE, -//FIRE_TEMPLE_SHARED - FIRE_TEMPLE_VOLVAGIA_HEART, -//WATER_TEMPLE_VANILLA - WATER_TEMPLE_COMPASS_CHEST, - WATER_TEMPLE_MAP_CHEST, - WATER_TEMPLE_CRACKED_WALL_CHEST, - WATER_TEMPLE_TORCHES_CHEST, - WATER_TEMPLE_BOSS_KEY_CHEST, - WATER_TEMPLE_CENTRAL_PILLAR_CHEST, - WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST, - WATER_TEMPLE_LONGSHOT_CHEST, - WATER_TEMPLE_RIVER_CHEST, - WATER_TEMPLE_DRAGON_CHEST, - WATER_TEMPLE_GS_BEHIND_GATE, - WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST, - WATER_TEMPLE_GS_CENTRAL_PILLAR, - WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM, - WATER_TEMPLE_GS_RIVER, -//WATER_TEMPLE_MQ - WATER_TEMPLE_MQ_LONGSHOT_CHEST, - WATER_TEMPLE_MQ_MAP_CHEST, - WATER_TEMPLE_MQ_COMPASS_CHEST, - WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, - WATER_TEMPLE_MQ_BOSS_KEY_CHEST, - WATER_TEMPLE_MQ_FREESTANDING_KEY, - WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, - WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH, - WATER_TEMPLE_MQ_GS_RIVER, - WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, - WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, -//WATER_TEMPLE_SHARED - WATER_TEMPLE_MORPHA_HEART, -//SHADOW_TEMPLE_VANILLA - SHADOW_TEMPLE_MAP_CHEST, - SHADOW_TEMPLE_HOVER_BOOTS_CHEST, - SHADOW_TEMPLE_COMPASS_CHEST, - SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, - SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, - SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, - SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST, - SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST, - SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST, - SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST, - SHADOW_TEMPLE_FREESTANDING_KEY, - SHADOW_TEMPLE_WIND_HINT_CHEST, - SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, - SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, - SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, - SHADOW_TEMPLE_BOSS_KEY_CHEST, - SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, - SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, - SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, - SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, - SHADOW_TEMPLE_GS_NEAR_SHIP, - SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, -//SHADOW_TEMPLE_MQ - SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, - SHADOW_TEMPLE_MQ_MAP_CHEST, - SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, - SHADOW_TEMPLE_MQ_COMPASS_CHEST, - SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST, - SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST, - SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST, - SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, - SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST, - SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST, - SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST, - SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST, - SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST, - SHADOW_TEMPLE_MQ_WIND_HINT_CHEST, - SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST, - SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST, - SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST, - SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST, - SHADOW_TEMPLE_MQ_FREESTANDING_KEY, - SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST, - SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM, - SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, - SHADOW_TEMPLE_MQ_GS_AFTER_WIND, - SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, - SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, -//SHADOW_TEMPLE_SHARED - SHADOW_TEMPLE_BONGO_BONGO_HEART, -//SPIRIT_TEMPLE_SHARED -//VANILLA_AND_MQ_LOCATIONS_ARE_MIXED_TO_ENSURE_THE_POSITIONS_OF_S - SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, - SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, - SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, - SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, - SPIRIT_TEMPLE_MAP_CHEST, - SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST, - SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST, - SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST, - SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST, - SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST, - SPIRIT_TEMPLE_MQ_MAP_CHEST, - SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST, - SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST, - SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST, - SPIRIT_TEMPLE_MQ_COMPASS_CHEST, - SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, - SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST, - SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, - SPIRIT_TEMPLE_COMPASS_CHEST, - SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, - SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, - SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, - SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST, - SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST, - SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, - SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, - SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, - SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST, - SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, - SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST, - SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST, - SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST, - SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, - SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST, - SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST, - SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, - SPIRIT_TEMPLE_BOSS_KEY_CHEST, - SPIRIT_TEMPLE_TOPMOST_CHEST, - SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST, - SPIRIT_TEMPLE_GS_METAL_FENCE, - SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, - SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM, - SPIRIT_TEMPLE_GS_LOBBY, - SPIRIT_TEMPLE_GS_BOULDER_ROOM, - SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM, - SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM, - SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM, - SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, - SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, - SPIRIT_TEMPLE_TWINROVA_HEART, -//ICE_CAVERN_VANILLA - ICE_CAVERN_MAP_CHEST, - ICE_CAVERN_COMPASS_CHEST, - ICE_CAVERN_FREESTANDING_POH, - ICE_CAVERN_IRON_BOOTS_CHEST, - ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, - ICE_CAVERN_GS_HEART_PIECE_ROOM, - ICE_CAVERN_GS_PUSH_BLOCK_ROOM, -//ICE_CAVERN_MQ - ICE_CAVERN_MQ_MAP_CHEST, - ICE_CAVERN_MQ_COMPASS_CHEST, - ICE_CAVERN_MQ_FREESTANDING_POH, - ICE_CAVERN_MQ_IRON_BOOTS_CHEST, - ICE_CAVERN_MQ_GS_RED_ICE, - ICE_CAVERN_MQ_GS_ICE_BLOCK, - ICE_CAVERN_MQ_GS_SCARECROW, -//GERUDO_TRAINING_GROUNDS_VANILLA - GERUDO_TRAINING_GROUNDS_LOBBY_LEFT_CHEST, - GERUDO_TRAINING_GROUNDS_LOBBY_RIGHT_CHEST, - GERUDO_TRAINING_GROUNDS_STALFOS_CHEST, - GERUDO_TRAINING_GROUNDS_BEFORE_HEAVY_BLOCK_CHEST, - GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_FIRST_CHEST, - GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_SECOND_CHEST, - GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_THIRD_CHEST, - GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_FOURTH_CHEST, - GERUDO_TRAINING_GROUNDS_EYE_STATUE_CHEST, - GERUDO_TRAINING_GROUNDS_NEAR_SCARECROW_CHEST, - GERUDO_TRAINING_GROUNDS_HAMMER_ROOM_CLEAR_CHEST, - GERUDO_TRAINING_GROUNDS_HAMMER_ROOM_SWITCH_CHEST, - GERUDO_TRAINING_GROUNDS_FREESTANDING_KEY, - GERUDO_TRAINING_GROUNDS_MAZE_RIGHT_CENTRAL_CHEST, - GERUDO_TRAINING_GROUNDS_MAZE_RIGHT_SIDE_CHEST, - GERUDO_TRAINING_GROUNDS_UNDERWATER_SILVER_RUPEE_CHEST, - GERUDO_TRAINING_GROUNDS_BEAMOS_CHEST, - GERUDO_TRAINING_GROUNDS_HIDDEN_CEILING_CHEST, - GERUDO_TRAINING_GROUNDS_MAZE_PATH_FIRST_CHEST, - GERUDO_TRAINING_GROUNDS_MAZE_PATH_SECOND_CHEST, - GERUDO_TRAINING_GROUNDS_MAZE_PATH_THIRD_CHEST, - GERUDO_TRAINING_GROUNDS_MAZE_PATH_FINAL_CHEST, -//GERUDO_TRAINING_GROUNDS_MQ - GERUDO_TRAINING_GROUNDS_MQ_LOBBY_LEFT_CHEST, - GERUDO_TRAINING_GROUNDS_MQ_LOBBY_RIGHT_CHEST, - GERUDO_TRAINING_GROUNDS_MQ_FIRST_IRON_KNUCKLE_CHEST, - GERUDO_TRAINING_GROUNDS_MQ_BEFORE_HEAVY_BLOCK_CHEST, - GERUDO_TRAINING_GROUNDS_MQ_HEAVY_BLOCK_CHEST, - GERUDO_TRAINING_GROUNDS_MQ_EYE_STATUE_CHEST, - GERUDO_TRAINING_GROUNDS_MQ_ICE_ARROWS_CHEST, - GERUDO_TRAINING_GROUNDS_MQ_SECOND_IRON_KNUCKLE_CHEST, - GERUDO_TRAINING_GROUNDS_MQ_FLAME_CIRCLE_CHEST, - GERUDO_TRAINING_GROUNDS_MQ_MAZE_RIGHT_CENTRAL_CHEST, - GERUDO_TRAINING_GROUNDS_MQ_MAZE_RIGHT_SIDE_CHEST, - GERUDO_TRAINING_GROUNDS_MQ_UNDERWATER_SILVER_RUPEE_CHEST, - GERUDO_TRAINING_GROUNDS_MQ_DINOLFOS_CHEST, - GERUDO_TRAINING_GROUNDS_MQ_HIDDEN_CEILING_CHEST, - GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_FIRST_CHEST, - GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_THIRD_CHEST, - GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_SECOND_CHEST, -//GANON'S_CASTLE_VANILLA - GANONS_CASTLE_FOREST_TRIAL_CHEST, - GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST, - GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST, - GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST, - GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST, - GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST, - GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST, - GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST, - GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST, - GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST, - GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST, - GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST, - GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST, - GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, - GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, - GANONS_CASTLE_DEKU_SCRUB_LEFT, - GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, - GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, - GANONS_CASTLE_DEKU_SCRUB_RIGHT, -//GANON'S_CASTLE_MQ - GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, - GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, - GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST, - GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, - GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST, - GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, - GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, - GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST, - GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, - GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST, - GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST, - GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST, - GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST, - GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, - GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, - GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, - GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, - GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, -//GANON'S_CASTLE_SHARED - GANONS_TOWER_BOSS_KEY_CHEST, - -////EVENTS_AND_DROPS - PIERRE, - DELIVER_RUTOS_LETTER, - MASTER_SWORD_PEDESTAL, - DEKU_BABA_STICKS, - DEKU_BABA_NUTS, - STICK_POT, - NUT_POT, - NUT_CRATE, - BLUE_FIRE, - LONE_FISH, - FISH_GROUP, - BUG_ROCK, - BUG_SHRUB, - WANDERING_BUGS, - FAIRY_POT, - FREE_FAIRIES, - WALL_FAIRY, - BUTTERFLY_FAIRY, - GOSSIP_STONE_FAIRY, - BEAN_PLANT_FAIRY, - FAIRY_POND, - BIG_POE_KILL, - - //HINT LOACTIONS - DMC_GOSSIP_STONE, - DMT_GOSSIP_STONE, - COLOSSUS_GOSSIP_STONE, - DODONGOS_CAVERN_GOSSIP_STONE, - GV_GOSSIP_STONE, - GC_MAZE_GOSSIP_STONE, - GC_MEDIGORON_GOSSIP_STONE, - GRAVEYARD_GOSSIP_STONE, - HC_MALON_GOSSIP_STONE, - HC_ROCK_WALL_GOSSIP_STONE, - HC_STORMS_GROTTO_GOSSIP_STONE, - HF_COW_GROTTO_GOSSIP_STONE, - KF_DEKU_TREE_GOSSIP_STONE_LEFT, - KF_DEKU_TREE_GOSSIP_STONE_RIGHT, - KF_GOSSIP_STONE, - LH_LAB_GOSSIP_STONE, - LH_GOSSIP_STONE_SOUTHEAST, - LH_GOSSIP_STONE_SOUTHWEST, - LW_GOSSIP_STONE, - SFM_MAZE_GOSSIP_STONE_LOWER, - SFM_MAZE_GOSSIP_STONE_UPPER, - SFM_SARIA_GOSSIP_STONE, - TOT_GOSSIP_STONE_LEFT, - TOT_GOSSIP_STONE_LEFT_CENTER, - TOT_GOSSIP_STONE_RIGHT, - TOT_GOSSIP_STONE_RIGHT_CENTER, - ZD_GOSSIP_STONE, - ZF_FAIRY_GOSSIP_STONE, - ZF_JABU_GOSSIP_STONE, - ZR_NEAR_GROTTOS_GOSSIP_STONE, - ZR_NEAR_DOMAIN_GOSSIP_STONE, - HF_NEAR_MARKET_GROTTO_GOSSIP_STONE, - HF_SOUTHEAST_GROTTO_GOSSIP_STONE, - HF_OPEN_GROTTO_GOSSIP_STONE, - KAK_OPEN_GROTTO_GOSSIP_STONE, - ZR_OPEN_GROTTO_GOSSIP_STONE, - KF_STORMS_GROTTO_GOSSIP_STONE, - LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE, - DMT_STORMS_GROTTO_GOSSIP_STONE, - DMC_UPPER_GROTTO_GOSSIP_STONE, - GANONDORF_HINT, - - //ENTRANCES - DESERT_COLOSSUS_TO_COLOSSUS_GROTTO, - GV_GROTTO_LEDGE_TO_GV_OCTOROK_GROTTO, - GC_GROTTO_PLATFORM_TO_GC_GROTTO, - GERUDO_FORTRESS_TO_GF_STORMS_GROTTO, - ZORAS_DOMAIN_TO_ZD_STORMS_GROTTO, - HYRULE_CASTLE_GROUNDS_TO_HC_STORMS_GROTTO, - GV_FORTRESS_SIDE_TO_GV_STORMS_GROTTO, - DESERT_COLOSSUS_TO_COLOSSUS_GREAT_FAIRY_FOUNTAIN, - GANONS_CASTLE_GROUNDS_TO_OGC_GREAT_FAIRY_FOUNTAIN, - ZORAS_FOUNTAIN_TO_ZF_GREAT_FAIRY_FOUNTAIN, - GV_FORTRESS_SIDE_TO_GV_CARPENTER_TENT, - GRAVEYARD_WARP_PAD_REGION_TO_SHADOW_TEMPLE_ENTRYWAY, - LAKE_HYLIA_TO_WATER_TEMPLE_LOBBY, - GERUDO_FORTRESS_TO_GERUDO_TRAINING_GROUNDS_LOBBY, - ZORAS_FOUNTAIN_TO_JABU_JABUS_BELLY_BEGINNING, - KAKARIKO_VILLAGE_TO_BOTTOM_OF_THE_WELL, - - //EXITS - HYRULE_CASTLE, - OUTSIDE_GANONS_CASTLE, - DEATH_MOUNTAIN_CRATER, - - //AREAS - MARKER_AREAS_START, // Used for area key count - - ROOT, - ROOT_EXITS, - CHILD_SPAWN, - ADULT_SPAWN, - MINUET_OF_FOREST_WARP, - BOLERO_OF_FIRE_WARP, - SERENADE_OF_WATER_WARP, - REQUIEM_OF_SPIRIT_WARP, - NOCTURNE_OF_SHADOW_WARP, - PRELUDE_OF_LIGHT_WARP, - KOKIRI_FOREST, - KF_LINKS_HOUSE, - KF_MIDOS_HOUSE, - KF_SARIAS_HOUSE, - KF_HOUSE_OF_TWINS, - KF_KNOW_IT_ALL_HOUSE, - KF_KOKIRI_SHOP, - KF_OUTSIDE_DEKU_TREE, - KF_STORMS_GROTTO, - THE_LOST_WOODS, - LW_BRIDGE_FROM_FOREST, - LW_BRIDGE, - LW_FOREST_EXIT, - LW_BEYOND_MIDO, - LW_NEAR_SHORTCUTS_GROTTO, - DEKU_THEATER, - LW_SCRUBS_GROTTO, - SFM_ENTRYWAY, - SACRED_FOREST_MEADOW, - SFM_WOLFOS_GROTTO, - SFM_FAIRY_GROTTO, - SFM_STORMS_GROTTO, - HYRULE_FIELD, - HF_SOUTHEAST_GROTTO, - HF_OPEN_GROTTO, - HF_INSIDE_FENCE_GROTTO, - HF_COW_GROTTO, - HF_NEAR_MARKET_GROTTO, - HF_FAIRY_GROTTO, - HF_NEAR_KAK_GROTTO, - HF_TEKTITE_GROTTO, - LAKE_HYLIA, - LH_FISHING_ISLAND, - LH_OWL_FLIGHT, - LH_LAB, - LH_FISHING_HOLE, - LH_GROTTO, - GERUDO_VALLEY, - GV_UPPER_STREAM, - GV_LOWER_STREAM, - GV_GROTTO_LEDGE, - GV_CRATE_LEDGE, - GV_OCTOROK_GROTTO, - GV_FORTRESS_SIDE, - GV_CARPENTER_TENT, - GV_STORMS_GROTTO, - GERUDO_FORTRESS, - GF_OUTSIDE_GATE, - GF_STORMS_GROTTO, - WASTELAND_NEAR_FORTRESS, - HAUNTED_WASTELAND, - WASTELAND_NEAR_COLOSSUS, - DESERT_COLOSSUS, - DESERT_COLOSSUS_FROM_SPIRIT_ENTRYWAY, - COLOSSUS_GREAT_FAIRY_FOUNTAIN, - COLOSSUS_GROTTO, - MARKET_ENTRANCE, - THE_MARKET, - MARKET_GUARD_HOUSE, - MARKET_BAZAAR, - MARKET_MASK_SHOP, - MARKET_SHOOTING_GALLERY, - MARKET_BOMBCHU_BOWLING, - MARKET_TREASURE_CHEST_GAME, - MARKET_POTION_SHOP, - MARKET_BACK_ALLEY, - MARKET_BOMBCHU_SHOP, - MARKET_DOG_LADY_HOUSE, - MARKET_MAN_IN_GREEN_HOUSE, - TOT_ENTRANCE, - TEMPLE_OF_TIME, - TOT_BEYOND_DOOR_OF_TIME, - CASTLE_GROUNDS, - CASTLE_GROUNDS_FROM_GANONS_CASTLE, - HYRULE_CASTLE_GROUNDS, - HC_GARDEN, - HC_GREAT_FAIRY_FOUNTAIN, - HC_STORMS_GROTTO, - GANONS_CASTLE_GROUNDS, - OGC_GREAT_FAIRY_FOUNTAIN, - GANONS_CASTLE_LEDGE, - KAKARIKO_VILLAGE, - KAK_CARPENTER_BOSS_HOUSE, - KAK_HOUSE_OF_SKULLTULA, - KAK_IMPAS_HOUSE, - KAK_IMPAS_LEDGE, - KAK_IMPAS_HOUSE_BACK, - KAK_IMPAS_HOUSE_NEAR_COW, - KAK_WINDMILL, - KAK_BAZAAR, - KAK_SHOOTING_GALLERY, - KAK_POTION_SHOP_FRONT, - KAK_POTION_SHOP_BACK, - KAK_ROOFTOP, - KAK_IMPAS_ROOFTOP, - KAK_BEHIND_GATE, - KAK_BACKYARD, - KAK_ODD_POTION_BUILDING, - KAK_REDEAD_GROTTO, - KAK_OPEN_GROTTO, - THE_GRAVEYARD, - GRAVEYARD_DAMPES_GRAVE, - GRAVEYARD_DAMPES_HOUSE, - GRAVEYARD_SHIELD_GRAVE, - GRAVEYARD_COMPOSERS_GRAVE, - GRAVEYARD_HEART_PIECE_GRAVE, - GRAVEYARD_WARP_PAD_REGION, - DEATH_MOUNTAIN_TRAIL, - DEATH_MOUNTAIN_SUMMIT, - DMT_OWL_FLIGHT, - DMT_GREAT_FAIRY_FOUNTAIN, - DMT_COW_GROTTO, - DMT_STORMS_GROTTO, - GORON_CITY, - GC_WOODS_WARP, - GC_DARUNIAS_CHAMBER, - GC_GROTTO_PLATFORM, - GC_SHOP, - GC_GROTTO, - DMC_UPPER_LOCAL, - DMC_CENTRAL_LOCAL, - DMC_LOWER_LOCAL, - DMC_LOWER_NEARBY, - DMC_UPPER_NEARBY, - DMC_CENTRAL_NEARBY, - DMC_LADDER_AREA_NEARBY, - DMC_UPPER_GROTTO, - DMC_HAMMER_GROTTO, - DMC_GREAT_FAIRY_FOUNTAIN, - ZR_FRONT, - ZORAS_RIVER, - ZR_BEHIND_WATERFALL, - ZR_OPEN_GROTTO, - ZR_FAIRY_GROTTO, - ZR_STORMS_GROTTO, - ZORAS_DOMAIN, - ZD_BEHIND_KING_ZORA, - ZD_SHOP, - ZD_STORMS_GROTTO, - ZORAS_FOUNTAIN, - ZF_GREAT_FAIRY_FOUNTAIN, - LON_LON_RANCH, - LLR_TALONS_HOUSE, - LLR_STABLES, - LLR_TOWER, - LLR_GROTTO, - - DEKU_TREE_ENTRYWAY, - DODONGOS_CAVERN_ENTRYWAY, - JABU_JABUS_BELLY_ENTRYWAY, - FOREST_TEMPLE_ENTRYWAY, - FIRE_TEMPLE_ENTRYWAY, - WATER_TEMPLE_ENTRYWAY, - SPIRIT_TEMPLE_ENTRYWAY, - SHADOW_TEMPLE_ENTRYWAY, - BOTTOM_OF_THE_WELL_ENTRYWAY, - ICE_CAVERN_ENTRYWAY, - GERUDO_TRAINING_GROUNDS_ENTRYWAY, - GANONS_CASTLE_ENTRYWAY, - - DEKU_TREE_LOBBY, - DEKU_TREE_2F_MIDDLE_ROOM, - DEKU_TREE_SLINGSHOT_ROOM, - DEKU_TREE_COMPASS_ROOM, - DEKU_TREE_BASEMENT_LOWER, - DEKU_TREE_BASEMENT_SCRUB_ROOM, - DEKU_TREE_BASEMENT_WATER_ROOM, - DEKU_TREE_BASEMENT_TORCH_ROOM, - DEKU_TREE_BASEMENT_BACK_LOBBY, - DEKU_TREE_BASEMENT_BACK_ROOM, - DEKU_TREE_BASEMENT_UPPER, - DEKU_TREE_OUTSIDE_BOSS_ROOM, - - DEKU_TREE_MQ_LOBBY, - DEKU_TREE_MQ_COMPASS_ROOM, - DEKU_TREE_MQ_BASEMENT_WATER_ROOM_FRONT, - DEKU_TREE_MQ_BASEMENT_WATER_ROOM_BACK, - DEKU_TREE_MQ_BASEMENT_BACK_ROOM, - DEKU_TREE_MQ_BASEMENT_LEDGE, - DEKU_TREE_MQ_OUTSIDE_BOSS_ROOM, - - DEKU_TREE_BOSS_ENTRYWAY, - DEKU_TREE_BOSS_ROOM, - - DODONGOS_CAVERN_BEGINNING, - DODONGOS_CAVERN_LOBBY, - DODONGOS_CAVERN_LOBBY_SWITCH, - DODONGOS_CAVERN_SE_CORRIDOR, - DODONGOS_CAVERN_SE_ROOM, - DODONGOS_CAVERN_NEAR_LOWER_LIZALFOS, - DODONGOS_CAVERN_LOWER_LIZALFOS, - DODONGOS_CAVERN_DODONGO_ROOM, - DODONGOS_CAVERN_NEAR_DODONGO_ROOM, - DODONGOS_CAVERN_STAIRS_LOWER, - DODONGOS_CAVERN_STAIRS_UPPER, - DODONGOS_CAVERN_COMPASS_ROOM, - DODONGOS_CAVERN_ARMOS_ROOM, - DODONGOS_CAVERN_BOMB_ROOM_LOWER, - DODONGOS_CAVERN_2F_SIDE_ROOM, - DODONGOS_CAVERN_FIRST_SLINGSHOT_ROOM, - DODONGOS_CAVERN_UPPER_LIZALFOS, - DODONGOS_CAVERN_SECOND_SLINGSHOT_ROOM, - DODONGOS_CAVERN_BOMB_ROOM_UPPER, - DODONGOS_CAVERN_FAR_BRIDGE, - DODONGOS_CAVERN_BOSS_AREA, - DODONGOS_CAVERN_BACK_ROOM, - - DODONGOS_CAVERN_MQ_BEGINNING, - DODONGOS_CAVERN_MQ_LOBBY, - DODONGOS_CAVERN_MQ_LOWER_RIGHT_SIDE, - DODONGOS_CAVERN_MQ_BOMB_BAG_AREA, - DODONGOS_CAVERN_MQ_BOSS_AREA, - - DODONGOS_CAVERN_BOSS_ENTRYWAY, - DODONGOS_CAVERN_BOSS_ROOM, - - JABU_JABUS_BELLY_BEGINNING, - JABU_JABUS_BELLY_LIFT_MIDDLE, - JABU_JABUS_BELLY_MAIN_UPPER, - JABU_JABUS_BELLY_MAIN_LOWER, - JABU_JABUS_BELLY_SHABOMB_CORRIDOR, - JABU_JABUS_BELLY_LOWER_SIDE_ROOM, - JABU_JABUS_BELLY_LIFT_LOWER, - JABU_JABUS_BELLY_FORKED_CORRIDOR, - JABU_JABUS_BELLY_BOOMERANG_ROOM, - JABU_JABUS_BELLY_MAP_ROOM, - JABU_JABUS_BELLY_COMPASS_ROOM, - JABU_JABUS_BELLY_BLUE_TENTACLE, - JABU_JABUS_BELLY_GREEN_TENTACLE, - JABU_JABUS_BELLY_BIGOCTO_ROOM, - JABU_JABUS_BELLY_ABOVE_BIGOCTO, - JABU_JABUS_BELLY_LIFT_UPPER, - JABU_JABUS_BELLY_NEAR_BOSS_ROOM, - - JABU_JABUS_BELLY_MQ_BEGINNING, - JABU_JABUS_BELLY_MQ_MAIN, - JABU_JABUS_BELLY_MQ_DEPTHS, - JABU_JABUS_BELLY_MQ_BOSS_AREA, - - JABU_JABUS_BELLY_BOSS_ENTRYWAY, - JABU_JABUS_BELLY_BOSS_ROOM, - - FOREST_TEMPLE_FIRST_ROOM, - FOREST_TEMPLE_SOUTH_CORRIDOR, - FOREST_TEMPLE_LOBBY, - FOREST_TEMPLE_NORTH_CORRIDOR, - FOREST_TEMPLE_LOWER_STALFOS, - FOREST_TEMPLE_NW_OUTDOORS_LOWER, - FOREST_TEMPLE_NW_OUTDOORS_UPPER, - FOREST_TEMPLE_NE_OUTDOORS_LOWER, - FOREST_TEMPLE_NE_OUTDOORS_UPPER, - FOREST_TEMPLE_MAP_ROOM, - FOREST_TEMPLE_SEWER, - FOREST_TEMPLE_BELOW_BOSS_KEY_CHEST, - FOREST_TEMPLE_FLOORMASTER_ROOM, - FOREST_TEMPLE_WEST_CORRIDOR, - FOREST_TEMPLE_BLOCK_PUSH_ROOM, - FOREST_TEMPLE_NW_CORRIDOR_TWISTED, - FOREST_TEMPLE_NW_CORRIDOR_STRAIGHTENED, - FOREST_TEMPLE_RED_POE_ROOM, - FOREST_TEMPLE_UPPER_STALFOS, - FOREST_TEMPLE_BLUE_POE_ROOM, - FOREST_TEMPLE_NE_CORRIDOR_STRAIGHTENED, - FOREST_TEMPLE_NE_CORRIDOR_TWISTED, - FOREST_TEMPLE_FROZEN_EYE_ROOM, - FOREST_TEMPLE_FALLING_ROOM, - FOREST_TEMPLE_GREEN_POE_ROOM, - FOREST_TEMPLE_EAST_CORRIDOR, - FOREST_TEMPLE_BOSS_REGION, - - FOREST_TEMPLE_MQ_LOBBY, - FOREST_TEMPLE_MQ_CENTRAL_AREA, - FOREST_TEMPLE_MQ_AFTER_BLOCK_PUZZLE, - FOREST_TEMPLE_MQ_OUTDOOR_LEDGE, - FOREST_TEMPLE_MQ_NW_OUTDOORS, - FOREST_TEMPLE_MQ_NE_OUTDOORS, - FOREST_TEMPLE_MQ_OUTDOORS_TOP_LEDGES, - FOREST_TEMPLE_MQ_NE_OUTDOORS_LEDGE, - FOREST_TEMPLE_MQ_BOW_REGION, - FOREST_TEMPLE_MQ_FALLING_ROOM, - FOREST_TEMPLE_MQ_BOSS_REGION, - - FOREST_TEMPLE_BOSS_ENTRYWAY, - FOREST_TEMPLE_BOSS_ROOM, - - FIRE_TEMPLE_FIRST_ROOM, - FIRE_TEMPLE_NEAR_BOSS_ROOM, - FIRE_TEMPLE_LOOP_ENEMIES, - FIRE_TEMPLE_LOOP_TILES, - FIRE_TEMPLE_LOOP_FLARE_DANCER, - FIRE_TEMPLE_LOOP_HAMMER_SWITCH, - FIRE_TEMPLE_LOOP_GORON_ROOM, - FIRE_TEMPLE_LOOP_EXIT, - FIRE_TEMPLE_BIG_LAVA_ROOM, - FIRE_TEMPLE_BIG_LAVA_ROOM_NORTH_GORON, - FIRE_TEMPLE_BIG_LAVA_ROOM_NORTH_TILES, - FIRE_TEMPLE_BIG_LAVA_ROOM_SOUTH_GORON, - FIRE_TEMPLE_FIRE_PILLAR_ROOM, - FIRE_TEMPLE_SHORTCUT_ROOM, - FIRE_TEMPLE_SHORTCUT_CLIMB, - FIRE_TEMPLE_BOULDER_MAZE_LOWER, - FIRE_TEMPLE_BOULDER_MAZE_LOWER_SIDE_ROOM, - FIRE_TEMPLE_EAST_CENTRAL_ROOM, - FIRE_TEMPLE_FIRE_WALL_CHASE, - FIRE_TEMPLE_MAP_AREA, - FIRE_TEMPLE_BOULDER_MAZE_UPPER, - FIRE_TEMPLE_SCARECROW_ROOM, - FIRE_TEMPLE_EAST_PEAK, - FIRE_TEMPLE_CORRIDOR, - FIRE_TEMPLE_FIRE_MAZE_ROOM, - FIRE_TEMPLE_FIRE_MAZE_UPPER, - FIRE_TEMPLE_FIRE_MAZE_SIDE_ROOM, - FIRE_TEMPLE_WEST_CENTRAL_LOWER, - FIRE_TEMPLE_WEST_CENTRAL_UPPER, - FIRE_TEMPLE_LATE_FIRE_MAZE, - FIRE_TEMPLE_UPPER_FLARE_DANCER, - FIRE_TEMPLE_WEST_CLIMB, - FIRE_TEMPLE_WEST_PEAK, - FIRE_TEMPLE_HAMMER_RETURN_PATH, - FIRE_TEMPLE_ABOVE_FIRE_MAZE, - - FIRE_TEMPLE_MQ_LOWER, - FIRE_TEMPLE_MQ_LOWER_LOCKED_DOOR, - FIRE_TEMPLE_MQ_BIG_LAVA_ROOM, - FIRE_TEMPLE_MQ_LOWER_MAZE, - FIRE_TEMPLE_MQ_UPPER_MAZE, - FIRE_TEMPLE_MQ_UPPER, - - FIRE_TEMPLE_BOSS_ENTRYWAY, - FIRE_TEMPLE_BOSS_ROOM, - - WATER_TEMPLE_LOBBY, - WATER_TEMPLE_EAST_LOWER, - WATER_TEMPLE_MAP_ROOM, - WATER_TEMPLE_CRACKED_WALL, - WATER_TEMPLE_TORCH_ROOM, - WATER_TEMPLE_NORTH_LOWER, - WATER_TEMPLE_BOULDERS_LOWER, - WATER_TEMPLE_BLOCK_ROOM, - WATER_TEMPLE_JETS_ROOM, - WATER_TEMPLE_BOULDERS_UPPER, - WATER_TEMPLE_BOSS_KEY_ROOM, - WATER_TEMPLE_SOUTH_LOWER, - WATER_TEMPLE_WEST_LOWER, - WATER_TEMPLE_DRAGON_ROOM, - WATER_TEMPLE_CENTRAL_PILLAR_LOWER, - WATER_TEMPLE_CENTRAL_PILLAR_UPPER, - WATER_TEMPLE_CENTRAL_PILLAR_BASEMENT, - WATER_TEMPLE_EAST_MIDDLE, - WATER_TEMPLE_WEST_MIDDLE, - WATER_TEMPLE_HIGH_WATER, - WATER_TEMPLE_BLOCK_CORRIDOR, - WATER_TEMPLE_FALLING_PLATFORM_ROOM, - WATER_TEMPLE_DRAGON_PILLARS_ROOM, - WATER_TEMPLE_DARK_LINK_ROOM, - WATER_TEMPLE_LONGSHOT_ROOM, - WATER_TEMPLE_RIVER, - WATER_TEMPLE_PRE_BOSS_ROOM, - - WATER_TEMPLE_MQ_LOBBY, - WATER_TEMPLE_MQ_DIVE, - WATER_TEMPLE_MQ_LOWERED_WATER_LEVELS, - WATER_TEMPLE_MQ_DARK_LINK_REGION, - WATER_TEMPLE_MQ_BASEMENT_GATED_AREAS, - - WATER_TEMPLE_BOSS_ENTRYWAY, - WATER_TEMPLE_BOSS_ROOM, - - SPIRIT_TEMPLE_LOBBY, - SPIRIT_TEMPLE_CHILD, - SPIRIT_TEMPLE_CHILD_CLIMB, - SPIRIT_TEMPLE_EARLY_ADULT, - SPIRIT_TEMPLE_CENTRAL_CHAMBER, - SPIRIT_TEMPLE_OUTDOOR_HANDS, - SPIRIT_TEMPLE_BEYOND_CENTRAL_LOCKED_DOOR, - SPIRIT_TEMPLE_BEYOND_FINAL_LOCKED_DOOR, - SPIRIT_TEMPLE_INSIDE_STATUE_HEAD, - - SPIRIT_TEMPLE_MQ_LOBBY, - SPIRIT_TEMPLE_MQ_CHILD, - SPIRIT_TEMPLE_MQ_ADULT, - SPIRIT_TEMPLE_MQ_SHARED, - SPIRIT_TEMPLE_MQ_LOWER_ADULT, - SPIRIT_TEMPLE_MQ_BOSS_AREA, - SPIRIT_TEMPLE_MQ_MIRROR_SHIELD_HAND, - SPIRIT_TEMPLE_MQ_SILVER_GAUNTLETS_HAND, - SPIRIT_TEMPLE_MQ_INSIDE_STATUE_HEAD, - - SPIRIT_TEMPLE_BOSS_ENTRYWAY, - SPIRIT_TEMPLE_BOSS_ROOM, - - SHADOW_TEMPLE_BEGINNING, - SHADOW_TEMPLE_FIRST_BEAMOS, - SHADOW_TEMPLE_HUGE_PIT, - SHADOW_TEMPLE_WIND_TUNNEL, - SHADOW_TEMPLE_BEYOND_BOAT, - - SHADOW_TEMPLE_MQ_ENTRYWAY, - SHADOW_TEMPLE_MQ_BEGINNING, - SHADOW_TEMPLE_MQ_DEAD_HAND_AREA, - SHADOW_TEMPLE_MQ_FIRST_BEAMOS, - SHADOW_TEMPLE_MQ_UPPER_HUGE_PIT, - SHADOW_TEMPLE_MQ_LOWER_HUGE_PIT, - SHADOW_TEMPLE_MQ_WIND_TUNNEL, - SHADOW_TEMPLE_MQ_BEYOND_BOAT, - SHADOW_TEMPLE_MQ_INVISIBLE_MAZE, - - SHADOW_TEMPLE_BOSS_ENTRYWAY, - SHADOW_TEMPLE_BOSS_ROOM, - - BOTTOM_OF_THE_WELL_MAIN_AREA, - - BOTTOM_OF_THE_WELL_MQ_PERIMETER, - BOTTOM_OF_THE_WELL_MQ_MIDDLE, - - ICE_CAVERN_BEGINNING, - ICE_CAVERN_MAIN, - - ICE_CAVERN_MQ_BEGINNING, - ICE_CAVERN_MQ_MAP_ROOM, - ICE_CAVERN_MQ_IRON_BOOTS_REGION, - ICE_CAVERN_MQ_COMPASS_ROOM, - - GERUDO_TRAINING_GROUNDS_LOBBY, - GERUDO_TRAINING_GROUNDS_CENTRAL_MAZE, - GERUDO_TRAINING_GROUNDS_CENTRAL_MAZE_RIGHT, - GERUDO_TRAINING_GROUNDS_LAVA_ROOM, - GERUDO_TRAINING_GROUNDS_HAMMER_ROOM, - GERUDO_TRAINING_GROUNDS_EYE_STATUE_LOWER, - GERUDO_TRAINING_GROUNDS_EYE_STATUE_UPPER, - GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_ROOM, - GERUDO_TRAINING_GROUNDS_LIKE_LIKE_ROOM, - - GERUDO_TRAINING_GROUNDS_MQ_LOBBY, - GERUDO_TRAINING_GROUNDS_MQ_RIGHT_SIDE, - GERUDO_TRAINING_GROUNDS_MQ_UNDERWATER, - GERUDO_TRAINING_GROUNDS_MQ_LEFT_SIDE, - GERUDO_TRAINING_GROUNDS_MQ_STALFOS_ROOM, - GERUDO_TRAINING_GROUNDS_MQ_BACK_AREAS, - GERUDO_TRAINING_GROUNDS_MQ_CENTRAL_MAZE_RIGHT, - - GANONS_CASTLE_LOBBY, - GANONS_CASTLE_DEKU_SCRUBS, - GANONS_CASTLE_FOREST_TRIAL, - GANONS_CASTLE_FIRE_TRIAL, - GANONS_CASTLE_WATER_TRIAL, - GANONS_CASTLE_SHADOW_TRIAL, - GANONS_CASTLE_SPIRIT_TRIAL, - GANONS_CASTLE_LIGHT_TRIAL, - GANONS_CASTLE_TOWER, - - GANONS_CASTLE_MQ_LOBBY, - GANONS_CASTLE_MQ_DEKU_SCRUBS, - GANONS_CASTLE_MQ_FOREST_TRIAL, - GANONS_CASTLE_MQ_FIRE_TRIAL, - GANONS_CASTLE_MQ_WATER_TRIAL, - GANONS_CASTLE_MQ_SHADOW_TRIAL, - GANONS_CASTLE_MQ_SPIRIT_TRIAL, - GANONS_CASTLE_MQ_LIGHT_TRIAL, - - MARKER_AREAS_END, // Used for area key count - - //DUNGEONS - DEKU_TREE, - DODONGOS_CAVERN, - JABU_JABUS_BELLY, - FOREST_TEMPLE, - FIRE_TEMPLE, - WATER_TEMPLE, - SPIRIT_TEMPLE, - SHADOW_TEMPLE, - BOTTOM_OF_THE_WELL, - ICE_CAVERN, - GERUDO_TRAINING_GROUNDS, - GANONS_CASTLE, - - //HINTS - PREFIX, - WAY_OF_THE_HERO, - PLUNDERING, - FOOLISH, - CAN_BE_FOUND_AT, - HOARDS, - - JUNK02, - JUNK03, - JUNK04, - JUNK05, - JUNK06, - JUNK07, - JUNK08, - JUNK09, - JUNK10, - JUNK11, - JUNK12, - JUNK13, - JUNK14, - JUNK15, - JUNK16, - JUNK17, - JUNK18, - JUNK19, - JUNK20, - JUNK21, - JUNK22, - JUNK23, - JUNK24, - JUNK25, - JUNK26, - JUNK27, - JUNK28, - JUNK29, - JUNK30, - JUNK31, - JUNK32, - JUNK33, - JUNK34, - JUNK35, - JUNK36, - JUNK37, - JUNK38, - JUNK39, - JUNK40, - JUNK41, - JUNK42, - JUNK43, - JUNK44, - JUNK45, - JUNK46, - JUNK47, - JUNK48, - JUNK49, - JUNK50, - JUNK51, - JUNK52, - JUNK53, - JUNK54, - JUNK55, - JUNK56, - JUNK57, - JUNK58, - JUNK59, - JUNK60, - JUNK61, - JUNK62, - JUNK63, - JUNK64, - JUNK65, - JUNK66, - JUNK67, - JUNK68, - JUNK69, - JUNK70, - JUNK71, - JUNK72, - JUNK73, - JUNK74, - JUNK75, - JUNK76, - JUNK77, - JUNK78, - JUNK79, - JUNK80, - JUNK81, - - JUNK_WTC_1, - JUNK_WTC_2, - JUNK_WTC_3, - JUNK_WTC_4, - JUNK_WTC_5, - JUNK_WTC_6, - JUNK_WTC_7, - JUNK_WTC_8, - JUNK_WTC_9, - JUNK_WTC_10, - JUNK_WTC_11, - JUNK_WTC_12, - - JUNK_SEI_1, - JUNK_SEI_2, - JUNK_SEI_3, - JUNK_SEI_4, - JUNK_SEI_5, - JUNK_SEI_6, - JUNK_SEI_7, - JUNK_SEI_8, - JUNK_SEI_9, - JUNK_SEI_10, - JUNK_SEI_11, - JUNK_SEI_12, - JUNK_SEI_13, - JUNK_SEI_14, - JUNK_SEI_15, - JUNK_SEI_16, - JUNK_SEI_17, - JUNK_SEI_18, - JUNK_SEI_19, - JUNK_SEI_20, - JUNK_SEI_21, - JUNK_SEI_22, - JUNK_SEI_23, - JUNK_SEI_24, - JUNK_SEI_25, - JUNK_SEI_26, - JUNK_SEI_27, - JUNK_SEI_28, - JUNK_SEI_29, - - JUNK_OTR_MEANS_1, - JUNK_OTR_MEANS_2, - JUNK_OTR_MEANS_3, - JUNK_OTR_MEANS_4, - JUNK_OTR_MEANS_5, - JUNK_OTR_MEANS_6, - JUNK_OTR_MEANS_7, - JUNK_OTR_MEANS_8, - JUNK_OTR_MEANS_9, - JUNK_OTR_MEANS_10, - JUNK_OTR_MEANS_11, - JUNK_OTR_MEANS_12, - JUNK_OTR_MEANS_13, - JUNK_OTR_MEANS_14, - JUNK_OTR_MEANS_15, - JUNK_OTR_MEANS_16, - JUNK_OTR_MEANS_17, - JUNK_OTR_MEANS_18, - JUNK_OTR_MEANS_19, - JUNK_OTR_MEANS_20, - JUNK_OTR_MEANS_21, - JUNK_OTR_MEANS_22, - JUNK_OTR_MEANS_23, - JUNK_OTR_MEANS_24, - JUNK_OTR_MEANS_25, - JUNK_OTR_MEANS_26, - JUNK_OTR_MEANS_27, - JUNK_OTR_MEANS_28, - JUNK_OTR_MEANS_29, - JUNK_OTR_MEANS_30, - - JUNK_MISC_1, - JUNK_MISC_2, - JUNK_MISC_3, - JUNK_MISC_4, - JUNK_MISC_5, - JUNK_MISC_6, - JUNK_MISC_7, - JUNK_MISC_8, - JUNK_MISC_9, - JUNK_MISC_10, - JUNK_MISC_11, - JUNK_MISC_12, - JUNK_MISC_13, - JUNK_MISC_14, - JUNK_MISC_15, - JUNK_MISC_16, - JUNK_MISC_17, - - JUNK_SG_1, - JUNK_SG_2, - JUNK_SG_3, - JUNK_SG_4, - JUNK_SG_5, - JUNK_SG_6, - JUNK_SG_7, - JUNK_SG_8, - - BRIDGE_OPEN_HINT, - BRIDGE_VANILLA_HINT, - BRIDGE_STONES_HINT, - BRIDGE_MEDALLIONS_HINT, - BRIDGE_REWARDS_HINT, - BRIDGE_DUNGEONS_HINT, - BRIDGE_TOKENS_HINT, - BRIDGE_GREG_HINT, - - GANON_BK_START_WITH_HINT, - GANON_BK_VANILLA_HINT, - GANON_BK_OWN_DUNGEON_HINT, - GANON_BK_OVERWORLD_HINT, - GANON_BK_ANY_DUNGEON_HINT, - GANON_BK_ANYWHERE_HINT, - GANON_BK_TRIFORCE_HINT, - GANON_BK_SKULLTULA_HINT, - - LACS_VANILLA_HINT, - LACS_STONES_HINT, - LACS_MEDALLIONS_HINT, - LACS_REWARDS_HINT, - LACS_DUNGEONS_HINT, - LACS_TOKENS_HINT, - - SIX_TRIALS, - ZERO_TRIALS, - FOUR_TO_FIVE_TRIALS, - ONE_TO_THREE_TRIALS, - - SPIRITUAL_STONE_TEXT_START, - CHILD_ALTAR_TEXT_END_DOTOPEN, - CHILD_ALTAR_TEXT_END_DOTSONGONLY, - CHILD_ALTAR_TEXT_END_DOTCLOSED, - ADULT_ALTAR_TEXT_START, - ADULT_ALTAR_TEXT_END, - - VALIDATION_LINE, - LIGHT_ARROW_LOCATION_HINT, - DAMPE_DIARY, - YOUR_POCKET, - - GANON_LINE01, - GANON_LINE02, - GANON_LINE03, - GANON_LINE04, - GANON_LINE05, - GANON_LINE06, - GANON_LINE07, - GANON_LINE08, - GANON_LINE09, - GANON_LINE10, - GANON_LINE11, - - MEDIGORON_DIALOG_FIRST, - MEDIGORON_DIALOG_SECOND, - CARPET_SALESMAN_DIALOG_FIRST, - CARPET_SALESMAN_DIALOG_SECOND, - CARPET_SALESMAN_DIALOG_THIRD, - CARPET_SALESMAN_DIALOG_FOURTH, - GRANNY_DIALOG, - - KEY_ENUM_MAX, -} Key; \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access.cpp index 6be67ea84..b04bf8207 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access.cpp @@ -1,8 +1,8 @@ #include "location_access.hpp" #include "dungeon.hpp" -#include "item_list.hpp" -#include "item_location.hpp" +#include "../static_data.h" +#include "../context.h" #include "item_pool.hpp" #include "logic.hpp" #include "settings.hpp" @@ -19,7 +19,7 @@ using namespace Settings; //generic grotto event list std::vector grottoEvents = { EventAccess(&GossipStoneFairy, {[]{return GossipStoneFairy || CanSummonGossipFairy;}}), - EventAccess(&ButterflyFairy, {[]{return ButterflyFairy || (CanUse(STICKS));}}), + EventAccess(&ButterflyFairy, {[]{return ButterflyFairy || (CanUse(RG_STICKS));}}), EventAccess(&BugShrub, {[]{return CanCutShrubs;}}), EventAccess(&LoneFish, {[]{return true;}}), }; @@ -41,7 +41,7 @@ bool LocationAccess::CheckConditionAtAgeTime(bool& age, bool& time) const { bool LocationAccess::ConditionsMet() const { - Area* parentRegion = AreaTable(Location(location)->GetParentRegionKey()); + Area* parentRegion = AreaTable(Rando::Context::GetInstance()->GetItemLocation(location)->GetParentRegionKey()); bool conditionsMet = false; if ((parentRegion->childDay && CheckConditionAtAgeTime(IsChild, AtDay)) || @@ -55,37 +55,39 @@ bool LocationAccess::ConditionsMet() const { } bool LocationAccess::CanBuy() const { + auto ctx = Rando::Context::GetInstance(); //Not a shop location, don't need to check if buyable - if (!(Location(location)->IsCategory(Category::cShop))) { + if (!(Rando::StaticData::GetLocation(location)->IsCategory(Category::cShop))) { return true; } //Check if wallet is large enough to buy item bool SufficientWallet = true; - if (Location(location)->GetPrice() > 500) { + if (ctx->GetItemLocation(location)->GetPrice() > 500) { SufficientWallet = ProgressiveWallet >= 3; - } else if (Location(location)->GetPrice() > 200) { + } else if (ctx->GetItemLocation(location)->GetPrice() > 200) { SufficientWallet = ProgressiveWallet >= 2; - } else if (Location(location)->GetPrice() > 99) { + } else if (ctx->GetItemLocation(location)->GetPrice() > 99) { SufficientWallet = ProgressiveWallet >= 1; } bool OtherCondition = true; - uint32_t placed = Location(location)->GetPlacedItemKey(); + RandomizerGet placed = ctx->GetItemLocation(location)->GetPlacedRandomizerGet(); //Need bottle to buy bottle items, only logically relevant bottle items included here - if (placed == BUY_BLUE_FIRE || placed == BUY_BOTTLE_BUG || placed == BUY_FISH || placed == BUY_FAIRYS_SPIRIT) { - OtherCondition = HasBottle; + if (placed == RG_BUY_BLUE_FIRE || placed == RG_BUY_BOTTLE_BUG || placed == RG_BUY_FISH || + placed == RG_BUY_FAIRYS_SPIRIT) { + OtherCondition = HasBottle; } - //If bombchus in logic, need to have found chus to buy; if not just need bomb bag - else if (placed == BUY_BOMBCHU_10 || placed == BUY_BOMBCHU_20) { - OtherCondition = (!BombchusInLogic && Bombs) || (BombchusInLogic && FoundBombchus); + // If bombchus in logic, need to have found chus to buy; if not just need bomb bag + else if (placed == RG_BUY_BOMBCHU_10 || placed == RG_BUY_BOMBCHU_20) { + OtherCondition = (!BombchusInLogic && Bombs) || (BombchusInLogic && FoundBombchus); } return SufficientWallet && OtherCondition; } Area::Area() = default; -Area::Area(std::string regionName_, std::string scene_, uint32_t hintKey_, +Area::Area(std::string regionName_, std::string scene_, RandomizerHintTextKey hintKey_, bool timePass_, std::vector events_, std::vector locations_, @@ -106,14 +108,14 @@ bool Area::UpdateEvents(SearchMode mode) { if (Child()) { childDay = true; childNight = true; - AreaTable(ROOT)->childDay = true; - AreaTable(ROOT)->childNight = true; + AreaTable(RR_ROOT)->childDay = true; + AreaTable(RR_ROOT)->childNight = true; } if (Adult()) { adultDay = true; adultNight = true; - AreaTable(ROOT)->adultDay = true; - AreaTable(ROOT)->adultNight = true; + AreaTable(RR_ROOT)->adultDay = true; + AreaTable(RR_ROOT)->adultNight = true; } } @@ -136,7 +138,7 @@ bool Area::UpdateEvents(SearchMode mode) { return eventsUpdated; } -void Area::AddExit(uint32_t parentKey, uint32_t newExitKey, ConditionFn condition) { +void Area::AddExit(RandomizerRegion parentKey, RandomizerRegion newExitKey, ConditionFn condition) { Entrance newExit = Entrance(newExitKey, {condition}); newExit.SetParentRegion(parentKey); exits.push_front(newExit); @@ -147,7 +149,7 @@ void Area::RemoveExit(Entrance* exitToRemove) { exits.remove_if([exitToRemove](const auto exit){return &exit == exitToRemove;}); } -void Area::SetAsPrimary(uint32_t exitToBePrimary) { +void Area::SetAsPrimary(RandomizerRegion exitToBePrimary) { for (auto& exit : exits) { if (exit.Getuint32_t() == exitToBePrimary) { exit.SetAsPrimary(); @@ -156,7 +158,7 @@ void Area::SetAsPrimary(uint32_t exitToBePrimary) { } } -Entrance* Area::GetExit(uint32_t exitToReturn) { +Entrance* Area::GetExit(RandomizerRegion exitToReturn) { for (auto& exit : exits) { if (exit.Getuint32_t() == exitToReturn) { return &exit; @@ -179,7 +181,7 @@ bool Area::AllAccountedFor() const { } for (const LocationAccess& loc : locations) { - if (!(Location(loc.GetLocation())->IsAddedToPool())) { + if (!(Rando::Context::GetInstance()->GetItemLocation(loc.GetLocation())->IsAddedToPool())) { return false; } } @@ -193,13 +195,13 @@ bool Area::AllAccountedFor() const { return AllAccess(); } -bool Area::CheckAllAccess(const uint32_t exitKey) { +bool Area::CheckAllAccess(const RandomizerRegion exitKey) { if (!AllAccess()) { return false; } for (Entrance& exit : exits) { - if (exit.Getuint32_t() == exitKey) { + if (exit.GetConnectedRegionKey() == exitKey) { return exit.CheckConditionAtAgeTime(Logic::IsChild, Logic::AtDay) && exit.CheckConditionAtAgeTime(Logic::IsChild, Logic::AtNight) && exit.CheckConditionAtAgeTime(Logic::IsAdult, Logic::AtDay) && @@ -220,29 +222,29 @@ void Area::ResetVariables() { } } -std::array areaTable; +std::array areaTable; -bool Here(const uint32_t area, ConditionFn condition) { +bool Here(const RandomizerRegion area, ConditionFn condition) { return areaTable[area].HereCheck(condition); } -bool CanPlantBean(const uint32_t area) { +bool CanPlantBean(const RandomizerRegion area) { return areaTable[area].CanPlantBeanCheck(); } -bool BothAges(const uint32_t area) { +bool BothAges(const RandomizerRegion area) { return areaTable[area].BothAgesCheck(); } -bool ChildCanAccess(const uint32_t area) { +bool ChildCanAccess(const RandomizerRegion area) { return areaTable[area].Child(); } -bool AdultCanAccess(const uint32_t area) { +bool AdultCanAccess(const RandomizerRegion area) { return areaTable[area].Adult(); } -bool HasAccessTo(const uint32_t area) { +bool HasAccessTo(const RandomizerRegion area) { return areaTable[area].HasAccess(); } @@ -251,68 +253,68 @@ bool HasAccessTo(const uint32_t area) { void AreaTable_Init() { //Clear the array from any previous playthrough attempts. This is important so that //locations which appear in both MQ and Vanilla dungeons don't get set in both areas. - areaTable.fill(Area("Invalid Area", "Invalid Area", NONE, NO_DAY_NIGHT_CYCLE, {}, {}, {})); + areaTable.fill(Area("Invalid Area", "Invalid Area", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, {}, {})); //name, scene, hint text, events, locations, exits - areaTable[ROOT] = Area("Root", "", LINKS_POCKET, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_ROOT] = Area("Root", "", RHT_LINKS_POCKET, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(LINKS_POCKET, {[]{return true;}}), - LocationAccess(TRIFORCE_COMPLETED, { [] { return CanCompleteTriforce;}}), + LocationAccess(RC_LINKS_POCKET, {[]{return true;}}), + LocationAccess(RC_TRIFORCE_COMPLETED, { [] { return CanCompleteTriforce;}}), }, { //Exits - Entrance(ROOT_EXITS, {[]{return true;}}) + Entrance(RR_ROOT_EXITS, {[]{return true;}}) }); - areaTable[ROOT_EXITS] = Area("Root Exits", "", NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_ROOT_EXITS] = Area("Root Exits", "", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(CHILD_SPAWN, {[]{return IsChild;}}), - Entrance(ADULT_SPAWN, {[]{return IsAdult;}}), - Entrance(MINUET_OF_FOREST_WARP, {[]{return CanPlay(MinuetOfForest);}}), - Entrance(BOLERO_OF_FIRE_WARP, {[]{return CanPlay(BoleroOfFire) && CanLeaveForest;}}), - Entrance(SERENADE_OF_WATER_WARP, {[]{return CanPlay(SerenadeOfWater) && CanLeaveForest;}}), - Entrance(NOCTURNE_OF_SHADOW_WARP, {[]{return CanPlay(NocturneOfShadow) && CanLeaveForest;}}), - Entrance(REQUIEM_OF_SPIRIT_WARP, {[]{return CanPlay(RequiemOfSpirit) && CanLeaveForest;}}), - Entrance(PRELUDE_OF_LIGHT_WARP, {[]{return CanPlay(PreludeOfLight) && CanLeaveForest;}}), + Entrance(RR_CHILD_SPAWN, {[]{return IsChild;}}), + Entrance(RR_ADULT_SPAWN, {[]{return IsAdult;}}), + Entrance(RR_MINUET_OF_FOREST_WARP, {[]{return CanPlay(MinuetOfForest);}}), + Entrance(RR_BOLERO_OF_FIRE_WARP, {[]{return CanPlay(BoleroOfFire) && CanLeaveForest;}}), + Entrance(RR_SERENADE_OF_WATER_WARP, {[]{return CanPlay(SerenadeOfWater) && CanLeaveForest;}}), + Entrance(RR_NOCTURNE_OF_SHADOW_WARP, {[]{return CanPlay(NocturneOfShadow) && CanLeaveForest;}}), + Entrance(RR_REQUIEM_OF_SPIRIT_WARP, {[]{return CanPlay(RequiemOfSpirit) && CanLeaveForest;}}), + Entrance(RR_PRELUDE_OF_LIGHT_WARP, {[]{return CanPlay(PreludeOfLight) && CanLeaveForest;}}), }); - areaTable[CHILD_SPAWN] = Area("Child Spawn", "", NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_CHILD_SPAWN] = Area("Child Spawn", "", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(KF_LINKS_HOUSE, {[]{return true;}}), + Entrance(RR_KF_LINKS_HOUSE, {[]{return true;}}), }); - areaTable[ADULT_SPAWN] = Area("Adult Spawn", "", NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_ADULT_SPAWN] = Area("Adult Spawn", "", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(TEMPLE_OF_TIME, {[]{return true;}}), + Entrance(RR_TEMPLE_OF_TIME, {[]{return true;}}), }); - areaTable[MINUET_OF_FOREST_WARP] = Area("Minuet of Forest Warp", "", NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_MINUET_OF_FOREST_WARP] = Area("Minuet of Forest Warp", "", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(SACRED_FOREST_MEADOW, {[]{return true;}}), + Entrance(RR_SACRED_FOREST_MEADOW, {[]{return true;}}), }); - areaTable[BOLERO_OF_FIRE_WARP] = Area("Bolero of Fire Warp", "", NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_BOLERO_OF_FIRE_WARP] = Area("Bolero of Fire Warp", "", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(DMC_CENTRAL_LOCAL, {[]{return true;}}), + Entrance(RR_DMC_CENTRAL_LOCAL, {[]{return true;}}), }); - areaTable[SERENADE_OF_WATER_WARP] = Area("Serenade of Water Warp", "", NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SERENADE_OF_WATER_WARP] = Area("Serenade of Water Warp", "", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(LAKE_HYLIA, {[]{return true;}}), + Entrance(RR_LAKE_HYLIA, {[]{return true;}}), }); - areaTable[REQUIEM_OF_SPIRIT_WARP] = Area("Requiem of Spirit Warp", "", NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_REQUIEM_OF_SPIRIT_WARP] = Area("Requiem of Spirit Warp", "", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(DESERT_COLOSSUS, {[]{return true;}}), + Entrance(RR_DESERT_COLOSSUS, {[]{return true;}}), }); - areaTable[NOCTURNE_OF_SHADOW_WARP] = Area("Nocturne of Shadow Warp", "", NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_NOCTURNE_OF_SHADOW_WARP] = Area("Nocturne of Shadow Warp", "", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(GRAVEYARD_WARP_PAD_REGION, {[]{return true;}}), + Entrance(RR_GRAVEYARD_WARP_PAD_REGION, {[]{return true;}}), }); - areaTable[PRELUDE_OF_LIGHT_WARP] = Area("Prelude of Light Warp", "", NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_PRELUDE_OF_LIGHT_WARP] = Area("Prelude of Light Warp", "", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(TEMPLE_OF_TIME, {[]{return true;}}), + Entrance(RR_TEMPLE_OF_TIME, {[]{return true;}}), }); // Overworld @@ -338,13 +340,13 @@ void AreaTable_Init() { AreaTable_Init_GanonsCastle(); //Set parent regions - for (uint32_t i = ROOT; i <= GANONS_CASTLE; i++) { + for (uint32_t i = RR_ROOT; i <= RR_GANONS_CASTLE; i++) { for (LocationAccess& locPair : areaTable[i].locations) { - uint32_t location = locPair.GetLocation(); - Location(location)->SetParentRegion(i); + RandomizerCheck location = locPair.GetLocation(); + Rando::Context::GetInstance()->GetItemLocation(location)->SetParentRegion((RandomizerRegion)i); } for (Entrance& exit : areaTable[i].exits) { - exit.SetParentRegion(i); + exit.SetParentRegion((RandomizerRegion)i); exit.SetName(); exit.GetConnectedRegion()->entrances.push_front(&exit); } @@ -361,14 +363,14 @@ void AreaTable_Init() { namespace Areas { const auto GetAllAreas() { - static const size_t areaCount = MARKER_AREAS_END - (MARKER_AREAS_START + 1); + static const size_t areaCount = RR_MAX - (RR_NONE + 1); - static std::array allAreas = {}; + static std::array allAreas = {}; static bool intialized = false; if (!intialized) { for (size_t i = 0; i < areaCount; i++) { - allAreas[i] = (MARKER_AREAS_START + 1) + i; + allAreas[i] = (RandomizerRegion)((RR_NONE + 1) + i); } intialized = true; } @@ -377,53 +379,53 @@ namespace Areas { } void AccessReset() { - for (const uint32_t area : GetAllAreas()) { + for (const RandomizerRegion area : GetAllAreas()) { AreaTable(area)->ResetVariables(); } if(Settings::HasNightStart) { if(Settings::ResolvedStartingAge == AGE_CHILD) { - AreaTable(ROOT)->childNight = true; + AreaTable(RR_ROOT)->childNight = true; } else { - AreaTable(ROOT)->adultNight = true; + AreaTable(RR_ROOT)->adultNight = true; } } else { if(Settings::ResolvedStartingAge == AGE_CHILD) { - AreaTable(ROOT)->childDay = true; + AreaTable(RR_ROOT)->childDay = true; } else { - AreaTable(ROOT)->adultDay = true; + AreaTable(RR_ROOT)->adultDay = true; } } } //Reset exits and clear items from locations void ResetAllLocations() { - for (const uint32_t area : GetAllAreas()) { + for (const RandomizerRegion area : GetAllAreas()) { AreaTable(area)->ResetVariables(); //Erase item from every location in this exit for (LocationAccess& locPair : AreaTable(area)->locations) { - uint32_t location = locPair.GetLocation(); - Location(location)->ResetVariables(); + RandomizerCheck location = locPair.GetLocation(); + Rando::Context::GetInstance()->GetItemLocation(location)->ResetVariables(); } } if(Settings::HasNightStart) { if(Settings::ResolvedStartingAge == AGE_CHILD) { - AreaTable(ROOT)->childNight = true; + AreaTable(RR_ROOT)->childNight = true; } else { - AreaTable(ROOT)->adultNight = true; + AreaTable(RR_ROOT)->adultNight = true; } } else { if(Settings::ResolvedStartingAge == AGE_CHILD) { - AreaTable(ROOT)->childDay = true; + AreaTable(RR_ROOT)->childDay = true; } else { - AreaTable(ROOT)->adultDay = true; + AreaTable(RR_ROOT)->adultDay = true; } } } bool HasTimePassAccess(uint8_t age) { - for (const uint32_t areaKey : GetAllAreas()) { + for (const RandomizerRegion areaKey : GetAllAreas()) { auto area = AreaTable(areaKey); if (area->timePass && ((age == AGE_CHILD && area->Child()) || (age == AGE_ADULT && area->Adult()))) { return true; @@ -441,7 +443,7 @@ namespace Areas { worldGraph.open (str + ".dot"); worldGraph << "digraph {\n\tcenter=true;\n"; - for (const uint32_t areaKey : GetAllAreas()) { + for (const RandomizerRegion areaKey : GetAllAreas()) { auto area = AreaTable(areaKey); for (auto exit : area->exits) { if (exit.GetConnectedRegion()->regionName != "Invalid Area") { @@ -484,8 +486,8 @@ namespace Areas { } //namespace Areas -Area* AreaTable(const uint32_t areaKey) { - if (areaKey > KEY_ENUM_MAX) { +Area* AreaTable(const RandomizerRegion areaKey) { + if (areaKey > RR_MAX) { printf("\x1b[1;1HERROR: AREAKEY TOO BIG"); } return &(areaTable[areaKey]); @@ -494,7 +496,7 @@ Area* AreaTable(const uint32_t areaKey) { //Retrieve all the shuffable entrances of a specific type std::vector GetShuffleableEntrances(EntranceType type, bool onlyPrimary /*= true*/) { std::vector entrancesToShuffle = {}; - for (uint32_t area : Areas::GetAllAreas()) { + for (RandomizerRegion area : Areas::GetAllAreas()) { for (auto& exit: AreaTable(area)->exits) { if ((exit.GetType() == type || type == EntranceType::All) && (exit.IsPrimary() || !onlyPrimary) && exit.GetType() != EntranceType::None) { entrancesToShuffle.push_back(&exit); diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access.hpp b/soh/soh/Enhancements/randomizer/3drando/location_access.hpp index 60529a2f6..54bb39f50 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access.hpp @@ -6,7 +6,6 @@ #include "logic.hpp" #include "hint_list.hpp" -#include "keys.hpp" #include "fill.hpp" typedef bool (*ConditionFn)(); @@ -69,7 +68,7 @@ private: class LocationAccess { public: - explicit LocationAccess(uint32_t location_, std::vector conditions_met_) + explicit LocationAccess(RandomizerCheck location_, std::vector conditions_met_) : location(location_) { conditions_met.resize(2); for (size_t i = 0; i < conditions_met_.size(); i++) { @@ -96,12 +95,12 @@ public: bool ConditionsMet() const; - uint32_t GetLocation() const { + RandomizerCheck GetLocation() const { return location; } -private: - uint32_t location; +protected: + RandomizerCheck location; std::vector conditions_met; //Makes sure shop locations are buyable @@ -114,7 +113,7 @@ enum class EntranceType; class Area { public: Area(); - Area(std::string regionName_, std::string scene_, uint32_t hintKey_, + Area(std::string regionName_, std::string scene_, RandomizerHintTextKey hintKey_, bool timePass_, std::vector events_, std::vector locations_, @@ -123,7 +122,7 @@ public: std::string regionName; std::string scene; - uint32_t hintKey; + RandomizerHintTextKey hintKey; bool timePass; std::vector events; std::vector locations; @@ -143,13 +142,13 @@ public: bool UpdateEvents(SearchMode mode); - void AddExit(uint32_t parentKey, uint32_t newExitKey, ConditionFn condition); + void AddExit(RandomizerRegion parentKey, RandomizerRegion newExitKey, ConditionFn condition); void RemoveExit(Entrance* exitToRemove); - void SetAsPrimary(uint32_t exitToBePrimary); + void SetAsPrimary(RandomizerRegion exitToBePrimary); - Entrance* GetExit(uint32_t exit); + Entrance* GetExit(RandomizerRegion exit); bool Child() const { return childDay || childNight; @@ -172,7 +171,7 @@ public: } //Check to see if an exit can be access as both ages at both times of day - bool CheckAllAccess(uint32_t exitKey); + bool CheckAllAccess(RandomizerRegion exitKey); const HintText& GetHint() const { return Hint(hintKey); @@ -218,15 +217,15 @@ public: } }; -extern std::array areaTable; +extern std::array areaTable; extern std::vector grottoEvents; -bool Here(const AreaKey area, ConditionFn condition); -bool CanPlantBean(const AreaKey area); -bool BothAges(const AreaKey area); -bool ChildCanAccess(const AreaKey area); -bool AdultCanAccess(const AreaKey area); -bool HasAccessTo(const AreaKey area); +bool Here(const RandomizerRegion area, ConditionFn condition); +bool CanPlantBean(const RandomizerRegion area); +bool BothAges(const RandomizerRegion area); +bool ChildCanAccess(const RandomizerRegion area); +bool AdultCanAccess(const RandomizerRegion area); +bool HasAccessTo(const RandomizerRegion area); #define DAY_NIGHT_CYCLE true #define NO_DAY_NIGHT_CYCLE false @@ -240,7 +239,7 @@ namespace Areas { } //namespace Exits void AreaTable_Init(); -Area* AreaTable(const uint32_t areaKey); +Area* AreaTable(const RandomizerRegion areaKey); std::vector GetShuffleableEntrances(EntranceType type, bool onlyPrimary = true); // Overworld 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 6dce03ee1..31cbf7c44 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 @@ -10,43 +10,43 @@ void AreaTable_Init_BottomOfTheWell() { /*-------------------------- | VANILLA/MQ DECIDER | ---------------------------*/ - areaTable[BOTTOM_OF_THE_WELL_ENTRYWAY] = Area("Bottom of the Well Entryway", "Bottom of the Well", BOTTOM_OF_THE_WELL, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_BOTTOM_OF_THE_WELL_ENTRYWAY] = Area("Bottom of the Well Entryway", "Bottom of the Well", RHT_BOTTOM_OF_THE_WELL, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(BOTTOM_OF_THE_WELL_MAIN_AREA, {[]{return Dungeon::BottomOfTheWell.IsVanilla() && IsChild && (CanChildAttack || Nuts);}}), - Entrance(BOTTOM_OF_THE_WELL_MQ_PERIMETER, {[]{return Dungeon::BottomOfTheWell.IsMQ() && IsChild;}}), - Entrance(KAKARIKO_VILLAGE, {[]{return true;}}), + Entrance(RR_BOTTOM_OF_THE_WELL_MAIN_AREA, {[]{return Dungeon::BottomOfTheWell.IsVanilla() && IsChild && (CanChildAttack || Nuts);}}), + Entrance(RR_BOTTOM_OF_THE_WELL_MQ_PERIMETER, {[]{return Dungeon::BottomOfTheWell.IsMQ() && IsChild;}}), + Entrance(RR_KAKARIKO_VILLAGE, {[]{return true;}}), }); /*-------------------------- | VANILLA DUNGEON | ---------------------------*/ if (Dungeon::BottomOfTheWell.IsVanilla()) { - areaTable[BOTTOM_OF_THE_WELL_MAIN_AREA] = Area("Bottom of the Well Main Area", "Bottom of the Well", BOTTOM_OF_THE_WELL, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_BOTTOM_OF_THE_WELL_MAIN_AREA] = Area("Bottom of the Well Main Area", "Bottom of the Well", RHT_BOTTOM_OF_THE_WELL, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&StickPot, {[]{return true;}}), EventAccess(&NutPot, {[]{return true;}}), }, { //Locations - LocationAccess(BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, {[]{return LogicLensBotw || CanUse(LENS_OF_TRUTH);}}), - LocationAccess(BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST, {[]{return HasExplosives;}}), - LocationAccess(BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST, {[]{return LogicLensBotw || CanUse(LENS_OF_TRUTH);}}), - LocationAccess(BOTTOM_OF_THE_WELL_COMPASS_CHEST, {[]{return LogicLensBotw || CanUse(LENS_OF_TRUTH);}}), - LocationAccess(BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST, {[]{return LogicLensBotw || CanUse(LENS_OF_TRUTH);}}), - LocationAccess(BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST, {[]{return (LogicLensBotw || CanUse(LENS_OF_TRUTH)) && HasExplosives;}}), - LocationAccess(BOTTOM_OF_THE_WELL_FREESTANDING_KEY, {[]{return Sticks || CanUse(DINS_FIRE);}}), - LocationAccess(BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST, {[]{return CanPlay(ZeldasLullaby) && (KokiriSword || (Sticks && LogicChildDeadhand));}}), - LocationAccess(BOTTOM_OF_THE_WELL_INVISIBLE_CHEST, {[]{return CanPlay(ZeldasLullaby) && (LogicLensBotw || CanUse(LENS_OF_TRUTH));}}), - LocationAccess(BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST, {[]{return CanPlay(ZeldasLullaby);}}), - LocationAccess(BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST, {[]{return CanPlay(ZeldasLullaby);}}), - LocationAccess(BOTTOM_OF_THE_WELL_MAP_CHEST, {[]{return HasExplosives || (((SmallKeys(BOTTOM_OF_THE_WELL, 3) && (LogicLensBotw || CanUse(LENS_OF_TRUTH))) || CanUse(DINS_FIRE) || (Sticks && LogicBotwBasement)) && GoronBracelet);}}), - LocationAccess(BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST, {[]{return SmallKeys(BOTTOM_OF_THE_WELL, 3) && (LogicLensBotw || CanUse(LENS_OF_TRUTH));}}), - LocationAccess(BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST, {[]{return SmallKeys(BOTTOM_OF_THE_WELL, 3) && (LogicLensBotw || CanUse(LENS_OF_TRUTH));}}), - LocationAccess(BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, {[]{return Boomerang && (LogicLensBotw || CanUse(LENS_OF_TRUTH)) && SmallKeys(BOTTOM_OF_THE_WELL, 3);}}), - LocationAccess(BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, {[]{return Boomerang && (LogicLensBotw || CanUse(LENS_OF_TRUTH)) && SmallKeys(BOTTOM_OF_THE_WELL, 3);}}), - LocationAccess(BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, {[]{return SmallKeys(BOTTOM_OF_THE_WELL, 3) && (LogicLensBotw || CanUse(LENS_OF_TRUTH)) && Boomerang;}}), + LocationAccess(RC_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, {[]{return LogicLensBotw || CanUse(RG_LENS_OF_TRUTH);}}), + LocationAccess(RC_BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST, {[]{return HasExplosives;}}), + LocationAccess(RC_BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST, {[]{return LogicLensBotw || CanUse(RG_LENS_OF_TRUTH);}}), + LocationAccess(RC_BOTTOM_OF_THE_WELL_COMPASS_CHEST, {[]{return LogicLensBotw || CanUse(RG_LENS_OF_TRUTH);}}), + LocationAccess(RC_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST, {[]{return LogicLensBotw || CanUse(RG_LENS_OF_TRUTH);}}), + LocationAccess(RC_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST, {[]{return (LogicLensBotw || CanUse(RG_LENS_OF_TRUTH)) && HasExplosives;}}), + LocationAccess(RC_BOTTOM_OF_THE_WELL_FREESTANDING_KEY, {[]{return Sticks || CanUse(RG_DINS_FIRE);}}), + LocationAccess(RC_BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST, {[]{return CanPlay(ZeldasLullaby) && (KokiriSword || (Sticks && LogicChildDeadhand));}}), + LocationAccess(RC_BOTTOM_OF_THE_WELL_INVISIBLE_CHEST, {[]{return CanPlay(ZeldasLullaby) && (LogicLensBotw || CanUse(RG_LENS_OF_TRUTH));}}), + LocationAccess(RC_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST, {[]{return CanPlay(ZeldasLullaby);}}), + LocationAccess(RC_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST, {[]{return CanPlay(ZeldasLullaby);}}), + LocationAccess(RC_BOTTOM_OF_THE_WELL_MAP_CHEST, {[]{return HasExplosives || (((SmallKeys(RR_BOTTOM_OF_THE_WELL, 3) && (LogicLensBotw || CanUse(RG_LENS_OF_TRUTH))) || CanUse(RG_DINS_FIRE) || (Sticks && LogicBotwBasement)) && GoronBracelet);}}), + LocationAccess(RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST, {[]{return SmallKeys(RR_BOTTOM_OF_THE_WELL, 3) && (LogicLensBotw || CanUse(RG_LENS_OF_TRUTH));}}), + LocationAccess(RC_BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST, {[]{return SmallKeys(RR_BOTTOM_OF_THE_WELL, 3) && (LogicLensBotw || CanUse(RG_LENS_OF_TRUTH));}}), + LocationAccess(RC_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, {[]{return Boomerang && (LogicLensBotw || CanUse(RG_LENS_OF_TRUTH)) && SmallKeys(RR_BOTTOM_OF_THE_WELL, 3);}}), + LocationAccess(RC_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, {[]{return Boomerang && (LogicLensBotw || CanUse(RG_LENS_OF_TRUTH)) && SmallKeys(RR_BOTTOM_OF_THE_WELL, 3);}}), + LocationAccess(RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, {[]{return SmallKeys(RR_BOTTOM_OF_THE_WELL, 3) && (LogicLensBotw || CanUse(RG_LENS_OF_TRUTH)) && Boomerang;}}), }, { //Exits - Entrance(BOTTOM_OF_THE_WELL_ENTRYWAY, {[]{return true;}}), + Entrance(RR_BOTTOM_OF_THE_WELL_ENTRYWAY, {[]{return true;}}), }); } @@ -54,33 +54,33 @@ void AreaTable_Init_BottomOfTheWell() { | MASTER QUEST DUNGEON | ---------------------------*/ if (Dungeon::BottomOfTheWell.IsMQ()) { - areaTable[BOTTOM_OF_THE_WELL_MQ_PERIMETER] = Area("Bottom of the Well MQ Perimeter", "Bottom of the Well", BOTTOM_OF_THE_WELL, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_BOTTOM_OF_THE_WELL_MQ_PERIMETER] = Area("Bottom of the Well MQ Perimeter", "Bottom of the Well", RHT_BOTTOM_OF_THE_WELL, NO_DAY_NIGHT_CYCLE, { //Events //EventAccess(&WallFairy, {[]{return WallFairy || Slingshot;}}), }, { //Locations - LocationAccess(BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, {[]{return KokiriSword || (Sticks && LogicChildDeadhand);}}), - LocationAccess(BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY, {[]{return HasExplosives || (LogicBotwMQDeadHandKey && Boomerang);}}), + LocationAccess(RC_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, {[]{return KokiriSword || (Sticks && LogicChildDeadhand);}}), + LocationAccess(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY, {[]{return HasExplosives || (LogicBotwMQDeadHandKey && Boomerang);}}), //Trick: HasExplosives || (LogicBotWMQDeadHandKey && Boomerang) - LocationAccess(BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, {[]{return CanChildAttack;}}), - LocationAccess(BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, {[]{return CanChildAttack && SmallKeys(BOTTOM_OF_THE_WELL, 2);}}), + LocationAccess(RC_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, {[]{return CanChildAttack;}}), + LocationAccess(RC_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, {[]{return CanChildAttack && SmallKeys(RR_BOTTOM_OF_THE_WELL, 2);}}), }, { //Exits - Entrance(BOTTOM_OF_THE_WELL_ENTRYWAY, {[]{return true;}}), - Entrance(BOTTOM_OF_THE_WELL_MQ_MIDDLE, {[]{return CanPlay(ZeldasLullaby) || (LogicBotwMQPits && HasExplosives);}}), + Entrance(RR_BOTTOM_OF_THE_WELL_ENTRYWAY, {[]{return true;}}), + Entrance(RR_BOTTOM_OF_THE_WELL_MQ_MIDDLE, {[]{return CanPlay(ZeldasLullaby) || (LogicBotwMQPits && HasExplosives);}}), //Trick: CanPlay(ZeldasLullaby) || (LogicBotWMQPits && HasExplosives) }); - areaTable[BOTTOM_OF_THE_WELL_MQ_MIDDLE] = Area("Bottom of the Well MQ Middle", "Bottom of the Well", BOTTOM_OF_THE_WELL, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_BOTTOM_OF_THE_WELL_MQ_MIDDLE] = Area("Bottom of the Well MQ Middle", "Bottom of the Well", RHT_BOTTOM_OF_THE_WELL, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(BOTTOM_OF_THE_WELL_MQ_MAP_CHEST, {[]{return true;}}), - LocationAccess(BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST, {[]{return HasExplosives && SmallKeys(BOTTOM_OF_THE_WELL, 2);}}), - LocationAccess(BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY, {[]{return true;}}), - LocationAccess(BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM, {[]{return CanChildAttack && (LogicBotwMQPits || HasExplosives);}}), + LocationAccess(RC_BOTTOM_OF_THE_WELL_MQ_MAP_CHEST, {[]{return true;}}), + LocationAccess(RC_BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST, {[]{return HasExplosives && SmallKeys(RR_BOTTOM_OF_THE_WELL, 2);}}), + LocationAccess(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY, {[]{return true;}}), + LocationAccess(RC_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM, {[]{return CanChildAttack && (LogicBotwMQPits || HasExplosives);}}), //Trick: CanChildAttack && (LogicBotWMQPits || HasExplosives) }, { //Exits - Entrance(BOTTOM_OF_THE_WELL_MQ_PERIMETER, {[]{return true;}}), + Entrance(RR_BOTTOM_OF_THE_WELL_MQ_PERIMETER, {[]{return true;}}), }); } } 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 6691ac2f2..b69787769 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 @@ -6,267 +6,267 @@ using namespace Logic; using namespace Settings; void AreaTable_Init_CastleTown() { - areaTable[MARKET_ENTRANCE] = Area("Market Entrance", "Market Entrance", THE_MARKET, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_MARKET_ENTRANCE] = Area("Market Entrance", "Market Entrance", RHT_THE_MARKET, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(HYRULE_FIELD, {[]{return IsAdult || AtDay;}}), - Entrance(THE_MARKET, {[]{return true;}}), - Entrance(MARKET_GUARD_HOUSE, {[]{return true;}}), + Entrance(RR_HYRULE_FIELD, {[]{return IsAdult || AtDay;}}), + Entrance(RR_THE_MARKET, {[]{return true;}}), + Entrance(RR_MARKET_GUARD_HOUSE, {[]{return true;}}), }); - areaTable[THE_MARKET] = Area("Market", "Market", THE_MARKET, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_THE_MARKET] = Area("Market", "Market", RHT_THE_MARKET, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(MARKET_ENTRANCE, {[]{return true;}}), - Entrance(TOT_ENTRANCE, {[]{return true;}}), - Entrance(CASTLE_GROUNDS, {[]{return true;}}), - Entrance(MARKET_BAZAAR, {[]{return IsChild && AtDay;}}), - Entrance(MARKET_MASK_SHOP, {[]{return IsChild && AtDay;}}), - Entrance(MARKET_SHOOTING_GALLERY, {[]{return IsChild && AtDay;}}), - Entrance(MARKET_BOMBCHU_BOWLING, {[]{return IsChild;}}), - Entrance(MARKET_TREASURE_CHEST_GAME, {[]{return IsChild && AtNight;}}), - Entrance(MARKET_POTION_SHOP, {[]{return IsChild && AtDay;}}), - Entrance(MARKET_BACK_ALLEY, {[]{return IsChild;}}), + Entrance(RR_MARKET_ENTRANCE, {[]{return true;}}), + Entrance(RR_TOT_ENTRANCE, {[]{return true;}}), + Entrance(RR_CASTLE_GROUNDS, {[]{return true;}}), + Entrance(RR_MARKET_BAZAAR, {[]{return IsChild && AtDay;}}), + Entrance(RR_MARKET_MASK_SHOP, {[]{return IsChild && AtDay;}}), + Entrance(RR_MARKET_SHOOTING_GALLERY, {[]{return IsChild && AtDay;}}), + Entrance(RR_MARKET_BOMBCHU_BOWLING, {[]{return IsChild;}}), + Entrance(RR_MARKET_TREASURE_CHEST_GAME, {[]{return IsChild && AtNight;}}), + Entrance(RR_MARKET_POTION_SHOP, {[]{return IsChild && AtDay;}}), + Entrance(RR_MARKET_BACK_ALLEY, {[]{return IsChild;}}), }); - areaTable[MARKET_BACK_ALLEY] = Area("Market Back Alley", "Market", THE_MARKET, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_MARKET_BACK_ALLEY] = Area("Market Back Alley", "Market", RHT_THE_MARKET, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(THE_MARKET, {[]{return true;}}), - Entrance(MARKET_BOMBCHU_SHOP, {[]{return AtNight;}}), - Entrance(MARKET_DOG_LADY_HOUSE, {[]{return true;}}), - Entrance(MARKET_MAN_IN_GREEN_HOUSE, {[]{return AtNight;}}), + Entrance(RR_THE_MARKET, {[]{return true;}}), + Entrance(RR_MARKET_BOMBCHU_SHOP, {[]{return AtNight;}}), + Entrance(RR_MARKET_DOG_LADY_HOUSE, {[]{return true;}}), + Entrance(RR_MARKET_MAN_IN_GREEN_HOUSE, {[]{return AtNight;}}), }); - areaTable[TOT_ENTRANCE] = Area("ToT Entrance", "ToT Entrance", THE_MARKET, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_TOT_ENTRANCE] = Area("ToT Entrance", "ToT Entrance", RHT_THE_MARKET, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&GossipStoneFairy, {[]{return GossipStoneFairy || CanSummonGossipFairyWithoutSuns;}}), }, { //Locations - LocationAccess(TOT_GOSSIP_STONE_LEFT, {[]{return true;}}), - LocationAccess(TOT_GOSSIP_STONE_LEFT_CENTER, {[]{return true;}}), - LocationAccess(TOT_GOSSIP_STONE_RIGHT_CENTER, {[]{return true;}}), - LocationAccess(TOT_GOSSIP_STONE_RIGHT, {[]{return true;}}), + LocationAccess(RC_TOT_LEFT_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_TOT_LEFT_CENTER_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_TOT_RIGHT_CENTER_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_TOT_RIGHT_GOSSIP_STONE, {[]{return true;}}), }, { //Exits - Entrance(THE_MARKET, {[]{return true;}}), - Entrance(TEMPLE_OF_TIME, {[]{return true;}}), + Entrance(RR_THE_MARKET, {[]{return true;}}), + Entrance(RR_TEMPLE_OF_TIME, {[]{return true;}}), }); - areaTable[TEMPLE_OF_TIME] = Area("Temple of Time", "Temple of Time", TEMPLE_OF_TIME, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_TEMPLE_OF_TIME] = Area("Temple of Time", "Temple of Time", RHT_TEMPLE_OF_TIME, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(TOT_LIGHT_ARROWS_CUTSCENE, {[]{return IsAdult && CanTriggerLACS;}}), + LocationAccess(RC_TOT_LIGHT_ARROWS_CUTSCENE, {[]{return IsAdult && CanTriggerLACS;}}), }, { //Exits - Entrance(TOT_ENTRANCE, {[]{return true;}}), - Entrance(TOT_BEYOND_DOOR_OF_TIME, {[]{return OpenDoorOfTime.Is(OPENDOOROFTIME_OPEN) || (CanPlay(SongOfTime) && (OpenDoorOfTime.Is(OPENDOOROFTIME_SONGONLY) || (HasAllStones && OcarinaOfTime)));}}), + Entrance(RR_TOT_ENTRANCE, {[]{return true;}}), + Entrance(RR_TOT_BEYOND_DOOR_OF_TIME, {[]{return OpenDoorOfTime.Is(OPENDOOROFTIME_OPEN) || (CanPlay(SongOfTime) && (OpenDoorOfTime.Is(OPENDOOROFTIME_SONGONLY) || (HasAllStones && OcarinaOfTime)));}}), }); - areaTable[TOT_BEYOND_DOOR_OF_TIME] = Area("Beyond Door of Time", "Beyond Door of Time", TEMPLE_OF_TIME, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_TOT_BEYOND_DOOR_OF_TIME] = Area("Beyond Door of Time", "Beyond Door of Time", RHT_TEMPLE_OF_TIME, NO_DAY_NIGHT_CYCLE, { //Events //EventAccess(&TimeTravel, {[]{return true;}}), }, { //Locations - LocationAccess(SHEIK_AT_TEMPLE, {[]{return ForestMedallion && IsAdult;}}), + LocationAccess(RC_SHEIK_AT_TEMPLE, {[]{return ForestMedallion && IsAdult;}}), }, { //Exits - Entrance(TEMPLE_OF_TIME, {[]{return true;}}), + Entrance(RR_TEMPLE_OF_TIME, {[]{return true;}}), }); - areaTable[CASTLE_GROUNDS] = Area("Castle Grounds", "Castle Grounds", NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_CASTLE_GROUNDS] = Area("Castle Grounds", "Castle Grounds", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(THE_MARKET, {[]{return true;}}), - Entrance(HYRULE_CASTLE_GROUNDS, {[]{return IsChild;}}), - Entrance(GANONS_CASTLE_GROUNDS, {[]{return IsAdult;}}), + Entrance(RR_THE_MARKET, {[]{return true;}}), + Entrance(RR_HYRULE_CASTLE_GROUNDS, {[]{return IsChild;}}), + Entrance(RR_GANONS_CASTLE_GROUNDS, {[]{return IsAdult;}}), }); - areaTable[HYRULE_CASTLE_GROUNDS] = Area("Hyrule Castle Grounds", "Castle Grounds", HYRULE_CASTLE, DAY_NIGHT_CYCLE, { + areaTable[RR_HYRULE_CASTLE_GROUNDS] = Area("Hyrule Castle Grounds", "Castle Grounds", RHT_HYRULE_CASTLE, DAY_NIGHT_CYCLE, { //Events EventAccess(&GossipStoneFairy, {[]{return GossipStoneFairy || CanSummonGossipFairy;}}), - EventAccess(&ButterflyFairy, {[]{return ButterflyFairy || CanUse(STICKS);}}), + EventAccess(&ButterflyFairy, {[]{return ButterflyFairy || CanUse(RG_STICKS);}}), EventAccess(&BugRock, {[]{return true;}}), }, { //Locations - LocationAccess(HC_MALON_EGG, {[]{return true;}}), - LocationAccess(HC_GS_TREE, {[]{return CanChildAttack;}}), - LocationAccess(HC_MALON_GOSSIP_STONE, {[]{return true;}}), - LocationAccess(HC_ROCK_WALL_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_HC_MALON_EGG, {[]{return true;}}), + LocationAccess(RC_HC_GS_TREE, {[]{return CanChildAttack;}}), + LocationAccess(RC_HC_MALON_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_HC_ROCK_WALL_GOSSIP_STONE, {[]{return true;}}), }, { //Exits - Entrance(CASTLE_GROUNDS, {[]{return true;}}), - Entrance(HC_GARDEN, {[]{return WeirdEgg || !ShuffleWeirdEgg;}}), - Entrance(HC_GREAT_FAIRY_FOUNTAIN, {[]{return CanBlastOrSmash;}}), - Entrance(HC_STORMS_GROTTO, {[]{return CanOpenStormGrotto;}}), + Entrance(RR_CASTLE_GROUNDS, {[]{return true;}}), + Entrance(RR_HC_GARDEN, {[]{return WeirdEgg || !ShuffleWeirdEgg;}}), + Entrance(RR_HC_GREAT_FAIRY_FOUNTAIN, {[]{return CanBlastOrSmash;}}), + Entrance(RR_HC_STORMS_GROTTO, {[]{return CanOpenStormGrotto;}}), }); - areaTable[HC_GARDEN] = Area("HC Garden", "Castle Grounds", HYRULE_CASTLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_HC_GARDEN] = Area("HC Garden", "Castle Grounds", RHT_HYRULE_CASTLE, NO_DAY_NIGHT_CYCLE, { //Events }, { //Locations - LocationAccess(HC_ZELDAS_LETTER, {[]{return true;}}), - LocationAccess(SONG_FROM_IMPA, {[]{return true;}}), + LocationAccess(RC_HC_ZELDAS_LETTER, {[]{return true;}}), + LocationAccess(RC_SONG_FROM_IMPA, {[]{return true;}}), }, { //Exits - Entrance(HYRULE_CASTLE_GROUNDS, {[]{return true;}}), + Entrance(RR_HYRULE_CASTLE_GROUNDS, {[]{return true;}}), }); - areaTable[HC_GREAT_FAIRY_FOUNTAIN] = Area("HC Great Fairy Fountain", "HC Great Fairy Fountain", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_HC_GREAT_FAIRY_FOUNTAIN] = Area("HC Great Fairy Fountain", "HC Great Fairy Fountain", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(HC_GREAT_FAIRY_REWARD, {[]{return CanPlay(ZeldasLullaby);}}), + LocationAccess(RC_HC_GREAT_FAIRY_REWARD, {[]{return CanPlay(ZeldasLullaby);}}), }, { //Exits - Entrance(CASTLE_GROUNDS, {[]{return true;}}), + Entrance(RR_CASTLE_GROUNDS, {[]{return true;}}), }); - areaTable[HC_STORMS_GROTTO] = Area("HC Storms Grotto", "HC Storms Grotto", NONE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_HC_STORMS_GROTTO] = Area("HC Storms Grotto", "HC Storms Grotto", RHT_NONE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&NutPot, {[]{return NutPot || CanBlastOrSmash;}}), EventAccess(&GossipStoneFairy, {[]{return GossipStoneFairy || (CanBlastOrSmash && CanSummonGossipFairy);}}), EventAccess(&WanderingBugs, {[]{return WanderingBugs || CanBlastOrSmash;}}), }, { //Locations - LocationAccess(HC_GS_STORMS_GROTTO, {[]{return (CanBlastOrSmash && HookshotOrBoomerang) || (Boomerang && LogicCastleStormsGS);}}), - LocationAccess(HC_STORMS_GROTTO_GOSSIP_STONE, {[]{return CanBlastOrSmash;}}), + LocationAccess(RC_HC_GS_STORMS_GROTTO, {[]{return (CanBlastOrSmash && HookshotOrBoomerang) || (Boomerang && LogicCastleStormsGS);}}), + LocationAccess(RC_HC_STORMS_GROTTO_GOSSIP_STONE, {[]{return CanBlastOrSmash;}}), }, { //Exits - Entrance(CASTLE_GROUNDS, {[]{return true;}}), + Entrance(RR_CASTLE_GROUNDS, {[]{return true;}}), }); - areaTable[GANONS_CASTLE_GROUNDS] = Area("Ganon's Castle Grounds", "Castle Grounds", OUTSIDE_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_GROUNDS] = Area("Ganon's Castle Grounds", "Castle Grounds", RHT_OUTSIDE_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { EventAccess(&BuiltRainbowBridge, {[]{return CanBuildRainbowBridge;}}), }, { //Locations //the terrain was lowered such that you can't get this GS with a simple sword slash - LocationAccess(OGC_GS, {[]{return CanJumpslash || CanUseProjectile - || (CanShield && CanUse(MEGATON_HAMMER)) || CanUse(DINS_FIRE);}}), + LocationAccess(RC_OGC_GS, {[]{return CanJumpslash || CanUseProjectile + || (CanShield && CanUse(RG_MEGATON_HAMMER)) || CanUse(RG_DINS_FIRE);}}), }, { //Exits - Entrance(CASTLE_GROUNDS, {[]{return AtNight;}}), - Entrance(OGC_GREAT_FAIRY_FOUNTAIN, {[]{return CanUse(GOLDEN_GAUNTLETS) && AtNight;}}), - Entrance(GANONS_CASTLE_LEDGE, {[]{return BuiltRainbowBridge;}}), + Entrance(RR_CASTLE_GROUNDS, {[]{return AtNight;}}), + Entrance(RR_OGC_GREAT_FAIRY_FOUNTAIN, {[]{return CanUse(RG_GOLDEN_GAUNTLETS) && AtNight;}}), + Entrance(RR_GANONS_CASTLE_LEDGE, {[]{return BuiltRainbowBridge;}}), }); - areaTable[OGC_GREAT_FAIRY_FOUNTAIN] = Area("OGC Great Fairy Fountain", "OGC Great Fairy Fountain", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_OGC_GREAT_FAIRY_FOUNTAIN] = Area("OGC Great Fairy Fountain", "OGC Great Fairy Fountain", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(OGC_GREAT_FAIRY_REWARD, {[]{return CanPlay(ZeldasLullaby);}}), + LocationAccess(RC_OGC_GREAT_FAIRY_REWARD, {[]{return CanPlay(ZeldasLullaby);}}), }, { //Exits - Entrance(CASTLE_GROUNDS, {[]{return true;}}), + Entrance(RR_CASTLE_GROUNDS, {[]{return true;}}), }); - areaTable[CASTLE_GROUNDS_FROM_GANONS_CASTLE] = Area("Castle Grounds From Ganon's Castle", "Castle Grounds From Ganon's Castle", NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_CASTLE_GROUNDS_FROM_GANONS_CASTLE] = Area("Castle Grounds From Ganon's Castle", "Castle Grounds From Ganon's Castle", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { // Exits - Entrance(HYRULE_CASTLE_GROUNDS, { [] { return IsChild; }}), - Entrance(GANONS_CASTLE_LEDGE, { [] { return IsAdult; }}), + Entrance(RR_HYRULE_CASTLE_GROUNDS, { [] { return IsChild; }}), + Entrance(RR_GANONS_CASTLE_LEDGE, { [] { return IsAdult; }}), }); - areaTable[GANONS_CASTLE_LEDGE] = Area("Ganon's Castle Ledge", "OGC Ganon's Castle Ledge", NONE, NO_DAY_NIGHT_CYCLE, + areaTable[RR_GANONS_CASTLE_LEDGE] = Area("Ganon's Castle Ledge", "OGC Ganon's Castle Ledge", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { // Exits - Entrance(GANONS_CASTLE_GROUNDS, {[]{return BuiltRainbowBridge;}}), - Entrance(GANONS_CASTLE_ENTRYWAY, {[]{return IsAdult;}}), + Entrance(RR_GANONS_CASTLE_GROUNDS, {[]{return BuiltRainbowBridge;}}), + Entrance(RR_GANONS_CASTLE_ENTRYWAY, {[]{return IsAdult;}}), }); - areaTable[MARKET_GUARD_HOUSE] = Area("Market Guard House", "Market Guard House", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_MARKET_GUARD_HOUSE] = Area("Market Guard House", "Market Guard House", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(MARKET_10_BIG_POES, {[]{return IsAdult && BigPoeKill;}}), - LocationAccess(MARKET_GS_GUARD_HOUSE, {[]{return IsChild;}}), + LocationAccess(RC_MARKET_10_BIG_POES, {[]{return IsAdult && BigPoeKill;}}), + LocationAccess(RC_MARKET_GS_GUARD_HOUSE, {[]{return IsChild;}}), }, { //Exits - Entrance(MARKET_ENTRANCE, {[]{return true;}}), + Entrance(RR_MARKET_ENTRANCE, {[]{return true;}}), }); - areaTable[MARKET_BAZAAR] = Area("Market Bazaar", "Market Bazaar", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_MARKET_BAZAAR] = Area("Market Bazaar", "Market Bazaar", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(MARKET_BAZAAR_ITEM_1, {[]{return true;}}), - LocationAccess(MARKET_BAZAAR_ITEM_2, {[]{return true;}}), - LocationAccess(MARKET_BAZAAR_ITEM_3, {[]{return true;}}), - LocationAccess(MARKET_BAZAAR_ITEM_4, {[]{return true;}}), - LocationAccess(MARKET_BAZAAR_ITEM_5, {[]{return true;}}), - LocationAccess(MARKET_BAZAAR_ITEM_6, {[]{return true;}}), - LocationAccess(MARKET_BAZAAR_ITEM_7, {[]{return true;}}), - LocationAccess(MARKET_BAZAAR_ITEM_8, {[]{return true;}}), + LocationAccess(RC_MARKET_BAZAAR_ITEM_1, {[]{return true;}}), + LocationAccess(RC_MARKET_BAZAAR_ITEM_2, {[]{return true;}}), + LocationAccess(RC_MARKET_BAZAAR_ITEM_3, {[]{return true;}}), + LocationAccess(RC_MARKET_BAZAAR_ITEM_4, {[]{return true;}}), + LocationAccess(RC_MARKET_BAZAAR_ITEM_5, {[]{return true;}}), + LocationAccess(RC_MARKET_BAZAAR_ITEM_6, {[]{return true;}}), + LocationAccess(RC_MARKET_BAZAAR_ITEM_7, {[]{return true;}}), + LocationAccess(RC_MARKET_BAZAAR_ITEM_8, {[]{return true;}}), }, { //Exits - Entrance(THE_MARKET, {[]{return true;}}), + Entrance(RR_THE_MARKET, {[]{return true;}}), }); - areaTable[MARKET_MASK_SHOP] = Area("Market Mask Shop", "Market Mask Shop", NONE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_MARKET_MASK_SHOP] = Area("Market Mask Shop", "Market Mask Shop", RHT_NONE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&SkullMask, {[]{return SkullMask || (ZeldasLetter && (CompleteMaskQuest || ChildCanAccess(KAKARIKO_VILLAGE)));}}), - EventAccess(&MaskOfTruth, {[]{return MaskOfTruth || (SkullMask && (CompleteMaskQuest || (ChildCanAccess(THE_LOST_WOODS) && CanPlay(SariasSong) && AreaTable(THE_GRAVEYARD)->childDay && ChildCanAccess(HYRULE_FIELD) && HasAllStones)));}}), + EventAccess(&SkullMask, {[]{return SkullMask || (ZeldasLetter && (CompleteMaskQuest || ChildCanAccess(RR_KAKARIKO_VILLAGE)));}}), + EventAccess(&MaskOfTruth, {[]{return MaskOfTruth || (SkullMask && (CompleteMaskQuest || (ChildCanAccess(RR_THE_LOST_WOODS) && CanPlay(SariasSong) && AreaTable(RR_THE_GRAVEYARD)->childDay && ChildCanAccess(RR_HYRULE_FIELD) && HasAllStones)));}}), }, {}, { //Exits - Entrance(THE_MARKET, {[]{return true;}}), + Entrance(RR_THE_MARKET, {[]{return true;}}), }); - areaTable[MARKET_SHOOTING_GALLERY] = Area("Market Shooting Gallery", "Market Shooting Gallery", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_MARKET_SHOOTING_GALLERY] = Area("Market Shooting Gallery", "Market Shooting Gallery", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(MARKET_SHOOTING_GALLERY_REWARD, {[]{return IsChild;}}), + LocationAccess(RC_MARKET_SHOOTING_GALLERY_REWARD, {[]{return IsChild;}}), }, { //Exits - Entrance(THE_MARKET, {[]{return true;}}), + Entrance(RR_THE_MARKET, {[]{return true;}}), }); - areaTable[MARKET_BOMBCHU_BOWLING] = Area("Market Bombchu Bowling", "Market Bombchu Bowling", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_MARKET_BOMBCHU_BOWLING] = Area("Market Bombchu Bowling", "Market Bombchu Bowling", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, {[]{return CanPlayBowling;}}), - LocationAccess(MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, {[]{return CanPlayBowling;}}), - LocationAccess(MARKET_BOMBCHU_BOWLING_BOMBCHUS, {[]{return CanPlayBowling;}}), + LocationAccess(RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, {[]{return CanPlayBowling;}}), + LocationAccess(RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, {[]{return CanPlayBowling;}}), + LocationAccess(RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS, {[]{return CanPlayBowling;}}), }, { //Exits - Entrance(THE_MARKET, {[]{return true;}}), + Entrance(RR_THE_MARKET, {[]{return true;}}), }); - areaTable[MARKET_POTION_SHOP] = Area("Market Potion Shop", "Market Potion Shop", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_MARKET_POTION_SHOP] = Area("Market Potion Shop", "Market Potion Shop", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(MARKET_POTION_SHOP_ITEM_1, {[]{return true;}}), - LocationAccess(MARKET_POTION_SHOP_ITEM_2, {[]{return true;}}), - LocationAccess(MARKET_POTION_SHOP_ITEM_3, {[]{return true;}}), - LocationAccess(MARKET_POTION_SHOP_ITEM_4, {[]{return true;}}), - LocationAccess(MARKET_POTION_SHOP_ITEM_5, {[]{return true;}}), - LocationAccess(MARKET_POTION_SHOP_ITEM_6, {[]{return true;}}), - LocationAccess(MARKET_POTION_SHOP_ITEM_7, {[]{return true;}}), - LocationAccess(MARKET_POTION_SHOP_ITEM_8, {[]{return true;}}), + LocationAccess(RC_MARKET_POTION_SHOP_ITEM_1, {[]{return true;}}), + LocationAccess(RC_MARKET_POTION_SHOP_ITEM_2, {[]{return true;}}), + LocationAccess(RC_MARKET_POTION_SHOP_ITEM_3, {[]{return true;}}), + LocationAccess(RC_MARKET_POTION_SHOP_ITEM_4, {[]{return true;}}), + LocationAccess(RC_MARKET_POTION_SHOP_ITEM_5, {[]{return true;}}), + LocationAccess(RC_MARKET_POTION_SHOP_ITEM_6, {[]{return true;}}), + LocationAccess(RC_MARKET_POTION_SHOP_ITEM_7, {[]{return true;}}), + LocationAccess(RC_MARKET_POTION_SHOP_ITEM_8, {[]{return true;}}), }, { //Exits - Entrance(THE_MARKET, {[]{return true;}}), + Entrance(RR_THE_MARKET, {[]{return true;}}), }); - areaTable[MARKET_TREASURE_CHEST_GAME] = Area("Market Treasure Chest Game", "Market Treasure Chest Game", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_MARKET_TREASURE_CHEST_GAME] = Area("Market Treasure Chest Game", "Market Treasure Chest Game", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(MARKET_TREASURE_CHEST_GAME_REWARD, {[]{return (CanUse(LENS_OF_TRUTH) && !ShuffleChestMinigame) || (ShuffleChestMinigame.Is(SHUFFLECHESTMINIGAME_SINGLE_KEYS) && SmallKeys(MARKET_TREASURE_CHEST_GAME, 6)) || (ShuffleChestMinigame.Is(SHUFFLECHESTMINIGAME_PACK) && SmallKeys(MARKET_TREASURE_CHEST_GAME, 1));}}), - LocationAccess(MARKET_TREASURE_CHEST_GAME_ITEM_1, {[]{return (ShuffleChestMinigame.Is(SHUFFLECHESTMINIGAME_SINGLE_KEYS) && SmallKeys(MARKET_TREASURE_CHEST_GAME, 1)) || (ShuffleChestMinigame.Is(SHUFFLECHESTMINIGAME_PACK) && SmallKeys(MARKET_TREASURE_CHEST_GAME, 1)) || (CanUse(LENS_OF_TRUTH) && !ShuffleChestMinigame);}}), - LocationAccess(MARKET_TREASURE_CHEST_GAME_ITEM_2, {[]{return (ShuffleChestMinigame.Is(SHUFFLECHESTMINIGAME_SINGLE_KEYS) && SmallKeys(MARKET_TREASURE_CHEST_GAME, 2)) || (ShuffleChestMinigame.Is(SHUFFLECHESTMINIGAME_PACK) && SmallKeys(MARKET_TREASURE_CHEST_GAME, 1)) || (CanUse(LENS_OF_TRUTH) && !ShuffleChestMinigame);}}), - LocationAccess(MARKET_TREASURE_CHEST_GAME_ITEM_3, {[]{return (ShuffleChestMinigame.Is(SHUFFLECHESTMINIGAME_SINGLE_KEYS) && SmallKeys(MARKET_TREASURE_CHEST_GAME, 3)) || (ShuffleChestMinigame.Is(SHUFFLECHESTMINIGAME_PACK) && SmallKeys(MARKET_TREASURE_CHEST_GAME, 1)) || (CanUse(LENS_OF_TRUTH) && !ShuffleChestMinigame);}}), - LocationAccess(MARKET_TREASURE_CHEST_GAME_ITEM_4, {[]{return (ShuffleChestMinigame.Is(SHUFFLECHESTMINIGAME_SINGLE_KEYS) && SmallKeys(MARKET_TREASURE_CHEST_GAME, 4)) || (ShuffleChestMinigame.Is(SHUFFLECHESTMINIGAME_PACK) && SmallKeys(MARKET_TREASURE_CHEST_GAME, 1)) || (CanUse(LENS_OF_TRUTH) && !ShuffleChestMinigame);}}), - LocationAccess(MARKET_TREASURE_CHEST_GAME_ITEM_5, {[]{return (ShuffleChestMinigame.Is(SHUFFLECHESTMINIGAME_SINGLE_KEYS) && SmallKeys(MARKET_TREASURE_CHEST_GAME, 5)) || (ShuffleChestMinigame.Is(SHUFFLECHESTMINIGAME_PACK) && SmallKeys(MARKET_TREASURE_CHEST_GAME, 1)) || (CanUse(LENS_OF_TRUTH) && !ShuffleChestMinigame);}}), + LocationAccess(RC_MARKET_TREASURE_CHEST_GAME_REWARD, {[]{return (CanUse(RG_LENS_OF_TRUTH) && !ShuffleChestMinigame) || (ShuffleChestMinigame.Is(SHUFFLECHESTMINIGAME_SINGLE_KEYS) && SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 6)) || (ShuffleChestMinigame.Is(SHUFFLECHESTMINIGAME_PACK) && SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1));}}), + LocationAccess(RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, {[]{return (ShuffleChestMinigame.Is(SHUFFLECHESTMINIGAME_SINGLE_KEYS) && SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1)) || (ShuffleChestMinigame.Is(SHUFFLECHESTMINIGAME_PACK) && SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1)) || (CanUse(RG_LENS_OF_TRUTH) && !ShuffleChestMinigame);}}), + LocationAccess(RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, {[]{return (ShuffleChestMinigame.Is(SHUFFLECHESTMINIGAME_SINGLE_KEYS) && SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 2)) || (ShuffleChestMinigame.Is(SHUFFLECHESTMINIGAME_PACK) && SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1)) || (CanUse(RG_LENS_OF_TRUTH) && !ShuffleChestMinigame);}}), + LocationAccess(RC_MARKET_TREASURE_CHEST_GAME_ITEM_3, {[]{return (ShuffleChestMinigame.Is(SHUFFLECHESTMINIGAME_SINGLE_KEYS) && SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 3)) || (ShuffleChestMinigame.Is(SHUFFLECHESTMINIGAME_PACK) && SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1)) || (CanUse(RG_LENS_OF_TRUTH) && !ShuffleChestMinigame);}}), + LocationAccess(RC_MARKET_TREASURE_CHEST_GAME_ITEM_4, {[]{return (ShuffleChestMinigame.Is(SHUFFLECHESTMINIGAME_SINGLE_KEYS) && SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 4)) || (ShuffleChestMinigame.Is(SHUFFLECHESTMINIGAME_PACK) && SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1)) || (CanUse(RG_LENS_OF_TRUTH) && !ShuffleChestMinigame);}}), + LocationAccess(RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, {[]{return (ShuffleChestMinigame.Is(SHUFFLECHESTMINIGAME_SINGLE_KEYS) && SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 5)) || (ShuffleChestMinigame.Is(SHUFFLECHESTMINIGAME_PACK) && SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1)) || (CanUse(RG_LENS_OF_TRUTH) && !ShuffleChestMinigame);}}), }, { //Exits - Entrance(THE_MARKET, {[]{return true;}}), + Entrance(RR_THE_MARKET, {[]{return true;}}), }); - areaTable[MARKET_BOMBCHU_SHOP] = Area("Market Bombchu Shop", "Market Bombchu Shop", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_MARKET_BOMBCHU_SHOP] = Area("Market Bombchu Shop", "Market Bombchu Shop", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(MARKET_BOMBCHU_SHOP_ITEM_1, {[]{return true;}}), - LocationAccess(MARKET_BOMBCHU_SHOP_ITEM_2, {[]{return true;}}), - LocationAccess(MARKET_BOMBCHU_SHOP_ITEM_3, {[]{return true;}}), - LocationAccess(MARKET_BOMBCHU_SHOP_ITEM_4, {[]{return true;}}), - LocationAccess(MARKET_BOMBCHU_SHOP_ITEM_5, {[]{return true;}}), - LocationAccess(MARKET_BOMBCHU_SHOP_ITEM_6, {[]{return true;}}), - LocationAccess(MARKET_BOMBCHU_SHOP_ITEM_7, {[]{return true;}}), - LocationAccess(MARKET_BOMBCHU_SHOP_ITEM_8, {[]{return true;}}), + LocationAccess(RC_MARKET_BOMBCHU_SHOP_ITEM_1, {[]{return true;}}), + LocationAccess(RC_MARKET_BOMBCHU_SHOP_ITEM_2, {[]{return true;}}), + LocationAccess(RC_MARKET_BOMBCHU_SHOP_ITEM_3, {[]{return true;}}), + LocationAccess(RC_MARKET_BOMBCHU_SHOP_ITEM_4, {[]{return true;}}), + LocationAccess(RC_MARKET_BOMBCHU_SHOP_ITEM_5, {[]{return true;}}), + LocationAccess(RC_MARKET_BOMBCHU_SHOP_ITEM_6, {[]{return true;}}), + LocationAccess(RC_MARKET_BOMBCHU_SHOP_ITEM_7, {[]{return true;}}), + LocationAccess(RC_MARKET_BOMBCHU_SHOP_ITEM_8, {[]{return true;}}), }, { //Exits - Entrance(MARKET_BACK_ALLEY, {[]{return true;}}), + Entrance(RR_MARKET_BACK_ALLEY, {[]{return true;}}), }); - areaTable[MARKET_DOG_LADY_HOUSE] = Area("Market Dog Lady House", "Market Dog Lady House", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_MARKET_DOG_LADY_HOUSE] = Area("Market Dog Lady House", "Market Dog Lady House", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(MARKET_LOST_DOG, {[]{return IsChild && AtNight;}}), + LocationAccess(RC_MARKET_LOST_DOG, {[]{return IsChild && AtNight;}}), }, { //Exits - Entrance(MARKET_BACK_ALLEY, {[]{return true;}}), + Entrance(RR_MARKET_BACK_ALLEY, {[]{return true;}}), }); - areaTable[MARKET_MAN_IN_GREEN_HOUSE] = Area("Market Man in Green House", "Market Man in Green House", NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_MARKET_MAN_IN_GREEN_HOUSE] = Area("Market Man in Green House", "Market Man in Green House", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(MARKET_BACK_ALLEY, {[]{return true;}}), + Entrance(RR_MARKET_BACK_ALLEY, {[]{return true;}}), }); } 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 b52be650e..19556e07b 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 @@ -6,255 +6,255 @@ using namespace Logic; using namespace Settings; void AreaTable_Init_DeathMountain() { - areaTable[DEATH_MOUNTAIN_TRAIL] = Area("Death Mountain", "Death Mountain", DEATH_MOUNTAIN_TRAIL, DAY_NIGHT_CYCLE, { + areaTable[RR_DEATH_MOUNTAIN_TRAIL] = Area("Death Mountain", "Death Mountain", RHT_DEATH_MOUNTAIN_TRAIL, DAY_NIGHT_CYCLE, { //Events - EventAccess(&BeanPlantFairy, {[]{return BeanPlantFairy || (CanPlantBean(DEATH_MOUNTAIN_TRAIL) && CanPlay(SongOfStorms) && (HasExplosives || GoronBracelet));}}), + EventAccess(&BeanPlantFairy, {[]{return BeanPlantFairy || (CanPlantBean(RR_DEATH_MOUNTAIN_TRAIL) && CanPlay(SongOfStorms) && (HasExplosives || GoronBracelet));}}), }, { //Locations - LocationAccess(DMT_CHEST, {[]{return CanBlastOrSmash || (LogicDMTBombable && IsChild && GoronBracelet);}}), - LocationAccess(DMT_FREESTANDING_POH, {[]{return CanTakeDamage || CanUse(HOVER_BOOTS) || (IsAdult && CanPlantBean(DEATH_MOUNTAIN_TRAIL) && (HasExplosives || GoronBracelet));}}), - LocationAccess(DMT_GS_BEAN_PATCH, {[]{return CanPlantBugs && (HasExplosives || GoronBracelet || (LogicDMTSoilGS && (CanTakeDamage || CanUse(HOVER_BOOTS)) && CanUse(BOOMERANG)));}}), - LocationAccess(DMT_GS_NEAR_KAK, {[]{return CanBlastOrSmash;}}), - LocationAccess(DMT_GS_ABOVE_DODONGOS_CAVERN, {[]{return IsAdult && AtNight && (CanUse(MEGATON_HAMMER) || (LogicDMTGSLowerHookshot && CanUse(HOOKSHOT)) || (LogicDMTGSLowerBean && CanPlantBean(DEATH_MOUNTAIN_TRAIL)) || (LogicDMTGSLowerHovers && CanUse(HOVER_BOOTS)) || LogicDMTGSLowerJS) && CanGetNightTimeGS;}}), + LocationAccess(RC_DMT_CHEST, {[]{return CanBlastOrSmash || (LogicDMTBombable && IsChild && GoronBracelet);}}), + LocationAccess(RC_DMT_FREESTANDING_POH, {[]{return CanTakeDamage || CanUse(RG_HOVER_BOOTS) || (IsAdult && CanPlantBean(RR_DEATH_MOUNTAIN_TRAIL) && (HasExplosives || GoronBracelet));}}), + LocationAccess(RC_DMT_GS_BEAN_PATCH, {[]{return CanPlantBugs && (HasExplosives || GoronBracelet || (LogicDMTSoilGS && (CanTakeDamage || CanUse(RG_HOVER_BOOTS)) && CanUse(RG_BOOMERANG)));}}), + LocationAccess(RC_DMT_GS_NEAR_KAK, {[]{return CanBlastOrSmash;}}), + LocationAccess(RC_DMT_GS_ABOVE_DODONGOS_CAVERN, {[]{return IsAdult && AtNight && (CanUse(RG_MEGATON_HAMMER) || (LogicDMTGSLowerHookshot && CanUse(RG_HOOKSHOT)) || (LogicDMTGSLowerBean && CanPlantBean(RR_DEATH_MOUNTAIN_TRAIL)) || (LogicDMTGSLowerHovers && CanUse(RG_HOVER_BOOTS)) || LogicDMTGSLowerJS) && CanGetNightTimeGS;}}), }, { //Exits - Entrance(KAK_BEHIND_GATE, {[]{return true;}}), - Entrance(GORON_CITY, {[]{return true;}}), - Entrance(DEATH_MOUNTAIN_SUMMIT, {[]{return Here(DEATH_MOUNTAIN_TRAIL, []{return CanBlastOrSmash;}) || (IsAdult && ((CanPlantBean(DEATH_MOUNTAIN_TRAIL) && GoronBracelet) || (HoverBoots && LogicDMTClimbHovers)));}}), - Entrance(DODONGOS_CAVERN_ENTRYWAY, {[]{return HasExplosives || GoronBracelet || IsAdult;}}), - Entrance(DMT_STORMS_GROTTO, {[]{return CanOpenStormGrotto;}}), + Entrance(RR_KAK_BEHIND_GATE, {[]{return true;}}), + Entrance(RR_GORON_CITY, {[]{return true;}}), + Entrance(RR_DEATH_MOUNTAIN_SUMMIT, {[]{return Here(RR_DEATH_MOUNTAIN_TRAIL, []{return CanBlastOrSmash;}) || (IsAdult && ((CanPlantBean(RR_DEATH_MOUNTAIN_TRAIL) && GoronBracelet) || (HoverBoots && LogicDMTClimbHovers)));}}), + Entrance(RR_DODONGOS_CAVERN_ENTRYWAY, {[]{return HasExplosives || GoronBracelet || IsAdult;}}), + Entrance(RR_DMT_STORMS_GROTTO, {[]{return CanOpenStormGrotto;}}), }); - areaTable[DEATH_MOUNTAIN_SUMMIT] = Area("Death Mountain Summit", "Death Mountain", DEATH_MOUNTAIN_TRAIL, DAY_NIGHT_CYCLE, { + areaTable[RR_DEATH_MOUNTAIN_SUMMIT] = Area("Death Mountain Summit", "Death Mountain", RHT_DEATH_MOUNTAIN_TRAIL, DAY_NIGHT_CYCLE, { //Events EventAccess(&PrescriptionAccess, {[]{return PrescriptionAccess || (IsAdult && (BrokenSwordAccess || BrokenSword));}}), EventAccess(&GossipStoneFairy, {[]{return GossipStoneFairy || CanSummonGossipFairy;}}), EventAccess(&BugRock, {[]{return BugRock || IsChild;}}), }, { //Locations - LocationAccess(DMT_TRADE_BROKEN_SWORD, {[]{return IsAdult && BrokenSword;}}), - LocationAccess(DMT_TRADE_EYEDROPS, {[]{return IsAdult && Eyedrops;}}), - LocationAccess(DMT_TRADE_CLAIM_CHECK, {[]{return IsAdult && ClaimCheck;}}), - LocationAccess(DMT_GS_FALLING_ROCKS_PATH, {[]{return IsAdult && AtNight && (CanUse(MEGATON_HAMMER) || LogicDMTGSUpper) && CanGetNightTimeGS;}}), - LocationAccess(DMT_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_DMT_TRADE_BROKEN_SWORD, {[]{return IsAdult && BrokenSword;}}), + LocationAccess(RC_DMT_TRADE_EYEDROPS, {[]{return IsAdult && Eyedrops;}}), + LocationAccess(RC_DMT_TRADE_CLAIM_CHECK, {[]{return IsAdult && ClaimCheck;}}), + LocationAccess(RC_DMT_GS_FALLING_ROCKS_PATH, {[]{return IsAdult && AtNight && (CanUse(RG_MEGATON_HAMMER) || LogicDMTGSUpper) && CanGetNightTimeGS;}}), + LocationAccess(RC_DMT_GOSSIP_STONE, {[]{return true;}}), }, { //Exits - Entrance(DEATH_MOUNTAIN_TRAIL, {[]{return true;}}), - Entrance(DMC_UPPER_LOCAL, {[]{return true;}}), - Entrance(DMT_OWL_FLIGHT, {[]{return IsChild;}}), - Entrance(DMT_COW_GROTTO, {[]{return Here(DEATH_MOUNTAIN_SUMMIT, []{return CanBlastOrSmash;});}}), - Entrance(DMT_GREAT_FAIRY_FOUNTAIN, {[]{return Here(DEATH_MOUNTAIN_SUMMIT, []{return CanBlastOrSmash;});}}), + Entrance(RR_DEATH_MOUNTAIN_TRAIL, {[]{return true;}}), + Entrance(RR_DMC_UPPER_LOCAL, {[]{return true;}}), + Entrance(RR_DMT_OWL_FLIGHT, {[]{return IsChild;}}), + Entrance(RR_DMT_COW_GROTTO, {[]{return Here(RR_DEATH_MOUNTAIN_SUMMIT, []{return CanBlastOrSmash;});}}), + Entrance(RR_DMT_GREAT_FAIRY_FOUNTAIN, {[]{return Here(RR_DEATH_MOUNTAIN_SUMMIT, []{return CanBlastOrSmash;});}}), }); - areaTable[DMT_OWL_FLIGHT] = Area("DMT Owl Flight", "Death Mountain", NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DMT_OWL_FLIGHT] = Area("DMT Owl Flight", "Death Mountain", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(KAK_IMPAS_ROOFTOP, {[]{return true;}}), + Entrance(RR_KAK_IMPAS_ROOFTOP, {[]{return true;}}), }); - areaTable[DMT_COW_GROTTO] = Area("DMT Cow Grotto", "DMT Cow Grotto", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DMT_COW_GROTTO] = Area("DMT Cow Grotto", "DMT Cow Grotto", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(DMT_COW_GROTTO_COW, {[]{return CanPlay(EponasSong);}}), + LocationAccess(RC_DMT_COW_GROTTO_COW, {[]{return CanPlay(EponasSong);}}), }, { //Exits - Entrance(DEATH_MOUNTAIN_SUMMIT, {[]{return true;}}), + Entrance(RR_DEATH_MOUNTAIN_SUMMIT, {[]{return true;}}), }); - areaTable[DMT_STORMS_GROTTO] = Area("DMT Storms Grotto", "DMT Storms Grotto", NONE, NO_DAY_NIGHT_CYCLE, grottoEvents, { + areaTable[RR_DMT_STORMS_GROTTO] = Area("DMT Storms Grotto", "DMT Storms Grotto", RHT_NONE, NO_DAY_NIGHT_CYCLE, grottoEvents, { //Locations - LocationAccess(DMT_STORMS_GROTTO_CHEST, {[]{return true;}}), - LocationAccess(DMT_STORMS_GROTTO_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_DMT_STORMS_GROTTO_CHEST, {[]{return true;}}), + LocationAccess(RC_DMT_STORMS_GROTTO_GOSSIP_STONE, {[]{return true;}}), }, { //Exits - Entrance(DEATH_MOUNTAIN_TRAIL, {[]{return true;}}), + Entrance(RR_DEATH_MOUNTAIN_TRAIL, {[]{return true;}}), }); - areaTable[DMT_GREAT_FAIRY_FOUNTAIN] = Area("DMT Great Fairy Fountain", "DMT Great Fairy Fountain", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DMT_GREAT_FAIRY_FOUNTAIN] = Area("DMT Great Fairy Fountain", "DMT Great Fairy Fountain", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(DMT_GREAT_FAIRY_REWARD, {[]{return CanPlay(ZeldasLullaby);}}), + LocationAccess(RC_DMT_GREAT_FAIRY_REWARD, {[]{return CanPlay(ZeldasLullaby);}}), }, { //Exits - Entrance(DEATH_MOUNTAIN_SUMMIT, {[]{return true;}}), + Entrance(RR_DEATH_MOUNTAIN_SUMMIT, {[]{return true;}}), }); - areaTable[GORON_CITY] = Area("Goron City", "Goron City", GORON_CITY, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GORON_CITY] = Area("Goron City", "Goron City", RHT_GORON_CITY, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&GossipStoneFairy, {[]{return GossipStoneFairy || CanSummonGossipFairyWithoutSuns;}}), EventAccess(&StickPot, {[]{return StickPot || IsChild;}}), - EventAccess(&BugRock, {[]{return BugRock || (CanBlastOrSmash || CanUse(SILVER_GAUNTLETS));}}), - EventAccess(&GoronCityChildFire, {[]{return GoronCityChildFire || (IsChild && CanUse(DINS_FIRE));}}), - EventAccess(&GCWoodsWarpOpen, {[]{return GCWoodsWarpOpen || (CanBlastOrSmash || CanUse(DINS_FIRE) || CanUse(BOW) || GoronBracelet || GoronCityChildFire);}}), + EventAccess(&BugRock, {[]{return BugRock || (CanBlastOrSmash || CanUse(RG_SILVER_GAUNTLETS));}}), + EventAccess(&GoronCityChildFire, {[]{return GoronCityChildFire || (IsChild && CanUse(RG_DINS_FIRE));}}), + EventAccess(&GCWoodsWarpOpen, {[]{return GCWoodsWarpOpen || (CanBlastOrSmash || CanUse(RG_DINS_FIRE) || CanUse(RG_FAIRY_BOW) || GoronBracelet || GoronCityChildFire);}}), EventAccess(&GCDaruniasDoorOpenChild, {[]{return GCDaruniasDoorOpenChild || (IsChild && CanPlay(ZeldasLullaby));}}), - EventAccess(&StopGCRollingGoronAsAdult, {[]{return StopGCRollingGoronAsAdult || (IsAdult && (GoronBracelet || HasExplosives || Bow || (LogicGoronCityLinkGoronDins && CanUse(DINS_FIRE))));}}), + EventAccess(&StopGCRollingGoronAsAdult, {[]{return StopGCRollingGoronAsAdult || (IsAdult && (GoronBracelet || HasExplosives || Bow || (LogicGoronCityLinkGoronDins && CanUse(RG_DINS_FIRE))));}}), }, { //Locations - LocationAccess(GC_MAZE_LEFT_CHEST, {[]{return CanUse(MEGATON_HAMMER) || CanUse(SILVER_GAUNTLETS) || (LogicGoronCityLeftMost && HasExplosives && CanUse(HOVER_BOOTS));}}), - LocationAccess(GC_MAZE_CENTER_CHEST, {[]{return CanBlastOrSmash || CanUse(SILVER_GAUNTLETS);}}), - LocationAccess(GC_MAZE_RIGHT_CHEST, {[]{return CanBlastOrSmash || CanUse(SILVER_GAUNTLETS);}}), - LocationAccess(GC_POT_FREESTANDING_POH, {[]{return IsChild && GoronCityChildFire && (Bombs || (GoronBracelet && LogicGoronCityPotWithStrength) || (HasBombchus && LogicGoronCityPot));}}), - LocationAccess(GC_ROLLING_GORON_AS_CHILD, {[]{return IsChild && (HasExplosives || (GoronBracelet && LogicChildRollingWithStrength));}}), - LocationAccess(GC_ROLLING_GORON_AS_ADULT, {[]{return StopGCRollingGoronAsAdult;}}), - LocationAccess(GC_GS_BOULDER_MAZE, {[]{return IsChild && CanBlastOrSmash;}}), - LocationAccess(GC_GS_CENTER_PLATFORM, {[]{return IsAdult;}}), - LocationAccess(GC_MEDIGORON, {[]{return IsAdult && AdultsWallet && (CanBlastOrSmash || GoronBracelet);}}), - LocationAccess(GC_MAZE_GOSSIP_STONE, {[]{return CanBlastOrSmash || CanUse(SILVER_GAUNTLETS);}}), - LocationAccess(GC_MEDIGORON_GOSSIP_STONE, {[]{return CanBlastOrSmash || GoronBracelet;}}), + LocationAccess(RC_GC_MAZE_LEFT_CHEST, {[]{return CanUse(RG_MEGATON_HAMMER) || CanUse(RG_SILVER_GAUNTLETS) || (LogicGoronCityLeftMost && HasExplosives && CanUse(RG_HOVER_BOOTS));}}), + LocationAccess(RC_GC_MAZE_CENTER_CHEST, {[]{return CanBlastOrSmash || CanUse(RG_SILVER_GAUNTLETS);}}), + LocationAccess(RC_GC_MAZE_RIGHT_CHEST, {[]{return CanBlastOrSmash || CanUse(RG_SILVER_GAUNTLETS);}}), + LocationAccess(RC_GC_POT_FREESTANDING_POH, {[]{return IsChild && GoronCityChildFire && (Bombs || (GoronBracelet && LogicGoronCityPotWithStrength) || (HasBombchus && LogicGoronCityPot));}}), + LocationAccess(RC_GC_ROLLING_GORON_AS_CHILD, {[]{return IsChild && (HasExplosives || (GoronBracelet && LogicChildRollingWithStrength));}}), + LocationAccess(RC_GC_ROLLING_GORON_AS_ADULT, {[]{return StopGCRollingGoronAsAdult;}}), + LocationAccess(RC_GC_GS_BOULDER_MAZE, {[]{return IsChild && CanBlastOrSmash;}}), + LocationAccess(RC_GC_GS_CENTER_PLATFORM, {[]{return IsAdult;}}), + LocationAccess(RC_GC_MEDIGORON, {[]{return IsAdult && AdultsWallet && (CanBlastOrSmash || GoronBracelet);}}), + LocationAccess(RC_GC_MAZE_GOSSIP_STONE, {[]{return CanBlastOrSmash || CanUse(RG_SILVER_GAUNTLETS);}}), + LocationAccess(RC_GC_MEDIGORON_GOSSIP_STONE, {[]{return CanBlastOrSmash || GoronBracelet;}}), }, { //Exits - Entrance(DEATH_MOUNTAIN_TRAIL, {[]{return true;}}), - Entrance(GC_WOODS_WARP, {[]{return GCWoodsWarpOpen;}}), - Entrance(GC_SHOP, {[]{return (IsAdult && StopGCRollingGoronAsAdult) || (IsChild && (CanBlastOrSmash || GoronBracelet || GoronCityChildFire || CanUse(BOW)));}}), - Entrance(GC_DARUNIAS_CHAMBER, {[]{return (IsAdult && StopGCRollingGoronAsAdult) || GCDaruniasDoorOpenChild;}}), - Entrance(GC_GROTTO_PLATFORM, {[]{return IsAdult && ((CanPlay(SongOfTime) && ((EffectiveHealth > 2) || CanUse(GORON_TUNIC) || CanUse(LONGSHOT) || CanUse(NAYRUS_LOVE))) || (EffectiveHealth > 1 && CanUse(GORON_TUNIC) && CanUse(HOOKSHOT)) || (CanUse(NAYRUS_LOVE) && CanUse(HOOKSHOT)) || (EffectiveHealth > 2 && CanUse(HOOKSHOT) && LogicGoronCityGrotto));}}), + Entrance(RR_DEATH_MOUNTAIN_TRAIL, {[]{return true;}}), + Entrance(RR_GC_WOODS_WARP, {[]{return GCWoodsWarpOpen;}}), + Entrance(RR_GC_SHOP, {[]{return (IsAdult && StopGCRollingGoronAsAdult) || (IsChild && (CanBlastOrSmash || GoronBracelet || GoronCityChildFire || CanUse(RG_FAIRY_BOW)));}}), + Entrance(RR_GC_DARUNIAS_CHAMBER, {[]{return (IsAdult && StopGCRollingGoronAsAdult) || GCDaruniasDoorOpenChild;}}), + Entrance(RR_GC_GROTTO_PLATFORM, {[]{return IsAdult && ((CanPlay(SongOfTime) && ((EffectiveHealth > 2) || CanUse(RG_GORON_TUNIC) || CanUse(RG_LONGSHOT) || CanUse(RG_NAYRUS_LOVE))) || (EffectiveHealth > 1 && CanUse(RG_GORON_TUNIC) && CanUse(RG_HOOKSHOT)) || (CanUse(RG_NAYRUS_LOVE) && CanUse(RG_HOOKSHOT)) || (EffectiveHealth > 2 && CanUse(RG_HOOKSHOT) && LogicGoronCityGrotto));}}), }); - areaTable[GC_WOODS_WARP] = Area("GC Woods Warp", "Goron City", NONE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GC_WOODS_WARP] = Area("GC Woods Warp", "Goron City", RHT_NONE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&GCWoodsWarpOpen, {[]{return GCWoodsWarpOpen || (CanBlastOrSmash || CanUse(DINS_FIRE));}}), + EventAccess(&GCWoodsWarpOpen, {[]{return GCWoodsWarpOpen || (CanBlastOrSmash || CanUse(RG_DINS_FIRE));}}), }, {}, { //Exits - Entrance(GORON_CITY, {[]{return CanLeaveForest && GCWoodsWarpOpen;}}), - Entrance(THE_LOST_WOODS, {[]{return true;}}), + Entrance(RR_GORON_CITY, {[]{return CanLeaveForest && GCWoodsWarpOpen;}}), + Entrance(RR_THE_LOST_WOODS, {[]{return true;}}), }); - areaTable[GC_DARUNIAS_CHAMBER] = Area("GC Darunias Chamber", "Goron City", GORON_CITY, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GC_DARUNIAS_CHAMBER] = Area("GC Darunias Chamber", "Goron City", RHT_GORON_CITY, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&GoronCityChildFire, {[]{return GoronCityChildFire || (IsChild && CanUse(STICKS));}}), + EventAccess(&GoronCityChildFire, {[]{return GoronCityChildFire || (IsChild && CanUse(RG_STICKS));}}), }, { //Locations - LocationAccess(GC_DARUNIAS_JOY, {[]{return IsChild && CanPlay(SariasSong);}}), + LocationAccess(RC_GC_DARUNIAS_JOY, {[]{return IsChild && CanPlay(SariasSong);}}), }, { //Exits - Entrance(GORON_CITY, {[]{return true;}}), - Entrance(DMC_LOWER_LOCAL, {[]{return IsAdult;}}), + Entrance(RR_GORON_CITY, {[]{return true;}}), + Entrance(RR_DMC_LOWER_LOCAL, {[]{return IsAdult;}}), }); - areaTable[GC_GROTTO_PLATFORM] = Area("GC Grotto Platform", "Goron City", GORON_CITY, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GC_GROTTO_PLATFORM] = Area("GC Grotto Platform", "Goron City", RHT_GORON_CITY, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(GC_GROTTO, {[]{return true;}}), - Entrance(GORON_CITY, {[]{return EffectiveHealth > 2 || CanUse(GORON_TUNIC) || CanUse(NAYRUS_LOVE) || ((IsChild || CanPlay(SongOfTime)) && CanUse(LONGSHOT));}}), + Entrance(RR_GC_GROTTO, {[]{return true;}}), + Entrance(RR_GORON_CITY, {[]{return EffectiveHealth > 2 || CanUse(RG_GORON_TUNIC) || CanUse(RG_NAYRUS_LOVE) || ((IsChild || CanPlay(SongOfTime)) && CanUse(RG_LONGSHOT));}}), }); - areaTable[GC_SHOP] = Area("GC Shop", "GC Shop", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GC_SHOP] = Area("GC Shop", "GC Shop", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(GC_SHOP_ITEM_1, {[]{return true;}}), - LocationAccess(GC_SHOP_ITEM_2, {[]{return true;}}), - LocationAccess(GC_SHOP_ITEM_3, {[]{return true;}}), - LocationAccess(GC_SHOP_ITEM_4, {[]{return true;}}), - LocationAccess(GC_SHOP_ITEM_5, {[]{return true;}}), - LocationAccess(GC_SHOP_ITEM_6, {[]{return true;}}), - LocationAccess(GC_SHOP_ITEM_7, {[]{return true;}}), - LocationAccess(GC_SHOP_ITEM_8, {[]{return true;}}), + LocationAccess(RC_GC_SHOP_ITEM_1, {[]{return true;}}), + LocationAccess(RC_GC_SHOP_ITEM_2, {[]{return true;}}), + LocationAccess(RC_GC_SHOP_ITEM_3, {[]{return true;}}), + LocationAccess(RC_GC_SHOP_ITEM_4, {[]{return true;}}), + LocationAccess(RC_GC_SHOP_ITEM_5, {[]{return true;}}), + LocationAccess(RC_GC_SHOP_ITEM_6, {[]{return true;}}), + LocationAccess(RC_GC_SHOP_ITEM_7, {[]{return true;}}), + LocationAccess(RC_GC_SHOP_ITEM_8, {[]{return true;}}), }, { //Exits - Entrance(GORON_CITY, {[]{return true;}}), + Entrance(RR_GORON_CITY, {[]{return true;}}), }); - areaTable[GC_GROTTO] = Area("GC Grotto", "GC Grotto", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GC_GROTTO] = Area("GC Grotto", "GC Grotto", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(GC_DEKU_SCRUB_GROTTO_LEFT, {[]{return CanStunDeku;}}), - LocationAccess(GC_DEKU_SCRUB_GROTTO_RIGHT, {[]{return CanStunDeku;}}), - LocationAccess(GC_DEKU_SCRUB_GROTTO_CENTER, {[]{return CanStunDeku;}}), + LocationAccess(RC_GC_DEKU_SCRUB_GROTTO_LEFT, {[]{return CanStunDeku;}}), + LocationAccess(RC_GC_DEKU_SCRUB_GROTTO_RIGHT, {[]{return CanStunDeku;}}), + LocationAccess(RC_GC_DEKU_SCRUB_GROTTO_CENTER, {[]{return CanStunDeku;}}), }, { //Exits - Entrance(GC_GROTTO_PLATFORM, {[]{return true;}}), + Entrance(RR_GC_GROTTO_PLATFORM, {[]{return true;}}), }); - areaTable[DMC_UPPER_NEARBY] = Area("DMC Upper Nearby", "Death Mountain Crater", DEATH_MOUNTAIN_CRATER, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DMC_UPPER_NEARBY] = Area("DMC Upper Nearby", "Death Mountain Crater", RHT_DEATH_MOUNTAIN_CRATER, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(DMC_UPPER_LOCAL, {[]{return FireTimer >= 48;}}), - Entrance(DEATH_MOUNTAIN_SUMMIT, {[]{return true;}}), - Entrance(DMC_UPPER_GROTTO, {[]{return Here(DMC_UPPER_NEARBY, []{return CanBlastOrSmash && (FireTimer >= 8 || Hearts >= 3);});}}) + Entrance(RR_DMC_UPPER_LOCAL, {[]{return FireTimer >= 48;}}), + Entrance(RR_DEATH_MOUNTAIN_SUMMIT, {[]{return true;}}), + Entrance(RR_DMC_UPPER_GROTTO, {[]{return Here(RR_DMC_UPPER_NEARBY, []{return CanBlastOrSmash && (FireTimer >= 8 || Hearts >= 3);});}}) }); - areaTable[DMC_UPPER_LOCAL] = Area("DMC Upper Local", "Death Mountain Crater", DEATH_MOUNTAIN_CRATER, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DMC_UPPER_LOCAL] = Area("DMC Upper Local", "Death Mountain Crater", RHT_DEATH_MOUNTAIN_CRATER, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&GossipStoneFairy, {[]{return GossipStoneFairy || (HasExplosives && CanSummonGossipFairyWithoutSuns && (FireTimer >= 16 || Hearts >= 3));}}), }, { //Locations - LocationAccess(DMC_WALL_FREESTANDING_POH, {[]{return FireTimer >= 16 || Hearts >= 3;}}), - LocationAccess(DMC_GS_CRATE, {[]{return (FireTimer >= 8 || Hearts >= 3) && IsChild && CanChildAttack;}}), - LocationAccess(DMC_GOSSIP_STONE, {[]{return HasExplosives && (FireTimer >= 16 || Hearts >= 3);}}), + LocationAccess(RC_DMC_WALL_FREESTANDING_POH, {[]{return FireTimer >= 16 || Hearts >= 3;}}), + LocationAccess(RC_DMC_GS_CRATE, {[]{return (FireTimer >= 8 || Hearts >= 3) && IsChild && CanChildAttack;}}), + LocationAccess(RC_DMC_GOSSIP_STONE, {[]{return HasExplosives && (FireTimer >= 16 || Hearts >= 3);}}), }, { //Exits - Entrance(DMC_UPPER_NEARBY, {[]{return true;}}), - Entrance(DMC_LADDER_AREA_NEARBY, {[]{return FireTimer >= 16 || Hearts >= 3;}}), - Entrance(DMC_CENTRAL_NEARBY, {[]{return IsAdult && CanUse(GORON_TUNIC) && CanUse(DISTANT_SCARECROW) && ((EffectiveHealth > 2) || (Fairy && ShuffleDungeonEntrances.IsNot(SHUFFLEDUNGEONS_OFF)) || CanUse(NAYRUS_LOVE));}}), - Entrance(DMC_LOWER_NEARBY, {[]{return false;}}), + Entrance(RR_DMC_UPPER_NEARBY, {[]{return true;}}), + Entrance(RR_DMC_LADDER_AREA_NEARBY, {[]{return FireTimer >= 16 || Hearts >= 3;}}), + Entrance(RR_DMC_CENTRAL_NEARBY, {[]{return IsAdult && CanUse(RG_GORON_TUNIC) && CanUse(RG_DISTANT_SCARECROW) && ((EffectiveHealth > 2) || (Fairy && ShuffleDungeonEntrances.IsNot(SHUFFLEDUNGEONS_OFF)) || CanUse(RG_NAYRUS_LOVE));}}), + Entrance(RR_DMC_LOWER_NEARBY, {[]{return false;}}), }); - areaTable[DMC_LADDER_AREA_NEARBY] = Area("DMC Ladder Area Nearby", "Death Mountain Crater", DEATH_MOUNTAIN_CRATER, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DMC_LADDER_AREA_NEARBY] = Area("DMC Ladder Area Nearby", "Death Mountain Crater", RHT_DEATH_MOUNTAIN_CRATER, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(DMC_DEKU_SCRUB, {[]{return IsChild && CanStunDeku;}}), + LocationAccess(RC_DMC_DEKU_SCRUB, {[]{return IsChild && CanStunDeku;}}), }, { //Exits - Entrance(DMC_UPPER_NEARBY, {[]{return Hearts >= 3;}}), - Entrance(DMC_LOWER_NEARBY, {[]{return Hearts >= 3 && (CanUse(HOVER_BOOTS) || (LogicCraterBoulderJS && IsAdult && CanUse(MEGATON_HAMMER)) || (LogicCraterBoulderSkip && IsAdult));}}), + Entrance(RR_DMC_UPPER_NEARBY, {[]{return Hearts >= 3;}}), + Entrance(RR_DMC_LOWER_NEARBY, {[]{return Hearts >= 3 && (CanUse(RG_HOVER_BOOTS) || (LogicCraterBoulderJS && IsAdult && CanUse(RG_MEGATON_HAMMER)) || (LogicCraterBoulderSkip && IsAdult));}}), }); - areaTable[DMC_LOWER_NEARBY] = Area("DMC Lower Nearby", "Death Mountain Crater", DEATH_MOUNTAIN_CRATER, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DMC_LOWER_NEARBY] = Area("DMC Lower Nearby", "Death Mountain Crater", RHT_DEATH_MOUNTAIN_CRATER, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(DMC_LOWER_LOCAL, {[]{return FireTimer >= 48;}}), - Entrance(GC_DARUNIAS_CHAMBER, {[]{return true;}}), - Entrance(DMC_GREAT_FAIRY_FOUNTAIN, {[]{return CanUse(MEGATON_HAMMER);}}), - Entrance(DMC_HAMMER_GROTTO, {[]{return IsAdult && CanUse(MEGATON_HAMMER);}}), + Entrance(RR_DMC_LOWER_LOCAL, {[]{return FireTimer >= 48;}}), + Entrance(RR_GC_DARUNIAS_CHAMBER, {[]{return true;}}), + Entrance(RR_DMC_GREAT_FAIRY_FOUNTAIN, {[]{return CanUse(RG_MEGATON_HAMMER);}}), + Entrance(RR_DMC_HAMMER_GROTTO, {[]{return IsAdult && CanUse(RG_MEGATON_HAMMER);}}), }); - areaTable[DMC_LOWER_LOCAL] = Area("DMC Lower Local", "Death Mountain Crater", DEATH_MOUNTAIN_CRATER, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DMC_LOWER_LOCAL] = Area("DMC Lower Local", "Death Mountain Crater", RHT_DEATH_MOUNTAIN_CRATER, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(DMC_LOWER_NEARBY, {[]{return true;}}), - Entrance(DMC_LADDER_AREA_NEARBY, {[]{return FireTimer >= 8 || Hearts >= 3;}}), - Entrance(DMC_CENTRAL_NEARBY, {[]{return (CanUse(HOVER_BOOTS) || CanUse(HOOKSHOT)) && (FireTimer >= 8 || Hearts >= 3);}}), - Entrance(DMC_CENTRAL_LOCAL, {[]{return (CanUse(HOVER_BOOTS) || CanUse(HOOKSHOT) || (IsAdult && CanShield && LogicCraterBoleroJump)) && FireTimer >= 24;}}), + Entrance(RR_DMC_LOWER_NEARBY, {[]{return true;}}), + Entrance(RR_DMC_LADDER_AREA_NEARBY, {[]{return FireTimer >= 8 || Hearts >= 3;}}), + Entrance(RR_DMC_CENTRAL_NEARBY, {[]{return (CanUse(RG_HOVER_BOOTS) || CanUse(RG_HOOKSHOT)) && (FireTimer >= 8 || Hearts >= 3);}}), + Entrance(RR_DMC_CENTRAL_LOCAL, {[]{return (CanUse(RG_HOVER_BOOTS) || CanUse(RG_HOOKSHOT) || (IsAdult && CanShield && LogicCraterBoleroJump)) && FireTimer >= 24;}}), }); - areaTable[DMC_CENTRAL_NEARBY] = Area("DMC Central Nearby", "Death Mountain Crater", DEATH_MOUNTAIN_CRATER, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DMC_CENTRAL_NEARBY] = Area("DMC Central Nearby", "Death Mountain Crater", RHT_DEATH_MOUNTAIN_CRATER, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(DMC_VOLCANO_FREESTANDING_POH, {[]{return IsAdult && Hearts >= 3 && (CanPlantBean(DMC_CENTRAL_LOCAL) || (LogicCraterBeanPoHWithHovers && HoverBoots));}}), - LocationAccess(SHEIK_IN_CRATER, {[]{return IsAdult && (FireTimer >= 8 || Hearts >= 3);}}), + LocationAccess(RC_DMC_VOLCANO_FREESTANDING_POH, {[]{return IsAdult && Hearts >= 3 && (CanPlantBean(RR_DMC_CENTRAL_LOCAL) || (LogicCraterBeanPoHWithHovers && HoverBoots));}}), + LocationAccess(RC_SHEIK_IN_CRATER, {[]{return IsAdult && (FireTimer >= 8 || Hearts >= 3);}}), }, { //Exits - Entrance(DMC_CENTRAL_LOCAL, {[]{return FireTimer >= 48;}}), + Entrance(RR_DMC_CENTRAL_LOCAL, {[]{return FireTimer >= 48;}}), }); - areaTable[DMC_CENTRAL_LOCAL] = Area("DMC Central Local", "Death Mountain Crater", DEATH_MOUNTAIN_CRATER, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DMC_CENTRAL_LOCAL] = Area("DMC Central Local", "Death Mountain Crater", RHT_DEATH_MOUNTAIN_CRATER, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&BeanPlantFairy, {[]{return BeanPlantFairy || (CanPlantBean(DMC_CENTRAL_LOCAL) && CanPlay(SongOfStorms));}}), + EventAccess(&BeanPlantFairy, {[]{return BeanPlantFairy || (CanPlantBean(RR_DMC_CENTRAL_LOCAL) && CanPlay(SongOfStorms));}}), }, { //Locations - LocationAccess(DMC_GS_BEAN_PATCH, {[]{return (FireTimer >= 8 || Hearts >= 3) && CanPlantBugs && CanChildAttack;}}), + LocationAccess(RC_DMC_GS_BEAN_PATCH, {[]{return (FireTimer >= 8 || Hearts >= 3) && CanPlantBugs && CanChildAttack;}}), }, { //Exits - Entrance(DMC_CENTRAL_NEARBY, {[]{return true;}}), - Entrance(DMC_LOWER_NEARBY, {[]{return (IsAdult && CanPlantBean(DMC_CENTRAL_LOCAL)) || CanUse(HOVER_BOOTS) || CanUse(HOOKSHOT);}}), - Entrance(DMC_UPPER_NEARBY, {[]{return IsAdult && CanPlantBean(DMC_CENTRAL_LOCAL);}}), - Entrance(FIRE_TEMPLE_ENTRYWAY, {[]{return (IsChild && Hearts >= 3 && ShuffleDungeonEntrances.IsNot(SHUFFLEDUNGEONS_OFF)) || (IsAdult && FireTimer >= 24);}}), + Entrance(RR_DMC_CENTRAL_NEARBY, {[]{return true;}}), + Entrance(RR_DMC_LOWER_NEARBY, {[]{return (IsAdult && CanPlantBean(RR_DMC_CENTRAL_LOCAL)) || CanUse(RG_HOVER_BOOTS) || CanUse(RG_HOOKSHOT);}}), + Entrance(RR_DMC_UPPER_NEARBY, {[]{return IsAdult && CanPlantBean(RR_DMC_CENTRAL_LOCAL);}}), + Entrance(RR_FIRE_TEMPLE_ENTRYWAY, {[]{return (IsChild && Hearts >= 3 && ShuffleDungeonEntrances.IsNot(SHUFFLEDUNGEONS_OFF)) || (IsAdult && FireTimer >= 24);}}), }); - areaTable[DMC_GREAT_FAIRY_FOUNTAIN] = Area("DMC Great Fairy Fountain", "DMC Great Fairy Fountain", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DMC_GREAT_FAIRY_FOUNTAIN] = Area("DMC Great Fairy Fountain", "DMC Great Fairy Fountain", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(DMC_GREAT_FAIRY_REWARD, {[]{return CanPlay(ZeldasLullaby);}}), + LocationAccess(RC_DMC_GREAT_FAIRY_REWARD, {[]{return CanPlay(ZeldasLullaby);}}), }, { //Exits - Entrance(DMC_LOWER_LOCAL, {[]{return true;}}), + Entrance(RR_DMC_LOWER_LOCAL, {[]{return true;}}), }); - areaTable[DMC_UPPER_GROTTO] = Area("DMC Upper Grotto", "DMC Upper Grotto", NONE, NO_DAY_NIGHT_CYCLE, grottoEvents, { + areaTable[RR_DMC_UPPER_GROTTO] = Area("DMC Upper Grotto", "DMC Upper Grotto", RHT_NONE, NO_DAY_NIGHT_CYCLE, grottoEvents, { //Locations - LocationAccess(DMC_UPPER_GROTTO_CHEST, {[]{return true;}}), - LocationAccess(DMC_UPPER_GROTTO_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_DMC_UPPER_GROTTO_CHEST, {[]{return true;}}), + LocationAccess(RC_DMC_UPPER_GROTTO_GOSSIP_STONE, {[]{return true;}}), }, { //Exits - Entrance(DMC_UPPER_LOCAL, {[]{return true;}}), + Entrance(RR_DMC_UPPER_LOCAL, {[]{return true;}}), }); - areaTable[DMC_HAMMER_GROTTO] = Area("DMC Hammer Grotto", "DMC Hammer Grotto", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DMC_HAMMER_GROTTO] = Area("DMC Hammer Grotto", "DMC Hammer Grotto", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(DMC_DEKU_SCRUB_GROTTO_LEFT, {[]{return CanStunDeku;}}), - LocationAccess(DMC_DEKU_SCRUB_GROTTO_RIGHT, {[]{return CanStunDeku;}}), - LocationAccess(DMC_DEKU_SCRUB_GROTTO_CENTER, {[]{return CanStunDeku;}}), + LocationAccess(RC_DMC_DEKU_SCRUB_GROTTO_LEFT, {[]{return CanStunDeku;}}), + LocationAccess(RC_DMC_DEKU_SCRUB_GROTTO_RIGHT, {[]{return CanStunDeku;}}), + LocationAccess(RC_DMC_DEKU_SCRUB_GROTTO_CENTER, {[]{return CanStunDeku;}}), }, { //Exits - Entrance(DMC_LOWER_LOCAL, {[]{return true;}}), + Entrance(RR_DMC_LOWER_LOCAL, {[]{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 c39676a82..63ae09e3f 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 @@ -10,140 +10,140 @@ void AreaTable_Init_DekuTree() { /*-------------------------- | VANILLA/MQ DECIDER | ---------------------------*/ - areaTable[DEKU_TREE_ENTRYWAY] = Area("Deku Tree Entryway", "Deku Tree", DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DEKU_TREE_ENTRYWAY] = Area("Deku Tree Entryway", "Deku Tree", RHT_DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(DEKU_TREE_LOBBY, {[]{return Dungeon::DekuTree.IsVanilla();}}), - Entrance(DEKU_TREE_MQ_LOBBY, {[]{return Dungeon::DekuTree.IsMQ();}}), - Entrance(KF_OUTSIDE_DEKU_TREE, {[]{return true;}}), + Entrance(RR_DEKU_TREE_LOBBY, {[]{return Dungeon::DekuTree.IsVanilla();}}), + Entrance(RR_DEKU_TREE_MQ_LOBBY, {[]{return Dungeon::DekuTree.IsMQ();}}), + Entrance(RR_KF_OUTSIDE_DEKU_TREE, {[]{return true;}}), }); /*-------------------------- | VANILLA DUNGEON | ---------------------------*/ if (Dungeon::DekuTree.IsVanilla()) { - areaTable[DEKU_TREE_LOBBY] = Area("Deku Tree Lobby", "Deku Tree", DEKU_TREE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_LOBBY] = Area("Deku Tree Lobby", "Deku Tree", RHT_DEKU_TREE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (IsAdult || KokiriSword || Boomerang);}}), - EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (IsAdult || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(DINS_FIRE));}}), + EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (IsAdult || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(RG_DINS_FIRE));}}), }, { //Locations - LocationAccess(DEKU_TREE_MAP_CHEST, {[]{return true;}}), + LocationAccess(RC_DEKU_TREE_MAP_CHEST, {[]{return true;}}), }, { //Exits - Entrance(DEKU_TREE_ENTRYWAY, {[]{return true;}}), - Entrance(DEKU_TREE_2F_MIDDLE_ROOM, {[]{return true;}}), - Entrance(DEKU_TREE_COMPASS_ROOM, {[]{return true;}}), - Entrance(DEKU_TREE_BASEMENT_LOWER, {[]{return Here(DEKU_TREE_LOBBY, []{return IsAdult || CanChildAttack || Nuts;});}}), - Entrance(DEKU_TREE_OUTSIDE_BOSS_ROOM, {[]{return false;}}), - Entrance(DEKU_TREE_BOSS_ENTRYWAY, {[]{return false;}}), + Entrance(RR_DEKU_TREE_ENTRYWAY, {[]{return true;}}), + Entrance(RR_DEKU_TREE_2F_MIDDLE_ROOM, {[]{return true;}}), + Entrance(RR_DEKU_TREE_COMPASS_ROOM, {[]{return true;}}), + Entrance(RR_DEKU_TREE_BASEMENT_LOWER, {[]{return Here(RR_DEKU_TREE_LOBBY, []{return IsAdult || CanChildAttack || Nuts;});}}), + Entrance(RR_DEKU_TREE_OUTSIDE_BOSS_ROOM, {[]{return false;}}), + Entrance(RR_DEKU_TREE_BOSS_ENTRYWAY, {[]{return false;}}), }); - areaTable[DEKU_TREE_2F_MIDDLE_ROOM] = Area("Deku Tree 2F Middle Room", "Deku Tree", DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DEKU_TREE_2F_MIDDLE_ROOM] = Area("Deku Tree 2F Middle Room", "Deku Tree", RHT_DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(DEKU_TREE_LOBBY, {[]{return Here(DEKU_TREE_2F_MIDDLE_ROOM, []{return HasShield || CanUse(MEGATON_HAMMER);});}}), - Entrance(DEKU_TREE_SLINGSHOT_ROOM,{[]{return Here(DEKU_TREE_2F_MIDDLE_ROOM, []{return HasShield || CanUse(MEGATON_HAMMER);});}}), + Entrance(RR_DEKU_TREE_LOBBY, {[]{return Here(RR_DEKU_TREE_2F_MIDDLE_ROOM, []{return HasShield || CanUse(RG_MEGATON_HAMMER);});}}), + Entrance(RR_DEKU_TREE_SLINGSHOT_ROOM,{[]{return Here(RR_DEKU_TREE_2F_MIDDLE_ROOM, []{return HasShield || CanUse(RG_MEGATON_HAMMER);});}}), }); - areaTable[DEKU_TREE_SLINGSHOT_ROOM] = Area("Deku Tree Slingshot Room", "Deku Tree", DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DEKU_TREE_SLINGSHOT_ROOM] = Area("Deku Tree Slingshot Room", "Deku Tree", RHT_DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(DEKU_TREE_SLINGSHOT_CHEST, {[]{return true;}}), - LocationAccess(DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, {[]{return true;}}), + LocationAccess(RC_DEKU_TREE_SLINGSHOT_CHEST, {[]{return true;}}), + LocationAccess(RC_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, {[]{return true;}}), }, { //Exits - Entrance(DEKU_TREE_2F_MIDDLE_ROOM, {[]{return CanUse(SLINGSHOT) || CanUse(HOVER_BOOTS);}}), + Entrance(RR_DEKU_TREE_2F_MIDDLE_ROOM, {[]{return CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_HOVER_BOOTS);}}), }); - areaTable[DEKU_TREE_COMPASS_ROOM] = Area("Deku Tree Compass Room", "Deku Tree", DEKU_TREE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_COMPASS_ROOM] = Area("Deku Tree Compass Room", "Deku Tree", RHT_DEKU_TREE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (IsAdult || KokiriSword || Boomerang);}}), - EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (IsAdult || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(DINS_FIRE));}}), + EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (IsAdult || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(RG_DINS_FIRE));}}), }, { //Locations - LocationAccess(DEKU_TREE_COMPASS_CHEST, {[]{return true;}}), - LocationAccess(DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, {[]{return true;}}), - LocationAccess(DEKU_TREE_GS_COMPASS_ROOM, {[]{return IsAdult || CanChildAttack;}}), + LocationAccess(RC_DEKU_TREE_COMPASS_CHEST, {[]{return true;}}), + LocationAccess(RC_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, {[]{return true;}}), + LocationAccess(RC_DEKU_TREE_GS_COMPASS_ROOM, {[]{return IsAdult || CanChildAttack;}}), }, { //Exits - Entrance(DEKU_TREE_LOBBY, {[]{return HasFireSourceWithTorch || CanUse(BOW);}}), - Entrance(DEKU_TREE_BOSS_ENTRYWAY, {[]{return false;}}), + Entrance(RR_DEKU_TREE_LOBBY, {[]{return HasFireSourceWithTorch || CanUse(RG_FAIRY_BOW);}}), + Entrance(RR_DEKU_TREE_BOSS_ENTRYWAY, {[]{return false;}}), }); - areaTable[DEKU_TREE_BASEMENT_LOWER] = Area("Deku Tree Basement Lower", "Deku Tree", DEKU_TREE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_BASEMENT_LOWER] = Area("Deku Tree Basement Lower", "Deku Tree", RHT_DEKU_TREE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (IsAdult || KokiriSword || Boomerang);}}), - EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (IsAdult || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(DINS_FIRE));}, - /*Glitched*/[]{return CanUse(MEGATON_HAMMER);}}), + EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (IsAdult || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(RG_DINS_FIRE));}, + /*Glitched*/[]{return CanUse(RG_MEGATON_HAMMER);}}), }, { //Locations - LocationAccess(DEKU_TREE_BASEMENT_CHEST, {[]{return true;}}), - LocationAccess(DEKU_TREE_GS_BASEMENT_GATE, {[]{return IsAdult || CanChildAttack;}}), - LocationAccess(DEKU_TREE_GS_BASEMENT_VINES, {[]{return CanUseProjectile || CanUse(DINS_FIRE) || (LogicDekuBasementGS && (IsAdult || Sticks || KokiriSword));}}), + LocationAccess(RC_DEKU_TREE_BASEMENT_CHEST, {[]{return true;}}), + LocationAccess(RC_DEKU_TREE_GS_BASEMENT_GATE, {[]{return IsAdult || CanChildAttack;}}), + LocationAccess(RC_DEKU_TREE_GS_BASEMENT_VINES, {[]{return CanUseProjectile || CanUse(RG_DINS_FIRE) || (LogicDekuBasementGS && (IsAdult || Sticks || KokiriSword));}}), }, { //Exits - Entrance(DEKU_TREE_LOBBY, {[]{return true;}}), - Entrance(DEKU_TREE_BASEMENT_SCRUB_ROOM, {[]{return Here(DEKU_TREE_BASEMENT_LOWER, []{return HasFireSourceWithTorch || CanUse(BOW);});}}), - Entrance(DEKU_TREE_BASEMENT_UPPER, {[]{return IsAdult || LogicDekuB1Skip || HasAccessTo(DEKU_TREE_BASEMENT_UPPER);}}), - Entrance(DEKU_TREE_OUTSIDE_BOSS_ROOM, {[]{return false;}}), + Entrance(RR_DEKU_TREE_LOBBY, {[]{return true;}}), + Entrance(RR_DEKU_TREE_BASEMENT_SCRUB_ROOM, {[]{return Here(RR_DEKU_TREE_BASEMENT_LOWER, []{return HasFireSourceWithTorch || CanUse(RG_FAIRY_BOW);});}}), + Entrance(RR_DEKU_TREE_BASEMENT_UPPER, {[]{return IsAdult || LogicDekuB1Skip || HasAccessTo(RR_DEKU_TREE_BASEMENT_UPPER);}}), + Entrance(RR_DEKU_TREE_OUTSIDE_BOSS_ROOM, {[]{return false;}}), }); - areaTable[DEKU_TREE_BASEMENT_SCRUB_ROOM] = Area("Deku Tree Basement Scrub Room", "Deku Tree", DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DEKU_TREE_BASEMENT_SCRUB_ROOM] = Area("Deku Tree Basement Scrub Room", "Deku Tree", RHT_DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(DEKU_TREE_BASEMENT_LOWER, {[]{return true;}}), - Entrance(DEKU_TREE_BASEMENT_WATER_ROOM, {[]{return Here(DEKU_TREE_BASEMENT_SCRUB_ROOM, []{return CanUse(SLINGSHOT) || CanUse(BOW);});}}), + Entrance(RR_DEKU_TREE_BASEMENT_LOWER, {[]{return true;}}), + Entrance(RR_DEKU_TREE_BASEMENT_WATER_ROOM, {[]{return Here(RR_DEKU_TREE_BASEMENT_SCRUB_ROOM, []{return CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW);});}}), }); - areaTable[DEKU_TREE_BASEMENT_WATER_ROOM] = Area("Deku Tree Basement Water Room", "Deku Tree", DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DEKU_TREE_BASEMENT_WATER_ROOM] = Area("Deku Tree Basement Water Room", "Deku Tree", RHT_DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(DEKU_TREE_BASEMENT_SCRUB_ROOM, {[]{return true;}}), - Entrance(DEKU_TREE_BASEMENT_TORCH_ROOM, {[]{return true;}}), + Entrance(RR_DEKU_TREE_BASEMENT_SCRUB_ROOM, {[]{return true;}}), + Entrance(RR_DEKU_TREE_BASEMENT_TORCH_ROOM, {[]{return true;}}), }); - areaTable[DEKU_TREE_BASEMENT_TORCH_ROOM] = Area("Deku Tree Basement Torch Room", "Deku Tree", DEKU_TREE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_BASEMENT_TORCH_ROOM] = Area("Deku Tree Basement Torch Room", "Deku Tree", RHT_DEKU_TREE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (IsAdult || KokiriSword || Boomerang);}}), - EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (IsAdult || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(DINS_FIRE));}}), + EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (IsAdult || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(RG_DINS_FIRE));}}), }, {}, { //Exits - Entrance(DEKU_TREE_BASEMENT_WATER_ROOM, {[]{return true;}}), - Entrance(DEKU_TREE_BASEMENT_BACK_LOBBY, {[]{return Here(DEKU_TREE_BASEMENT_TORCH_ROOM, []{return HasFireSourceWithTorch || CanUse(BOW);});}}), + Entrance(RR_DEKU_TREE_BASEMENT_WATER_ROOM, {[]{return true;}}), + Entrance(RR_DEKU_TREE_BASEMENT_BACK_LOBBY, {[]{return Here(RR_DEKU_TREE_BASEMENT_TORCH_ROOM, []{return HasFireSourceWithTorch || CanUse(RG_FAIRY_BOW);});}}), }); - areaTable[DEKU_TREE_BASEMENT_BACK_LOBBY] = Area("Deku Tree Basement Back Lobby", "Deku Tree", DEKU_TREE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_BASEMENT_BACK_LOBBY] = Area("Deku Tree Basement Back Lobby", "Deku Tree", RHT_DEKU_TREE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (IsAdult || KokiriSword || Boomerang);}}), - EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (Here(DEKU_TREE_BASEMENT_BACK_LOBBY, []{return HasFireSourceWithTorch || CanUse(BOW);}) && - (IsAdult || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(DINS_FIRE)));}}), + EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (Here(RR_DEKU_TREE_BASEMENT_BACK_LOBBY, []{return HasFireSourceWithTorch || CanUse(RG_FAIRY_BOW);}) && + (IsAdult || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(RG_DINS_FIRE)));}}), }, {}, { //Exits - Entrance(DEKU_TREE_BASEMENT_TORCH_ROOM, {[]{return true;}}), - Entrance(DEKU_TREE_BASEMENT_BACK_ROOM, {[]{return Here(DEKU_TREE_BASEMENT_BACK_LOBBY, []{return HasFireSourceWithTorch || CanUse(Bow);}) && - Here(DEKU_TREE_BASEMENT_BACK_LOBBY, []{return CanBlastOrSmash;});}}), - Entrance(DEKU_TREE_BASEMENT_UPPER, {[]{return Here(DEKU_TREE_BASEMENT_BACK_LOBBY, []{return HasFireSourceWithTorch || CanUse(Bow);}) && IsChild;}}), + Entrance(RR_DEKU_TREE_BASEMENT_TORCH_ROOM, {[]{return true;}}), + Entrance(RR_DEKU_TREE_BASEMENT_BACK_ROOM, {[]{return Here(RR_DEKU_TREE_BASEMENT_BACK_LOBBY, []{return HasFireSourceWithTorch || CanUse(RG_FAIRY_BOW);}) && + Here(RR_DEKU_TREE_BASEMENT_BACK_LOBBY, []{return CanBlastOrSmash;});}}), + Entrance(RR_DEKU_TREE_BASEMENT_UPPER, {[]{return Here(RR_DEKU_TREE_BASEMENT_BACK_LOBBY, []{return HasFireSourceWithTorch || CanUse(RG_FAIRY_BOW);}) && IsChild;}}), }); - areaTable[DEKU_TREE_BASEMENT_BACK_ROOM] = Area("Deku Tree Basement Back Room", "Deku Tree", DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DEKU_TREE_BASEMENT_BACK_ROOM] = Area("Deku Tree Basement Back Room", "Deku Tree", RHT_DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(DEKU_TREE_GS_BASEMENT_BACK_ROOM, {[]{return HookshotOrBoomerang;}}), + LocationAccess(RC_DEKU_TREE_GS_BASEMENT_BACK_ROOM, {[]{return HookshotOrBoomerang;}}), }, { //Exits - Entrance(DEKU_TREE_BASEMENT_BACK_LOBBY, {[]{return true;}}), + Entrance(RR_DEKU_TREE_BASEMENT_BACK_LOBBY, {[]{return true;}}), }); - areaTable[DEKU_TREE_BASEMENT_UPPER] = Area("Deku Tree Basement Upper", "Deku Tree", DEKU_TREE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_BASEMENT_UPPER] = Area("Deku Tree Basement Upper", "Deku Tree", RHT_DEKU_TREE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (IsAdult || KokiriSword || Boomerang);}}), - EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (IsAdult || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(DINS_FIRE));}}), + EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (IsAdult || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(RG_DINS_FIRE));}}), }, {}, { //Exits - Entrance(DEKU_TREE_BASEMENT_LOWER, {[]{return true;}}), - Entrance(DEKU_TREE_BASEMENT_BACK_LOBBY, {[]{return IsChild;}}), - Entrance(DEKU_TREE_OUTSIDE_BOSS_ROOM, {[]{return Here(DEKU_TREE_BASEMENT_UPPER, []{return HasFireSourceWithTorch || (LogicDekuB1WebsWithBow && IsAdult && CanUse(BOW));});}}), + Entrance(RR_DEKU_TREE_BASEMENT_LOWER, {[]{return true;}}), + Entrance(RR_DEKU_TREE_BASEMENT_BACK_LOBBY, {[]{return IsChild;}}), + Entrance(RR_DEKU_TREE_OUTSIDE_BOSS_ROOM, {[]{return Here(RR_DEKU_TREE_BASEMENT_UPPER, []{return HasFireSourceWithTorch || (LogicDekuB1WebsWithBow && IsAdult && CanUse(RG_FAIRY_BOW));});}}), }); - areaTable[DEKU_TREE_OUTSIDE_BOSS_ROOM] = Area("Deku Tree Outside Boss Room", "Deku Tree", DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DEKU_TREE_OUTSIDE_BOSS_ROOM] = Area("Deku Tree Outside Boss Room", "Deku Tree", RHT_DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(DEKU_TREE_BASEMENT_UPPER, {[]{return true;}}), - Entrance(DEKU_TREE_BOSS_ENTRYWAY, {[]{return Here(DEKU_TREE_OUTSIDE_BOSS_ROOM, []{return HasShield;});}}), + Entrance(RR_DEKU_TREE_BASEMENT_UPPER, {[]{return true;}}), + Entrance(RR_DEKU_TREE_BOSS_ENTRYWAY, {[]{return Here(RR_DEKU_TREE_OUTSIDE_BOSS_ROOM, []{return HasShield;});}}), }); } @@ -151,120 +151,120 @@ void AreaTable_Init_DekuTree() { | MASTER QUEST DUNGEON | ---------------------------*/ if (Dungeon::DekuTree.IsMQ()) { - areaTable[DEKU_TREE_MQ_LOBBY] = Area("Deku Tree MQ Lobby", "Deku Tree", DEKU_TREE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_MQ_LOBBY] = Area("Deku Tree MQ Lobby", "Deku Tree", RHT_DEKU_TREE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (IsAdult || KokiriSword || Boomerang);}}), - EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (IsAdult || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(DINS_FIRE));}}), + EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (IsAdult || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(RG_DINS_FIRE));}}), }, { //Locations - LocationAccess(DEKU_TREE_MQ_MAP_CHEST, {[]{return true;}}), - LocationAccess(DEKU_TREE_MQ_SLINGSHOT_CHEST, {[]{return IsAdult || CanChildAttack;}}), - LocationAccess(DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, {[]{return HasFireSourceWithTorch || (IsAdult && CanUse(BOW));}}), - LocationAccess(DEKU_TREE_MQ_BASEMENT_CHEST, {[]{return HasFireSourceWithTorch || (IsAdult && CanUse(BOW));}}), - LocationAccess(DEKU_TREE_MQ_GS_LOBBY, {[]{return IsAdult || CanChildAttack;}}), + LocationAccess(RC_DEKU_TREE_MQ_MAP_CHEST, {[]{return true;}}), + LocationAccess(RC_DEKU_TREE_MQ_SLINGSHOT_CHEST, {[]{return IsAdult || CanChildAttack;}}), + LocationAccess(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, {[]{return HasFireSourceWithTorch || (IsAdult && CanUse(RG_FAIRY_BOW));}}), + LocationAccess(RC_DEKU_TREE_MQ_BASEMENT_CHEST, {[]{return HasFireSourceWithTorch || (IsAdult && CanUse(RG_FAIRY_BOW));}}), + LocationAccess(RC_DEKU_TREE_MQ_GS_LOBBY, {[]{return IsAdult || CanChildAttack;}}), }, { //Exits - Entrance(DEKU_TREE_ENTRYWAY, {[]{return true;}}), - Entrance(DEKU_TREE_MQ_COMPASS_ROOM, {[]{return Here(DEKU_TREE_MQ_LOBBY, []{return (IsChild && CanUse(SLINGSHOT)) || (IsAdult && CanUse(BOW));}) && - Here(DEKU_TREE_MQ_LOBBY, []{return HasFireSourceWithTorch || (IsAdult && CanUse(BOW));});}}), - Entrance(DEKU_TREE_MQ_BASEMENT_WATER_ROOM_FRONT, {[]{return Here(DEKU_TREE_MQ_LOBBY, []{return (IsChild && CanUse(SLINGSHOT)) || (IsAdult && CanUse(BOW));}) && - Here(DEKU_TREE_MQ_LOBBY, []{return HasFireSourceWithTorch;});}}), - Entrance(DEKU_TREE_MQ_BASEMENT_LEDGE, {[]{return LogicDekuB1Skip || Here(DEKU_TREE_MQ_LOBBY, []{return IsAdult;});}}), + Entrance(RR_DEKU_TREE_ENTRYWAY, {[]{return true;}}), + Entrance(RR_DEKU_TREE_MQ_COMPASS_ROOM, {[]{return Here(RR_DEKU_TREE_MQ_LOBBY, []{return (IsChild && CanUse(RG_FAIRY_SLINGSHOT)) || (IsAdult && CanUse(RG_FAIRY_BOW));}) && + Here(RR_DEKU_TREE_MQ_LOBBY, []{return HasFireSourceWithTorch || (IsAdult && CanUse(RG_FAIRY_BOW));});}}), + Entrance(RR_DEKU_TREE_MQ_BASEMENT_WATER_ROOM_FRONT, {[]{return Here(RR_DEKU_TREE_MQ_LOBBY, []{return (IsChild && CanUse(RG_FAIRY_SLINGSHOT)) || (IsAdult && CanUse(RG_FAIRY_BOW));}) && + Here(RR_DEKU_TREE_MQ_LOBBY, []{return HasFireSourceWithTorch;});}}), + Entrance(RR_DEKU_TREE_MQ_BASEMENT_LEDGE, {[]{return LogicDekuB1Skip || Here(RR_DEKU_TREE_MQ_LOBBY, []{return IsAdult;});}}), }); - areaTable[DEKU_TREE_MQ_COMPASS_ROOM] = Area("Deku Tree MQ Compass Room", "Deku Tree", DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DEKU_TREE_MQ_COMPASS_ROOM] = Area("Deku Tree MQ Compass Room", "Deku Tree", RHT_DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(DEKU_TREE_MQ_COMPASS_CHEST, {[]{return true;}}), - LocationAccess(DEKU_TREE_MQ_GS_COMPASS_ROOM, {[]{return HookshotOrBoomerang && - Here(DEKU_TREE_MQ_COMPASS_ROOM, []{return HasBombchus || + LocationAccess(RC_DEKU_TREE_MQ_COMPASS_CHEST, {[]{return true;}}), + LocationAccess(RC_DEKU_TREE_MQ_GS_COMPASS_ROOM, {[]{return HookshotOrBoomerang && + Here(RR_DEKU_TREE_MQ_COMPASS_ROOM, []{return HasBombchus || (Bombs && (CanPlay(SongOfTime) || IsAdult)) || - (IsAdult && CanUse(MEGATON_HAMMER) && (CanPlay(SongOfTime) || LogicDekuMQCompassGS));});}}), + (IsAdult && CanUse(RG_MEGATON_HAMMER) && (CanPlay(SongOfTime) || LogicDekuMQCompassGS));});}}), }, { //Exits - Entrance(DEKU_TREE_MQ_LOBBY, {[]{return true;}}), + Entrance(RR_DEKU_TREE_MQ_LOBBY, {[]{return true;}}), }); - areaTable[DEKU_TREE_MQ_BASEMENT_WATER_ROOM_FRONT] = Area("Deku Tree MQ Basement Water Room Front", "Deku Tree", DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DEKU_TREE_MQ_BASEMENT_WATER_ROOM_FRONT] = Area("Deku Tree MQ Basement Water Room Front", "Deku Tree", RHT_DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, {[]{return true;}}), + LocationAccess(RC_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, {[]{return true;}}), }, { //Exits - Entrance(DEKU_TREE_MQ_BASEMENT_WATER_ROOM_BACK, {[]{return LogicDekuMQLog || (IsChild && (DekuShield || HylianShield)) || - (IsAdult && (CanUse(LONGSHOT) || (CanUse(HOOKSHOT) && CanUse(IRON_BOOTS))));}}), - Entrance(DEKU_TREE_MQ_LOBBY, {[]{return true;}}), + Entrance(RR_DEKU_TREE_MQ_BASEMENT_WATER_ROOM_BACK, {[]{return LogicDekuMQLog || (IsChild && (DekuShield || HylianShield)) || + (IsAdult && (CanUse(RG_LONGSHOT) || (CanUse(RG_HOOKSHOT) && CanUse(RG_IRON_BOOTS))));}}), + Entrance(RR_DEKU_TREE_MQ_LOBBY, {[]{return true;}}), }); - areaTable[DEKU_TREE_MQ_BASEMENT_WATER_ROOM_BACK] = Area("Deku Tree MQ Basement Water Room Front", "Deku Tree", DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DEKU_TREE_MQ_BASEMENT_WATER_ROOM_BACK] = Area("Deku Tree MQ Basement Water Room Front", "Deku Tree", RHT_DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, {[]{return CanPlay(SongOfTime);}}), + LocationAccess(RC_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, {[]{return CanPlay(SongOfTime);}}), }, { //Exits - Entrance(DEKU_TREE_MQ_BASEMENT_BACK_ROOM, {[]{return Here(DEKU_TREE_MQ_BASEMENT_WATER_ROOM_BACK, []{return (IsChild && CanUse(STICKS)) || CanUse(DINS_FIRE) || - Here(DEKU_TREE_MQ_BASEMENT_WATER_ROOM_FRONT, []{return IsAdult && CanUse(FIRE_ARROWS);});}) && - Here(DEKU_TREE_MQ_BASEMENT_WATER_ROOM_BACK, []{return IsAdult || KokiriSword || CanUseProjectile || (Nuts && Sticks);});}}), - Entrance(DEKU_TREE_MQ_BASEMENT_WATER_ROOM_FRONT, {[]{return true;}}), + Entrance(RR_DEKU_TREE_MQ_BASEMENT_BACK_ROOM, {[]{return Here(RR_DEKU_TREE_MQ_BASEMENT_WATER_ROOM_BACK, []{return (IsChild && CanUse(RG_STICKS)) || CanUse(RG_DINS_FIRE) || + Here(RR_DEKU_TREE_MQ_BASEMENT_WATER_ROOM_FRONT, []{return IsAdult && CanUse(RG_FIRE_ARROWS);});}) && + Here(RR_DEKU_TREE_MQ_BASEMENT_WATER_ROOM_BACK, []{return IsAdult || KokiriSword || CanUseProjectile || (Nuts && Sticks);});}}), + Entrance(RR_DEKU_TREE_MQ_BASEMENT_WATER_ROOM_FRONT, {[]{return true;}}), }); - areaTable[DEKU_TREE_MQ_BASEMENT_BACK_ROOM] = Area("Deku Tree MQ Basement Back Room", "Deku Tree", DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DEKU_TREE_MQ_BASEMENT_BACK_ROOM] = Area("Deku Tree MQ Basement Back Room", "Deku Tree", RHT_DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, {[]{return (IsAdult && CanUse(LONGSHOT)) || (CanPlay(SongOfTime) && HookshotOrBoomerang);}}), - LocationAccess(DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, {[]{return HasFireSourceWithTorch && HookshotOrBoomerang;}}), + LocationAccess(RC_DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, {[]{return (IsAdult && CanUse(RG_LONGSHOT)) || (CanPlay(SongOfTime) && HookshotOrBoomerang);}}), + LocationAccess(RC_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, {[]{return HasFireSourceWithTorch && HookshotOrBoomerang;}}), }, { //Exits - Entrance(DEKU_TREE_MQ_BASEMENT_LEDGE, {[]{return IsChild;}}), - Entrance(DEKU_TREE_MQ_BASEMENT_WATER_ROOM_BACK, {[]{return (IsChild && CanUse(KOKIRI_SWORD)) || CanUseProjectile || (Nuts && (IsChild && CanUse(STICKS)));}}), + Entrance(RR_DEKU_TREE_MQ_BASEMENT_LEDGE, {[]{return IsChild;}}), + Entrance(RR_DEKU_TREE_MQ_BASEMENT_WATER_ROOM_BACK, {[]{return (IsChild && CanUse(RG_KOKIRI_SWORD)) || CanUseProjectile || (Nuts && (IsChild && CanUse(RG_STICKS)));}}), }); - areaTable[DEKU_TREE_MQ_BASEMENT_LEDGE] = Area("Deku Tree MQ Basement Ledge", "Deku Tree", DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DEKU_TREE_MQ_BASEMENT_LEDGE] = Area("Deku Tree MQ Basement Ledge", "Deku Tree", RHT_DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(DEKU_TREE_MQ_DEKU_SCRUB, {[]{return CanStunDeku;}}), + LocationAccess(RC_DEKU_TREE_MQ_DEKU_SCRUB, {[]{return CanStunDeku;}}), }, { //Exits - Entrance(DEKU_TREE_MQ_BASEMENT_BACK_ROOM, {[]{return IsChild;}}), - Entrance(DEKU_TREE_MQ_LOBBY, {[]{return true;}}), - Entrance(DEKU_TREE_MQ_OUTSIDE_BOSS_ROOM, - { [] { return Here(DEKU_TREE_MQ_BASEMENT_LEDGE, [] { return HasFireSourceWithTorch; }); } }), + Entrance(RR_DEKU_TREE_MQ_BASEMENT_BACK_ROOM, {[]{return IsChild;}}), + Entrance(RR_DEKU_TREE_MQ_LOBBY, {[]{return true;}}), + Entrance(RR_DEKU_TREE_MQ_OUTSIDE_BOSS_ROOM, + { [] { return Here(RR_DEKU_TREE_MQ_BASEMENT_LEDGE, [] { return HasFireSourceWithTorch; }); } }), }); - areaTable[DEKU_TREE_MQ_OUTSIDE_BOSS_ROOM] = - Area("Deku Tree MQ Outside Boss Room", "Deku Tree", DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, {}, + areaTable[RR_DEKU_TREE_MQ_OUTSIDE_BOSS_ROOM] = + Area("Deku Tree MQ Outside Boss Room", "Deku Tree", RHT_DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, {}, { // Exits - Entrance(DEKU_TREE_MQ_BASEMENT_LEDGE, { [] { return true; } }), - Entrance(DEKU_TREE_BOSS_ENTRYWAY, - { [] { return Here(DEKU_TREE_MQ_BASEMENT_LEDGE, [] { return HasShield; }); } }), + Entrance(RR_DEKU_TREE_MQ_BASEMENT_LEDGE, { [] { return true; } }), + Entrance(RR_DEKU_TREE_BOSS_ENTRYWAY, + { [] { return Here(RR_DEKU_TREE_MQ_BASEMENT_LEDGE, [] { return HasShield; }); } }), }); } /*--------------------------- | BOSS ROOM | ---------------------------*/ - areaTable[DEKU_TREE_BOSS_ENTRYWAY] = - Area("Deku Tree Boss Entryway", "Deku Tree", DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, {}, + areaTable[RR_DEKU_TREE_BOSS_ENTRYWAY] = + Area("Deku Tree Boss Entryway", "Deku Tree", RHT_DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, {}, { // Exits - Entrance(DEKU_TREE_OUTSIDE_BOSS_ROOM, { [] { return Dungeon::DekuTree.IsVanilla(); } }), - Entrance(DEKU_TREE_MQ_OUTSIDE_BOSS_ROOM, { [] { return Dungeon::DekuTree.IsMQ(); } }), - Entrance(DEKU_TREE_BOSS_ROOM, { [] { return true; } }), + Entrance(RR_DEKU_TREE_OUTSIDE_BOSS_ROOM, { [] { return Dungeon::DekuTree.IsVanilla(); } }), + Entrance(RR_DEKU_TREE_MQ_OUTSIDE_BOSS_ROOM, { [] { return Dungeon::DekuTree.IsMQ(); } }), + Entrance(RR_DEKU_TREE_BOSS_ROOM, { [] { return true; } }), }); - areaTable[DEKU_TREE_BOSS_ROOM] = - Area("Deku Tree Boss Room", "Deku Tree", NONE, NO_DAY_NIGHT_CYCLE, + areaTable[RR_DEKU_TREE_BOSS_ROOM] = + Area("Deku Tree Boss Room", "Deku Tree", RHT_NONE, NO_DAY_NIGHT_CYCLE, { // Events EventAccess(&DekuTreeClear, { [] { return DekuTreeClear || - (CanJumpslash && (Nuts || CanUse(SLINGSHOT) || CanUse(BOW) || + (CanJumpslash && (Nuts || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW) || HookshotOrBoomerang)); }}), }, { // Locations - LocationAccess(QUEEN_GOHMA, { [] { return DekuTreeClear; } }), - LocationAccess(DEKU_TREE_QUEEN_GOHMA_HEART, { [] { return DekuTreeClear; } }), + LocationAccess(RC_QUEEN_GOHMA, { [] { return DekuTreeClear; } }), + LocationAccess(RC_DEKU_TREE_QUEEN_GOHMA_HEART, { [] { return DekuTreeClear; } }), }, { // Exits - Entrance(DEKU_TREE_BOSS_ENTRYWAY, { [] { return true; } }), + Entrance(RR_DEKU_TREE_BOSS_ENTRYWAY, { [] { return true; } }), }); } 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 133cdc340..ea591e7c1 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 @@ -10,197 +10,197 @@ void AreaTable_Init_DodongosCavern() { /*-------------------------- | VANILLA/MQ DECIDER | ---------------------------*/ - areaTable[DODONGOS_CAVERN_ENTRYWAY] = Area("Dodongos Cavern Entryway", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DODONGOS_CAVERN_ENTRYWAY] = Area("Dodongos Cavern Entryway", "Dodongos Cavern", RHT_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(DODONGOS_CAVERN_BEGINNING, {[]{return Dungeon::DodongosCavern.IsVanilla();}}), - Entrance(DODONGOS_CAVERN_MQ_BEGINNING, {[]{return Dungeon::DodongosCavern.IsMQ();}}), - Entrance(DEATH_MOUNTAIN_TRAIL, {[]{return true;}}), + Entrance(RR_DODONGOS_CAVERN_BEGINNING, {[]{return Dungeon::DodongosCavern.IsVanilla();}}), + Entrance(RR_DODONGOS_CAVERN_MQ_BEGINNING, {[]{return Dungeon::DodongosCavern.IsMQ();}}), + Entrance(RR_DEATH_MOUNTAIN_TRAIL, {[]{return true;}}), }); /*-------------------------- | VANILLA DUNGEON | ---------------------------*/ if (Dungeon::DodongosCavern.IsVanilla()) { - areaTable[DODONGOS_CAVERN_BEGINNING] = Area("Dodongos Cavern Beginning", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DODONGOS_CAVERN_BEGINNING] = Area("Dodongos Cavern Beginning", "Dodongos Cavern", RHT_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(DODONGOS_CAVERN_ENTRYWAY, {[]{return true;}}), - Entrance(DODONGOS_CAVERN_LOBBY, {[]{return Here(DODONGOS_CAVERN_BEGINNING, []{return CanBlastOrSmash || GoronBracelet;});}}), + Entrance(RR_DODONGOS_CAVERN_ENTRYWAY, {[]{return true;}}), + Entrance(RR_DODONGOS_CAVERN_LOBBY, {[]{return Here(RR_DODONGOS_CAVERN_BEGINNING, []{return CanBlastOrSmash || GoronBracelet;});}}), }); - areaTable[DODONGOS_CAVERN_LOBBY] = Area("Dodongos Cavern Lobby", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DODONGOS_CAVERN_LOBBY] = Area("Dodongos Cavern Lobby", "Dodongos Cavern", RHT_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&GossipStoneFairy, {[]{return GossipStoneFairy || (CanSummonGossipFairy && Here(DODONGOS_CAVERN_LOBBY, []{return CanBlastOrSmash || GoronBracelet;}));}}), + EventAccess(&GossipStoneFairy, {[]{return GossipStoneFairy || (CanSummonGossipFairy && Here(RR_DODONGOS_CAVERN_LOBBY, []{return CanBlastOrSmash || GoronBracelet;}));}}), }, { //Locations - LocationAccess(DODONGOS_CAVERN_MAP_CHEST, {[]{return Here(DODONGOS_CAVERN_LOBBY, []{return CanBlastOrSmash || GoronBracelet;});}}), - LocationAccess(DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, {[]{return CanStunDeku || GoronBracelet;}}), - LocationAccess(DODONGOS_CAVERN_GOSSIP_STONE, {[]{return Here(DODONGOS_CAVERN_LOBBY, []{return CanBlastOrSmash || GoronBracelet;});}}), + LocationAccess(RC_DODONGOS_CAVERN_MAP_CHEST, {[]{return Here(RR_DODONGOS_CAVERN_LOBBY, []{return CanBlastOrSmash || GoronBracelet;});}}), + LocationAccess(RC_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, {[]{return CanStunDeku || GoronBracelet;}}), + LocationAccess(RC_DODONGOS_CAVERN_GOSSIP_STONE, {[]{return Here(RR_DODONGOS_CAVERN_LOBBY, []{return CanBlastOrSmash || GoronBracelet;});}}), }, { //Exits - Entrance(DODONGOS_CAVERN_BEGINNING, {[]{return true;}}), - Entrance(DODONGOS_CAVERN_LOBBY_SWITCH, {[]{return IsAdult;}}), - Entrance(DODONGOS_CAVERN_SE_CORRIDOR, {[]{return Here(DODONGOS_CAVERN_LOBBY, []{return CanBlastOrSmash || GoronBracelet;});}}), - Entrance(DODONGOS_CAVERN_STAIRS_LOWER, {[]{return HasAccessTo(DODONGOS_CAVERN_LOBBY_SWITCH);}}), - Entrance(DODONGOS_CAVERN_FAR_BRIDGE, {[]{return HasAccessTo(DODONGOS_CAVERN_FAR_BRIDGE);}}), - Entrance(DODONGOS_CAVERN_BOSS_AREA, {[]{return Here(DODONGOS_CAVERN_FAR_BRIDGE, []{return HasExplosives;});}}), - Entrance(DODONGOS_CAVERN_BOSS_ENTRYWAY,{[]{return false;}}), + Entrance(RR_DODONGOS_CAVERN_BEGINNING, {[]{return true;}}), + Entrance(RR_DODONGOS_CAVERN_LOBBY_SWITCH, {[]{return IsAdult;}}), + Entrance(RR_DODONGOS_CAVERN_SE_CORRIDOR, {[]{return Here(RR_DODONGOS_CAVERN_LOBBY, []{return CanBlastOrSmash || GoronBracelet;});}}), + Entrance(RR_DODONGOS_CAVERN_STAIRS_LOWER, {[]{return HasAccessTo(RR_DODONGOS_CAVERN_LOBBY_SWITCH);}}), + Entrance(RR_DODONGOS_CAVERN_FAR_BRIDGE, {[]{return HasAccessTo(RR_DODONGOS_CAVERN_FAR_BRIDGE);}}), + Entrance(RR_DODONGOS_CAVERN_BOSS_AREA, {[]{return Here(RR_DODONGOS_CAVERN_FAR_BRIDGE, []{return HasExplosives;});}}), + Entrance(RR_DODONGOS_CAVERN_BOSS_ENTRYWAY,{[]{return false;}}), }); - areaTable[DODONGOS_CAVERN_LOBBY_SWITCH] = Area("Dodongos Cavern Lobby Switch", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DODONGOS_CAVERN_LOBBY_SWITCH] = Area("Dodongos Cavern Lobby Switch", "Dodongos Cavern", RHT_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(DODONGOS_CAVERN_LOBBY, {[]{return true;}}), - Entrance(DODONGOS_CAVERN_DODONGO_ROOM, {[]{return true;}}), + Entrance(RR_DODONGOS_CAVERN_LOBBY, {[]{return true;}}), + Entrance(RR_DODONGOS_CAVERN_DODONGO_ROOM, {[]{return true;}}), }); - areaTable[DODONGOS_CAVERN_SE_CORRIDOR] = Area("Dodongos Cavern SE Corridor", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_SE_CORRIDOR] = Area("Dodongos Cavern SE Corridor", "Dodongos Cavern", RHT_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(DODONGOS_CAVERN_GS_SCARECROW, {[]{return CanUse(SCARECROW) || (IsAdult && CanUse(LONGSHOT)) || (LogicDCScarecrowGS && (IsAdult || CanChildAttack));}}), + LocationAccess(RC_DODONGOS_CAVERN_GS_SCARECROW, {[]{return CanUse(RG_SCARECROW) || (IsAdult && CanUse(RG_LONGSHOT)) || (LogicDCScarecrowGS && (IsAdult || CanChildAttack));}}), }, { //Exits - Entrance(DODONGOS_CAVERN_LOBBY, {[]{return true;}}), - Entrance(DODONGOS_CAVERN_SE_ROOM, {[]{return Here(DODONGOS_CAVERN_SE_CORRIDOR, []{return CanBlastOrSmash || IsAdult || CanChildAttack || (CanTakeDamage && CanShield);});}}), - Entrance(DODONGOS_CAVERN_NEAR_LOWER_LIZALFOS, {[]{return true;}}), + Entrance(RR_DODONGOS_CAVERN_LOBBY, {[]{return true;}}), + Entrance(RR_DODONGOS_CAVERN_SE_ROOM, {[]{return Here(RR_DODONGOS_CAVERN_SE_CORRIDOR, []{return CanBlastOrSmash || IsAdult || CanChildAttack || (CanTakeDamage && CanShield);});}}), + Entrance(RR_DODONGOS_CAVERN_NEAR_LOWER_LIZALFOS, {[]{return true;}}), }); - areaTable[DODONGOS_CAVERN_SE_ROOM] = Area("Dodongos Cavern SE Room", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_SE_ROOM] = Area("Dodongos Cavern SE Room", "Dodongos Cavern", RHT_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, {[]{return IsAdult || CanChildAttack;}}), + LocationAccess(RC_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, {[]{return IsAdult || CanChildAttack;}}), }, { //Exits - Entrance(DODONGOS_CAVERN_SE_CORRIDOR, {[]{return true;}}), + Entrance(RR_DODONGOS_CAVERN_SE_CORRIDOR, {[]{return true;}}), }); - areaTable[DODONGOS_CAVERN_NEAR_LOWER_LIZALFOS] = Area("Dodongos Cavern Near Lower Lizalfos", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DODONGOS_CAVERN_NEAR_LOWER_LIZALFOS] = Area("Dodongos Cavern Near Lower Lizalfos", "Dodongos Cavern", RHT_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(DODONGOS_CAVERN_SE_CORRIDOR, {[]{return true;}}), - Entrance(DODONGOS_CAVERN_LOWER_LIZALFOS, {[]{return true;}}), + Entrance(RR_DODONGOS_CAVERN_SE_CORRIDOR, {[]{return true;}}), + Entrance(RR_DODONGOS_CAVERN_LOWER_LIZALFOS, {[]{return true;}}), }); - areaTable[DODONGOS_CAVERN_LOWER_LIZALFOS] = Area("Dodongos Cavern Lower Lizalfos", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DODONGOS_CAVERN_LOWER_LIZALFOS] = Area("Dodongos Cavern Lower Lizalfos", "Dodongos Cavern", RHT_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(DODONGOS_CAVERN_NEAR_LOWER_LIZALFOS, {[]{return Here(DODONGOS_CAVERN_LOWER_LIZALFOS, []{return IsAdult || Slingshot || Sticks || KokiriSword || HasExplosives;});}}), - Entrance(DODONGOS_CAVERN_DODONGO_ROOM, {[]{return Here(DODONGOS_CAVERN_LOWER_LIZALFOS, []{return IsAdult || Slingshot || Sticks || KokiriSword || HasExplosives;});}}), + Entrance(RR_DODONGOS_CAVERN_NEAR_LOWER_LIZALFOS, {[]{return Here(RR_DODONGOS_CAVERN_LOWER_LIZALFOS, []{return IsAdult || Slingshot || Sticks || KokiriSword || HasExplosives;});}}), + Entrance(RR_DODONGOS_CAVERN_DODONGO_ROOM, {[]{return Here(RR_DODONGOS_CAVERN_LOWER_LIZALFOS, []{return IsAdult || Slingshot || Sticks || KokiriSword || HasExplosives;});}}), }); - areaTable[DODONGOS_CAVERN_DODONGO_ROOM] = Area("Dodongos Cavern Dodongo Room", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DODONGOS_CAVERN_DODONGO_ROOM] = Area("Dodongos Cavern Dodongo Room", "Dodongos Cavern", RHT_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(DODONGOS_CAVERN_LOBBY_SWITCH, {[]{return HasFireSourceWithTorch;}}), - Entrance(DODONGOS_CAVERN_LOWER_LIZALFOS, {[]{return true;}}), - Entrance(DODONGOS_CAVERN_NEAR_DODONGO_ROOM, {[]{return Here(DODONGOS_CAVERN_DODONGO_ROOM, []{return CanBlastOrSmash || GoronBracelet;});}}), + Entrance(RR_DODONGOS_CAVERN_LOBBY_SWITCH, {[]{return HasFireSourceWithTorch;}}), + Entrance(RR_DODONGOS_CAVERN_LOWER_LIZALFOS, {[]{return true;}}), + Entrance(RR_DODONGOS_CAVERN_NEAR_DODONGO_ROOM, {[]{return Here(RR_DODONGOS_CAVERN_DODONGO_ROOM, []{return CanBlastOrSmash || GoronBracelet;});}}), }); - areaTable[DODONGOS_CAVERN_NEAR_DODONGO_ROOM] = Area("Dodongos Cavern Near Dodongo Room", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_NEAR_DODONGO_ROOM] = Area("Dodongos Cavern Near Dodongo Room", "Dodongos Cavern", RHT_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, {[]{return CanStunDeku;}}), + LocationAccess(RC_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, {[]{return CanStunDeku;}}), }, { //Exits - Entrance(DODONGOS_CAVERN_DODONGO_ROOM, {[]{return true;}}), + Entrance(RR_DODONGOS_CAVERN_DODONGO_ROOM, {[]{return true;}}), }); - areaTable[DODONGOS_CAVERN_STAIRS_LOWER] = Area("Dodongos Cavern Stairs Lower", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DODONGOS_CAVERN_STAIRS_LOWER] = Area("Dodongos Cavern Stairs Lower", "Dodongos Cavern", RHT_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(DODONGOS_CAVERN_LOBBY, {[]{return true;}}), - Entrance(DODONGOS_CAVERN_STAIRS_UPPER, {[]{return HasExplosives || GoronBracelet || CanUse(DINS_FIRE) || (LogicDCStaircase && CanUse(BOW));}}), - Entrance(DODONGOS_CAVERN_COMPASS_ROOM, {[]{return Here(DODONGOS_CAVERN_STAIRS_LOWER, []{return CanBlastOrSmash || GoronBracelet;});}}), + Entrance(RR_DODONGOS_CAVERN_LOBBY, {[]{return true;}}), + Entrance(RR_DODONGOS_CAVERN_STAIRS_UPPER, {[]{return HasExplosives || GoronBracelet || CanUse(RG_DINS_FIRE) || (LogicDCStaircase && CanUse(RG_FAIRY_BOW));}}), + Entrance(RR_DODONGOS_CAVERN_COMPASS_ROOM, {[]{return Here(RR_DODONGOS_CAVERN_STAIRS_LOWER, []{return CanBlastOrSmash || GoronBracelet;});}}), }); - areaTable[DODONGOS_CAVERN_STAIRS_UPPER] = Area("Dodongos Cavern Stairs Upper", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_STAIRS_UPPER] = Area("Dodongos Cavern Stairs Upper", "Dodongos Cavern", RHT_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, {[]{return Here(DODONGOS_CAVERN_FAR_BRIDGE, []{return HookshotOrBoomerang;}) || CanUse(LONGSHOT);}}), - LocationAccess(DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS, {[]{return IsAdult || CanChildAttack || (HasAccessTo(DODONGOS_CAVERN_STAIRS_LOWER) && CanUse(LONGSHOT) && LogicDCVinesGS);}}), + LocationAccess(RC_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, {[]{return Here(RR_DODONGOS_CAVERN_FAR_BRIDGE, []{return HookshotOrBoomerang;}) || CanUse(RG_LONGSHOT);}}), + LocationAccess(RC_DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS, {[]{return IsAdult || CanChildAttack || (HasAccessTo(RR_DODONGOS_CAVERN_STAIRS_LOWER) && CanUse(RG_LONGSHOT) && LogicDCVinesGS);}}), }, { //Exits - Entrance(DODONGOS_CAVERN_STAIRS_LOWER, {[]{return true;}}), - Entrance(DODONGOS_CAVERN_ARMOS_ROOM, {[]{return true;}}), + Entrance(RR_DODONGOS_CAVERN_STAIRS_LOWER, {[]{return true;}}), + Entrance(RR_DODONGOS_CAVERN_ARMOS_ROOM, {[]{return true;}}), }); - areaTable[DODONGOS_CAVERN_COMPASS_ROOM] = Area("Dodongos Cavern Compass Room", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_COMPASS_ROOM] = Area("Dodongos Cavern Compass Room", "Dodongos Cavern", RHT_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(DODONGOS_CAVERN_COMPASS_CHEST, {[]{return true;}}), + LocationAccess(RC_DODONGOS_CAVERN_COMPASS_CHEST, {[]{return true;}}), }, { //Exits - Entrance(DODONGOS_CAVERN_STAIRS_LOWER, {[]{return IsAdult || HasExplosives || GoronBracelet;}}), + Entrance(RR_DODONGOS_CAVERN_STAIRS_LOWER, {[]{return IsAdult || HasExplosives || GoronBracelet;}}), }); - areaTable[DODONGOS_CAVERN_ARMOS_ROOM] = Area("Dodongos Cavern Armos Room", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DODONGOS_CAVERN_ARMOS_ROOM] = Area("Dodongos Cavern Armos Room", "Dodongos Cavern", RHT_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(DODONGOS_CAVERN_STAIRS_UPPER, {[]{return true;}}), - Entrance(DODONGOS_CAVERN_BOMB_ROOM_LOWER, {[]{return true;}}), + Entrance(RR_DODONGOS_CAVERN_STAIRS_UPPER, {[]{return true;}}), + Entrance(RR_DODONGOS_CAVERN_BOMB_ROOM_LOWER, {[]{return true;}}), }); - areaTable[DODONGOS_CAVERN_BOMB_ROOM_LOWER] = Area("Dodongos Cavern Bomb Room Lower", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_BOMB_ROOM_LOWER] = Area("Dodongos Cavern Bomb Room Lower", "Dodongos Cavern", RHT_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, {[]{return true;}}), + LocationAccess(RC_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, {[]{return true;}}), }, { //Exits - Entrance(DODONGOS_CAVERN_2F_SIDE_ROOM, {[]{return Here(DODONGOS_CAVERN_BOMB_ROOM_LOWER, []{return CanBlastOrSmash || (LogicDCScrubRoom && GoronBracelet);});}}), - Entrance(DODONGOS_CAVERN_FIRST_SLINGSHOT_ROOM, {[]{return Here(DODONGOS_CAVERN_BOMB_ROOM_LOWER, []{return CanBlastOrSmash || GoronBracelet;});}}), - Entrance(DODONGOS_CAVERN_BOMB_ROOM_UPPER, {[]{return (IsAdult && LogicDCJump) || CanUse(HOVER_BOOTS) || (IsAdult && CanUse(LONGSHOT));}}), + Entrance(RR_DODONGOS_CAVERN_2F_SIDE_ROOM, {[]{return Here(RR_DODONGOS_CAVERN_BOMB_ROOM_LOWER, []{return CanBlastOrSmash || (LogicDCScrubRoom && GoronBracelet);});}}), + Entrance(RR_DODONGOS_CAVERN_FIRST_SLINGSHOT_ROOM, {[]{return Here(RR_DODONGOS_CAVERN_BOMB_ROOM_LOWER, []{return CanBlastOrSmash || GoronBracelet;});}}), + Entrance(RR_DODONGOS_CAVERN_BOMB_ROOM_UPPER, {[]{return (IsAdult && LogicDCJump) || CanUse(RG_HOVER_BOOTS) || (IsAdult && CanUse(RG_LONGSHOT));}}), }); - areaTable[DODONGOS_CAVERN_2F_SIDE_ROOM] = Area("Dodongos Cavern 2F Side Room", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_2F_SIDE_ROOM] = Area("Dodongos Cavern 2F Side Room", "Dodongos Cavern", RHT_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, {[]{return CanStunDeku;}}), - LocationAccess(DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, {[]{return CanStunDeku;}}), + LocationAccess(RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, {[]{return CanStunDeku;}}), + LocationAccess(RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, {[]{return CanStunDeku;}}), }, { //Exits - Entrance(DODONGOS_CAVERN_BOMB_ROOM_LOWER, {[]{return true;}}), + Entrance(RR_DODONGOS_CAVERN_BOMB_ROOM_LOWER, {[]{return true;}}), }); - areaTable[DODONGOS_CAVERN_FIRST_SLINGSHOT_ROOM] = Area("Dodongos Cavern First Slingshot Room", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DODONGOS_CAVERN_FIRST_SLINGSHOT_ROOM] = Area("Dodongos Cavern First Slingshot Room", "Dodongos Cavern", RHT_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(DODONGOS_CAVERN_BOMB_ROOM_LOWER, {[]{return true;}}), - Entrance(DODONGOS_CAVERN_UPPER_LIZALFOS, {[]{return CanUse(SLINGSHOT) || CanUse(BOW) || LogicDCSlingshotSkip;}}), + Entrance(RR_DODONGOS_CAVERN_BOMB_ROOM_LOWER, {[]{return true;}}), + Entrance(RR_DODONGOS_CAVERN_UPPER_LIZALFOS, {[]{return CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW) || LogicDCSlingshotSkip;}}), }); - areaTable[DODONGOS_CAVERN_UPPER_LIZALFOS] = Area("Dodongos Cavern Upper Lizalfos", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DODONGOS_CAVERN_UPPER_LIZALFOS] = Area("Dodongos Cavern Upper Lizalfos", "Dodongos Cavern", RHT_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(DODONGOS_CAVERN_LOWER_LIZALFOS, {[]{return true;}}), - Entrance(DODONGOS_CAVERN_FIRST_SLINGSHOT_ROOM, {[]{return Here(DODONGOS_CAVERN_LOWER_LIZALFOS, []{return IsAdult || Slingshot || Sticks || KokiriSword || HasExplosives;});}}), - Entrance(DODONGOS_CAVERN_SECOND_SLINGSHOT_ROOM, {[]{return Here(DODONGOS_CAVERN_LOWER_LIZALFOS, []{return IsAdult || Slingshot || Sticks || KokiriSword || HasExplosives;});}}), + Entrance(RR_DODONGOS_CAVERN_LOWER_LIZALFOS, {[]{return true;}}), + Entrance(RR_DODONGOS_CAVERN_FIRST_SLINGSHOT_ROOM, {[]{return Here(RR_DODONGOS_CAVERN_LOWER_LIZALFOS, []{return IsAdult || Slingshot || Sticks || KokiriSword || HasExplosives;});}}), + Entrance(RR_DODONGOS_CAVERN_SECOND_SLINGSHOT_ROOM, {[]{return Here(RR_DODONGOS_CAVERN_LOWER_LIZALFOS, []{return IsAdult || Slingshot || Sticks || KokiriSword || HasExplosives;});}}), }); - areaTable[DODONGOS_CAVERN_SECOND_SLINGSHOT_ROOM] = Area("Dodongos Cavern Second Slingshot Room", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DODONGOS_CAVERN_SECOND_SLINGSHOT_ROOM] = Area("Dodongos Cavern Second Slingshot Room", "Dodongos Cavern", RHT_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(DODONGOS_CAVERN_UPPER_LIZALFOS, {[]{return true;}}), - Entrance(DODONGOS_CAVERN_BOMB_ROOM_UPPER, {[]{return CanUse(SLINGSHOT) || CanUse(BOW) || LogicDCSlingshotSkip;}}), + Entrance(RR_DODONGOS_CAVERN_UPPER_LIZALFOS, {[]{return true;}}), + Entrance(RR_DODONGOS_CAVERN_BOMB_ROOM_UPPER, {[]{return CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW) || LogicDCSlingshotSkip;}}), }); - areaTable[DODONGOS_CAVERN_BOMB_ROOM_UPPER] = Area("Dodongos Cavern Bomb Room Upper", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_BOMB_ROOM_UPPER] = Area("Dodongos Cavern Bomb Room Upper", "Dodongos Cavern", RHT_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(DODONGOS_CAVERN_BOMB_BAG_CHEST, {[]{return true;}}), + LocationAccess(RC_DODONGOS_CAVERN_BOMB_BAG_CHEST, {[]{return true;}}), }, { //Exits - Entrance(DODONGOS_CAVERN_BOMB_ROOM_LOWER, {[]{return true;}}), - Entrance(DODONGOS_CAVERN_SECOND_SLINGSHOT_ROOM, {[]{return true;}}), - Entrance(DODONGOS_CAVERN_FAR_BRIDGE, {[]{return true;}}), + Entrance(RR_DODONGOS_CAVERN_BOMB_ROOM_LOWER, {[]{return true;}}), + Entrance(RR_DODONGOS_CAVERN_SECOND_SLINGSHOT_ROOM, {[]{return true;}}), + Entrance(RR_DODONGOS_CAVERN_FAR_BRIDGE, {[]{return true;}}), }); - areaTable[DODONGOS_CAVERN_FAR_BRIDGE] = Area("Dodongos Cavern Far Bridge", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_FAR_BRIDGE] = Area("Dodongos Cavern Far Bridge", "Dodongos Cavern", RHT_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, {[]{return Here(DODONGOS_CAVERN_FAR_BRIDGE, []{return CanBlastOrSmash;});}}), + LocationAccess(RC_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, {[]{return Here(RR_DODONGOS_CAVERN_FAR_BRIDGE, []{return CanBlastOrSmash;});}}), }, { //Exits - Entrance(DODONGOS_CAVERN_LOBBY, {[]{return true;}}), - Entrance(DODONGOS_CAVERN_BOMB_ROOM_UPPER, {[]{return true;}}), + Entrance(RR_DODONGOS_CAVERN_LOBBY, {[]{return true;}}), + Entrance(RR_DODONGOS_CAVERN_BOMB_ROOM_UPPER, {[]{return true;}}), }); - areaTable[DODONGOS_CAVERN_BOSS_AREA] = Area("Dodongos Cavern Boss Area", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DODONGOS_CAVERN_BOSS_AREA] = Area("Dodongos Cavern Boss Area", "Dodongos Cavern", RHT_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&FairyPot, {[]{return true;}}), }, {}, { //Exits - Entrance(DODONGOS_CAVERN_LOBBY, {[]{return true;}}), - Entrance(DODONGOS_CAVERN_BACK_ROOM, {[]{return Here(DODONGOS_CAVERN_BOSS_AREA, []{return CanBlastOrSmash;});}}), - Entrance(DODONGOS_CAVERN_BOSS_ENTRYWAY, {[]{return true;}}), + Entrance(RR_DODONGOS_CAVERN_LOBBY, {[]{return true;}}), + Entrance(RR_DODONGOS_CAVERN_BACK_ROOM, {[]{return Here(RR_DODONGOS_CAVERN_BOSS_AREA, []{return CanBlastOrSmash;});}}), + Entrance(RR_DODONGOS_CAVERN_BOSS_ENTRYWAY, {[]{return true;}}), }); - areaTable[DODONGOS_CAVERN_BACK_ROOM] = Area("Dodongos Cavern Back Room", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_BACK_ROOM] = Area("Dodongos Cavern Back Room", "Dodongos Cavern", RHT_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(DODONGOS_CAVERN_GS_BACK_ROOM, {[]{return IsAdult || CanChildAttack;}}), + LocationAccess(RC_DODONGOS_CAVERN_GS_BACK_ROOM, {[]{return IsAdult || CanChildAttack;}}), }, { //Exits - Entrance(DODONGOS_CAVERN_BOSS_AREA, {[]{return true;}}), + Entrance(RR_DODONGOS_CAVERN_BOSS_AREA, {[]{return true;}}), }); } @@ -208,102 +208,102 @@ void AreaTable_Init_DodongosCavern() { | MASTER QUEST DUNGEON | ---------------------------*/ if (Dungeon::DodongosCavern.IsMQ()) { - areaTable[DODONGOS_CAVERN_MQ_BEGINNING] = Area("Dodongos Cavern MQ Beginning", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DODONGOS_CAVERN_MQ_BEGINNING] = Area("Dodongos Cavern MQ Beginning", "Dodongos Cavern", RHT_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(DODONGOS_CAVERN_ENTRYWAY, {[]{return true;}}), - Entrance(DODONGOS_CAVERN_MQ_LOBBY, {[]{return Here(DODONGOS_CAVERN_MQ_BEGINNING, []{return CanBlastOrSmash || GoronBracelet;});}}), + Entrance(RR_DODONGOS_CAVERN_ENTRYWAY, {[]{return true;}}), + Entrance(RR_DODONGOS_CAVERN_MQ_LOBBY, {[]{return Here(RR_DODONGOS_CAVERN_MQ_BEGINNING, []{return CanBlastOrSmash || GoronBracelet;});}}), }); - areaTable[DODONGOS_CAVERN_MQ_LOBBY] = Area("Dodongos Cavern MQ Lobby", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DODONGOS_CAVERN_MQ_LOBBY] = Area("Dodongos Cavern MQ Lobby", "Dodongos Cavern", RHT_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (IsAdult || KokiriSword || Boomerang);}}), EventAccess(&GossipStoneFairy, {[]{return GossipStoneFairy || CanSummonGossipFairy;}}), }, { //Locations - LocationAccess(DODONGOS_CAVERN_MQ_MAP_CHEST, {[]{return true;}}), - LocationAccess(DODONGOS_CAVERN_MQ_COMPASS_CHEST, {[]{return IsAdult || CanChildAttack || Nuts;}}), - LocationAccess(DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, {[]{return (IsChild && CanUse(STICKS)) || HasFireSource;}}), - LocationAccess(DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST, {[]{return CanBlastOrSmash || (IsChild && CanUse(STICKS)) || CanUse(DINS_FIRE) || (IsAdult && (LogicDCJump || HoverBoots || Hookshot));}}), - LocationAccess(DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, {[]{return CanPlay(SongOfTime) && (CanChildAttack || IsAdult);}}), - LocationAccess(DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, {[]{return (IsChild && CanUse(STICKS)) || HasFireSource;}}), - LocationAccess(DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, {[]{return CanBlastOrSmash;}}), - LocationAccess(DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, {[]{return CanStunDeku;}}), - LocationAccess(DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, {[]{return CanStunDeku;}}), - LocationAccess(DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, {[]{return CanStunDeku;}}), - LocationAccess(DODONGOS_CAVERN_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_DODONGOS_CAVERN_MQ_MAP_CHEST, {[]{return true;}}), + LocationAccess(RC_DODONGOS_CAVERN_MQ_COMPASS_CHEST, {[]{return IsAdult || CanChildAttack || Nuts;}}), + LocationAccess(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, {[]{return (IsChild && CanUse(RG_STICKS)) || HasFireSource;}}), + LocationAccess(RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST, {[]{return CanBlastOrSmash || (IsChild && CanUse(RG_STICKS)) || CanUse(RG_DINS_FIRE) || (IsAdult && (LogicDCJump || HoverBoots || Hookshot));}}), + LocationAccess(RC_DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, {[]{return CanPlay(SongOfTime) && (CanChildAttack || IsAdult);}}), + LocationAccess(RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, {[]{return (IsChild && CanUse(RG_STICKS)) || HasFireSource;}}), + LocationAccess(RC_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, {[]{return CanBlastOrSmash;}}), + LocationAccess(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, {[]{return CanStunDeku;}}), + LocationAccess(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, {[]{return CanStunDeku;}}), + LocationAccess(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, {[]{return CanStunDeku;}}), + LocationAccess(RC_DODONGOS_CAVERN_GOSSIP_STONE, {[]{return true;}}), }, { //Exits - Entrance(DODONGOS_CAVERN_MQ_LOWER_RIGHT_SIDE, {[]{return Here(DODONGOS_CAVERN_MQ_LOBBY, []{return CanBlastOrSmash || (((IsChild && CanUse(STICKS)) || CanUse(DINS_FIRE)) && CanTakeDamage);});}}), - Entrance(DODONGOS_CAVERN_MQ_BOMB_BAG_AREA, {[]{return IsAdult || (Here(DODONGOS_CAVERN_MQ_LOBBY, []{return IsAdult;}) && HasExplosives) || (LogicDCMQChildBombs && CanJumpslash && CanTakeDamage);}}), + Entrance(RR_DODONGOS_CAVERN_MQ_LOWER_RIGHT_SIDE, {[]{return Here(RR_DODONGOS_CAVERN_MQ_LOBBY, []{return CanBlastOrSmash || (((IsChild && CanUse(RG_STICKS)) || CanUse(RG_DINS_FIRE)) && CanTakeDamage);});}}), + Entrance(RR_DODONGOS_CAVERN_MQ_BOMB_BAG_AREA, {[]{return IsAdult || (Here(RR_DODONGOS_CAVERN_MQ_LOBBY, []{return IsAdult;}) && HasExplosives) || (LogicDCMQChildBombs && CanJumpslash && CanTakeDamage);}}), //Trick: IsAdult || HasExplosives || (LogicDCMQChildBombs && (KokiriSword || Sticks) && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_OHKO)) - Entrance(DODONGOS_CAVERN_MQ_BOSS_AREA, {[]{return HasExplosives || (GoronBracelet && ((IsAdult && LogicDCMQEyesAdult) || (IsChild && LogicDCMQEyesChild)) && ((IsChild && (CanUse(STICKS))) || CanUse(DINS_FIRE) || (IsAdult && (LogicDCJump || Hammer || HoverBoots || Hookshot))));}}), - //Trick: HasExplosives || (LogicDCMQEyes && GoronBracelet && (IsAdult || LogicDCMQChildBack) && ((IsChild && CanUse(STICKS)) || CanUse(DINS_FIRE) || (IsAdult && (LogicDCJump || Hammer || HoverBoots || Hookshot)))) + Entrance(RR_DODONGOS_CAVERN_MQ_BOSS_AREA, {[]{return HasExplosives || (GoronBracelet && ((IsAdult && LogicDCMQEyesAdult) || (IsChild && LogicDCMQEyesChild)) && ((IsChild && (CanUse(RG_STICKS))) || CanUse(RG_DINS_FIRE) || (IsAdult && (LogicDCJump || Hammer || HoverBoots || Hookshot))));}}), + //Trick: HasExplosives || (LogicDCMQEyes && GoronBracelet && (IsAdult || LogicDCMQChildBack) && ((IsChild && CanUse(RG_STICKS)) || CanUse(RG_DINS_FIRE) || (IsAdult && (LogicDCJump || Hammer || HoverBoots || Hookshot)))) }); - areaTable[DODONGOS_CAVERN_MQ_LOWER_RIGHT_SIDE] = Area("Dodongos Cavern MQ Lower Right Side", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_MQ_LOWER_RIGHT_SIDE] = Area("Dodongos Cavern MQ Lower Right Side", "Dodongos Cavern", RHT_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, {[]{return CanStunDeku;}}), + LocationAccess(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, {[]{return CanStunDeku;}}), }, { //Exits - Entrance(DODONGOS_CAVERN_MQ_BOMB_BAG_AREA, {[]{return (Here(DODONGOS_CAVERN_MQ_LOWER_RIGHT_SIDE, []{return IsAdult && CanUse(BOW);}) || GoronBracelet || - CanUse(DINS_FIRE) || HasExplosives) && - IsChild && CanUse(SLINGSHOT);}}), + Entrance(RR_DODONGOS_CAVERN_MQ_BOMB_BAG_AREA, {[]{return (Here(RR_DODONGOS_CAVERN_MQ_LOWER_RIGHT_SIDE, []{return IsAdult && CanUse(RG_FAIRY_BOW);}) || GoronBracelet || + CanUse(RG_DINS_FIRE) || HasExplosives) && + IsChild && CanUse(RG_FAIRY_SLINGSHOT);}}), }); - areaTable[DODONGOS_CAVERN_MQ_BOMB_BAG_AREA] = Area("Dodongos Cavern MQ Bomb Bag Area", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_MQ_BOMB_BAG_AREA] = Area("Dodongos Cavern MQ Bomb Bag Area", "Dodongos Cavern", RHT_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST, {[]{return true;}}), - LocationAccess(DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, {[]{return (Here(DODONGOS_CAVERN_MQ_BOMB_BAG_AREA, []{return IsAdult && CanUse(BOW);}) || GoronBracelet || CanUse(DINS_FIRE) || HasExplosives) && HookshotOrBoomerang;}}), + LocationAccess(RC_DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST, {[]{return true;}}), + LocationAccess(RC_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, {[]{return (Here(RR_DODONGOS_CAVERN_MQ_BOMB_BAG_AREA, []{return IsAdult && CanUse(RG_FAIRY_BOW);}) || GoronBracelet || CanUse(RG_DINS_FIRE) || HasExplosives) && HookshotOrBoomerang;}}), }, { //Exits - Entrance(DODONGOS_CAVERN_MQ_LOWER_RIGHT_SIDE, {[]{return true;}}), + Entrance(RR_DODONGOS_CAVERN_MQ_LOWER_RIGHT_SIDE, {[]{return true;}}), }); - areaTable[DODONGOS_CAVERN_MQ_BOSS_AREA] = Area("Dodongos Cavern MQ BossArea", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DODONGOS_CAVERN_MQ_BOSS_AREA] = Area("Dodongos Cavern MQ BossArea", "Dodongos Cavern", RHT_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&FairyPot, {[]{return true;}}), }, { //Locations - LocationAccess(DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, {[]{return true;}}), - LocationAccess(DODONGOS_CAVERN_MQ_GS_BACK_AREA, {[]{return true;}}), + LocationAccess(RC_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, {[]{return true;}}), + LocationAccess(RC_DODONGOS_CAVERN_MQ_GS_BACK_AREA, {[]{return true;}}), }, { //Exits - Entrance(DODONGOS_CAVERN_BOSS_ENTRYWAY, {[]{return true;}}), + Entrance(RR_DODONGOS_CAVERN_BOSS_ENTRYWAY, {[]{return true;}}), }); } /*--------------------------- | BOSS ROOM | ---------------------------*/ - areaTable[DODONGOS_CAVERN_BOSS_ENTRYWAY] = - Area("Dodongos Cavern Boss Entryway", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, + areaTable[RR_DODONGOS_CAVERN_BOSS_ENTRYWAY] = + Area("Dodongos Cavern Boss Entryway", "Dodongos Cavern", RHT_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { // Exits - Entrance(DODONGOS_CAVERN_BOSS_AREA, { [] { return Dungeon::DodongosCavern.IsVanilla(); } }), - Entrance(DODONGOS_CAVERN_MQ_BOSS_AREA, { [] { return Dungeon::DodongosCavern.IsMQ(); } }), - Entrance(DODONGOS_CAVERN_BOSS_ROOM, { [] { return true; } }), + Entrance(RR_DODONGOS_CAVERN_BOSS_AREA, { [] { return Dungeon::DodongosCavern.IsVanilla(); } }), + Entrance(RR_DODONGOS_CAVERN_MQ_BOSS_AREA, { [] { return Dungeon::DodongosCavern.IsMQ(); } }), + Entrance(RR_DODONGOS_CAVERN_BOSS_ROOM, { [] { return true; } }), }); - areaTable[DODONGOS_CAVERN_BOSS_ROOM] = - Area("Dodongos Cavern Boss Room", "Dodongos Cavern", NONE, NO_DAY_NIGHT_CYCLE, + areaTable[RR_DODONGOS_CAVERN_BOSS_ROOM] = + Area("Dodongos Cavern Boss Room", "Dodongos Cavern", RHT_NONE, NO_DAY_NIGHT_CYCLE, { // Events EventAccess(&DodongosCavernClear, { [] { return DodongosCavernClear || - (Here(DODONGOS_CAVERN_BOSS_ROOM, - [] { return HasExplosives || (CanUse(MEGATON_HAMMER) && LogicDCHammerFloor); }) && + (Here(RR_DODONGOS_CAVERN_BOSS_ROOM, + [] { return HasExplosives || (CanUse(RG_MEGATON_HAMMER) && LogicDCHammerFloor); }) && (Bombs || GoronBracelet) && CanJumpslash); /*todo add chu kill to tricks*/ }}), }, { // Locations - LocationAccess(DODONGOS_CAVERN_BOSS_ROOM_CHEST, { [] { return true; } }), - LocationAccess(DODONGOS_CAVERN_KING_DODONGO_HEART, { [] { return DodongosCavernClear; } }), - LocationAccess(KING_DODONGO, { [] { return DodongosCavernClear; } }), + LocationAccess(RC_DODONGOS_CAVERN_BOSS_ROOM_CHEST, { [] { return true; } }), + LocationAccess(RC_DODONGOS_CAVERN_KING_DODONGO_HEART, { [] { return DodongosCavernClear; } }), + LocationAccess(RC_KING_DODONGO, { [] { return DodongosCavernClear; } }), }, { // Exits - Entrance(DODONGOS_CAVERN_BOSS_ENTRYWAY, { [] { return true; } }), + Entrance(RR_DODONGOS_CAVERN_BOSS_ENTRYWAY, { [] { return 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 887766fe5..36a19e172 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 @@ -10,301 +10,301 @@ void AreaTable_Init_FireTemple() { /*-------------------------- | VANILLA/MQ DECIDER | ---------------------------*/ - areaTable[FIRE_TEMPLE_ENTRYWAY] = Area("Fire Temple Entryway", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_ENTRYWAY] = Area("Fire Temple Entryway", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(FIRE_TEMPLE_FIRST_ROOM, {[]{return Dungeon::FireTemple.IsVanilla();}}), - Entrance(FIRE_TEMPLE_MQ_LOWER, {[]{return Dungeon::FireTemple.IsMQ();}}), - Entrance(DMC_CENTRAL_LOCAL, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_FIRST_ROOM, {[]{return Dungeon::FireTemple.IsVanilla();}}), + Entrance(RR_FIRE_TEMPLE_MQ_LOWER, {[]{return Dungeon::FireTemple.IsMQ();}}), + Entrance(RR_DMC_CENTRAL_LOCAL, {[]{return true;}}), }); /*-------------------------- | VANILLA DUNGEON | ---------------------------*/ if (Dungeon::FireTemple.IsVanilla()) { - areaTable[FIRE_TEMPLE_FIRST_ROOM] = Area("Fire Temple First Room", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_FIRST_ROOM] = Area("Fire Temple First Room", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { }, { //Exits - Entrance(FIRE_TEMPLE_ENTRYWAY, {[]{return true;}}), - Entrance(FIRE_TEMPLE_NEAR_BOSS_ROOM, {[]{return FireTimer >= 24;}}), - Entrance(FIRE_TEMPLE_LOOP_ENEMIES, {[]{return Here(FIRE_TEMPLE_FIRST_ROOM, []{return CanUse(MEGATON_HAMMER);}) && (SmallKeys(FIRE_TEMPLE, 8) || !IsKeysanity);}}), - Entrance(FIRE_TEMPLE_LOOP_EXIT, {[]{return true;}}), - Entrance(FIRE_TEMPLE_BIG_LAVA_ROOM, {[]{return SmallKeys(FIRE_TEMPLE, 2) && FireTimer >= 24;}}), + Entrance(RR_FIRE_TEMPLE_ENTRYWAY, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_NEAR_BOSS_ROOM, {[]{return FireTimer >= 24;}}), + Entrance(RR_FIRE_TEMPLE_LOOP_ENEMIES, {[]{return Here(RR_FIRE_TEMPLE_FIRST_ROOM, []{return CanUse(RG_MEGATON_HAMMER);}) && (SmallKeys(RR_FIRE_TEMPLE, 8) || !IsKeysanity);}}), + Entrance(RR_FIRE_TEMPLE_LOOP_EXIT, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_BIG_LAVA_ROOM, {[]{return SmallKeys(RR_FIRE_TEMPLE, 2) && FireTimer >= 24;}}), }); - areaTable[FIRE_TEMPLE_NEAR_BOSS_ROOM] = Area("Fire Temple Near Boss Room", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FIRE_TEMPLE_NEAR_BOSS_ROOM] = Area("Fire Temple Near Boss Room", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&FairyPot, {[]{return FairyPot || (CanUse(HOVER_BOOTS) || CanUse(HOOKSHOT));}}), + EventAccess(&FairyPot, {[]{return FairyPot || (CanUse(RG_HOVER_BOOTS) || CanUse(RG_HOOKSHOT));}}), }, { //Locations - LocationAccess(FIRE_TEMPLE_NEAR_BOSS_CHEST, {[]{return true;}}), + LocationAccess(RC_FIRE_TEMPLE_NEAR_BOSS_CHEST, {[]{return true;}}), }, { //Exits - Entrance(FIRE_TEMPLE_FIRST_ROOM, {[]{return true;}}), - Entrance(FIRE_TEMPLE_BOSS_ENTRYWAY, {[]{return BossKeyFireTemple && ((IsAdult && LogicFireBossDoorJump) || CanUse(HOVER_BOOTS) || Here(FIRE_TEMPLE_FIRE_MAZE_UPPER, []{return CanUse(MEGATON_HAMMER);}));}}), + Entrance(RR_FIRE_TEMPLE_FIRST_ROOM, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_BOSS_ENTRYWAY, {[]{return BossKeyFireTemple && ((IsAdult && LogicFireBossDoorJump) || CanUse(RG_HOVER_BOOTS) || Here(RR_FIRE_TEMPLE_FIRE_MAZE_UPPER, []{return CanUse(RG_MEGATON_HAMMER);}));}}), }); - areaTable[FIRE_TEMPLE_LOOP_ENEMIES] = Area("Fire Temple Loop Enemies", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_LOOP_ENEMIES] = Area("Fire Temple Loop Enemies", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(FIRE_TEMPLE_FIRST_ROOM, {[]{return SmallKeys(FIRE_TEMPLE, 8) || !IsKeysanity;}}), - Entrance(FIRE_TEMPLE_LOOP_TILES, {[]{return Here(FIRE_TEMPLE_LOOP_ENEMIES, []{return IsAdult || KokiriSword;});}}), + Entrance(RR_FIRE_TEMPLE_FIRST_ROOM, {[]{return SmallKeys(RR_FIRE_TEMPLE, 8) || !IsKeysanity;}}), + Entrance(RR_FIRE_TEMPLE_LOOP_TILES, {[]{return Here(RR_FIRE_TEMPLE_LOOP_ENEMIES, []{return IsAdult || KokiriSword;});}}), }); - areaTable[FIRE_TEMPLE_LOOP_TILES] = Area("Fire Temple Loop Tiles", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_LOOP_TILES] = Area("Fire Temple Loop Tiles", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FIRE_TEMPLE_GS_BOSS_KEY_LOOP, {[]{return IsAdult || CanChildAttack;}}), + LocationAccess(RC_FIRE_TEMPLE_GS_BOSS_KEY_LOOP, {[]{return IsAdult || CanChildAttack;}}), }, { //Exits - Entrance(FIRE_TEMPLE_LOOP_ENEMIES, {[]{return true;}}), - Entrance(FIRE_TEMPLE_LOOP_FLARE_DANCER, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_LOOP_ENEMIES, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_LOOP_FLARE_DANCER, {[]{return true;}}), }); - areaTable[FIRE_TEMPLE_LOOP_FLARE_DANCER] = Area("Fire Temple Loop Flare Dancer", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_LOOP_FLARE_DANCER] = Area("Fire Temple Loop Flare Dancer", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FIRE_TEMPLE_FLARE_DANCER_CHEST, {[]{return (HasExplosives || CanUse(MEGATON_HAMMER)) && IsAdult;}}), + LocationAccess(RC_FIRE_TEMPLE_FLARE_DANCER_CHEST, {[]{return (HasExplosives || CanUse(RG_MEGATON_HAMMER)) && IsAdult;}}), }, { //Exits - Entrance(FIRE_TEMPLE_LOOP_TILES, {[]{return true;}}), - Entrance(FIRE_TEMPLE_LOOP_HAMMER_SWITCH, {[]{return Here(FIRE_TEMPLE_LOOP_FLARE_DANCER, []{return (HasExplosives || CanUse(MEGATON_HAMMER) || CanUse(HOOKSHOT)) && (IsAdult || KokiriSword || Slingshot || Boomerang);});}}), + Entrance(RR_FIRE_TEMPLE_LOOP_TILES, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_LOOP_HAMMER_SWITCH, {[]{return Here(RR_FIRE_TEMPLE_LOOP_FLARE_DANCER, []{return (HasExplosives || CanUse(RG_MEGATON_HAMMER) || CanUse(RG_HOOKSHOT)) && (IsAdult || KokiriSword || Slingshot || Boomerang);});}}), }); - areaTable[FIRE_TEMPLE_LOOP_HAMMER_SWITCH] = Area("Fire Temple Loop Hammer Switch", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FIRE_TEMPLE_LOOP_HAMMER_SWITCH] = Area("Fire Temple Loop Hammer Switch", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&FireLoopSwitch, {[]{return FireLoopSwitch || CanUse(MEGATON_HAMMER);}}), + EventAccess(&FireLoopSwitch, {[]{return FireLoopSwitch || CanUse(RG_MEGATON_HAMMER);}}), }, {}, { //Exits - Entrance(FIRE_TEMPLE_LOOP_FLARE_DANCER, {[]{return true;}}), - Entrance(FIRE_TEMPLE_LOOP_GORON_ROOM, {[]{return FireLoopSwitch;}}), + Entrance(RR_FIRE_TEMPLE_LOOP_FLARE_DANCER, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_LOOP_GORON_ROOM, {[]{return FireLoopSwitch;}}), }); - areaTable[FIRE_TEMPLE_LOOP_GORON_ROOM] = Area("Fire Temple Loop Goron Room", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_LOOP_GORON_ROOM] = Area("Fire Temple Loop Goron Room", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FIRE_TEMPLE_BOSS_KEY_CHEST, {[]{return true;}}), + LocationAccess(RC_FIRE_TEMPLE_BOSS_KEY_CHEST, {[]{return true;}}), }, { //Exits - Entrance(FIRE_TEMPLE_LOOP_HAMMER_SWITCH, {[]{return FireLoopSwitch;}}), - Entrance(FIRE_TEMPLE_LOOP_EXIT, {[]{return FireLoopSwitch;}}), + Entrance(RR_FIRE_TEMPLE_LOOP_HAMMER_SWITCH, {[]{return FireLoopSwitch;}}), + Entrance(RR_FIRE_TEMPLE_LOOP_EXIT, {[]{return FireLoopSwitch;}}), }); - areaTable[FIRE_TEMPLE_LOOP_EXIT] = Area("Fire Temple Loop Exit", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_LOOP_EXIT] = Area("Fire Temple Loop Exit", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(FIRE_TEMPLE_FIRST_ROOM, {[]{return true;}}), - Entrance(FIRE_TEMPLE_LOOP_GORON_ROOM, {[]{return FireLoopSwitch;}}), + Entrance(RR_FIRE_TEMPLE_FIRST_ROOM, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_LOOP_GORON_ROOM, {[]{return FireLoopSwitch;}}), }); - areaTable[FIRE_TEMPLE_BIG_LAVA_ROOM] = Area("Fire Temple Big Lava Room", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_BIG_LAVA_ROOM] = Area("Fire Temple Big Lava Room", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(FIRE_TEMPLE_FIRST_ROOM, {[]{return SmallKeys(FIRE_TEMPLE, 2);}}), - Entrance(FIRE_TEMPLE_BIG_LAVA_ROOM_NORTH_GORON, {[]{return true;}}), - Entrance(FIRE_TEMPLE_BIG_LAVA_ROOM_NORTH_TILES, {[]{return IsAdult && (CanPlay(SongOfTime) || LogicFireSongOfTime);}}), - Entrance(FIRE_TEMPLE_BIG_LAVA_ROOM_SOUTH_GORON, {[]{return IsAdult && HasExplosives;}}), - Entrance(FIRE_TEMPLE_FIRE_PILLAR_ROOM, {[]{return SmallKeys(FIRE_TEMPLE, 3);}}), + Entrance(RR_FIRE_TEMPLE_FIRST_ROOM, {[]{return SmallKeys(RR_FIRE_TEMPLE, 2);}}), + Entrance(RR_FIRE_TEMPLE_BIG_LAVA_ROOM_NORTH_GORON, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_BIG_LAVA_ROOM_NORTH_TILES, {[]{return IsAdult && (CanPlay(SongOfTime) || LogicFireSongOfTime);}}), + Entrance(RR_FIRE_TEMPLE_BIG_LAVA_ROOM_SOUTH_GORON, {[]{return IsAdult && HasExplosives;}}), + Entrance(RR_FIRE_TEMPLE_FIRE_PILLAR_ROOM, {[]{return SmallKeys(RR_FIRE_TEMPLE, 3);}}), }); - areaTable[FIRE_TEMPLE_BIG_LAVA_ROOM_NORTH_GORON] = Area("Fire Temple Big Lava Room North Goron", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_BIG_LAVA_ROOM_NORTH_GORON] = Area("Fire Temple Big Lava Room North Goron", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST, {[]{return true;}}), + LocationAccess(RC_FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST, {[]{return true;}}), }, { //Exits - Entrance(FIRE_TEMPLE_BIG_LAVA_ROOM, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_BIG_LAVA_ROOM, {[]{return true;}}), }); - areaTable[FIRE_TEMPLE_BIG_LAVA_ROOM_NORTH_TILES] = Area("Fire Temple Big Lava Room North Tiles", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_BIG_LAVA_ROOM_NORTH_TILES] = Area("Fire Temple Big Lava Room North Tiles", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM, {[]{return IsAdult;}}), + LocationAccess(RC_FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM, {[]{return IsAdult;}}), }, { //Exits - Entrance(FIRE_TEMPLE_BIG_LAVA_ROOM, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_BIG_LAVA_ROOM, {[]{return true;}}), }); - areaTable[FIRE_TEMPLE_BIG_LAVA_ROOM_SOUTH_GORON] = Area("Fire Temple Big Lava Room South Goron", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_BIG_LAVA_ROOM_SOUTH_GORON] = Area("Fire Temple Big Lava Room South Goron", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, {[]{return true;}}), + LocationAccess(RC_FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, {[]{return true;}}), }, { //Exits - Entrance(FIRE_TEMPLE_BIG_LAVA_ROOM, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_BIG_LAVA_ROOM, {[]{return true;}}), }); - areaTable[FIRE_TEMPLE_FIRE_PILLAR_ROOM] = Area("Fire Temple Fire Pillar Room", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_FIRE_PILLAR_ROOM] = Area("Fire Temple Fire Pillar Room", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(FIRE_TEMPLE_BIG_LAVA_ROOM, {[]{return SmallKeys(FIRE_TEMPLE, 3);}}), - Entrance(FIRE_TEMPLE_SHORTCUT_ROOM, {[]{return FireTimer >= 56 && SmallKeys(FIRE_TEMPLE, 4);}}), + Entrance(RR_FIRE_TEMPLE_BIG_LAVA_ROOM, {[]{return SmallKeys(RR_FIRE_TEMPLE, 3);}}), + Entrance(RR_FIRE_TEMPLE_SHORTCUT_ROOM, {[]{return FireTimer >= 56 && SmallKeys(RR_FIRE_TEMPLE, 4);}}), }); - areaTable[FIRE_TEMPLE_SHORTCUT_ROOM] = Area("Fire Temple Shortcut Room", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_SHORTCUT_ROOM] = Area("Fire Temple Shortcut Room", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST, {[]{return Here(FIRE_TEMPLE_SHORTCUT_CLIMB, []{return true;});}}), + LocationAccess(RC_FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST, {[]{return Here(RR_FIRE_TEMPLE_SHORTCUT_CLIMB, []{return true;});}}), }, { //Exits - Entrance(FIRE_TEMPLE_FIRE_PILLAR_ROOM, {[]{return SmallKeys(FIRE_TEMPLE, 4);}}), - Entrance(FIRE_TEMPLE_SHORTCUT_CLIMB, {[]{return Here(FIRE_TEMPLE_SHORTCUT_CLIMB, []{return true;});}}), - Entrance(FIRE_TEMPLE_BOULDER_MAZE_LOWER, {[]{return (GoronBracelet || (IsAdult && LogicFireStrength)) && (HasExplosives || (IsAdult && (CanUse(BOW) || CanUse(HOOKSHOT) || CanUse(SLINGSHOT))));}}), + Entrance(RR_FIRE_TEMPLE_FIRE_PILLAR_ROOM, {[]{return SmallKeys(RR_FIRE_TEMPLE, 4);}}), + Entrance(RR_FIRE_TEMPLE_SHORTCUT_CLIMB, {[]{return Here(RR_FIRE_TEMPLE_SHORTCUT_CLIMB, []{return true;});}}), + Entrance(RR_FIRE_TEMPLE_BOULDER_MAZE_LOWER, {[]{return (GoronBracelet || (IsAdult && LogicFireStrength)) && (HasExplosives || (IsAdult && (CanUse(RG_FAIRY_BOW) || CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_SLINGSHOT))));}}), }); - areaTable[FIRE_TEMPLE_SHORTCUT_CLIMB] = Area("Fire Temple Shortcut Climb", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_SHORTCUT_CLIMB] = Area("Fire Temple Shortcut Climb", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(FIRE_TEMPLE_SHORTCUT_ROOM, {[]{return true;}}), - Entrance(FIRE_TEMPLE_BOULDER_MAZE_UPPER, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_SHORTCUT_ROOM, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_BOULDER_MAZE_UPPER, {[]{return true;}}), }); - areaTable[FIRE_TEMPLE_BOULDER_MAZE_LOWER] = Area("Fire Temple Boulder Maze Lower", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_BOULDER_MAZE_LOWER] = Area("Fire Temple Boulder Maze Lower", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST, {[]{return true;}}), - LocationAccess(FIRE_TEMPLE_GS_BOULDER_MAZE, {[]{return HasExplosives && (IsAdult || Boomerang || CanUse(HOOKSHOT));}}), + LocationAccess(RC_FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST, {[]{return true;}}), + LocationAccess(RC_FIRE_TEMPLE_GS_BOULDER_MAZE, {[]{return HasExplosives && (IsAdult || Boomerang || CanUse(RG_HOOKSHOT));}}), }, { //Exits - Entrance(FIRE_TEMPLE_SHORTCUT_ROOM, {[]{return true;}}), - Entrance(FIRE_TEMPLE_BOULDER_MAZE_LOWER_SIDE_ROOM, {[]{return true;}}), - Entrance(FIRE_TEMPLE_EAST_CENTRAL_ROOM, {[]{return SmallKeys(FIRE_TEMPLE, 5, 7);}}), - Entrance(FIRE_TEMPLE_BOULDER_MAZE_UPPER, {[]{return false;}}), + Entrance(RR_FIRE_TEMPLE_SHORTCUT_ROOM, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_BOULDER_MAZE_LOWER_SIDE_ROOM, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_EAST_CENTRAL_ROOM, {[]{return SmallKeys(RR_FIRE_TEMPLE, 5, 7);}}), + Entrance(RR_FIRE_TEMPLE_BOULDER_MAZE_UPPER, {[]{return false;}}), }); - areaTable[FIRE_TEMPLE_BOULDER_MAZE_LOWER_SIDE_ROOM] = Area("Fire Temple Boulder Maze Lower Side Room", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_BOULDER_MAZE_LOWER_SIDE_ROOM] = Area("Fire Temple Boulder Maze Lower Side Room", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST, {[]{return true;}}), + LocationAccess(RC_FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST, {[]{return true;}}), }, { //Exits - Entrance(FIRE_TEMPLE_BOULDER_MAZE_LOWER, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_BOULDER_MAZE_LOWER, {[]{return true;}}), }); - areaTable[FIRE_TEMPLE_EAST_CENTRAL_ROOM] = Area("Fire Temple East Central Room", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_EAST_CENTRAL_ROOM] = Area("Fire Temple East Central Room", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(FIRE_TEMPLE_BIG_LAVA_ROOM, {[]{return CanTakeDamage;}}), - Entrance(FIRE_TEMPLE_BOULDER_MAZE_LOWER, {[]{return SmallKeys(FIRE_TEMPLE, 5, 8);}}), - Entrance(FIRE_TEMPLE_FIRE_WALL_CHASE, {[]{return SmallKeys(FIRE_TEMPLE, 6, 8);}}), - Entrance(FIRE_TEMPLE_MAP_AREA, {[]{return CanUse(SLINGSHOT) || CanUse(BOW);}}), + Entrance(RR_FIRE_TEMPLE_BIG_LAVA_ROOM, {[]{return CanTakeDamage;}}), + Entrance(RR_FIRE_TEMPLE_BOULDER_MAZE_LOWER, {[]{return SmallKeys(RR_FIRE_TEMPLE, 5, 8);}}), + Entrance(RR_FIRE_TEMPLE_FIRE_WALL_CHASE, {[]{return SmallKeys(RR_FIRE_TEMPLE, 6, 8);}}), + Entrance(RR_FIRE_TEMPLE_MAP_AREA, {[]{return CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW);}}), }); - areaTable[FIRE_TEMPLE_FIRE_WALL_CHASE] = Area("Fire Temple Fire Wall Chase", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_FIRE_WALL_CHASE] = Area("Fire Temple Fire Wall Chase", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(FIRE_TEMPLE_EAST_CENTRAL_ROOM, {[]{return FireTimer >= 24 && SmallKeys(FIRE_TEMPLE, 6, 8);}}), - Entrance(FIRE_TEMPLE_MAP_AREA, {[]{return IsAdult;}}), - Entrance(FIRE_TEMPLE_BOULDER_MAZE_UPPER, {[]{return FireTimer >= 24 && IsAdult;}}), - Entrance(FIRE_TEMPLE_CORRIDOR, {[]{return FireTimer >= 24 && IsAdult && SmallKeys(FIRE_TEMPLE, 7);}}), + Entrance(RR_FIRE_TEMPLE_EAST_CENTRAL_ROOM, {[]{return FireTimer >= 24 && SmallKeys(RR_FIRE_TEMPLE, 6, 8);}}), + Entrance(RR_FIRE_TEMPLE_MAP_AREA, {[]{return IsAdult;}}), + Entrance(RR_FIRE_TEMPLE_BOULDER_MAZE_UPPER, {[]{return FireTimer >= 24 && IsAdult;}}), + Entrance(RR_FIRE_TEMPLE_CORRIDOR, {[]{return FireTimer >= 24 && IsAdult && SmallKeys(RR_FIRE_TEMPLE, 7);}}), }); - areaTable[FIRE_TEMPLE_MAP_AREA] = Area("Fire Temple Map Area", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MAP_AREA] = Area("Fire Temple Map Area", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FIRE_TEMPLE_MAP_CHEST, {[]{return true;}}), + LocationAccess(RC_FIRE_TEMPLE_MAP_CHEST, {[]{return true;}}), }, { //Exits - Entrance(FIRE_TEMPLE_EAST_CENTRAL_ROOM, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_EAST_CENTRAL_ROOM, {[]{return true;}}), }); - areaTable[FIRE_TEMPLE_BOULDER_MAZE_UPPER] = Area("Fire Temple Boulder Maze Upper", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_BOULDER_MAZE_UPPER] = Area("Fire Temple Boulder Maze Upper", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST, {[]{return true;}}), + LocationAccess(RC_FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST, {[]{return true;}}), }, { //Exits - Entrance(FIRE_TEMPLE_SHORTCUT_CLIMB, {[]{return HasExplosives;}}), - Entrance(FIRE_TEMPLE_BOULDER_MAZE_LOWER, {[]{return true;}}), - Entrance(FIRE_TEMPLE_FIRE_WALL_CHASE, {[]{return true;}}), - Entrance(FIRE_TEMPLE_SCARECROW_ROOM, {[]{return CanUse(SCARECROW) || (LogicFireScarecrow && IsAdult && CanUse(LONGSHOT));}}), + Entrance(RR_FIRE_TEMPLE_SHORTCUT_CLIMB, {[]{return HasExplosives;}}), + Entrance(RR_FIRE_TEMPLE_BOULDER_MAZE_LOWER, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_FIRE_WALL_CHASE, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_SCARECROW_ROOM, {[]{return CanUse(RG_SCARECROW) || (LogicFireScarecrow && IsAdult && CanUse(RG_LONGSHOT));}}), }); - areaTable[FIRE_TEMPLE_SCARECROW_ROOM] = Area("Fire Temple Scarecrow Room", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_SCARECROW_ROOM] = Area("Fire Temple Scarecrow Room", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FIRE_TEMPLE_GS_SCARECROW_CLIMB, {[]{return IsAdult || CanChildAttack;}}), + LocationAccess(RC_FIRE_TEMPLE_GS_SCARECROW_CLIMB, {[]{return IsAdult || CanChildAttack;}}), }, { //Exits - Entrance(FIRE_TEMPLE_BOULDER_MAZE_UPPER, {[]{return true;}}), - Entrance(FIRE_TEMPLE_EAST_PEAK, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_BOULDER_MAZE_UPPER, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_EAST_PEAK, {[]{return true;}}), }); - areaTable[FIRE_TEMPLE_EAST_PEAK] = Area("Fire Temple East Peak", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_EAST_PEAK] = Area("Fire Temple East Peak", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FIRE_TEMPLE_SCARECROW_CHEST, {[]{return true;}}), - LocationAccess(FIRE_TEMPLE_GS_SCARECROW_TOP, {[]{return CanUseProjectile;}}), + LocationAccess(RC_FIRE_TEMPLE_SCARECROW_CHEST, {[]{return true;}}), + LocationAccess(RC_FIRE_TEMPLE_GS_SCARECROW_TOP, {[]{return CanUseProjectile;}}), }, { //Exits - Entrance(FIRE_TEMPLE_SCARECROW_ROOM, {[]{return true;}}), - Entrance(FIRE_TEMPLE_EAST_CENTRAL_ROOM, {[]{return CanTakeDamage;}}), + Entrance(RR_FIRE_TEMPLE_SCARECROW_ROOM, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_EAST_CENTRAL_ROOM, {[]{return CanTakeDamage;}}), }); - areaTable[FIRE_TEMPLE_CORRIDOR] = Area("Fire Temple Corridor", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_CORRIDOR] = Area("Fire Temple Corridor", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(FIRE_TEMPLE_FIRE_WALL_CHASE, {[]{return SmallKeys(FIRE_TEMPLE, 7);}}), - Entrance(FIRE_TEMPLE_FIRE_MAZE_ROOM, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_FIRE_WALL_CHASE, {[]{return SmallKeys(RR_FIRE_TEMPLE, 7);}}), + Entrance(RR_FIRE_TEMPLE_FIRE_MAZE_ROOM, {[]{return true;}}), }); - areaTable[FIRE_TEMPLE_FIRE_MAZE_ROOM] = Area("Fire Temple Fire Maze Room", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_FIRE_MAZE_ROOM] = Area("Fire Temple Fire Maze Room", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(FIRE_TEMPLE_CORRIDOR, {[]{return true;}}), - Entrance(FIRE_TEMPLE_FIRE_MAZE_UPPER, {[]{return CanUse(HOVER_BOOTS);}}), - Entrance(FIRE_TEMPLE_FIRE_MAZE_SIDE_ROOM, {[]{return true;}}), - Entrance(FIRE_TEMPLE_WEST_CENTRAL_LOWER, {[]{return SmallKeys(FIRE_TEMPLE, 8);}}), - Entrance(FIRE_TEMPLE_LATE_FIRE_MAZE, {[]{return LogicFireFlameMaze || false;}}), + Entrance(RR_FIRE_TEMPLE_CORRIDOR, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_FIRE_MAZE_UPPER, {[]{return CanUse(RG_HOVER_BOOTS);}}), + Entrance(RR_FIRE_TEMPLE_FIRE_MAZE_SIDE_ROOM, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_WEST_CENTRAL_LOWER, {[]{return SmallKeys(RR_FIRE_TEMPLE, 8);}}), + Entrance(RR_FIRE_TEMPLE_LATE_FIRE_MAZE, {[]{return LogicFireFlameMaze || false;}}), }); - areaTable[FIRE_TEMPLE_FIRE_MAZE_UPPER] = Area("Fire Temple Fire Maze Upper", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_FIRE_MAZE_UPPER] = Area("Fire Temple Fire Maze Upper", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(FIRE_TEMPLE_NEAR_BOSS_ROOM, {[]{return CanUse(MEGATON_HAMMER);}}), - Entrance(FIRE_TEMPLE_FIRE_MAZE_ROOM, {[]{return true;}}), - Entrance(FIRE_TEMPLE_WEST_CENTRAL_UPPER, {[]{return CanUse(MEGATON_HAMMER);}}), + Entrance(RR_FIRE_TEMPLE_NEAR_BOSS_ROOM, {[]{return CanUse(RG_MEGATON_HAMMER);}}), + Entrance(RR_FIRE_TEMPLE_FIRE_MAZE_ROOM, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_WEST_CENTRAL_UPPER, {[]{return CanUse(RG_MEGATON_HAMMER);}}), }); - areaTable[FIRE_TEMPLE_FIRE_MAZE_SIDE_ROOM] = Area("Fire Temple Fire Maze Side Room", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_FIRE_MAZE_SIDE_ROOM] = Area("Fire Temple Fire Maze Side Room", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FIRE_TEMPLE_COMPASS_CHEST, {[]{return true;}}), + LocationAccess(RC_FIRE_TEMPLE_COMPASS_CHEST, {[]{return true;}}), }, { //Exits - Entrance(FIRE_TEMPLE_FIRE_MAZE_ROOM, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_FIRE_MAZE_ROOM, {[]{return true;}}), }); - areaTable[FIRE_TEMPLE_WEST_CENTRAL_LOWER] = Area("Fire Temple West Central Lower", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_WEST_CENTRAL_LOWER] = Area("Fire Temple West Central Lower", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FIRE_TEMPLE_HIGHEST_GORON_CHEST, {[]{return Here(FIRE_TEMPLE_WEST_CENTRAL_UPPER, []{return (CanPlay(SongOfTime) || LogicRustedSwitches) && CanUse(MEGATON_HAMMER);});}}), + LocationAccess(RC_FIRE_TEMPLE_HIGHEST_GORON_CHEST, {[]{return Here(RR_FIRE_TEMPLE_WEST_CENTRAL_UPPER, []{return (CanPlay(SongOfTime) || LogicRustedSwitches) && CanUse(RG_MEGATON_HAMMER);});}}), }, { //Exits - Entrance(FIRE_TEMPLE_FIRE_MAZE_ROOM, {[]{return SmallKeys(FIRE_TEMPLE, 8);}}), - Entrance(FIRE_TEMPLE_WEST_CENTRAL_UPPER, {[]{return IsAdult && CanPlay(SongOfTime);}}), - Entrance(FIRE_TEMPLE_LATE_FIRE_MAZE, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_FIRE_MAZE_ROOM, {[]{return SmallKeys(RR_FIRE_TEMPLE, 8);}}), + Entrance(RR_FIRE_TEMPLE_WEST_CENTRAL_UPPER, {[]{return IsAdult && CanPlay(SongOfTime);}}), + Entrance(RR_FIRE_TEMPLE_LATE_FIRE_MAZE, {[]{return true;}}), }); - areaTable[FIRE_TEMPLE_WEST_CENTRAL_UPPER] = Area("Fire Temple West Central Upper", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_WEST_CENTRAL_UPPER] = Area("Fire Temple West Central Upper", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(FIRE_TEMPLE_BOSS_ENTRYWAY, {[]{return false;}}), - Entrance(FIRE_TEMPLE_FIRE_MAZE_UPPER, {[]{return true;}}), - Entrance(FIRE_TEMPLE_WEST_CENTRAL_LOWER, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_BOSS_ENTRYWAY, {[]{return false;}}), + Entrance(RR_FIRE_TEMPLE_FIRE_MAZE_UPPER, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_WEST_CENTRAL_LOWER, {[]{return true;}}), }); - areaTable[FIRE_TEMPLE_LATE_FIRE_MAZE] = Area("Fire Temple Late Fire Maze", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_LATE_FIRE_MAZE] = Area("Fire Temple Late Fire Maze", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(FIRE_TEMPLE_FIRE_MAZE_ROOM, {[]{return false;}}), - Entrance(FIRE_TEMPLE_WEST_CENTRAL_LOWER, {[]{return true;}}), - Entrance(FIRE_TEMPLE_UPPER_FLARE_DANCER, {[]{return HasExplosives;}}), + Entrance(RR_FIRE_TEMPLE_FIRE_MAZE_ROOM, {[]{return false;}}), + Entrance(RR_FIRE_TEMPLE_WEST_CENTRAL_LOWER, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_UPPER_FLARE_DANCER, {[]{return HasExplosives;}}), }); - areaTable[FIRE_TEMPLE_UPPER_FLARE_DANCER] = Area("Fire Temple Upper Flare Dancer", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_UPPER_FLARE_DANCER] = Area("Fire Temple Upper Flare Dancer", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(FIRE_TEMPLE_LATE_FIRE_MAZE, {[]{return Here(FIRE_TEMPLE_UPPER_FLARE_DANCER, []{return (HasExplosives || CanUse(MEGATON_HAMMER) || CanUse(HOOKSHOT)) && (IsAdult || KokiriSword || Slingshot || Boomerang);});}}), - Entrance(FIRE_TEMPLE_WEST_CLIMB, {[]{return Here(FIRE_TEMPLE_UPPER_FLARE_DANCER, []{return (HasExplosives || CanUse(MEGATON_HAMMER) || CanUse(HOOKSHOT)) && (IsAdult || KokiriSword || Slingshot || Boomerang);});}}), + Entrance(RR_FIRE_TEMPLE_LATE_FIRE_MAZE, {[]{return Here(RR_FIRE_TEMPLE_UPPER_FLARE_DANCER, []{return (HasExplosives || CanUse(RG_MEGATON_HAMMER) || CanUse(RG_HOOKSHOT)) && (IsAdult || KokiriSword || Slingshot || Boomerang);});}}), + Entrance(RR_FIRE_TEMPLE_WEST_CLIMB, {[]{return Here(RR_FIRE_TEMPLE_UPPER_FLARE_DANCER, []{return (HasExplosives || CanUse(RG_MEGATON_HAMMER) || CanUse(RG_HOOKSHOT)) && (IsAdult || KokiriSword || Slingshot || Boomerang);});}}), }); - areaTable[FIRE_TEMPLE_WEST_CLIMB] = Area("Fire Temple West Climb", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_WEST_CLIMB] = Area("Fire Temple West Climb", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(FIRE_TEMPLE_UPPER_FLARE_DANCER, {[]{return true;}}), - Entrance(FIRE_TEMPLE_WEST_PEAK, {[]{return CanUseProjectile;}}), + Entrance(RR_FIRE_TEMPLE_UPPER_FLARE_DANCER, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_WEST_PEAK, {[]{return CanUseProjectile;}}), }); - areaTable[FIRE_TEMPLE_WEST_PEAK] = Area("Fire Temple West Peak", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_WEST_PEAK] = Area("Fire Temple West Peak", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FIRE_TEMPLE_MEGATON_HAMMER_CHEST, {[]{return true;}}), + LocationAccess(RC_FIRE_TEMPLE_MEGATON_HAMMER_CHEST, {[]{return true;}}), }, { //Exits - Entrance(FIRE_TEMPLE_WEST_CENTRAL_UPPER, {[]{return CanTakeDamage;}}), - Entrance(FIRE_TEMPLE_WEST_CLIMB, {[]{return true;}}), - Entrance(FIRE_TEMPLE_HAMMER_RETURN_PATH, {[]{return CanUse(MEGATON_HAMMER);}}), + Entrance(RR_FIRE_TEMPLE_WEST_CENTRAL_UPPER, {[]{return CanTakeDamage;}}), + Entrance(RR_FIRE_TEMPLE_WEST_CLIMB, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_HAMMER_RETURN_PATH, {[]{return CanUse(RG_MEGATON_HAMMER);}}), }); - areaTable[FIRE_TEMPLE_HAMMER_RETURN_PATH] = Area("Fire Temple Hammer Return Path", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_HAMMER_RETURN_PATH] = Area("Fire Temple Hammer Return Path", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(FIRE_TEMPLE_ABOVE_FIRE_MAZE, {[]{return CanUse(MEGATON_HAMMER);}}), + Entrance(RR_FIRE_TEMPLE_ABOVE_FIRE_MAZE, {[]{return CanUse(RG_MEGATON_HAMMER);}}), }); - areaTable[FIRE_TEMPLE_ABOVE_FIRE_MAZE] = Area("Fire Temple Above Fire Maze", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_ABOVE_FIRE_MAZE] = Area("Fire Temple Above Fire Maze", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(FIRE_TEMPLE_HAMMER_RETURN_PATH, {[]{return true;}}), - Entrance(FIRE_TEMPLE_FIRE_MAZE_UPPER, {[]{return CanUse(MEGATON_HAMMER);}}), + Entrance(RR_FIRE_TEMPLE_HAMMER_RETURN_PATH, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_FIRE_MAZE_UPPER, {[]{return CanUse(RG_MEGATON_HAMMER);}}), }); } @@ -312,110 +312,110 @@ void AreaTable_Init_FireTemple() { | MASTER QUEST DUNGEON | ---------------------------*/ if (Dungeon::FireTemple.IsMQ()) { - areaTable[FIRE_TEMPLE_MQ_LOWER] = Area("Fire Temple MQ Lower", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_LOWER] = Area("Fire Temple MQ Lower", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, {[]{return IsAdult || KokiriSword || Sticks || Slingshot || Bombs || CanUse(DINS_FIRE);}}), - LocationAccess(FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, {[]{return IsAdult && (LogicFewerTunicRequirements || CanUse(GORON_TUNIC)) && (((CanUse(HOVER_BOOTS) || (LogicFireMQNearBoss && CanUse(BOW))) && HasFireSource) || (CanUse(HOOKSHOT) && CanUse(FIRE_ARROWS) || (CanUse(DINS_FIRE) && ((DamageMultiplier.IsNot(DAMAGEMULTIPLIER_OHKO) && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_QUADRUPLE) && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_OCTUPLE) && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_SEXDECUPLE)) || CanUse(GORON_TUNIC) || CanUse(BOW) || CanUse(LONGSHOT)))));}}), - //Trick: IsAdult && (LogicFewerTunicRequirements || CanUse(GORON_TUNIC)) && (((CanUse(HOVER_BOOTS) || (LogicFireMQNearBoss && CanUse(BOW))) && HasFireSource) || (CanUse(HOOKSHOT) && CanUse(FIRE_ARROWS) || (CanUse(DINS_FIRE) && ((DamageMultiplier.IsNot(DAMAGEMULTIPLIER_OHKO) && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_QUADRUPLE) && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_OCTUPLE) && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_SEXDECUPLE)) || CanUse(GORON_TUNIC) || CanUse(BOW) || CanUse(LONGSHOT))))) + LocationAccess(RC_FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, {[]{return IsAdult || KokiriSword || Sticks || Slingshot || Bombs || CanUse(RG_DINS_FIRE);}}), + LocationAccess(RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, {[]{return IsAdult && (LogicFewerTunicRequirements || CanUse(RG_GORON_TUNIC)) && (((CanUse(RG_HOVER_BOOTS) || (LogicFireMQNearBoss && CanUse(RG_FAIRY_BOW))) && HasFireSource) || (CanUse(RG_HOOKSHOT) && CanUse(RG_FIRE_ARROWS) || (CanUse(RG_DINS_FIRE) && ((DamageMultiplier.IsNot(DAMAGEMULTIPLIER_OHKO) && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_QUADRUPLE) && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_OCTUPLE) && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_SEXDECUPLE)) || CanUse(RG_GORON_TUNIC) || CanUse(RG_FAIRY_BOW) || CanUse(RG_LONGSHOT)))));}}), + //Trick: IsAdult && (LogicFewerTunicRequirements || CanUse(RG_GORON_TUNIC)) && (((CanUse(RG_HOVER_BOOTS) || (LogicFireMQNearBoss && CanUse(RG_FAIRY_BOW))) && HasFireSource) || (CanUse(RG_HOOKSHOT) && CanUse(RG_FIRE_ARROWS) || (CanUse(RG_DINS_FIRE) && ((DamageMultiplier.IsNot(DAMAGEMULTIPLIER_OHKO) && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_QUADRUPLE) && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_OCTUPLE) && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_SEXDECUPLE)) || CanUse(RG_GORON_TUNIC) || CanUse(RG_FAIRY_BOW) || CanUse(RG_LONGSHOT))))) }, { //Exits - Entrance(FIRE_TEMPLE_ENTRYWAY, {[]{return true;}}), - Entrance(FIRE_TEMPLE_BOSS_ENTRYWAY, {[]{return IsAdult && CanUse(GORON_TUNIC) && CanUse(MEGATON_HAMMER) && BossKeyFireTemple && ((HasFireSource && (LogicFireBossDoorJump || HoverBoots)) || HasAccessTo(FIRE_TEMPLE_MQ_UPPER));}}), - Entrance(FIRE_TEMPLE_MQ_LOWER_LOCKED_DOOR, {[]{return SmallKeys(FIRE_TEMPLE, 5) && (IsAdult || KokiriSword);}}), - Entrance(FIRE_TEMPLE_MQ_BIG_LAVA_ROOM, {[]{return IsAdult && FireTimer >= 24 && CanUse(MEGATON_HAMMER);}}), + Entrance(RR_FIRE_TEMPLE_ENTRYWAY, {[]{return true;}}), + Entrance(RR_FIRE_TEMPLE_BOSS_ENTRYWAY, {[]{return IsAdult && CanUse(RG_GORON_TUNIC) && CanUse(RG_MEGATON_HAMMER) && BossKeyFireTemple && ((HasFireSource && (LogicFireBossDoorJump || HoverBoots)) || HasAccessTo(RR_FIRE_TEMPLE_MQ_UPPER));}}), + Entrance(RR_FIRE_TEMPLE_MQ_LOWER_LOCKED_DOOR, {[]{return SmallKeys(RR_FIRE_TEMPLE, 5) && (IsAdult || KokiriSword);}}), + Entrance(RR_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM, {[]{return IsAdult && FireTimer >= 24 && CanUse(RG_MEGATON_HAMMER);}}), }); - areaTable[FIRE_TEMPLE_MQ_LOWER_LOCKED_DOOR] = Area("Fire Temple MQ Lower Locked Door", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FIRE_TEMPLE_MQ_LOWER_LOCKED_DOOR] = Area("Fire Temple MQ Lower Locked Door", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&FairyPot, {[]{return true;}}), }, { //Locations - LocationAccess(FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, {[]{return IsAdult && (HasExplosives || Hammer || Hookshot);}}), - LocationAccess(FIRE_TEMPLE_MQ_MAP_CHEST, {[]{return IsAdult && CanUse(MEGATON_HAMMER);}}), + LocationAccess(RC_FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, {[]{return IsAdult && (HasExplosives || Hammer || Hookshot);}}), + LocationAccess(RC_FIRE_TEMPLE_MQ_MAP_CHEST, {[]{return IsAdult && CanUse(RG_MEGATON_HAMMER);}}), }, {}); - areaTable[FIRE_TEMPLE_MQ_BIG_LAVA_ROOM] = Area("Fire Temple MQ Big Lava Room", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM] = Area("Fire Temple MQ Big Lava Room", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&FairyPot, {[]{return FairyPot || (HasFireSource && (Bow || LogicFireMQBKChest) && IsAdult && (CanUse(HOOKSHOT) || LogicFireSongOfTime));}}), - //Trick: HasFireSource && (Bow || LogicFireMQBKChest) && IsAdult && (CanUse(HOOKSHOT) || LogicFireSongOfTime) + EventAccess(&FairyPot, {[]{return FairyPot || (HasFireSource && (Bow || LogicFireMQBKChest) && IsAdult && (CanUse(RG_HOOKSHOT) || LogicFireSongOfTime));}}), + //Trick: HasFireSource && (Bow || LogicFireMQBKChest) && IsAdult && (CanUse(RG_HOOKSHOT) || LogicFireSongOfTime) }, { //Locations - LocationAccess(FIRE_TEMPLE_MQ_BOSS_KEY_CHEST, {[]{return HasFireSource && (Bow || LogicFireMQBKChest) && IsAdult && CanUse(HOOKSHOT);}}), - //Trick: HasFireSource && (Bow || LogicFireMQBKChest) && IsAdult && CanUse(HOOKSHOT) - LocationAccess(FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, {[]{return HasFireSource && HasExplosives && IsAdult && (CanUse(HOOKSHOT) || LogicFireMQBlockedChest);}}), - //Trick: HasFireSource && HasExplosives && IsAdult && (CanUse(HOOKSHOT) || LogicFireMQBlockedChest) - LocationAccess(FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, {[]{return true;}}), + LocationAccess(RC_FIRE_TEMPLE_MQ_BOSS_KEY_CHEST, {[]{return HasFireSource && (Bow || LogicFireMQBKChest) && IsAdult && CanUse(RG_HOOKSHOT);}}), + //Trick: HasFireSource && (Bow || LogicFireMQBKChest) && IsAdult && CanUse(RG_HOOKSHOT) + LocationAccess(RC_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, {[]{return HasFireSource && HasExplosives && IsAdult && (CanUse(RG_HOOKSHOT) || LogicFireMQBlockedChest);}}), + //Trick: HasFireSource && HasExplosives && IsAdult && (CanUse(RG_HOOKSHOT) || LogicFireMQBlockedChest) + LocationAccess(RC_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, {[]{return true;}}), }, { //Exits - Entrance(FIRE_TEMPLE_MQ_LOWER_MAZE, {[]{return IsAdult && CanUse(GORON_TUNIC) && SmallKeys(FIRE_TEMPLE, 2) && (HasFireSource || (LogicFireMQClimb && HoverBoots));}}), - //Trick: IsAdult && CanUse(GORON_TUNIC) && SmallKeys(FIRE_TEMPLE, 2) && (HasFireSource || (LogicFireMQClimb && HoverBoots)) + Entrance(RR_FIRE_TEMPLE_MQ_LOWER_MAZE, {[]{return IsAdult && CanUse(RG_GORON_TUNIC) && SmallKeys(RR_FIRE_TEMPLE, 2) && (HasFireSource || (LogicFireMQClimb && HoverBoots));}}), + //Trick: IsAdult && CanUse(RG_GORON_TUNIC) && SmallKeys(RR_FIRE_TEMPLE, 2) && (HasFireSource || (LogicFireMQClimb && HoverBoots)) }); - areaTable[FIRE_TEMPLE_MQ_LOWER_MAZE] = Area("Fire Temple MQ Lower Maze", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_LOWER_MAZE] = Area("Fire Temple MQ Lower Maze", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, {[]{return true;}}), - LocationAccess(FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, {[]{return HasExplosives && (LogicFireMQMazeSideRoom || HasAccessTo(FIRE_TEMPLE_MQ_UPPER_MAZE));}}), + LocationAccess(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, {[]{return true;}}), + LocationAccess(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, {[]{return HasExplosives && (LogicFireMQMazeSideRoom || HasAccessTo(RR_FIRE_TEMPLE_MQ_UPPER_MAZE));}}), //Trick: HasExplosives && (LogicFireMQMazeSideRoom || FIRE_TEMPLE_MQ_UPPER_MAZE.Adult()) }, { //Exits - Entrance(FIRE_TEMPLE_MQ_UPPER_MAZE, {[]{return (IsAdult && ((HasExplosives && CanUse(HOOKSHOT)) || (LogicFireMQMazeHovers && CanUse(HOVER_BOOTS)))) || LogicFireMQMazeJump;}}), - //Trick: (IsAdult && ((HasExplosives && CanUse(HOOKSHOT)) || (LogicFireMQMazeHovers && CanUse(HOVER_BOOTS)))) || LogicFireMQMazeJump + Entrance(RR_FIRE_TEMPLE_MQ_UPPER_MAZE, {[]{return (IsAdult && ((HasExplosives && CanUse(RG_HOOKSHOT)) || (LogicFireMQMazeHovers && CanUse(RG_HOVER_BOOTS)))) || LogicFireMQMazeJump;}}), + //Trick: (IsAdult && ((HasExplosives && CanUse(RG_HOOKSHOT)) || (LogicFireMQMazeHovers && CanUse(RG_HOVER_BOOTS)))) || LogicFireMQMazeJump }); - areaTable[FIRE_TEMPLE_MQ_UPPER_MAZE] = Area("Fire Temple MQ Upper Maze", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FIRE_TEMPLE_MQ_UPPER_MAZE] = Area("Fire Temple MQ Upper Maze", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, { //Events - //EventAccess(&WallFairy, {[]{return WallFairy || (IsAdult && (((CanPlay(SongOfTime) && CanUse(HOOKSHOT) && HasExplosives) || CanUse(LONGSHOT))));}}), - EventAccess(&FairyPot, {[]{return SmallKeys(FIRE_TEMPLE, 3);}}), + //EventAccess(&WallFairy, {[]{return WallFairy || (IsAdult && (((CanPlay(SongOfTime) && CanUse(RG_HOOKSHOT) && HasExplosives) || CanUse(RG_LONGSHOT))));}}), + EventAccess(&FairyPot, {[]{return SmallKeys(RR_FIRE_TEMPLE, 3);}}), }, { //Locations - LocationAccess(FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, {[]{return true;}}), - LocationAccess(FIRE_TEMPLE_MQ_COMPASS_CHEST, {[]{return HasExplosives;}}), - LocationAccess(FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE, {[]{return IsAdult && ((CanPlay(SongOfTime) && CanUse(HOOKSHOT) && HasExplosives) || CanUse(LONGSHOT));}}), + LocationAccess(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, {[]{return true;}}), + LocationAccess(RC_FIRE_TEMPLE_MQ_COMPASS_CHEST, {[]{return HasExplosives;}}), + LocationAccess(RC_FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE, {[]{return IsAdult && ((CanPlay(SongOfTime) && CanUse(RG_HOOKSHOT) && HasExplosives) || CanUse(RG_LONGSHOT));}}), }, { //Exits - Entrance(FIRE_TEMPLE_MQ_UPPER, {[]{return SmallKeys(FIRE_TEMPLE, 3) && IsAdult && ((CanUse(BOW) && CanUse(HOOKSHOT)) || CanUse(FIRE_ARROWS));}}), + Entrance(RR_FIRE_TEMPLE_MQ_UPPER, {[]{return SmallKeys(RR_FIRE_TEMPLE, 3) && IsAdult && ((CanUse(RG_FAIRY_BOW) && CanUse(RG_HOOKSHOT)) || CanUse(RG_FIRE_ARROWS));}}), }); - areaTable[FIRE_TEMPLE_MQ_UPPER] = Area("Fire Temple MQ Upper", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_UPPER] = Area("Fire Temple MQ Upper", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FIRE_TEMPLE_MQ_FREESTANDING_KEY, {[]{return (IsAdult && CanUse(HOOKSHOT)) || LogicFireMQFlameMaze;}}), - //Trick: (IsAdult && CanUse(HOOKSHOT)) || LogicFireMQFlameMaze - LocationAccess(FIRE_TEMPLE_MQ_CHEST_ON_FIRE, {[]{return ((IsAdult && CanUse(HOOKSHOT)) || LogicFireMQFlameMaze) && SmallKeys(FIRE_TEMPLE, 4);}}), - //Trick: ((IsAdult && CanUse(HOOKSHOT)) || LogicFireMQFlameMaze) && SmallKeys(FIRE_TEMPLE, 4) - LocationAccess(FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, {[]{return CanPlay(SongOfTime) || HoverBoots || LogicFireMQFlameMaze;}}), + LocationAccess(RC_FIRE_TEMPLE_MQ_FREESTANDING_KEY, {[]{return (IsAdult && CanUse(RG_HOOKSHOT)) || LogicFireMQFlameMaze;}}), + //Trick: (IsAdult && CanUse(RG_HOOKSHOT)) || LogicFireMQFlameMaze + LocationAccess(RC_FIRE_TEMPLE_MQ_CHEST_ON_FIRE, {[]{return ((IsAdult && CanUse(RG_HOOKSHOT)) || LogicFireMQFlameMaze) && SmallKeys(RR_FIRE_TEMPLE, 4);}}), + //Trick: ((IsAdult && CanUse(RG_HOOKSHOT)) || LogicFireMQFlameMaze) && SmallKeys(RR_FIRE_TEMPLE, 4) + LocationAccess(RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, {[]{return CanPlay(SongOfTime) || HoverBoots || LogicFireMQFlameMaze;}}), //Trick: CanPlay(SongOfTime) || HoverBoots || LogicFireMQFlameMaze - LocationAccess(FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER, {[]{return HasExplosives;}}), - LocationAccess(FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE, {[]{return (IsAdult && CanUse(HOOKSHOT) && SmallKeys(FIRE_TEMPLE, 5)) || (LogicFireMQAboveMazeGS && IsAdult && CanUse(LONGSHOT));}}), - //Trick: (IsAdult && CanUse(HOOKSHOT) && SmallKeys(FIRE_TEMPLE, 5)) || (LogicFireMQAboveMazeGS && IsAdult && CanUse(LONGSHOT)) + LocationAccess(RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER, {[]{return HasExplosives;}}), + LocationAccess(RC_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE, {[]{return (IsAdult && CanUse(RG_HOOKSHOT) && SmallKeys(RR_FIRE_TEMPLE, 5)) || (LogicFireMQAboveMazeGS && IsAdult && CanUse(RG_LONGSHOT));}}), + //Trick: (IsAdult && CanUse(RG_HOOKSHOT) && SmallKeys(RR_FIRE_TEMPLE, 5)) || (LogicFireMQAboveMazeGS && IsAdult && CanUse(RG_LONGSHOT)) }, {}); } /*--------------------------- | BOSS ROOM | ---------------------------*/ - areaTable[FIRE_TEMPLE_BOSS_ENTRYWAY] = - Area("Fire Temple Boss Entryway", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, + areaTable[RR_FIRE_TEMPLE_BOSS_ENTRYWAY] = + Area("Fire Temple Boss Entryway", "Fire Temple", RHT_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { // Exits - Entrance(FIRE_TEMPLE_NEAR_BOSS_ROOM, { [] { return Dungeon::FireTemple.IsVanilla() && false; } }), - Entrance(FIRE_TEMPLE_MQ_LOWER, { [] { return Dungeon::FireTemple.IsMQ() && false; } }), - Entrance(FIRE_TEMPLE_BOSS_ROOM, { [] { return true; } }), + Entrance(RR_FIRE_TEMPLE_NEAR_BOSS_ROOM, { [] { return Dungeon::FireTemple.IsVanilla() && false; } }), + Entrance(RR_FIRE_TEMPLE_MQ_LOWER, { [] { return Dungeon::FireTemple.IsMQ() && false; } }), + Entrance(RR_FIRE_TEMPLE_BOSS_ROOM, { [] { return true; } }), }); - areaTable[FIRE_TEMPLE_BOSS_ROOM] = - Area("Fire Temple Boss Room", "Fire Temple", NONE, NO_DAY_NIGHT_CYCLE, + areaTable[RR_FIRE_TEMPLE_BOSS_ROOM] = + Area("Fire Temple Boss Room", "Fire Temple", RHT_NONE, NO_DAY_NIGHT_CYCLE, { // Events EventAccess(&FireTempleClear, - { [] { return FireTempleClear || (FireTimer >= 64 && CanUse(MEGATON_HAMMER)); }}), + { [] { return FireTempleClear || (FireTimer >= 64 && CanUse(RG_MEGATON_HAMMER)); }}), }, { // Locations - LocationAccess(FIRE_TEMPLE_VOLVAGIA_HEART, { [] { return FireTempleClear; } }), - LocationAccess(VOLVAGIA, { [] { return FireTempleClear; } }), + LocationAccess(RC_FIRE_TEMPLE_VOLVAGIA_HEART, { [] { return FireTempleClear; } }), + LocationAccess(RC_VOLVAGIA, { [] { return FireTempleClear; } }), }, { // Exits - Entrance(FIRE_TEMPLE_BOSS_ENTRYWAY, { [] { return false; } }), + Entrance(RR_FIRE_TEMPLE_BOSS_ENTRYWAY, { [] { return false; } }), }); } 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 d4e95e15c..d6c21d704 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 @@ -10,269 +10,269 @@ void AreaTable_Init_ForestTemple() { /*-------------------------- | VANILLA/MQ DECIDER | ---------------------------*/ - areaTable[FOREST_TEMPLE_ENTRYWAY] = Area("Forest Temple Entryway", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_ENTRYWAY] = Area("Forest Temple Entryway", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(FOREST_TEMPLE_FIRST_ROOM, {[]{return Dungeon::ForestTemple.IsVanilla();}}), - Entrance(FOREST_TEMPLE_MQ_LOBBY, {[]{return Dungeon::ForestTemple.IsMQ();}}), - Entrance(SACRED_FOREST_MEADOW, {[]{return true;}}), + Entrance(RR_FOREST_TEMPLE_FIRST_ROOM, {[]{return Dungeon::ForestTemple.IsVanilla();}}), + Entrance(RR_FOREST_TEMPLE_MQ_LOBBY, {[]{return Dungeon::ForestTemple.IsMQ();}}), + Entrance(RR_SACRED_FOREST_MEADOW, {[]{return true;}}), }); /*-------------------------- | VANILLA DUNGEON | ---------------------------*/ if (Dungeon::ForestTemple.IsVanilla()) { - areaTable[FOREST_TEMPLE_FIRST_ROOM] = Area("Forest Temple First Room", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_FIRST_ROOM] = Area("Forest Temple First Room", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FOREST_TEMPLE_FIRST_ROOM_CHEST, {[]{return true;}}), - LocationAccess(FOREST_TEMPLE_GS_FIRST_ROOM, {[]{return (IsAdult && Bombs) || CanUse(BOW) || CanUse(HOOKSHOT) || CanUse(BOOMERANG) || CanUse(SLINGSHOT) || HasBombchus || CanUse(DINS_FIRE) || (LogicForestFirstGS && (CanJumpslash || (IsChild && Bombs)));}}), + LocationAccess(RC_FOREST_TEMPLE_FIRST_ROOM_CHEST, {[]{return true;}}), + LocationAccess(RC_FOREST_TEMPLE_GS_FIRST_ROOM, {[]{return (IsAdult && Bombs) || CanUse(RG_FAIRY_BOW) || CanUse(RG_HOOKSHOT) || CanUse(RG_BOOMERANG) || CanUse(RG_FAIRY_SLINGSHOT) || HasBombchus || CanUse(RG_DINS_FIRE) || (LogicForestFirstGS && (CanJumpslash || (IsChild && Bombs)));}}), }, { //Exits - Entrance(FOREST_TEMPLE_ENTRYWAY, {[]{return true;}}), - Entrance(FOREST_TEMPLE_SOUTH_CORRIDOR, {[]{return true;}}), + Entrance(RR_FOREST_TEMPLE_ENTRYWAY, {[]{return true;}}), + Entrance(RR_FOREST_TEMPLE_SOUTH_CORRIDOR, {[]{return true;}}), }); - areaTable[FOREST_TEMPLE_SOUTH_CORRIDOR] = Area("Forest Temple South Corridor", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_SOUTH_CORRIDOR] = Area("Forest Temple South Corridor", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(FOREST_TEMPLE_FIRST_ROOM, {[]{return true;}}), - Entrance(FOREST_TEMPLE_LOBBY, {[]{return IsAdult || CanChildAttack || Nuts;}}), + Entrance(RR_FOREST_TEMPLE_FIRST_ROOM, {[]{return true;}}), + Entrance(RR_FOREST_TEMPLE_LOBBY, {[]{return IsAdult || CanChildAttack || Nuts;}}), }); - areaTable[FOREST_TEMPLE_LOBBY] = Area("Forest Temple Lobby", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_LOBBY] = Area("Forest Temple Lobby", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&ForestTempleMeg, {[]{return ForestTempleMeg || (ForestTempleJoelle && ForestTempleBeth && ForestTempleAmy && CanUse(BOW));}}), + EventAccess(&ForestTempleMeg, {[]{return ForestTempleMeg || (ForestTempleJoelle && ForestTempleBeth && ForestTempleAmy && CanUse(RG_FAIRY_BOW));}}), }, { //Locations - LocationAccess(FOREST_TEMPLE_GS_LOBBY, {[]{return HookshotOrBoomerang;}}), + LocationAccess(RC_FOREST_TEMPLE_GS_LOBBY, {[]{return HookshotOrBoomerang;}}), }, { //Exits - Entrance(FOREST_TEMPLE_SOUTH_CORRIDOR, {[]{return true;}}), - Entrance(FOREST_TEMPLE_NORTH_CORRIDOR, {[]{return true;}}), - Entrance(FOREST_TEMPLE_NW_OUTDOORS_LOWER, {[]{return CanPlay(SongOfTime) || IsChild;}}), - Entrance(FOREST_TEMPLE_NE_OUTDOORS_LOWER, {[]{return CanUse(BOW) || CanUse(SLINGSHOT);}}), - Entrance(FOREST_TEMPLE_WEST_CORRIDOR, {[]{return SmallKeys(FOREST_TEMPLE, 1, 5);}}), - Entrance(FOREST_TEMPLE_EAST_CORRIDOR, {[]{return false;}}), - Entrance(FOREST_TEMPLE_BOSS_REGION, {[]{return ForestTempleMeg;}}), - Entrance(FOREST_TEMPLE_BOSS_ENTRYWAY, {[]{return false;}}), + Entrance(RR_FOREST_TEMPLE_SOUTH_CORRIDOR, {[]{return true;}}), + Entrance(RR_FOREST_TEMPLE_NORTH_CORRIDOR, {[]{return true;}}), + Entrance(RR_FOREST_TEMPLE_NW_OUTDOORS_LOWER, {[]{return CanPlay(SongOfTime) || IsChild;}}), + Entrance(RR_FOREST_TEMPLE_NE_OUTDOORS_LOWER, {[]{return CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT);}}), + Entrance(RR_FOREST_TEMPLE_WEST_CORRIDOR, {[]{return SmallKeys(RR_FOREST_TEMPLE, 1, 5);}}), + Entrance(RR_FOREST_TEMPLE_EAST_CORRIDOR, {[]{return false;}}), + Entrance(RR_FOREST_TEMPLE_BOSS_REGION, {[]{return ForestTempleMeg;}}), + Entrance(RR_FOREST_TEMPLE_BOSS_ENTRYWAY, {[]{return false;}}), }); - areaTable[FOREST_TEMPLE_NORTH_CORRIDOR] = Area("Forest Temple North Corridor", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_NORTH_CORRIDOR] = Area("Forest Temple North Corridor", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(FOREST_TEMPLE_LOBBY, {[]{return true;}}), - Entrance(FOREST_TEMPLE_LOWER_STALFOS, {[]{return true;}}), + Entrance(RR_FOREST_TEMPLE_LOBBY, {[]{return true;}}), + Entrance(RR_FOREST_TEMPLE_LOWER_STALFOS, {[]{return true;}}), }); - areaTable[FOREST_TEMPLE_LOWER_STALFOS] = Area("Forest Temple Lower Stalfos", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_LOWER_STALFOS] = Area("Forest Temple Lower Stalfos", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&FairyPot, {[]{return true;}}), }, { //Locations - LocationAccess(FOREST_TEMPLE_FIRST_STALFOS_CHEST, {[]{return IsAdult || KokiriSword;}}), + LocationAccess(RC_FOREST_TEMPLE_FIRST_STALFOS_CHEST, {[]{return IsAdult || KokiriSword;}}), }, { //Exits - Entrance(FOREST_TEMPLE_NORTH_CORRIDOR, {[]{return true;}}), + Entrance(RR_FOREST_TEMPLE_NORTH_CORRIDOR, {[]{return true;}}), }); - areaTable[FOREST_TEMPLE_NW_OUTDOORS_LOWER] = Area("Forest Temple NW Outdoors Lower", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_NW_OUTDOORS_LOWER] = Area("Forest Temple NW Outdoors Lower", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (IsAdult || KokiriSword || Boomerang);}}), - EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (IsAdult || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(DINS_FIRE));}}), + EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (IsAdult || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(RG_DINS_FIRE));}}), }, { //Locations - LocationAccess(FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, {[]{return CanUse(LONGSHOT) || Here(FOREST_TEMPLE_NW_OUTDOORS_UPPER, []{return HookshotOrBoomerang;});}}), + LocationAccess(RC_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, {[]{return CanUse(RG_LONGSHOT) || Here(RR_FOREST_TEMPLE_NW_OUTDOORS_UPPER, []{return HookshotOrBoomerang;});}}), }, { //Exits - Entrance(FOREST_TEMPLE_LOBBY, {[]{return CanPlay(SongOfTime);}}), - Entrance(FOREST_TEMPLE_NW_OUTDOORS_UPPER, {[]{return false;}}), - Entrance(FOREST_TEMPLE_MAP_ROOM, {[]{return true;}}), - Entrance(FOREST_TEMPLE_SEWER, {[]{return GoldScale || CanUse(IRON_BOOTS) || HasAccessTo(FOREST_TEMPLE_NE_OUTDOORS_UPPER);}}), - Entrance(FOREST_TEMPLE_BOSS_ENTRYWAY, {[]{return false;}}), + Entrance(RR_FOREST_TEMPLE_LOBBY, {[]{return CanPlay(SongOfTime);}}), + Entrance(RR_FOREST_TEMPLE_NW_OUTDOORS_UPPER, {[]{return false;}}), + Entrance(RR_FOREST_TEMPLE_MAP_ROOM, {[]{return true;}}), + Entrance(RR_FOREST_TEMPLE_SEWER, {[]{return GoldScale || CanUse(RG_IRON_BOOTS) || HasAccessTo(RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER);}}), + Entrance(RR_FOREST_TEMPLE_BOSS_ENTRYWAY, {[]{return false;}}), }); - areaTable[FOREST_TEMPLE_NW_OUTDOORS_UPPER] = Area("Forest Temple NW Outdoors Upper", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_NW_OUTDOORS_UPPER] = Area("Forest Temple NW Outdoors Upper", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (IsAdult || KokiriSword || Boomerang);}}), - EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (IsAdult || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(DINS_FIRE));}}), + EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (IsAdult || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(RG_DINS_FIRE));}}), }, {}, { //Exits - Entrance(FOREST_TEMPLE_NW_OUTDOORS_LOWER, {[]{return true;}}), - Entrance(FOREST_TEMPLE_BELOW_BOSS_KEY_CHEST, {[]{return true;}}), - Entrance(FOREST_TEMPLE_FLOORMASTER_ROOM, {[]{return true;}}), - Entrance(FOREST_TEMPLE_BLOCK_PUSH_ROOM, {[]{return true;}}), + Entrance(RR_FOREST_TEMPLE_NW_OUTDOORS_LOWER, {[]{return true;}}), + Entrance(RR_FOREST_TEMPLE_BELOW_BOSS_KEY_CHEST, {[]{return true;}}), + Entrance(RR_FOREST_TEMPLE_FLOORMASTER_ROOM, {[]{return true;}}), + Entrance(RR_FOREST_TEMPLE_BLOCK_PUSH_ROOM, {[]{return true;}}), }); - areaTable[FOREST_TEMPLE_NE_OUTDOORS_LOWER] = Area("Forest Temple NE Outdoors Lower", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_NE_OUTDOORS_LOWER] = Area("Forest Temple NE Outdoors Lower", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (IsAdult || KokiriSword || Boomerang);}}), - EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (IsAdult || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(DINS_FIRE));}}), + EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (IsAdult || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(RG_DINS_FIRE));}}), }, { //Locations - LocationAccess(FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, {[]{return CanUse(HOOKSHOT) || HasAccessTo(FOREST_TEMPLE_FALLING_ROOM) || (HasAccessTo(FOREST_TEMPLE_NE_OUTDOORS_UPPER) && IsAdult && LogicForestOutdoorsLedge && HoverBoots);}}), - LocationAccess(FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, {[]{return CanUse(HOOKSHOT) || (LogicForestOutdoorEastGS && CanUse(BOOMERANG)) || Here(FOREST_TEMPLE_FALLING_ROOM, []{return CanUse(BOW) || CanUse(SLINGSHOT) || CanUse(DINS_FIRE) || HasExplosives;});}}), + LocationAccess(RC_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, {[]{return CanUse(RG_HOOKSHOT) || HasAccessTo(RR_FOREST_TEMPLE_FALLING_ROOM) || (HasAccessTo(RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER) && IsAdult && LogicForestOutdoorsLedge && HoverBoots);}}), + LocationAccess(RC_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, {[]{return CanUse(RG_HOOKSHOT) || (LogicForestOutdoorEastGS && CanUse(RG_BOOMERANG)) || Here(RR_FOREST_TEMPLE_FALLING_ROOM, []{return CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_DINS_FIRE) || HasExplosives;});}}), }, { //Exits - Entrance(FOREST_TEMPLE_LOBBY, {[]{return true;}}), - Entrance(FOREST_TEMPLE_NE_OUTDOORS_UPPER, {[]{return CanUse(LONGSHOT) || (LogicForestVines && CanUse(HOOKSHOT));}}), - Entrance(FOREST_TEMPLE_SEWER, {[]{return GoldScale || CanUse(IRON_BOOTS) || HasAccessTo(FOREST_TEMPLE_NE_OUTDOORS_UPPER);}}), - Entrance(FOREST_TEMPLE_FALLING_ROOM, {[]{return false;}}), + Entrance(RR_FOREST_TEMPLE_LOBBY, {[]{return true;}}), + Entrance(RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER, {[]{return CanUse(RG_LONGSHOT) || (LogicForestVines && CanUse(RG_HOOKSHOT));}}), + Entrance(RR_FOREST_TEMPLE_SEWER, {[]{return GoldScale || CanUse(RG_IRON_BOOTS) || HasAccessTo(RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER);}}), + Entrance(RR_FOREST_TEMPLE_FALLING_ROOM, {[]{return false;}}), }); - areaTable[FOREST_TEMPLE_NE_OUTDOORS_UPPER] = Area("Forest Temple NE Outdoors Upper", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER] = Area("Forest Temple NE Outdoors Upper", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (IsAdult || KokiriSword || Boomerang);}}), - EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (IsAdult || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(DINS_FIRE));}}), + EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (IsAdult || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(RG_DINS_FIRE));}}), }, {}, { //Exits - Entrance(FOREST_TEMPLE_NE_OUTDOORS_LOWER, {[]{return true;}}), - Entrance(FOREST_TEMPLE_MAP_ROOM, {[]{return true;}}), - Entrance(FOREST_TEMPLE_FALLING_ROOM, {[]{return LogicForestDoorFrame && CanUse(HOVER_BOOTS) && CanUse(SCARECROW);}}), + Entrance(RR_FOREST_TEMPLE_NE_OUTDOORS_LOWER, {[]{return true;}}), + Entrance(RR_FOREST_TEMPLE_MAP_ROOM, {[]{return true;}}), + Entrance(RR_FOREST_TEMPLE_FALLING_ROOM, {[]{return LogicForestDoorFrame && CanUse(RG_HOVER_BOOTS) && CanUse(RG_SCARECROW);}}), }); - areaTable[FOREST_TEMPLE_MAP_ROOM] = Area("Forest Temple Map Room", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_MAP_ROOM] = Area("Forest Temple Map Room", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FOREST_TEMPLE_MAP_CHEST, {[]{return Here(FOREST_TEMPLE_MAP_ROOM, []{return HasExplosives || CanUse(MEGATON_HAMMER) || CanUse(BOW) || ((IsAdult || Sticks || KokiriSword || Slingshot) && (Nuts || HookshotOrBoomerang || CanShield));});}}), + LocationAccess(RC_FOREST_TEMPLE_MAP_CHEST, {[]{return Here(RR_FOREST_TEMPLE_MAP_ROOM, []{return HasExplosives || CanUse(RG_MEGATON_HAMMER) || CanUse(RG_FAIRY_BOW) || ((IsAdult || Sticks || KokiriSword || Slingshot) && (Nuts || HookshotOrBoomerang || CanShield));});}}), }, { //Exits - Entrance(FOREST_TEMPLE_NW_OUTDOORS_LOWER, {[]{return Here(FOREST_TEMPLE_MAP_ROOM, []{return HasExplosives || CanUse(MEGATON_HAMMER) || CanUse(BOW) || ((IsAdult || Sticks || KokiriSword || Slingshot) && (Nuts || HookshotOrBoomerang || CanShield));});}}), - Entrance(FOREST_TEMPLE_NE_OUTDOORS_UPPER, {[]{return Here(FOREST_TEMPLE_MAP_ROOM, []{return HasExplosives || CanUse(MEGATON_HAMMER) || CanUse(BOW) || ((IsAdult || Sticks || KokiriSword || Slingshot) && (Nuts || HookshotOrBoomerang || CanShield));});}}), + Entrance(RR_FOREST_TEMPLE_NW_OUTDOORS_LOWER, {[]{return Here(RR_FOREST_TEMPLE_MAP_ROOM, []{return HasExplosives || CanUse(RG_MEGATON_HAMMER) || CanUse(RG_FAIRY_BOW) || ((IsAdult || Sticks || KokiriSword || Slingshot) && (Nuts || HookshotOrBoomerang || CanShield));});}}), + Entrance(RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER, {[]{return Here(RR_FOREST_TEMPLE_MAP_ROOM, []{return HasExplosives || CanUse(RG_MEGATON_HAMMER) || CanUse(RG_FAIRY_BOW) || ((IsAdult || Sticks || KokiriSword || Slingshot) && (Nuts || HookshotOrBoomerang || CanShield));});}}), }); - areaTable[FOREST_TEMPLE_SEWER] = Area("Forest Temple Sewer", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_SEWER] = Area("Forest Temple Sewer", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FOREST_TEMPLE_WELL_CHEST, {[]{return HasAccessTo(FOREST_TEMPLE_NE_OUTDOORS_UPPER);}}), + LocationAccess(RC_FOREST_TEMPLE_WELL_CHEST, {[]{return HasAccessTo(RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER);}}), }, { //Exits - Entrance(FOREST_TEMPLE_NW_OUTDOORS_LOWER, {[]{return true;}}), - Entrance(FOREST_TEMPLE_NE_OUTDOORS_LOWER, {[]{return true;}}), + Entrance(RR_FOREST_TEMPLE_NW_OUTDOORS_LOWER, {[]{return true;}}), + Entrance(RR_FOREST_TEMPLE_NE_OUTDOORS_LOWER, {[]{return true;}}), }); - areaTable[FOREST_TEMPLE_BELOW_BOSS_KEY_CHEST] = Area("Forest Temple Below Boss Key Chest", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_BELOW_BOSS_KEY_CHEST] = Area("Forest Temple Below Boss Key Chest", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(FOREST_TEMPLE_NW_OUTDOORS_UPPER, {[]{return Here(FOREST_TEMPLE_BELOW_BOSS_KEY_CHEST, []{return HasExplosives || CanUse(MEGATON_HAMMER) || CanUse(BOW) || ((IsAdult || Sticks || KokiriSword || Slingshot) && (Nuts || HookshotOrBoomerang || CanShield));});}}), + Entrance(RR_FOREST_TEMPLE_NW_OUTDOORS_UPPER, {[]{return Here(RR_FOREST_TEMPLE_BELOW_BOSS_KEY_CHEST, []{return HasExplosives || CanUse(RG_MEGATON_HAMMER) || CanUse(RG_FAIRY_BOW) || ((IsAdult || Sticks || KokiriSword || Slingshot) && (Nuts || HookshotOrBoomerang || CanShield));});}}), }); - areaTable[FOREST_TEMPLE_FLOORMASTER_ROOM] = Area("Forest Temple Floormaster Room", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_FLOORMASTER_ROOM] = Area("Forest Temple Floormaster Room", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FOREST_TEMPLE_FLOORMASTER_CHEST, {[]{return IsAdult || CanChildDamage;}}), + LocationAccess(RC_FOREST_TEMPLE_FLOORMASTER_CHEST, {[]{return IsAdult || CanChildDamage;}}), }, { //Exits - Entrance(FOREST_TEMPLE_NW_OUTDOORS_UPPER, {[]{return true;}}), + Entrance(RR_FOREST_TEMPLE_NW_OUTDOORS_UPPER, {[]{return true;}}), }); - areaTable[FOREST_TEMPLE_WEST_CORRIDOR] = Area("Forest Temple West Corridor", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_WEST_CORRIDOR] = Area("Forest Temple West Corridor", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(FOREST_TEMPLE_LOBBY, {[]{return SmallKeys(FOREST_TEMPLE, 1, 5);}}), - Entrance(FOREST_TEMPLE_BLOCK_PUSH_ROOM, {[]{return IsAdult || CanChildAttack || Nuts;}}), + Entrance(RR_FOREST_TEMPLE_LOBBY, {[]{return SmallKeys(RR_FOREST_TEMPLE, 1, 5);}}), + Entrance(RR_FOREST_TEMPLE_BLOCK_PUSH_ROOM, {[]{return IsAdult || CanChildAttack || Nuts;}}), }); - areaTable[FOREST_TEMPLE_BLOCK_PUSH_ROOM] = Area("Forest Temple Block Push Room", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_BLOCK_PUSH_ROOM] = Area("Forest Temple Block Push Room", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FOREST_TEMPLE_EYE_SWITCH_CHEST, {[]{return GoronBracelet && (CanUse(BOW) || CanUse(SLINGSHOT));}}), + LocationAccess(RC_FOREST_TEMPLE_EYE_SWITCH_CHEST, {[]{return GoronBracelet && (CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT));}}), }, { //Exits - Entrance(FOREST_TEMPLE_WEST_CORRIDOR, {[]{return true;}}), - Entrance(FOREST_TEMPLE_NW_OUTDOORS_UPPER, {[]{return CanUse(HOVER_BOOTS) || (LogicForestOutsideBackdoor && CanJumpslash && GoronBracelet);}}), - Entrance(FOREST_TEMPLE_NW_CORRIDOR_TWISTED, {[]{return IsAdult && GoronBracelet && SmallKeys(FOREST_TEMPLE, 2);}}), - Entrance(FOREST_TEMPLE_NW_CORRIDOR_STRAIGHTENED, {[]{return CanUse(BOW) && GoronBracelet && SmallKeys(FOREST_TEMPLE, 2);}}), + Entrance(RR_FOREST_TEMPLE_WEST_CORRIDOR, {[]{return true;}}), + Entrance(RR_FOREST_TEMPLE_NW_OUTDOORS_UPPER, {[]{return CanUse(RG_HOVER_BOOTS) || (LogicForestOutsideBackdoor && CanJumpslash && GoronBracelet);}}), + Entrance(RR_FOREST_TEMPLE_NW_CORRIDOR_TWISTED, {[]{return IsAdult && GoronBracelet && SmallKeys(RR_FOREST_TEMPLE, 2);}}), + Entrance(RR_FOREST_TEMPLE_NW_CORRIDOR_STRAIGHTENED, {[]{return CanUse(RG_FAIRY_BOW) && GoronBracelet && SmallKeys(RR_FOREST_TEMPLE, 2);}}), }); - areaTable[FOREST_TEMPLE_NW_CORRIDOR_TWISTED] = Area("Forest Temple NW Corridor Twisted", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_NW_CORRIDOR_TWISTED] = Area("Forest Temple NW Corridor Twisted", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(FOREST_TEMPLE_BLOCK_PUSH_ROOM, {[]{return SmallKeys(FOREST_TEMPLE, 2);}}), - Entrance(FOREST_TEMPLE_RED_POE_ROOM, {[]{return SmallKeys(FOREST_TEMPLE, 3);}}), + Entrance(RR_FOREST_TEMPLE_BLOCK_PUSH_ROOM, {[]{return SmallKeys(RR_FOREST_TEMPLE, 2);}}), + Entrance(RR_FOREST_TEMPLE_RED_POE_ROOM, {[]{return SmallKeys(RR_FOREST_TEMPLE, 3);}}), }); - areaTable[FOREST_TEMPLE_NW_CORRIDOR_STRAIGHTENED] = Area("Forest Temple NW Corridor Straightened", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_NW_CORRIDOR_STRAIGHTENED] = Area("Forest Temple NW Corridor Straightened", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FOREST_TEMPLE_BOSS_KEY_CHEST, {[]{return true;}}), + LocationAccess(RC_FOREST_TEMPLE_BOSS_KEY_CHEST, {[]{return true;}}), }, { //Exits - Entrance(FOREST_TEMPLE_BELOW_BOSS_KEY_CHEST, {[]{return true;}}), - Entrance(FOREST_TEMPLE_BLOCK_PUSH_ROOM, {[]{return SmallKeys(FOREST_TEMPLE, 2);}}), + Entrance(RR_FOREST_TEMPLE_BELOW_BOSS_KEY_CHEST, {[]{return true;}}), + Entrance(RR_FOREST_TEMPLE_BLOCK_PUSH_ROOM, {[]{return SmallKeys(RR_FOREST_TEMPLE, 2);}}), }); - areaTable[FOREST_TEMPLE_RED_POE_ROOM] = Area("Forest Temple Red Poe Room", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_RED_POE_ROOM] = Area("Forest Temple Red Poe Room", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&ForestTempleJoelle, {[]{return ForestTempleJoelle || CanUse(BOW);}}), + EventAccess(&ForestTempleJoelle, {[]{return ForestTempleJoelle || CanUse(RG_FAIRY_BOW);}}), }, { //Locations - LocationAccess(FOREST_TEMPLE_RED_POE_CHEST, {[]{return ForestTempleJoelle;}}), + LocationAccess(RC_FOREST_TEMPLE_RED_POE_CHEST, {[]{return ForestTempleJoelle;}}), }, { //Exits - Entrance(FOREST_TEMPLE_NW_CORRIDOR_TWISTED, {[]{return SmallKeys(FOREST_TEMPLE, 3);}}), - Entrance(FOREST_TEMPLE_UPPER_STALFOS, {[]{return true;}}), + Entrance(RR_FOREST_TEMPLE_NW_CORRIDOR_TWISTED, {[]{return SmallKeys(RR_FOREST_TEMPLE, 3);}}), + Entrance(RR_FOREST_TEMPLE_UPPER_STALFOS, {[]{return true;}}), }); - areaTable[FOREST_TEMPLE_UPPER_STALFOS] = Area("Forest Temple Upper Stalfos", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_UPPER_STALFOS] = Area("Forest Temple Upper Stalfos", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FOREST_TEMPLE_BOW_CHEST, {[]{return IsAdult || KokiriSword;}}), + LocationAccess(RC_FOREST_TEMPLE_BOW_CHEST, {[]{return IsAdult || KokiriSword;}}), }, { //Exits - Entrance(FOREST_TEMPLE_RED_POE_ROOM, {[]{return IsAdult || KokiriSword;}}), - Entrance(FOREST_TEMPLE_BLUE_POE_ROOM, {[]{return IsAdult || KokiriSword;}}), + Entrance(RR_FOREST_TEMPLE_RED_POE_ROOM, {[]{return IsAdult || KokiriSword;}}), + Entrance(RR_FOREST_TEMPLE_BLUE_POE_ROOM, {[]{return IsAdult || KokiriSword;}}), }); - areaTable[FOREST_TEMPLE_BLUE_POE_ROOM] = Area("Forest Temple Blue Poe Room", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_BLUE_POE_ROOM] = Area("Forest Temple Blue Poe Room", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&ForestTempleBeth, {[]{return ForestTempleBeth || CanUse(BOW);}}), + EventAccess(&ForestTempleBeth, {[]{return ForestTempleBeth || CanUse(RG_FAIRY_BOW);}}), }, { //Locations - LocationAccess(FOREST_TEMPLE_BLUE_POE_CHEST, {[]{return ForestTempleBeth;}}), + LocationAccess(RC_FOREST_TEMPLE_BLUE_POE_CHEST, {[]{return ForestTempleBeth;}}), }, { //Exits - Entrance(FOREST_TEMPLE_UPPER_STALFOS, {[]{return true;}}), - Entrance(FOREST_TEMPLE_NE_CORRIDOR_STRAIGHTENED, {[]{return SmallKeys(FOREST_TEMPLE, 4);}}), + Entrance(RR_FOREST_TEMPLE_UPPER_STALFOS, {[]{return true;}}), + Entrance(RR_FOREST_TEMPLE_NE_CORRIDOR_STRAIGHTENED, {[]{return SmallKeys(RR_FOREST_TEMPLE, 4);}}), }); - areaTable[FOREST_TEMPLE_NE_CORRIDOR_STRAIGHTENED] = Area("Forest Temple NE Corridor Straightened", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_NE_CORRIDOR_STRAIGHTENED] = Area("Forest Temple NE Corridor Straightened", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(FOREST_TEMPLE_BLUE_POE_ROOM, {[]{return SmallKeys(FOREST_TEMPLE, 4);}}), - Entrance(FOREST_TEMPLE_FROZEN_EYE_ROOM, {[]{return SmallKeys(FOREST_TEMPLE, 5);}}), + Entrance(RR_FOREST_TEMPLE_BLUE_POE_ROOM, {[]{return SmallKeys(RR_FOREST_TEMPLE, 4);}}), + Entrance(RR_FOREST_TEMPLE_FROZEN_EYE_ROOM, {[]{return SmallKeys(RR_FOREST_TEMPLE, 5);}}), }); - areaTable[FOREST_TEMPLE_NE_CORRIDOR_TWISTED] = Area("Forest Temple NE Corridor Twisted", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_NE_CORRIDOR_TWISTED] = Area("Forest Temple NE Corridor Twisted", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(FOREST_TEMPLE_FROZEN_EYE_ROOM, {[]{return SmallKeys(FOREST_TEMPLE, 5);}}), - Entrance(FOREST_TEMPLE_FALLING_ROOM, {[]{return true;}}), + Entrance(RR_FOREST_TEMPLE_FROZEN_EYE_ROOM, {[]{return SmallKeys(RR_FOREST_TEMPLE, 5);}}), + Entrance(RR_FOREST_TEMPLE_FALLING_ROOM, {[]{return true;}}), }); - areaTable[FOREST_TEMPLE_FROZEN_EYE_ROOM] = Area("Forest Temple Frozen Eye Room", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_FROZEN_EYE_ROOM] = Area("Forest Temple Frozen Eye Room", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(FOREST_TEMPLE_NE_CORRIDOR_STRAIGHTENED, {[]{return SmallKeys(FOREST_TEMPLE, 5);}}), - Entrance(FOREST_TEMPLE_NE_CORRIDOR_TWISTED, {[]{return SmallKeys(FOREST_TEMPLE, 5) && (CanUse(BOW) || CanUse(DINS_FIRE));}}), + Entrance(RR_FOREST_TEMPLE_NE_CORRIDOR_STRAIGHTENED, {[]{return SmallKeys(RR_FOREST_TEMPLE, 5);}}), + Entrance(RR_FOREST_TEMPLE_NE_CORRIDOR_TWISTED, {[]{return SmallKeys(RR_FOREST_TEMPLE, 5) && (CanUse(RG_FAIRY_BOW) || CanUse(RG_DINS_FIRE));}}), }); - areaTable[FOREST_TEMPLE_FALLING_ROOM] = Area("Forest Temple Falling Room", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_FALLING_ROOM] = Area("Forest Temple Falling Room", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST, {[]{return true;}}), + LocationAccess(RC_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST, {[]{return true;}}), }, { //Exits - Entrance(FOREST_TEMPLE_NE_OUTDOORS_LOWER, {[]{return true;}}), - Entrance(FOREST_TEMPLE_GREEN_POE_ROOM, {[]{return true;}}), + Entrance(RR_FOREST_TEMPLE_NE_OUTDOORS_LOWER, {[]{return true;}}), + Entrance(RR_FOREST_TEMPLE_GREEN_POE_ROOM, {[]{return true;}}), }); - areaTable[FOREST_TEMPLE_GREEN_POE_ROOM] = Area("Forest Temple Green Poe Room", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_GREEN_POE_ROOM] = Area("Forest Temple Green Poe Room", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&ForestTempleAmy, {[]{return ForestTempleAmy || CanUse(BOW);}}), + EventAccess(&ForestTempleAmy, {[]{return ForestTempleAmy || CanUse(RG_FAIRY_BOW);}}), }, {}, { //Exits - Entrance(FOREST_TEMPLE_FALLING_ROOM, {[]{return true;}}), - Entrance(FOREST_TEMPLE_EAST_CORRIDOR, {[]{return ForestTempleAmy;}}), + Entrance(RR_FOREST_TEMPLE_FALLING_ROOM, {[]{return true;}}), + Entrance(RR_FOREST_TEMPLE_EAST_CORRIDOR, {[]{return ForestTempleAmy;}}), }); - areaTable[FOREST_TEMPLE_EAST_CORRIDOR] = Area("Forest Temple East Corridor", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_EAST_CORRIDOR] = Area("Forest Temple East Corridor", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(FOREST_TEMPLE_LOBBY, {[]{return IsAdult || CanChildAttack || Nuts;}}), - Entrance(FOREST_TEMPLE_GREEN_POE_ROOM, {[]{return IsAdult || CanChildAttack || Nuts;}}), + Entrance(RR_FOREST_TEMPLE_LOBBY, {[]{return IsAdult || CanChildAttack || Nuts;}}), + Entrance(RR_FOREST_TEMPLE_GREEN_POE_ROOM, {[]{return IsAdult || CanChildAttack || Nuts;}}), }); - areaTable[FOREST_TEMPLE_BOSS_REGION] = Area("Forest Temple Boss Region", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_BOSS_REGION] = Area("Forest Temple Boss Region", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FOREST_TEMPLE_BASEMENT_CHEST, {[]{return true;}}), - LocationAccess(FOREST_TEMPLE_GS_BASEMENT, {[]{return HookshotOrBoomerang;}}), + LocationAccess(RC_FOREST_TEMPLE_BASEMENT_CHEST, {[]{return true;}}), + LocationAccess(RC_FOREST_TEMPLE_GS_BASEMENT, {[]{return HookshotOrBoomerang;}}), }, { //Exits - Entrance(FOREST_TEMPLE_LOBBY, {[]{return true;}}), - Entrance(FOREST_TEMPLE_BOSS_ENTRYWAY, {[]{return BossKeyForestTemple;}}), + Entrance(RR_FOREST_TEMPLE_LOBBY, {[]{return true;}}), + Entrance(RR_FOREST_TEMPLE_BOSS_ENTRYWAY, {[]{return BossKeyForestTemple;}}), }); } @@ -280,158 +280,158 @@ void AreaTable_Init_ForestTemple() { | MASTER QUEST DUNGEON | ---------------------------*/ if (Dungeon::ForestTemple.IsMQ()) { - areaTable[FOREST_TEMPLE_MQ_LOBBY] = Area("Forest Temple MQ Lobby", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_MQ_LOBBY] = Area("Forest Temple MQ Lobby", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST, {[]{return IsAdult || Bombs || CanUse(STICKS) || Nuts || CanUse(BOOMERANG) || CanUse(DINS_FIRE) || KokiriSword || CanUse(SLINGSHOT);}}), - LocationAccess(FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY, {[]{return HookshotOrBoomerang;}}), + LocationAccess(RC_FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST, {[]{return IsAdult || Bombs || CanUse(RG_STICKS) || Nuts || CanUse(RG_BOOMERANG) || CanUse(RG_DINS_FIRE) || KokiriSword || CanUse(RG_FAIRY_SLINGSHOT);}}), + LocationAccess(RC_FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY, {[]{return HookshotOrBoomerang;}}), }, { //Exits - Entrance(FOREST_TEMPLE_ENTRYWAY, {[]{return true;}}), - Entrance(FOREST_TEMPLE_MQ_CENTRAL_AREA, {[]{return SmallKeys(FOREST_TEMPLE, 1) && (IsAdult || CanChildAttack || Nuts);}}), + Entrance(RR_FOREST_TEMPLE_ENTRYWAY, {[]{return true;}}), + Entrance(RR_FOREST_TEMPLE_MQ_CENTRAL_AREA, {[]{return SmallKeys(RR_FOREST_TEMPLE, 1) && (IsAdult || CanChildAttack || Nuts);}}), }); - areaTable[FOREST_TEMPLE_MQ_CENTRAL_AREA] = Area("Forest Temple MQ Central Area", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_MQ_CENTRAL_AREA] = Area("Forest Temple MQ Central Area", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&FairyPot, {[]{return true;}}), }, { //Locations - LocationAccess(FOREST_TEMPLE_MQ_WOLFOS_CHEST, {[]{return (CanPlay(SongOfTime) || IsChild) && (IsAdult || CanUse(DINS_FIRE) || CanUse(STICKS) || CanUse(SLINGSHOT) || KokiriSword);}}), - LocationAccess(FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM, {[]{return IsAdult || KokiriSword;}}), + LocationAccess(RC_FOREST_TEMPLE_MQ_WOLFOS_CHEST, {[]{return (CanPlay(SongOfTime) || IsChild) && (IsAdult || CanUse(RG_DINS_FIRE) || CanUse(RG_STICKS) || CanUse(RG_FAIRY_SLINGSHOT) || KokiriSword);}}), + LocationAccess(RC_FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM, {[]{return IsAdult || KokiriSword;}}), }, { //Exits - Entrance(FOREST_TEMPLE_MQ_NW_OUTDOORS, {[]{return (IsAdult && CanUse(BOW)) || (IsChild && CanUse(SLINGSHOT));}}), - Entrance(FOREST_TEMPLE_MQ_NE_OUTDOORS, {[]{return (IsAdult && CanUse(BOW)) || (IsChild && CanUse(SLINGSHOT));}}), //This is as far as child can get - Entrance(FOREST_TEMPLE_MQ_AFTER_BLOCK_PUZZLE, {[]{return IsAdult && (GoronBracelet || (LogicForestMQBlockPuzzle && HasBombchus && IsAdult && CanUse(HOOKSHOT)));}}), - //Trick: IsAdult && (GoronBracelet || (LogicForestMQBlockPuzzle && HasBombchus && IsAdult && CanUse(HOOKSHOT))) - Entrance(FOREST_TEMPLE_MQ_OUTDOOR_LEDGE, {[]{return (LogicForestMQHallwaySwitchJS && IsAdult && CanUse(HOVER_BOOTS)) || (LogicForestMQHallwaySwitchBoomerang && CanUse(BOOMERANG)) || (LogicForestMQHallwaySwitchHookshot && IsAdult && CanUse(HOOKSHOT));}}), - //Trick (Hookshot trick not added to either n64 or oot3d rando as of yet, to enable in SoH needs uncommenting in randomizer_tricks.cpp): (LogicForestMQHallwaySwitchJS && IsAdult && CanUse(HOVER_BOOTS)) || (LogicForestMQHallwaySwitchHookshot && IsAdult && CanUse(HOOKSHOT)) - Entrance(FOREST_TEMPLE_MQ_BOSS_REGION, {[]{return ForestTempleJoAndBeth && ForestTempleAmyAndMeg;}}), + Entrance(RR_FOREST_TEMPLE_MQ_NW_OUTDOORS, {[]{return (IsAdult && CanUse(RG_FAIRY_BOW)) || (IsChild && CanUse(RG_FAIRY_SLINGSHOT));}}), + Entrance(RR_FOREST_TEMPLE_MQ_NE_OUTDOORS, {[]{return (IsAdult && CanUse(RG_FAIRY_BOW)) || (IsChild && CanUse(RG_FAIRY_SLINGSHOT));}}), //This is as far as child can get + Entrance(RR_FOREST_TEMPLE_MQ_AFTER_BLOCK_PUZZLE, {[]{return IsAdult && (GoronBracelet || (LogicForestMQBlockPuzzle && HasBombchus && IsAdult && CanUse(RG_HOOKSHOT)));}}), + //Trick: IsAdult && (GoronBracelet || (LogicForestMQBlockPuzzle && HasBombchus && IsAdult && CanUse(RG_HOOKSHOT))) + Entrance(RR_FOREST_TEMPLE_MQ_OUTDOOR_LEDGE, {[]{return (LogicForestMQHallwaySwitchJS && IsAdult && CanUse(RG_HOVER_BOOTS)) || (LogicForestMQHallwaySwitchBoomerang && CanUse(RG_BOOMERANG)) || (LogicForestMQHallwaySwitchHookshot && IsAdult && CanUse(RG_HOOKSHOT));}}), + //Trick (Hookshot trick not added to either n64 or oot3d rando as of yet, to enable in SoH needs uncommenting in randomizer_tricks.cpp): (LogicForestMQHallwaySwitchJS && IsAdult && CanUse(RG_HOVER_BOOTS)) || (LogicForestMQHallwaySwitchHookshot && IsAdult && CanUse(RG_HOOKSHOT)) + Entrance(RR_FOREST_TEMPLE_MQ_BOSS_REGION, {[]{return ForestTempleJoAndBeth && ForestTempleAmyAndMeg;}}), }); - areaTable[FOREST_TEMPLE_MQ_AFTER_BLOCK_PUZZLE] = Area("Forest Temple MQ After Block Puzzle", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_MQ_AFTER_BLOCK_PUZZLE] = Area("Forest Temple MQ After Block Puzzle", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FOREST_TEMPLE_MQ_BOSS_KEY_CHEST, {[]{return SmallKeys(FOREST_TEMPLE, 3);}}), + LocationAccess(RC_FOREST_TEMPLE_MQ_BOSS_KEY_CHEST, {[]{return SmallKeys(RR_FOREST_TEMPLE, 3);}}), }, { //Exits - Entrance(FOREST_TEMPLE_MQ_BOW_REGION, {[]{return SmallKeys(FOREST_TEMPLE, 4);}}), - Entrance(FOREST_TEMPLE_MQ_OUTDOOR_LEDGE, {[]{return SmallKeys(FOREST_TEMPLE, 3) || (LogicForestMQHallwaySwitchJS && ((IsAdult && CanUse(HOOKSHOT)) || (LogicForestOutsideBackdoor && (IsAdult || (IsChild && CanUse(STICKS))))));}}), - //Trick (Doing the hallway switch jumpslash as child requires sticks and has been added above): SmallKeys(FOREST_TEMPLE, 3) || (LogicForestMQHallwaySwitchJS && ((IsAdult && CanUse(HOOKSHOT)) || LogicForestOutsideBackdoor)) - Entrance(FOREST_TEMPLE_MQ_NW_OUTDOORS, {[]{return SmallKeys(FOREST_TEMPLE, 2);}}), + Entrance(RR_FOREST_TEMPLE_MQ_BOW_REGION, {[]{return SmallKeys(RR_FOREST_TEMPLE, 4);}}), + Entrance(RR_FOREST_TEMPLE_MQ_OUTDOOR_LEDGE, {[]{return SmallKeys(RR_FOREST_TEMPLE, 3) || (LogicForestMQHallwaySwitchJS && ((IsAdult && CanUse(RG_HOOKSHOT)) || (LogicForestOutsideBackdoor && (IsAdult || (IsChild && CanUse(RG_STICKS))))));}}), + //Trick (Doing the hallway switch jumpslash as child requires sticks and has been added above): SmallKeys(RR_FOREST_TEMPLE, 3) || (LogicForestMQHallwaySwitchJS && ((IsAdult && CanUse(RG_HOOKSHOT)) || LogicForestOutsideBackdoor)) + Entrance(RR_FOREST_TEMPLE_MQ_NW_OUTDOORS, {[]{return SmallKeys(RR_FOREST_TEMPLE, 2);}}), }); - areaTable[FOREST_TEMPLE_MQ_OUTDOOR_LEDGE] = Area("Forest Temple MQ Outdoor Ledge", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_MQ_OUTDOOR_LEDGE] = Area("Forest Temple MQ Outdoor Ledge", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FOREST_TEMPLE_MQ_REDEAD_CHEST, {[]{return true;}}), + LocationAccess(RC_FOREST_TEMPLE_MQ_REDEAD_CHEST, {[]{return true;}}), }, { //Exits - Entrance(FOREST_TEMPLE_MQ_NW_OUTDOORS, {[]{return true;}}), + Entrance(RR_FOREST_TEMPLE_MQ_NW_OUTDOORS, {[]{return true;}}), }); - areaTable[FOREST_TEMPLE_MQ_NW_OUTDOORS] = Area("Forest Temple MQ NW Outdoors", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_MQ_NW_OUTDOORS] = Area("Forest Temple MQ NW Outdoors", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, {[]{return true;}}), + LocationAccess(RC_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, {[]{return true;}}), }, { //Exits - Entrance(FOREST_TEMPLE_MQ_NE_OUTDOORS, {[]{return (IsAdult && (CanUse(IRON_BOOTS) || CanUse(LONGSHOT) || (LogicForestMQWellSwim && CanUse(HOOKSHOT)))) || ProgressiveScale >= 2;}}), - //Trick: (IsAdult && (CanUse(IRON_BOOTS) || CanUse(LONGSHOT) || (LogicForestMQWellSwim && CanUse(HOOKSHOT)))) || ProgressiveScale >= 2 - Entrance(FOREST_TEMPLE_MQ_OUTDOORS_TOP_LEDGES, {[]{return IsAdult && CanUse(FIRE_ARROWS);}}), + Entrance(RR_FOREST_TEMPLE_MQ_NE_OUTDOORS, {[]{return (IsAdult && (CanUse(RG_IRON_BOOTS) || CanUse(RG_LONGSHOT) || (LogicForestMQWellSwim && CanUse(RG_HOOKSHOT)))) || ProgressiveScale >= 2;}}), + //Trick: (IsAdult && (CanUse(RG_IRON_BOOTS) || CanUse(RG_LONGSHOT) || (LogicForestMQWellSwim && CanUse(RG_HOOKSHOT)))) || ProgressiveScale >= 2 + Entrance(RR_FOREST_TEMPLE_MQ_OUTDOORS_TOP_LEDGES, {[]{return IsAdult && CanUse(RG_FIRE_ARROWS);}}), }); - areaTable[FOREST_TEMPLE_MQ_NE_OUTDOORS] = Area("Forest Temple MQ NE Outdoors", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_MQ_NE_OUTDOORS] = Area("Forest Temple MQ NE Outdoors", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (IsAdult || KokiriSword || Boomerang);}}), - EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (IsAdult || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(DINS_FIRE));}}), + EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (IsAdult || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(RG_DINS_FIRE));}}), }, { //Locations - LocationAccess(FOREST_TEMPLE_MQ_WELL_CHEST, {[]{return (IsAdult && CanUse(BOW)) || (IsChild && CanUse(SLINGSHOT));}}), - LocationAccess(FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, {[]{return HookshotOrBoomerang || (IsAdult && CanUse(FIRE_ARROWS) && (CanPlay(SongOfTime) || (CanUse(HOVER_BOOTS) && LogicForestDoorFrame)));}}), - LocationAccess(FOREST_TEMPLE_MQ_GS_WELL, {[]{return (IsAdult && ((CanUse(IRON_BOOTS) && CanUse(HOOKSHOT)) || CanUse(BOW))) || (IsChild && CanUse(SLINGSHOT));}}), + LocationAccess(RC_FOREST_TEMPLE_MQ_WELL_CHEST, {[]{return (IsAdult && CanUse(RG_FAIRY_BOW)) || (IsChild && CanUse(RG_FAIRY_SLINGSHOT));}}), + LocationAccess(RC_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, {[]{return HookshotOrBoomerang || (IsAdult && CanUse(RG_FIRE_ARROWS) && (CanPlay(SongOfTime) || (CanUse(RG_HOVER_BOOTS) && LogicForestDoorFrame)));}}), + LocationAccess(RC_FOREST_TEMPLE_MQ_GS_WELL, {[]{return (IsAdult && ((CanUse(RG_IRON_BOOTS) && CanUse(RG_HOOKSHOT)) || CanUse(RG_FAIRY_BOW))) || (IsChild && CanUse(RG_FAIRY_SLINGSHOT));}}), }, { //Exits - Entrance(FOREST_TEMPLE_MQ_OUTDOORS_TOP_LEDGES, {[]{return IsAdult && CanUse(HOOKSHOT) && (CanUse(LONGSHOT) || CanUse(HOVER_BOOTS) || CanPlay(SongOfTime));}}), - Entrance(FOREST_TEMPLE_MQ_NE_OUTDOORS_LEDGE, {[]{return IsAdult && CanUse(LONGSHOT);}}), + Entrance(RR_FOREST_TEMPLE_MQ_OUTDOORS_TOP_LEDGES, {[]{return IsAdult && CanUse(RG_HOOKSHOT) && (CanUse(RG_LONGSHOT) || CanUse(RG_HOVER_BOOTS) || CanPlay(SongOfTime));}}), + Entrance(RR_FOREST_TEMPLE_MQ_NE_OUTDOORS_LEDGE, {[]{return IsAdult && CanUse(RG_LONGSHOT);}}), }); - areaTable[FOREST_TEMPLE_MQ_OUTDOORS_TOP_LEDGES] = Area("Forest Temple MQ Outdoors Top Ledges", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_MQ_OUTDOORS_TOP_LEDGES] = Area("Forest Temple MQ Outdoors Top Ledges", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST, {[]{return true;}}), + LocationAccess(RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST, {[]{return true;}}), }, { //Exits - Entrance(FOREST_TEMPLE_MQ_NE_OUTDOORS, {[]{return true;}}), - Entrance(FOREST_TEMPLE_MQ_NE_OUTDOORS_LEDGE, {[]{return LogicForestOutdoorsLedge && IsAdult && CanUse(HOVER_BOOTS);}}), - //Trick: LogicForestOutdoorsLedge && IsAdult && CanUse(HOVER_BOOTS) + Entrance(RR_FOREST_TEMPLE_MQ_NE_OUTDOORS, {[]{return true;}}), + Entrance(RR_FOREST_TEMPLE_MQ_NE_OUTDOORS_LEDGE, {[]{return LogicForestOutdoorsLedge && IsAdult && CanUse(RG_HOVER_BOOTS);}}), + //Trick: LogicForestOutdoorsLedge && IsAdult && CanUse(RG_HOVER_BOOTS) }); - areaTable[FOREST_TEMPLE_MQ_NE_OUTDOORS_LEDGE] = Area("Forest Temple MQ NE Outdoors Ledge", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_MQ_NE_OUTDOORS_LEDGE] = Area("Forest Temple MQ NE Outdoors Ledge", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST, {[]{return true;}}), + LocationAccess(RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST, {[]{return true;}}), }, { //Exits - Entrance(FOREST_TEMPLE_MQ_NE_OUTDOORS, {[]{return true;}}), - Entrance(FOREST_TEMPLE_MQ_FALLING_ROOM, {[]{return CanPlay(SongOfTime);}}), + Entrance(RR_FOREST_TEMPLE_MQ_NE_OUTDOORS, {[]{return true;}}), + Entrance(RR_FOREST_TEMPLE_MQ_FALLING_ROOM, {[]{return CanPlay(SongOfTime);}}), }); - areaTable[FOREST_TEMPLE_MQ_BOW_REGION] = Area("Forest Temple MQ Bow Region", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_MQ_BOW_REGION] = Area("Forest Temple MQ Bow Region", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&ForestTempleJoAndBeth, {[]{return ForestTempleJoAndBeth || (IsAdult && CanUse(BOW));}}), + EventAccess(&ForestTempleJoAndBeth, {[]{return ForestTempleJoAndBeth || (IsAdult && CanUse(RG_FAIRY_BOW));}}), }, { //Locations - LocationAccess(FOREST_TEMPLE_MQ_BOW_CHEST, {[]{return true;}}), - LocationAccess(FOREST_TEMPLE_MQ_MAP_CHEST, {[]{return IsAdult && CanUse(BOW);}}), - LocationAccess(FOREST_TEMPLE_MQ_COMPASS_CHEST, {[]{return IsAdult && CanUse(BOW);}}), + LocationAccess(RC_FOREST_TEMPLE_MQ_BOW_CHEST, {[]{return true;}}), + LocationAccess(RC_FOREST_TEMPLE_MQ_MAP_CHEST, {[]{return IsAdult && CanUse(RG_FAIRY_BOW);}}), + LocationAccess(RC_FOREST_TEMPLE_MQ_COMPASS_CHEST, {[]{return IsAdult && CanUse(RG_FAIRY_BOW);}}), }, { //Exits - Entrance(FOREST_TEMPLE_MQ_FALLING_ROOM, {[]{return SmallKeys(FOREST_TEMPLE, 5) && ((IsAdult && CanUse(BOW)) || CanUse(DINS_FIRE));}}), + Entrance(RR_FOREST_TEMPLE_MQ_FALLING_ROOM, {[]{return SmallKeys(RR_FOREST_TEMPLE, 5) && ((IsAdult && CanUse(RG_FAIRY_BOW)) || CanUse(RG_DINS_FIRE));}}), }); - areaTable[FOREST_TEMPLE_MQ_FALLING_ROOM] = Area("Forest Temple MQ Falling Room", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_MQ_FALLING_ROOM] = Area("Forest Temple MQ Falling Room", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&ForestTempleAmyAndMeg, {[]{return ForestTempleAmyAndMeg || (IsAdult && CanUse(BOW) && SmallKeys(FOREST_TEMPLE, 6));}}), + EventAccess(&ForestTempleAmyAndMeg, {[]{return ForestTempleAmyAndMeg || (IsAdult && CanUse(RG_FAIRY_BOW) && SmallKeys(RR_FOREST_TEMPLE, 6));}}), }, { //Locations - LocationAccess(FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST, {[]{return true;}}), + LocationAccess(RC_FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST, {[]{return true;}}), }, { //Exits - Entrance(FOREST_TEMPLE_MQ_NE_OUTDOORS_LEDGE, {[]{return true;}}), + Entrance(RR_FOREST_TEMPLE_MQ_NE_OUTDOORS_LEDGE, {[]{return true;}}), }); - areaTable[FOREST_TEMPLE_MQ_BOSS_REGION] = Area("Forest Temple MQ Boss Region", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_MQ_BOSS_REGION] = Area("Forest Temple MQ Boss Region", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FOREST_TEMPLE_MQ_BASEMENT_CHEST, {[]{return true;}}), + LocationAccess(RC_FOREST_TEMPLE_MQ_BASEMENT_CHEST, {[]{return true;}}), }, { //Exits - Entrance(FOREST_TEMPLE_BOSS_ENTRYWAY, {[]{return BossKeyForestTemple;}}), + Entrance(RR_FOREST_TEMPLE_BOSS_ENTRYWAY, {[]{return BossKeyForestTemple;}}), }); } /*--------------------------- | BOSS ROOM | ---------------------------*/ - areaTable[FOREST_TEMPLE_BOSS_ENTRYWAY] = - Area("Forest Temple Boss Entryway", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, + areaTable[RR_FOREST_TEMPLE_BOSS_ENTRYWAY] = + Area("Forest Temple Boss Entryway", "Forest Temple", RHT_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { // Exits - Entrance(FOREST_TEMPLE_BOSS_REGION, { [] { return Dungeon::ForestTemple.IsVanilla() && false; } }), - Entrance(FOREST_TEMPLE_MQ_BOSS_REGION, { [] { return Dungeon::ForestTemple.IsMQ() && false; } }), - Entrance(FOREST_TEMPLE_BOSS_ROOM, { [] { return true; } }), + Entrance(RR_FOREST_TEMPLE_BOSS_REGION, { [] { return Dungeon::ForestTemple.IsVanilla() && false; } }), + Entrance(RR_FOREST_TEMPLE_MQ_BOSS_REGION, { [] { return Dungeon::ForestTemple.IsMQ() && false; } }), + Entrance(RR_FOREST_TEMPLE_BOSS_ROOM, { [] { return true; } }), }); - areaTable[FOREST_TEMPLE_BOSS_ROOM] = Area( - "Forest Temple Boss Room", "Forest Temple", NONE, NO_DAY_NIGHT_CYCLE, + areaTable[RR_FOREST_TEMPLE_BOSS_ROOM] = Area( + "Forest Temple Boss Room", "Forest Temple", RHT_NONE, NO_DAY_NIGHT_CYCLE, { // Events EventAccess(&ForestTempleClear, { [] { - return ForestTempleClear || ((CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)) && - (CanUse(HOOKSHOT) || CanUse(BOW) || CanUse(SLINGSHOT))); + return ForestTempleClear || ((CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD)) && + (CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT))); } }), }, { // Locations - LocationAccess(FOREST_TEMPLE_PHANTOM_GANON_HEART, { [] { return ForestTempleClear; } }), - LocationAccess(PHANTOM_GANON, { [] { return ForestTempleClear; } }), + LocationAccess(RC_FOREST_TEMPLE_PHANTOM_GANON_HEART, { [] { return ForestTempleClear; } }), + LocationAccess(RC_PHANTOM_GANON, { [] { return ForestTempleClear; } }), }, { // Exits - Entrance(FOREST_TEMPLE_BOSS_ENTRYWAY, { [] { return false; } }), + Entrance(RR_FOREST_TEMPLE_BOSS_ENTRYWAY, { [] { return false; } }), }); } 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 ebb8625ec..3aa73962f 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 @@ -11,203 +11,203 @@ void AreaTable_Init_GanonsCastle() { /*-------------------------- | VANILLA/MQ DECIDER | ---------------------------*/ - areaTable[GANONS_CASTLE_ENTRYWAY] = Area("Ganon's Castle Entryway", "Ganon's Castle", GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GANONS_CASTLE_ENTRYWAY] = Area("Ganon's Castle Entryway", "Ganon's Castle", RHT_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(GANONS_CASTLE_LOBBY, {[]{return Dungeon::GanonsCastle.IsVanilla();}}), - Entrance(GANONS_CASTLE_MQ_LOBBY, {[]{return Dungeon::GanonsCastle.IsMQ();}}), - Entrance(CASTLE_GROUNDS_FROM_GANONS_CASTLE, {[]{return true;}}), + Entrance(RR_GANONS_CASTLE_LOBBY, {[]{return Dungeon::GanonsCastle.IsVanilla();}}), + Entrance(RR_GANONS_CASTLE_MQ_LOBBY, {[]{return Dungeon::GanonsCastle.IsMQ();}}), + Entrance(RR_CASTLE_GROUNDS_FROM_GANONS_CASTLE, {[]{return true;}}), }); /*-------------------------- | VANILLA DUNGEON | ---------------------------*/ if (Dungeon::GanonsCastle.IsVanilla()) { - areaTable[GANONS_CASTLE_LOBBY] = Area("Ganon's Castle Lobby", "Ganon's Castle", GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GANONS_CASTLE_LOBBY] = Area("Ganon's Castle Lobby", "Ganon's Castle", RHT_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(GANONS_CASTLE_ENTRYWAY, {[]{return true;}}), - Entrance(GANONS_CASTLE_FOREST_TRIAL, {[]{return true;}}), - Entrance(GANONS_CASTLE_FIRE_TRIAL, {[]{return true;}}), - Entrance(GANONS_CASTLE_WATER_TRIAL, {[]{return true;}}), - Entrance(GANONS_CASTLE_SHADOW_TRIAL, {[]{return true;}}), - Entrance(GANONS_CASTLE_SPIRIT_TRIAL, {[]{return true;}}), - Entrance(GANONS_CASTLE_LIGHT_TRIAL, {[]{return CanUse(GOLDEN_GAUNTLETS);}}), - Entrance(GANONS_CASTLE_TOWER, {[]{return (ForestTrialClear || Trial::ForestTrial.IsSkipped()) && + Entrance(RR_GANONS_CASTLE_ENTRYWAY, {[]{return true;}}), + Entrance(RR_GANONS_CASTLE_FOREST_TRIAL, {[]{return true;}}), + Entrance(RR_GANONS_CASTLE_FIRE_TRIAL, {[]{return true;}}), + Entrance(RR_GANONS_CASTLE_WATER_TRIAL, {[]{return true;}}), + Entrance(RR_GANONS_CASTLE_SHADOW_TRIAL, {[]{return true;}}), + Entrance(RR_GANONS_CASTLE_SPIRIT_TRIAL, {[]{return true;}}), + Entrance(RR_GANONS_CASTLE_LIGHT_TRIAL, {[]{return CanUse(RG_GOLDEN_GAUNTLETS);}}), + Entrance(RR_GANONS_CASTLE_TOWER, {[]{return (ForestTrialClear || Trial::ForestTrial.IsSkipped()) && (FireTrialClear || Trial::FireTrial.IsSkipped()) && (WaterTrialClear || Trial::WaterTrial.IsSkipped()) && (ShadowTrialClear || Trial::ShadowTrial.IsSkipped()) && (SpiritTrialClear || Trial::SpiritTrial.IsSkipped()) && (LightTrialClear || Trial::LightTrial.IsSkipped());}}), - Entrance(GANONS_CASTLE_DEKU_SCRUBS, {[]{return LogicLensCastle || CanUse(LENS_OF_TRUTH);}}), + Entrance(RR_GANONS_CASTLE_DEKU_SCRUBS, {[]{return LogicLensCastle || CanUse(RG_LENS_OF_TRUTH);}}), }); - areaTable[GANONS_CASTLE_DEKU_SCRUBS] = Area("Ganon's Castle Deku Scrubs", "Ganon's Castle", GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_DEKU_SCRUBS] = Area("Ganon's Castle Deku Scrubs", "Ganon's Castle", RHT_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&FreeFairies, {[]{return true;}}), }, { //Locations - LocationAccess(GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, {[]{return CanStunDeku;}}), - LocationAccess(GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, {[]{return CanStunDeku;}}), - LocationAccess(GANONS_CASTLE_DEKU_SCRUB_RIGHT, {[]{return CanStunDeku;}}), - LocationAccess(GANONS_CASTLE_DEKU_SCRUB_LEFT, {[]{return CanStunDeku;}}), + LocationAccess(RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, {[]{return CanStunDeku;}}), + LocationAccess(RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, {[]{return CanStunDeku;}}), + LocationAccess(RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT, {[]{return CanStunDeku;}}), + LocationAccess(RC_GANONS_CASTLE_DEKU_SCRUB_LEFT, {[]{return CanStunDeku;}}), }, {}); - areaTable[GANONS_CASTLE_FOREST_TRIAL] = Area("Ganon's Castle Forest Trial", "Ganon's Castle", GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_FOREST_TRIAL] = Area("Ganon's Castle Forest Trial", "Ganon's Castle", RHT_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&ForestTrialClear, {[]{return CanUse(LIGHT_ARROWS) && (FireArrows || DinsFire);}}), + EventAccess(&ForestTrialClear, {[]{return CanUse(RG_LIGHT_ARROWS) && (FireArrows || DinsFire);}}), }, { //Locations - LocationAccess(GANONS_CASTLE_FOREST_TRIAL_CHEST, {[]{return IsAdult || CanChildDamage;}}), + LocationAccess(RC_GANONS_CASTLE_FOREST_TRIAL_CHEST, {[]{return IsAdult || CanChildDamage;}}), }, {}); - areaTable[GANONS_CASTLE_FIRE_TRIAL] = Area("Ganon's Castle Fire Trial", "Ganon's Castle", GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_FIRE_TRIAL] = Area("Ganon's Castle Fire Trial", "Ganon's Castle", RHT_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&FireTrialClear, {[]{return CanUse(GORON_TUNIC) && CanUse(GOLDEN_GAUNTLETS) && CanUse(LIGHT_ARROWS) && CanUse(LONGSHOT);}}), + EventAccess(&FireTrialClear, {[]{return CanUse(RG_GORON_TUNIC) && CanUse(RG_GOLDEN_GAUNTLETS) && CanUse(RG_LIGHT_ARROWS) && CanUse(RG_LONGSHOT);}}), }, {}, {}); - areaTable[GANONS_CASTLE_WATER_TRIAL] = Area("Ganon's Castle Water Trial", "Ganon's Castle", GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_WATER_TRIAL] = Area("Ganon's Castle Water Trial", "Ganon's Castle", RHT_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&BlueFireAccess, {[]{return BlueFireAccess || HasBottle;}}), EventAccess(&FairyPot, {[]{return FairyPot || BlueFire;}}), - EventAccess(&WaterTrialClear, {[]{return BlueFire && Hammer && CanUse(LIGHT_ARROWS);}}), + EventAccess(&WaterTrialClear, {[]{return BlueFire && Hammer && CanUse(RG_LIGHT_ARROWS);}}), }, { //Locations - LocationAccess(GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST, {[]{return true;}}), - LocationAccess(GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST, {[]{return true;}}), + LocationAccess(RC_GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST, {[]{return true;}}), + LocationAccess(RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST, {[]{return true;}}), }, {}); - areaTable[GANONS_CASTLE_SHADOW_TRIAL] = Area("Ganon's Castle Shadow Trial", "Ganon's Castle", GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_SHADOW_TRIAL] = Area("Ganon's Castle Shadow Trial", "Ganon's Castle", RHT_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&ShadowTrialClear, {[]{return CanUse(LIGHT_ARROWS) && Hammer && ((FireArrows && (LogicLensCastle || CanUse(LENS_OF_TRUTH))) || (CanUse(LONGSHOT) && (CanUse(HOVER_BOOTS) || (DinsFire && (LogicLensCastle || CanUse(LENS_OF_TRUTH))))));}}), + EventAccess(&ShadowTrialClear, {[]{return CanUse(RG_LIGHT_ARROWS) && Hammer && ((FireArrows && (LogicLensCastle || CanUse(RG_LENS_OF_TRUTH))) || (CanUse(RG_LONGSHOT) && (CanUse(RG_HOVER_BOOTS) || (DinsFire && (LogicLensCastle || CanUse(RG_LENS_OF_TRUTH))))));}}), }, { //Locations - LocationAccess(GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST, {[]{return CanUse(FIRE_ARROWS) || CanUse(HOOKSHOT) || CanUse(HOVER_BOOTS) || CanPlay(SongOfTime) || IsChild;}}), - LocationAccess(GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST, {[]{return CanUse(FIRE_ARROWS) || (CanUse(LONGSHOT) && (CanUse(HOVER_BOOTS) || CanUse(DINS_FIRE)));}}), + LocationAccess(RC_GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST, {[]{return CanUse(RG_FIRE_ARROWS) || CanUse(RG_HOOKSHOT) || CanUse(RG_HOVER_BOOTS) || CanPlay(SongOfTime) || IsChild;}}), + LocationAccess(RC_GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST, {[]{return CanUse(RG_FIRE_ARROWS) || (CanUse(RG_LONGSHOT) && (CanUse(RG_HOVER_BOOTS) || CanUse(RG_DINS_FIRE)));}}), }, {}); - areaTable[GANONS_CASTLE_SPIRIT_TRIAL] = Area("Ganon's Castle Spirit Trial", "Ganon's Castle", GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_SPIRIT_TRIAL] = Area("Ganon's Castle Spirit Trial", "Ganon's Castle", RHT_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&NutPot, {[]{return NutPot || ((LogicSpiritTrialHookshot || CanUse(HOOKSHOT)) && HasBombchus && Bow && (MirrorShield || (SunlightArrows && CanUse(LIGHT_ARROWS))) && IsAdult);}}), - EventAccess(&SpiritTrialClear, {[]{return CanUse(LIGHT_ARROWS) && (MirrorShield || SunlightArrows) && HasBombchus && (LogicSpiritTrialHookshot || CanUse(HOOKSHOT));}}), + EventAccess(&NutPot, {[]{return NutPot || ((LogicSpiritTrialHookshot || CanUse(RG_HOOKSHOT)) && HasBombchus && Bow && (MirrorShield || (SunlightArrows && CanUse(RG_LIGHT_ARROWS))) && IsAdult);}}), + EventAccess(&SpiritTrialClear, {[]{return CanUse(RG_LIGHT_ARROWS) && (MirrorShield || SunlightArrows) && HasBombchus && (LogicSpiritTrialHookshot || CanUse(RG_HOOKSHOT));}}), }, { //Locations - LocationAccess(GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, {[]{return LogicSpiritTrialHookshot || CanUse(HOOKSHOT);}}), - LocationAccess(GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, {[]{return (LogicSpiritTrialHookshot || CanUse(HOOKSHOT)) && HasBombchus && (LogicLensCastle || CanUse(LENS_OF_TRUTH));}}), + LocationAccess(RC_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, {[]{return LogicSpiritTrialHookshot || CanUse(RG_HOOKSHOT);}}), + LocationAccess(RC_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, {[]{return (LogicSpiritTrialHookshot || CanUse(RG_HOOKSHOT)) && HasBombchus && (LogicLensCastle || CanUse(RG_LENS_OF_TRUTH));}}), }, {}); - areaTable[GANONS_CASTLE_LIGHT_TRIAL] = Area("Ganon's Castle Light Trial", "Ganon's Castle", GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_LIGHT_TRIAL] = Area("Ganon's Castle Light Trial", "Ganon's Castle", RHT_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&LightTrialClear, {[]{return CanUse(LIGHT_ARROWS) && CanUse(HOOKSHOT) && SmallKeys(GANONS_CASTLE, 2) && (LogicLensCastle || CanUse(LENS_OF_TRUTH));}}), + EventAccess(&LightTrialClear, {[]{return CanUse(RG_LIGHT_ARROWS) && CanUse(RG_HOOKSHOT) && SmallKeys(RR_GANONS_CASTLE, 2) && (LogicLensCastle || CanUse(RG_LENS_OF_TRUTH));}}), }, { //Locations - LocationAccess(GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST, {[]{return true;}}), - LocationAccess(GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST, {[]{return true;}}), - LocationAccess(GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST, {[]{return true;}}), - LocationAccess(GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST, {[]{return true;}}), - LocationAccess(GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST, {[]{return true;}}), - LocationAccess(GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST, {[]{return true;}}), - LocationAccess(GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST, {[]{return LogicLensCastle || CanUse(LENS_OF_TRUTH);}}), - LocationAccess(GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST, {[]{return CanPlay(ZeldasLullaby) && SmallKeys(GANONS_CASTLE, 1);}}), + LocationAccess(RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST, {[]{return true;}}), + LocationAccess(RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST, {[]{return true;}}), + LocationAccess(RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST, {[]{return true;}}), + LocationAccess(RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST, {[]{return true;}}), + LocationAccess(RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST, {[]{return true;}}), + LocationAccess(RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST, {[]{return true;}}), + LocationAccess(RC_GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST, {[]{return LogicLensCastle || CanUse(RG_LENS_OF_TRUTH);}}), + LocationAccess(RC_GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST, {[]{return CanPlay(ZeldasLullaby) && SmallKeys(RR_GANONS_CASTLE, 1);}}), }, {}); } - areaTable[GANONS_CASTLE_TOWER] = Area("Ganon's Castle Tower", "Ganons Castle", GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GANONS_CASTLE_TOWER] = Area("Ganon's Castle Tower", "Ganons Castle", RHT_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(GANONS_TOWER_BOSS_KEY_CHEST, {[]{return true;}}), - LocationAccess(GANONDORF_HINT, {[]{return BossKeyGanonsCastle;}}), - LocationAccess(GANON, {[]{return BossKeyGanonsCastle && CanUse(LIGHT_ARROWS);}}), + LocationAccess(RC_GANONS_TOWER_BOSS_KEY_CHEST, {[]{return true;}}), + LocationAccess(RC_GANONDORF_HINT, {[]{return BossKeyGanonsCastle;}}), + LocationAccess(RC_GANON, {[]{return BossKeyGanonsCastle && CanUse(RG_LIGHT_ARROWS);}}), }, {}); /*--------------------------- | MASTER QUEST DUNGEON | ---------------------------*/ if (Dungeon::GanonsCastle.IsMQ()) { - areaTable[GANONS_CASTLE_MQ_LOBBY] = Area("Ganon's Castle MQ Lobby", "Ganons Castle", GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GANONS_CASTLE_MQ_LOBBY] = Area("Ganon's Castle MQ Lobby", "Ganons Castle", RHT_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(GANONS_CASTLE_ENTRYWAY, {[]{return (IsAdult || (HasExplosives || ((Nuts || Boomerang) && (Sticks || KokiriSword))));}}), - Entrance(GANONS_CASTLE_MQ_FOREST_TRIAL, {[]{return true;}}), - Entrance(GANONS_CASTLE_MQ_FIRE_TRIAL, {[]{return true;}}), - Entrance(GANONS_CASTLE_MQ_WATER_TRIAL, {[]{return true;}}), - Entrance(GANONS_CASTLE_MQ_SHADOW_TRIAL, {[]{return true;}}), - Entrance(GANONS_CASTLE_MQ_SPIRIT_TRIAL, {[]{return true;}}), - Entrance(GANONS_CASTLE_MQ_LIGHT_TRIAL, {[]{return CanUse(GOLDEN_GAUNTLETS);}}), - Entrance(GANONS_CASTLE_TOWER, {[]{return (ForestTrialClear || Trial::ForestTrial.IsSkipped()) && + Entrance(RR_GANONS_CASTLE_ENTRYWAY, {[]{return (IsAdult || (HasExplosives || ((Nuts || Boomerang) && (Sticks || KokiriSword))));}}), + Entrance(RR_GANONS_CASTLE_MQ_FOREST_TRIAL, {[]{return true;}}), + Entrance(RR_GANONS_CASTLE_MQ_FIRE_TRIAL, {[]{return true;}}), + Entrance(RR_GANONS_CASTLE_MQ_WATER_TRIAL, {[]{return true;}}), + Entrance(RR_GANONS_CASTLE_MQ_SHADOW_TRIAL, {[]{return true;}}), + Entrance(RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL, {[]{return true;}}), + Entrance(RR_GANONS_CASTLE_MQ_LIGHT_TRIAL, {[]{return CanUse(RG_GOLDEN_GAUNTLETS);}}), + Entrance(RR_GANONS_CASTLE_TOWER, {[]{return (ForestTrialClear || Trial::ForestTrial.IsSkipped()) && (FireTrialClear || Trial::FireTrial.IsSkipped()) && (WaterTrialClear || Trial::WaterTrial.IsSkipped()) && (ShadowTrialClear || Trial::ShadowTrial.IsSkipped()) && (SpiritTrialClear || Trial::SpiritTrial.IsSkipped()) && (LightTrialClear || Trial::LightTrial.IsSkipped());}}), - Entrance(GANONS_CASTLE_MQ_DEKU_SCRUBS, {[]{return LogicLensCastleMQ || CanUse(LENS_OF_TRUTH);}}), + Entrance(RR_GANONS_CASTLE_MQ_DEKU_SCRUBS, {[]{return LogicLensCastleMQ || CanUse(RG_LENS_OF_TRUTH);}}), }); - areaTable[GANONS_CASTLE_MQ_DEKU_SCRUBS] = Area("Ganon's Castle MQ Deku Scrubs", "Ganon's Castle", GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_MQ_DEKU_SCRUBS] = Area("Ganon's Castle MQ Deku Scrubs", "Ganon's Castle", RHT_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&FreeFairies, {[]{return true;}}), }, { //Locations - LocationAccess(GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, {[]{return CanStunDeku;}}), - LocationAccess(GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, {[]{return CanStunDeku;}}), - LocationAccess(GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, {[]{return CanStunDeku;}}), - LocationAccess(GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, {[]{return CanStunDeku;}}), - LocationAccess(GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, {[]{return CanStunDeku;}}), + LocationAccess(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, {[]{return CanStunDeku;}}), + LocationAccess(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, {[]{return CanStunDeku;}}), + LocationAccess(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, {[]{return CanStunDeku;}}), + LocationAccess(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, {[]{return CanStunDeku;}}), + LocationAccess(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, {[]{return CanStunDeku;}}), }, {}); - areaTable[GANONS_CASTLE_MQ_FOREST_TRIAL] = Area("Ganon's Castle MQ Forest Trial", "Ganons Castle", GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_MQ_FOREST_TRIAL] = Area("Ganon's Castle MQ Forest Trial", "Ganons Castle", RHT_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&ForestTrialClear, {[]{return IsAdult && CanUse(LIGHT_ARROWS) && CanPlay(SongOfTime);}}), + EventAccess(&ForestTrialClear, {[]{return IsAdult && CanUse(RG_LIGHT_ARROWS) && CanPlay(SongOfTime);}}), }, { //Locations - LocationAccess(GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, {[]{return (IsAdult && CanUse(BOW)) || (IsChild && CanUse(SLINGSHOT));}}), - LocationAccess(GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST, {[]{return HasFireSource;}}), - LocationAccess(GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, {[]{return HookshotOrBoomerang;}}), + LocationAccess(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, {[]{return (IsAdult && CanUse(RG_FAIRY_BOW)) || (IsChild && CanUse(RG_FAIRY_SLINGSHOT));}}), + LocationAccess(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST, {[]{return HasFireSource;}}), + LocationAccess(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, {[]{return HookshotOrBoomerang;}}), }, {}); - areaTable[GANONS_CASTLE_MQ_FIRE_TRIAL] = Area("Ganon's Castle MQ Fire Trial", "Ganons Castle", GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_MQ_FIRE_TRIAL] = Area("Ganon's Castle MQ Fire Trial", "Ganons Castle", RHT_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&FireTrialClear, {[]{return CanUse(GORON_TUNIC) && CanUse(GOLDEN_GAUNTLETS) && CanUse(LIGHT_ARROWS) && (CanUse(LONGSHOT) || HoverBoots || (LogicFireTrialMQ && CanUse(HOOKSHOT)));}}), - //Trick: CanUse(GORON_TUNIC) && CanUse(GOLDEN_GAUNTLETS) && CanUse(LIGHT_ARROWS) && (CanUse(LONGSHOT) || HoverBoots || (LogicFireTrialMQ && CanUse(HOOKSHOT))) + EventAccess(&FireTrialClear, {[]{return CanUse(RG_GORON_TUNIC) && CanUse(RG_GOLDEN_GAUNTLETS) && CanUse(RG_LIGHT_ARROWS) && (CanUse(RG_LONGSHOT) || HoverBoots || (LogicFireTrialMQ && CanUse(RG_HOOKSHOT)));}}), + //Trick: CanUse(RG_GORON_TUNIC) && CanUse(RG_GOLDEN_GAUNTLETS) && CanUse(RG_LIGHT_ARROWS) && (CanUse(RG_LONGSHOT) || HoverBoots || (LogicFireTrialMQ && CanUse(RG_HOOKSHOT))) }, {}, {}); - areaTable[GANONS_CASTLE_MQ_WATER_TRIAL] = Area("Ganon's Castle MQ Water Trial", "Ganons Castle", GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_MQ_WATER_TRIAL] = Area("Ganon's Castle MQ Water Trial", "Ganons Castle", RHT_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&WaterTrialClear, {[]{return BlueFire && IsAdult && CanUse(LIGHT_ARROWS) && SmallKeys(GANONS_CASTLE, 3);}}), + EventAccess(&WaterTrialClear, {[]{return BlueFire && IsAdult && CanUse(RG_LIGHT_ARROWS) && SmallKeys(RR_GANONS_CASTLE, 3);}}), EventAccess(&BlueFireAccess, {[]{return BlueFireAccess || HasBottle;}}), }, { //Locations - LocationAccess(GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, {[]{return BlueFire && (IsAdult || CanUse(STICKS) || KokiriSword || CanUseProjectile);}}), + LocationAccess(RC_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, {[]{return BlueFire && (IsAdult || CanUse(RG_STICKS) || KokiriSword || CanUseProjectile);}}), }, {}); - areaTable[GANONS_CASTLE_MQ_SHADOW_TRIAL] = Area("Ganon's Castle MQ Shadow Trial", "Ganons Castle", GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_MQ_SHADOW_TRIAL] = Area("Ganon's Castle MQ Shadow Trial", "Ganons Castle", RHT_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&ShadowTrialClear, {[]{return IsAdult && CanUse(LIGHT_ARROWS) && (LogicLensCastleMQ || CanUse(LENS_OF_TRUTH)) && (HoverBoots || (Hookshot && (HasFireSource || LogicShadowTrialMQ)));}}), - //Trick: IsAdult && CanUse(LIGHT_ARROWS) && (LogicLensCastleMQ || CanUse(LENS_OF_TRUTH)) && (HoverBoots || (Hookshot && (HasFireSource || LogicShadowTrialMQ))) + EventAccess(&ShadowTrialClear, {[]{return IsAdult && CanUse(RG_LIGHT_ARROWS) && (LogicLensCastleMQ || CanUse(RG_LENS_OF_TRUTH)) && (HoverBoots || (Hookshot && (HasFireSource || LogicShadowTrialMQ)));}}), + //Trick: IsAdult && CanUse(RG_LIGHT_ARROWS) && (LogicLensCastleMQ || CanUse(RG_LENS_OF_TRUTH)) && (HoverBoots || (Hookshot && (HasFireSource || LogicShadowTrialMQ))) }, { //Locations - LocationAccess(GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST, {[]{return IsAdult && ((Bow && (CanUse(HOOKSHOT) || CanUse(HOVER_BOOTS))) || (CanUse(HOVER_BOOTS) && (LogicLensCastleMQ || CanUse(LENS_OF_TRUTH)) && (HasExplosives || GoronBracelet || CanUse(DINS_FIRE))));}}), - LocationAccess(GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, {[]{return IsAdult && Bow && (LogicLensCastleMQ || CanUse(LENS_OF_TRUTH)) && (HoverBoots || (Hookshot && (HasFireSource || LogicShadowTrialMQ)));}}), - //Trick: IsAdult && Bow && (LogicLensCastleMQ || CanUse(LENS_OF_TRUTH)) && (HoverBoots || (Hookshot && (HasFireSource || LogicShadowTrialMQ))) + LocationAccess(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST, {[]{return IsAdult && ((Bow && (CanUse(RG_HOOKSHOT) || CanUse(RG_HOVER_BOOTS))) || (CanUse(RG_HOVER_BOOTS) && (LogicLensCastleMQ || CanUse(RG_LENS_OF_TRUTH)) && (HasExplosives || GoronBracelet || CanUse(RG_DINS_FIRE))));}}), + LocationAccess(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, {[]{return IsAdult && Bow && (LogicLensCastleMQ || CanUse(RG_LENS_OF_TRUTH)) && (HoverBoots || (Hookshot && (HasFireSource || LogicShadowTrialMQ)));}}), + //Trick: IsAdult && Bow && (LogicLensCastleMQ || CanUse(RG_LENS_OF_TRUTH)) && (HoverBoots || (Hookshot && (HasFireSource || LogicShadowTrialMQ))) }, {}); - areaTable[GANONS_CASTLE_MQ_SPIRIT_TRIAL] = Area("Ganon's Castle MQ Spirit Castle", "Ganons Castle", GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL] = Area("Ganon's Castle MQ Spirit Castle", "Ganons Castle", RHT_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&SpiritTrialClear, {[]{return IsAdult && CanUse(LIGHT_ARROWS) && Hammer && HasBombchus && ((FireArrows && MirrorShield) || SunlightArrows);}}), - EventAccess(&NutPot, {[]{return NutPot || (Hammer && HasBombchus && IsAdult && ((CanUse(FIRE_ARROWS) && MirrorShield) || (SunlightArrows && CanUse(LIGHT_ARROWS))));}}), + EventAccess(&SpiritTrialClear, {[]{return IsAdult && CanUse(RG_LIGHT_ARROWS) && Hammer && HasBombchus && ((FireArrows && MirrorShield) || SunlightArrows);}}), + EventAccess(&NutPot, {[]{return NutPot || (Hammer && HasBombchus && IsAdult && ((CanUse(RG_FIRE_ARROWS) && MirrorShield) || (SunlightArrows && CanUse(RG_LIGHT_ARROWS))));}}), }, { //Locations - LocationAccess(GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST, {[]{return IsAdult && (Bow || LogicRustedSwitches) && Hammer;}}), - LocationAccess(GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, {[]{return IsAdult && (Bow || LogicRustedSwitches) && Hammer && HasBombchus && (LogicLensCastleMQ || CanUse(LENS_OF_TRUTH));}}), - LocationAccess(GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST, {[]{return IsAdult && Hammer && HasBombchus && ((CanUse(FIRE_ARROWS) && CanUse(MIRROR_SHIELD)) || (SunlightArrows && CanUse(LIGHT_ARROWS)));}}), - LocationAccess(GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST, {[]{return IsAdult && Hammer && HasBombchus && ((CanUse(FIRE_ARROWS) && CanUse(MIRROR_SHIELD)) || (SunlightArrows && CanUse(LIGHT_ARROWS)));}}), - LocationAccess(GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST, {[]{return IsAdult && Hammer && HasBombchus && ((CanUse(FIRE_ARROWS) && CanUse(MIRROR_SHIELD)) || (SunlightArrows && CanUse(LIGHT_ARROWS)));}}), - LocationAccess(GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST, {[]{return IsAdult && Hammer && HasBombchus && ((CanUse(FIRE_ARROWS) && CanUse(MIRROR_SHIELD)) || (SunlightArrows && CanUse(LIGHT_ARROWS)));}}), + LocationAccess(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST, {[]{return IsAdult && (Bow || LogicRustedSwitches) && Hammer;}}), + LocationAccess(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, {[]{return IsAdult && (Bow || LogicRustedSwitches) && Hammer && HasBombchus && (LogicLensCastleMQ || CanUse(RG_LENS_OF_TRUTH));}}), + LocationAccess(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST, {[]{return IsAdult && Hammer && HasBombchus && ((CanUse(RG_FIRE_ARROWS) && CanUse(RG_MIRROR_SHIELD)) || (SunlightArrows && CanUse(RG_LIGHT_ARROWS)));}}), + LocationAccess(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST, {[]{return IsAdult && Hammer && HasBombchus && ((CanUse(RG_FIRE_ARROWS) && CanUse(RG_MIRROR_SHIELD)) || (SunlightArrows && CanUse(RG_LIGHT_ARROWS)));}}), + LocationAccess(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST, {[]{return IsAdult && Hammer && HasBombchus && ((CanUse(RG_FIRE_ARROWS) && CanUse(RG_MIRROR_SHIELD)) || (SunlightArrows && CanUse(RG_LIGHT_ARROWS)));}}), + LocationAccess(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST, {[]{return IsAdult && Hammer && HasBombchus && ((CanUse(RG_FIRE_ARROWS) && CanUse(RG_MIRROR_SHIELD)) || (SunlightArrows && CanUse(RG_LIGHT_ARROWS)));}}), }, {}); - areaTable[GANONS_CASTLE_MQ_LIGHT_TRIAL] = Area("Ganon's Castle MQ Light Trial", "Ganons Castle", GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_MQ_LIGHT_TRIAL] = Area("Ganon's Castle MQ Light Trial", "Ganons Castle", RHT_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&LightTrialClear, {[]{return IsAdult && CanUse(LIGHT_ARROWS) && SmallKeys(GANONS_CASTLE, 3) && (LogicLensCastleMQ || CanUse(LENS_OF_TRUTH)) && (Hookshot || LogicLightTrialMQ);}}), - //Trick: IsAdult && CanUse(LIGHT_ARROWS) && SmallKeys(GANONS_CASTLE, 3) && (LogicLensCastleMQ || CanUse(LENS_OF_TRUTH)) && (Hookshot || LogicLightTrialMQ) + EventAccess(&LightTrialClear, {[]{return IsAdult && CanUse(RG_LIGHT_ARROWS) && SmallKeys(RR_GANONS_CASTLE, 3) && (LogicLensCastleMQ || CanUse(RG_LENS_OF_TRUTH)) && (Hookshot || LogicLightTrialMQ);}}), + //Trick: IsAdult && CanUse(RG_LIGHT_ARROWS) && SmallKeys(RR_GANONS_CASTLE, 3) && (LogicLensCastleMQ || CanUse(RG_LENS_OF_TRUTH)) && (Hookshot || LogicLightTrialMQ) }, { //Locations - LocationAccess(GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, {[]{return CanPlay(ZeldasLullaby);}}), + LocationAccess(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, {[]{return CanPlay(ZeldasLullaby);}}), }, {}); } } 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 77cf0a4e2..8dc601b5c 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 @@ -10,104 +10,104 @@ void AreaTable_Init_GerudoTrainingGrounds() { /*-------------------------- | VANILLA/MQ DECIDER | ---------------------------*/ - areaTable[GERUDO_TRAINING_GROUNDS_ENTRYWAY] = Area("Gerudo Training Grounds Entryway", "Gerudo Training Grounds", GERUDO_TRAINING_GROUNDS, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GERUDO_TRAINING_GROUNDS_ENTRYWAY] = Area("Gerudo Training Grounds Entryway", "Gerudo Training Grounds", RHT_GERUDO_TRAINING_GROUND, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(GERUDO_TRAINING_GROUNDS_LOBBY, {[]{return Dungeon::GerudoTrainingGrounds.IsVanilla();}}), - Entrance(GERUDO_TRAINING_GROUNDS_MQ_LOBBY, {[]{return Dungeon::GerudoTrainingGrounds.IsMQ();}}), - Entrance(GERUDO_FORTRESS, {[]{return true;}}), + Entrance(RR_GERUDO_TRAINING_GROUNDS_LOBBY, {[]{return Dungeon::GerudoTrainingGrounds.IsVanilla();}}), + Entrance(RR_GERUDO_TRAINING_GROUNDS_MQ_LOBBY, {[]{return Dungeon::GerudoTrainingGrounds.IsMQ();}}), + Entrance(RR_GERUDO_FORTRESS, {[]{return true;}}), }); /*-------------------------- | VANILLA DUNGEON | ---------------------------*/ if (Dungeon::GerudoTrainingGrounds.IsVanilla()) { - areaTable[GERUDO_TRAINING_GROUNDS_LOBBY] = Area("Gerudo Training Grounds Lobby", "Gerudo Training Grounds", GERUDO_TRAINING_GROUNDS, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUNDS_LOBBY] = Area("Gerudo Training Grounds Lobby", "Gerudo Training Grounds", RHT_GERUDO_TRAINING_GROUND, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(GERUDO_TRAINING_GROUNDS_LOBBY_LEFT_CHEST, {[]{return CanUse(BOW) || CanUse(SLINGSHOT);}}), - LocationAccess(GERUDO_TRAINING_GROUNDS_LOBBY_RIGHT_CHEST, {[]{return CanUse(BOW) || CanUse(SLINGSHOT);}}), - LocationAccess(GERUDO_TRAINING_GROUNDS_STALFOS_CHEST, {[]{return IsAdult || KokiriSword;}}), - LocationAccess(GERUDO_TRAINING_GROUNDS_BEAMOS_CHEST, {[]{return HasExplosives && (IsAdult || KokiriSword);}}), + LocationAccess(RC_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST, {[]{return CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT);}}), + LocationAccess(RC_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST, {[]{return CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT);}}), + LocationAccess(RC_GERUDO_TRAINING_GROUND_STALFOS_CHEST, {[]{return IsAdult || KokiriSword;}}), + LocationAccess(RC_GERUDO_TRAINING_GROUND_BEAMOS_CHEST, {[]{return HasExplosives && (IsAdult || KokiriSword);}}), }, { //Exits - Entrance(GERUDO_TRAINING_GROUNDS_ENTRYWAY, {[]{return true;}}), - Entrance(GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_ROOM, {[]{return (IsAdult || KokiriSword) && (CanUse(HOOKSHOT) || LogicGtgWithoutHookshot);}}), - Entrance(GERUDO_TRAINING_GROUNDS_LAVA_ROOM, {[]{return Here(GERUDO_TRAINING_GROUNDS_LOBBY, []{return (IsAdult || KokiriSword) && HasExplosives;});}}), - Entrance(GERUDO_TRAINING_GROUNDS_CENTRAL_MAZE, {[]{return true;}}), + Entrance(RR_GERUDO_TRAINING_GROUNDS_ENTRYWAY, {[]{return true;}}), + Entrance(RR_GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_ROOM, {[]{return (IsAdult || KokiriSword) && (CanUse(RG_HOOKSHOT) || LogicGtgWithoutHookshot);}}), + Entrance(RR_GERUDO_TRAINING_GROUNDS_LAVA_ROOM, {[]{return Here(RR_GERUDO_TRAINING_GROUNDS_LOBBY, []{return (IsAdult || KokiriSword) && HasExplosives;});}}), + Entrance(RR_GERUDO_TRAINING_GROUNDS_CENTRAL_MAZE, {[]{return true;}}), }); - areaTable[GERUDO_TRAINING_GROUNDS_CENTRAL_MAZE] = Area("Gerudo Training Grounds Central Maze", "Gerudo Training Grounds", GERUDO_TRAINING_GROUNDS, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUNDS_CENTRAL_MAZE] = Area("Gerudo Training Grounds Central Maze", "Gerudo Training Grounds", RHT_GERUDO_TRAINING_GROUND, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(GERUDO_TRAINING_GROUNDS_HIDDEN_CEILING_CHEST, {[]{return SmallKeys(GERUDO_TRAINING_GROUNDS, 3) && (LogicLensGtg || CanUse(LENS_OF_TRUTH));}}), - LocationAccess(GERUDO_TRAINING_GROUNDS_MAZE_PATH_FIRST_CHEST, {[]{return SmallKeys(GERUDO_TRAINING_GROUNDS, 4);}}), - LocationAccess(GERUDO_TRAINING_GROUNDS_MAZE_PATH_SECOND_CHEST, {[]{return SmallKeys(GERUDO_TRAINING_GROUNDS, 6);}}), - LocationAccess(GERUDO_TRAINING_GROUNDS_MAZE_PATH_THIRD_CHEST, {[]{return SmallKeys(GERUDO_TRAINING_GROUNDS, 7);}}), - LocationAccess(GERUDO_TRAINING_GROUNDS_MAZE_PATH_FINAL_CHEST, {[]{return SmallKeys(GERUDO_TRAINING_GROUNDS, 9);}}), + LocationAccess(RC_GERUDO_TRAINING_GROUND_HIDDEN_CEILING_CHEST, {[]{return SmallKeys(RR_GERUDO_TRAINING_GROUNDS, 3) && (LogicLensGtg || CanUse(RG_LENS_OF_TRUTH));}}), + LocationAccess(RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FIRST_CHEST, {[]{return SmallKeys(RR_GERUDO_TRAINING_GROUNDS, 4);}}), + LocationAccess(RC_GERUDO_TRAINING_GROUND_MAZE_PATH_SECOND_CHEST, {[]{return SmallKeys(RR_GERUDO_TRAINING_GROUNDS, 6);}}), + LocationAccess(RC_GERUDO_TRAINING_GROUND_MAZE_PATH_THIRD_CHEST, {[]{return SmallKeys(RR_GERUDO_TRAINING_GROUNDS, 7);}}), + LocationAccess(RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FINAL_CHEST, {[]{return SmallKeys(RR_GERUDO_TRAINING_GROUNDS, 9);}}), }, { //Exits - Entrance(GERUDO_TRAINING_GROUNDS_CENTRAL_MAZE_RIGHT, {[]{return SmallKeys(GERUDO_TRAINING_GROUNDS, 9);}}), + Entrance(RR_GERUDO_TRAINING_GROUNDS_CENTRAL_MAZE_RIGHT, {[]{return SmallKeys(RR_GERUDO_TRAINING_GROUNDS, 9);}}), }); - areaTable[GERUDO_TRAINING_GROUNDS_CENTRAL_MAZE_RIGHT] = Area("Gerudo Training Grounds Central Maze Right", "Gerudo Training Grounds", GERUDO_TRAINING_GROUNDS, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUNDS_CENTRAL_MAZE_RIGHT] = Area("Gerudo Training Grounds Central Maze Right", "Gerudo Training Grounds", RHT_GERUDO_TRAINING_GROUND, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(GERUDO_TRAINING_GROUNDS_MAZE_RIGHT_CENTRAL_CHEST, {[]{return true;}}), - LocationAccess(GERUDO_TRAINING_GROUNDS_MAZE_RIGHT_SIDE_CHEST, {[]{return true;}}), - LocationAccess(GERUDO_TRAINING_GROUNDS_FREESTANDING_KEY, {[]{return true;}}), + LocationAccess(RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_CENTRAL_CHEST, {[]{return true;}}), + LocationAccess(RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST, {[]{return true;}}), + LocationAccess(RC_GERUDO_TRAINING_GROUND_FREESTANDING_KEY, {[]{return true;}}), }, { //Exits - Entrance(GERUDO_TRAINING_GROUNDS_HAMMER_ROOM, {[]{return CanUse(HOOKSHOT);}}), - Entrance(GERUDO_TRAINING_GROUNDS_LAVA_ROOM, {[]{return true;}}), + Entrance(RR_GERUDO_TRAINING_GROUNDS_HAMMER_ROOM, {[]{return CanUse(RG_HOOKSHOT);}}), + Entrance(RR_GERUDO_TRAINING_GROUNDS_LAVA_ROOM, {[]{return true;}}), }); - areaTable[GERUDO_TRAINING_GROUNDS_LAVA_ROOM] = Area("Gerudo Training Grounds Lava Room", "Gerudo Training Grounds", GERUDO_TRAINING_GROUNDS, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUNDS_LAVA_ROOM] = Area("Gerudo Training Grounds Lava Room", "Gerudo Training Grounds", RHT_GERUDO_TRAINING_GROUND, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(GERUDO_TRAINING_GROUNDS_UNDERWATER_SILVER_RUPEE_CHEST, {[]{return CanUse(HOOKSHOT) && CanPlay(SongOfTime) && IronBoots && WaterTimer >= 24;}}), + LocationAccess(RC_GERUDO_TRAINING_GROUND_UNDERWATER_SILVER_RUPEE_CHEST, {[]{return CanUse(RG_HOOKSHOT) && CanPlay(SongOfTime) && IronBoots && WaterTimer >= 24;}}), }, { //Exits - Entrance(GERUDO_TRAINING_GROUNDS_CENTRAL_MAZE_RIGHT, {[]{return CanPlay(SongOfTime) || IsChild;}}), - Entrance(GERUDO_TRAINING_GROUNDS_HAMMER_ROOM, {[]{return CanUse(LONGSHOT) || (CanUse(HOVER_BOOTS) && CanUse(HOOKSHOT));}}), + Entrance(RR_GERUDO_TRAINING_GROUNDS_CENTRAL_MAZE_RIGHT, {[]{return CanPlay(SongOfTime) || IsChild;}}), + Entrance(RR_GERUDO_TRAINING_GROUNDS_HAMMER_ROOM, {[]{return CanUse(RG_LONGSHOT) || (CanUse(RG_HOVER_BOOTS) && CanUse(RG_HOOKSHOT));}}), }); - areaTable[GERUDO_TRAINING_GROUNDS_HAMMER_ROOM] = Area("Gerudo Training Grounds Hammer Room", "Gerudo Training Grounds", GERUDO_TRAINING_GROUNDS, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUNDS_HAMMER_ROOM] = Area("Gerudo Training Grounds Hammer Room", "Gerudo Training Grounds", RHT_GERUDO_TRAINING_GROUND, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(GERUDO_TRAINING_GROUNDS_HAMMER_ROOM_CLEAR_CHEST, {[]{return true;}}), - LocationAccess(GERUDO_TRAINING_GROUNDS_HAMMER_ROOM_SWITCH_CHEST, {[]{return CanUse(MEGATON_HAMMER) || (CanTakeDamage && LogicFlamingChests);}}), + LocationAccess(RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST, {[]{return true;}}), + LocationAccess(RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_SWITCH_CHEST, {[]{return CanUse(RG_MEGATON_HAMMER) || (CanTakeDamage && LogicFlamingChests);}}), }, { //Exits - Entrance(GERUDO_TRAINING_GROUNDS_EYE_STATUE_LOWER, {[]{return CanUse(MEGATON_HAMMER) && Bow;}}), - Entrance(GERUDO_TRAINING_GROUNDS_LAVA_ROOM, {[]{return true;}}), + Entrance(RR_GERUDO_TRAINING_GROUNDS_EYE_STATUE_LOWER, {[]{return CanUse(RG_MEGATON_HAMMER) && Bow;}}), + Entrance(RR_GERUDO_TRAINING_GROUNDS_LAVA_ROOM, {[]{return true;}}), }); - areaTable[GERUDO_TRAINING_GROUNDS_EYE_STATUE_LOWER] = Area("Gerudo Training Grounds Eye Statue Lower", "Gerudo Training Grounds", GERUDO_TRAINING_GROUNDS, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUNDS_EYE_STATUE_LOWER] = Area("Gerudo Training Grounds Eye Statue Lower", "Gerudo Training Grounds", RHT_GERUDO_TRAINING_GROUND, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(GERUDO_TRAINING_GROUNDS_EYE_STATUE_CHEST, {[]{return CanUse(BOW);}}), + LocationAccess(RC_GERUDO_TRAINING_GROUND_EYE_STATUE_CHEST, {[]{return CanUse(RG_FAIRY_BOW);}}), }, { //Exits - Entrance(GERUDO_TRAINING_GROUNDS_HAMMER_ROOM, {[]{return true;}}), + Entrance(RR_GERUDO_TRAINING_GROUNDS_HAMMER_ROOM, {[]{return true;}}), }); - areaTable[GERUDO_TRAINING_GROUNDS_EYE_STATUE_UPPER] = Area("Gerudo Training Grounds Eye Statue Upper", "Gerudo Training Grounds", GERUDO_TRAINING_GROUNDS, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUNDS_EYE_STATUE_UPPER] = Area("Gerudo Training Grounds Eye Statue Upper", "Gerudo Training Grounds", RHT_GERUDO_TRAINING_GROUND, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(GERUDO_TRAINING_GROUNDS_NEAR_SCARECROW_CHEST, {[]{return CanUse(BOW);}}), + LocationAccess(RC_GERUDO_TRAINING_GROUND_NEAR_SCARECROW_CHEST, {[]{return CanUse(RG_FAIRY_BOW);}}), }, { //Exits - Entrance(GERUDO_TRAINING_GROUNDS_EYE_STATUE_LOWER, {[]{return true;}}), + Entrance(RR_GERUDO_TRAINING_GROUNDS_EYE_STATUE_LOWER, {[]{return true;}}), }); - areaTable[GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_ROOM] = Area("Gerudo Training Grounds Heavy Block Room", "Gerudo Training Grounds", GERUDO_TRAINING_GROUNDS, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_ROOM] = Area("Gerudo Training Grounds Heavy Block Room", "Gerudo Training Grounds", RHT_GERUDO_TRAINING_GROUND, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(GERUDO_TRAINING_GROUNDS_BEFORE_HEAVY_BLOCK_CHEST, {[]{return true;}}), + LocationAccess(RC_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST, {[]{return true;}}), }, { //Exits - Entrance(GERUDO_TRAINING_GROUNDS_EYE_STATUE_UPPER, {[]{return (LogicLensGtg || CanUse(LENS_OF_TRUTH)) && (CanUse(HOOKSHOT) || (LogicGtgFakeWall && CanUse(HOVER_BOOTS)));}}), - Entrance(GERUDO_TRAINING_GROUNDS_LIKE_LIKE_ROOM, {[]{return (LogicLensGtg || CanUse(LENS_OF_TRUTH)) && (CanUse(HOOKSHOT) || (LogicGtgFakeWall && CanUse(HOVER_BOOTS))) && CanUse(SILVER_GAUNTLETS);}}), + Entrance(RR_GERUDO_TRAINING_GROUNDS_EYE_STATUE_UPPER, {[]{return (LogicLensGtg || CanUse(RG_LENS_OF_TRUTH)) && (CanUse(RG_HOOKSHOT) || (LogicGtgFakeWall && CanUse(RG_HOVER_BOOTS)));}}), + Entrance(RR_GERUDO_TRAINING_GROUNDS_LIKE_LIKE_ROOM, {[]{return (LogicLensGtg || CanUse(RG_LENS_OF_TRUTH)) && (CanUse(RG_HOOKSHOT) || (LogicGtgFakeWall && CanUse(RG_HOVER_BOOTS))) && CanUse(RG_SILVER_GAUNTLETS);}}), }); - areaTable[GERUDO_TRAINING_GROUNDS_LIKE_LIKE_ROOM] = Area("Gerudo Training Grounds Like Like Room", "Gerudo Training Grounds", GERUDO_TRAINING_GROUNDS, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUNDS_LIKE_LIKE_ROOM] = Area("Gerudo Training Grounds Like Like Room", "Gerudo Training Grounds", RHT_GERUDO_TRAINING_GROUND, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_FIRST_CHEST, {[]{return true;}}), - LocationAccess(GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_SECOND_CHEST, {[]{return true;}}), - LocationAccess(GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_THIRD_CHEST, {[]{return true;}}), - LocationAccess(GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_FOURTH_CHEST, {[]{return true;}}), + LocationAccess(RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FIRST_CHEST, {[]{return true;}}), + LocationAccess(RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_SECOND_CHEST, {[]{return true;}}), + LocationAccess(RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST, {[]{return true;}}), + LocationAccess(RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST, {[]{return true;}}), }, {}); } @@ -115,79 +115,79 @@ void AreaTable_Init_GerudoTrainingGrounds() { | MASTER QUEST DUNGEON | ---------------------------*/ if (Dungeon::GerudoTrainingGrounds.IsMQ()) { - areaTable[GERUDO_TRAINING_GROUNDS_MQ_LOBBY] = Area("Gerudo Training Grounds MQ Lobby", "Gerudo Training Grounds", GERUDO_TRAINING_GROUNDS, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUNDS_MQ_LOBBY] = Area("Gerudo Training Grounds MQ Lobby", "Gerudo Training Grounds", RHT_GERUDO_TRAINING_GROUND, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_LOBBY_LEFT_CHEST, {[]{return true;}}), - LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_LOBBY_RIGHT_CHEST, {[]{return true;}}), - LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_HIDDEN_CEILING_CHEST, {[]{return LogicLensGtgMQ || CanUse(LENS_OF_TRUTH);}}), - LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_FIRST_CHEST, {[]{return true;}}), - LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_SECOND_CHEST, {[]{return true;}}), - LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_THIRD_CHEST, {[]{return SmallKeys(GERUDO_TRAINING_GROUNDS, 1);}}), + LocationAccess(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_CHEST, {[]{return true;}}), + LocationAccess(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_CHEST, {[]{return true;}}), + LocationAccess(RC_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST, {[]{return LogicLensGtgMQ || CanUse(RG_LENS_OF_TRUTH);}}), + LocationAccess(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_FIRST_CHEST, {[]{return true;}}), + LocationAccess(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_SECOND_CHEST, {[]{return true;}}), + LocationAccess(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST, {[]{return SmallKeys(RR_GERUDO_TRAINING_GROUNDS, 1);}}), }, { //Exits - Entrance(GERUDO_TRAINING_GROUNDS_ENTRYWAY, {[]{return true;}}), - Entrance(GERUDO_TRAINING_GROUNDS_MQ_LEFT_SIDE, {[]{return Here(GERUDO_TRAINING_GROUNDS_MQ_LOBBY, []{return HasFireSource;});}}), - Entrance(GERUDO_TRAINING_GROUNDS_MQ_RIGHT_SIDE, {[]{return Here(GERUDO_TRAINING_GROUNDS_MQ_LOBBY, []{return (IsAdult && CanUse(BOW)) || (IsChild && CanUse(SLINGSHOT));});}}), + Entrance(RR_GERUDO_TRAINING_GROUNDS_ENTRYWAY, {[]{return true;}}), + Entrance(RR_GERUDO_TRAINING_GROUNDS_MQ_LEFT_SIDE, {[]{return Here(RR_GERUDO_TRAINING_GROUNDS_MQ_LOBBY, []{return HasFireSource;});}}), + Entrance(RR_GERUDO_TRAINING_GROUNDS_MQ_RIGHT_SIDE, {[]{return Here(RR_GERUDO_TRAINING_GROUNDS_MQ_LOBBY, []{return (IsAdult && CanUse(RG_FAIRY_BOW)) || (IsChild && CanUse(RG_FAIRY_SLINGSHOT));});}}), }); - areaTable[GERUDO_TRAINING_GROUNDS_MQ_RIGHT_SIDE] = Area("Gerudo Training Grounds MQ Right Side", "Gerudo Training Grounds", GERUDO_TRAINING_GROUNDS, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GERUDO_TRAINING_GROUNDS_MQ_RIGHT_SIDE] = Area("Gerudo Training Grounds MQ Right Side", "Gerudo Training Grounds", RHT_GERUDO_TRAINING_GROUND, NO_DAY_NIGHT_CYCLE, { //Events - //EventAccess(&WallFairy, {[]{return WallFairy || (IsAdult && CanUse(BOW));}}), + //EventAccess(&WallFairy, {[]{return WallFairy || (IsAdult && CanUse(RG_FAIRY_BOW));}}), }, { //Locations - LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_DINOLFOS_CHEST, {[]{return IsAdult;}}), + LocationAccess(RC_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST, {[]{return IsAdult;}}), }, { //Exits - Entrance(GERUDO_TRAINING_GROUNDS_MQ_UNDERWATER, {[]{return (Bow || CanUse(LONGSHOT)) && CanUse(HOVER_BOOTS) && IsAdult;}}), + Entrance(RR_GERUDO_TRAINING_GROUNDS_MQ_UNDERWATER, {[]{return (Bow || CanUse(RG_LONGSHOT)) && CanUse(RG_HOVER_BOOTS) && IsAdult;}}), }); - areaTable[GERUDO_TRAINING_GROUNDS_MQ_UNDERWATER] = Area("Gerudo Training Grounds MQ Underwater", "Gerudo Training Grounds", GERUDO_TRAINING_GROUNDS, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUNDS_MQ_UNDERWATER] = Area("Gerudo Training Grounds MQ Underwater", "Gerudo Training Grounds", RHT_GERUDO_TRAINING_GROUND, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_UNDERWATER_SILVER_RUPEE_CHEST, {[]{return HasFireSource && IsAdult && CanUse(IRON_BOOTS) && WaterTimer >= 24 && CanTakeDamage;}}), + LocationAccess(RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, {[]{return HasFireSource && IsAdult && CanUse(RG_IRON_BOOTS) && WaterTimer >= 24 && CanTakeDamage;}}), }, {}); - areaTable[GERUDO_TRAINING_GROUNDS_MQ_LEFT_SIDE] = Area("Gerudo Training Grounds MQ Left Side", "Gerudo Training Grounds", GERUDO_TRAINING_GROUNDS, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUNDS_MQ_LEFT_SIDE] = Area("Gerudo Training Grounds MQ Left Side", "Gerudo Training Grounds", RHT_GERUDO_TRAINING_GROUND, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_FIRST_IRON_KNUCKLE_CHEST, {[]{return IsAdult || KokiriSword || HasExplosives;}}), + LocationAccess(RC_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST, {[]{return IsAdult || KokiriSword || HasExplosives;}}), }, { //Exits - Entrance(GERUDO_TRAINING_GROUNDS_MQ_STALFOS_ROOM, {[]{return (IsAdult && CanUse(LONGSHOT)) || LogicGtgMQWithoutHookshot || (LogicGtgMQWithHookshot && IsAdult && CanUse(HOOKSHOT));}}), - //Trick: (IsAdult && CanUse(LONGSHOT)) || LogicGtgMQWithoutHookshot || (LogicGtgMQWithHookshot && IsAdult && CanUse(HOOKSHOT)) + Entrance(RR_GERUDO_TRAINING_GROUNDS_MQ_STALFOS_ROOM, {[]{return (IsAdult && CanUse(RG_LONGSHOT)) || LogicGtgMQWithoutHookshot || (LogicGtgMQWithHookshot && IsAdult && CanUse(RG_HOOKSHOT));}}), + //Trick: (IsAdult && CanUse(RG_LONGSHOT)) || LogicGtgMQWithoutHookshot || (LogicGtgMQWithHookshot && IsAdult && CanUse(RG_HOOKSHOT)) }); - areaTable[GERUDO_TRAINING_GROUNDS_MQ_STALFOS_ROOM] = Area("Gerudo Training Grounds MQ Stalfos Room", "Gerudo Training Grounds", GERUDO_TRAINING_GROUNDS, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GERUDO_TRAINING_GROUNDS_MQ_STALFOS_ROOM] = Area("Gerudo Training Grounds MQ Stalfos Room", "Gerudo Training Grounds", RHT_GERUDO_TRAINING_GROUND, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&BlueFireAccess, {[]{return BlueFireAccess || HasBottle;}}), }, { //Locations - LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_BEFORE_HEAVY_BLOCK_CHEST, {[]{return IsAdult;}}), - LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_HEAVY_BLOCK_CHEST, {[]{return CanUse(SILVER_GAUNTLETS);}}), + LocationAccess(RC_GERUDO_TRAINING_GROUND_MQ_BEFORE_HEAVY_BLOCK_CHEST, {[]{return IsAdult;}}), + LocationAccess(RC_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST, {[]{return CanUse(RG_SILVER_GAUNTLETS);}}), }, { //Exits - Entrance(GERUDO_TRAINING_GROUNDS_MQ_BACK_AREAS, {[]{return IsAdult && (LogicLensGtgMQ || CanUse(LENS_OF_TRUTH)) && BlueFire && (CanPlay(SongOfTime) || (LogicGtgFakeWall && IsAdult && CanUse(HOVER_BOOTS)));}}), - //Trick: IsAdult && (LogicLensGtgMQ || CanUse(LENS_OF_TRUTH)) && BlueFire && (CanPlay(SongOfTime) || (LogicGtgFakeWall && IsAdult && CanUse(HOVER_BOOTS))) + Entrance(RR_GERUDO_TRAINING_GROUNDS_MQ_BACK_AREAS, {[]{return IsAdult && (LogicLensGtgMQ || CanUse(RG_LENS_OF_TRUTH)) && BlueFire && (CanPlay(SongOfTime) || (LogicGtgFakeWall && IsAdult && CanUse(RG_HOVER_BOOTS)));}}), + //Trick: IsAdult && (LogicLensGtgMQ || CanUse(RG_LENS_OF_TRUTH)) && BlueFire && (CanPlay(SongOfTime) || (LogicGtgFakeWall && IsAdult && CanUse(RG_HOVER_BOOTS))) }); - areaTable[GERUDO_TRAINING_GROUNDS_MQ_BACK_AREAS] = Area("Gerudo Training Grounds MQ Back Areas", "Gerudo Training Grounds", GERUDO_TRAINING_GROUNDS, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUNDS_MQ_BACK_AREAS] = Area("Gerudo Training Grounds MQ Back Areas", "Gerudo Training Grounds", RHT_GERUDO_TRAINING_GROUND, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_EYE_STATUE_CHEST, {[]{return Bow;}}), - LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_SECOND_IRON_KNUCKLE_CHEST, {[]{return true;}}), - LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_FLAME_CIRCLE_CHEST, {[]{return CanUse(HOOKSHOT) || Bow || HasExplosives;}}), + LocationAccess(RC_GERUDO_TRAINING_GROUND_MQ_EYE_STATUE_CHEST, {[]{return Bow;}}), + LocationAccess(RC_GERUDO_TRAINING_GROUND_MQ_SECOND_IRON_KNUCKLE_CHEST, {[]{return true;}}), + LocationAccess(RC_GERUDO_TRAINING_GROUND_MQ_FLAME_CIRCLE_CHEST, {[]{return CanUse(RG_HOOKSHOT) || Bow || HasExplosives;}}), }, { //Exits - Entrance(GERUDO_TRAINING_GROUNDS_MQ_CENTRAL_MAZE_RIGHT, {[]{return Hammer;}}), - Entrance(GERUDO_TRAINING_GROUNDS_MQ_RIGHT_SIDE, {[]{return CanUse(LONGSHOT);}}), + Entrance(RR_GERUDO_TRAINING_GROUNDS_MQ_CENTRAL_MAZE_RIGHT, {[]{return Hammer;}}), + Entrance(RR_GERUDO_TRAINING_GROUNDS_MQ_RIGHT_SIDE, {[]{return CanUse(RG_LONGSHOT);}}), }); - areaTable[GERUDO_TRAINING_GROUNDS_MQ_CENTRAL_MAZE_RIGHT] = Area("Gerudo Training Grounds MQ Central Maze Right", "Gerudo Training Grounds", GERUDO_TRAINING_GROUNDS, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUNDS_MQ_CENTRAL_MAZE_RIGHT] = Area("Gerudo Training Grounds MQ Central Maze Right", "Gerudo Training Grounds", RHT_GERUDO_TRAINING_GROUND, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_MAZE_RIGHT_CENTRAL_CHEST, {[]{return true;}}), - LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_MAZE_RIGHT_SIDE_CHEST, {[]{return true;}}), - LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_ICE_ARROWS_CHEST, {[]{return SmallKeys(GERUDO_TRAINING_GROUNDS, 3);}}), + 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 SmallKeys(RR_GERUDO_TRAINING_GROUNDS, 3);}}), }, { //Exits - Entrance(GERUDO_TRAINING_GROUNDS_MQ_UNDERWATER, {[]{return IsAdult && (CanUse(LONGSHOT) || (CanUse(HOOKSHOT) && Bow));}}), - Entrance(GERUDO_TRAINING_GROUNDS_MQ_RIGHT_SIDE, {[]{return IsAdult && CanUse(HOOKSHOT);}}), + Entrance(RR_GERUDO_TRAINING_GROUNDS_MQ_UNDERWATER, {[]{return IsAdult && (CanUse(RG_LONGSHOT) || (CanUse(RG_HOOKSHOT) && Bow));}}), + Entrance(RR_GERUDO_TRAINING_GROUNDS_MQ_RIGHT_SIDE, {[]{return IsAdult && CanUse(RG_HOOKSHOT);}}), }); } } 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 70fd1f22b..7dbf7ad15 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 @@ -6,204 +6,204 @@ using namespace Logic; using namespace Settings; void AreaTable_Init_GerudoValley() { - areaTable[GERUDO_VALLEY] = Area("Gerudo Valley", "Gerudo Valley", GERUDO_VALLEY, DAY_NIGHT_CYCLE, { + areaTable[RR_GERUDO_VALLEY] = Area("Gerudo Valley", "Gerudo Valley", RHT_GERUDO_VALLEY, DAY_NIGHT_CYCLE, { //Events EventAccess(&BugRock, {[]{return BugRock || IsChild;}}), }, { //Locations - LocationAccess(GV_GS_SMALL_BRIDGE, {[]{return IsChild && HookshotOrBoomerang && AtNight && CanGetNightTimeGS;}}), + LocationAccess(RC_GV_GS_SMALL_BRIDGE, {[]{return IsChild && HookshotOrBoomerang && AtNight && CanGetNightTimeGS;}}), }, { //Exits - Entrance(HYRULE_FIELD, {[]{return true;}}), - Entrance(GV_UPPER_STREAM, {[]{return true;}}), - Entrance(GV_CRATE_LEDGE, {[]{return IsChild || CanUse(LONGSHOT);}}), - Entrance(GV_GROTTO_LEDGE, {[]{return true;}}), - Entrance(GV_FORTRESS_SIDE, {[]{return (IsAdult && (CanRideEpona || CanUse(LONGSHOT) || GerudoFortress.Is(GERUDOFORTRESS_OPEN) || CarpenterRescue)) || (IsChild && CanUse(HOOKSHOT));}}), + Entrance(RR_HYRULE_FIELD, {[]{return true;}}), + Entrance(RR_GV_UPPER_STREAM, {[]{return true;}}), + Entrance(RR_GV_CRATE_LEDGE, {[]{return IsChild || CanUse(RG_LONGSHOT);}}), + Entrance(RR_GV_GROTTO_LEDGE, {[]{return true;}}), + Entrance(RR_GV_FORTRESS_SIDE, {[]{return (IsAdult && (CanRideEpona || CanUse(RG_LONGSHOT) || GerudoFortress.Is(GERUDOFORTRESS_OPEN) || CarpenterRescue)) || (IsChild && CanUse(RG_HOOKSHOT));}}), }); - areaTable[GV_UPPER_STREAM] = Area("GV Upper Stream", "Gerudo Valley", GERUDO_VALLEY, DAY_NIGHT_CYCLE, { + areaTable[RR_GV_UPPER_STREAM] = Area("GV Upper Stream", "Gerudo Valley", RHT_GERUDO_VALLEY, DAY_NIGHT_CYCLE, { //Events EventAccess(&GossipStoneFairy, {[]{return GossipStoneFairy || CanSummonGossipFairy;}}), - EventAccess(&BeanPlantFairy, {[]{return BeanPlantFairy || (CanPlantBean(GV_UPPER_STREAM) && CanPlay(SongOfStorms));}}), + EventAccess(&BeanPlantFairy, {[]{return BeanPlantFairy || (CanPlantBean(RR_GV_UPPER_STREAM) && CanPlay(SongOfStorms));}}), }, { //Locations - LocationAccess(GV_WATERFALL_FREESTANDING_POH, {[]{return true;}}), - LocationAccess(GV_GS_BEAN_PATCH, {[]{return CanPlantBugs && CanChildAttack;}}), - LocationAccess(GV_COW, {[]{return IsChild && CanPlay(EponasSong);}}), - LocationAccess(GV_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_GV_WATERFALL_FREESTANDING_POH, {[]{return true;}}), + LocationAccess(RC_GV_GS_BEAN_PATCH, {[]{return CanPlantBugs && CanChildAttack;}}), + LocationAccess(RC_GV_COW, {[]{return IsChild && CanPlay(EponasSong);}}), + LocationAccess(RC_GV_GOSSIP_STONE, {[]{return true;}}), }, { //Exits - Entrance(GV_LOWER_STREAM, {[]{return true;}}), + Entrance(RR_GV_LOWER_STREAM, {[]{return true;}}), }); - areaTable[GV_LOWER_STREAM] = Area("GV Lower Stream", "Gerudo Valley", GERUDO_VALLEY, DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GV_LOWER_STREAM] = Area("GV Lower Stream", "Gerudo Valley", RHT_GERUDO_VALLEY, DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(LAKE_HYLIA, {[]{return true;}}), + Entrance(RR_LAKE_HYLIA, {[]{return true;}}), }); - areaTable[GV_GROTTO_LEDGE] = Area("GV Grotto Ledge", "Gerudo Valley", GERUDO_VALLEY, DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GV_GROTTO_LEDGE] = Area("GV Grotto Ledge", "Gerudo Valley", RHT_GERUDO_VALLEY, DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(GV_LOWER_STREAM, {[]{return true;}}), - Entrance(GV_OCTOROK_GROTTO, {[]{return CanUse(SILVER_GAUNTLETS);}}), - Entrance(GV_CRATE_LEDGE, {[]{return CanUse(LONGSHOT);}}), + Entrance(RR_GV_LOWER_STREAM, {[]{return true;}}), + Entrance(RR_GV_OCTOROK_GROTTO, {[]{return CanUse(RG_SILVER_GAUNTLETS);}}), + Entrance(RR_GV_CRATE_LEDGE, {[]{return CanUse(RG_LONGSHOT);}}), }); - areaTable[GV_CRATE_LEDGE] = Area("GV Crate Ledge", "Gerudo Valley", GERUDO_VALLEY, DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GV_CRATE_LEDGE] = Area("GV Crate Ledge", "Gerudo Valley", RHT_GERUDO_VALLEY, DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(GV_CRATE_FREESTANDING_POH, {[]{return true;}}), + LocationAccess(RC_GV_CRATE_FREESTANDING_POH, {[]{return true;}}), }, { //Exits - Entrance(GV_LOWER_STREAM, {[]{return true;}}), + Entrance(RR_GV_LOWER_STREAM, {[]{return true;}}), }); - areaTable[GV_FORTRESS_SIDE] = Area("GV Fortress Side", "Gerudo Valley", GERUDO_VALLEY, DAY_NIGHT_CYCLE, { + areaTable[RR_GV_FORTRESS_SIDE] = Area("GV Fortress Side", "Gerudo Valley", RHT_GERUDO_VALLEY, DAY_NIGHT_CYCLE, { //Events EventAccess(&BrokenSwordAccess, {[]{return IsAdult && (PoachersSawAccess || PoachersSaw);}}), }, { //Locations - LocationAccess(GV_CHEST, {[]{return IsAdult && CanUse(MEGATON_HAMMER);}}), - LocationAccess(GV_TRADE_SAW, {[]{return IsAdult && PoachersSaw;}}), - LocationAccess(GV_GS_BEHIND_TENT, {[]{return IsAdult && HookshotOrBoomerang && AtNight && CanGetNightTimeGS;}}), - LocationAccess(GV_GS_PILLAR, {[]{return IsAdult && HookshotOrBoomerang && AtNight && CanGetNightTimeGS;}}), + LocationAccess(RC_GV_CHEST, {[]{return IsAdult && CanUse(RG_MEGATON_HAMMER);}}), + LocationAccess(RC_GV_TRADE_SAW, {[]{return IsAdult && PoachersSaw;}}), + LocationAccess(RC_GV_GS_BEHIND_TENT, {[]{return IsAdult && HookshotOrBoomerang && AtNight && CanGetNightTimeGS;}}), + LocationAccess(RC_GV_GS_PILLAR, {[]{return IsAdult && HookshotOrBoomerang && AtNight && CanGetNightTimeGS;}}), }, { //Exits - Entrance(GERUDO_FORTRESS, {[]{return true;}}), - Entrance(GV_UPPER_STREAM, {[]{return true;}}), - Entrance(GERUDO_VALLEY, {[]{return IsChild || CanRideEpona || CanUse(LONGSHOT) || GerudoFortress.Is(GERUDOFORTRESS_OPEN) || CarpenterRescue;}}), - Entrance(GV_CARPENTER_TENT, {[]{return IsAdult;}}), - Entrance(GV_STORMS_GROTTO, {[]{return IsAdult && CanOpenStormGrotto;}}), - Entrance(GV_CRATE_LEDGE, {[]{return false;}}), + Entrance(RR_GERUDO_FORTRESS, {[]{return true;}}), + Entrance(RR_GV_UPPER_STREAM, {[]{return true;}}), + Entrance(RR_GERUDO_VALLEY, {[]{return IsChild || CanRideEpona || CanUse(RG_LONGSHOT) || GerudoFortress.Is(GERUDOFORTRESS_OPEN) || CarpenterRescue;}}), + Entrance(RR_GV_CARPENTER_TENT, {[]{return IsAdult;}}), + Entrance(RR_GV_STORMS_GROTTO, {[]{return IsAdult && CanOpenStormGrotto;}}), + Entrance(RR_GV_CRATE_LEDGE, {[]{return false;}}), }); - areaTable[GV_CARPENTER_TENT] = Area("GV Carpenter Tent", "GV Carpenter Tent", NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GV_CARPENTER_TENT] = Area("GV Carpenter Tent", "GV Carpenter Tent", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(GV_FORTRESS_SIDE, {[]{return true;}}), + Entrance(RR_GV_FORTRESS_SIDE, {[]{return true;}}), }); - areaTable[GV_OCTOROK_GROTTO] = Area("GV Octorok Grotto", "GV Octorok Grotto", NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GV_OCTOROK_GROTTO] = Area("GV Octorok Grotto", "GV Octorok Grotto", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(GV_GROTTO_LEDGE, {[]{return true;}}), + Entrance(RR_GV_GROTTO_LEDGE, {[]{return true;}}), }); - areaTable[GV_STORMS_GROTTO] = Area("GV Storms Grotto", "GV Storms Grotto", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GV_STORMS_GROTTO] = Area("GV Storms Grotto", "GV Storms Grotto", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(GV_DEKU_SCRUB_GROTTO_REAR, {[]{return CanStunDeku;}}), - LocationAccess(GV_DEKU_SCRUB_GROTTO_FRONT, {[]{return CanStunDeku;}}), + LocationAccess(RC_GV_DEKU_SCRUB_GROTTO_REAR, {[]{return CanStunDeku;}}), + LocationAccess(RC_GV_DEKU_SCRUB_GROTTO_FRONT, {[]{return CanStunDeku;}}), }, { //Exits - Entrance(GV_FORTRESS_SIDE, {[]{return true;}}), + Entrance(RR_GV_FORTRESS_SIDE, {[]{return true;}}), }); - areaTable[GERUDO_FORTRESS] = Area("Gerudo Fortress", "Gerudo Fortress", GERUDO_FORTRESS, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GERUDO_FORTRESS] = Area("Gerudo Fortress", "Gerudo Fortress", RHT_GERUDO_FORTRESS, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&CarpenterRescue, {[]{return CanFinishGerudoFortress;}}), EventAccess(&GF_GateOpen, {[]{return IsAdult && GerudoToken;}}), EventAccess(&GtG_GateOpen, {[]{return GtG_GateOpen || (IsAdult && GerudoToken);}}), }, { //Locations - LocationAccess(GF_CHEST, {[]{return CanUse(HOVER_BOOTS) || (IsAdult && CanUse(SCARECROW)) || CanUse(LONGSHOT);}}), - LocationAccess(GF_HBA_1000_POINTS, {[]{return GerudoToken && CanRideEpona && Bow && AtDay;}}), - LocationAccess(GF_HBA_1500_POINTS, {[]{return GerudoToken && CanRideEpona && Bow && AtDay;}}), - LocationAccess(GF_NORTH_F1_CARPENTER, {[]{return IsAdult || KokiriSword || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD);}}), - LocationAccess(GF_NORTH_F2_CARPENTER, {[]{return (IsAdult || KokiriSword || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)) && (GerudoToken || CanUse(BOW) || CanUse(HOOKSHOT) || CanUse(HOVER_BOOTS) || LogicGerudoKitchen);}}), - LocationAccess(GF_SOUTH_F1_CARPENTER, {[]{return IsAdult || KokiriSword || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD);}}), - LocationAccess(GF_SOUTH_F2_CARPENTER, {[]{return IsAdult || KokiriSword || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD);}}), - LocationAccess(GF_GERUDO_MEMBERSHIP_CARD, {[]{return CanFinishGerudoFortress;}}), - LocationAccess(GF_GS_ARCHERY_RANGE, {[]{return IsAdult && HookshotOrBoomerang && GerudoToken && AtNight && CanGetNightTimeGS;}}), - LocationAccess(GF_GS_TOP_FLOOR, {[]{return IsAdult && AtNight && (GerudoToken || CanUse(BOW) || CanUse(HOOKSHOT) || CanUse(HOVER_BOOTS) || LogicGerudoKitchen || LogicGFJump) && CanGetNightTimeGS;}}), + LocationAccess(RC_GF_CHEST, {[]{return CanUse(RG_HOVER_BOOTS) || (IsAdult && CanUse(RG_SCARECROW)) || CanUse(RG_LONGSHOT);}}), + LocationAccess(RC_GF_HBA_1000_POINTS, {[]{return GerudoToken && CanRideEpona && Bow && AtDay;}}), + LocationAccess(RC_GF_HBA_1500_POINTS, {[]{return GerudoToken && CanRideEpona && Bow && AtDay;}}), + LocationAccess(RC_GF_NORTH_F1_CARPENTER, {[]{return IsAdult || KokiriSword || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD);}}), + LocationAccess(RC_GF_NORTH_F2_CARPENTER, {[]{return (IsAdult || KokiriSword || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD)) && (GerudoToken || CanUse(RG_FAIRY_BOW) || CanUse(RG_HOOKSHOT) || CanUse(RG_HOVER_BOOTS) || LogicGerudoKitchen);}}), + LocationAccess(RC_GF_SOUTH_F1_CARPENTER, {[]{return IsAdult || KokiriSword || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD);}}), + LocationAccess(RC_GF_SOUTH_F2_CARPENTER, {[]{return IsAdult || KokiriSword || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD);}}), + LocationAccess(RC_GF_GERUDO_MEMBERSHIP_CARD, {[]{return CanFinishGerudoFortress;}}), + LocationAccess(RC_GF_GS_ARCHERY_RANGE, {[]{return IsAdult && HookshotOrBoomerang && GerudoToken && AtNight && CanGetNightTimeGS;}}), + LocationAccess(RC_GF_GS_TOP_FLOOR, {[]{return IsAdult && AtNight && (GerudoToken || CanUse(RG_FAIRY_BOW) || CanUse(RG_HOOKSHOT) || CanUse(RG_HOVER_BOOTS) || LogicGerudoKitchen || LogicGFJump) && CanGetNightTimeGS;}}), }, { //Exits - Entrance(GV_FORTRESS_SIDE, {[]{return true;}}), - Entrance(GF_OUTSIDE_GATE, {[]{return GF_GateOpen;}}), - Entrance(GERUDO_TRAINING_GROUNDS_ENTRYWAY, {[]{return GtG_GateOpen && (IsAdult || ShuffleDungeonEntrances);}}), - Entrance(GF_STORMS_GROTTO, {[]{return IsAdult && CanOpenStormGrotto;}}), + Entrance(RR_GV_FORTRESS_SIDE, {[]{return true;}}), + Entrance(RR_GF_OUTSIDE_GATE, {[]{return GF_GateOpen;}}), + Entrance(RR_GERUDO_TRAINING_GROUNDS_ENTRYWAY, {[]{return GtG_GateOpen && (IsAdult || ShuffleDungeonEntrances);}}), + Entrance(RR_GF_STORMS_GROTTO, {[]{return IsAdult && CanOpenStormGrotto;}}), }); - areaTable[GF_OUTSIDE_GATE] = Area("GF Outside Gate", "Gerudo Fortress", NONE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GF_OUTSIDE_GATE] = Area("GF Outside Gate", "Gerudo Fortress", RHT_NONE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&GF_GateOpen, {[]{return IsAdult && GerudoToken && (ShuffleGerudoToken || ShuffleOverworldEntrances /*|| ShuffleSpecialIndoorEntrances*/);}}), }, {}, { //Exits - Entrance(GERUDO_FORTRESS, {[]{return (IsAdult && (Hookshot || !ShuffleOverworldEntrances)) || GF_GateOpen;}}), - Entrance(WASTELAND_NEAR_FORTRESS, {[]{return true;}}), + Entrance(RR_GERUDO_FORTRESS, {[]{return (IsAdult && (Hookshot || !ShuffleOverworldEntrances)) || GF_GateOpen;}}), + Entrance(RR_WASTELAND_NEAR_FORTRESS, {[]{return true;}}), }); - areaTable[GF_STORMS_GROTTO] = Area("GF Storms Grotto", "GF Storms Grotto", NONE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GF_STORMS_GROTTO] = Area("GF Storms Grotto", "GF Storms Grotto", RHT_NONE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&FreeFairies, {[]{return true;}}), }, {}, { //Exits - Entrance(GERUDO_FORTRESS, {[]{return true;}}), + Entrance(RR_GERUDO_FORTRESS, {[]{return true;}}), }); - areaTable[WASTELAND_NEAR_FORTRESS] = Area("Wasteland Near Fortress", "Haunted Wasteland", HAUNTED_WASTELAND, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WASTELAND_NEAR_FORTRESS] = Area("Wasteland Near Fortress", "Haunted Wasteland", RHT_HAUNTED_WASTELAND, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(GF_OUTSIDE_GATE, {[]{return true;}}), - Entrance(HAUNTED_WASTELAND, {[]{return CanUse(HOVER_BOOTS) || CanUse(LONGSHOT) || LogicWastelandCrossing;}}), + Entrance(RR_GF_OUTSIDE_GATE, {[]{return true;}}), + Entrance(RR_HAUNTED_WASTELAND, {[]{return CanUse(RG_HOVER_BOOTS) || CanUse(RG_LONGSHOT) || LogicWastelandCrossing;}}), }); - areaTable[HAUNTED_WASTELAND] = Area("Haunted Wasteland", "Haunted Wasteland", HAUNTED_WASTELAND, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_HAUNTED_WASTELAND] = Area("Haunted Wasteland", "Haunted Wasteland", RHT_HAUNTED_WASTELAND, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&FairyPot, {[]{return true;}}), EventAccess(&NutPot, {[]{return true;}}), }, { //Locations - LocationAccess(WASTELAND_CHEST, {[]{return HasFireSource;}}), - LocationAccess(WASTELAND_BOMBCHU_SALESMAN, {[]{return AdultsWallet && (IsAdult || Sticks || KokiriSword);}}), - LocationAccess(WASTELAND_GS, {[]{return HookshotOrBoomerang;}}), + LocationAccess(RC_WASTELAND_CHEST, {[]{return HasFireSource;}}), + LocationAccess(RC_WASTELAND_BOMBCHU_SALESMAN, {[]{return AdultsWallet && (IsAdult || Sticks || KokiriSword);}}), + LocationAccess(RC_WASTELAND_GS, {[]{return HookshotOrBoomerang;}}), }, { //Exits - Entrance(WASTELAND_NEAR_COLOSSUS, {[]{return LogicLensWasteland || CanUse(LENS_OF_TRUTH);}}), - Entrance(WASTELAND_NEAR_FORTRESS, {[]{return CanUse(HOVER_BOOTS) || CanUse(LONGSHOT) || LogicWastelandCrossing;}}), + Entrance(RR_WASTELAND_NEAR_COLOSSUS, {[]{return LogicLensWasteland || CanUse(RG_LENS_OF_TRUTH);}}), + Entrance(RR_WASTELAND_NEAR_FORTRESS, {[]{return CanUse(RG_HOVER_BOOTS) || CanUse(RG_LONGSHOT) || LogicWastelandCrossing;}}), }); - areaTable[WASTELAND_NEAR_COLOSSUS] = Area("Wasteland Near Colossus", "Haunted Wasteland", NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WASTELAND_NEAR_COLOSSUS] = Area("Wasteland Near Colossus", "Haunted Wasteland", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(DESERT_COLOSSUS, {[]{return true;}}), - Entrance(HAUNTED_WASTELAND, {[]{return LogicReverseWasteland || false;}}), + Entrance(RR_DESERT_COLOSSUS, {[]{return true;}}), + Entrance(RR_HAUNTED_WASTELAND, {[]{return LogicReverseWasteland || false;}}), }); - areaTable[DESERT_COLOSSUS] = Area("Desert Colossus", "Desert Colossus", DESERT_COLOSSUS, DAY_NIGHT_CYCLE, { + areaTable[RR_DESERT_COLOSSUS] = Area("Desert Colossus", "Desert Colossus", RHT_DESERT_COLOSSUS, DAY_NIGHT_CYCLE, { //Events EventAccess(&FairyPond, {[]{return FairyPond || CanPlay(SongOfStorms);}}), EventAccess(&BugRock, {[]{return true;}}), }, { //Locations - LocationAccess(COLOSSUS_FREESTANDING_POH, {[]{return IsAdult && CanPlantBean(DESERT_COLOSSUS);}}), - LocationAccess(COLOSSUS_GS_BEAN_PATCH, {[]{return CanPlantBugs && CanChildAttack;}}), - LocationAccess(COLOSSUS_GS_TREE, {[]{return IsAdult && HookshotOrBoomerang && AtNight && CanGetNightTimeGS;}}), - LocationAccess(COLOSSUS_GS_HILL, {[]{return IsAdult && AtNight && (CanPlantBean(DESERT_COLOSSUS) || CanUse(LONGSHOT) || (LogicColossusGS && CanUse(HOOKSHOT))) && CanGetNightTimeGS;}}), - LocationAccess(COLOSSUS_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_COLOSSUS_FREESTANDING_POH, {[]{return IsAdult && CanPlantBean(RR_DESERT_COLOSSUS);}}), + LocationAccess(RC_COLOSSUS_GS_BEAN_PATCH, {[]{return CanPlantBugs && CanChildAttack;}}), + LocationAccess(RC_COLOSSUS_GS_TREE, {[]{return IsAdult && HookshotOrBoomerang && AtNight && CanGetNightTimeGS;}}), + LocationAccess(RC_COLOSSUS_GS_HILL, {[]{return IsAdult && AtNight && (CanPlantBean(RR_DESERT_COLOSSUS) || CanUse(RG_LONGSHOT) || (LogicColossusGS && CanUse(RG_HOOKSHOT))) && CanGetNightTimeGS;}}), + LocationAccess(RC_COLOSSUS_GOSSIP_STONE, {[]{return true;}}), }, { //Exits - Entrance(COLOSSUS_GREAT_FAIRY_FOUNTAIN, {[]{return HasExplosives;}}), - Entrance(SPIRIT_TEMPLE_ENTRYWAY, {[]{return true;}}), - Entrance(WASTELAND_NEAR_COLOSSUS, {[]{return true;}}), - Entrance(COLOSSUS_GROTTO, {[]{return CanUse(SILVER_GAUNTLETS);}}), + Entrance(RR_COLOSSUS_GREAT_FAIRY_FOUNTAIN, {[]{return HasExplosives;}}), + Entrance(RR_SPIRIT_TEMPLE_ENTRYWAY, {[]{return true;}}), + Entrance(RR_WASTELAND_NEAR_COLOSSUS, {[]{return true;}}), + Entrance(RR_COLOSSUS_GROTTO, {[]{return CanUse(RG_SILVER_GAUNTLETS);}}), }); - areaTable[DESERT_COLOSSUS_FROM_SPIRIT_ENTRYWAY] = Area("Desert Colossus From Spirit Entryway", "Desert Colossus", DESERT_COLOSSUS, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DESERT_COLOSSUS_FROM_SPIRIT_ENTRYWAY] = Area("Desert Colossus From Spirit Entryway", "Desert Colossus", RHT_DESERT_COLOSSUS, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(SHEIK_AT_COLOSSUS, {[]{return true;}}), + LocationAccess(RC_SHEIK_AT_COLOSSUS, {[]{return true;}}), }, { //Exist - Entrance(DESERT_COLOSSUS, {[]{return true;}}), + Entrance(RR_DESERT_COLOSSUS, {[]{return true;}}), }); - areaTable[COLOSSUS_GREAT_FAIRY_FOUNTAIN] = Area("Colossus Great Fairy Fountain", "Colossus Great Fairy Fountain", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_COLOSSUS_GREAT_FAIRY_FOUNTAIN] = Area("Colossus Great Fairy Fountain", "Colossus Great Fairy Fountain", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(COLOSSUS_GREAT_FAIRY_REWARD, {[]{return CanPlay(ZeldasLullaby);}}), + LocationAccess(RC_COLOSSUS_GREAT_FAIRY_REWARD, {[]{return CanPlay(ZeldasLullaby);}}), }, { //Exits - Entrance(DESERT_COLOSSUS, {[]{return true;}}), + Entrance(RR_DESERT_COLOSSUS, {[]{return true;}}), }); - areaTable[COLOSSUS_GROTTO] = Area("Colossus Grotto", "Colossus Grotto", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_COLOSSUS_GROTTO] = Area("Colossus Grotto", "Colossus Grotto", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(COLOSSUS_DEKU_SCRUB_GROTTO_REAR, {[]{return CanStunDeku;}}), - LocationAccess(COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, {[]{return CanStunDeku;}}), + LocationAccess(RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, {[]{return CanStunDeku;}}), + LocationAccess(RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, {[]{return CanStunDeku;}}), }, { //Exits - Entrance(DESERT_COLOSSUS, {[]{return true;}}), + Entrance(RR_DESERT_COLOSSUS, {[]{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 7b247049d..d807c9570 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 @@ -6,229 +6,229 @@ using namespace Logic; using namespace Settings; void AreaTable_Init_HyruleField() { - areaTable[HYRULE_FIELD] = Area("Hyrule Field", "Hyrule Field", HYRULE_FIELD, DAY_NIGHT_CYCLE, { + areaTable[RR_HYRULE_FIELD] = Area("Hyrule Field", "Hyrule Field", RHT_HYRULE_FIELD, DAY_NIGHT_CYCLE, { //Events - EventAccess(&BigPoeKill, {[]{return CanUse(BOW) && CanRideEpona && HasBottle;}}), + EventAccess(&BigPoeKill, {[]{return CanUse(RG_FAIRY_BOW) && CanRideEpona && HasBottle;}}), }, { //Locations - LocationAccess(HF_OCARINA_OF_TIME_ITEM, {[]{return IsChild && HasAllStones;}}), - LocationAccess(SONG_FROM_OCARINA_OF_TIME, {[]{return IsChild && HasAllStones;}}), + LocationAccess(RC_HF_OCARINA_OF_TIME_ITEM, {[]{return IsChild && HasAllStones;}}), + LocationAccess(RC_SONG_FROM_OCARINA_OF_TIME, {[]{return IsChild && HasAllStones;}}), }, { //Exits - Entrance(LW_BRIDGE, {[]{return true;}}), - Entrance(LAKE_HYLIA, {[]{return true;}}), - Entrance(GERUDO_VALLEY, {[]{return true;}}), - Entrance(MARKET_ENTRANCE, {[]{return true;}}), - Entrance(KAKARIKO_VILLAGE, {[]{return true;}}), - Entrance(ZR_FRONT, {[]{return true;}}), - Entrance(LON_LON_RANCH, {[]{return true;}}), - Entrance(HF_SOUTHEAST_GROTTO, {[]{return Here(HYRULE_FIELD, []{return CanBlastOrSmash;});}}), - Entrance(HF_OPEN_GROTTO, {[]{return true;}}), - Entrance(HF_INSIDE_FENCE_GROTTO, {[]{return CanOpenBombGrotto;}}), - Entrance(HF_COW_GROTTO, {[]{return (CanUse(MEGATON_HAMMER) || IsChild) && CanOpenBombGrotto;}}), - Entrance(HF_NEAR_MARKET_GROTTO, {[]{return Here(HYRULE_FIELD, []{return CanBlastOrSmash;});}}), - Entrance(HF_FAIRY_GROTTO, {[]{return Here(HYRULE_FIELD, []{return CanBlastOrSmash;});}}), - Entrance(HF_NEAR_KAK_GROTTO, {[]{return CanOpenBombGrotto;}}), - Entrance(HF_TEKTITE_GROTTO, {[]{return CanOpenBombGrotto;}}), + Entrance(RR_LW_BRIDGE, {[]{return true;}}), + Entrance(RR_LAKE_HYLIA, {[]{return true;}}), + Entrance(RR_GERUDO_VALLEY, {[]{return true;}}), + Entrance(RR_MARKET_ENTRANCE, {[]{return true;}}), + Entrance(RR_KAKARIKO_VILLAGE, {[]{return true;}}), + Entrance(RR_ZR_FRONT, {[]{return true;}}), + Entrance(RR_LON_LON_RANCH, {[]{return true;}}), + Entrance(RR_HF_SOUTHEAST_GROTTO, {[]{return Here(RR_HYRULE_FIELD, []{return CanBlastOrSmash;});}}), + Entrance(RR_HF_OPEN_GROTTO, {[]{return true;}}), + Entrance(RR_HF_INSIDE_FENCE_GROTTO, {[]{return CanOpenBombGrotto;}}), + Entrance(RR_HF_COW_GROTTO, {[]{return (CanUse(RG_MEGATON_HAMMER) || IsChild) && CanOpenBombGrotto;}}), + Entrance(RR_HF_NEAR_MARKET_GROTTO, {[]{return Here(RR_HYRULE_FIELD, []{return CanBlastOrSmash;});}}), + Entrance(RR_HF_FAIRY_GROTTO, {[]{return Here(RR_HYRULE_FIELD, []{return CanBlastOrSmash;});}}), + Entrance(RR_HF_NEAR_KAK_GROTTO, {[]{return CanOpenBombGrotto;}}), + Entrance(RR_HF_TEKTITE_GROTTO, {[]{return CanOpenBombGrotto;}}), }); - areaTable[HF_SOUTHEAST_GROTTO] = Area("HF Southeast Grotto", "HF Southeast Grotto", NONE, NO_DAY_NIGHT_CYCLE, grottoEvents, { + areaTable[RR_HF_SOUTHEAST_GROTTO] = Area("HF Southeast Grotto", "HF Southeast Grotto", RHT_NONE, NO_DAY_NIGHT_CYCLE, grottoEvents, { //Locations - LocationAccess(HF_SOUTHEAST_GROTTO_CHEST, {[]{return true;}}), - LocationAccess(HF_SOUTHEAST_GROTTO_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_HF_SOUTHEAST_GROTTO_CHEST, {[]{return true;}}), + LocationAccess(RC_HF_SOUTHEAST_GOSSIP_STONE, {[]{return true;}}), }, { //Exits - Entrance(HYRULE_FIELD, {[]{return true;}}), + Entrance(RR_HYRULE_FIELD, {[]{return true;}}), }); - areaTable[HF_OPEN_GROTTO] = Area("HF Open Grotto", "HF Open Grotto", NONE, NO_DAY_NIGHT_CYCLE, grottoEvents, { + areaTable[RR_HF_OPEN_GROTTO] = Area("HF Open Grotto", "HF Open Grotto", RHT_NONE, NO_DAY_NIGHT_CYCLE, grottoEvents, { //Locations - LocationAccess(HF_OPEN_GROTTO_CHEST, {[]{return true;}}), - LocationAccess(HF_OPEN_GROTTO_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_HF_OPEN_GROTTO_CHEST, {[]{return true;}}), + LocationAccess(RC_HF_OPEN_GROTTO_GOSSIP_STONE, {[]{return true;}}), }, { //Exits - Entrance(HYRULE_FIELD, {[]{return true;}}), + Entrance(RR_HYRULE_FIELD, {[]{return true;}}), }); - areaTable[HF_INSIDE_FENCE_GROTTO] = Area("HF Inside Fence Grotto", "HF Inside Fence Grotto", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_HF_INSIDE_FENCE_GROTTO] = Area("HF Inside Fence Grotto", "HF Inside Fence Grotto", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(HF_DEKU_SCRUB_GROTTO, {[]{return CanStunDeku;}}), + LocationAccess(RC_HF_DEKU_SCRUB_GROTTO, {[]{return CanStunDeku;}}), }, { //Exits - Entrance(HYRULE_FIELD, {[]{return true;}}), + Entrance(RR_HYRULE_FIELD, {[]{return true;}}), }); - areaTable[HF_COW_GROTTO] = Area("HF Cow Grotto", "HF Cow Grotto", NONE, NO_DAY_NIGHT_CYCLE, grottoEvents, { + areaTable[RR_HF_COW_GROTTO] = Area("HF Cow Grotto", "HF Cow Grotto", RHT_NONE, NO_DAY_NIGHT_CYCLE, grottoEvents, { //Locations - LocationAccess(HF_GS_COW_GROTTO, {[]{return HasFireSource && HookshotOrBoomerang;}}), - LocationAccess(HF_COW_GROTTO_COW, {[]{return HasFireSource && CanPlay(EponasSong);}}), - LocationAccess(HF_COW_GROTTO_GOSSIP_STONE, {[]{return HasFireSource;}}), + LocationAccess(RC_HF_GS_COW_GROTTO, {[]{return HasFireSource && HookshotOrBoomerang;}}), + LocationAccess(RC_HF_COW_GROTTO_COW, {[]{return HasFireSource && CanPlay(EponasSong);}}), + LocationAccess(RC_HF_COW_GROTTO_GOSSIP_STONE, {[]{return HasFireSource;}}), }, { //Exits - Entrance(HYRULE_FIELD, {[]{return true;}}), + Entrance(RR_HYRULE_FIELD, {[]{return true;}}), }); - areaTable[HF_NEAR_MARKET_GROTTO] = Area("HF Near Market Grotto", "HF Near Market Grotto", NONE, NO_DAY_NIGHT_CYCLE, grottoEvents, { + areaTable[RR_HF_NEAR_MARKET_GROTTO] = Area("HF Near Market Grotto", "HF Near Market Grotto", RHT_NONE, NO_DAY_NIGHT_CYCLE, grottoEvents, { //Locations - LocationAccess(HF_NEAR_MARKET_GROTTO_CHEST, {[]{return true;}}), - LocationAccess(HF_NEAR_MARKET_GROTTO_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_HF_NEAR_MARKET_GROTTO_CHEST, {[]{return true;}}), + LocationAccess(RC_HF_NEAR_MARKET_GOSSIP_STONE, {[]{return true;}}), }, { //Exits - Entrance(HYRULE_FIELD, {[]{return true;}}), + Entrance(RR_HYRULE_FIELD, {[]{return true;}}), }); - areaTable[HF_FAIRY_GROTTO] = Area("HF Fairy Grotto", "HF Fairy Grotto", NONE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_HF_FAIRY_GROTTO] = Area("HF Fairy Grotto", "HF Fairy Grotto", RHT_NONE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&FreeFairies, {[]{return true;}}), }, {}, { //Exits - Entrance(HYRULE_FIELD, {[]{return true;}}), + Entrance(RR_HYRULE_FIELD, {[]{return true;}}), }); - areaTable[HF_NEAR_KAK_GROTTO] = Area("HF Near Kak Grotto", "HF Near Kak Grotto", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_HF_NEAR_KAK_GROTTO] = Area("HF Near Kak Grotto", "HF Near Kak Grotto", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(HF_GS_NEAR_KAK_GROTTO, {[]{return HookshotOrBoomerang;}}), + LocationAccess(RC_HF_GS_NEAR_KAK_GROTTO, {[]{return HookshotOrBoomerang;}}), }, { //Exits - Entrance(HYRULE_FIELD, {[]{return true;}}), + Entrance(RR_HYRULE_FIELD, {[]{return true;}}), }); - areaTable[HF_TEKTITE_GROTTO] = Area("HF Tektite Grotto", "HF Tektite Grotto", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_HF_TEKTITE_GROTTO] = Area("HF Tektite Grotto", "HF Tektite Grotto", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(HF_TEKTITE_GROTTO_FREESTANDING_POH, {[]{return ProgressiveScale >= 2 || CanUse(IRON_BOOTS);}}), + LocationAccess(RC_HF_TEKTITE_GROTTO_FREESTANDING_POH, {[]{return ProgressiveScale >= 2 || CanUse(RG_IRON_BOOTS);}}), }, { //Exits - Entrance(HYRULE_FIELD, {[]{return true;}}), + Entrance(RR_HYRULE_FIELD, {[]{return true;}}), }); - areaTable[LAKE_HYLIA] = Area("Lake Hylia", "Lake Hylia", LAKE_HYLIA, DAY_NIGHT_CYCLE, { + areaTable[RR_LAKE_HYLIA] = Area("Lake Hylia", "Lake Hylia", RHT_LAKE_HYLIA, DAY_NIGHT_CYCLE, { //Events EventAccess(&GossipStoneFairy, {[]{return GossipStoneFairy || CanSummonGossipFairy;}}), - EventAccess(&BeanPlantFairy, {[]{return BeanPlantFairy || (CanPlantBean(LAKE_HYLIA) && CanPlay(SongOfStorms));}}), - EventAccess(&ButterflyFairy, {[]{return ButterflyFairy || CanUse(STICKS);}}), + EventAccess(&BeanPlantFairy, {[]{return BeanPlantFairy || (CanPlantBean(RR_LAKE_HYLIA) && CanPlay(SongOfStorms));}}), + EventAccess(&ButterflyFairy, {[]{return ButterflyFairy || CanUse(RG_STICKS);}}), EventAccess(&BugShrub, {[]{return BugShrub || (IsChild && CanCutShrubs);}}), EventAccess(&ChildScarecrow, {[]{return ChildScarecrow || (IsChild && Ocarina);}}), EventAccess(&AdultScarecrow, {[]{return AdultScarecrow || (IsAdult && Ocarina);}}), }, { //Locations - LocationAccess(LH_UNDERWATER_ITEM, {[]{return IsChild && CanDive;}}), - LocationAccess(LH_SUN, {[]{return IsAdult && WaterTempleClear && CanUse(BOW);}}), - LocationAccess(LH_FREESTANDING_POH, {[]{return IsAdult && (CanUse(SCARECROW) || CanPlantBean(LAKE_HYLIA));}}), - LocationAccess(LH_GS_BEAN_PATCH, {[]{return CanPlantBugs && CanChildAttack;}}), - LocationAccess(LH_GS_LAB_WALL, {[]{return IsChild && (HookshotOrBoomerang || (LogicLabWallGS && (Sticks || KokiriSword || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)))) && AtNight && CanGetNightTimeGS;}}), - LocationAccess(LH_GS_SMALL_ISLAND, {[]{return IsChild && CanChildAttack && AtNight && CanGetNightTimeGS;}}), - LocationAccess(LH_GS_TREE, {[]{return IsAdult && CanUse(LONGSHOT) && AtNight && CanGetNightTimeGS;}}), - LocationAccess(LH_LAB_GOSSIP_STONE, {[]{return true;}}), - LocationAccess(LH_GOSSIP_STONE_SOUTHEAST, {[]{return true;}}), - LocationAccess(LH_GOSSIP_STONE_SOUTHWEST, {[]{return true;}}), + LocationAccess(RC_LH_UNDERWATER_ITEM, {[]{return IsChild && CanDive;}}), + LocationAccess(RC_LH_SUN, {[]{return IsAdult && WaterTempleClear && CanUse(RG_FAIRY_BOW);}}), + LocationAccess(RC_LH_FREESTANDING_POH, {[]{return IsAdult && (CanUse(RG_SCARECROW) || CanPlantBean(RR_LAKE_HYLIA));}}), + LocationAccess(RC_LH_GS_BEAN_PATCH, {[]{return CanPlantBugs && CanChildAttack;}}), + LocationAccess(RC_LH_GS_LAB_WALL, {[]{return IsChild && (HookshotOrBoomerang || (LogicLabWallGS && (Sticks || KokiriSword || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD)))) && AtNight && CanGetNightTimeGS;}}), + LocationAccess(RC_LH_GS_SMALL_ISLAND, {[]{return IsChild && CanChildAttack && AtNight && CanGetNightTimeGS;}}), + LocationAccess(RC_LH_GS_TREE, {[]{return IsAdult && CanUse(RG_LONGSHOT) && AtNight && CanGetNightTimeGS;}}), + LocationAccess(RC_LH_LAB_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_LH_SOUTHEAST_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_LH_SOUTHWEST_GOSSIP_STONE, {[]{return true;}}), }, { //Exits - Entrance(HYRULE_FIELD, {[]{return true;}}), - Entrance(ZORAS_DOMAIN, {[]{return IsChild && (CanDive || CanUse(IRON_BOOTS));}}), - Entrance(LH_OWL_FLIGHT, {[]{return IsChild;}}), - Entrance(LH_FISHING_ISLAND, {[]{return IsChild || CanUse(SCARECROW) || CanPlantBean(LAKE_HYLIA) || WaterTempleClear;}}), - Entrance(LH_LAB, {[]{return true;}}), - Entrance(WATER_TEMPLE_ENTRYWAY, {[]{return CanUse(HOOKSHOT) && ((CanUse(IRON_BOOTS) || (LogicWaterHookshotEntry && ProgressiveScale >= 2)) || (IsAdult && CanUse(LONGSHOT) && ProgressiveScale >= 2));}}), - Entrance(LH_GROTTO, {[]{return true;}}), + Entrance(RR_HYRULE_FIELD, {[]{return true;}}), + Entrance(RR_ZORAS_DOMAIN, {[]{return IsChild && (CanDive || CanUse(RG_IRON_BOOTS));}}), + Entrance(RR_LH_OWL_FLIGHT, {[]{return IsChild;}}), + Entrance(RR_LH_FISHING_ISLAND, {[]{return IsChild || CanUse(RG_SCARECROW) || CanPlantBean(RR_LAKE_HYLIA) || WaterTempleClear;}}), + Entrance(RR_LH_LAB, {[]{return true;}}), + Entrance(RR_WATER_TEMPLE_ENTRYWAY, {[]{return CanUse(RG_HOOKSHOT) && ((CanUse(RG_IRON_BOOTS) || (LogicWaterHookshotEntry && ProgressiveScale >= 2)) || (IsAdult && CanUse(RG_LONGSHOT) && ProgressiveScale >= 2));}}), + Entrance(RR_LH_GROTTO, {[]{return true;}}), }); - areaTable[LH_FISHING_ISLAND] = Area("LH Fishing Island", "Lake Hylia", LAKE_HYLIA, DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_LH_FISHING_ISLAND] = Area("LH Fishing Island", "Lake Hylia", RHT_LAKE_HYLIA, DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(LAKE_HYLIA, {[]{return true;}}), - Entrance(LH_FISHING_HOLE, {[]{return true;}}), + Entrance(RR_LAKE_HYLIA, {[]{return true;}}), + Entrance(RR_LH_FISHING_HOLE, {[]{return true;}}), }); - areaTable[LH_OWL_FLIGHT] = Area("LH Owl Flight", "Lake Hylia", NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_LH_OWL_FLIGHT] = Area("LH Owl Flight", "Lake Hylia", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(HYRULE_FIELD, {[]{return true;}}), + Entrance(RR_HYRULE_FIELD, {[]{return true;}}), }); - areaTable[LH_LAB] = Area("LH Lab", "LH Lab", NONE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_LH_LAB] = Area("LH Lab", "LH Lab", RHT_NONE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&EyedropsAccess, {[]{return EyedropsAccess || (IsAdult && (EyeballFrogAccess || (EyeballFrog && DisableTradeRevert)));}}), }, { //Locations - LocationAccess(LH_LAB_DIVE, {[]{return ProgressiveScale >= 2 || (LogicLabDiving && CanUse(IRON_BOOTS) && CanUse(HOOKSHOT));}}), - LocationAccess(LH_TRADE_FROG, {[]{return IsAdult && EyeballFrog;}}), - LocationAccess(LH_GS_LAB_CRATE, {[]{return CanUse(IRON_BOOTS) && CanUse(HOOKSHOT);}}), + LocationAccess(RC_LH_LAB_DIVE, {[]{return ProgressiveScale >= 2 || (LogicLabDiving && CanUse(RG_IRON_BOOTS) && CanUse(RG_HOOKSHOT));}}), + LocationAccess(RC_LH_TRADE_FROG, {[]{return IsAdult && EyeballFrog;}}), + LocationAccess(RC_LH_GS_LAB_CRATE, {[]{return CanUse(RG_IRON_BOOTS) && CanUse(RG_HOOKSHOT);}}), }, { //Exits - Entrance(LAKE_HYLIA, {[]{return true;}}), + Entrance(RR_LAKE_HYLIA, {[]{return true;}}), }); - areaTable[LH_FISHING_HOLE] = Area("LH Fishing Hole", "LH Fishing Hole", NONE, DAY_NIGHT_CYCLE, {}, { + areaTable[RR_LH_FISHING_HOLE] = Area("LH Fishing Hole", "LH Fishing Hole", RHT_NONE, DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(LH_CHILD_FISHING, {[]{return IsChild;}}), - LocationAccess(LH_ADULT_FISHING, {[]{return IsAdult;}}), + LocationAccess(RC_LH_CHILD_FISHING, {[]{return IsChild;}}), + LocationAccess(RC_LH_ADULT_FISHING, {[]{return IsAdult;}}), }, { //Exits - Entrance(LH_FISHING_ISLAND, {[]{return true;}}), + Entrance(RR_LH_FISHING_ISLAND, {[]{return true;}}), }); - areaTable[LH_GROTTO] = Area("LH Grotto", "LH Grotto", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_LH_GROTTO] = Area("LH Grotto", "LH Grotto", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(LH_DEKU_SCRUB_GROTTO_LEFT, {[]{return CanStunDeku;}}), - LocationAccess(LH_DEKU_SCRUB_GROTTO_RIGHT, {[]{return CanStunDeku;}}), - LocationAccess(LH_DEKU_SCRUB_GROTTO_CENTER, {[]{return CanStunDeku;}}), + LocationAccess(RC_LH_DEKU_SCRUB_GROTTO_LEFT, {[]{return CanStunDeku;}}), + LocationAccess(RC_LH_DEKU_SCRUB_GROTTO_RIGHT, {[]{return CanStunDeku;}}), + LocationAccess(RC_LH_DEKU_SCRUB_GROTTO_CENTER, {[]{return CanStunDeku;}}), }, { //Exits - Entrance(LAKE_HYLIA, {[]{return true;}}), + Entrance(RR_LAKE_HYLIA, {[]{return true;}}), }); - areaTable[LON_LON_RANCH] = Area("Lon Lon Ranch", "Lon Lon Ranch", LON_LON_RANCH, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_LON_LON_RANCH] = Area("Lon Lon Ranch", "Lon Lon Ranch", RHT_LON_LON_RANCH, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&Epona, {[]{return Epona || (CanPlay(EponasSong) && IsAdult && AtDay);}}), EventAccess(&LinksCow, {[]{return LinksCow || (CanPlay(EponasSong) && IsAdult && AtDay);}}), }, { //Locations - LocationAccess(SONG_FROM_MALON, {[]{return IsChild && ZeldasLetter && Ocarina && AtDay;}}), - LocationAccess(LLR_GS_TREE, {[]{return IsChild;}}), - LocationAccess(LLR_GS_RAIN_SHED, {[]{return IsChild && AtNight && CanGetNightTimeGS;}}), - LocationAccess(LLR_GS_HOUSE_WINDOW, {[]{return IsChild && HookshotOrBoomerang && AtNight && CanGetNightTimeGS;}}), - LocationAccess(LLR_GS_BACK_WALL, {[]{return IsChild && HookshotOrBoomerang && AtNight && CanGetNightTimeGS;}}), + LocationAccess(RC_SONG_FROM_MALON, {[]{return IsChild && ZeldasLetter && Ocarina && AtDay;}}), + LocationAccess(RC_LLR_GS_TREE, {[]{return IsChild;}}), + LocationAccess(RC_LLR_GS_RAIN_SHED, {[]{return IsChild && AtNight && CanGetNightTimeGS;}}), + LocationAccess(RC_LLR_GS_HOUSE_WINDOW, {[]{return IsChild && HookshotOrBoomerang && AtNight && CanGetNightTimeGS;}}), + LocationAccess(RC_LLR_GS_BACK_WALL, {[]{return IsChild && HookshotOrBoomerang && AtNight && CanGetNightTimeGS;}}), }, { //Exits - Entrance(HYRULE_FIELD, {[]{return true;}}), - Entrance(LLR_TALONS_HOUSE, {[]{return true;}}), - Entrance(LLR_STABLES, {[]{return true;}}), - Entrance(LLR_TOWER, {[]{return true;}}), - Entrance(LLR_GROTTO, {[]{return IsChild;}}), + Entrance(RR_HYRULE_FIELD, {[]{return true;}}), + Entrance(RR_LLR_TALONS_HOUSE, {[]{return true;}}), + Entrance(RR_LLR_STABLES, {[]{return true;}}), + Entrance(RR_LLR_TOWER, {[]{return true;}}), + Entrance(RR_LLR_GROTTO, {[]{return IsChild;}}), }); - areaTable[LLR_TALONS_HOUSE] = Area("LLR Talons House", "LLR Talons House", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_LLR_TALONS_HOUSE] = Area("LLR Talons House", "LLR Talons House", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(LLR_TALONS_CHICKENS, {[]{return IsChild && AtDay && ZeldasLetter;}}), + LocationAccess(RC_LLR_TALONS_CHICKENS, {[]{return IsChild && AtDay && ZeldasLetter;}}), }, { //Exits - Entrance(LON_LON_RANCH, {[]{return true;}}), + Entrance(RR_LON_LON_RANCH, {[]{return true;}}), }); - areaTable[LLR_STABLES] = Area("LLR Stables", "LLR Stables", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_LLR_STABLES] = Area("LLR Stables", "LLR Stables", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(LLR_STABLES_LEFT_COW, {[]{return CanPlay(EponasSong);}}), - LocationAccess(LLR_STABLES_RIGHT_COW, {[]{return CanPlay(EponasSong);}}), + LocationAccess(RC_LLR_STABLES_LEFT_COW, {[]{return CanPlay(EponasSong);}}), + LocationAccess(RC_LLR_STABLES_RIGHT_COW, {[]{return CanPlay(EponasSong);}}), }, { //Exits - Entrance(LON_LON_RANCH, {[]{return true;}}), + Entrance(RR_LON_LON_RANCH, {[]{return true;}}), }); - areaTable[LLR_TOWER] = Area("LLR Tower", "LLR Tower", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_LLR_TOWER] = Area("LLR Tower", "LLR Tower", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(LLR_FREESTANDING_POH, {[]{return IsChild;}}), - LocationAccess(LLR_TOWER_LEFT_COW, {[]{return CanPlay(EponasSong);}}), - LocationAccess(LLR_TOWER_RIGHT_COW, {[]{return CanPlay(EponasSong);}}), + LocationAccess(RC_LLR_FREESTANDING_POH, {[]{return IsChild;}}), + LocationAccess(RC_LLR_TOWER_LEFT_COW, {[]{return CanPlay(EponasSong);}}), + LocationAccess(RC_LLR_TOWER_RIGHT_COW, {[]{return CanPlay(EponasSong);}}), }, { //Exits - Entrance(LON_LON_RANCH, {[]{return true;}}), + Entrance(RR_LON_LON_RANCH, {[]{return true;}}), }); - areaTable[LLR_GROTTO] = Area("LLR Grotto", "LLR Grotto", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_LLR_GROTTO] = Area("LLR Grotto", "LLR Grotto", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(LLR_DEKU_SCRUB_GROTTO_LEFT, {[]{return CanStunDeku;}}), - LocationAccess(LLR_DEKU_SCRUB_GROTTO_RIGHT, {[]{return CanStunDeku;}}), - LocationAccess(LLR_DEKU_SCRUB_GROTTO_CENTER, {[]{return CanStunDeku;}}), + LocationAccess(RC_LLR_DEKU_SCRUB_GROTTO_LEFT, {[]{return CanStunDeku;}}), + LocationAccess(RC_LLR_DEKU_SCRUB_GROTTO_RIGHT, {[]{return CanStunDeku;}}), + LocationAccess(RC_LLR_DEKU_SCRUB_GROTTO_CENTER, {[]{return CanStunDeku;}}), }, { //Exits - Entrance(LON_LON_RANCH, {[]{return true;}}), + Entrance(RR_LON_LON_RANCH, {[]{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 f5efcc3c8..5d561043a 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 @@ -10,36 +10,36 @@ void AreaTable_Init_IceCavern() { /*-------------------------- | VANILLA/MQ DECIDER | ---------------------------*/ - areaTable[ICE_CAVERN_ENTRYWAY] = Area("Ice Cavern Entryway", "Ice Cavern", ICE_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_ICE_CAVERN_ENTRYWAY] = Area("Ice Cavern Entryway", "Ice Cavern", RHT_ICE_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(ICE_CAVERN_BEGINNING, {[]{return Dungeon::IceCavern.IsVanilla();}}), - Entrance(ICE_CAVERN_MQ_BEGINNING, {[]{return Dungeon::IceCavern.IsMQ();}}), - Entrance(ZORAS_FOUNTAIN, {[]{return true;}}), + Entrance(RR_ICE_CAVERN_BEGINNING, {[]{return Dungeon::IceCavern.IsVanilla();}}), + Entrance(RR_ICE_CAVERN_MQ_BEGINNING, {[]{return Dungeon::IceCavern.IsMQ();}}), + Entrance(RR_ZORAS_FOUNTAIN, {[]{return true;}}), }); /*-------------------------- | VANILLA DUNGEON | ---------------------------*/ if (Dungeon::IceCavern.IsVanilla()) { - areaTable[ICE_CAVERN_BEGINNING] = Area("Ice Cavern Beginning", "Ice Cavern", ICE_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_ICE_CAVERN_BEGINNING] = Area("Ice Cavern Beginning", "Ice Cavern", RHT_ICE_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(ICE_CAVERN_ENTRYWAY, {[]{return true;}}), - Entrance(ICE_CAVERN_MAIN, {[]{return Here(ICE_CAVERN_BEGINNING, []{return IsAdult || HasExplosives || CanUse(DINS_FIRE);});}}), + Entrance(RR_ICE_CAVERN_ENTRYWAY, {[]{return true;}}), + Entrance(RR_ICE_CAVERN_MAIN, {[]{return Here(RR_ICE_CAVERN_BEGINNING, []{return IsAdult || HasExplosives || CanUse(RG_DINS_FIRE);});}}), }); - areaTable[ICE_CAVERN_MAIN] = Area("Ice Cavern", "Ice Cavern", ICE_CAVERN, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_ICE_CAVERN_MAIN] = Area("Ice Cavern", "Ice Cavern", RHT_ICE_CAVERN, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&BlueFireAccess, {[]{return BlueFireAccess || (IsAdult && HasBottle);}}), }, { //Locations - LocationAccess(ICE_CAVERN_MAP_CHEST, {[]{return BlueFire && IsAdult;}}), - LocationAccess(ICE_CAVERN_COMPASS_CHEST, {[]{return BlueFire;}}), - LocationAccess(ICE_CAVERN_IRON_BOOTS_CHEST, {[]{return BlueFire && (IsAdult || Slingshot || Sticks || KokiriSword || CanUse(DINS_FIRE));}}), - LocationAccess(SHEIK_IN_ICE_CAVERN, {[]{return BlueFire && IsAdult;}}), - LocationAccess(ICE_CAVERN_FREESTANDING_POH, {[]{return BlueFire;}}), - LocationAccess(ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, {[]{return HookshotOrBoomerang;}}), - LocationAccess(ICE_CAVERN_GS_HEART_PIECE_ROOM, {[]{return BlueFire && HookshotOrBoomerang;}}), - LocationAccess(ICE_CAVERN_GS_PUSH_BLOCK_ROOM, {[]{return BlueFire && (HookshotOrBoomerang || (LogicIceBlockGS && IsAdult && CanUse(HOVER_BOOTS)));}}), + LocationAccess(RC_ICE_CAVERN_MAP_CHEST, {[]{return BlueFire && IsAdult;}}), + LocationAccess(RC_ICE_CAVERN_COMPASS_CHEST, {[]{return BlueFire;}}), + LocationAccess(RC_ICE_CAVERN_IRON_BOOTS_CHEST, {[]{return BlueFire && (IsAdult || Slingshot || Sticks || KokiriSword || CanUse(RG_DINS_FIRE));}}), + LocationAccess(RC_SHEIK_IN_ICE_CAVERN, {[]{return BlueFire && IsAdult;}}), + LocationAccess(RC_ICE_CAVERN_FREESTANDING_POH, {[]{return BlueFire;}}), + LocationAccess(RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, {[]{return HookshotOrBoomerang;}}), + LocationAccess(RC_ICE_CAVERN_GS_HEART_PIECE_ROOM, {[]{return BlueFire && HookshotOrBoomerang;}}), + LocationAccess(RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, {[]{return BlueFire && (HookshotOrBoomerang || (LogicIceBlockGS && IsAdult && CanUse(RG_HOVER_BOOTS)));}}), }, {}); } @@ -47,39 +47,39 @@ void AreaTable_Init_IceCavern() { | MASTER QUEST DUNGEON | ---------------------------*/ if (Dungeon::IceCavern.IsMQ()) { - areaTable[ICE_CAVERN_MQ_BEGINNING] = Area("Ice Cavern MQ Beginning", "Ice Cavern", ICE_CAVERN, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_ICE_CAVERN_MQ_BEGINNING] = Area("Ice Cavern MQ Beginning", "Ice Cavern", RHT_ICE_CAVERN, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&FairyPot, {[]{return true;}}), }, {}, { //Exits - Entrance(ICE_CAVERN_ENTRYWAY, {[]{return true;}}), - Entrance(ICE_CAVERN_MQ_MAP_ROOM, {[]{return IsAdult || CanUse(DINS_FIRE) || (HasExplosives && (CanUse(STICKS) || CanUse(SLINGSHOT) || KokiriSword));}}), - Entrance(ICE_CAVERN_MQ_COMPASS_ROOM, {[]{return IsAdult && BlueFire;}}), - Entrance(ICE_CAVERN_MQ_IRON_BOOTS_REGION, {[]{return BlueFire;}}), + Entrance(RR_ICE_CAVERN_ENTRYWAY, {[]{return true;}}), + Entrance(RR_ICE_CAVERN_MQ_MAP_ROOM, {[]{return IsAdult || CanUse(RG_DINS_FIRE) || (HasExplosives && (CanUse(RG_STICKS) || CanUse(RG_FAIRY_SLINGSHOT) || KokiriSword));}}), + Entrance(RR_ICE_CAVERN_MQ_COMPASS_ROOM, {[]{return IsAdult && BlueFire;}}), + Entrance(RR_ICE_CAVERN_MQ_IRON_BOOTS_REGION, {[]{return BlueFire;}}), }); - areaTable[ICE_CAVERN_MQ_MAP_ROOM] = Area("Ice Cavern MQ Map Room", "Ice Cavern", ICE_CAVERN, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_ICE_CAVERN_MQ_MAP_ROOM] = Area("Ice Cavern MQ Map Room", "Ice Cavern", RHT_ICE_CAVERN, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&BlueFireAccess, {[]{return BlueFireAccess || HasBottle;}}), }, { //Locations - LocationAccess(ICE_CAVERN_MQ_MAP_CHEST, {[]{return BlueFire && (IsAdult || CanUse(STICKS) || KokiriSword || CanUseProjectile);}}), + LocationAccess(RC_ICE_CAVERN_MQ_MAP_CHEST, {[]{return BlueFire && (IsAdult || CanUse(RG_STICKS) || KokiriSword || CanUseProjectile);}}), }, {}); - areaTable[ICE_CAVERN_MQ_IRON_BOOTS_REGION] = Area("Ice Cavern MQ Iron Boots Region", "Ice Cavern", ICE_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_ICE_CAVERN_MQ_IRON_BOOTS_REGION] = Area("Ice Cavern MQ Iron Boots Region", "Ice Cavern", RHT_ICE_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(ICE_CAVERN_MQ_IRON_BOOTS_CHEST, {[]{return IsAdult;}}), - LocationAccess(SHEIK_IN_ICE_CAVERN, {[]{return IsAdult;}}), - LocationAccess(ICE_CAVERN_MQ_GS_ICE_BLOCK, {[]{return IsAdult || CanUseProjectile;}}), - LocationAccess(ICE_CAVERN_MQ_GS_SCARECROW, {[]{return (CanUse(SCARECROW) || (HoverBoots && CanUse(LONGSHOT)) || LogicIceMQScarecrow) && IsAdult;}}), - //Tricks: (CanUse(SCARECROW) || (HoverBoots && CanUse(LONGSHOT)) || LogicIceMQScarecrow) && IsAdult + LocationAccess(RC_ICE_CAVERN_MQ_IRON_BOOTS_CHEST, {[]{return IsAdult;}}), + LocationAccess(RC_SHEIK_IN_ICE_CAVERN, {[]{return IsAdult;}}), + LocationAccess(RC_ICE_CAVERN_MQ_GS_ICE_BLOCK, {[]{return IsAdult || CanUseProjectile;}}), + LocationAccess(RC_ICE_CAVERN_MQ_GS_SCARECROW, {[]{return (CanUse(RG_SCARECROW) || (HoverBoots && CanUse(RG_LONGSHOT)) || LogicIceMQScarecrow) && IsAdult;}}), + //Tricks: (CanUse(RG_SCARECROW) || (HoverBoots && CanUse(RG_LONGSHOT)) || LogicIceMQScarecrow) && IsAdult }, {}); - areaTable[ICE_CAVERN_MQ_COMPASS_ROOM] = Area("Ice Cavern MQ Compass Room", "Ice Cavern", ICE_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_ICE_CAVERN_MQ_COMPASS_ROOM] = Area("Ice Cavern MQ Compass Room", "Ice Cavern", RHT_ICE_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(ICE_CAVERN_MQ_COMPASS_CHEST, {[]{return true;}}), - LocationAccess(ICE_CAVERN_MQ_FREESTANDING_POH, {[]{return HasExplosives;}}), - LocationAccess(ICE_CAVERN_MQ_GS_RED_ICE, {[]{return CanPlay(SongOfTime) || LogicIceMQRedIceGS;}}), + LocationAccess(RC_ICE_CAVERN_MQ_COMPASS_CHEST, {[]{return true;}}), + LocationAccess(RC_ICE_CAVERN_MQ_FREESTANDING_POH, {[]{return HasExplosives;}}), + LocationAccess(RC_ICE_CAVERN_MQ_GS_RED_ICE, {[]{return CanPlay(SongOfTime) || LogicIceMQRedIceGS;}}), //Trick: CanPlay(SongOfTime) || LogicIceMQRedIceGS }, {}); } 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 d7b48d7f1..ed956f20c 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 @@ -10,151 +10,151 @@ void AreaTable_Init_JabuJabusBelly() { /*-------------------------- | VANILLA/MQ DECIDER | ---------------------------*/ - areaTable[JABU_JABUS_BELLY_ENTRYWAY] = Area("Jabu Jabus Belly Entryway", "Jabu Jabus Belly", JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_JABU_JABUS_BELLY_ENTRYWAY] = Area("Jabu Jabus Belly Entryway", "Jabu Jabus Belly", RHT_JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(JABU_JABUS_BELLY_BEGINNING, {[]{return Dungeon::JabuJabusBelly.IsVanilla();}}), - Entrance(JABU_JABUS_BELLY_MQ_BEGINNING, {[]{return Dungeon::JabuJabusBelly.IsMQ();}}), - Entrance(ZORAS_FOUNTAIN, {[]{return true;}}), + Entrance(RR_JABU_JABUS_BELLY_BEGINNING, {[]{return Dungeon::JabuJabusBelly.IsVanilla();}}), + Entrance(RR_JABU_JABUS_BELLY_MQ_BEGINNING, {[]{return Dungeon::JabuJabusBelly.IsMQ();}}), + Entrance(RR_ZORAS_FOUNTAIN, {[]{return true;}}), }); /*-------------------------- | VANILLA DUNGEON | ---------------------------*/ if (Dungeon::JabuJabusBelly.IsVanilla()) { - areaTable[JABU_JABUS_BELLY_BEGINNING] = Area("Jabu Jabus Belly Beginning", "Jabu Jabus Belly", JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_JABU_JABUS_BELLY_BEGINNING] = Area("Jabu Jabus Belly Beginning", "Jabu Jabus Belly", RHT_JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(JABU_JABUS_BELLY_ENTRYWAY, {[]{return true;}}), - Entrance(JABU_JABUS_BELLY_LIFT_MIDDLE, {[]{return CanUseProjectile;}}), + Entrance(RR_JABU_JABUS_BELLY_ENTRYWAY, {[]{return true;}}), + Entrance(RR_JABU_JABUS_BELLY_LIFT_MIDDLE, {[]{return CanUseProjectile;}}), }); - areaTable[JABU_JABUS_BELLY_LIFT_MIDDLE] = Area("Jabu Jabus Belly Lift Middle", "Jabu Jabus Belly", JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_JABU_JABUS_BELLY_LIFT_MIDDLE] = Area("Jabu Jabus Belly Lift Middle", "Jabu Jabus Belly", RHT_JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(JABU_JABUS_BELLY_BEGINNING, {[]{return true;}}), - Entrance(JABU_JABUS_BELLY_MAIN_UPPER, {[]{return true;}}), - Entrance(JABU_JABUS_BELLY_LIFT_LOWER, {[]{return true;}}), - Entrance(JABU_JABUS_BELLY_NEAR_BOSS_ROOM, {[]{return HasAccessTo(JABU_JABUS_BELLY_LIFT_UPPER) || (LogicJabuBossHover && IsAdult && CanUse(HOVER_BOOTS));}}), + Entrance(RR_JABU_JABUS_BELLY_BEGINNING, {[]{return true;}}), + Entrance(RR_JABU_JABUS_BELLY_MAIN_UPPER, {[]{return true;}}), + Entrance(RR_JABU_JABUS_BELLY_LIFT_LOWER, {[]{return true;}}), + Entrance(RR_JABU_JABUS_BELLY_NEAR_BOSS_ROOM, {[]{return HasAccessTo(RR_JABU_JABUS_BELLY_LIFT_UPPER) || (LogicJabuBossHover && IsAdult && CanUse(RG_HOVER_BOOTS));}}), }); - areaTable[JABU_JABUS_BELLY_MAIN_UPPER] = Area("Jabu Jabus Belly Main Upper", "Jabu Jabus Belly", JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_JABU_JABUS_BELLY_MAIN_UPPER] = Area("Jabu Jabus Belly Main Upper", "Jabu Jabus Belly", RHT_JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(JABU_JABUS_BELLY_LIFT_MIDDLE, {[]{return true;}}), - Entrance(JABU_JABUS_BELLY_MAIN_LOWER, {[]{return true;}}), - Entrance(JABU_JABUS_BELLY_FORKED_CORRIDOR, {[]{return true;}}), - Entrance(JABU_JABUS_BELLY_BIGOCTO_ROOM, {[]{return Here(JABU_JABUS_BELLY_GREEN_TENTACLE, []{return CanUse(BOOMERANG);});}}), + Entrance(RR_JABU_JABUS_BELLY_LIFT_MIDDLE, {[]{return true;}}), + Entrance(RR_JABU_JABUS_BELLY_MAIN_LOWER, {[]{return true;}}), + Entrance(RR_JABU_JABUS_BELLY_FORKED_CORRIDOR, {[]{return true;}}), + Entrance(RR_JABU_JABUS_BELLY_BIGOCTO_ROOM, {[]{return Here(RR_JABU_JABUS_BELLY_GREEN_TENTACLE, []{return CanUse(RG_BOOMERANG);});}}), }); - areaTable[JABU_JABUS_BELLY_MAIN_LOWER] = Area("Jabu Jabus Belly Main Lower", "Jabu Jabus Belly", JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_JABU_JABUS_BELLY_MAIN_LOWER] = Area("Jabu Jabus Belly Main Lower", "Jabu Jabus Belly", RHT_JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER, {[]{return HookshotOrBoomerang;}}), - LocationAccess(JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER, {[]{return HookshotOrBoomerang;}}), + LocationAccess(RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER, {[]{return HookshotOrBoomerang;}}), + LocationAccess(RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER, {[]{return HookshotOrBoomerang;}}), }, { //Exits - Entrance(JABU_JABUS_BELLY_MAIN_UPPER, {[]{return true;}}), - Entrance(JABU_JABUS_BELLY_SHABOMB_CORRIDOR, {[]{return true;}}), - Entrance(JABU_JABUS_BELLY_LOWER_SIDE_ROOM, {[]{return true;}}), + Entrance(RR_JABU_JABUS_BELLY_MAIN_UPPER, {[]{return true;}}), + Entrance(RR_JABU_JABUS_BELLY_SHABOMB_CORRIDOR, {[]{return true;}}), + Entrance(RR_JABU_JABUS_BELLY_LOWER_SIDE_ROOM, {[]{return true;}}), }); - areaTable[JABU_JABUS_BELLY_SHABOMB_CORRIDOR] = Area("Jabu Jabus Belly Shabomb Corridor", "Jabu Jabus Belly", JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_JABU_JABUS_BELLY_SHABOMB_CORRIDOR] = Area("Jabu Jabus Belly Shabomb Corridor", "Jabu Jabus Belly", RHT_JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&FairyPot, {[]{return true;}}), }, { //Locations - LocationAccess(JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM, {[]{return true;}}), + LocationAccess(RC_JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM, {[]{return true;}}), }, { //Exits - Entrance(JABU_JABUS_BELLY_MAIN_LOWER, {[]{return true;}}), - Entrance(JABU_JABUS_BELLY_LIFT_LOWER, {[]{return CanUseProjectile;}}), + Entrance(RR_JABU_JABUS_BELLY_MAIN_LOWER, {[]{return true;}}), + Entrance(RR_JABU_JABUS_BELLY_LIFT_LOWER, {[]{return CanUseProjectile;}}), }); - areaTable[JABU_JABUS_BELLY_LOWER_SIDE_ROOM] = Area("Jabu Jabus Belly Lower Side Room", "Jabu Jabus Belly", JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_JABU_JABUS_BELLY_LOWER_SIDE_ROOM] = Area("Jabu Jabus Belly Lower Side Room", "Jabu Jabus Belly", RHT_JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&FairyPot, {[]{return FairyPot || (CanUse(BOOMERANG) || CanUse(HOVER_BOOTS));}}), + EventAccess(&FairyPot, {[]{return FairyPot || (CanUse(RG_BOOMERANG) || CanUse(RG_HOVER_BOOTS));}}), }, {}, { //Exits - Entrance(JABU_JABUS_BELLY_MAIN_LOWER, {[]{return true;}}), + Entrance(RR_JABU_JABUS_BELLY_MAIN_LOWER, {[]{return true;}}), }); - areaTable[JABU_JABUS_BELLY_LIFT_LOWER] = Area("Jabu Jabus Belly Lift Lower", "Jabu Jabus Belly", JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_JABU_JABUS_BELLY_LIFT_LOWER] = Area("Jabu Jabus Belly Lift Lower", "Jabu Jabus Belly", RHT_JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(JABU_JABUS_BELLY_DEKU_SCRUB, {[]{return (IsChild || CanDive || LogicJabuAlcoveJumpDive || CanUse(IRON_BOOTS)) && CanStunDeku;}}), + LocationAccess(RC_JABU_JABUS_BELLY_DEKU_SCRUB, {[]{return (IsChild || CanDive || LogicJabuAlcoveJumpDive || CanUse(RG_IRON_BOOTS)) && CanStunDeku;}}), }, { //Exits - Entrance(JABU_JABUS_BELLY_SHABOMB_CORRIDOR, {[]{return true;}}), - Entrance(JABU_JABUS_BELLY_LIFT_MIDDLE, {[]{return true;}}), + Entrance(RR_JABU_JABUS_BELLY_SHABOMB_CORRIDOR, {[]{return true;}}), + Entrance(RR_JABU_JABUS_BELLY_LIFT_MIDDLE, {[]{return true;}}), }); - areaTable[JABU_JABUS_BELLY_FORKED_CORRIDOR] = Area("Jabu Jabus Belly Forked Corridor", "Jabu Jabus Belly", JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_JABU_JABUS_BELLY_FORKED_CORRIDOR] = Area("Jabu Jabus Belly Forked Corridor", "Jabu Jabus Belly", RHT_JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(JABU_JABUS_BELLY_MAIN_UPPER, {[]{return true;}}), - Entrance(JABU_JABUS_BELLY_BOOMERANG_ROOM, {[]{return true;}}), - Entrance(JABU_JABUS_BELLY_MAP_ROOM, {[]{return true;}}), - Entrance(JABU_JABUS_BELLY_COMPASS_ROOM, {[]{return Here(JABU_JABUS_BELLY_MAP_ROOM, []{return CanUse(BOOMERANG);});}}), - Entrance(JABU_JABUS_BELLY_BLUE_TENTACLE, {[]{return Here(JABU_JABUS_BELLY_MAP_ROOM, []{return CanUse(BOOMERANG);});}}), - Entrance(JABU_JABUS_BELLY_GREEN_TENTACLE, {[]{return Here(JABU_JABUS_BELLY_BLUE_TENTACLE, []{return CanUse(BOOMERANG);});}}), + Entrance(RR_JABU_JABUS_BELLY_MAIN_UPPER, {[]{return true;}}), + Entrance(RR_JABU_JABUS_BELLY_BOOMERANG_ROOM, {[]{return true;}}), + Entrance(RR_JABU_JABUS_BELLY_MAP_ROOM, {[]{return true;}}), + Entrance(RR_JABU_JABUS_BELLY_COMPASS_ROOM, {[]{return Here(RR_JABU_JABUS_BELLY_MAP_ROOM, []{return CanUse(RG_BOOMERANG);});}}), + Entrance(RR_JABU_JABUS_BELLY_BLUE_TENTACLE, {[]{return Here(RR_JABU_JABUS_BELLY_MAP_ROOM, []{return CanUse(RG_BOOMERANG);});}}), + Entrance(RR_JABU_JABUS_BELLY_GREEN_TENTACLE, {[]{return Here(RR_JABU_JABUS_BELLY_BLUE_TENTACLE, []{return CanUse(RG_BOOMERANG);});}}), }); - areaTable[JABU_JABUS_BELLY_BOOMERANG_ROOM] = Area("Jabu Jabus Belly Boomerang Room", "Jabu Jabus Belly", JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_JABU_JABUS_BELLY_BOOMERANG_ROOM] = Area("Jabu Jabus Belly Boomerang Room", "Jabu Jabus Belly", RHT_JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(JABU_JABUS_BELLY_BOOMERANG_CHEST, {[]{return true;}}), + LocationAccess(RC_JABU_JABUS_BELLY_BOOMERANG_CHEST, {[]{return true;}}), }, { //Exits - Entrance(JABU_JABUS_BELLY_FORKED_CORRIDOR, {[]{return true;}}), + Entrance(RR_JABU_JABUS_BELLY_FORKED_CORRIDOR, {[]{return true;}}), }); - areaTable[JABU_JABUS_BELLY_MAP_ROOM] = Area("Jabu Jabus Belly Map Room", "Jabu Jabus Belly", JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_JABU_JABUS_BELLY_MAP_ROOM] = Area("Jabu Jabus Belly Map Room", "Jabu Jabus Belly", RHT_JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(JABU_JABUS_BELLY_MAP_CHEST, {[]{return CanUse(BOOMERANG);}}), + LocationAccess(RC_JABU_JABUS_BELLY_MAP_CHEST, {[]{return CanUse(RG_BOOMERANG);}}), }, { //Exits - Entrance(JABU_JABUS_BELLY_FORKED_CORRIDOR, {[]{return true;}}), + Entrance(RR_JABU_JABUS_BELLY_FORKED_CORRIDOR, {[]{return true;}}), }); - areaTable[JABU_JABUS_BELLY_COMPASS_ROOM] = Area("Jabu Jabus Belly Compass Room", "Jabu Jabus Belly", JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_JABU_JABUS_BELLY_COMPASS_ROOM] = Area("Jabu Jabus Belly Compass Room", "Jabu Jabus Belly", RHT_JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(JABU_JABUS_BELLY_COMPASS_CHEST, {[]{return IsAdult || CanChildAttack;}}), + LocationAccess(RC_JABU_JABUS_BELLY_COMPASS_CHEST, {[]{return IsAdult || CanChildAttack;}}), }, { //Exits - Entrance(JABU_JABUS_BELLY_FORKED_CORRIDOR, {[]{return true;}}), + Entrance(RR_JABU_JABUS_BELLY_FORKED_CORRIDOR, {[]{return true;}}), }); - areaTable[JABU_JABUS_BELLY_BLUE_TENTACLE] = Area("Jabu Jabus Belly Blue Tentacle", "Jabu Jabus Belly", JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_JABU_JABUS_BELLY_BLUE_TENTACLE] = Area("Jabu Jabus Belly Blue Tentacle", "Jabu Jabus Belly", RHT_JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(JABU_JABUS_BELLY_FORKED_CORRIDOR, {[]{return Here(JABU_JABUS_BELLY_BLUE_TENTACLE, []{return CanUse(BOOMERANG);});}}), + Entrance(RR_JABU_JABUS_BELLY_FORKED_CORRIDOR, {[]{return Here(RR_JABU_JABUS_BELLY_BLUE_TENTACLE, []{return CanUse(RG_BOOMERANG);});}}), }); - areaTable[JABU_JABUS_BELLY_GREEN_TENTACLE] = Area("Jabu Jabus Belly Green Tentacle", "Jabu Jabus Belly", JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_JABU_JABUS_BELLY_GREEN_TENTACLE] = Area("Jabu Jabus Belly Green Tentacle", "Jabu Jabus Belly", RHT_JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(JABU_JABUS_BELLY_FORKED_CORRIDOR, {[]{return Here(JABU_JABUS_BELLY_GREEN_TENTACLE, []{return CanUse(BOOMERANG);});}}), + Entrance(RR_JABU_JABUS_BELLY_FORKED_CORRIDOR, {[]{return Here(RR_JABU_JABUS_BELLY_GREEN_TENTACLE, []{return CanUse(RG_BOOMERANG);});}}), }); - areaTable[JABU_JABUS_BELLY_BIGOCTO_ROOM] = Area("Jabu Jabus Belly Bigocto Room", "Jabu Jabus Belly", JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_JABU_JABUS_BELLY_BIGOCTO_ROOM] = Area("Jabu Jabus Belly Bigocto Room", "Jabu Jabus Belly", RHT_JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(JABU_JABUS_BELLY_MAIN_LOWER, {[]{return true;}}), - Entrance(JABU_JABUS_BELLY_ABOVE_BIGOCTO, {[]{return Here(JABU_JABUS_BELLY_BIGOCTO_ROOM, []{return (CanUse(BOOMERANG) || Nuts) && (CanUse(KOKIRI_SWORD) || CanUse(STICKS));});}}), + Entrance(RR_JABU_JABUS_BELLY_MAIN_LOWER, {[]{return true;}}), + Entrance(RR_JABU_JABUS_BELLY_ABOVE_BIGOCTO, {[]{return Here(RR_JABU_JABUS_BELLY_BIGOCTO_ROOM, []{return (CanUse(RG_BOOMERANG) || Nuts) && (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_STICKS));});}}), }); - areaTable[JABU_JABUS_BELLY_ABOVE_BIGOCTO] = Area("Jabu Jabus Belly Above Bigocto", "Jabu Jabus Belly", JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_JABU_JABUS_BELLY_ABOVE_BIGOCTO] = Area("Jabu Jabus Belly Above Bigocto", "Jabu Jabus Belly", RHT_JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&FairyPot, {[]{return true;}}), EventAccess(&NutPot, {[]{return true;}}), }, {}, { //Exits - Entrance(JABU_JABUS_BELLY_LIFT_UPPER, {[]{return CanUse(BOOMERANG);}}), + Entrance(RR_JABU_JABUS_BELLY_LIFT_UPPER, {[]{return CanUse(RG_BOOMERANG);}}), }); - areaTable[JABU_JABUS_BELLY_LIFT_UPPER] = Area("Jabu Jabus Belly Lift Upper", "Jabu Jabus Belly", JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_JABU_JABUS_BELLY_LIFT_UPPER] = Area("Jabu Jabus Belly Lift Upper", "Jabu Jabus Belly", RHT_JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(JABU_JABUS_BELLY_LIFT_MIDDLE, {[]{return true;}}), - Entrance(JABU_JABUS_BELLY_LIFT_LOWER, {[]{return true;}}), + Entrance(RR_JABU_JABUS_BELLY_LIFT_MIDDLE, {[]{return true;}}), + Entrance(RR_JABU_JABUS_BELLY_LIFT_LOWER, {[]{return true;}}), }); - areaTable[JABU_JABUS_BELLY_NEAR_BOSS_ROOM] = Area("Jabu Jabus Belly Near Boss Room", "Jabu Jabus Belly", JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_JABU_JABUS_BELLY_NEAR_BOSS_ROOM] = Area("Jabu Jabus Belly Near Boss Room", "Jabu Jabus Belly", RHT_JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(JABU_JABUS_BELLY_GS_NEAR_BOSS, {[]{return IsAdult || CanChildAttack;}}), + LocationAccess(RC_JABU_JABUS_BELLY_GS_NEAR_BOSS, {[]{return IsAdult || CanChildAttack;}}), }, { //Exits - Entrance(JABU_JABUS_BELLY_LIFT_MIDDLE, {[]{return true;}}), - Entrance(JABU_JABUS_BELLY_BOSS_ENTRYWAY, {[]{return CanUse(BOOMERANG) || (LogicJabuNearBossRanged && ((IsAdult && (CanUse(HOOKSHOT) || CanUse(BOW))) || (IsChild && CanUse(SLINGSHOT)))) || (LogicJabuNearBossExplosives && (HasBombchus || (IsAdult && CanUse(HOVER_BOOTS) && Bombs)));}}), + Entrance(RR_JABU_JABUS_BELLY_LIFT_MIDDLE, {[]{return true;}}), + Entrance(RR_JABU_JABUS_BELLY_BOSS_ENTRYWAY, {[]{return CanUse(RG_BOOMERANG) || (LogicJabuNearBossRanged && ((IsAdult && (CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW))) || (IsChild && CanUse(RG_FAIRY_SLINGSHOT)))) || (LogicJabuNearBossExplosives && (HasBombchus || (IsAdult && CanUse(RG_HOVER_BOOTS) && Bombs)));}}), }); } @@ -162,88 +162,88 @@ void AreaTable_Init_JabuJabusBelly() { | MASTER QUEST DUNGEON | ---------------------------*/ if (Dungeon::JabuJabusBelly.IsMQ()) { - areaTable[JABU_JABUS_BELLY_MQ_BEGINNING] = Area("Jabu Jabus Belly MQ Beginning", "Jabu Jabus Belly", JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_JABU_JABUS_BELLY_MQ_BEGINNING] = Area("Jabu Jabus Belly MQ Beginning", "Jabu Jabus Belly", RHT_JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&NutPot, {[]{return true;}}), }, { //Locations - LocationAccess(JABU_JABUS_BELLY_MQ_MAP_CHEST, {[]{return CanBlastOrSmash;}}), - LocationAccess(JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, {[]{return IsChild && CanUse(SLINGSHOT);}}), + LocationAccess(RC_JABU_JABUS_BELLY_MQ_MAP_CHEST, {[]{return CanBlastOrSmash;}}), + LocationAccess(RC_JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, {[]{return IsChild && CanUse(RG_FAIRY_SLINGSHOT);}}), }, { //Exits - Entrance(JABU_JABUS_BELLY_ENTRYWAY, {[]{return true;}}), - Entrance(JABU_JABUS_BELLY_MQ_MAIN, {[]{return Here(JABU_JABUS_BELLY_MQ_BEGINNING, []{return IsChild && CanUse(SLINGSHOT);});}}), + Entrance(RR_JABU_JABUS_BELLY_ENTRYWAY, {[]{return true;}}), + Entrance(RR_JABU_JABUS_BELLY_MQ_MAIN, {[]{return Here(RR_JABU_JABUS_BELLY_MQ_BEGINNING, []{return IsChild && CanUse(RG_FAIRY_SLINGSHOT);});}}), }); - areaTable[JABU_JABUS_BELLY_MQ_MAIN] = Area("Jabu Jabus Belly MQ Main", "Jabu Jabus Belly", JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_JABU_JABUS_BELLY_MQ_MAIN] = Area("Jabu Jabus Belly MQ Main", "Jabu Jabus Belly", RHT_JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST, {[]{return true;}}), - LocationAccess(JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST, {[]{return (IsAdult && (CanUse(HOVER_BOOTS) || CanUse(HOOKSHOT))) || ChildCanAccess(JABU_JABUS_BELLY_MQ_BOSS_AREA);}}), - LocationAccess(JABU_JABUS_BELLY_MQ_COMPASS_CHEST, {[]{return true;}}), - LocationAccess(JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, {[]{return true;}}), - LocationAccess(JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, {[]{return true;}}), - LocationAccess(JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, {[]{return true;}}), - LocationAccess(JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, {[]{return true;}}), - LocationAccess(JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, {[]{return CanPlay(SongOfTime) || (LogicJabuMQSoTGS && IsChild && CanUse(BOOMERANG));}}), - //Trick: CanPlay(SongOfTime) || (LogicJabuMQSoTGS && IsChild && CanUse(BOOMERANG)) + LocationAccess(RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST, {[]{return true;}}), + LocationAccess(RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST, {[]{return (IsAdult && (CanUse(RG_HOVER_BOOTS) || CanUse(RG_HOOKSHOT))) || ChildCanAccess(RR_JABU_JABUS_BELLY_MQ_BOSS_AREA);}}), + LocationAccess(RC_JABU_JABUS_BELLY_MQ_COMPASS_CHEST, {[]{return true;}}), + LocationAccess(RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, {[]{return true;}}), + LocationAccess(RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, {[]{return true;}}), + LocationAccess(RC_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, {[]{return true;}}), + LocationAccess(RC_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, {[]{return true;}}), + LocationAccess(RC_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, {[]{return CanPlay(SongOfTime) || (LogicJabuMQSoTGS && IsChild && CanUse(RG_BOOMERANG));}}), + //Trick: CanPlay(SongOfTime) || (LogicJabuMQSoTGS && IsChild && CanUse(RG_BOOMERANG)) }, { //Exits - Entrance(JABU_JABUS_BELLY_MQ_BEGINNING, {[]{return true;}}), - Entrance(JABU_JABUS_BELLY_MQ_DEPTHS, {[]{return HasExplosives && IsChild && CanUse(BOOMERANG);}}), + Entrance(RR_JABU_JABUS_BELLY_MQ_BEGINNING, {[]{return true;}}), + Entrance(RR_JABU_JABUS_BELLY_MQ_DEPTHS, {[]{return HasExplosives && IsChild && CanUse(RG_BOOMERANG);}}), }); - areaTable[JABU_JABUS_BELLY_MQ_DEPTHS] = Area("Jabu Jabus Belly MQ Depths", "Jabu Jabus Belly", JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_JABU_JABUS_BELLY_MQ_DEPTHS] = Area("Jabu Jabus Belly MQ Depths", "Jabu Jabus Belly", RHT_JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, {[]{return true;}}), - LocationAccess(JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, {[]{return Sticks || CanUse(DINS_FIRE);}}), - LocationAccess(JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, {[]{return (LogicLensJabuMQ || CanUse(LENS_OF_TRUTH)) || Here(JABU_JABUS_BELLY_MQ_MAIN, []{return IsAdult && CanUse(HOVER_BOOTS) && CanUse(HOOKSHOT);});}}), + LocationAccess(RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, {[]{return true;}}), + LocationAccess(RC_JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, {[]{return Sticks || CanUse(RG_DINS_FIRE);}}), + LocationAccess(RC_JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, {[]{return (LogicLensJabuMQ || CanUse(RG_LENS_OF_TRUTH)) || Here(RR_JABU_JABUS_BELLY_MQ_MAIN, []{return IsAdult && CanUse(RG_HOVER_BOOTS) && CanUse(RG_HOOKSHOT);});}}), }, { //Exits - Entrance(JABU_JABUS_BELLY_MQ_MAIN, {[]{return true;}}), - Entrance(JABU_JABUS_BELLY_MQ_BOSS_AREA, {[]{return Sticks || (CanUse(DINS_FIRE) && KokiriSword);}}), + Entrance(RR_JABU_JABUS_BELLY_MQ_MAIN, {[]{return true;}}), + Entrance(RR_JABU_JABUS_BELLY_MQ_BOSS_AREA, {[]{return Sticks || (CanUse(RG_DINS_FIRE) && KokiriSword);}}), }); - areaTable[JABU_JABUS_BELLY_MQ_BOSS_AREA] = Area("Jabu Jabus Belly MQ Boss Area", "Jabu Jabus Belly", JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_JABU_JABUS_BELLY_MQ_BOSS_AREA] = Area("Jabu Jabus Belly MQ Boss Area", "Jabu Jabus Belly", RHT_JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&FairyPot, {[]{return true;}}), }, { //Locations - LocationAccess(JABU_JABUS_BELLY_MQ_COW, {[]{return CanPlay(EponasSong);}}), - LocationAccess(JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, {[]{return true;}}), - LocationAccess(JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, {[]{return true;}}), + LocationAccess(RC_JABU_JABUS_BELLY_MQ_COW, {[]{return CanPlay(EponasSong);}}), + LocationAccess(RC_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, {[]{return true;}}), + LocationAccess(RC_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, {[]{return true;}}), }, { //Exits - Entrance(JABU_JABUS_BELLY_MQ_MAIN, {[]{return true;}}), - Entrance(JABU_JABUS_BELLY_BOSS_ENTRYWAY, {[]{return CanUse(SLINGSHOT);}}), + Entrance(RR_JABU_JABUS_BELLY_MQ_MAIN, {[]{return true;}}), + Entrance(RR_JABU_JABUS_BELLY_BOSS_ENTRYWAY, {[]{return CanUse(RG_FAIRY_SLINGSHOT);}}), }); } /*--------------------------- | BOSS ROOM | ---------------------------*/ - areaTable[JABU_JABUS_BELLY_BOSS_ENTRYWAY] = - Area("Jabu Jabus Belly Boss Entryway", "Jabu Jabus Belly", JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, {}, + areaTable[RR_JABU_JABUS_BELLY_BOSS_ENTRYWAY] = + Area("Jabu Jabus Belly Boss Entryway", "Jabu Jabus Belly", RHT_JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, {}, { // Exits - Entrance(JABU_JABUS_BELLY_NEAR_BOSS_ROOM, { [] { return Dungeon::JabuJabusBelly.IsVanilla(); } }), - Entrance(JABU_JABUS_BELLY_MQ_BOSS_AREA, { [] { return Dungeon::JabuJabusBelly.IsMQ(); } }), - Entrance(JABU_JABUS_BELLY_BOSS_ROOM, { [] { return true; } }), + Entrance(RR_JABU_JABUS_BELLY_NEAR_BOSS_ROOM, { [] { return Dungeon::JabuJabusBelly.IsVanilla(); } }), + Entrance(RR_JABU_JABUS_BELLY_MQ_BOSS_AREA, { [] { return Dungeon::JabuJabusBelly.IsMQ(); } }), + Entrance(RR_JABU_JABUS_BELLY_BOSS_ROOM, { [] { return true; } }), }); - areaTable[JABU_JABUS_BELLY_BOSS_ROOM] = - Area("Jabu Jabus Belly Boss Room", "Jabu Jabus Belly", NONE, NO_DAY_NIGHT_CYCLE, + areaTable[RR_JABU_JABUS_BELLY_BOSS_ROOM] = + Area("Jabu Jabus Belly Boss Room", "Jabu Jabus Belly", RHT_NONE, NO_DAY_NIGHT_CYCLE, { // Events //todo: add pot kill trick EventAccess(&JabuJabusBellyClear, - { [] { return JabuJabusBellyClear || (CanUse(BOOMERANG) && CanJumpslash); } }), + { [] { return JabuJabusBellyClear || (CanUse(RG_BOOMERANG) && CanJumpslash); } }), }, { // Locations - LocationAccess(JABU_JABUS_BELLY_BARINADE_HEART, { [] { return JabuJabusBellyClear; } }), - LocationAccess(BARINADE, { [] { return JabuJabusBellyClear; } }), + LocationAccess(RC_JABU_JABUS_BELLY_BARINADE_HEART, { [] { return JabuJabusBellyClear; } }), + LocationAccess(RC_BARINADE, { [] { return JabuJabusBellyClear; } }), }, { // Exits - Entrance(JABU_JABUS_BELLY_BOSS_ENTRYWAY, { [] { return false; } }), + Entrance(RR_JABU_JABUS_BELLY_BOSS_ENTRYWAY, { [] { return false; } }), }); } 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 db9bb69dc..0c4dd31fc 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp @@ -6,281 +6,287 @@ using namespace Logic; using namespace Settings; void AreaTable_Init_Kakariko() { - areaTable[KAKARIKO_VILLAGE] = Area("Kakariko Village", "Kakariko Village", KAKARIKO_VILLAGE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_KAKARIKO_VILLAGE] = Area("Kakariko Village", "Kakariko Village", RHT_KAKARIKO_VILLAGE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&CojiroAccess, {[]{return CojiroAccess || (IsAdult && WakeUpAdultTalon);}}), EventAccess(&BugRock, {[]{return true;}}), EventAccess(&KakarikoVillageGateOpen, {[]{return KakarikoVillageGateOpen || (IsChild && (ZeldasLetter || OpenKakariko.Is(OPENKAKARIKO_OPEN)));}}), }, { //Locations - LocationAccess(SHEIK_IN_KAKARIKO, {[]{return IsAdult && ForestMedallion && FireMedallion && WaterMedallion;}}), - LocationAccess(KAK_ANJU_AS_CHILD, {[]{return IsChild && AtDay;}}), - LocationAccess(KAK_ANJU_AS_ADULT, {[]{return IsAdult && AtDay;}}), - LocationAccess(KAK_TRADE_POCKET_CUCCO, {[]{return IsAdult && AtDay && PocketEgg && WakeUpAdultTalon;}}), - LocationAccess(KAK_GS_HOUSE_UNDER_CONSTRUCTION, {[]{return IsChild && AtNight && CanGetNightTimeGS;}}), - LocationAccess(KAK_GS_SKULLTULA_HOUSE, {[]{return IsChild && AtNight && CanGetNightTimeGS;}}), - LocationAccess(KAK_GS_GUARDS_HOUSE, {[]{return IsChild && AtNight && CanGetNightTimeGS;}}), - LocationAccess(KAK_GS_TREE, {[]{return IsChild && AtNight && CanGetNightTimeGS;}}), - LocationAccess(KAK_GS_WATCHTOWER, {[]{return IsChild && (Slingshot || HasBombchus || CanUse(BOW) || CanUse(LONGSHOT) || (LogicKakarikoTowerGS && CanJumpslash)) && AtNight && CanGetNightTimeGS;}}), + LocationAccess(RC_SHEIK_IN_KAKARIKO, {[]{return IsAdult && ForestMedallion && FireMedallion && WaterMedallion;}}), + LocationAccess(RC_KAK_ANJU_AS_CHILD, {[]{return IsChild && AtDay;}}), + LocationAccess(RC_KAK_ANJU_AS_ADULT, {[]{return IsAdult && AtDay;}}), + LocationAccess(RC_KAK_TRADE_POCKET_CUCCO, {[]{return IsAdult && AtDay && PocketEgg && WakeUpAdultTalon;}}), + LocationAccess(RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION, {[]{return IsChild && AtNight && CanGetNightTimeGS;}}), + LocationAccess(RC_KAK_GS_SKULLTULA_HOUSE, {[]{return IsChild && AtNight && CanGetNightTimeGS;}}), + LocationAccess(RC_KAK_GS_GUARDS_HOUSE, {[]{return IsChild && AtNight && CanGetNightTimeGS;}}), + LocationAccess(RC_KAK_GS_TREE, {[]{return IsChild && AtNight && CanGetNightTimeGS;}}), + LocationAccess(RC_KAK_GS_WATCHTOWER, {[]{return IsChild && (Slingshot || HasBombchus || CanUse(RG_FAIRY_BOW) || CanUse(RG_LONGSHOT) || (LogicKakarikoTowerGS && CanJumpslash)) && AtNight && CanGetNightTimeGS;}}), }, { //Exits - Entrance(HYRULE_FIELD, {[]{return true;}}), - Entrance(KAK_CARPENTER_BOSS_HOUSE, {[]{return true;}}), - Entrance(KAK_HOUSE_OF_SKULLTULA, {[]{return true;}}), - Entrance(KAK_IMPAS_HOUSE, {[]{return true;}}), - Entrance(KAK_WINDMILL, {[]{return true;}}), - Entrance(KAK_BAZAAR, {[]{return IsAdult && AtDay;}}), - Entrance(KAK_SHOOTING_GALLERY, {[]{return IsAdult && AtDay;}}), - Entrance(BOTTOM_OF_THE_WELL_ENTRYWAY, {[]{return DrainWell && (IsChild || ShuffleDungeonEntrances.IsNot(SHUFFLEDUNGEONS_OFF));}}), - Entrance(KAK_POTION_SHOP_FRONT, {[]{return AtDay || IsChild;}}), - Entrance(KAK_REDEAD_GROTTO, {[]{return CanOpenBombGrotto;}}), - Entrance(KAK_IMPAS_LEDGE, {[]{return (IsChild && AtDay) || CanUse(HOOKSHOT) || (IsAdult && LogicVisibleCollision);}}), - Entrance(KAK_ROOFTOP, {[]{return CanUse(HOOKSHOT) || (LogicManOnRoof && (IsAdult || AtDay || Slingshot || HasBombchus || CanUse(BOW) || CanUse(LONGSHOT)));}}), - Entrance(KAK_IMPAS_ROOFTOP, {[]{return CanUse(HOOKSHOT) || (LogicKakarikoRooftopGS && CanUse(HOVER_BOOTS));}}), - Entrance(THE_GRAVEYARD, {[]{return true;}}), - Entrance(KAK_BEHIND_GATE, {[]{return IsAdult || (KakarikoVillageGateOpen);}}), + Entrance(RR_HYRULE_FIELD, {[]{return true;}}), + Entrance(RR_KAK_CARPENTER_BOSS_HOUSE, {[]{return true;}}), + Entrance(RR_KAK_HOUSE_OF_SKULLTULA, {[]{return true;}}), + Entrance(RR_KAK_IMPAS_HOUSE, {[]{return true;}}), + Entrance(RR_KAK_WINDMILL, {[]{return true;}}), + Entrance(RR_KAK_BAZAAR, {[]{return IsAdult && AtDay;}}), + Entrance(RR_KAK_SHOOTING_GALLERY, {[]{return IsAdult && AtDay;}}), + Entrance(RR_BOTTOM_OF_THE_WELL_ENTRYWAY, {[]{return DrainWell && (IsChild || ShuffleDungeonEntrances.IsNot(SHUFFLEDUNGEONS_OFF));}}), + Entrance(RR_KAK_POTION_SHOP_FRONT, {[]{return AtDay || IsChild;}}), + Entrance(RR_KAK_REDEAD_GROTTO, {[]{return CanOpenBombGrotto;}}), + Entrance(RR_KAK_IMPAS_LEDGE, {[]{return (IsChild && AtDay) || CanUse(RG_HOOKSHOT) || (IsAdult && LogicVisibleCollision);}}), + Entrance(RR_KAK_ROOFTOP, {[]{return CanUse(RG_HOOKSHOT) || (LogicManOnRoof && (IsAdult || AtDay || Slingshot || HasBombchus || CanUse(RG_FAIRY_BOW) || CanUse(RG_LONGSHOT)));}}), + Entrance(RR_KAK_IMPAS_ROOFTOP, {[]{return CanUse(RG_HOOKSHOT) || (LogicKakarikoRooftopGS && CanUse(RG_HOVER_BOOTS));}}), + Entrance(RR_THE_GRAVEYARD, {[]{return true;}}), + Entrance(RR_KAK_BEHIND_GATE, {[]{return IsAdult || (KakarikoVillageGateOpen);}}), }); - areaTable[KAK_IMPAS_LEDGE] = Area("Kak Impas Ledge", "Kakariko Village", KAKARIKO_VILLAGE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_KAK_IMPAS_LEDGE] = Area("Kak Impas Ledge", "Kakariko Village", RHT_KAKARIKO_VILLAGE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(KAK_IMPAS_HOUSE_BACK, {[]{return true;}}), - Entrance(KAKARIKO_VILLAGE, {[]{return true;}}), + Entrance(RR_KAK_IMPAS_HOUSE_BACK, {[]{return true;}}), + Entrance(RR_KAKARIKO_VILLAGE, {[]{return true;}}), }); - areaTable[KAK_IMPAS_ROOFTOP] = Area("Kak Impas Rooftop", "Kakariko Village", KAKARIKO_VILLAGE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KAK_IMPAS_ROOFTOP] = Area("Kak Impas Rooftop", "Kakariko Village", RHT_KAKARIKO_VILLAGE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(KAK_GS_ABOVE_IMPAS_HOUSE, {[]{return IsAdult && AtNight && CanGetNightTimeGS && (CanJumpslash || CanUseProjectile);}}), + LocationAccess(RC_KAK_GS_ABOVE_IMPAS_HOUSE, {[]{return IsAdult && AtNight && CanGetNightTimeGS && (CanJumpslash || CanUseProjectile);}}), }, { //Exits - Entrance(KAK_IMPAS_LEDGE, {[]{return true;}}), - Entrance(KAKARIKO_VILLAGE, {[]{return true;}}), + Entrance(RR_KAK_IMPAS_LEDGE, {[]{return true;}}), + Entrance(RR_KAKARIKO_VILLAGE, {[]{return true;}}), }); - areaTable[KAK_ROOFTOP] = Area("Kak Rooftop", "Kakariko Village", KAKARIKO_VILLAGE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KAK_ROOFTOP] = Area("Kak Rooftop", "Kakariko Village", RHT_KAKARIKO_VILLAGE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(KAK_MAN_ON_ROOF, {[]{return true;}}), + LocationAccess(RC_KAK_MAN_ON_ROOF, {[]{return true;}}), }, { //Exits - Entrance(KAK_BACKYARD, {[]{return true;}}), + Entrance(RR_KAK_BACKYARD, {[]{return true;}}), }); - areaTable[KAK_BACKYARD] = Area("Kak Backyard", "Kakariko Village", KAKARIKO_VILLAGE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_KAK_BACKYARD] = Area("Kak Backyard", "Kakariko Village", RHT_KAKARIKO_VILLAGE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(KAKARIKO_VILLAGE, {[]{return true;}}), - Entrance(KAK_OPEN_GROTTO, {[]{return true;}}), - Entrance(KAK_ODD_POTION_BUILDING, {[]{return IsAdult;}}), - Entrance(KAK_POTION_SHOP_BACK, {[]{return IsAdult && AtDay;}}), + Entrance(RR_KAKARIKO_VILLAGE, {[]{return true;}}), + Entrance(RR_KAK_OPEN_GROTTO, {[]{return true;}}), + Entrance(RR_KAK_ODD_POTION_BUILDING, {[]{return IsAdult;}}), + Entrance(RR_KAK_POTION_SHOP_BACK, {[]{return IsAdult && AtDay;}}), }); - areaTable[KAK_CARPENTER_BOSS_HOUSE] = Area("Kak Carpenter Boss House", "Kak Carpenter Boss House", NONE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_KAK_CARPENTER_BOSS_HOUSE] = Area("Kak Carpenter Boss House", "Kak Carpenter Boss House", RHT_NONE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&WakeUpAdultTalon, {[]{return WakeUpAdultTalon || (IsAdult && PocketEgg);}}), }, {}, { //Exits - Entrance(KAKARIKO_VILLAGE, {[]{return true;}}), + Entrance(RR_KAKARIKO_VILLAGE, {[]{return true;}}), }); - areaTable[KAK_HOUSE_OF_SKULLTULA] = Area("Kak House of Skulltula", "Kak House of Skulltula", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KAK_HOUSE_OF_SKULLTULA] = Area("Kak House of Skulltula", "Kak House of Skulltula", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(KAK_10_GOLD_SKULLTULA_REWARD, {[]{return GoldSkulltulaTokens >= 10;}}), - LocationAccess(KAK_20_GOLD_SKULLTULA_REWARD, {[]{return GoldSkulltulaTokens >= 20;}}), - LocationAccess(KAK_30_GOLD_SKULLTULA_REWARD, {[]{return GoldSkulltulaTokens >= 30;}}), - LocationAccess(KAK_40_GOLD_SKULLTULA_REWARD, {[]{return GoldSkulltulaTokens >= 40;}}), - LocationAccess(KAK_50_GOLD_SKULLTULA_REWARD, {[]{return GoldSkulltulaTokens >= 50;}}), - LocationAccess(KAK_100_GOLD_SKULLTULA_REWARD, {[]{return GoldSkulltulaTokens >= 100;}}) + LocationAccess(RC_KAK_10_GOLD_SKULLTULA_REWARD, {[]{return GoldSkulltulaTokens >= 10;}}), + LocationAccess(RC_KAK_20_GOLD_SKULLTULA_REWARD, {[]{return GoldSkulltulaTokens >= 20;}}), + LocationAccess(RC_KAK_30_GOLD_SKULLTULA_REWARD, {[]{return GoldSkulltulaTokens >= 30;}}), + LocationAccess(RC_KAK_40_GOLD_SKULLTULA_REWARD, {[]{return GoldSkulltulaTokens >= 40;}}), + LocationAccess(RC_KAK_50_GOLD_SKULLTULA_REWARD, {[]{return GoldSkulltulaTokens >= 50;}}), + LocationAccess(RC_KAK_100_GOLD_SKULLTULA_REWARD, {[]{return GoldSkulltulaTokens >= 100;}}) }, { //Exits - Entrance(KAKARIKO_VILLAGE, {[]{return true;}}), + Entrance(RR_KAKARIKO_VILLAGE, {[]{return true;}}), }); - areaTable[KAK_IMPAS_HOUSE] = Area("Kak Impas House", "Kak Impas House", NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_KAK_IMPAS_HOUSE] = Area("Kak Impas House", "Kak Impas House", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(KAK_IMPAS_HOUSE_NEAR_COW, {[]{return true;}}), - Entrance(KAKARIKO_VILLAGE, {[]{return true;}}), + Entrance(RR_KAK_IMPAS_HOUSE_NEAR_COW, {[]{return true;}}), + Entrance(RR_KAKARIKO_VILLAGE, {[]{return true;}}), }); - areaTable[KAK_IMPAS_HOUSE_BACK] = Area("Kak Impas House Back", "Kak Impas House", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KAK_IMPAS_HOUSE_BACK] = Area("Kak Impas House Back", "Kak Impas House", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(KAK_IMPAS_HOUSE_FREESTANDING_POH, {[]{return true;}}), + LocationAccess(RC_KAK_IMPAS_HOUSE_FREESTANDING_POH, {[]{return true;}}), }, { //Exits - Entrance(KAK_IMPAS_LEDGE, {[]{return true;}}), - Entrance(KAK_IMPAS_HOUSE_NEAR_COW, {[]{return true;}}), + Entrance(RR_KAK_IMPAS_LEDGE, {[]{return true;}}), + Entrance(RR_KAK_IMPAS_HOUSE_NEAR_COW, {[]{return true;}}), }); - areaTable[KAK_IMPAS_HOUSE_NEAR_COW] = Area("Kak Impas House Near Cow", "Kak Impas House", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KAK_IMPAS_HOUSE_NEAR_COW] = Area("Kak Impas House Near Cow", "Kak Impas House", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(KAK_IMPAS_HOUSE_COW, {[]{return CanPlay(EponasSong);}}), + LocationAccess(RC_KAK_IMPAS_HOUSE_COW, {[]{return CanPlay(EponasSong);}}), }, {}); - areaTable[KAK_WINDMILL] = Area("Kak Windmill", "Windmill and Dampes Grave", NONE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_KAK_WINDMILL] = Area("Kak Windmill", "Windmill and Dampes Grave", RHT_NONE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&DrainWell, {[]{return DrainWell || (IsChild && CanPlay(SongOfStorms));}}), }, { //Locations - LocationAccess(KAK_WINDMILL_FREESTANDING_POH, {[]{return CanUse(BOOMERANG) || DampesWindmillAccess || (IsAdult && LogicAdultWindmillPoH) || (IsChild && CanJumpslash && LogicChildWindmillPoH);}}), + LocationAccess(RC_KAK_WINDMILL_FREESTANDING_POH, {[]{return CanUse(RG_BOOMERANG) || DampesWindmillAccess || (IsAdult && LogicAdultWindmillPoH) || (IsChild && CanJumpslash && LogicChildWindmillPoH);}}), //PoH as child not added to trick options yet (needs uncommenting in randomizer_tricks.cpp) - LocationAccess(SONG_FROM_WINDMILL, {[]{return IsAdult && Ocarina;}}), + LocationAccess(RC_SONG_FROM_WINDMILL, {[]{return IsAdult && Ocarina;}}), }, { //Exits - Entrance(KAKARIKO_VILLAGE, {[]{return true;}}), + Entrance(RR_KAKARIKO_VILLAGE, {[]{return true;}}), }); - areaTable[KAK_BAZAAR] = Area("Kak Bazaar", "Kak Bazaar", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KAK_BAZAAR] = Area("Kak Bazaar", "Kak Bazaar", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(KAK_BAZAAR_ITEM_1, {[]{return true;}}), - LocationAccess(KAK_BAZAAR_ITEM_2, {[]{return true;}}), - LocationAccess(KAK_BAZAAR_ITEM_3, {[]{return true;}}), - LocationAccess(KAK_BAZAAR_ITEM_4, {[]{return true;}}), - LocationAccess(KAK_BAZAAR_ITEM_5, {[]{return true;}}), - LocationAccess(KAK_BAZAAR_ITEM_6, {[]{return true;}}), - LocationAccess(KAK_BAZAAR_ITEM_7, {[]{return true;}}), - LocationAccess(KAK_BAZAAR_ITEM_8, {[]{return true;}}), + LocationAccess(RC_KAK_BAZAAR_ITEM_1, {[]{return true;}}), + LocationAccess(RC_KAK_BAZAAR_ITEM_2, {[]{return true;}}), + LocationAccess(RC_KAK_BAZAAR_ITEM_3, {[]{return true;}}), + LocationAccess(RC_KAK_BAZAAR_ITEM_4, {[]{return true;}}), + LocationAccess(RC_KAK_BAZAAR_ITEM_5, {[]{return true;}}), + LocationAccess(RC_KAK_BAZAAR_ITEM_6, {[]{return true;}}), + LocationAccess(RC_KAK_BAZAAR_ITEM_7, {[]{return true;}}), + LocationAccess(RC_KAK_BAZAAR_ITEM_8, {[]{return true;}}), }, { //Exits - Entrance(KAKARIKO_VILLAGE, {[]{return true;}}), + Entrance(RR_KAKARIKO_VILLAGE, {[]{return true;}}), }); - areaTable[KAK_SHOOTING_GALLERY] = Area("Kak Shooting Gallery", "Kak Shooting Gallery", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KAK_SHOOTING_GALLERY] = Area("Kak Shooting Gallery", "Kak Shooting Gallery", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(KAK_SHOOTING_GALLERY_REWARD, {[]{return IsAdult && Bow;}}), + LocationAccess(RC_KAK_SHOOTING_GALLERY_REWARD, {[]{return IsAdult && Bow;}}), }, { //Exits - Entrance(KAKARIKO_VILLAGE, {[]{return true;}}), + Entrance(RR_KAKARIKO_VILLAGE, {[]{return true;}}), }); - areaTable[KAK_POTION_SHOP_FRONT] = Area("Kak Potion Shop Front", "Kak Potion Shop", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KAK_POTION_SHOP_FRONT] = Area("Kak Potion Shop Front", "Kak Potion Shop", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(KAK_POTION_SHOP_ITEM_1, {[]{return IsAdult;}}), - LocationAccess(KAK_POTION_SHOP_ITEM_2, {[]{return IsAdult;}}), - LocationAccess(KAK_POTION_SHOP_ITEM_3, {[]{return IsAdult;}}), - LocationAccess(KAK_POTION_SHOP_ITEM_4, {[]{return IsAdult;}}), - LocationAccess(KAK_POTION_SHOP_ITEM_5, {[]{return IsAdult;}}), - LocationAccess(KAK_POTION_SHOP_ITEM_6, {[]{return IsAdult;}}), - LocationAccess(KAK_POTION_SHOP_ITEM_7, {[]{return IsAdult;}}), - LocationAccess(KAK_POTION_SHOP_ITEM_8, {[]{return IsAdult;}}), + LocationAccess(RC_KAK_POTION_SHOP_ITEM_1, {[]{return IsAdult;}}), + LocationAccess(RC_KAK_POTION_SHOP_ITEM_2, {[]{return IsAdult;}}), + LocationAccess(RC_KAK_POTION_SHOP_ITEM_3, {[]{return IsAdult;}}), + LocationAccess(RC_KAK_POTION_SHOP_ITEM_4, {[]{return IsAdult;}}), + LocationAccess(RC_KAK_POTION_SHOP_ITEM_5, {[]{return IsAdult;}}), + LocationAccess(RC_KAK_POTION_SHOP_ITEM_6, {[]{return IsAdult;}}), + LocationAccess(RC_KAK_POTION_SHOP_ITEM_7, {[]{return IsAdult;}}), + LocationAccess(RC_KAK_POTION_SHOP_ITEM_8, {[]{return IsAdult;}}), }, { //Exits - Entrance(KAKARIKO_VILLAGE, {[]{return true;}}), - Entrance(KAK_POTION_SHOP_BACK, {[]{return IsAdult;}}), + Entrance(RR_KAKARIKO_VILLAGE, {[]{return true;}}), + Entrance(RR_KAK_POTION_SHOP_BACK, {[]{return IsAdult;}}), }); - areaTable[KAK_POTION_SHOP_BACK] = Area("Kak Potion Shop Back", "Kak Potion Shop", NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_KAK_POTION_SHOP_BACK] = Area("Kak Potion Shop Back", "Kak Potion Shop", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(KAK_BACKYARD, {[]{return IsAdult;}}), - Entrance(KAK_POTION_SHOP_FRONT, {[]{return true;}}), + Entrance(RR_KAK_BACKYARD, {[]{return IsAdult;}}), + Entrance(RR_KAK_POTION_SHOP_FRONT, {[]{return true;}}), }); - areaTable[KAK_ODD_POTION_BUILDING] = Area("Kak Granny's Potion Shop", "Kak Granny's Potion Shop", NONE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_KAK_ODD_POTION_BUILDING] = + Area("Kak Granny's Potion Shop", "Kak Granny's Potion Shop", RHT_NONE, NO_DAY_NIGHT_CYCLE, { + + // Events + EventAccess(&OddPoulticeAccess, { [] { + return OddPoulticeAccess || (IsAdult && (OddMushroomAccess || (OddMushroom && DisableTradeRevert))); + } }), + }, + { + LocationAccess(RC_KAK_TRADE_ODD_MUSHROOM, { [] { return IsAdult && OddMushroom; } }), + LocationAccess(RC_KAK_GRANNYS_SHOP, { [] { return IsAdult && OddMushroom && AdultsWallet; } }), + }, + { + // Exits + Entrance(RR_KAK_BACKYARD, { [] { return true; } }), + }); + + areaTable[RR_KAK_REDEAD_GROTTO] = Area("Kak Redead Grotto", "Kak Redead Grotto", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { + //Locations + LocationAccess(RC_KAK_REDEAD_GROTTO_CHEST, {[]{return IsAdult || (Sticks || KokiriSword || CanUse(RG_DINS_FIRE) || CanUse(RG_MEGATON_HAMMER) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD));}}), + }, { + //Exits + Entrance(RR_KAKARIKO_VILLAGE, {[]{return true;}}), + }); + + areaTable[RR_KAK_OPEN_GROTTO] = Area("Kak Open Grotto", "Kak Open Grotto", RHT_NONE, NO_DAY_NIGHT_CYCLE, grottoEvents, { + //Locations + LocationAccess(RC_KAK_OPEN_GROTTO_CHEST, {[]{return true;}}), + LocationAccess(RC_KAK_OPEN_GROTTO_GOSSIP_STONE, {[]{return true;}}), + }, { + //Exits + Entrance(RR_KAK_BACKYARD, {[]{return true;}}), + }); + + areaTable[RR_THE_GRAVEYARD] = Area("The Graveyard", "The Graveyard", RHT_THE_GRAVEYARD, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&OddPoulticeAccess, {[]{return OddPoulticeAccess || (IsAdult && (OddMushroomAccess || (OddMushroom && DisableTradeRevert)));}}), - }, { - LocationAccess(KAK_TRADE_ODD_MUSHROOM, {[]{return IsAdult && OddMushroom;}}), - LocationAccess(KAK_GRANNYS_SHOP, {[]{return IsAdult && OddMushroom && AdultsWallet;}}), - }, { - //Exits - Entrance(KAK_BACKYARD, {[]{return true;}}), - }); - - areaTable[KAK_REDEAD_GROTTO] = Area("Kak Redead Grotto", "Kak Redead Grotto", NONE, NO_DAY_NIGHT_CYCLE, {}, { - //Locations - LocationAccess(KAK_REDEAD_GROTTO_CHEST, {[]{return IsAdult || (Sticks || KokiriSword || CanUse(DINS_FIRE) || CanUse(MEGATON_HAMMER) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD));}}), - }, { - //Exits - Entrance(KAKARIKO_VILLAGE, {[]{return true;}}), - }); - - areaTable[KAK_OPEN_GROTTO] = Area("Kak Open Grotto", "Kak Open Grotto", NONE, NO_DAY_NIGHT_CYCLE, grottoEvents, { - //Locations - LocationAccess(KAK_OPEN_GROTTO_CHEST, {[]{return true;}}), - LocationAccess(KAK_OPEN_GROTTO_GOSSIP_STONE, {[]{return true;}}), - }, { - //Exits - Entrance(KAK_BACKYARD, {[]{return true;}}), - }); - - areaTable[THE_GRAVEYARD] = Area("The Graveyard", "The Graveyard", THE_GRAVEYARD, NO_DAY_NIGHT_CYCLE, { - //Events - EventAccess(&ButterflyFairy, {[]{return ButterflyFairy || (CanUse(STICKS) && AtDay);}}), - EventAccess(&BeanPlantFairy, {[]{return BeanPlantFairy || (CanPlantBean(THE_GRAVEYARD) && CanPlay(SongOfStorms));}}), + EventAccess(&ButterflyFairy, {[]{return ButterflyFairy || (CanUse(RG_STICKS) && AtDay);}}), + EventAccess(&BeanPlantFairy, {[]{return BeanPlantFairy || (CanPlantBean(RR_THE_GRAVEYARD) && CanPlay(SongOfStorms));}}), EventAccess(&BugRock, {[]{return true;}}), }, { //Locations - LocationAccess(GRAVEYARD_FREESTANDING_POH, {[]{return (IsAdult && CanPlantBean(THE_GRAVEYARD)) || CanUse(LONGSHOT) || (LogicGraveyardPoH && CanUse(BOOMERANG));}}), - LocationAccess(GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, {[]{return IsChild && AtNight;}}), //TODO: This needs to change - LocationAccess(GRAVEYARD_GS_WALL, {[]{return IsChild && HookshotOrBoomerang && AtNight && CanGetNightTimeGS;}}), - LocationAccess(GRAVEYARD_GS_BEAN_PATCH, {[]{return CanPlantBugs && CanChildAttack;}}), + LocationAccess(RC_GRAVEYARD_FREESTANDING_POH, {[]{return (IsAdult && CanPlantBean(RR_THE_GRAVEYARD)) || CanUse(RG_LONGSHOT) || (LogicGraveyardPoH && CanUse(RG_BOOMERANG));}}), + LocationAccess(RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, {[]{return IsChild && AtNight;}}), //TODO: This needs to change + LocationAccess(RC_GRAVEYARD_GS_WALL, {[]{return IsChild && HookshotOrBoomerang && AtNight && CanGetNightTimeGS;}}), + LocationAccess(RC_GRAVEYARD_GS_BEAN_PATCH, {[]{return CanPlantBugs && CanChildAttack;}}), }, { //Exits - Entrance(GRAVEYARD_SHIELD_GRAVE, {[]{return IsAdult || AtNight;}}), - Entrance(GRAVEYARD_COMPOSERS_GRAVE, {[]{return CanPlay(ZeldasLullaby);}}), - Entrance(GRAVEYARD_HEART_PIECE_GRAVE, {[]{return IsAdult || AtNight;}}), - Entrance(GRAVEYARD_DAMPES_GRAVE, {[]{return IsAdult;}}), - Entrance(GRAVEYARD_DAMPES_HOUSE, {[]{return IsAdult || AtDampeTime;}}), //TODO: This needs to be handled - Entrance(KAKARIKO_VILLAGE, {[]{return true;}}), - Entrance(GRAVEYARD_WARP_PAD_REGION, {[]{return false;}}), + Entrance(RR_GRAVEYARD_SHIELD_GRAVE, {[]{return IsAdult || AtNight;}}), + Entrance(RR_GRAVEYARD_COMPOSERS_GRAVE, {[]{return CanPlay(ZeldasLullaby);}}), + Entrance(RR_GRAVEYARD_HEART_PIECE_GRAVE, {[]{return IsAdult || AtNight;}}), + Entrance(RR_GRAVEYARD_DAMPES_GRAVE, {[]{return IsAdult;}}), + Entrance(RR_GRAVEYARD_DAMPES_HOUSE, {[]{return IsAdult || AtDampeTime;}}), //TODO: This needs to be handled + Entrance(RR_KAKARIKO_VILLAGE, {[]{return true;}}), + Entrance(RR_GRAVEYARD_WARP_PAD_REGION, {[]{return false;}}), }); - areaTable[GRAVEYARD_SHIELD_GRAVE] = Area("Graveyard Shield Grave", "Graveyard Shield Grave", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GRAVEYARD_SHIELD_GRAVE] = Area("Graveyard Shield Grave", "Graveyard Shield Grave", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(GRAVEYARD_SHIELD_GRAVE_CHEST, {[]{return true;}}), + LocationAccess(RC_GRAVEYARD_SHIELD_GRAVE_CHEST, {[]{return true;}}), //Free Fairies }, { //Exits - Entrance(THE_GRAVEYARD, {[]{return true;}}), + Entrance(RR_THE_GRAVEYARD, {[]{return true;}}), }); - areaTable[GRAVEYARD_HEART_PIECE_GRAVE] = Area("Graveyard Heart Piece Grave", "Graveyard Heart Piece Grave", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GRAVEYARD_HEART_PIECE_GRAVE] = Area("Graveyard Heart Piece Grave", "Graveyard Heart Piece Grave", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(GRAVEYARD_HEART_PIECE_GRAVE_CHEST, {[]{return CanPlay(SunsSong);}}), + LocationAccess(RC_GRAVEYARD_HEART_PIECE_GRAVE_CHEST, {[]{return CanPlay(SunsSong);}}), }, { //Exits - Entrance(THE_GRAVEYARD, {[]{return true;}}), + Entrance(RR_THE_GRAVEYARD, {[]{return true;}}), }); - areaTable[GRAVEYARD_COMPOSERS_GRAVE] = Area("Graveyard Composers Grave", "Graveyard Composers Grave", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GRAVEYARD_COMPOSERS_GRAVE] = Area("Graveyard Composers Grave", "Graveyard Composers Grave", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(GRAVEYARD_COMPOSERS_GRAVE_CHEST, {[]{return HasFireSource;}}), - LocationAccess(SONG_FROM_COMPOSERS_GRAVE, {[]{return IsAdult || (Slingshot || Boomerang || Sticks || HasExplosives || KokiriSword || CanUse(MEGATON_HAMMER) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(BOW) || CanUse(HOOKSHOT));}}), + LocationAccess(RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST, {[]{return HasFireSource;}}), + LocationAccess(RC_SONG_FROM_ROYAL_FAMILYS_TOMB, {[]{return IsAdult || (Slingshot || Boomerang || Sticks || HasExplosives || KokiriSword || CanUse(RG_MEGATON_HAMMER) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_FAIRY_BOW) || CanUse(RG_HOOKSHOT));}}), }, { //Exits - Entrance(THE_GRAVEYARD, {[]{return true;}}), + Entrance(RR_THE_GRAVEYARD, {[]{return true;}}), }); - areaTable[GRAVEYARD_DAMPES_GRAVE] = Area("Graveyard Dampes Grave", "Windmill and Dampes Grave", NONE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GRAVEYARD_DAMPES_GRAVE] = Area("Graveyard Dampes Grave", "Windmill and Dampes Grave", RHT_NONE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&NutPot, {[]{return true;}}), EventAccess(&DampesWindmillAccess, {[]{return DampesWindmillAccess || (IsAdult && CanPlay(SongOfTime));}}), }, { //Locations - LocationAccess(GRAVEYARD_HOOKSHOT_CHEST, {[]{return true;}}), - LocationAccess(GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, {[]{return IsAdult || LogicChildDampeRacePoH;}}), + LocationAccess(RC_GRAVEYARD_HOOKSHOT_CHEST, {[]{return true;}}), + LocationAccess(RC_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, {[]{return IsAdult || LogicChildDampeRacePoH;}}), }, { //Exits - Entrance(THE_GRAVEYARD, {[]{return true;}}), - Entrance(KAK_WINDMILL, {[]{return IsAdult && CanPlay(SongOfTime);}}), + Entrance(RR_THE_GRAVEYARD, {[]{return true;}}), + Entrance(RR_KAK_WINDMILL, {[]{return IsAdult && CanPlay(SongOfTime);}}), }); - areaTable[GRAVEYARD_DAMPES_HOUSE] = Area("Graveyard Dampes House", "Graveyard Dampes House", NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GRAVEYARD_DAMPES_HOUSE] = Area("Graveyard Dampes House", "Graveyard Dampes House", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(THE_GRAVEYARD, {[]{return true;}}), + Entrance(RR_THE_GRAVEYARD, {[]{return true;}}), }); - areaTable[GRAVEYARD_WARP_PAD_REGION] = Area("Graveyard Warp Pad Region", "Graveyard", THE_GRAVEYARD, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GRAVEYARD_WARP_PAD_REGION] = Area("Graveyard Warp Pad Region", "Graveyard", RHT_THE_GRAVEYARD, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&GossipStoneFairy, {[]{return GossipStoneFairy || CanSummonGossipFairyWithoutSuns;}}), }, { //Locations - LocationAccess(GRAVEYARD_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_GY_GOSSIP_STONE, {[]{return true;}}), }, { //Exits - Entrance(THE_GRAVEYARD, {[]{return true;}}), - Entrance(SHADOW_TEMPLE_ENTRYWAY, {[]{return CanUse(DINS_FIRE) || (LogicShadowFireArrowEntry && IsAdult && CanUse(FIRE_ARROWS));}}), + Entrance(RR_THE_GRAVEYARD, {[]{return true;}}), + Entrance(RR_SHADOW_TEMPLE_ENTRYWAY, {[]{return CanUse(RG_DINS_FIRE) || (LogicShadowFireArrowEntry && IsAdult && CanUse(RG_FIRE_ARROWS));}}), }); - areaTable[KAK_BEHIND_GATE] = Area("Kak Behind Gate", "Kakariko Village", NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_KAK_BEHIND_GATE] = Area("Kak Behind Gate", "Kakariko Village", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(KAKARIKO_VILLAGE, {[]{return IsAdult || LogicVisibleCollision || KakarikoVillageGateOpen || OpenKakariko.Is(OPENKAKARIKO_OPEN);}}), - Entrance(DEATH_MOUNTAIN_TRAIL, {[]{return true;}}), + Entrance(RR_KAKARIKO_VILLAGE, {[]{return IsAdult || LogicVisibleCollision || KakarikoVillageGateOpen || OpenKakariko.Is(OPENKAKARIKO_OPEN);}}), + Entrance(RR_DEATH_MOUNTAIN_TRAIL, {[]{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 1ba2048a0..e3b073ba4 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 @@ -6,111 +6,111 @@ using namespace Logic; using namespace Settings; void AreaTable_Init_LostWoods() { - areaTable[KOKIRI_FOREST] = Area("Kokiri Forest", "Kokiri Forest", KOKIRI_FOREST, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_KOKIRI_FOREST] = Area("Kokiri Forest", "Kokiri Forest", RHT_KOKIRI_FOREST, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&BeanPlantFairy, {[]{return BeanPlantFairy || (CanPlantBean(KOKIRI_FOREST) && CanPlay(SongOfStorms));}}), + EventAccess(&BeanPlantFairy, {[]{return BeanPlantFairy || (CanPlantBean(RR_KOKIRI_FOREST) && CanPlay(SongOfStorms));}}), EventAccess(&GossipStoneFairy, {[]{return GossipStoneFairy || CanSummonGossipFairyWithoutSuns;}}), EventAccess(&ShowedMidoSwordAndShield, {[]{return ShowedMidoSwordAndShield || (IsChild && KokiriSword && DekuShield);}}), }, { //Locations - LocationAccess(KF_KOKIRI_SWORD_CHEST, {[]{return IsChild;}}), - LocationAccess(KF_GS_KNOW_IT_ALL_HOUSE, {[]{return IsChild && CanChildAttack && AtNight && (HasNightStart || CanLeaveForest || CanPlay(SunsSong)) && CanGetNightTimeGS;}}), - LocationAccess(KF_GS_BEAN_PATCH, {[]{return CanPlantBugs && CanChildAttack;}}), - LocationAccess(KF_GS_HOUSE_OF_TWINS, {[]{return IsAdult && AtNight && (HookshotOrBoomerang || (LogicAdultKokiriGS && CanUse(HOVER_BOOTS))) && CanGetNightTimeGS;}}), - LocationAccess(KF_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_KF_KOKIRI_SWORD_CHEST, {[]{return IsChild;}}), + LocationAccess(RC_KF_GS_KNOW_IT_ALL_HOUSE, {[]{return IsChild && CanChildAttack && AtNight && (HasNightStart || CanLeaveForest || CanPlay(SunsSong)) && CanGetNightTimeGS;}}), + LocationAccess(RC_KF_GS_BEAN_PATCH, {[]{return CanPlantBugs && CanChildAttack;}}), + LocationAccess(RC_KF_GS_HOUSE_OF_TWINS, {[]{return IsAdult && AtNight && (HookshotOrBoomerang || (LogicAdultKokiriGS && CanUse(RG_HOVER_BOOTS))) && CanGetNightTimeGS;}}), + LocationAccess(RC_KF_GOSSIP_STONE, {[]{return true;}}), }, { //Exits - Entrance(KF_LINKS_HOUSE, {[]{return true;}}), - Entrance(KF_MIDOS_HOUSE, {[]{return true;}}), - Entrance(KF_SARIAS_HOUSE, {[]{return true;}}), - Entrance(KF_HOUSE_OF_TWINS, {[]{return true;}}), - Entrance(KF_KNOW_IT_ALL_HOUSE, {[]{return true;}}), - Entrance(KF_KOKIRI_SHOP, {[]{return true;}}), - Entrance(KF_OUTSIDE_DEKU_TREE, {[]{return IsAdult || OpenForest.Is(OPENFOREST_OPEN) || ShowedMidoSwordAndShield;}}), - Entrance(THE_LOST_WOODS, {[]{return true;}}), - Entrance(LW_BRIDGE_FROM_FOREST, {[]{return IsAdult || OpenForest.IsNot(OPENFOREST_CLOSED) || DekuTreeClear;}}), - Entrance(KF_STORMS_GROTTO, {[]{return CanOpenStormGrotto;}}), + Entrance(RR_KF_LINKS_HOUSE, {[]{return true;}}), + Entrance(RR_KF_MIDOS_HOUSE, {[]{return true;}}), + Entrance(RR_KF_SARIAS_HOUSE, {[]{return true;}}), + Entrance(RR_KF_HOUSE_OF_TWINS, {[]{return true;}}), + Entrance(RR_KF_KNOW_IT_ALL_HOUSE, {[]{return true;}}), + Entrance(RR_KF_KOKIRI_SHOP, {[]{return true;}}), + Entrance(RR_KF_OUTSIDE_DEKU_TREE, {[]{return IsAdult || OpenForest.Is(OPENFOREST_OPEN) || ShowedMidoSwordAndShield;}}), + Entrance(RR_THE_LOST_WOODS, {[]{return true;}}), + Entrance(RR_LW_BRIDGE_FROM_FOREST, {[]{return IsAdult || OpenForest.IsNot(OPENFOREST_CLOSED) || DekuTreeClear;}}), + Entrance(RR_KF_STORMS_GROTTO, {[]{return CanOpenStormGrotto;}}), }); - areaTable[KF_OUTSIDE_DEKU_TREE] = Area("KF Outside Deku Tree", "Kokiri Forest", KOKIRI_FOREST, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_KF_OUTSIDE_DEKU_TREE] = Area("KF Outside Deku Tree", "Kokiri Forest", RHT_KOKIRI_FOREST, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || ((IsAdult && ShuffleDungeonEntrances.Is(SHUFFLEDUNGEONS_OFF)) || KokiriSword || Boomerang);}}), - EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || ((IsAdult && ShuffleDungeonEntrances.Is(SHUFFLEDUNGEONS_OFF)) || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(DINS_FIRE));}}), + EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || ((IsAdult && ShuffleDungeonEntrances.Is(SHUFFLEDUNGEONS_OFF)) || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(RG_DINS_FIRE));}}), EventAccess(&ShowedMidoSwordAndShield, {[]{return ShowedMidoSwordAndShield || (IsChild && KokiriSword && DekuShield);}}), }, { //Locations - LocationAccess(KF_DEKU_TREE_GOSSIP_STONE_LEFT, {[]{return true;}}), - LocationAccess(KF_DEKU_TREE_GOSSIP_STONE_RIGHT, {[]{return true;}}), + LocationAccess(RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE, {[]{return true;}}), }, { //Exits - Entrance(DEKU_TREE_ENTRYWAY, {[]{return IsChild || (ShuffleDungeonEntrances.IsNot(SHUFFLEDUNGEONS_OFF) && (OpenForest.Is(OPENFOREST_OPEN) || ShowedMidoSwordAndShield));}}), - Entrance(KOKIRI_FOREST, {[]{return IsAdult || OpenForest.Is(OPENFOREST_OPEN) || ShowedMidoSwordAndShield;}}), + Entrance(RR_DEKU_TREE_ENTRYWAY, {[]{return IsChild || (ShuffleDungeonEntrances.IsNot(SHUFFLEDUNGEONS_OFF) && (OpenForest.Is(OPENFOREST_OPEN) || ShowedMidoSwordAndShield));}}), + Entrance(RR_KOKIRI_FOREST, {[]{return IsAdult || OpenForest.Is(OPENFOREST_OPEN) || ShowedMidoSwordAndShield;}}), }); - areaTable[KF_LINKS_HOUSE] = Area("KF Link's House", "KF Link's House", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KF_LINKS_HOUSE] = Area("KF Link's House", "KF Link's House", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(KF_LINKS_HOUSE_COW, {[]{return IsAdult && CanPlay(EponasSong) && LinksCow;}}), + LocationAccess(RC_KF_LINKS_HOUSE_COW, {[]{return IsAdult && CanPlay(EponasSong) && LinksCow;}}), }, { //Exits - Entrance(KOKIRI_FOREST, {[]{return true;}}) + Entrance(RR_KOKIRI_FOREST, {[]{return true;}}) }); - areaTable[KF_MIDOS_HOUSE] = Area("KF Mido's House", "KF Mido's House", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KF_MIDOS_HOUSE] = Area("KF Mido's House", "KF Mido's House", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(KF_MIDOS_TOP_LEFT_CHEST, {[]{return true;}}), - LocationAccess(KF_MIDOS_TOP_RIGHT_CHEST, {[]{return true;}}), - LocationAccess(KF_MIDOS_BOTTOM_LEFT_CHEST, {[]{return true;}}), - LocationAccess(KF_MIDOS_BOTTOM_RIGHT_CHEST, {[]{return true;}}), + LocationAccess(RC_KF_MIDOS_TOP_LEFT_CHEST, {[]{return true;}}), + LocationAccess(RC_KF_MIDOS_TOP_RIGHT_CHEST, {[]{return true;}}), + LocationAccess(RC_KF_MIDOS_BOTTOM_LEFT_CHEST, {[]{return true;}}), + LocationAccess(RC_KF_MIDOS_BOTTOM_RIGHT_CHEST, {[]{return true;}}), }, { //Exits - Entrance(KOKIRI_FOREST, {[]{return true;}}), + Entrance(RR_KOKIRI_FOREST, {[]{return true;}}), }); - areaTable[KF_SARIAS_HOUSE] = Area("KF Saria's House", "KF Saria's House", NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_KF_SARIAS_HOUSE] = Area("KF Saria's House", "KF Saria's House", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(KOKIRI_FOREST, {[]{return true;}}), + Entrance(RR_KOKIRI_FOREST, {[]{return true;}}), }); - areaTable[KF_HOUSE_OF_TWINS] = Area("KF House of Twins", "KF House of Twins", NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_KF_HOUSE_OF_TWINS] = Area("KF House of Twins", "KF House of Twins", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(KOKIRI_FOREST, {[]{return true;}}), + Entrance(RR_KOKIRI_FOREST, {[]{return true;}}), }); - areaTable[KF_KNOW_IT_ALL_HOUSE] = Area("KF Know It All House", "KF Know It All House", NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_KF_KNOW_IT_ALL_HOUSE] = Area("KF Know It All House", "KF Know It All House", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(KOKIRI_FOREST, {[]{return true;}}), + Entrance(RR_KOKIRI_FOREST, {[]{return true;}}), }); - areaTable[KF_KOKIRI_SHOP] = Area("KF Kokiri Shop", "KF Kokiri Shop", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KF_KOKIRI_SHOP] = Area("KF Kokiri Shop", "KF Kokiri Shop", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(KF_SHOP_ITEM_1, {[]{return true;}}), - LocationAccess(KF_SHOP_ITEM_2, {[]{return true;}}), - LocationAccess(KF_SHOP_ITEM_3, {[]{return true;}}), - LocationAccess(KF_SHOP_ITEM_4, {[]{return true;}}), - LocationAccess(KF_SHOP_ITEM_5, {[]{return true;}}), - LocationAccess(KF_SHOP_ITEM_6, {[]{return true;}}), - LocationAccess(KF_SHOP_ITEM_7, {[]{return true;}}), - LocationAccess(KF_SHOP_ITEM_8, {[]{return true;}}), + LocationAccess(RC_KF_SHOP_ITEM_1, {[]{return true;}}), + LocationAccess(RC_KF_SHOP_ITEM_2, {[]{return true;}}), + LocationAccess(RC_KF_SHOP_ITEM_3, {[]{return true;}}), + LocationAccess(RC_KF_SHOP_ITEM_4, {[]{return true;}}), + LocationAccess(RC_KF_SHOP_ITEM_5, {[]{return true;}}), + LocationAccess(RC_KF_SHOP_ITEM_6, {[]{return true;}}), + LocationAccess(RC_KF_SHOP_ITEM_7, {[]{return true;}}), + LocationAccess(RC_KF_SHOP_ITEM_8, {[]{return true;}}), }, { //Exits - Entrance(KOKIRI_FOREST, {[]{return true;}}), + Entrance(RR_KOKIRI_FOREST, {[]{return true;}}), }); - areaTable[KF_STORMS_GROTTO] = Area("KF Storms Grotto", "KF Storms Grotto", NONE, NO_DAY_NIGHT_CYCLE, grottoEvents, { + areaTable[RR_KF_STORMS_GROTTO] = Area("KF Storms Grotto", "KF Storms Grotto", RHT_NONE, NO_DAY_NIGHT_CYCLE, grottoEvents, { //Locations - LocationAccess(KF_STORMS_GROTTO_CHEST, {[]{return true;}}), - LocationAccess(KF_STORMS_GROTTO_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_KF_STORMS_GROTTO_CHEST, {[]{return true;}}), + LocationAccess(RC_KF_STORMS_GOSSIP_STONE, {[]{return true;}}), }, { //Exits - Entrance(KOKIRI_FOREST, {[]{return true;}}) + Entrance(RR_KOKIRI_FOREST, {[]{return true;}}) }); - areaTable[LW_FOREST_EXIT] = Area("LW Forest Exit", "Lost Woods", NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_LW_FOREST_EXIT] = Area("LW Forest Exit", "Lost Woods", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(KOKIRI_FOREST, {[]{return true;}}) + Entrance(RR_KOKIRI_FOREST, {[]{return true;}}) }); - areaTable[THE_LOST_WOODS] = Area("Lost Woods", "Lost Woods", THE_LOST_WOODS, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_THE_LOST_WOODS] = Area("Lost Woods", "Lost Woods", RHT_THE_LOST_WOODS, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&OddMushroomAccess, {[]{return OddMushroomAccess || (IsAdult && (CojiroAccess || Cojiro));}}), EventAccess(&PoachersSawAccess, {[]{return PoachersSawAccess || (IsAdult && OddPoulticeAccess);}}), @@ -119,132 +119,132 @@ void AreaTable_Init_LostWoods() { EventAccess(&BugShrub, {[]{return IsChild && CanCutShrubs;}}), }, { //Locations - LocationAccess(LW_SKULL_KID, {[]{return IsChild && CanPlay(SariasSong);}}), - LocationAccess(LW_TRADE_COJIRO, {[]{return IsAdult && Cojiro;}}), - LocationAccess(LW_TRADE_ODD_POTION, {[]{return IsAdult && OddPoultice && Cojiro;}}), - LocationAccess(LW_OCARINA_MEMORY_GAME, {[]{return IsChild && Ocarina;}}), - LocationAccess(LW_TARGET_IN_WOODS, {[]{return IsChild && CanUse(SLINGSHOT);}}), - LocationAccess(LW_DEKU_SCRUB_NEAR_BRIDGE, {[]{return IsChild && CanStunDeku;}}), - LocationAccess(LW_GS_BEAN_PATCH_NEAR_BRIDGE, {[]{return CanPlantBugs && CanChildAttack;}}), - LocationAccess(LW_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_LW_SKULL_KID, {[]{return IsChild && CanPlay(SariasSong);}}), + LocationAccess(RC_LW_TRADE_COJIRO, {[]{return IsAdult && Cojiro;}}), + LocationAccess(RC_LW_TRADE_ODD_POTION, {[]{return IsAdult && OddPoultice && Cojiro;}}), + LocationAccess(RC_LW_OCARINA_MEMORY_GAME, {[]{return IsChild && Ocarina;}}), + LocationAccess(RC_LW_TARGET_IN_WOODS, {[]{return IsChild && CanUse(RG_FAIRY_SLINGSHOT);}}), + LocationAccess(RC_LW_DEKU_SCRUB_NEAR_BRIDGE, {[]{return IsChild && CanStunDeku;}}), + LocationAccess(RC_LW_GS_BEAN_PATCH_NEAR_BRIDGE, {[]{return CanPlantBugs && CanChildAttack;}}), + LocationAccess(RC_LW_GOSSIP_STONE, {[]{return true;}}), }, { //Exits - Entrance(LW_FOREST_EXIT, {[]{return true;}}), - Entrance(GC_WOODS_WARP, {[]{return true;}}), - Entrance(LW_BRIDGE, {[]{return CanLeaveForest && ((IsAdult && (CanPlantBean(THE_LOST_WOODS) || LogicLostWoodsBridge)) || CanUse(HOVER_BOOTS) || CanUse(LONGSHOT));}}), - Entrance(ZORAS_RIVER, {[]{return CanLeaveForest && (CanDive || CanUse(IRON_BOOTS));}}), - Entrance(LW_BEYOND_MIDO, {[]{return IsChild || CanPlay(SariasSong) || LogicMidoBackflip;}}), - Entrance(LW_NEAR_SHORTCUTS_GROTTO, {[]{return Here(THE_LOST_WOODS, []{return CanBlastOrSmash;});}}), + Entrance(RR_LW_FOREST_EXIT, {[]{return true;}}), + Entrance(RR_GC_WOODS_WARP, {[]{return true;}}), + Entrance(RR_LW_BRIDGE, {[]{return CanLeaveForest && ((IsAdult && (CanPlantBean(RR_THE_LOST_WOODS) || LogicLostWoodsBridge)) || CanUse(RG_HOVER_BOOTS) || CanUse(RG_LONGSHOT));}}), + Entrance(RR_ZORAS_RIVER, {[]{return CanLeaveForest && (CanDive || CanUse(RG_IRON_BOOTS));}}), + Entrance(RR_LW_BEYOND_MIDO, {[]{return IsChild || CanPlay(SariasSong) || LogicMidoBackflip;}}), + Entrance(RR_LW_NEAR_SHORTCUTS_GROTTO, {[]{return Here(RR_THE_LOST_WOODS, []{return CanBlastOrSmash;});}}), }); - areaTable[LW_BEYOND_MIDO] = Area("LW Beyond Mido", "Lost Woods", THE_LOST_WOODS, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_LW_BEYOND_MIDO] = Area("LW Beyond Mido", "Lost Woods", RHT_THE_LOST_WOODS, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&ButterflyFairy, {[]{return ButterflyFairy || CanUse(STICKS);}}), + EventAccess(&ButterflyFairy, {[]{return ButterflyFairy || CanUse(RG_STICKS);}}), }, { //Locations - LocationAccess(LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, {[]{return IsChild && CanStunDeku;}}), - LocationAccess(LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, {[]{return IsChild && CanStunDeku;}}), - LocationAccess(LW_GS_ABOVE_THEATER, {[]{return IsAdult && AtNight && (CanPlantBean(LW_BEYOND_MIDO) || (LogicLostWoodsGSBean && CanUse(HOOKSHOT) && (CanUse(LONGSHOT) || CanUse(BOW) || CanUse(SLINGSHOT) || HasBombchus || CanUse(DINS_FIRE)))) && CanGetNightTimeGS;}}), - LocationAccess(LW_GS_BEAN_PATCH_NEAR_THEATER, {[]{return CanPlantBugs && (CanChildAttack || (Scrubsanity.Is(SCRUBSANITY_OFF) && DekuShield));}}), + LocationAccess(RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, {[]{return IsChild && CanStunDeku;}}), + LocationAccess(RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, {[]{return IsChild && CanStunDeku;}}), + LocationAccess(RC_LW_GS_ABOVE_THEATER, {[]{return IsAdult && AtNight && (CanPlantBean(RR_LW_BEYOND_MIDO) || (LogicLostWoodsGSBean && CanUse(RG_HOOKSHOT) && (CanUse(RG_LONGSHOT) || CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT) || HasBombchus || CanUse(RG_DINS_FIRE)))) && CanGetNightTimeGS;}}), + LocationAccess(RC_LW_GS_BEAN_PATCH_NEAR_THEATER, {[]{return CanPlantBugs && (CanChildAttack || (Scrubsanity.Is(SCRUBSANITY_OFF) && DekuShield));}}), }, { //Exits - Entrance(LW_FOREST_EXIT, {[]{return true;}}), - Entrance(THE_LOST_WOODS, {[]{return IsChild || CanPlay(SariasSong);}}), - Entrance(SFM_ENTRYWAY, {[]{return true;}}), - Entrance(DEKU_THEATER, {[]{return true;}}), - Entrance(LW_SCRUBS_GROTTO, {[]{return Here(LW_BEYOND_MIDO, []{return CanBlastOrSmash;});}}), + Entrance(RR_LW_FOREST_EXIT, {[]{return true;}}), + Entrance(RR_THE_LOST_WOODS, {[]{return IsChild || CanPlay(SariasSong);}}), + Entrance(RR_SFM_ENTRYWAY, {[]{return true;}}), + Entrance(RR_DEKU_THEATER, {[]{return true;}}), + Entrance(RR_LW_SCRUBS_GROTTO, {[]{return Here(RR_LW_BEYOND_MIDO, []{return CanBlastOrSmash;});}}), }); - areaTable[LW_NEAR_SHORTCUTS_GROTTO] = Area("LW Near Shortcuts Grotto", "LW Near Shortcuts Grotto", NONE, NO_DAY_NIGHT_CYCLE, grottoEvents, { + areaTable[RR_LW_NEAR_SHORTCUTS_GROTTO] = Area("LW Near Shortcuts Grotto", "LW Near Shortcuts Grotto", RHT_NONE, NO_DAY_NIGHT_CYCLE, grottoEvents, { //Locations - LocationAccess(LW_NEAR_SHORTCUTS_GROTTO_CHEST, {[]{return true;}}), - LocationAccess(LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_LW_NEAR_SHORTCUTS_GROTTO_CHEST, {[]{return true;}}), + LocationAccess(RC_LW_NEAR_SHORTCUTS_GOSSIP_STONE, {[]{return true;}}), }, { //Exits - Entrance(THE_LOST_WOODS, {[]{return true;}}), + Entrance(RR_THE_LOST_WOODS, {[]{return true;}}), }); - areaTable[DEKU_THEATER] = Area("Deku Theater", "Deku Theater", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DEKU_THEATER] = Area("Deku Theater", "Deku Theater", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(DEKU_THEATER_SKULL_MASK, {[]{return IsChild && SkullMask;}}), - LocationAccess(DEKU_THEATER_MASK_OF_TRUTH, {[]{return IsChild && MaskOfTruth;}}), + LocationAccess(RC_DEKU_THEATER_SKULL_MASK, {[]{return IsChild && SkullMask;}}), + LocationAccess(RC_DEKU_THEATER_MASK_OF_TRUTH, {[]{return IsChild && MaskOfTruth;}}), }, { //Exits - Entrance(LW_BEYOND_MIDO, {[]{return true;}}), + Entrance(RR_LW_BEYOND_MIDO, {[]{return true;}}), }); - areaTable[LW_SCRUBS_GROTTO] = Area("LW Scrubs Grotto", "LW Scrubs Grotto", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_LW_SCRUBS_GROTTO] = Area("LW Scrubs Grotto", "LW Scrubs Grotto", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(LW_DEKU_SCRUB_GROTTO_REAR, {[]{return CanStunDeku;}}), - LocationAccess(LW_DEKU_SCRUB_GROTTO_FRONT, {[]{return CanStunDeku;}}), + LocationAccess(RC_LW_DEKU_SCRUB_GROTTO_REAR, {[]{return CanStunDeku;}}), + LocationAccess(RC_LW_DEKU_SCRUB_GROTTO_FRONT, {[]{return CanStunDeku;}}), }, { //Exits - Entrance(LW_BEYOND_MIDO, {[]{return true;}}), + Entrance(RR_LW_BEYOND_MIDO, {[]{return true;}}), }); - areaTable[SFM_ENTRYWAY] = Area("SFM Entryway", "Sacred Forest Meadow", SACRED_FOREST_MEADOW, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SFM_ENTRYWAY] = Area("SFM Entryway", "Sacred Forest Meadow", RHT_SACRED_FOREST_MEADOW, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(LW_BEYOND_MIDO, {[]{return true;}}), - Entrance(SACRED_FOREST_MEADOW, {[]{return IsAdult || Slingshot || Sticks || KokiriSword || CanUse(DINS_FIRE) || CanUse(MEGATON_HAMMER) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD);}}), - Entrance(SFM_WOLFOS_GROTTO, {[]{return CanOpenBombGrotto;}}), + Entrance(RR_LW_BEYOND_MIDO, {[]{return true;}}), + Entrance(RR_SACRED_FOREST_MEADOW, {[]{return IsAdult || Slingshot || Sticks || KokiriSword || CanUse(RG_DINS_FIRE) || CanUse(RG_MEGATON_HAMMER) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD);}}), + Entrance(RR_SFM_WOLFOS_GROTTO, {[]{return CanOpenBombGrotto;}}), }); - areaTable[SACRED_FOREST_MEADOW] = Area("Sacred Forest Meadow", "Sacred Forest Meadow", SACRED_FOREST_MEADOW, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SACRED_FOREST_MEADOW] = Area("Sacred Forest Meadow", "Sacred Forest Meadow", RHT_SACRED_FOREST_MEADOW, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&GossipStoneFairy, {[]{return GossipStoneFairy || CanSummonGossipFairyWithoutSuns;}}), }, { //Locations - LocationAccess(SONG_FROM_SARIA, {[]{return IsChild && ZeldasLetter;}}), - LocationAccess(SHEIK_IN_FOREST, {[]{return IsAdult;}}), - LocationAccess(SFM_GS, {[]{return IsAdult && HookshotOrBoomerang && AtNight && CanGetNightTimeGS;}}), - LocationAccess(SFM_MAZE_GOSSIP_STONE_LOWER, {[]{return true;}}), - LocationAccess(SFM_MAZE_GOSSIP_STONE_UPPER, {[]{return true;}}), - LocationAccess(SFM_SARIA_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_SONG_FROM_SARIA, {[]{return IsChild && ZeldasLetter;}}), + LocationAccess(RC_SHEIK_IN_FOREST, {[]{return IsAdult;}}), + LocationAccess(RC_SFM_GS, {[]{return IsAdult && HookshotOrBoomerang && AtNight && CanGetNightTimeGS;}}), + LocationAccess(RC_SFM_MAZE_LOWER_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_SFM_MAZE_UPPER_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_SFM_SARIA_GOSSIP_STONE, {[]{return true;}}), }, { //Exits - Entrance(SFM_ENTRYWAY, {[]{return true;}}), - Entrance(FOREST_TEMPLE_ENTRYWAY, {[]{return CanUse(HOOKSHOT);}}), - Entrance(SFM_FAIRY_GROTTO, {[]{return true;}}), - Entrance(SFM_STORMS_GROTTO, {[]{return CanOpenStormGrotto;}}), + Entrance(RR_SFM_ENTRYWAY, {[]{return true;}}), + Entrance(RR_FOREST_TEMPLE_ENTRYWAY, {[]{return CanUse(RG_HOOKSHOT);}}), + Entrance(RR_SFM_FAIRY_GROTTO, {[]{return true;}}), + Entrance(RR_SFM_STORMS_GROTTO, {[]{return CanOpenStormGrotto;}}), }); - areaTable[SFM_FAIRY_GROTTO] = Area("SFM Fairy Grotto", "SFM Fairy Grotto", NONE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SFM_FAIRY_GROTTO] = Area("SFM Fairy Grotto", "SFM Fairy Grotto", RHT_NONE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&FreeFairies, {[]{return true;}}), }, {}, { //Exits - Entrance(SACRED_FOREST_MEADOW, {[]{return true;}}), + Entrance(RR_SACRED_FOREST_MEADOW, {[]{return true;}}), }); - areaTable[SFM_WOLFOS_GROTTO] = Area("SFM Wolfos Grotto", "SFM Wolfos Grotto", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SFM_WOLFOS_GROTTO] = Area("SFM Wolfos Grotto", "SFM Wolfos Grotto", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(SFM_WOLFOS_GROTTO_CHEST, {[]{return IsAdult || Slingshot || Sticks || KokiriSword || CanUse(DINS_FIRE) || CanUse(MEGATON_HAMMER) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD);}}), + LocationAccess(RC_SFM_WOLFOS_GROTTO_CHEST, {[]{return IsAdult || Slingshot || Sticks || KokiriSword || CanUse(RG_DINS_FIRE) || CanUse(RG_MEGATON_HAMMER) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD);}}), }, { //Exits - Entrance(SFM_ENTRYWAY, {[]{return true;}}), + Entrance(RR_SFM_ENTRYWAY, {[]{return true;}}), }); - areaTable[SFM_STORMS_GROTTO] = Area("SFM Storms Grotto", "SFM Storms Grotto", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SFM_STORMS_GROTTO] = Area("SFM Storms Grotto", "SFM Storms Grotto", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(SFM_DEKU_SCRUB_GROTTO_REAR, {[]{return CanStunDeku;}}), - LocationAccess(SFM_DEKU_SCRUB_GROTTO_FRONT, {[]{return CanStunDeku;}}), + LocationAccess(RC_SFM_DEKU_SCRUB_GROTTO_REAR, {[]{return CanStunDeku;}}), + LocationAccess(RC_SFM_DEKU_SCRUB_GROTTO_FRONT, {[]{return CanStunDeku;}}), }, { //Exits - Entrance(SACRED_FOREST_MEADOW, {[]{return true;}}), + Entrance(RR_SACRED_FOREST_MEADOW, {[]{return true;}}), }); - areaTable[LW_BRIDGE_FROM_FOREST] = Area("LW Bridge From Forest", "Lost Woods", THE_LOST_WOODS, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_LW_BRIDGE_FROM_FOREST] = Area("LW Bridge From Forest", "Lost Woods", RHT_THE_LOST_WOODS, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(LW_GIFT_FROM_SARIA, {[]{return true;}}), + LocationAccess(RC_LW_GIFT_FROM_SARIA, {[]{return true;}}), }, { //Exits - Entrance(LW_BRIDGE, {[]{return true;}}), + Entrance(RR_LW_BRIDGE, {[]{return true;}}), }); - areaTable[LW_BRIDGE] = Area("LW Bridge", "Lost Woods", THE_LOST_WOODS, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_LW_BRIDGE] = Area("LW Bridge", "Lost Woods", RHT_THE_LOST_WOODS, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(KOKIRI_FOREST, {[]{return true;}}), - Entrance(HYRULE_FIELD, {[]{return true;}}), - Entrance(THE_LOST_WOODS, {[]{return CanUse(LONGSHOT);}}), + Entrance(RR_KOKIRI_FOREST, {[]{return true;}}), + Entrance(RR_HYRULE_FIELD, {[]{return true;}}), + Entrance(RR_THE_LOST_WOODS, {[]{return CanUse(RG_LONGSHOT);}}), }); } 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 5296a6398..707b2048b 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 @@ -10,81 +10,81 @@ void AreaTable_Init_ShadowTemple() { /*-------------------------- | VANILLA/MQ DECIDER | ---------------------------*/ - areaTable[SHADOW_TEMPLE_ENTRYWAY] = Area("Shadow Temple Entryway", "Shadow Temple", SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SHADOW_TEMPLE_ENTRYWAY] = Area("Shadow Temple Entryway", "Shadow Temple", RHT_SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(SHADOW_TEMPLE_BEGINNING, {[]{return Dungeon::ShadowTemple.IsVanilla() && (LogicLensShadow || CanUse(LENS_OF_TRUTH)) && (CanUse(HOVER_BOOTS) || CanUse(HOOKSHOT));}}), - Entrance(SHADOW_TEMPLE_MQ_BEGINNING, {[]{return Dungeon::ShadowTemple.IsMQ() && (LogicLensShadowMQ || CanUse(LENS_OF_TRUTH)) && (CanUse(HOVER_BOOTS) || CanUse(HOOKSHOT));}}), - Entrance(GRAVEYARD_WARP_PAD_REGION, {[]{return true;}}), + Entrance(RR_SHADOW_TEMPLE_BEGINNING, {[]{return Dungeon::ShadowTemple.IsVanilla() && (LogicLensShadow || CanUse(RG_LENS_OF_TRUTH)) && (CanUse(RG_HOVER_BOOTS) || CanUse(RG_HOOKSHOT));}}), + Entrance(RR_SHADOW_TEMPLE_MQ_BEGINNING, {[]{return Dungeon::ShadowTemple.IsMQ() && (LogicLensShadowMQ || CanUse(RG_LENS_OF_TRUTH)) && (CanUse(RG_HOVER_BOOTS) || CanUse(RG_HOOKSHOT));}}), + Entrance(RR_GRAVEYARD_WARP_PAD_REGION, {[]{return true;}}), }); /*-------------------------- | VANILLA DUNGEON | ---------------------------*/ if (Dungeon::ShadowTemple.IsVanilla()) { - areaTable[SHADOW_TEMPLE_BEGINNING] = Area("Shadow Temple Beginning", "Shadow Temple", SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SHADOW_TEMPLE_BEGINNING] = Area("Shadow Temple Beginning", "Shadow Temple", RHT_SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&NutPot, {[]{return true;}}), }, { //Locations - LocationAccess(SHADOW_TEMPLE_MAP_CHEST, {[]{return true;}}), - LocationAccess(SHADOW_TEMPLE_HOVER_BOOTS_CHEST, {[]{return true;}}), + LocationAccess(RC_SHADOW_TEMPLE_MAP_CHEST, {[]{return true;}}), + LocationAccess(RC_SHADOW_TEMPLE_HOVER_BOOTS_CHEST, {[]{return true;}}), }, { //Exits - Entrance(SHADOW_TEMPLE_ENTRYWAY, {[]{return true;}}), - Entrance(SHADOW_TEMPLE_FIRST_BEAMOS, {[]{return HoverBoots;}}), + Entrance(RR_SHADOW_TEMPLE_ENTRYWAY, {[]{return true;}}), + Entrance(RR_SHADOW_TEMPLE_FIRST_BEAMOS, {[]{return HoverBoots;}}), }); - areaTable[SHADOW_TEMPLE_FIRST_BEAMOS] = Area("Shadow Temple First Beamos", "Shadow Temple", SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SHADOW_TEMPLE_FIRST_BEAMOS] = Area("Shadow Temple First Beamos", "Shadow Temple", RHT_SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&FairyPot, {[]{return true;}}), //This fairy pot is only on 3DS }, { //Locations - LocationAccess(SHADOW_TEMPLE_COMPASS_CHEST, {[]{return IsAdult || KokiriSword || Sticks;}}), - LocationAccess(SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, {[]{return CanUse(HOVER_BOOTS) || CanUse(HOOKSHOT);}}), - LocationAccess(SHADOW_TEMPLE_GS_NEAR_SHIP, {[]{return false;}}), + LocationAccess(RC_SHADOW_TEMPLE_COMPASS_CHEST, {[]{return IsAdult || KokiriSword || Sticks;}}), + LocationAccess(RC_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, {[]{return CanUse(RG_HOVER_BOOTS) || CanUse(RG_HOOKSHOT);}}), + LocationAccess(RC_SHADOW_TEMPLE_GS_NEAR_SHIP, {[]{return false;}}), }, { //Exits - Entrance(SHADOW_TEMPLE_HUGE_PIT, {[]{return HasExplosives && IsAdult && SmallKeys(SHADOW_TEMPLE, 1, 2);}}), - Entrance(SHADOW_TEMPLE_BEYOND_BOAT, {[]{return false;}}), + Entrance(RR_SHADOW_TEMPLE_HUGE_PIT, {[]{return HasExplosives && IsAdult && SmallKeys(RR_SHADOW_TEMPLE, 1, 2);}}), + Entrance(RR_SHADOW_TEMPLE_BEYOND_BOAT, {[]{return false;}}), }); - areaTable[SHADOW_TEMPLE_HUGE_PIT] = Area("Shadow Temple Huge Pit", "Shadow Temple", SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_HUGE_PIT] = Area("Shadow Temple Huge Pit", "Shadow Temple", RHT_SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, {[]{return true;}}), - LocationAccess(SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, {[]{return true;}}), - LocationAccess(SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST, {[]{return true;}}), - LocationAccess(SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST, {[]{return (LogicShadowUmbrella && HoverBoots) || GoronBracelet;}}), - LocationAccess(SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST, {[]{return (LogicShadowUmbrella && HoverBoots) || GoronBracelet;}}), - LocationAccess(SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST, {[]{return SmallKeys(SHADOW_TEMPLE, 2, 3) && ((LogicLensShadowPlatform && LogicLensShadow) || CanUse(LENS_OF_TRUTH));}}), - LocationAccess(SHADOW_TEMPLE_FREESTANDING_KEY, {[]{return SmallKeys(SHADOW_TEMPLE, 2, 3) && ((LogicLensShadowPlatform && LogicLensShadow) || CanUse(LENS_OF_TRUTH)) && Hookshot && (Bombs || GoronBracelet || (LogicShadowFreestandingKey && HasBombchus));}}), - LocationAccess(SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, {[]{return true;}}), - LocationAccess(SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, {[]{return Hookshot || (LogicShadowUmbrellaGS && HoverBoots);}}), - LocationAccess(SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, {[]{return SmallKeys(SHADOW_TEMPLE, 2, 3) && ((LogicLensShadowPlatform && LogicLensShadow) || CanUse(LENS_OF_TRUTH)) && Hookshot;}}), + LocationAccess(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, {[]{return true;}}), + LocationAccess(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, {[]{return true;}}), + LocationAccess(RC_SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST, {[]{return true;}}), + LocationAccess(RC_SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST, {[]{return (LogicShadowUmbrella && HoverBoots) || GoronBracelet;}}), + LocationAccess(RC_SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST, {[]{return (LogicShadowUmbrella && HoverBoots) || GoronBracelet;}}), + LocationAccess(RC_SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST, {[]{return SmallKeys(RR_SHADOW_TEMPLE, 2, 3) && ((LogicLensShadowPlatform && LogicLensShadow) || CanUse(RG_LENS_OF_TRUTH));}}), + LocationAccess(RC_SHADOW_TEMPLE_FREESTANDING_KEY, {[]{return SmallKeys(RR_SHADOW_TEMPLE, 2, 3) && ((LogicLensShadowPlatform && LogicLensShadow) || CanUse(RG_LENS_OF_TRUTH)) && Hookshot && (Bombs || GoronBracelet || (LogicShadowFreestandingKey && HasBombchus));}}), + LocationAccess(RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, {[]{return true;}}), + LocationAccess(RC_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, {[]{return Hookshot || (LogicShadowUmbrellaGS && HoverBoots);}}), + LocationAccess(RC_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, {[]{return SmallKeys(RR_SHADOW_TEMPLE, 2, 3) && ((LogicLensShadowPlatform && LogicLensShadow) || CanUse(RG_LENS_OF_TRUTH)) && Hookshot;}}), }, { //Exits - Entrance(SHADOW_TEMPLE_WIND_TUNNEL, {[]{return ((LogicLensShadowPlatform && LogicLensShadow) || CanUse(LENS_OF_TRUTH)) && Hookshot && SmallKeys(SHADOW_TEMPLE, 3, 4);}}), + Entrance(RR_SHADOW_TEMPLE_WIND_TUNNEL, {[]{return ((LogicLensShadowPlatform && LogicLensShadow) || CanUse(RG_LENS_OF_TRUTH)) && Hookshot && SmallKeys(RR_SHADOW_TEMPLE, 3, 4);}}), }); - areaTable[SHADOW_TEMPLE_WIND_TUNNEL] = Area("Shadow Temple Wind Tunnel", "Shadow Temple", SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_WIND_TUNNEL] = Area("Shadow Temple Wind Tunnel", "Shadow Temple", RHT_SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(SHADOW_TEMPLE_WIND_HINT_CHEST, {[]{return true;}}), - LocationAccess(SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, {[]{return true;}}), - LocationAccess(SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, {[]{return true;}}), - LocationAccess(SHADOW_TEMPLE_GS_NEAR_SHIP, {[]{return CanUse(LONGSHOT) && SmallKeys(SHADOW_TEMPLE, 4, 5);}}), + LocationAccess(RC_SHADOW_TEMPLE_WIND_HINT_CHEST, {[]{return true;}}), + LocationAccess(RC_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, {[]{return true;}}), + LocationAccess(RC_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, {[]{return true;}}), + LocationAccess(RC_SHADOW_TEMPLE_GS_NEAR_SHIP, {[]{return CanUse(RG_LONGSHOT) && SmallKeys(RR_SHADOW_TEMPLE, 4, 5);}}), }, { //Exits - Entrance(SHADOW_TEMPLE_BEYOND_BOAT, {[]{return CanPlay(ZeldasLullaby) && SmallKeys(SHADOW_TEMPLE, 4, 5);}}), + Entrance(RR_SHADOW_TEMPLE_BEYOND_BOAT, {[]{return CanPlay(ZeldasLullaby) && SmallKeys(RR_SHADOW_TEMPLE, 4, 5);}}), }); - areaTable[SHADOW_TEMPLE_BEYOND_BOAT] = Area("Shadow Temple Beyond Boat", "Shadow Temple", SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_BEYOND_BOAT] = Area("Shadow Temple Beyond Boat", "Shadow Temple", RHT_SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, {[]{return CanUse(DINS_FIRE);}}), - LocationAccess(SHADOW_TEMPLE_BOSS_KEY_CHEST, {[]{return CanUse(DINS_FIRE);}}), - LocationAccess(SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, {[]{return true;}}), - LocationAccess(SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, {[]{return true;}}), + LocationAccess(RC_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, {[]{return CanUse(RG_DINS_FIRE);}}), + LocationAccess(RC_SHADOW_TEMPLE_BOSS_KEY_CHEST, {[]{return CanUse(RG_DINS_FIRE);}}), + LocationAccess(RC_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, {[]{return true;}}), + LocationAccess(RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, {[]{return true;}}), }, { //Exits - Entrance(SHADOW_TEMPLE_BOSS_ENTRYWAY, {[]{return (CanUse(BOW) || CanUse(DISTANT_SCARECROW) || (LogicShadowStatue && HasBombchus)) && SmallKeys(SHADOW_TEMPLE, 5) && CanUse(HOVER_BOOTS) && BossKeyShadowTemple;}}) + Entrance(RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, {[]{return (CanUse(RG_FAIRY_BOW) || CanUse(RG_DISTANT_SCARECROW) || (LogicShadowStatue && HasBombchus)) && SmallKeys(RR_SHADOW_TEMPLE, 5) && CanUse(RG_HOVER_BOOTS) && BossKeyShadowTemple;}}) }); } @@ -92,121 +92,121 @@ void AreaTable_Init_ShadowTemple() { | MASTER QUEST DUNGEON | ---------------------------*/ if (Dungeon::ShadowTemple.IsMQ()) { - areaTable[SHADOW_TEMPLE_MQ_BEGINNING] = Area("Shadow Temple MQ Beginning", "Shadow Temple", SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_BEGINNING] = Area("Shadow Temple MQ Beginning", "Shadow Temple", RHT_SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(SHADOW_TEMPLE_ENTRYWAY, {[]{return true;}}), - Entrance(SHADOW_TEMPLE_MQ_FIRST_BEAMOS, {[]{return IsAdult && (CanUse(FIRE_ARROWS) || HoverBoots || (LogicShadowMQGap && CanUse(LONGSHOT)));}}), - //Trick: IsAdult && (CanUse(FIRE_ARROWS) || HoverBoots || (LogicShadowMQGap && CanUse(LONGSHOT))) - Entrance(SHADOW_TEMPLE_MQ_DEAD_HAND_AREA, {[]{return HasExplosives && SmallKeys(SHADOW_TEMPLE, 6);}}), + Entrance(RR_SHADOW_TEMPLE_ENTRYWAY, {[]{return true;}}), + Entrance(RR_SHADOW_TEMPLE_MQ_FIRST_BEAMOS, {[]{return IsAdult && (CanUse(RG_FIRE_ARROWS) || HoverBoots || (LogicShadowMQGap && CanUse(RG_LONGSHOT)));}}), + //Trick: IsAdult && (CanUse(RG_FIRE_ARROWS) || HoverBoots || (LogicShadowMQGap && CanUse(RG_LONGSHOT))) + Entrance(RR_SHADOW_TEMPLE_MQ_DEAD_HAND_AREA, {[]{return HasExplosives && SmallKeys(RR_SHADOW_TEMPLE, 6);}}), }); - areaTable[SHADOW_TEMPLE_MQ_DEAD_HAND_AREA] = Area("Shadow Temple MQ Dead Hand Area", "Shadow Temple", SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_DEAD_HAND_AREA] = Area("Shadow Temple MQ Dead Hand Area", "Shadow Temple", RHT_SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(SHADOW_TEMPLE_MQ_COMPASS_CHEST, {[]{return true;}}), - LocationAccess(SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST, {[]{return CanPlay(SongOfTime) && IsAdult && CanUse(BOW);}}), + LocationAccess(RC_SHADOW_TEMPLE_MQ_COMPASS_CHEST, {[]{return true;}}), + LocationAccess(RC_SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST, {[]{return CanPlay(SongOfTime) && IsAdult && CanUse(RG_FAIRY_BOW);}}), }, {}); - areaTable[SHADOW_TEMPLE_MQ_FIRST_BEAMOS] = Area("Shadow Temple MQ First Beamos", "Shadow Temple", SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_FIRST_BEAMOS] = Area("Shadow Temple MQ First Beamos", "Shadow Temple", RHT_SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(SHADOW_TEMPLE_MQ_MAP_CHEST, {[]{return true;}}), - LocationAccess(SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, {[]{return true;}}), - LocationAccess(SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, {[]{return true;}}), + LocationAccess(RC_SHADOW_TEMPLE_MQ_MAP_CHEST, {[]{return true;}}), + LocationAccess(RC_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, {[]{return true;}}), + LocationAccess(RC_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, {[]{return true;}}), }, { //Exits - Entrance(SHADOW_TEMPLE_MQ_UPPER_HUGE_PIT, {[]{return HasExplosives && SmallKeys(SHADOW_TEMPLE, 2);}}), + Entrance(RR_SHADOW_TEMPLE_MQ_UPPER_HUGE_PIT, {[]{return HasExplosives && SmallKeys(RR_SHADOW_TEMPLE, 2);}}), }); - areaTable[SHADOW_TEMPLE_MQ_UPPER_HUGE_PIT] = Area("Shadow Temple MQ Upper Huge Pit", "Shadow Temple", SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_UPPER_HUGE_PIT] = Area("Shadow Temple MQ Upper Huge Pit", "Shadow Temple", RHT_SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST, {[]{return CanPlay(SongOfTime) || (LogicShadowMQInvisibleBlades && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_OHKO));}}), + LocationAccess(RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST, {[]{return CanPlay(SongOfTime) || (LogicShadowMQInvisibleBlades && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_OHKO));}}), //Trick: CanPlay(SongOfTime) || (LogicShadowMQInvisibleBlades && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_OHKO)) - LocationAccess(SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST, {[]{return CanPlay(SongOfTime) || (LogicShadowMQInvisibleBlades && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_OHKO));}}), + LocationAccess(RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST, {[]{return CanPlay(SongOfTime) || (LogicShadowMQInvisibleBlades && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_OHKO));}}), //Trick: CanPlay(SongOfTime) || (LogicShadowMQInvisibleBlades && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_OHKO)) }, { //Exits - Entrance(SHADOW_TEMPLE_MQ_LOWER_HUGE_PIT, {[]{return HasFireSource || LogicShadowMQHugePit;}}), + Entrance(RR_SHADOW_TEMPLE_MQ_LOWER_HUGE_PIT, {[]{return HasFireSource || LogicShadowMQHugePit;}}), //Trick: HasFireSource || LogicShadowMQHugePit }); - areaTable[SHADOW_TEMPLE_MQ_LOWER_HUGE_PIT] = Area("Shadow Temple MQ Lower Huge Pit", "Shadow Temple", SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_LOWER_HUGE_PIT] = Area("Shadow Temple MQ Lower Huge Pit", "Shadow Temple", RHT_SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, {[]{return IsAdult && CanUse(LONGSHOT);}}), - LocationAccess(SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST, {[]{return true;}}), - LocationAccess(SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST, {[]{return (LogicShadowUmbrella && HoverBoots) || GoronBracelet;}}), - LocationAccess(SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST, {[]{return (LogicShadowUmbrella && HoverBoots) || GoronBracelet;}}), - LocationAccess(SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST, {[]{return HoverBoots && SmallKeys(SHADOW_TEMPLE, 3) && ((LogicLensShadowMQ && LogicLensShadowMQPlatform) || CanUse(LENS_OF_TRUTH));}}), - LocationAccess(SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST, {[]{return HoverBoots && SmallKeys(SHADOW_TEMPLE, 3) && Hookshot && ((LogicLensShadowMQ && LogicLensShadowMQInvisibleBlades && LogicLensShadowMQPlatform) || CanUse(LENS_OF_TRUTH));}}), - LocationAccess(SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM, {[]{return Hookshot || (LogicShadowUmbrellaGS && HoverBoots);}}), + LocationAccess(RC_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, {[]{return IsAdult && CanUse(RG_LONGSHOT);}}), + LocationAccess(RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST, {[]{return true;}}), + LocationAccess(RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST, {[]{return (LogicShadowUmbrella && HoverBoots) || GoronBracelet;}}), + LocationAccess(RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST, {[]{return (LogicShadowUmbrella && HoverBoots) || GoronBracelet;}}), + LocationAccess(RC_SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST, {[]{return HoverBoots && SmallKeys(RR_SHADOW_TEMPLE, 3) && ((LogicLensShadowMQ && LogicLensShadowMQPlatform) || CanUse(RG_LENS_OF_TRUTH));}}), + LocationAccess(RC_SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST, {[]{return HoverBoots && SmallKeys(RR_SHADOW_TEMPLE, 3) && Hookshot && ((LogicLensShadowMQ && LogicLensShadowMQInvisibleBlades && LogicLensShadowMQPlatform) || CanUse(RG_LENS_OF_TRUTH));}}), + LocationAccess(RC_SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM, {[]{return Hookshot || (LogicShadowUmbrellaGS && HoverBoots);}}), }, { //Exits - Entrance(SHADOW_TEMPLE_MQ_WIND_TUNNEL, {[]{return HoverBoots && ((LogicLensShadowMQ && LogicLensShadowMQPlatform) || CanUse(LENS_OF_TRUTH)) && Hookshot && SmallKeys(SHADOW_TEMPLE, 4);}}), + Entrance(RR_SHADOW_TEMPLE_MQ_WIND_TUNNEL, {[]{return HoverBoots && ((LogicLensShadowMQ && LogicLensShadowMQPlatform) || CanUse(RG_LENS_OF_TRUTH)) && Hookshot && SmallKeys(RR_SHADOW_TEMPLE, 4);}}), }); - areaTable[SHADOW_TEMPLE_MQ_WIND_TUNNEL] = Area("Shadow Temple MQ Wind Tunnel", "Shadow Temple", SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SHADOW_TEMPLE_MQ_WIND_TUNNEL] = Area("Shadow Temple MQ Wind Tunnel", "Shadow Temple", RHT_SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&NutPot, {[]{return true;}}), }, { //Locations - LocationAccess(SHADOW_TEMPLE_MQ_WIND_HINT_CHEST, {[]{return true;}}), - LocationAccess(SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST, {[]{return true;}}), - LocationAccess(SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST, {[]{return true;}}), - LocationAccess(SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, {[]{return true;}}), - LocationAccess(SHADOW_TEMPLE_MQ_GS_AFTER_WIND, {[]{return true;}}), + LocationAccess(RC_SHADOW_TEMPLE_MQ_WIND_HINT_CHEST, {[]{return true;}}), + LocationAccess(RC_SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST, {[]{return true;}}), + LocationAccess(RC_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST, {[]{return true;}}), + LocationAccess(RC_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, {[]{return true;}}), + LocationAccess(RC_SHADOW_TEMPLE_MQ_GS_AFTER_WIND, {[]{return true;}}), }, { //Exits - Entrance(SHADOW_TEMPLE_MQ_BEYOND_BOAT, {[]{return CanPlay(ZeldasLullaby) && SmallKeys(SHADOW_TEMPLE, 5);}}), + Entrance(RR_SHADOW_TEMPLE_MQ_BEYOND_BOAT, {[]{return CanPlay(ZeldasLullaby) && SmallKeys(RR_SHADOW_TEMPLE, 5);}}), }); - areaTable[SHADOW_TEMPLE_MQ_BEYOND_BOAT] = Area("Shadow Temple MQ Beyond Boat", "Shadow Temple", SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_BEYOND_BOAT] = Area("Shadow Temple MQ Beyond Boat", "Shadow Temple", RHT_SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, {[]{return true;}}), - LocationAccess(SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, {[]{return Bow || (LogicShadowStatue && HasBombchus);}}), + LocationAccess(RC_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, {[]{return true;}}), + LocationAccess(RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, {[]{return Bow || (LogicShadowStatue && HasBombchus);}}), }, { //Exits - Entrance(SHADOW_TEMPLE_MQ_INVISIBLE_MAZE, {[]{return Bow && CanPlay(SongOfTime) && IsAdult && CanUse(LONGSHOT);}}), - Entrance(SHADOW_TEMPLE_BOSS_ENTRYWAY, {[]{return (CanUse(BOW) || (LogicShadowStatue && HasBombchus)) && CanUse(HOVER_BOOTS) && BossKeyShadowTemple;}}), + Entrance(RR_SHADOW_TEMPLE_MQ_INVISIBLE_MAZE, {[]{return Bow && CanPlay(SongOfTime) && IsAdult && CanUse(RG_LONGSHOT);}}), + Entrance(RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, {[]{return (CanUse(RG_FAIRY_BOW) || (LogicShadowStatue && HasBombchus)) && CanUse(RG_HOVER_BOOTS) && BossKeyShadowTemple;}}), }); - areaTable[SHADOW_TEMPLE_MQ_INVISIBLE_MAZE] = Area("Shadow Temple MQ Invisible Maze", "Shadow Temple", SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_INVISIBLE_MAZE] = Area("Shadow Temple MQ Invisible Maze", "Shadow Temple", RHT_SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST, {[]{return CanUse(DINS_FIRE) && SmallKeys(SHADOW_TEMPLE, 6);}}), - LocationAccess(SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST, {[]{return CanUse(DINS_FIRE) && SmallKeys(SHADOW_TEMPLE, 6);}}), + LocationAccess(RC_SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST, {[]{return CanUse(RG_DINS_FIRE) && SmallKeys(RR_SHADOW_TEMPLE, 6);}}), + LocationAccess(RC_SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST, {[]{return CanUse(RG_DINS_FIRE) && SmallKeys(RR_SHADOW_TEMPLE, 6);}}), //below previously returned true - LocationAccess(SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST, {[]{return CanUse(LENS_OF_TRUTH) || LogicLensShadowMQDeadHand;}}), - LocationAccess(SHADOW_TEMPLE_MQ_FREESTANDING_KEY, {[]{return true;}}), + LocationAccess(RC_SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST, {[]{return CanUse(RG_LENS_OF_TRUTH) || LogicLensShadowMQDeadHand;}}), + LocationAccess(RC_SHADOW_TEMPLE_MQ_FREESTANDING_KEY, {[]{return true;}}), }, {}); } /*--------------------------- | BOSS ROOM | ---------------------------*/ - areaTable[SHADOW_TEMPLE_BOSS_ENTRYWAY] = - Area("Shadow Temple Boss Entryway", "Shadow Temple", SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, + areaTable[RR_SHADOW_TEMPLE_BOSS_ENTRYWAY] = + Area("Shadow Temple Boss Entryway", "Shadow Temple", RHT_SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { // Exits - Entrance(SHADOW_TEMPLE_BEYOND_BOAT, { [] { return Dungeon::ShadowTemple.IsVanilla() && false; } }), - Entrance(SHADOW_TEMPLE_MQ_BEYOND_BOAT, { [] { return Dungeon::ShadowTemple.IsMQ() && false; } }), - Entrance(SHADOW_TEMPLE_BOSS_ROOM, { [] { return true; } }), + Entrance(RR_SHADOW_TEMPLE_BEYOND_BOAT, { [] { return Dungeon::ShadowTemple.IsVanilla() && false; } }), + Entrance(RR_SHADOW_TEMPLE_MQ_BEYOND_BOAT, { [] { return Dungeon::ShadowTemple.IsMQ() && false; } }), + Entrance(RR_SHADOW_TEMPLE_BOSS_ROOM, { [] { return true; } }), }); - areaTable[SHADOW_TEMPLE_BOSS_ROOM] = - Area("Shadow Temple Boss Room", "Shadow Temple", NONE, NO_DAY_NIGHT_CYCLE, + areaTable[RR_SHADOW_TEMPLE_BOSS_ROOM] = + Area("Shadow Temple Boss Room", "Shadow Temple", RHT_NONE, NO_DAY_NIGHT_CYCLE, { // Events EventAccess(&ShadowTempleClear, { [] { return ShadowTempleClear || - ((CanUse(LENS_OF_TRUTH) || LogicLensBongo) && - (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)) && - (CanUse(HOOKSHOT) || CanUse(BOW) || CanUse(SLINGSHOT) || LogicShadowBongo)); + ((CanUse(RG_LENS_OF_TRUTH) || LogicLensBongo) && + (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD)) && + (CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT) || LogicShadowBongo)); } }), }, { // Locations - LocationAccess(SHADOW_TEMPLE_BONGO_BONGO_HEART, { [] { return ShadowTempleClear; } }), - LocationAccess(BONGO_BONGO, { [] { return ShadowTempleClear; } }), + LocationAccess(RC_SHADOW_TEMPLE_BONGO_BONGO_HEART, { [] { return ShadowTempleClear; } }), + LocationAccess(RC_BONGO_BONGO, { [] { return ShadowTempleClear; } }), }, { // Exits - Entrance(SHADOW_TEMPLE_BOSS_ENTRYWAY, { [] { return false; } }), + Entrance(RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, { [] { return false; } }), }); } 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 ec01cdbfd..68f063cf6 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 @@ -10,133 +10,133 @@ void AreaTable_Init_SpiritTemple() { /*-------------------------- | VANILLA/MQ DECIDER | ---------------------------*/ - areaTable[SPIRIT_TEMPLE_ENTRYWAY] = Area("Spirit Temple Entryway", "Spirit Temple", SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SPIRIT_TEMPLE_ENTRYWAY] = Area("Spirit Temple Entryway", "Spirit Temple", RHT_SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(SPIRIT_TEMPLE_LOBBY, {[]{return Dungeon::SpiritTemple.IsVanilla();}}), - Entrance(SPIRIT_TEMPLE_MQ_LOBBY, {[]{return Dungeon::SpiritTemple.IsMQ();}}), - Entrance(DESERT_COLOSSUS_FROM_SPIRIT_ENTRYWAY, {[]{return true;}}), + Entrance(RR_SPIRIT_TEMPLE_LOBBY, {[]{return Dungeon::SpiritTemple.IsVanilla();}}), + Entrance(RR_SPIRIT_TEMPLE_MQ_LOBBY, {[]{return Dungeon::SpiritTemple.IsMQ();}}), + Entrance(RR_DESERT_COLOSSUS_FROM_SPIRIT_ENTRYWAY, {[]{return true;}}), }); /*-------------------------- | VANILLA DUNGEON | ---------------------------*/ if (Dungeon::SpiritTemple.IsVanilla()) { - areaTable[SPIRIT_TEMPLE_LOBBY] = Area("Spirit Temple Lobby", "Spirit Temple", SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SPIRIT_TEMPLE_LOBBY] = Area("Spirit Temple Lobby", "Spirit Temple", RHT_SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(SPIRIT_TEMPLE_ENTRYWAY, {[]{return true;}}), - Entrance(SPIRIT_TEMPLE_CHILD, {[]{return IsChild;}}), - Entrance(SPIRIT_TEMPLE_EARLY_ADULT, {[]{return CanUse(SILVER_GAUNTLETS);}}), + Entrance(RR_SPIRIT_TEMPLE_ENTRYWAY, {[]{return true;}}), + Entrance(RR_SPIRIT_TEMPLE_CHILD, {[]{return IsChild;}}), + Entrance(RR_SPIRIT_TEMPLE_EARLY_ADULT, {[]{return CanUse(RG_SILVER_GAUNTLETS);}}), }); - areaTable[SPIRIT_TEMPLE_CHILD] = Area("Child Spirit Temple", "Spirit Temple", SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SPIRIT_TEMPLE_CHILD] = Area("Child Spirit Temple", "Spirit Temple", RHT_SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&NutCrate, {[]{return true;}}), }, { //Locations - LocationAccess(SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, {[]{return (Boomerang || Slingshot || (HasBombchus && LogicSpiritChildBombchu)) && (HasExplosives || ((Nuts || Boomerang) && (Sticks || KokiriSword || Slingshot)));}}), - LocationAccess(SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, {[]{return (Boomerang || Slingshot || (HasBombchus && LogicSpiritChildBombchu)) && (HasExplosives || ((Nuts || Boomerang) && (Sticks || KokiriSword || Slingshot))) && (Sticks || CanUse(DINS_FIRE));}}), - LocationAccess(SPIRIT_TEMPLE_GS_METAL_FENCE, {[]{return (Boomerang || Slingshot || (HasBombchus && LogicSpiritChildBombchu)) && (HasExplosives || ((Nuts || Boomerang) && (Sticks || KokiriSword || Slingshot)));}}), + LocationAccess(RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, {[]{return (Boomerang || Slingshot || (HasBombchus && LogicSpiritChildBombchu)) && (HasExplosives || ((Nuts || Boomerang) && (Sticks || KokiriSword || Slingshot)));}}), + LocationAccess(RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, {[]{return (Boomerang || Slingshot || (HasBombchus && LogicSpiritChildBombchu)) && (HasExplosives || ((Nuts || Boomerang) && (Sticks || KokiriSword || Slingshot))) && (Sticks || CanUse(RG_DINS_FIRE));}}), + LocationAccess(RC_SPIRIT_TEMPLE_GS_METAL_FENCE, {[]{return (Boomerang || Slingshot || (HasBombchus && LogicSpiritChildBombchu)) && (HasExplosives || ((Nuts || Boomerang) && (Sticks || KokiriSword || Slingshot)));}}), }, { //Exits - Entrance(SPIRIT_TEMPLE_CHILD_CLIMB, {[]{return SmallKeys(SPIRIT_TEMPLE, 1);}}), + Entrance(RR_SPIRIT_TEMPLE_CHILD_CLIMB, {[]{return SmallKeys(RR_SPIRIT_TEMPLE, 1);}}), }); - areaTable[SPIRIT_TEMPLE_CHILD_CLIMB] = Area("Child Spirit Temple Climb", "Spirit Temple", SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_CHILD_CLIMB] = Area("Child Spirit Temple Climb", "Spirit Temple", RHT_SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, {[]{return HasProjectile(HasProjectileAge::Both) || ((SmallKeys(SPIRIT_TEMPLE, 3) || (SmallKeys(SPIRIT_TEMPLE, 2) && BombchusInLogic && ShuffleDungeonEntrances.Is(SHUFFLEDUNGEONS_OFF))) && CanUse(SILVER_GAUNTLETS) && HasProjectile(HasProjectileAge::Adult)) || (SmallKeys(SPIRIT_TEMPLE, 5) && IsChild && HasProjectile(HasProjectileAge::Child));}}), - LocationAccess(SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, {[]{return HasProjectile(HasProjectileAge::Both) || ((SmallKeys(SPIRIT_TEMPLE, 3) || (SmallKeys(SPIRIT_TEMPLE, 2) && BombchusInLogic && ShuffleDungeonEntrances.Is(SHUFFLEDUNGEONS_OFF))) && CanUse(SILVER_GAUNTLETS) && HasProjectile(HasProjectileAge::Adult)) || (SmallKeys(SPIRIT_TEMPLE, 5) && IsChild && HasProjectile(HasProjectileAge::Child));}}), - LocationAccess(SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, {[]{return HasProjectile(HasProjectileAge::Both) || CanUse(DINS_FIRE) || + LocationAccess(RC_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, {[]{return HasProjectile(HasProjectileAge::Both) || ((SmallKeys(RR_SPIRIT_TEMPLE, 3) || (SmallKeys(RR_SPIRIT_TEMPLE, 2) && BombchusInLogic && ShuffleDungeonEntrances.Is(SHUFFLEDUNGEONS_OFF))) && CanUse(RG_SILVER_GAUNTLETS) && HasProjectile(HasProjectileAge::Adult)) || (SmallKeys(RR_SPIRIT_TEMPLE, 5) && IsChild && HasProjectile(HasProjectileAge::Child));}}), + LocationAccess(RC_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, {[]{return HasProjectile(HasProjectileAge::Both) || ((SmallKeys(RR_SPIRIT_TEMPLE, 3) || (SmallKeys(RR_SPIRIT_TEMPLE, 2) && BombchusInLogic && ShuffleDungeonEntrances.Is(SHUFFLEDUNGEONS_OFF))) && CanUse(RG_SILVER_GAUNTLETS) && HasProjectile(HasProjectileAge::Adult)) || (SmallKeys(RR_SPIRIT_TEMPLE, 5) && IsChild && HasProjectile(HasProjectileAge::Child));}}), + LocationAccess(RC_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, {[]{return HasProjectile(HasProjectileAge::Both) || CanUse(RG_DINS_FIRE) || (CanTakeDamage && (Sticks || KokiriSword || HasProjectile(HasProjectileAge::Child))) || - (IsChild && SmallKeys(SPIRIT_TEMPLE, 5) && HasProjectile(HasProjectileAge::Child)) || - ((SmallKeys(SPIRIT_TEMPLE, 3) || (SmallKeys(SPIRIT_TEMPLE, 2) && BombchusInLogic && ShuffleDungeonEntrances.Is(SHUFFLEDUNGEONS_OFF))) && CanUse(SILVER_GAUNTLETS) && (HasProjectile(HasProjectileAge::Adult) || CanTakeDamage));}}), + (IsChild && SmallKeys(RR_SPIRIT_TEMPLE, 5) && HasProjectile(HasProjectileAge::Child)) || + ((SmallKeys(RR_SPIRIT_TEMPLE, 3) || (SmallKeys(RR_SPIRIT_TEMPLE, 2) && BombchusInLogic && ShuffleDungeonEntrances.Is(SHUFFLEDUNGEONS_OFF))) && CanUse(RG_SILVER_GAUNTLETS) && (HasProjectile(HasProjectileAge::Adult) || CanTakeDamage));}}), }, { //Exits - Entrance(SPIRIT_TEMPLE_CENTRAL_CHAMBER, {[]{return HasExplosives || (SunlightArrows && CanUse(LIGHT_ARROWS));}}), + Entrance(RR_SPIRIT_TEMPLE_CENTRAL_CHAMBER, {[]{return HasExplosives || (SunlightArrows && CanUse(RG_LIGHT_ARROWS));}}), }); - areaTable[SPIRIT_TEMPLE_EARLY_ADULT] = Area("Early Adult Spirit Temple", "Spirit Temple", SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_EARLY_ADULT] = Area("Early Adult Spirit Temple", "Spirit Temple", RHT_SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(SPIRIT_TEMPLE_COMPASS_CHEST, {[]{return CanUse(HOOKSHOT) && CanPlay(ZeldasLullaby);}}), - LocationAccess(SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, {[]{return Bow || Hookshot || HasBombchus || (Bombs && LogicSpiritLowerAdultSwitch);}}), - LocationAccess(SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, {[]{return SmallKeys(SPIRIT_TEMPLE, 3);}}), - LocationAccess(SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, {[]{return SmallKeys(SPIRIT_TEMPLE, 3);}}), - LocationAccess(SPIRIT_TEMPLE_GS_BOULDER_ROOM, {[]{return CanPlay(SongOfTime) && (Bow || Hookshot || HasBombchus || (Bombs && LogicSpiritLowerAdultSwitch));}}), + LocationAccess(RC_SPIRIT_TEMPLE_COMPASS_CHEST, {[]{return CanUse(RG_HOOKSHOT) && CanPlay(ZeldasLullaby);}}), + LocationAccess(RC_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, {[]{return Bow || Hookshot || HasBombchus || (Bombs && LogicSpiritLowerAdultSwitch);}}), + LocationAccess(RC_SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, {[]{return SmallKeys(RR_SPIRIT_TEMPLE, 3);}}), + LocationAccess(RC_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, {[]{return SmallKeys(RR_SPIRIT_TEMPLE, 3);}}), + LocationAccess(RC_SPIRIT_TEMPLE_GS_BOULDER_ROOM, {[]{return CanPlay(SongOfTime) && (Bow || Hookshot || HasBombchus || (Bombs && LogicSpiritLowerAdultSwitch));}}), }, { //Exits - Entrance(SPIRIT_TEMPLE_CENTRAL_CHAMBER, {[]{return SmallKeys(SPIRIT_TEMPLE, 1);}}), + Entrance(RR_SPIRIT_TEMPLE_CENTRAL_CHAMBER, {[]{return SmallKeys(RR_SPIRIT_TEMPLE, 1);}}), }); - areaTable[SPIRIT_TEMPLE_CENTRAL_CHAMBER] = Area("Spirit Temple Central Chamber", "Spirit Temple", SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_CENTRAL_CHAMBER] = Area("Spirit Temple Central Chamber", "Spirit Temple", RHT_SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(SPIRIT_TEMPLE_MAP_CHEST, {[]{return ((HasExplosives || SmallKeys(SPIRIT_TEMPLE, 3) || (SmallKeys(SPIRIT_TEMPLE, 2) && BombchusInLogic && ShuffleDungeonEntrances.Is(SHUFFLEDUNGEONS_OFF))) && + LocationAccess(RC_SPIRIT_TEMPLE_MAP_CHEST, {[]{return ((HasExplosives || SmallKeys(RR_SPIRIT_TEMPLE, 3) || (SmallKeys(RR_SPIRIT_TEMPLE, 2) && BombchusInLogic && ShuffleDungeonEntrances.Is(SHUFFLEDUNGEONS_OFF))) && - (CanUse(DINS_FIRE) || + (CanUse(RG_DINS_FIRE) || (((MagicMeter && FireArrows) || LogicSpiritMapChest) && Bow && Sticks))) || - (SmallKeys(SPIRIT_TEMPLE, 5) && HasExplosives && - CanUse(STICKS)) || - (SmallKeys(SPIRIT_TEMPLE, 3) && - (CanUse(FIRE_ARROWS) || (LogicSpiritMapChest && Bow)) && - CanUse(SILVER_GAUNTLETS));}}), - LocationAccess(SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST, {[]{return ((HasExplosives || SmallKeys(SPIRIT_TEMPLE, 3) || (SmallKeys(SPIRIT_TEMPLE, 2) && BombchusInLogic && ShuffleDungeonEntrances.Is(SHUFFLEDUNGEONS_OFF))) && - (CanUse(DINS_FIRE) || + (SmallKeys(RR_SPIRIT_TEMPLE, 5) && HasExplosives && + CanUse(RG_STICKS)) || + (SmallKeys(RR_SPIRIT_TEMPLE, 3) && + (CanUse(RG_FIRE_ARROWS) || (LogicSpiritMapChest && Bow)) && + CanUse(RG_SILVER_GAUNTLETS));}}), + LocationAccess(RC_SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST, {[]{return ((HasExplosives || SmallKeys(RR_SPIRIT_TEMPLE, 3) || (SmallKeys(RR_SPIRIT_TEMPLE, 2) && BombchusInLogic && ShuffleDungeonEntrances.Is(SHUFFLEDUNGEONS_OFF))) && + (CanUse(RG_DINS_FIRE) || (((MagicMeter && FireArrows) || LogicSpiritSunChest) && Bow && Sticks))) || - (SmallKeys(SPIRIT_TEMPLE, 5) && HasExplosives && - CanUse(STICKS)) || - (SmallKeys(SPIRIT_TEMPLE, 3) && - (CanUse(FIRE_ARROWS) || (LogicSpiritSunChest && Bow)) && - CanUse(SILVER_GAUNTLETS));}}), - LocationAccess(SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST, {[]{return SmallKeys(SPIRIT_TEMPLE, 3) && CanUse(SILVER_GAUNTLETS) && CanPlay(ZeldasLullaby);}}), - LocationAccess(SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST, {[]{return SmallKeys(SPIRIT_TEMPLE, 3) && CanUse(SILVER_GAUNTLETS) && CanPlay(ZeldasLullaby) && (Hookshot || HoverBoots || LogicSpiritLobbyJump);}}), - LocationAccess(SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM, {[]{return (HasExplosives && Boomerang && Hookshot) || - (CanUse(BOOMERANG) && SmallKeys(SPIRIT_TEMPLE, 5) && HasExplosives) || - (Hookshot && CanUse(SILVER_GAUNTLETS) && - (SmallKeys(SPIRIT_TEMPLE, 3) || - (SmallKeys(SPIRIT_TEMPLE, 2) && Boomerang && BombchusInLogic && ShuffleDungeonEntrances.Is(SHUFFLEDUNGEONS_OFF))));}}), - LocationAccess(SPIRIT_TEMPLE_GS_LOBBY, {[]{return ((HasExplosives || SmallKeys(SPIRIT_TEMPLE, 3) || (SmallKeys(SPIRIT_TEMPLE, 2) && BombchusInLogic && ShuffleDungeonEntrances.Is(SHUFFLEDUNGEONS_OFF))) && + (SmallKeys(RR_SPIRIT_TEMPLE, 5) && HasExplosives && + CanUse(RG_STICKS)) || + (SmallKeys(RR_SPIRIT_TEMPLE, 3) && + (CanUse(RG_FIRE_ARROWS) || (LogicSpiritSunChest && Bow)) && + CanUse(RG_SILVER_GAUNTLETS));}}), + LocationAccess(RC_SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST, {[]{return SmallKeys(RR_SPIRIT_TEMPLE, 3) && CanUse(RG_SILVER_GAUNTLETS) && CanPlay(ZeldasLullaby);}}), + LocationAccess(RC_SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST, {[]{return SmallKeys(RR_SPIRIT_TEMPLE, 3) && CanUse(RG_SILVER_GAUNTLETS) && CanPlay(ZeldasLullaby) && (Hookshot || HoverBoots || LogicSpiritLobbyJump);}}), + LocationAccess(RC_SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM, {[]{return (HasExplosives && Boomerang && Hookshot) || + (CanUse(RG_BOOMERANG) && SmallKeys(RR_SPIRIT_TEMPLE, 5) && HasExplosives) || + (Hookshot && CanUse(RG_SILVER_GAUNTLETS) && + (SmallKeys(RR_SPIRIT_TEMPLE, 3) || + (SmallKeys(RR_SPIRIT_TEMPLE, 2) && Boomerang && BombchusInLogic && ShuffleDungeonEntrances.Is(SHUFFLEDUNGEONS_OFF))));}}), + LocationAccess(RC_SPIRIT_TEMPLE_GS_LOBBY, {[]{return ((HasExplosives || SmallKeys(RR_SPIRIT_TEMPLE, 3) || (SmallKeys(RR_SPIRIT_TEMPLE, 2) && BombchusInLogic && ShuffleDungeonEntrances.Is(SHUFFLEDUNGEONS_OFF))) && LogicSpiritLobbyGS && Boomerang && (Hookshot || HoverBoots || LogicSpiritLobbyJump)) || - (LogicSpiritLobbyGS && SmallKeys(SPIRIT_TEMPLE, 5) && HasExplosives && CanUse(BOOMERANG)) || - (SmallKeys(SPIRIT_TEMPLE, 3) && CanUse(SILVER_GAUNTLETS) && (Hookshot || HoverBoots || LogicSpiritLobbyJump));}}), + (LogicSpiritLobbyGS && SmallKeys(RR_SPIRIT_TEMPLE, 5) && HasExplosives && CanUse(RG_BOOMERANG)) || + (SmallKeys(RR_SPIRIT_TEMPLE, 3) && CanUse(RG_SILVER_GAUNTLETS) && (Hookshot || HoverBoots || LogicSpiritLobbyJump));}}), }, { //Exits - Entrance(SPIRIT_TEMPLE_OUTDOOR_HANDS, {[]{return true;}}), - Entrance(SPIRIT_TEMPLE_BEYOND_CENTRAL_LOCKED_DOOR, {[]{return SmallKeys(SPIRIT_TEMPLE, 4) && CanUse(SILVER_GAUNTLETS);}}), - Entrance(SPIRIT_TEMPLE_CHILD_CLIMB, {[]{return true;}}), + Entrance(RR_SPIRIT_TEMPLE_OUTDOOR_HANDS, {[]{return true;}}), + Entrance(RR_SPIRIT_TEMPLE_BEYOND_CENTRAL_LOCKED_DOOR, {[]{return SmallKeys(RR_SPIRIT_TEMPLE, 4) && CanUse(RG_SILVER_GAUNTLETS);}}), + Entrance(RR_SPIRIT_TEMPLE_CHILD_CLIMB, {[]{return true;}}), }); - areaTable[SPIRIT_TEMPLE_OUTDOOR_HANDS] = Area("Spirit Temple Outdoor Hands", "Spirit Temple", SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_OUTDOOR_HANDS] = Area("Spirit Temple Outdoor Hands", "Spirit Temple", RHT_SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, {[]{return (SmallKeys(SPIRIT_TEMPLE, 3) && Longshot && HasExplosives) || SmallKeys(SPIRIT_TEMPLE, 5);}}), - LocationAccess(SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, {[]{return SmallKeys(SPIRIT_TEMPLE, 4) && CanUse(SILVER_GAUNTLETS) && HasExplosives;}}), + LocationAccess(RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, {[]{return (SmallKeys(RR_SPIRIT_TEMPLE, 3) && Longshot && HasExplosives) || SmallKeys(RR_SPIRIT_TEMPLE, 5);}}), + LocationAccess(RC_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, {[]{return SmallKeys(RR_SPIRIT_TEMPLE, 4) && CanUse(RG_SILVER_GAUNTLETS) && HasExplosives;}}), }, { //Exits - Entrance(DESERT_COLOSSUS, {[]{return (IsChild && SmallKeys(SPIRIT_TEMPLE, 5)) || (CanUse(SILVER_GAUNTLETS) && ((SmallKeys(SPIRIT_TEMPLE, 3) && HasExplosives) || SmallKeys(SPIRIT_TEMPLE, 5)));}}), + Entrance(RR_DESERT_COLOSSUS, {[]{return (IsChild && SmallKeys(RR_SPIRIT_TEMPLE, 5)) || (CanUse(RG_SILVER_GAUNTLETS) && ((SmallKeys(RR_SPIRIT_TEMPLE, 3) && HasExplosives) || SmallKeys(RR_SPIRIT_TEMPLE, 5)));}}), }); - areaTable[SPIRIT_TEMPLE_BEYOND_CENTRAL_LOCKED_DOOR] = Area("Spirit Temple Beyond Central Locked Door", "Spirit Temple", SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_BEYOND_CENTRAL_LOCKED_DOOR] = Area("Spirit Temple Beyond Central Locked Door", "Spirit Temple", RHT_SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, {[]{return (MirrorShield || (SunlightArrows && CanUse(LIGHT_ARROWS))) && HasExplosives;}}), - LocationAccess(SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, {[]{return (LogicLensSpirit || CanUse(LENS_OF_TRUTH)) && HasExplosives;}}), - LocationAccess(SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, {[]{return (LogicLensSpirit || CanUse(LENS_OF_TRUTH)) && HasExplosives;}}), + LocationAccess(RC_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, {[]{return (MirrorShield || (SunlightArrows && CanUse(RG_LIGHT_ARROWS))) && HasExplosives;}}), + LocationAccess(RC_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, {[]{return (LogicLensSpirit || CanUse(RG_LENS_OF_TRUTH)) && HasExplosives;}}), + LocationAccess(RC_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, {[]{return (LogicLensSpirit || CanUse(RG_LENS_OF_TRUTH)) && HasExplosives;}}), }, { //Exits - Entrance(SPIRIT_TEMPLE_BEYOND_FINAL_LOCKED_DOOR, {[]{return SmallKeys(SPIRIT_TEMPLE, 5) && (LogicSpiritWall || CanUse(LONGSHOT) || HasBombchus || ((Bombs || Nuts || CanUse(DINS_FIRE)) && (Bow || CanUse(HOOKSHOT) || Hammer)));}}), + Entrance(RR_SPIRIT_TEMPLE_BEYOND_FINAL_LOCKED_DOOR, {[]{return SmallKeys(RR_SPIRIT_TEMPLE, 5) && (LogicSpiritWall || CanUse(RG_LONGSHOT) || HasBombchus || ((Bombs || Nuts || CanUse(RG_DINS_FIRE)) && (Bow || CanUse(RG_HOOKSHOT) || Hammer)));}}), }); - areaTable[SPIRIT_TEMPLE_BEYOND_FINAL_LOCKED_DOOR] = Area("Spirit Temple Beyond Final Locked Door", "Spirit Temple", SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_BEYOND_FINAL_LOCKED_DOOR] = Area("Spirit Temple Beyond Final Locked Door", "Spirit Temple", RHT_SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(SPIRIT_TEMPLE_BOSS_KEY_CHEST, {[]{return CanPlay(ZeldasLullaby) && ((CanTakeDamage && LogicFlamingChests) || (Bow && Hookshot));}}), - LocationAccess(SPIRIT_TEMPLE_TOPMOST_CHEST, {[]{return MirrorShield || (SunlightArrows && CanUse(LIGHT_ARROWS));}}), + LocationAccess(RC_SPIRIT_TEMPLE_BOSS_KEY_CHEST, {[]{return CanPlay(ZeldasLullaby) && ((CanTakeDamage && LogicFlamingChests) || (Bow && Hookshot));}}), + LocationAccess(RC_SPIRIT_TEMPLE_TOPMOST_CHEST, {[]{return MirrorShield || (SunlightArrows && CanUse(RG_LIGHT_ARROWS));}}), }, { //Exits - Entrance(SPIRIT_TEMPLE_INSIDE_STATUE_HEAD, {[]{return MirrorShield && HasExplosives && Hookshot;}}), + Entrance(RR_SPIRIT_TEMPLE_INSIDE_STATUE_HEAD, {[]{return MirrorShield && HasExplosives && Hookshot;}}), }); - areaTable[SPIRIT_TEMPLE_INSIDE_STATUE_HEAD] = - Area("Spirit Temple Inside Statue Head", "Spirit Temple", SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, + areaTable[RR_SPIRIT_TEMPLE_INSIDE_STATUE_HEAD] = + Area("Spirit Temple Inside Statue Head", "Spirit Temple", RHT_SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { // Exits - Entrance(SPIRIT_TEMPLE_CENTRAL_CHAMBER, { [] { return true; } }), - Entrance(SPIRIT_TEMPLE_BOSS_ENTRYWAY, { [] { return BossKeySpiritTemple; } }), + Entrance(RR_SPIRIT_TEMPLE_CENTRAL_CHAMBER, { [] { return true; } }), + Entrance(RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY, { [] { return BossKeySpiritTemple; } }), }); } @@ -144,132 +144,132 @@ void AreaTable_Init_SpiritTemple() { | MASTER QUEST DUNGEON | ---------------------------*/ if (Dungeon::SpiritTemple.IsMQ()) { - areaTable[SPIRIT_TEMPLE_MQ_LOBBY] = Area("Spirit Temple MQ Lobby", "Spirit Temple", SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_LOBBY] = Area("Spirit Temple MQ Lobby", "Spirit Temple", RHT_SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST, {[]{return true;}}), - LocationAccess(SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST, {[]{return Here(SPIRIT_TEMPLE_MQ_LOBBY, []{return CanBlastOrSmash;}) && ((IsChild && CanUse(SLINGSHOT)) || (IsAdult && CanUse(BOW)));}}), - LocationAccess(SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST, {[]{return HasBombchus || (IsAdult && (CanUse(BOW) || CanUse(HOOKSHOT))) || (IsChild && (CanUse(SLINGSHOT) || CanUse(BOOMERANG)));}}), + 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 CanBlastOrSmash;}) && ((IsChild && CanUse(RG_FAIRY_SLINGSHOT)) || (IsAdult && CanUse(RG_FAIRY_BOW)));}}), + LocationAccess(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST, {[]{return HasBombchus || (IsAdult && (CanUse(RG_FAIRY_BOW) || CanUse(RG_HOOKSHOT))) || (IsChild && (CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_BOOMERANG)));}}), }, { //Exits - Entrance(SPIRIT_TEMPLE_ENTRYWAY, {[]{return true;}}), - Entrance(SPIRIT_TEMPLE_MQ_CHILD, {[]{return IsChild;}}), - Entrance(SPIRIT_TEMPLE_MQ_ADULT, {[]{return HasBombchus && IsAdult && CanUse(LONGSHOT) && CanUse(SILVER_GAUNTLETS);}}), + Entrance(RR_SPIRIT_TEMPLE_ENTRYWAY, {[]{return true;}}), + Entrance(RR_SPIRIT_TEMPLE_MQ_CHILD, {[]{return IsChild;}}), + Entrance(RR_SPIRIT_TEMPLE_MQ_ADULT, {[]{return HasBombchus && IsAdult && CanUse(RG_LONGSHOT) && CanUse(RG_SILVER_GAUNTLETS);}}), }); - areaTable[SPIRIT_TEMPLE_MQ_CHILD] = Area("Spirit Temple MQ Child", "Spirit Temple", SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SPIRIT_TEMPLE_MQ_CHILD] = Area("Spirit Temple MQ Child", "Spirit Temple", RHT_SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&FairyPot, {[]{return FairyPot || (KokiriSword && HasBombchus && Slingshot);}}), }, { //Locations - LocationAccess(SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST, {[]{return Here(SPIRIT_TEMPLE_MQ_ADULT, []{return SmallKeys(SPIRIT_TEMPLE, 7) && Hammer;});}}), - LocationAccess(SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST, {[]{return KokiriSword && HasBombchus && Slingshot && CanUse(DINS_FIRE);}}), - LocationAccess(SPIRIT_TEMPLE_MQ_MAP_CHEST, {[]{return KokiriSword || Bombs;}}), - LocationAccess(SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, {[]{return HasBombchus && SmallKeys(SPIRIT_TEMPLE, 7) && Slingshot && (CanUse(DINS_FIRE) || (Here(SPIRIT_TEMPLE_MQ_ADULT, []{return IsAdult && (CanUse(FIRE_ARROWS) || (LogicSpiritMQFrozenEye && CanUse(BOW) && CanPlay(SongOfTime)));})));}}), - //Trick: HasBombchus && SmallKeys(SPIRIT_TEMPLE, 7) && Slingshot && (CanUse(DINS_FIRE) || (SPIRIT_TEMPLE_MQ_ADULT.Adult() && IsAdult && (CanUse(FIRE_ARROWS) || (LogicSpiritMQFrozenEye && CanUse(BOW) && CanPlay(SongOfTime))))) + LocationAccess(RC_SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST, {[]{return Here(RR_SPIRIT_TEMPLE_MQ_ADULT, []{return SmallKeys(RR_SPIRIT_TEMPLE, 7) && Hammer;});}}), + LocationAccess(RC_SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST, {[]{return KokiriSword && HasBombchus && Slingshot && CanUse(RG_DINS_FIRE);}}), + LocationAccess(RC_SPIRIT_TEMPLE_MQ_MAP_CHEST, {[]{return KokiriSword || Bombs;}}), + LocationAccess(RC_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, {[]{return HasBombchus && SmallKeys(RR_SPIRIT_TEMPLE, 7) && Slingshot && (CanUse(RG_DINS_FIRE) || (Here(RR_SPIRIT_TEMPLE_MQ_ADULT, []{return IsAdult && (CanUse(RG_FIRE_ARROWS) || (LogicSpiritMQFrozenEye && CanUse(RG_FAIRY_BOW) && CanPlay(SongOfTime)));})));}}), + //Trick: HasBombchus && SmallKeys(RR_SPIRIT_TEMPLE, 7) && Slingshot && (CanUse(RG_DINS_FIRE) || (SPIRIT_TEMPLE_MQ_ADULT.Adult() && IsAdult && (CanUse(RG_FIRE_ARROWS) || (LogicSpiritMQFrozenEye && CanUse(RG_FAIRY_BOW) && CanPlay(SongOfTime))))) }, { //Exits - Entrance(SPIRIT_TEMPLE_MQ_SHARED, {[]{return HasBombchus && SmallKeys(SPIRIT_TEMPLE, 2);}}), + Entrance(RR_SPIRIT_TEMPLE_MQ_SHARED, {[]{return HasBombchus && SmallKeys(RR_SPIRIT_TEMPLE, 2);}}), }); - areaTable[SPIRIT_TEMPLE_MQ_ADULT] = Area("Spirit Temple MQ Adult", "Spirit Temple", SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_ADULT] = Area("Spirit Temple MQ Adult", "Spirit Temple", RHT_SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST, {[]{return SmallKeys(SPIRIT_TEMPLE, 7);}}), - LocationAccess(SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, {[]{return CanPlay(ZeldasLullaby);}}), - LocationAccess(SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST, {[]{return (LogicLensSpiritMQ || CanUse(LENS_OF_TRUTH));}}), - LocationAccess(SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, {[]{return SmallKeys(SPIRIT_TEMPLE, 5);}}), - LocationAccess(SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST, {[]{return SmallKeys(SPIRIT_TEMPLE, 5) && CanPlay(SongOfTime);}}), - LocationAccess(SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST, {[]{return SmallKeys(SPIRIT_TEMPLE, 5) && CanPlay(SongOfTime) && (MirrorShield || (SunlightArrows && CanUse(LIGHT_ARROWS)));}}), - LocationAccess(SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, {[]{return SmallKeys(SPIRIT_TEMPLE, 7);}}), - LocationAccess(SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, {[]{return SmallKeys(SPIRIT_TEMPLE, 7);}}), + LocationAccess(RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST, {[]{return SmallKeys(RR_SPIRIT_TEMPLE, 7);}}), + LocationAccess(RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, {[]{return CanPlay(ZeldasLullaby);}}), + LocationAccess(RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST, {[]{return (LogicLensSpiritMQ || CanUse(RG_LENS_OF_TRUTH));}}), + LocationAccess(RC_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, {[]{return SmallKeys(RR_SPIRIT_TEMPLE, 5);}}), + LocationAccess(RC_SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST, {[]{return SmallKeys(RR_SPIRIT_TEMPLE, 5) && CanPlay(SongOfTime);}}), + LocationAccess(RC_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST, {[]{return SmallKeys(RR_SPIRIT_TEMPLE, 5) && CanPlay(SongOfTime) && (MirrorShield || (SunlightArrows && CanUse(RG_LIGHT_ARROWS)));}}), + LocationAccess(RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, {[]{return SmallKeys(RR_SPIRIT_TEMPLE, 7);}}), + LocationAccess(RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, {[]{return SmallKeys(RR_SPIRIT_TEMPLE, 7);}}), }, { //Exits - Entrance(SPIRIT_TEMPLE_MQ_LOWER_ADULT, {[]{return MirrorShield && IsAdult && (CanUse(FIRE_ARROWS) || (LogicSpiritMQLowerAdult && CanUse(DINS_FIRE) && Bow));}}), - //Trick: MirrorShield && IsAdult && (CanUse(FIRE_ARROWS) || (LogicSpiritMQLowerAdult && CanUse(DINS_FIRE) && Bow)) - Entrance(SPIRIT_TEMPLE_MQ_SHARED, {[]{return true;}}), - Entrance(SPIRIT_TEMPLE_MQ_BOSS_AREA, {[]{return SmallKeys(SPIRIT_TEMPLE, 6) && CanPlay(ZeldasLullaby) && Hammer;}}), - Entrance(SPIRIT_TEMPLE_MQ_MIRROR_SHIELD_HAND, {[]{return SmallKeys(SPIRIT_TEMPLE, 5) && CanPlay(SongOfTime) && (LogicLensSpiritMQ || CanUse(LENS_OF_TRUTH));}}), + Entrance(RR_SPIRIT_TEMPLE_MQ_LOWER_ADULT, {[]{return MirrorShield && IsAdult && (CanUse(RG_FIRE_ARROWS) || (LogicSpiritMQLowerAdult && CanUse(RG_DINS_FIRE) && Bow));}}), + //Trick: MirrorShield && IsAdult && (CanUse(RG_FIRE_ARROWS) || (LogicSpiritMQLowerAdult && CanUse(RG_DINS_FIRE) && Bow)) + Entrance(RR_SPIRIT_TEMPLE_MQ_SHARED, {[]{return true;}}), + Entrance(RR_SPIRIT_TEMPLE_MQ_BOSS_AREA, {[]{return SmallKeys(RR_SPIRIT_TEMPLE, 6) && CanPlay(ZeldasLullaby) && Hammer;}}), + Entrance(RR_SPIRIT_TEMPLE_MQ_MIRROR_SHIELD_HAND, {[]{return SmallKeys(RR_SPIRIT_TEMPLE, 5) && CanPlay(SongOfTime) && (LogicLensSpiritMQ || CanUse(RG_LENS_OF_TRUTH));}}), }); - areaTable[SPIRIT_TEMPLE_MQ_SHARED] = Area("Spirit Temple MQ Shared", "Spirit Temple", SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_SHARED] = Area("Spirit Temple MQ Shared", "Spirit Temple", RHT_SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST, {[]{return SmallKeys(SPIRIT_TEMPLE, 6);}}), - LocationAccess(SPIRIT_TEMPLE_MQ_COMPASS_CHEST, {[]{return (IsChild && CanUse(SLINGSHOT) && SmallKeys(SPIRIT_TEMPLE, 7)) || (IsAdult && CanUse(BOW)) || (Bow && Slingshot);}}), - LocationAccess(SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST, {[]{return CanPlay(SongOfTime) || LogicSpiritMQSunBlockSoT || IsAdult;}}), + LocationAccess(RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST, {[]{return SmallKeys(RR_SPIRIT_TEMPLE, 6);}}), + LocationAccess(RC_SPIRIT_TEMPLE_MQ_COMPASS_CHEST, {[]{return (IsChild && CanUse(RG_FAIRY_SLINGSHOT) && SmallKeys(RR_SPIRIT_TEMPLE, 7)) || (IsAdult && CanUse(RG_FAIRY_BOW)) || (Bow && Slingshot);}}), + LocationAccess(RC_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST, {[]{return CanPlay(SongOfTime) || LogicSpiritMQSunBlockSoT || IsAdult;}}), //Trick: CanPlay(SongOfTime) || LogicSpiritMQSunBlockSoT || IsAdult - LocationAccess(SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM, {[]{return (LogicSpiritMQSunBlockGS && Boomerang && (CanPlay(SongOfTime) || LogicSpiritMQSunBlockSoT)) || IsAdult;}}), + LocationAccess(RC_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM, {[]{return (LogicSpiritMQSunBlockGS && Boomerang && (CanPlay(SongOfTime) || LogicSpiritMQSunBlockSoT)) || IsAdult;}}), //Trick: (LogicSpiritMQSunBlockGS && Boomerang && (CanPlay(SongOfTime) || LogicSpiritMQSunBlockSoT)) || IsAdult }, { //Exits - Entrance(SPIRIT_TEMPLE_MQ_SILVER_GAUNTLETS_HAND, {[]{return (SmallKeys(SPIRIT_TEMPLE, 7) && (CanPlay(SongOfTime) || LogicSpiritMQSunBlockSoT || IsAdult)) || (SmallKeys(SPIRIT_TEMPLE, 4) && CanPlay(SongOfTime) && (LogicLensSpiritMQ || CanUse(LENS_OF_TRUTH)));}}), - //Trick: (SmallKeys(SPIRIT_TEMPLE, 7) && (CanPlay(SongOfTime) || LogicSpiritMQSunBlockSoT || IsAdult)) || (SmallKeys(SPIRIT_TEMPLE, 4) && CanPlay(SongOfTime) && (LogicLensSpiritMQ || CanUse(LENS_OF_TRUTH))) - Entrance(DESERT_COLOSSUS, {[]{return (SmallKeys(SPIRIT_TEMPLE, 7) && (CanPlay(SongOfTime) || LogicSpiritMQSunBlockSoT || IsAdult)) || (SmallKeys(SPIRIT_TEMPLE, 4) && CanPlay(SongOfTime) && (LogicLensSpiritMQ || CanUse(LENS_OF_TRUTH)) && IsAdult);}}), - //Trick: (SmallKeys(SPIRIT_TEMPLE, 7) && (CanPlay(SongOfTime) || LogicSpiritMQSunBlockSoT || IsAdult)) || (SmallKeys(SPIRIT_TEMPLE, 4) && CanPlay(SongOfTime) && (LogicLensSpiritMQ || CanUse(LENS_OF_TRUTH)) && IsAdult) + Entrance(RR_SPIRIT_TEMPLE_MQ_SILVER_GAUNTLETS_HAND, {[]{return (SmallKeys(RR_SPIRIT_TEMPLE, 7) && (CanPlay(SongOfTime) || LogicSpiritMQSunBlockSoT || IsAdult)) || (SmallKeys(RR_SPIRIT_TEMPLE, 4) && CanPlay(SongOfTime) && (LogicLensSpiritMQ || CanUse(RG_LENS_OF_TRUTH)));}}), + //Trick: (SmallKeys(RR_SPIRIT_TEMPLE, 7) && (CanPlay(SongOfTime) || LogicSpiritMQSunBlockSoT || IsAdult)) || (SmallKeys(RR_SPIRIT_TEMPLE, 4) && CanPlay(SongOfTime) && (LogicLensSpiritMQ || CanUse(RG_LENS_OF_TRUTH))) + Entrance(RR_DESERT_COLOSSUS, {[]{return (SmallKeys(RR_SPIRIT_TEMPLE, 7) && (CanPlay(SongOfTime) || LogicSpiritMQSunBlockSoT || IsAdult)) || (SmallKeys(RR_SPIRIT_TEMPLE, 4) && CanPlay(SongOfTime) && (LogicLensSpiritMQ || CanUse(RG_LENS_OF_TRUTH)) && IsAdult);}}), + //Trick: (SmallKeys(RR_SPIRIT_TEMPLE, 7) && (CanPlay(SongOfTime) || LogicSpiritMQSunBlockSoT || IsAdult)) || (SmallKeys(RR_SPIRIT_TEMPLE, 4) && CanPlay(SongOfTime) && (LogicLensSpiritMQ || CanUse(RG_LENS_OF_TRUTH)) && IsAdult) }); - areaTable[SPIRIT_TEMPLE_MQ_LOWER_ADULT] = Area("Spirit Temple MQ Lower Adult", "Spirit Temple", SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_LOWER_ADULT] = Area("Spirit Temple MQ Lower Adult", "Spirit Temple", RHT_SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST, {[]{return true;}}), - LocationAccess(SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST, {[]{return SmallKeys(SPIRIT_TEMPLE, 7) && Hammer && Ocarina && SongOfTime && EponasSong && SunsSong && SongOfStorms && ZeldasLullaby;}}), - LocationAccess(SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST, {[]{return Hammer;}}), - LocationAccess(SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM, {[]{return true;}}), - LocationAccess(SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM, {[]{return SmallKeys(SPIRIT_TEMPLE, 7) && Hammer && Ocarina && SongOfTime && EponasSong && SunsSong && SongOfStorms && ZeldasLullaby;}}), + LocationAccess(RC_SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST, {[]{return true;}}), + LocationAccess(RC_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST, {[]{return SmallKeys(RR_SPIRIT_TEMPLE, 7) && Hammer && Ocarina && SongOfTime && EponasSong && SunsSong && SongOfStorms && ZeldasLullaby;}}), + LocationAccess(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST, {[]{return Hammer;}}), + LocationAccess(RC_SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM, {[]{return true;}}), + LocationAccess(RC_SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM, {[]{return SmallKeys(RR_SPIRIT_TEMPLE, 7) && Hammer && Ocarina && SongOfTime && EponasSong && SunsSong && SongOfStorms && ZeldasLullaby;}}), }, {}); - areaTable[SPIRIT_TEMPLE_MQ_BOSS_AREA] = Area("Spirit Temple MQ Boss Area", "Spirit Temple", SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_BOSS_AREA] = Area("Spirit Temple MQ Boss Area", "Spirit Temple", RHT_SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST, {[]{return LogicLensSpiritMQ || CanUse(LENS_OF_TRUTH);}}), + LocationAccess(RC_SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST, {[]{return LogicLensSpiritMQ || CanUse(RG_LENS_OF_TRUTH);}}), }, { //Exits - Entrance(SPIRIT_TEMPLE_MQ_INSIDE_STATUE_HEAD, {[]{return MirrorShield && Hookshot;}}), + Entrance(RR_SPIRIT_TEMPLE_MQ_INSIDE_STATUE_HEAD, {[]{return MirrorShield && Hookshot;}}), }); - areaTable[SPIRIT_TEMPLE_MQ_INSIDE_STATUE_HEAD] = - Area("Spirit Temple MQ Inside Statue Head", "Spirit Temple", SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, + areaTable[RR_SPIRIT_TEMPLE_MQ_INSIDE_STATUE_HEAD] = + Area("Spirit Temple MQ Inside Statue Head", "Spirit Temple", RHT_SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { // Exits - Entrance(SPIRIT_TEMPLE_MQ_SHARED, { [] { return true; } }), - Entrance(SPIRIT_TEMPLE_BOSS_ENTRYWAY, { [] { return BossKeySpiritTemple; } }), + Entrance(RR_SPIRIT_TEMPLE_MQ_SHARED, { [] { return true; } }), + Entrance(RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY, { [] { return BossKeySpiritTemple; } }), }); - areaTable[SPIRIT_TEMPLE_MQ_MIRROR_SHIELD_HAND] = Area("Spirit Temple MQ Mirror Shield Hand", "Spirit Temple", SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_MIRROR_SHIELD_HAND] = Area("Spirit Temple MQ Mirror Shield Hand", "Spirit Temple", RHT_SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, {[]{return true;}}), + LocationAccess(RC_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, {[]{return true;}}), }, {}); - areaTable[SPIRIT_TEMPLE_MQ_SILVER_GAUNTLETS_HAND] = Area("Spirit Temple MQ Silver Gauntlets Hand", "Spirit Temple", SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_SILVER_GAUNTLETS_HAND] = Area("Spirit Temple MQ Silver Gauntlets Hand", "Spirit Temple", RHT_SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, {[]{return true;}}), + LocationAccess(RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, {[]{return true;}}), }, {}); } /*--------------------------- | BOSS ROOM | ---------------------------*/ - areaTable[SPIRIT_TEMPLE_BOSS_ENTRYWAY] = Area( - "Spirit Temple Boss Entryway", "Spirit Temple", SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, + areaTable[RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY] = Area( + "Spirit Temple Boss Entryway", "Spirit Temple", RHT_SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { // Exits - Entrance(SPIRIT_TEMPLE_INSIDE_STATUE_HEAD, { [] { return Dungeon::SpiritTemple.IsVanilla() && false; } }), - Entrance(SPIRIT_TEMPLE_MQ_INSIDE_STATUE_HEAD, { [] { return Dungeon::SpiritTemple.IsMQ() && false; } }), - Entrance(SPIRIT_TEMPLE_BOSS_ROOM, { [] { return true; } }), + Entrance(RR_SPIRIT_TEMPLE_INSIDE_STATUE_HEAD, { [] { return Dungeon::SpiritTemple.IsVanilla() && false; } }), + Entrance(RR_SPIRIT_TEMPLE_MQ_INSIDE_STATUE_HEAD, { [] { return Dungeon::SpiritTemple.IsMQ() && false; } }), + Entrance(RR_SPIRIT_TEMPLE_BOSS_ROOM, { [] { return true; } }), }); - areaTable[SPIRIT_TEMPLE_BOSS_ROOM] = Area( - "Spirit Temple Boss Room", "Spirit Temple", NONE, NO_DAY_NIGHT_CYCLE, + areaTable[RR_SPIRIT_TEMPLE_BOSS_ROOM] = Area( + "Spirit Temple Boss Room", "Spirit Temple", RHT_NONE, NO_DAY_NIGHT_CYCLE, { // Events EventAccess(&SpiritTempleClear, { [] { - return SpiritTempleClear || (CanUse(MIRROR_SHIELD) && - (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD))); + return SpiritTempleClear || (CanUse(RG_MIRROR_SHIELD) && + (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD))); } }), }, { // Locations - LocationAccess(SPIRIT_TEMPLE_TWINROVA_HEART, { [] { return SpiritTempleClear; } }), - LocationAccess(TWINROVA, { [] { return SpiritTempleClear; } }), + LocationAccess(RC_SPIRIT_TEMPLE_TWINROVA_HEART, { [] { return SpiritTempleClear; } }), + LocationAccess(RC_TWINROVA, { [] { return SpiritTempleClear; } }), }, { // Exits - Entrance(SPIRIT_TEMPLE_BOSS_ENTRYWAY, { [] { return false; } }), + Entrance(RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY, { [] { return false; } }), }); } 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 79d9dff7c..3b8ea8356 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 @@ -10,11 +10,11 @@ void AreaTable_Init_WaterTemple() { /*-------------------------- | VANILLA/MQ DECIDER | ---------------------------*/ - areaTable[WATER_TEMPLE_ENTRYWAY] = Area("Water Temple Entryway", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_ENTRYWAY] = Area("Water Temple Entryway", "Water Temple", RHT_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(WATER_TEMPLE_LOBBY, {[]{return Dungeon::WaterTemple.IsVanilla();}}), - Entrance(WATER_TEMPLE_MQ_LOBBY, {[]{return Dungeon::WaterTemple.IsMQ();}}), - Entrance(LAKE_HYLIA, {[]{return true;}}), + Entrance(RR_WATER_TEMPLE_LOBBY, {[]{return Dungeon::WaterTemple.IsVanilla();}}), + Entrance(RR_WATER_TEMPLE_MQ_LOBBY, {[]{return Dungeon::WaterTemple.IsMQ();}}), + Entrance(RR_LAKE_HYLIA, {[]{return true;}}), }); /*-------------------------- @@ -22,230 +22,230 @@ void AreaTable_Init_WaterTemple() { ---------------------------*/ if (Dungeon::WaterTemple.IsVanilla()) { //Water Temple logic currently assumes that the locked door leading to the upper water raising location is unlocked from the start - areaTable[WATER_TEMPLE_LOBBY] = Area("Water Temple Lobby", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_LOBBY] = Area("Water Temple Lobby", "Water Temple", RHT_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(WATER_TEMPLE_ENTRYWAY, {[]{return true;}}), - Entrance(WATER_TEMPLE_EAST_LOWER, {[]{return WaterTempleLow || ((LogicFewerTunicRequirements || CanUse(ZORA_TUNIC)) && (CanUse(IRON_BOOTS) || (CanUse(LONGSHOT) && LogicWaterTempleTorchLongshot)));}}), - Entrance(WATER_TEMPLE_NORTH_LOWER, {[]{return WaterTempleLow || ((LogicFewerTunicRequirements || CanUse(ZORA_TUNIC)) && CanUse(IRON_BOOTS));}}), - Entrance(WATER_TEMPLE_SOUTH_LOWER, {[]{return WaterTempleLow && HasExplosives && (CanDive || CanUse(IRON_BOOTS)) && (LogicFewerTunicRequirements || CanUse(ZORA_TUNIC));}}), - Entrance(WATER_TEMPLE_WEST_LOWER, {[]{return WaterTempleLow && GoronBracelet && (IsChild || CanDive || CanUse(IRON_BOOTS)) && (LogicFewerTunicRequirements || CanUse(ZORA_TUNIC));}}), - Entrance(WATER_TEMPLE_CENTRAL_PILLAR_LOWER, {[]{return WaterTempleLow && SmallKeys(WATER_TEMPLE, 5);}}), - Entrance(WATER_TEMPLE_CENTRAL_PILLAR_UPPER, {[]{return (WaterTempleLow || WaterTempleMiddle) && (HasFireSourceWithTorch || CanUse(BOW));}}), - Entrance(WATER_TEMPLE_EAST_MIDDLE, {[]{return (WaterTempleLow || WaterTempleMiddle || (CanUse(IRON_BOOTS) && WaterTimer >= 16)) && CanUse(HOOKSHOT);}}), - Entrance(WATER_TEMPLE_WEST_MIDDLE, {[]{return WaterTempleMiddle;}}), - Entrance(WATER_TEMPLE_HIGH_WATER, {[]{return IsAdult && (CanUse(HOVER_BOOTS) || (LogicDamageBoost && Bombs && CanTakeDamage));}}), - Entrance(WATER_TEMPLE_BLOCK_CORRIDOR, {[]{return (WaterTempleLow || WaterTempleMiddle) && (CanUse(SLINGSHOT) || CanUse(BOW)) && (CanUse(LONGSHOT) || CanUse(HOVER_BOOTS) || (LogicWaterCentralBow && (IsAdult || WaterTempleMiddle)));}}), - Entrance(WATER_TEMPLE_FALLING_PLATFORM_ROOM, {[]{return WaterTempleHigh && SmallKeys(WATER_TEMPLE, 4);}}), - Entrance(WATER_TEMPLE_PRE_BOSS_ROOM, {[]{return WaterTempleHigh && CanUse(LONGSHOT);}}), + Entrance(RR_WATER_TEMPLE_ENTRYWAY, {[]{return true;}}), + Entrance(RR_WATER_TEMPLE_EAST_LOWER, {[]{return WaterTempleLow || ((LogicFewerTunicRequirements || CanUse(RG_ZORA_TUNIC)) && (CanUse(RG_IRON_BOOTS) || (CanUse(RG_LONGSHOT) && LogicWaterTempleTorchLongshot)));}}), + Entrance(RR_WATER_TEMPLE_NORTH_LOWER, {[]{return WaterTempleLow || ((LogicFewerTunicRequirements || CanUse(RG_ZORA_TUNIC)) && CanUse(RG_IRON_BOOTS));}}), + Entrance(RR_WATER_TEMPLE_SOUTH_LOWER, {[]{return WaterTempleLow && HasExplosives && (CanDive || CanUse(RG_IRON_BOOTS)) && (LogicFewerTunicRequirements || CanUse(RG_ZORA_TUNIC));}}), + Entrance(RR_WATER_TEMPLE_WEST_LOWER, {[]{return WaterTempleLow && GoronBracelet && (IsChild || CanDive || CanUse(RG_IRON_BOOTS)) && (LogicFewerTunicRequirements || CanUse(RG_ZORA_TUNIC));}}), + Entrance(RR_WATER_TEMPLE_CENTRAL_PILLAR_LOWER, {[]{return WaterTempleLow && SmallKeys(RR_WATER_TEMPLE, 5);}}), + Entrance(RR_WATER_TEMPLE_CENTRAL_PILLAR_UPPER, {[]{return (WaterTempleLow || WaterTempleMiddle) && (HasFireSourceWithTorch || CanUse(RG_FAIRY_BOW));}}), + Entrance(RR_WATER_TEMPLE_EAST_MIDDLE, {[]{return (WaterTempleLow || WaterTempleMiddle || (CanUse(RG_IRON_BOOTS) && WaterTimer >= 16)) && CanUse(RG_HOOKSHOT);}}), + Entrance(RR_WATER_TEMPLE_WEST_MIDDLE, {[]{return WaterTempleMiddle;}}), + Entrance(RR_WATER_TEMPLE_HIGH_WATER, {[]{return IsAdult && (CanUse(RG_HOVER_BOOTS) || (LogicDamageBoost && Bombs && CanTakeDamage));}}), + Entrance(RR_WATER_TEMPLE_BLOCK_CORRIDOR, {[]{return (WaterTempleLow || WaterTempleMiddle) && (CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW)) && (CanUse(RG_LONGSHOT) || CanUse(RG_HOVER_BOOTS) || (LogicWaterCentralBow && (IsAdult || WaterTempleMiddle)));}}), + Entrance(RR_WATER_TEMPLE_FALLING_PLATFORM_ROOM, {[]{return WaterTempleHigh && SmallKeys(RR_WATER_TEMPLE, 4);}}), + Entrance(RR_WATER_TEMPLE_PRE_BOSS_ROOM, {[]{return WaterTempleHigh && CanUse(RG_LONGSHOT);}}), }); - areaTable[WATER_TEMPLE_EAST_LOWER] = Area("Water Temple East Lower", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_EAST_LOWER] = Area("Water Temple East Lower", "Water Temple", RHT_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&WaterTempleLow, {[]{return WaterTempleLow || CanPlay(ZeldasLullaby);}}), }, {}, { //Exits - Entrance(WATER_TEMPLE_LOBBY, {[]{return WaterTempleLow || ((LogicFewerTunicRequirements || CanUse(ZORA_TUNIC)) && CanUse(IRON_BOOTS));}}), - Entrance(WATER_TEMPLE_MAP_ROOM, {[]{return WaterTempleHigh;}}), - Entrance(WATER_TEMPLE_CRACKED_WALL, {[]{return WaterTempleMiddle || (WaterTempleHigh && WaterTempleLow && ((CanUse(HOVER_BOOTS) && LogicWaterCrackedWallHovers) || LogicWaterCrackedWallNothing));}}), - Entrance(WATER_TEMPLE_TORCH_ROOM, {[]{return WaterTempleLow && (HasFireSourceWithTorch || CanUse(BOW));}}), + Entrance(RR_WATER_TEMPLE_LOBBY, {[]{return WaterTempleLow || ((LogicFewerTunicRequirements || CanUse(RG_ZORA_TUNIC)) && CanUse(RG_IRON_BOOTS));}}), + Entrance(RR_WATER_TEMPLE_MAP_ROOM, {[]{return WaterTempleHigh;}}), + Entrance(RR_WATER_TEMPLE_CRACKED_WALL, {[]{return WaterTempleMiddle || (WaterTempleHigh && WaterTempleLow && ((CanUse(RG_HOVER_BOOTS) && LogicWaterCrackedWallHovers) || LogicWaterCrackedWallNothing));}}), + Entrance(RR_WATER_TEMPLE_TORCH_ROOM, {[]{return WaterTempleLow && (HasFireSourceWithTorch || CanUse(RG_FAIRY_BOW));}}), }); - areaTable[WATER_TEMPLE_MAP_ROOM] = Area("Water Temple Map Room", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MAP_ROOM] = Area("Water Temple Map Room", "Water Temple", RHT_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(WATER_TEMPLE_MAP_CHEST, {[]{return (MagicMeter && CanUse(KOKIRI_SWORD)) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(HOOKSHOT);}}), + LocationAccess(RC_WATER_TEMPLE_MAP_CHEST, {[]{return (MagicMeter && CanUse(RG_KOKIRI_SWORD)) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_HOOKSHOT);}}), }, { //Exits - Entrance(WATER_TEMPLE_EAST_LOWER, {[]{return (MagicMeter && CanUse(KOKIRI_SWORD)) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(HOOKSHOT);}}), + Entrance(RR_WATER_TEMPLE_EAST_LOWER, {[]{return (MagicMeter && CanUse(RG_KOKIRI_SWORD)) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_HOOKSHOT);}}), }); - areaTable[WATER_TEMPLE_CRACKED_WALL] = Area("Water Temple Cracked Wall", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_CRACKED_WALL] = Area("Water Temple Cracked Wall", "Water Temple", RHT_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(WATER_TEMPLE_CRACKED_WALL_CHEST, {[]{return HasExplosives;}}), + LocationAccess(RC_WATER_TEMPLE_CRACKED_WALL_CHEST, {[]{return HasExplosives;}}), }, { //Exits - Entrance(WATER_TEMPLE_EAST_LOWER, {[]{return true;}}), + Entrance(RR_WATER_TEMPLE_EAST_LOWER, {[]{return true;}}), }); - areaTable[WATER_TEMPLE_TORCH_ROOM] = Area("Water Temple Torch Room", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_TORCH_ROOM] = Area("Water Temple Torch Room", "Water Temple", RHT_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(WATER_TEMPLE_TORCHES_CHEST, {[]{return (MagicMeter && CanUse(KOKIRI_SWORD)) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(HOOKSHOT);}}), + LocationAccess(RC_WATER_TEMPLE_TORCHES_CHEST, {[]{return (MagicMeter && CanUse(RG_KOKIRI_SWORD)) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_HOOKSHOT);}}), }, { //Exits - Entrance(WATER_TEMPLE_EAST_LOWER, {[]{return (MagicMeter && CanUse(KOKIRI_SWORD)) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(HOOKSHOT);}}), + Entrance(RR_WATER_TEMPLE_EAST_LOWER, {[]{return (MagicMeter && CanUse(RG_KOKIRI_SWORD)) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_HOOKSHOT);}}), }); - areaTable[WATER_TEMPLE_NORTH_LOWER] = Area("Water Temple North Lower", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_NORTH_LOWER] = Area("Water Temple North Lower", "Water Temple", RHT_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(WATER_TEMPLE_LOBBY, {[]{return true;}}), - Entrance(WATER_TEMPLE_BOULDERS_LOWER, {[]{return (CanUse(LONGSHOT) || (LogicWaterBossKeyRegion && CanUse(HOVER_BOOTS))) && SmallKeys(WATER_TEMPLE, 4);}}), + Entrance(RR_WATER_TEMPLE_LOBBY, {[]{return true;}}), + Entrance(RR_WATER_TEMPLE_BOULDERS_LOWER, {[]{return (CanUse(RG_LONGSHOT) || (LogicWaterBossKeyRegion && CanUse(RG_HOVER_BOOTS))) && SmallKeys(RR_WATER_TEMPLE, 4);}}), }); - areaTable[WATER_TEMPLE_BOULDERS_LOWER] = Area("Water Temple Boulders Lower", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_BOULDERS_LOWER] = Area("Water Temple Boulders Lower", "Water Temple", RHT_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST, {[]{return CanUse(LONGSHOT) || Here(WATER_TEMPLE_BOULDERS_UPPER, []{return (IsAdult && HookshotOrBoomerang) || (CanUse(IRON_BOOTS) && CanUse(HOOKSHOT));});}}), + LocationAccess(RC_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST, {[]{return CanUse(RG_LONGSHOT) || Here(RR_WATER_TEMPLE_BOULDERS_UPPER, []{return (IsAdult && HookshotOrBoomerang) || (CanUse(RG_IRON_BOOTS) && CanUse(RG_HOOKSHOT));});}}), }, { //Exits - Entrance(WATER_TEMPLE_NORTH_LOWER, {[]{return SmallKeys(WATER_TEMPLE, 4);}}), - Entrance(WATER_TEMPLE_BLOCK_ROOM, {[]{return true;}}), - Entrance(WATER_TEMPLE_BOULDERS_UPPER, {[]{return (IsAdult && (CanUse(HOVER_BOOTS) || LogicWaterNorthBasementLedgeJump)) || (CanUse(HOVER_BOOTS) && CanUse(IRON_BOOTS));}}), + Entrance(RR_WATER_TEMPLE_NORTH_LOWER, {[]{return SmallKeys(RR_WATER_TEMPLE, 4);}}), + Entrance(RR_WATER_TEMPLE_BLOCK_ROOM, {[]{return true;}}), + Entrance(RR_WATER_TEMPLE_BOULDERS_UPPER, {[]{return (IsAdult && (CanUse(RG_HOVER_BOOTS) || LogicWaterNorthBasementLedgeJump)) || (CanUse(RG_HOVER_BOOTS) && CanUse(RG_IRON_BOOTS));}}), }); - areaTable[WATER_TEMPLE_BLOCK_ROOM] = Area("Water Temple Block Room", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_BLOCK_ROOM] = Area("Water Temple Block Room", "Water Temple", RHT_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(WATER_TEMPLE_BOULDERS_LOWER, {[]{return (GoronBracelet && HasExplosives) || CanUse(HOOKSHOT);}}), - Entrance(WATER_TEMPLE_JETS_ROOM, {[]{return (GoronBracelet && HasExplosives) || (CanUse(HOOKSHOT) && CanUse(HOVER_BOOTS));}}), + Entrance(RR_WATER_TEMPLE_BOULDERS_LOWER, {[]{return (GoronBracelet && HasExplosives) || CanUse(RG_HOOKSHOT);}}), + Entrance(RR_WATER_TEMPLE_JETS_ROOM, {[]{return (GoronBracelet && HasExplosives) || (CanUse(RG_HOOKSHOT) && CanUse(RG_HOVER_BOOTS));}}), }); - areaTable[WATER_TEMPLE_JETS_ROOM] = Area("Water Temple Jets Room", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_JETS_ROOM] = Area("Water Temple Jets Room", "Water Temple", RHT_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(WATER_TEMPLE_BLOCK_ROOM, {[]{return CanUse(HOOKSHOT);}}), - Entrance(WATER_TEMPLE_BOULDERS_UPPER, {[]{return true;}}), + Entrance(RR_WATER_TEMPLE_BLOCK_ROOM, {[]{return CanUse(RG_HOOKSHOT);}}), + Entrance(RR_WATER_TEMPLE_BOULDERS_UPPER, {[]{return true;}}), }); - areaTable[WATER_TEMPLE_BOULDERS_UPPER] = Area("Water Temple Boulders Upper", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_BOULDERS_UPPER] = Area("Water Temple Boulders Upper", "Water Temple", RHT_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(WATER_TEMPLE_BOULDERS_LOWER, {[]{return true;}}), - Entrance(WATER_TEMPLE_JETS_ROOM, {[]{return IsAdult;}}), - Entrance(WATER_TEMPLE_BOSS_KEY_ROOM, {[]{return (CanUse(IRON_BOOTS) || (IsAdult && LogicWaterBKJumpDive)) && SmallKeys(WATER_TEMPLE, 5);}}), + Entrance(RR_WATER_TEMPLE_BOULDERS_LOWER, {[]{return true;}}), + Entrance(RR_WATER_TEMPLE_JETS_ROOM, {[]{return IsAdult;}}), + Entrance(RR_WATER_TEMPLE_BOSS_KEY_ROOM, {[]{return (CanUse(RG_IRON_BOOTS) || (IsAdult && LogicWaterBKJumpDive)) && SmallKeys(RR_WATER_TEMPLE, 5);}}), }); - areaTable[WATER_TEMPLE_BOSS_KEY_ROOM] = Area("Water Temple Boss Key Room", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_BOSS_KEY_ROOM] = Area("Water Temple Boss Key Room", "Water Temple", RHT_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&FairyPot, {[]{return true;}}), }, { //Locations - LocationAccess(WATER_TEMPLE_BOSS_KEY_CHEST, {[]{return true;}}), + LocationAccess(RC_WATER_TEMPLE_BOSS_KEY_CHEST, {[]{return true;}}), }, { //Exits - Entrance(WATER_TEMPLE_BOULDERS_UPPER, {[]{return (CanUse(IRON_BOOTS) || (IsAdult && LogicWaterBKJumpDive) || IsChild || CanDive) && SmallKeys(WATER_TEMPLE, 5);}}), + Entrance(RR_WATER_TEMPLE_BOULDERS_UPPER, {[]{return (CanUse(RG_IRON_BOOTS) || (IsAdult && LogicWaterBKJumpDive) || IsChild || CanDive) && SmallKeys(RR_WATER_TEMPLE, 5);}}), }); - areaTable[WATER_TEMPLE_SOUTH_LOWER] = Area("Water Temple South Lower", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_SOUTH_LOWER] = Area("Water Temple South Lower", "Water Temple", RHT_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(WATER_TEMPLE_GS_BEHIND_GATE, {[]{return CanUse(HOOKSHOT) || (IsAdult && CanUse(HOVER_BOOTS));}}), + LocationAccess(RC_WATER_TEMPLE_GS_BEHIND_GATE, {[]{return CanUse(RG_HOOKSHOT) || (IsAdult && CanUse(RG_HOVER_BOOTS));}}), }, { //Exits - Entrance(WATER_TEMPLE_LOBBY, {[]{return CanUse(IRON_BOOTS);}}), + Entrance(RR_WATER_TEMPLE_LOBBY, {[]{return CanUse(RG_IRON_BOOTS);}}), }); - areaTable[WATER_TEMPLE_WEST_LOWER] = Area("Water Temple West Lower", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_WEST_LOWER] = Area("Water Temple West Lower", "Water Temple", RHT_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(WATER_TEMPLE_LOBBY, {[]{return CanUse(HOOKSHOT) && CanUse(IRON_BOOTS) && GoronBracelet;}}), - Entrance(WATER_TEMPLE_DRAGON_ROOM, {[]{return IsAdult || CanChildAttack;}}), + Entrance(RR_WATER_TEMPLE_LOBBY, {[]{return CanUse(RG_HOOKSHOT) && CanUse(RG_IRON_BOOTS) && GoronBracelet;}}), + Entrance(RR_WATER_TEMPLE_DRAGON_ROOM, {[]{return IsAdult || CanChildAttack;}}), }); - areaTable[WATER_TEMPLE_DRAGON_ROOM] = Area("Water Temple Dragon Room", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_DRAGON_ROOM] = Area("Water Temple Dragon Room", "Water Temple", RHT_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(WATER_TEMPLE_DRAGON_CHEST, {[]{return (CanUse(HOOKSHOT) && CanUse(IRON_BOOTS)) || (((IsAdult && LogicWaterDragonAdult && (CanUse(HOOKSHOT) || CanUse(BOW) || HasBombchus)) || (IsChild && LogicWaterDragonChild && (CanUse(SLINGSHOT) || CanUse(BOOMERANG) || HasBombchus))) && (CanDive || CanUse(IRON_BOOTS))) || - Here(WATER_TEMPLE_RIVER, []{return IsAdult && CanUse(BOW) && ((LogicWaterDragonAdult && (CanDive || CanUse(IRON_BOOTS))) || LogicWaterDragonJumpDive);});}}), + LocationAccess(RC_WATER_TEMPLE_DRAGON_CHEST, {[]{return (CanUse(RG_HOOKSHOT) && CanUse(RG_IRON_BOOTS)) || (((IsAdult && LogicWaterDragonAdult && (CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW) || HasBombchus)) || (IsChild && LogicWaterDragonChild && (CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_BOOMERANG) || HasBombchus))) && (CanDive || CanUse(RG_IRON_BOOTS))) || + Here(RR_WATER_TEMPLE_RIVER, []{return IsAdult && CanUse(RG_FAIRY_BOW) && ((LogicWaterDragonAdult && (CanDive || CanUse(RG_IRON_BOOTS))) || LogicWaterDragonJumpDive);});}}), }, { //Exits - Entrance(WATER_TEMPLE_WEST_LOWER, {[]{return true;}}), + Entrance(RR_WATER_TEMPLE_WEST_LOWER, {[]{return true;}}), }); - areaTable[WATER_TEMPLE_CENTRAL_PILLAR_LOWER] = Area("Water Temple Central Pillar Lower", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_CENTRAL_PILLAR_LOWER] = Area("Water Temple Central Pillar Lower", "Water Temple", RHT_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(WATER_TEMPLE_LOBBY, {[]{return SmallKeys(WATER_TEMPLE, 5);}}), - Entrance(WATER_TEMPLE_CENTRAL_PILLAR_UPPER, {[]{return CanUse(HOOKSHOT);}}), - Entrance(WATER_TEMPLE_CENTRAL_PILLAR_BASEMENT, {[]{return WaterTempleMiddle && CanUse(IRON_BOOTS) && WaterTimer >= 40;}}), + Entrance(RR_WATER_TEMPLE_LOBBY, {[]{return SmallKeys(RR_WATER_TEMPLE, 5);}}), + Entrance(RR_WATER_TEMPLE_CENTRAL_PILLAR_UPPER, {[]{return CanUse(RG_HOOKSHOT);}}), + Entrance(RR_WATER_TEMPLE_CENTRAL_PILLAR_BASEMENT, {[]{return WaterTempleMiddle && CanUse(RG_IRON_BOOTS) && WaterTimer >= 40;}}), }); - areaTable[WATER_TEMPLE_CENTRAL_PILLAR_UPPER] = Area("Water Temple Central Pillar Upper", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_CENTRAL_PILLAR_UPPER] = Area("Water Temple Central Pillar Upper", "Water Temple", RHT_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&WaterTempleMiddle, {[]{return WaterTempleMiddle || CanPlay(ZeldasLullaby);}}), }, { //Locations - LocationAccess(WATER_TEMPLE_GS_CENTRAL_PILLAR, {[]{return CanUse(LONGSHOT) || (((LogicWaterCentralGSFW && CanUse(FARORES_WIND) && (CanUse(BOW) || CanUse(DINS_FIRE) || SmallKeys(WATER_TEMPLE, 5))) || (LogicWaterCentralGSIrons && CanUse(IRON_BOOTS) && ((CanUse(HOOKSHOT) && CanUse(BOW)) || (CanUse(DINS_FIRE))))) && WaterTempleHigh && HookshotOrBoomerang);}}), + LocationAccess(RC_WATER_TEMPLE_GS_CENTRAL_PILLAR, {[]{return CanUse(RG_LONGSHOT) || (((LogicWaterCentralGSFW && CanUse(RG_FARORES_WIND) && (CanUse(RG_FAIRY_BOW) || CanUse(RG_DINS_FIRE) || SmallKeys(RR_WATER_TEMPLE, 5))) || (LogicWaterCentralGSIrons && CanUse(RG_IRON_BOOTS) && ((CanUse(RG_HOOKSHOT) && CanUse(RG_FAIRY_BOW)) || (CanUse(RG_DINS_FIRE))))) && WaterTempleHigh && HookshotOrBoomerang);}}), }, { //Exits - Entrance(WATER_TEMPLE_LOBBY, {[]{return true;}}), - Entrance(WATER_TEMPLE_CENTRAL_PILLAR_LOWER, {[]{return true;}}), + Entrance(RR_WATER_TEMPLE_LOBBY, {[]{return true;}}), + Entrance(RR_WATER_TEMPLE_CENTRAL_PILLAR_LOWER, {[]{return true;}}), }); - areaTable[WATER_TEMPLE_CENTRAL_PILLAR_BASEMENT] = Area("Water Temple Central Pillar Basement", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_CENTRAL_PILLAR_BASEMENT] = Area("Water Temple Central Pillar Basement", "Water Temple", RHT_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(WATER_TEMPLE_CENTRAL_PILLAR_CHEST, {[]{return CanUse(HOOKSHOT) && CanUse(IRON_BOOTS) && WaterTimer >= 40;}}), + LocationAccess(RC_WATER_TEMPLE_CENTRAL_PILLAR_CHEST, {[]{return CanUse(RG_HOOKSHOT) && CanUse(RG_IRON_BOOTS) && WaterTimer >= 40;}}), }, { //Exits - Entrance(WATER_TEMPLE_CENTRAL_PILLAR_LOWER, {[]{return CanUse(IRON_BOOTS) && WaterTimer >= 16;}}), + Entrance(RR_WATER_TEMPLE_CENTRAL_PILLAR_LOWER, {[]{return CanUse(RG_IRON_BOOTS) && WaterTimer >= 16;}}), }); - areaTable[WATER_TEMPLE_EAST_MIDDLE] = Area("Water Temple East Middle", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_EAST_MIDDLE] = Area("Water Temple East Middle", "Water Temple", RHT_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(WATER_TEMPLE_COMPASS_CHEST, {[]{return CanUseProjectile;}}), + LocationAccess(RC_WATER_TEMPLE_COMPASS_CHEST, {[]{return CanUseProjectile;}}), }, { //Exits - Entrance(WATER_TEMPLE_LOBBY, {[]{return CanUse(IRON_BOOTS);}}), + Entrance(RR_WATER_TEMPLE_LOBBY, {[]{return CanUse(RG_IRON_BOOTS);}}), }); - areaTable[WATER_TEMPLE_WEST_MIDDLE] = Area("Water Temple West Middle", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_WEST_MIDDLE] = Area("Water Temple West Middle", "Water Temple", RHT_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(WATER_TEMPLE_LOBBY, {[]{return true;}}), - Entrance(WATER_TEMPLE_HIGH_WATER, {[]{return CanUseProjectile;}}), + Entrance(RR_WATER_TEMPLE_LOBBY, {[]{return true;}}), + Entrance(RR_WATER_TEMPLE_HIGH_WATER, {[]{return CanUseProjectile;}}), }); - areaTable[WATER_TEMPLE_HIGH_WATER] = Area("Water Temple High Water", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_HIGH_WATER] = Area("Water Temple High Water", "Water Temple", RHT_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&WaterTempleHigh, {[]{return WaterTempleHigh || CanPlay(ZeldasLullaby);}}), }, {}, { //Exits - Entrance(WATER_TEMPLE_LOBBY, {[]{return true;}}), + Entrance(RR_WATER_TEMPLE_LOBBY, {[]{return true;}}), }); - areaTable[WATER_TEMPLE_BLOCK_CORRIDOR] = Area("Water Temple Block Corridor", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_BLOCK_CORRIDOR] = Area("Water Temple Block Corridor", "Water Temple", RHT_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST, {[]{return GoronBracelet && (WaterTempleLow || WaterTempleMiddle);}}), + LocationAccess(RC_WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST, {[]{return GoronBracelet && (WaterTempleLow || WaterTempleMiddle);}}), }, { //Exits - Entrance(WATER_TEMPLE_LOBBY, {[]{return CanUse(HOOKSHOT);}}), + Entrance(RR_WATER_TEMPLE_LOBBY, {[]{return CanUse(RG_HOOKSHOT);}}), }); - areaTable[WATER_TEMPLE_FALLING_PLATFORM_ROOM] = Area("Water Temple Falling Platform Room", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_FALLING_PLATFORM_ROOM] = Area("Water Temple Falling Platform Room", "Water Temple", RHT_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM, {[]{return CanUse(LONGSHOT) || (LogicWaterFallingPlatformGSBoomerang && IsChild && CanUse(BOOMERANG)) || (LogicWaterFallingPlatformGSHookshot && IsAdult && CanUse(HOOKSHOT));}}), + LocationAccess(RC_WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM, {[]{return CanUse(RG_LONGSHOT) || (LogicWaterFallingPlatformGSBoomerang && IsChild && CanUse(RG_BOOMERANG)) || (LogicWaterFallingPlatformGSHookshot && IsAdult && CanUse(RG_HOOKSHOT));}}), }, { //Exits - Entrance(WATER_TEMPLE_LOBBY, {[]{return CanUse(HOOKSHOT) && SmallKeys(WATER_TEMPLE, 4);}}), - Entrance(WATER_TEMPLE_DRAGON_PILLARS_ROOM, {[]{return CanUse(HOOKSHOT) && SmallKeys(WATER_TEMPLE, 5);}}), + Entrance(RR_WATER_TEMPLE_LOBBY, {[]{return CanUse(RG_HOOKSHOT) && SmallKeys(RR_WATER_TEMPLE, 4);}}), + Entrance(RR_WATER_TEMPLE_DRAGON_PILLARS_ROOM, {[]{return CanUse(RG_HOOKSHOT) && SmallKeys(RR_WATER_TEMPLE, 5);}}), }); - areaTable[WATER_TEMPLE_DRAGON_PILLARS_ROOM] = Area("Water Temple Dragon Pillars Room", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_DRAGON_PILLARS_ROOM] = Area("Water Temple Dragon Pillars Room", "Water Temple", RHT_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(WATER_TEMPLE_FALLING_PLATFORM_ROOM, {[]{return CanUseProjectile;}}), - Entrance(WATER_TEMPLE_DARK_LINK_ROOM, {[]{return CanUse(HOOKSHOT);}}), + Entrance(RR_WATER_TEMPLE_FALLING_PLATFORM_ROOM, {[]{return CanUseProjectile;}}), + Entrance(RR_WATER_TEMPLE_DARK_LINK_ROOM, {[]{return CanUse(RG_HOOKSHOT);}}), }); - areaTable[WATER_TEMPLE_DARK_LINK_ROOM] = Area("Water Temple Dark Link Room", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_DARK_LINK_ROOM] = Area("Water Temple Dark Link Room", "Water Temple", RHT_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(WATER_TEMPLE_DRAGON_PILLARS_ROOM, {[]{return CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD);}}), - Entrance(WATER_TEMPLE_LONGSHOT_ROOM, {[]{return CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD);}}), + Entrance(RR_WATER_TEMPLE_DRAGON_PILLARS_ROOM, {[]{return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD);}}), + Entrance(RR_WATER_TEMPLE_LONGSHOT_ROOM, {[]{return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD);}}), }); - areaTable[WATER_TEMPLE_LONGSHOT_ROOM] = Area("Water Temple Longshot Room", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_LONGSHOT_ROOM] = Area("Water Temple Longshot Room", "Water Temple", RHT_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(WATER_TEMPLE_LONGSHOT_CHEST, {[]{return true;}}), + LocationAccess(RC_WATER_TEMPLE_LONGSHOT_CHEST, {[]{return true;}}), }, { //Exits - Entrance(WATER_TEMPLE_DARK_LINK_ROOM, {[]{return true;}}), - Entrance(WATER_TEMPLE_RIVER, {[]{return IsChild || CanPlay(SongOfTime);}}), + Entrance(RR_WATER_TEMPLE_DARK_LINK_ROOM, {[]{return true;}}), + Entrance(RR_WATER_TEMPLE_RIVER, {[]{return IsChild || CanPlay(SongOfTime);}}), }); - areaTable[WATER_TEMPLE_RIVER] = Area("Water Temple River", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_RIVER] = Area("Water Temple River", "Water Temple", RHT_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(WATER_TEMPLE_RIVER_CHEST, {[]{return (CanUse(SLINGSHOT) || CanUse(BOW)) && (IsAdult || CanUse(HOVER_BOOTS) || CanUse(HOOKSHOT));}}), - LocationAccess(WATER_TEMPLE_GS_RIVER, {[]{return (CanUse(IRON_BOOTS) && CanUse(HOOKSHOT)) || (LogicWaterRiverGS && CanUse(LONGSHOT));}}), + LocationAccess(RC_WATER_TEMPLE_RIVER_CHEST, {[]{return (CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW)) && (IsAdult || CanUse(RG_HOVER_BOOTS) || CanUse(RG_HOOKSHOT));}}), + LocationAccess(RC_WATER_TEMPLE_GS_RIVER, {[]{return (CanUse(RG_IRON_BOOTS) && CanUse(RG_HOOKSHOT)) || (LogicWaterRiverGS && CanUse(RG_LONGSHOT));}}), }, { //Exits - Entrance(WATER_TEMPLE_DRAGON_ROOM, {[]{return (CanUse(SLINGSHOT) || CanUse(BOW)) && (IsAdult || CanUse(HOVER_BOOTS) || CanUse(HOOKSHOT));}}), + Entrance(RR_WATER_TEMPLE_DRAGON_ROOM, {[]{return (CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW)) && (IsAdult || CanUse(RG_HOVER_BOOTS) || CanUse(RG_HOOKSHOT));}}), }); - areaTable[WATER_TEMPLE_PRE_BOSS_ROOM] = Area("Water Temple Pre Boss Room", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_PRE_BOSS_ROOM] = Area("Water Temple Pre Boss Room", "Water Temple", RHT_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&FairyPot, {[]{return true;}}), }, {}, { //Exits - Entrance(WATER_TEMPLE_LOBBY, {[]{return true;}}), - Entrance(WATER_TEMPLE_BOSS_ENTRYWAY, {[]{return BossKeyWaterTemple;}}), + Entrance(RR_WATER_TEMPLE_LOBBY, {[]{return true;}}), + Entrance(RR_WATER_TEMPLE_BOSS_ENTRYWAY, {[]{return BossKeyWaterTemple;}}), }); } @@ -253,82 +253,82 @@ void AreaTable_Init_WaterTemple() { | MASTER QUEST DUNGEON | ---------------------------*/ if (Dungeon::WaterTemple.IsMQ()) { - areaTable[WATER_TEMPLE_MQ_LOBBY] = Area("Water Temple MQ Lobby", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_LOBBY] = Area("Water Temple MQ Lobby", "Water Temple", RHT_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(WATER_TEMPLE_ENTRYWAY, {[]{return true;}}), - Entrance(WATER_TEMPLE_MQ_DIVE, {[]{return IsAdult && WaterTimer >= 24 && CanUse(IRON_BOOTS);}}), - Entrance(WATER_TEMPLE_MQ_DARK_LINK_REGION, {[]{return SmallKeys(WATER_TEMPLE, 1) && IsAdult && CanUse(LONGSHOT);}}), - Entrance(WATER_TEMPLE_BOSS_ENTRYWAY, {[]{return BossKeyWaterTemple && IsAdult && CanUse(LONGSHOT);}}), + Entrance(RR_WATER_TEMPLE_ENTRYWAY, {[]{return true;}}), + Entrance(RR_WATER_TEMPLE_MQ_DIVE, {[]{return IsAdult && WaterTimer >= 24 && CanUse(RG_IRON_BOOTS);}}), + Entrance(RR_WATER_TEMPLE_MQ_DARK_LINK_REGION, {[]{return SmallKeys(RR_WATER_TEMPLE, 1) && IsAdult && CanUse(RG_LONGSHOT);}}), + Entrance(RR_WATER_TEMPLE_BOSS_ENTRYWAY, {[]{return BossKeyWaterTemple && IsAdult && CanUse(RG_LONGSHOT);}}), }); - areaTable[WATER_TEMPLE_MQ_DIVE] = Area("Water Temple MQ Dive", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MQ_DIVE] = Area("Water Temple MQ Dive", "Water Temple", RHT_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(WATER_TEMPLE_MQ_MAP_CHEST, {[]{return HasFireSource && IsAdult && CanUse(HOOKSHOT);}}), - LocationAccess(WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, {[]{return IsAdult && CanUse(ZORA_TUNIC) && CanUse(HOOKSHOT) && ((LogicWaterMQCentralPillar && CanUse(FIRE_ARROWS)) || (CanUse(DINS_FIRE) && CanPlay(SongOfTime)));}}), - //Trick: IsAdult && CanUse(ZORA_TUNIC) && CanUse(HOOKSHOT) && ((LogicWaterMQCentralPillar && CanUse(FIRE_ARROWS)) || (CanUse(DINS_FIRE) && CanPlay(SongOfTime))) + LocationAccess(RC_WATER_TEMPLE_MQ_MAP_CHEST, {[]{return HasFireSource && IsAdult && CanUse(RG_HOOKSHOT);}}), + LocationAccess(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, {[]{return IsAdult && CanUse(RG_ZORA_TUNIC) && CanUse(RG_HOOKSHOT) && ((LogicWaterMQCentralPillar && CanUse(RG_FIRE_ARROWS)) || (CanUse(RG_DINS_FIRE) && CanPlay(SongOfTime)));}}), + //Trick: IsAdult && CanUse(RG_ZORA_TUNIC) && CanUse(RG_HOOKSHOT) && ((LogicWaterMQCentralPillar && CanUse(RG_FIRE_ARROWS)) || (CanUse(RG_DINS_FIRE) && CanPlay(SongOfTime))) }, { //Exits - Entrance(WATER_TEMPLE_MQ_LOWERED_WATER_LEVELS, {[]{return CanPlay(ZeldasLullaby);}}), + Entrance(RR_WATER_TEMPLE_MQ_LOWERED_WATER_LEVELS, {[]{return CanPlay(ZeldasLullaby);}}), }); - areaTable[WATER_TEMPLE_MQ_LOWERED_WATER_LEVELS] = Area("Water Temple MQ Lowered Water Levels", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MQ_LOWERED_WATER_LEVELS] = Area("Water Temple MQ Lowered Water Levels", "Water Temple", RHT_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(WATER_TEMPLE_MQ_COMPASS_CHEST, {[]{return (IsAdult && CanUse(BOW)) || CanUse(DINS_FIRE) || Here(WATER_TEMPLE_MQ_LOBBY, []{return IsChild && CanUse(STICKS) && HasExplosives;});}}), - LocationAccess(WATER_TEMPLE_MQ_LONGSHOT_CHEST, {[]{return IsAdult && CanUse(HOOKSHOT);}}), - LocationAccess(WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, {[]{return CanUse(DINS_FIRE);}}), - LocationAccess(WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH, {[]{return IsAdult && CanUse(LONGSHOT);}}), + LocationAccess(RC_WATER_TEMPLE_MQ_COMPASS_CHEST, {[]{return (IsAdult && CanUse(RG_FAIRY_BOW)) || CanUse(RG_DINS_FIRE) || Here(RR_WATER_TEMPLE_MQ_LOBBY, []{return IsChild && CanUse(RG_STICKS) && HasExplosives;});}}), + LocationAccess(RC_WATER_TEMPLE_MQ_LONGSHOT_CHEST, {[]{return IsAdult && CanUse(RG_HOOKSHOT);}}), + LocationAccess(RC_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, {[]{return CanUse(RG_DINS_FIRE);}}), + LocationAccess(RC_WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH, {[]{return IsAdult && CanUse(RG_LONGSHOT);}}), }, {}); - areaTable[WATER_TEMPLE_MQ_DARK_LINK_REGION] = Area("Water Temple MQ Dark Link Region", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_MQ_DARK_LINK_REGION] = Area("Water Temple MQ Dark Link Region", "Water Temple", RHT_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&FairyPot, {[]{return true;}}), EventAccess(&NutPot, {[]{return true;}}), }, { //Locations - LocationAccess(WATER_TEMPLE_MQ_BOSS_KEY_CHEST, {[]{return IsAdult && WaterTimer >= 24 && CanUse(DINS_FIRE) && (LogicWaterDragonJumpDive || CanDive || CanUse(IRON_BOOTS));}}), - LocationAccess(WATER_TEMPLE_MQ_GS_RIVER, {[]{return true;}}), + LocationAccess(RC_WATER_TEMPLE_MQ_BOSS_KEY_CHEST, {[]{return IsAdult && WaterTimer >= 24 && CanUse(RG_DINS_FIRE) && (LogicWaterDragonJumpDive || CanDive || CanUse(RG_IRON_BOOTS));}}), + LocationAccess(RC_WATER_TEMPLE_MQ_GS_RIVER, {[]{return true;}}), }, { //Exits - Entrance(WATER_TEMPLE_MQ_BASEMENT_GATED_AREAS, {[]{return IsAdult && WaterTimer >= 24 && CanUse(DINS_FIRE) && CanUse(IRON_BOOTS);}}), + Entrance(RR_WATER_TEMPLE_MQ_BASEMENT_GATED_AREAS, {[]{return IsAdult && WaterTimer >= 24 && CanUse(RG_DINS_FIRE) && CanUse(RG_IRON_BOOTS);}}), }); - areaTable[WATER_TEMPLE_MQ_BASEMENT_GATED_AREAS] = Area("Water Temple MQ Basement Gated Areas", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MQ_BASEMENT_GATED_AREAS] = Area("Water Temple MQ Basement Gated Areas", "Water Temple", RHT_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(WATER_TEMPLE_MQ_FREESTANDING_KEY, {[]{return HoverBoots || CanUse(SCARECROW) || LogicWaterNorthBasementLedgeJump;}}), - LocationAccess(WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, {[]{return CanUse(FIRE_ARROWS) && (HoverBoots || CanUse(SCARECROW));}}), - LocationAccess(WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, {[]{return LogicWaterMQLockedGS || (SmallKeys(WATER_TEMPLE, 2) && (HoverBoots || CanUse(SCARECROW) || LogicWaterNorthBasementLedgeJump));}}), - //Trick: LogicWaterMQLockedGS || (SmallKeys(WATER_TEMPLE, 2) && (HoverBoots || CanUse(SCARECROW) || LogicWaterNorthBasementLedgeJump)) + LocationAccess(RC_WATER_TEMPLE_MQ_FREESTANDING_KEY, {[]{return HoverBoots || CanUse(RG_SCARECROW) || LogicWaterNorthBasementLedgeJump;}}), + LocationAccess(RC_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, {[]{return CanUse(RG_FIRE_ARROWS) && (HoverBoots || CanUse(RG_SCARECROW));}}), + LocationAccess(RC_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, {[]{return LogicWaterMQLockedGS || (SmallKeys(RR_WATER_TEMPLE, 2) && (HoverBoots || CanUse(RG_SCARECROW) || LogicWaterNorthBasementLedgeJump));}}), + //Trick: LogicWaterMQLockedGS || (SmallKeys(RR_WATER_TEMPLE, 2) && (HoverBoots || CanUse(RG_SCARECROW) || LogicWaterNorthBasementLedgeJump)) }, {}); } /*--------------------------- | BOSS ROOM | ---------------------------*/ - areaTable[WATER_TEMPLE_BOSS_ENTRYWAY] = - Area("Water Temple Boss Entryway", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, + areaTable[RR_WATER_TEMPLE_BOSS_ENTRYWAY] = + Area("Water Temple Boss Entryway", "Water Temple", RHT_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { // Exits - Entrance(WATER_TEMPLE_PRE_BOSS_ROOM, { [] { return Dungeon::WaterTemple.IsVanilla() && false; } }), - Entrance(WATER_TEMPLE_MQ_LOBBY, { [] { return Dungeon::WaterTemple.IsMQ() && false; } }), - Entrance(WATER_TEMPLE_BOSS_ROOM, { [] { return true; } }), + Entrance(RR_WATER_TEMPLE_PRE_BOSS_ROOM, { [] { return Dungeon::WaterTemple.IsVanilla() && false; } }), + Entrance(RR_WATER_TEMPLE_MQ_LOBBY, { [] { return Dungeon::WaterTemple.IsMQ() && false; } }), + Entrance(RR_WATER_TEMPLE_BOSS_ROOM, { [] { return true; } }), }); - areaTable[WATER_TEMPLE_BOSS_ROOM] = Area( - "Water Temple Boss Room", "Water Temple", NONE, NO_DAY_NIGHT_CYCLE, + areaTable[RR_WATER_TEMPLE_BOSS_ROOM] = Area( + "Water Temple Boss Room", "Water Temple", RHT_NONE, NO_DAY_NIGHT_CYCLE, { // Events EventAccess(&WaterTempleClear, { [] { return WaterTempleClear || - (CanUse(HOOKSHOT) && (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD))); + (CanUse(RG_HOOKSHOT) && (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD))); } }), }, { // Locations - LocationAccess(WATER_TEMPLE_MORPHA_HEART, { [] { return WaterTempleClear; } }), - LocationAccess(MORPHA, { [] { return WaterTempleClear; } }), + LocationAccess(RC_WATER_TEMPLE_MORPHA_HEART, { [] { return WaterTempleClear; } }), + LocationAccess(RC_MORPHA, { [] { return WaterTempleClear; } }), }, { // Exits - Entrance(WATER_TEMPLE_BOSS_ENTRYWAY, { [] { return false; } }), + Entrance(RR_WATER_TEMPLE_BOSS_ENTRYWAY, { [] { return false; } }), }); } 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 6d46e783e..4fcb7bcef 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 @@ -6,81 +6,81 @@ using namespace Logic; using namespace Settings; void AreaTable_Init_ZorasDomain() { - areaTable[ZR_FRONT] = Area("ZR Front", "Zora River", ZORAS_RIVER, DAY_NIGHT_CYCLE, {}, { + areaTable[RR_ZR_FRONT] = Area("ZR Front", "Zora River", RHT_ZORAS_RIVER, DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(ZR_GS_TREE, {[]{return IsChild && CanChildAttack;}}), + LocationAccess(RC_ZR_GS_TREE, {[]{return IsChild && CanChildAttack;}}), }, { //Exits - Entrance(ZORAS_RIVER, {[]{return IsAdult || CanBlastOrSmash;}}), - Entrance(HYRULE_FIELD, {[]{return true;}}), + Entrance(RR_ZORAS_RIVER, {[]{return IsAdult || CanBlastOrSmash;}}), + Entrance(RR_HYRULE_FIELD, {[]{return true;}}), }); - areaTable[ZORAS_RIVER] = Area("Zora River", "Zora River", ZORAS_RIVER, DAY_NIGHT_CYCLE, { + areaTable[RR_ZORAS_RIVER] = Area("Zora River", "Zora River", RHT_ZORAS_RIVER, DAY_NIGHT_CYCLE, { //Events EventAccess(&GossipStoneFairy, {[]{return GossipStoneFairy || CanSummonGossipFairy;}}), - EventAccess(&BeanPlantFairy, {[]{return BeanPlantFairy || (CanPlantBean(ZORAS_RIVER) && CanPlay(SongOfStorms));}}), - EventAccess(&ButterflyFairy, {[]{return ButterflyFairy || CanUse(STICKS);}}), + EventAccess(&BeanPlantFairy, {[]{return BeanPlantFairy || (CanPlantBean(RR_ZORAS_RIVER) && CanPlay(SongOfStorms));}}), + EventAccess(&ButterflyFairy, {[]{return ButterflyFairy || CanUse(RG_STICKS);}}), EventAccess(&BugShrub, {[]{return BugShrub || CanCutShrubs;}}), }, { //Locations - LocationAccess(ZR_MAGIC_BEAN_SALESMAN, {[]{return IsChild;}}), - LocationAccess(ZR_FROGS_OCARINA_GAME, {[]{return IsChild && CanPlay(ZeldasLullaby) && CanPlay(SariasSong) && CanPlay(SunsSong) && CanPlay(EponasSong) && CanPlay(SongOfTime) && CanPlay(SongOfStorms);}}), - LocationAccess(ZR_FROGS_IN_THE_RAIN, {[]{return IsChild && CanPlay(SongOfStorms);}}), - LocationAccess(ZR_FROGS_ZELDAS_LULLABY, {[]{return IsChild && CanPlay(ZeldasLullaby);}}), - LocationAccess(ZR_FROGS_EPONAS_SONG, {[]{return IsChild && CanPlay(EponasSong);}}), - LocationAccess(ZR_FROGS_SARIAS_SONG, {[]{return IsChild && CanPlay(SariasSong);}}), - LocationAccess(ZR_FROGS_SUNS_SONG, {[]{return IsChild && CanPlay(SunsSong);}}), - LocationAccess(ZR_FROGS_SONG_OF_TIME, {[]{return IsChild && CanPlay(SongOfTime);}}), - LocationAccess(ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, {[]{return IsChild || CanUse(HOVER_BOOTS) || (IsAdult && LogicZoraRiverLower);}}), - LocationAccess(ZR_NEAR_DOMAIN_FREESTANDING_POH, {[]{return IsChild || CanUse(HOVER_BOOTS) || (IsAdult && LogicZoraRiverUpper);}}), - LocationAccess(ZR_GS_LADDER, {[]{return IsChild && AtNight && CanChildAttack && CanGetNightTimeGS;}}), - LocationAccess(ZR_GS_NEAR_RAISED_GROTTOS, {[]{return IsAdult && HookshotOrBoomerang && AtNight && CanGetNightTimeGS;}}), - LocationAccess(ZR_GS_ABOVE_BRIDGE, {[]{return IsAdult && CanUse(HOOKSHOT) && AtNight && CanGetNightTimeGS;}}), - LocationAccess(ZR_NEAR_GROTTOS_GOSSIP_STONE, {[]{return true;}}), - LocationAccess(ZR_NEAR_DOMAIN_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_ZR_MAGIC_BEAN_SALESMAN, {[]{return IsChild;}}), + LocationAccess(RC_ZR_FROGS_OCARINA_GAME, {[]{return IsChild && CanPlay(ZeldasLullaby) && CanPlay(SariasSong) && CanPlay(SunsSong) && CanPlay(EponasSong) && CanPlay(SongOfTime) && CanPlay(SongOfStorms);}}), + LocationAccess(RC_ZR_FROGS_IN_THE_RAIN, {[]{return IsChild && CanPlay(SongOfStorms);}}), + LocationAccess(RC_ZR_FROGS_ZELDAS_LULLABY, {[]{return IsChild && CanPlay(ZeldasLullaby);}}), + LocationAccess(RC_ZR_FROGS_EPONAS_SONG, {[]{return IsChild && CanPlay(EponasSong);}}), + LocationAccess(RC_ZR_FROGS_SARIAS_SONG, {[]{return IsChild && CanPlay(SariasSong);}}), + LocationAccess(RC_ZR_FROGS_SUNS_SONG, {[]{return IsChild && CanPlay(SunsSong);}}), + LocationAccess(RC_ZR_FROGS_SONG_OF_TIME, {[]{return IsChild && CanPlay(SongOfTime);}}), + LocationAccess(RC_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, {[]{return IsChild || CanUse(RG_HOVER_BOOTS) || (IsAdult && LogicZoraRiverLower);}}), + LocationAccess(RC_ZR_NEAR_DOMAIN_FREESTANDING_POH, {[]{return IsChild || CanUse(RG_HOVER_BOOTS) || (IsAdult && LogicZoraRiverUpper);}}), + LocationAccess(RC_ZR_GS_LADDER, {[]{return IsChild && AtNight && CanChildAttack && CanGetNightTimeGS;}}), + LocationAccess(RC_ZR_GS_NEAR_RAISED_GROTTOS, {[]{return IsAdult && HookshotOrBoomerang && AtNight && CanGetNightTimeGS;}}), + LocationAccess(RC_ZR_GS_ABOVE_BRIDGE, {[]{return IsAdult && CanUse(RG_HOOKSHOT) && AtNight && CanGetNightTimeGS;}}), + LocationAccess(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, {[]{return true;}}), }, { //Exits - Entrance(ZR_FRONT, {[]{return true;}}), - Entrance(ZR_OPEN_GROTTO, {[]{return true;}}), - Entrance(ZR_FAIRY_GROTTO, {[]{return Here(ZORAS_RIVER, []{return CanBlastOrSmash;});}}), - Entrance(THE_LOST_WOODS, {[]{return CanDive || CanUse(IRON_BOOTS);}}), - Entrance(ZR_STORMS_GROTTO, {[]{return CanOpenStormGrotto;}}), - Entrance(ZR_BEHIND_WATERFALL, {[]{return CanPlay(ZeldasLullaby) || (IsChild && LogicZoraWithCucco) || (IsAdult && CanUse(HOVER_BOOTS) && LogicZoraWithHovers);}}), + Entrance(RR_ZR_FRONT, {[]{return true;}}), + Entrance(RR_ZR_OPEN_GROTTO, {[]{return true;}}), + Entrance(RR_ZR_FAIRY_GROTTO, {[]{return Here(RR_ZORAS_RIVER, []{return CanBlastOrSmash;});}}), + Entrance(RR_THE_LOST_WOODS, {[]{return CanDive || CanUse(RG_IRON_BOOTS);}}), + Entrance(RR_ZR_STORMS_GROTTO, {[]{return CanOpenStormGrotto;}}), + Entrance(RR_ZR_BEHIND_WATERFALL, {[]{return CanPlay(ZeldasLullaby) || (IsChild && LogicZoraWithCucco) || (IsAdult && CanUse(RG_HOVER_BOOTS) && LogicZoraWithHovers);}}), }); - areaTable[ZR_BEHIND_WATERFALL] = Area("ZR Behind Waterfall", "Zora River", NONE, DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_ZR_BEHIND_WATERFALL] = Area("ZR Behind Waterfall", "Zora River", RHT_NONE, DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(ZORAS_RIVER, {[]{return true;}}), - Entrance(ZORAS_DOMAIN, {[]{return true;}}), + Entrance(RR_ZORAS_RIVER, {[]{return true;}}), + Entrance(RR_ZORAS_DOMAIN, {[]{return true;}}), }); - areaTable[ZR_OPEN_GROTTO] = Area("ZR Open Grotto", "ZR Open Grotto", NONE, NO_DAY_NIGHT_CYCLE, grottoEvents, { + areaTable[RR_ZR_OPEN_GROTTO] = Area("ZR Open Grotto", "ZR Open Grotto", RHT_NONE, NO_DAY_NIGHT_CYCLE, grottoEvents, { //Locations - LocationAccess(ZR_OPEN_GROTTO_CHEST, {[]{return true;}}), - LocationAccess(ZR_OPEN_GROTTO_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_ZR_OPEN_GROTTO_CHEST, {[]{return true;}}), + LocationAccess(RC_ZR_OPEN_GROTTO_GOSSIP_STONE, {[]{return true;}}), }, { //Exits - Entrance(ZORAS_RIVER, {[]{return true;}}), + Entrance(RR_ZORAS_RIVER, {[]{return true;}}), }); - areaTable[ZR_FAIRY_GROTTO] = Area("ZR Fairy Grotto", "ZR Fairy Grotto", NONE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_ZR_FAIRY_GROTTO] = Area("ZR Fairy Grotto", "ZR Fairy Grotto", RHT_NONE, NO_DAY_NIGHT_CYCLE, { //Event EventAccess(&FreeFairies, {[]{return true;}}), }, {}, { //Exits - Entrance(ZORAS_RIVER, {[]{return true;}}), + Entrance(RR_ZORAS_RIVER, {[]{return true;}}), }); - areaTable[ZR_STORMS_GROTTO] = Area("ZR Storms Grotto", "ZR Storms Grotto", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_ZR_STORMS_GROTTO] = Area("ZR Storms Grotto", "ZR Storms Grotto", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(ZR_DEKU_SCRUB_GROTTO_REAR, {[]{return CanStunDeku;}}), - LocationAccess(ZR_DEKU_SCRUB_GROTTO_FRONT, {[]{return CanStunDeku;}}), + LocationAccess(RC_ZR_DEKU_SCRUB_GROTTO_REAR, {[]{return CanStunDeku;}}), + LocationAccess(RC_ZR_DEKU_SCRUB_GROTTO_FRONT, {[]{return CanStunDeku;}}), }, { //Exits - Entrance(ZORAS_RIVER, {[]{return true;}}), + Entrance(RR_ZORAS_RIVER, {[]{return true;}}), }); - areaTable[ZORAS_DOMAIN] = Area("Zoras Domain", "Zoras Domain", ZORAS_DOMAIN, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_ZORAS_DOMAIN] = Area("Zoras Domain", "Zoras Domain", RHT_ZORAS_DOMAIN, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&EyeballFrogAccess, {[]{return EyeballFrogAccess || (IsAdult && KingZoraThawed && (Eyedrops || EyeballFrog || Prescription || PrescriptionAccess));}}), EventAccess(&GossipStoneFairy, {[]{return GossipStoneFairy || CanSummonGossipFairyWithoutSuns;}}), @@ -91,76 +91,76 @@ void AreaTable_Init_ZorasDomain() { EventAccess(&DeliverLetter, {[]{return DeliverLetter || (RutosLetter && IsChild && ZorasFountain.IsNot(ZORASFOUNTAIN_OPEN));}}), }, { //Locations - LocationAccess(ZD_DIVING_MINIGAME, {[]{return IsChild;}}), - LocationAccess(ZD_CHEST, {[]{return IsChild && CanUse(STICKS);}}), - LocationAccess(ZD_KING_ZORA_THAWED, {[]{return KingZoraThawed;}}), - LocationAccess(ZD_TRADE_PRESCRIPTION, {[]{return KingZoraThawed && Prescription;}}), - LocationAccess(ZD_GS_FROZEN_WATERFALL, {[]{return IsAdult && AtNight && (HookshotOrBoomerang || CanUse(SLINGSHOT) || Bow || MagicMeter || LogicDomainGS) && CanGetNightTimeGS;}}), - LocationAccess(ZD_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_ZD_DIVING_MINIGAME, {[]{return IsChild;}}), + LocationAccess(RC_ZD_CHEST, {[]{return IsChild && CanUse(RG_STICKS);}}), + LocationAccess(RC_ZD_KING_ZORA_THAWED, {[]{return KingZoraThawed;}}), + LocationAccess(RC_ZD_TRADE_PRESCRIPTION, {[]{return KingZoraThawed && Prescription;}}), + LocationAccess(RC_ZD_GS_FROZEN_WATERFALL, {[]{return IsAdult && AtNight && (HookshotOrBoomerang || CanUse(RG_FAIRY_SLINGSHOT) || Bow || MagicMeter || LogicDomainGS) && CanGetNightTimeGS;}}), + LocationAccess(RC_ZD_GOSSIP_STONE, {[]{return true;}}), }, { //Exits - Entrance(ZR_BEHIND_WATERFALL, {[]{return true;}}), - Entrance(LAKE_HYLIA, {[]{return IsChild && (CanDive || CanUse(IRON_BOOTS));}}), - Entrance(ZD_BEHIND_KING_ZORA, {[]{return DeliverLetter || ZorasFountain.Is(ZORASFOUNTAIN_OPEN) || (ZorasFountain.Is(ZORASFOUNTAIN_ADULT) && IsAdult) || (LogicKingZoraSkip && IsAdult);}}), - Entrance(ZD_SHOP, {[]{return IsChild || BlueFire;}}), - Entrance(ZD_STORMS_GROTTO, {[]{return CanOpenStormGrotto;}}), + Entrance(RR_ZR_BEHIND_WATERFALL, {[]{return true;}}), + Entrance(RR_LAKE_HYLIA, {[]{return IsChild && (CanDive || CanUse(RG_IRON_BOOTS));}}), + Entrance(RR_ZD_BEHIND_KING_ZORA, {[]{return DeliverLetter || ZorasFountain.Is(ZORASFOUNTAIN_OPEN) || (ZorasFountain.Is(ZORASFOUNTAIN_ADULT) && IsAdult) || (LogicKingZoraSkip && IsAdult);}}), + Entrance(RR_ZD_SHOP, {[]{return IsChild || BlueFire;}}), + Entrance(RR_ZD_STORMS_GROTTO, {[]{return CanOpenStormGrotto;}}), }); - areaTable[ZD_BEHIND_KING_ZORA] = Area("ZD Behind King Zora", "Zoras Domain", NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_ZD_BEHIND_KING_ZORA] = Area("ZD Behind King Zora", "Zoras Domain", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(ZORAS_DOMAIN, {[]{return DeliverLetter || ZorasFountain.Is(ZORASFOUNTAIN_OPEN) || (ZorasFountain.Is(ZORASFOUNTAIN_ADULT) && IsAdult);}}), - Entrance(ZORAS_FOUNTAIN, {[]{return true;}}), + Entrance(RR_ZORAS_DOMAIN, {[]{return DeliverLetter || ZorasFountain.Is(ZORASFOUNTAIN_OPEN) || (ZorasFountain.Is(ZORASFOUNTAIN_ADULT) && IsAdult);}}), + Entrance(RR_ZORAS_FOUNTAIN, {[]{return true;}}), }); - areaTable[ZD_SHOP] = Area("ZD Shop", "ZD Shop", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_ZD_SHOP] = Area("ZD Shop", "ZD Shop", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(ZD_SHOP_ITEM_1, {[]{return true;}}), - LocationAccess(ZD_SHOP_ITEM_2, {[]{return true;}}), - LocationAccess(ZD_SHOP_ITEM_3, {[]{return true;}}), - LocationAccess(ZD_SHOP_ITEM_4, {[]{return true;}}), - LocationAccess(ZD_SHOP_ITEM_5, {[]{return true;}}), - LocationAccess(ZD_SHOP_ITEM_6, {[]{return true;}}), - LocationAccess(ZD_SHOP_ITEM_7, {[]{return true;}}), - LocationAccess(ZD_SHOP_ITEM_8, {[]{return true;}}), + LocationAccess(RC_ZD_SHOP_ITEM_1, {[]{return true;}}), + LocationAccess(RC_ZD_SHOP_ITEM_2, {[]{return true;}}), + LocationAccess(RC_ZD_SHOP_ITEM_3, {[]{return true;}}), + LocationAccess(RC_ZD_SHOP_ITEM_4, {[]{return true;}}), + LocationAccess(RC_ZD_SHOP_ITEM_5, {[]{return true;}}), + LocationAccess(RC_ZD_SHOP_ITEM_6, {[]{return true;}}), + LocationAccess(RC_ZD_SHOP_ITEM_7, {[]{return true;}}), + LocationAccess(RC_ZD_SHOP_ITEM_8, {[]{return true;}}), }, { //Exits - Entrance(ZORAS_DOMAIN, {[]{return true;}}), + Entrance(RR_ZORAS_DOMAIN, {[]{return true;}}), }); - areaTable[ZD_STORMS_GROTTO] = Area("ZD Storms Grotto", "ZD Storms Grotto", NONE, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_ZD_STORMS_GROTTO] = Area("ZD Storms Grotto", "ZD Storms Grotto", RHT_NONE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&FreeFairies, {[]{return true;}}), }, {}, { //Exits - Entrance(ZORAS_DOMAIN, {[]{return true;}}), + Entrance(RR_ZORAS_DOMAIN, {[]{return true;}}), }); - areaTable[ZORAS_FOUNTAIN] = Area("Zoras Fountain", "Zoras Fountain", ZORAS_FOUNTAIN, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_ZORAS_FOUNTAIN] = Area("Zoras Fountain", "Zoras Fountain", RHT_ZORAS_FOUNTAIN, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&GossipStoneFairy, {[]{return GossipStoneFairy || CanSummonGossipFairyWithoutSuns;}}), - EventAccess(&ButterflyFairy, {[]{return ButterflyFairy || (CanUse(STICKS) && AtDay);}}), + EventAccess(&ButterflyFairy, {[]{return ButterflyFairy || (CanUse(RG_STICKS) && AtDay);}}), }, { //Locations - LocationAccess(ZF_ICEBERG_FREESTANDING_POH, {[]{return IsAdult;}}), - LocationAccess(ZF_BOTTOM_FREESTANDING_POH, {[]{return IsAdult && IronBoots && WaterTimer >= 24;}}), - LocationAccess(ZF_GS_TREE, {[]{return IsChild;}}), - LocationAccess(ZF_GS_ABOVE_THE_LOG, {[]{return IsChild && HookshotOrBoomerang && AtNight && CanGetNightTimeGS;}}), - LocationAccess(ZF_GS_HIDDEN_CAVE, {[]{return CanUse(SILVER_GAUNTLETS) && CanBlastOrSmash && HookshotOrBoomerang && IsAdult && AtNight && CanGetNightTimeGS;}}), - LocationAccess(ZF_FAIRY_GOSSIP_STONE, {[]{return true;}}), - LocationAccess(ZF_JABU_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_ZF_ICEBERC_FREESTANDING_POH, {[]{return IsAdult;}}), + LocationAccess(RC_ZF_BOTTOM_FREESTANDING_POH, {[]{return IsAdult && IronBoots && WaterTimer >= 24;}}), + LocationAccess(RC_ZF_GS_TREE, {[]{return IsChild;}}), + LocationAccess(RC_ZF_GS_ABOVE_THE_LOG, {[]{return IsChild && HookshotOrBoomerang && AtNight && CanGetNightTimeGS;}}), + LocationAccess(RC_ZF_GS_HIDDEN_CAVE, {[]{return CanUse(RG_SILVER_GAUNTLETS) && CanBlastOrSmash && HookshotOrBoomerang && IsAdult && AtNight && CanGetNightTimeGS;}}), + LocationAccess(RC_FAIRY_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_JABU_GOSSIP_STONE, {[]{return true;}}), }, { //Exits - Entrance(ZD_BEHIND_KING_ZORA, {[]{return true;}}), - Entrance(JABU_JABUS_BELLY_ENTRYWAY, {[]{return (IsChild && Fish);}}), - Entrance(ICE_CAVERN_ENTRYWAY, {[]{return IsAdult;}}), - Entrance(ZF_GREAT_FAIRY_FOUNTAIN, {[]{return HasExplosives;}}), + Entrance(RR_ZD_BEHIND_KING_ZORA, {[]{return true;}}), + Entrance(RR_JABU_JABUS_BELLY_ENTRYWAY, {[]{return (IsChild && Fish);}}), + Entrance(RR_ICE_CAVERN_ENTRYWAY, {[]{return IsAdult;}}), + Entrance(RR_ZF_GREAT_FAIRY_FOUNTAIN, {[]{return HasExplosives;}}), }); - areaTable[ZF_GREAT_FAIRY_FOUNTAIN] = Area("ZF Great Fairy Fountain", "ZF Great Fairy Fountain", NONE, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_ZF_GREAT_FAIRY_FOUNTAIN] = Area("ZF Great Fairy Fountain", "ZF Great Fairy Fountain", RHT_NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(ZF_GREAT_FAIRY_REWARD, {[]{return CanPlay(ZeldasLullaby);}}), + LocationAccess(RC_ZF_GREAT_FAIRY_REWARD, {[]{return CanPlay(ZeldasLullaby);}}), }, { //Exits - Entrance(ZORAS_FOUNTAIN, {[]{return true;}}), + Entrance(RR_ZORAS_FOUNTAIN, {[]{return true;}}), }); } diff --git a/soh/soh/Enhancements/randomizer/3drando/logic.cpp b/soh/soh/Enhancements/randomizer/3drando/logic.cpp index ddf53824e..b556434c5 100644 --- a/soh/soh/Enhancements/randomizer/3drando/logic.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/logic.cpp @@ -375,84 +375,84 @@ namespace Logic { return Ocarina && song; } - static bool IsMagicItem(uint32_t item) { - return item == DINS_FIRE || - item == FARORES_WIND || - item == NAYRUS_LOVE || - item == LENS_OF_TRUTH; + static bool IsMagicItem(RandomizerGet item) { + return item == RG_DINS_FIRE || + item == RG_FARORES_WIND || + item == RG_NAYRUS_LOVE || + item == RG_LENS_OF_TRUTH; } - static bool IsMagicArrow(uint32_t item) { - return item == FIRE_ARROWS || - item == ICE_ARROWS || - item == LIGHT_ARROWS; + static bool IsMagicArrow(RandomizerGet item) { + return item == RG_FIRE_ARROWS || + item == RG_ICE_ARROWS || + item == RG_LIGHT_ARROWS; } - bool HasItem(uint32_t itemName) { - return (itemName == DINS_FIRE && DinsFire) || - (itemName == FARORES_WIND && FaroresWind) || - (itemName == NAYRUS_LOVE && NayrusLove) || - (itemName == LENS_OF_TRUTH && LensOfTruth) || - (itemName == BOW && Bow) || - (itemName == MEGATON_HAMMER && Hammer) || - (itemName == IRON_BOOTS && IronBoots) || - (itemName == HOVER_BOOTS && HoverBoots) || - (itemName == HOOKSHOT && Hookshot) || - (itemName == LONGSHOT && Longshot) || - (itemName == SILVER_GAUNTLETS && SilverGauntlets) || - (itemName == GOLDEN_GAUNTLETS && GoldenGauntlets) || - (itemName == GORON_TUNIC && GoronTunic) || - (itemName == ZORA_TUNIC && ZoraTunic) || - (itemName == SCARECROW && Scarecrow) || - (itemName == DISTANT_SCARECROW && DistantScarecrow)|| - (itemName == HYLIAN_SHIELD && HylianShield) || - (itemName == MIRROR_SHIELD && MirrorShield) || - (itemName == MASTER_SWORD && MasterSword) || - (itemName == BIGGORON_SWORD && BiggoronSword) || - (itemName == SLINGSHOT && Slingshot) || - (itemName == BOOMERANG && Boomerang) || - (itemName == KOKIRI_SWORD && KokiriSword) || - (itemName == STICKS && Sticks) || - (itemName == DEKU_SHIELD && DekuShield) || - (itemName == FIRE_ARROWS && FireArrows) || - (itemName == ICE_ARROWS && IceArrows) || - (itemName == LIGHT_ARROWS && LightArrows); + bool HasItem(RandomizerGet itemName) { + return (itemName == RG_DINS_FIRE && DinsFire) || + (itemName == RG_FARORES_WIND && FaroresWind) || + (itemName == RG_NAYRUS_LOVE && NayrusLove) || + (itemName == RG_LENS_OF_TRUTH && LensOfTruth) || + (itemName == RG_FAIRY_BOW && Bow) || + (itemName == RG_MEGATON_HAMMER && Hammer) || + (itemName == RG_IRON_BOOTS && IronBoots) || + (itemName == RG_HOVER_BOOTS && HoverBoots) || + (itemName == RG_HOOKSHOT && Hookshot) || + (itemName == RG_LONGSHOT && Longshot) || + (itemName == RG_SILVER_GAUNTLETS && SilverGauntlets) || + (itemName == RG_GOLDEN_GAUNTLETS && GoldenGauntlets) || + (itemName == RG_GORON_TUNIC && GoronTunic) || + (itemName == RG_ZORA_TUNIC && ZoraTunic) || + (itemName == RG_SCARECROW && Scarecrow) || + (itemName == RG_DISTANT_SCARECROW && DistantScarecrow)|| + (itemName == RG_HYLIAN_SHIELD && HylianShield) || + (itemName == RG_MIRROR_SHIELD && MirrorShield) || + (itemName == RG_MASTER_SWORD && MasterSword) || + (itemName == RG_BIGGORON_SWORD && BiggoronSword) || + (itemName == RG_FAIRY_SLINGSHOT && Slingshot) || + (itemName == RG_BOOMERANG && Boomerang) || + (itemName == RG_KOKIRI_SWORD && KokiriSword) || + (itemName == RG_STICKS && Sticks) || + (itemName == RG_DEKU_SHIELD && DekuShield) || + (itemName == RG_FIRE_ARROWS && FireArrows) || + (itemName == RG_ICE_ARROWS && IceArrows) || + (itemName == RG_LIGHT_ARROWS && LightArrows); } //Can the passed in item be used? - bool CanUse(uint32_t itemName) { + bool CanUse(RandomizerGet itemName) { if (!HasItem(itemName)) return false; switch (itemName) { // Adult items - case BOW: return IsAdult || BowAsChild; - case MEGATON_HAMMER: return IsAdult || HammerAsChild; - case IRON_BOOTS: return IsAdult || IronBootsAsChild; - case HOVER_BOOTS: return IsAdult || HoverBootsAsChild; - case HOOKSHOT: return IsAdult || HookshotAsChild; - case LONGSHOT: return IsAdult || HookshotAsChild; - case SILVER_GAUNTLETS: return IsAdult; - case GOLDEN_GAUNTLETS: return IsAdult; - case GORON_TUNIC: return IsAdult || GoronTunicAsChild; - case ZORA_TUNIC: return IsAdult || ZoraTunicAsChild; - case SCARECROW: return IsAdult || HookshotAsChild; - case DISTANT_SCARECROW: return IsAdult || HookshotAsChild; - case HYLIAN_SHIELD: return IsAdult; - case MIRROR_SHIELD: return IsAdult || MirrorShieldAsChild; - case MASTER_SWORD: return IsAdult || MasterSwordAsChild; - case BIGGORON_SWORD: return IsAdult || BiggoronSwordAsChild; + case RG_FAIRY_BOW: return IsAdult || BowAsChild; + case RG_MEGATON_HAMMER: return IsAdult || HammerAsChild; + case RG_IRON_BOOTS: return IsAdult || IronBootsAsChild; + case RG_HOVER_BOOTS: return IsAdult || HoverBootsAsChild; + case RG_HOOKSHOT: return IsAdult || HookshotAsChild; + case RG_LONGSHOT: return IsAdult || HookshotAsChild; + case RG_SILVER_GAUNTLETS: return IsAdult; + case RG_GOLDEN_GAUNTLETS: return IsAdult; + case RG_GORON_TUNIC: return IsAdult || GoronTunicAsChild; + case RG_ZORA_TUNIC: return IsAdult || ZoraTunicAsChild; + case RG_SCARECROW: return IsAdult || HookshotAsChild; + case RG_DISTANT_SCARECROW: return IsAdult || HookshotAsChild; + case RG_HYLIAN_SHIELD: return IsAdult; + case RG_MIRROR_SHIELD: return IsAdult || MirrorShieldAsChild; + case RG_MASTER_SWORD: return IsAdult || MasterSwordAsChild; + case RG_BIGGORON_SWORD: return IsAdult || BiggoronSwordAsChild; // Child items - case SLINGSHOT: return IsChild || SlingshotAsAdult; - case BOOMERANG: return IsChild || BoomerangAsAdult; - case KOKIRI_SWORD: return IsChild || KokiriSwordAsAdult; - case STICKS: return IsChild || StickAsAdult; - case DEKU_SHIELD: return IsChild || DekuShieldAsAdult; + case RG_FAIRY_SLINGSHOT: return IsChild || SlingshotAsAdult; + case RG_BOOMERANG: return IsChild || BoomerangAsAdult; + case RG_KOKIRI_SWORD: return IsChild || KokiriSwordAsAdult; + case RG_STICKS: return IsChild || StickAsAdult; + case RG_DEKU_SHIELD: return IsChild || DekuShieldAsAdult; // Magic items - default: return MagicMeter && (IsMagicItem(itemName) || (IsMagicArrow(itemName) && CanUse(BOW))); + default: return MagicMeter && (IsMagicItem(itemName) || (IsMagicArrow(itemName) && CanUse(RG_FAIRY_BOW))); } } @@ -470,7 +470,7 @@ namespace Logic { //todo rewrite glitch section - bool CanEquipSwap(uint32_t itemName) { + bool CanEquipSwap(RandomizerGet itemName) { if (!HasItem(itemName)) return false; @@ -483,9 +483,9 @@ namespace Logic { bool CanDoGlitch(GlitchType glitch) { switch(glitch) { case GlitchType::EquipSwapDins: - return ((IsAdult && HasItem(DINS_FIRE)) || (IsChild && (HasItem(STICKS) || HasItem(DINS_FIRE)))) && GlitchEquipSwapDins; + return ((IsAdult && HasItem(RG_DINS_FIRE)) || (IsChild && (HasItem(RG_STICKS) || HasItem(RG_DINS_FIRE)))) && GlitchEquipSwapDins; case GlitchType::EquipSwap: // todo: add bunny hood to adult item equippable list and child trade item to child item equippable list - return ((IsAdult && (HasItem(DINS_FIRE) || HasItem(FARORES_WIND) || HasItem(NAYRUS_LOVE))) || (IsChild && (HasItem(STICKS) || HasItem(SLINGSHOT) || HasItem(BOOMERANG) || HasBottle || Nuts || Ocarina || HasItem(LENS_OF_TRUTH) || HasExplosives || (MagicBean || MagicBeanPack) || HasItem(DINS_FIRE) || HasItem(FARORES_WIND) || HasItem(NAYRUS_LOVE)))) && GlitchEquipSwap; + return ((IsAdult && (HasItem(RG_DINS_FIRE) || HasItem(RG_FARORES_WIND) || HasItem(RG_NAYRUS_LOVE))) || (IsChild && (HasItem(RG_STICKS) || HasItem(RG_FAIRY_SLINGSHOT) || HasItem(RG_BOOMERANG) || HasBottle || Nuts || Ocarina || HasItem(RG_LENS_OF_TRUTH) || HasExplosives || (MagicBean || MagicBeanPack) || HasItem(RG_DINS_FIRE) || HasItem(RG_FARORES_WIND) || HasItem(RG_NAYRUS_LOVE)))) && GlitchEquipSwap; } //Shouldn't be reached @@ -530,7 +530,7 @@ namespace Logic { Nuts = DekuNutDrop || Nuts; Sticks = DekuStickDrop || Sticks; Bugs = HasBottle && BugsAccess; - BlueFire = (HasBottle && BlueFireAccess) || (BlueFireArrows && CanUse(ICE_ARROWS)); + BlueFire = (HasBottle && BlueFireAccess) || (BlueFireArrows && CanUse(RG_ICE_ARROWS)); Fish = HasBottle && FishAccess; Fairy = HasBottle && FairyAccess; @@ -556,11 +556,11 @@ namespace Logic { // IsChild = Age == AGE_CHILD; // IsAdult = Age == AGE_ADULT; - CanBlastOrSmash = HasExplosives || CanUse(MEGATON_HAMMER); - CanChildAttack = IsChild && (Slingshot || Boomerang || Sticks || KokiriSword || HasExplosives || CanUse(DINS_FIRE) || CanUse(MASTER_SWORD) || CanUse(MEGATON_HAMMER) || CanUse(BIGGORON_SWORD)); - CanChildDamage = IsChild && (Slingshot || Sticks || KokiriSword || HasExplosives || CanUse(DINS_FIRE) || CanUse(MASTER_SWORD) || CanUse(MEGATON_HAMMER) || CanUse(BIGGORON_SWORD)); + CanBlastOrSmash = HasExplosives || CanUse(RG_MEGATON_HAMMER); + CanChildAttack = IsChild && (Slingshot || Boomerang || Sticks || KokiriSword || HasExplosives || CanUse(RG_DINS_FIRE) || CanUse(RG_MASTER_SWORD) || CanUse(RG_MEGATON_HAMMER) || CanUse(RG_BIGGORON_SWORD)); + CanChildDamage = IsChild && (Slingshot || Sticks || KokiriSword || HasExplosives || CanUse(RG_DINS_FIRE) || CanUse(RG_MASTER_SWORD) || CanUse(RG_MEGATON_HAMMER) || CanUse(RG_BIGGORON_SWORD)); CanStunDeku = IsAdult || CanChildAttack || Nuts || HasShield; - CanCutShrubs = IsAdult /*|| Sticks*/ || KokiriSword || Boomerang || HasExplosives || CanUse(MASTER_SWORD) || CanUse(MEGATON_HAMMER) || CanUse(BIGGORON_SWORD); + CanCutShrubs = IsAdult /*|| Sticks*/ || KokiriSword || Boomerang || HasExplosives || CanUse(RG_MASTER_SWORD) || CanUse(RG_MEGATON_HAMMER) || CanUse(RG_BIGGORON_SWORD); CanDive = ProgressiveScale >= 1; CanLeaveForest = OpenForest.IsNot(OPENFOREST_CLOSED) || IsAdult || DekuTreeClear || ShuffleInteriorEntrances || ShuffleOverworldEntrances; CanPlantBugs = IsChild && Bugs; @@ -569,37 +569,37 @@ namespace Logic { CanSummonGossipFairyWithoutSuns = Ocarina && (ZeldasLullaby || EponasSong || SongOfTime); Hearts = BaseHearts + HeartContainer + (PieceOfHeart >> 2); EffectiveHealth = ((Hearts << (2 + DoubleDefense)) >> Multiplier) + ((Hearts << (2 + DoubleDefense)) % (1 << Multiplier) > 0); //Number of half heart hits to die, ranges from 1 to 160 - FireTimer = CanUse(GORON_TUNIC) ? 255 : (LogicFewerTunicRequirements) ? (Hearts * 8) : 0; - WaterTimer = CanUse( ZORA_TUNIC) ? 255 : (LogicFewerTunicRequirements) ? (Hearts * 8) : 0; + FireTimer = CanUse(RG_GORON_TUNIC) ? 255 : (LogicFewerTunicRequirements) ? (Hearts * 8) : 0; + WaterTimer = CanUse(RG_ZORA_TUNIC) ? 255 : (LogicFewerTunicRequirements) ? (Hearts * 8) : 0; NeedNayrusLove = (EffectiveHealth == 1); - CanSurviveDamage = !NeedNayrusLove || CanUse(NAYRUS_LOVE); + CanSurviveDamage = !NeedNayrusLove || CanUse(RG_NAYRUS_LOVE); CanTakeDamage = Fairy || CanSurviveDamage; - CanTakeDamageTwice = (Fairy && NumBottles >= 2) || ((EffectiveHealth == 2) && (CanUse(NAYRUS_LOVE) || Fairy)) || (EffectiveHealth > 2); + CanTakeDamageTwice = (Fairy && NumBottles >= 2) || ((EffectiveHealth == 2) && (CanUse(RG_NAYRUS_LOVE) || Fairy)) || (EffectiveHealth > 2); //CanPlantBean = IsChild && (MagicBean || MagicBeanPack); CanOpenBombGrotto = CanBlastOrSmash && (ShardOfAgony || LogicGrottosWithoutAgony); CanOpenStormGrotto = CanPlay(SongOfStorms) && (ShardOfAgony || LogicGrottosWithoutAgony); - HookshotOrBoomerang = CanUse(HOOKSHOT) || CanUse(BOOMERANG); + HookshotOrBoomerang = CanUse(RG_HOOKSHOT) || CanUse(RG_BOOMERANG); CanGetNightTimeGS = (CanPlay(SunsSong) || !NightGSExpectSuns); GuaranteeTradePath = ShuffleInteriorEntrances || ShuffleOverworldEntrances || LogicBiggoronBolero || CanBlastOrSmash || StopGCRollingGoronAsAdult; //GuaranteeHint = (hints == "Mask" && MaskofTruth) || (hints == "Agony") || (hints != "Mask" && hints != "Agony"); - HasFireSource = CanUse(DINS_FIRE) || CanUse(FIRE_ARROWS); - HasFireSourceWithTorch = HasFireSource || CanUse(STICKS); + HasFireSource = CanUse(RG_DINS_FIRE) || CanUse(RG_FIRE_ARROWS); + HasFireSourceWithTorch = HasFireSource || CanUse(RG_STICKS); //Gerudo Fortress - CanFinishGerudoFortress = (GerudoFortress.Is(GERUDOFORTRESS_NORMAL) && GerudoFortressKeys >= 4 && (IsAdult || KokiriSword || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)) && (GerudoToken || CanUse(BOW) || CanUse(HOOKSHOT) || CanUse(HOVER_BOOTS) || LogicGerudoKitchen)) || - (GerudoFortress.Is(GERUDOFORTRESS_FAST) && GerudoFortressKeys >= 1 && (IsAdult || KokiriSword || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD))) || + CanFinishGerudoFortress = (GerudoFortress.Is(GERUDOFORTRESS_NORMAL) && GerudoFortressKeys >= 4 && (IsAdult || KokiriSword || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD)) && (GerudoToken || CanUse(RG_FAIRY_BOW) || CanUse(RG_HOOKSHOT) || CanUse(RG_HOVER_BOOTS) || LogicGerudoKitchen)) || + (GerudoFortress.Is(GERUDOFORTRESS_FAST) && GerudoFortressKeys >= 1 && (IsAdult || KokiriSword || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD))) || (GerudoFortress.IsNot(GERUDOFORTRESS_NORMAL) && GerudoFortress.IsNot(GERUDOFORTRESS_FAST)); - HasShield = CanUse(HYLIAN_SHIELD) || CanUse(DEKU_SHIELD); //Mirror shield can't reflect attacks - CanShield = CanUse(MIRROR_SHIELD) || HasShield; - ChildShield = IsChild && CanUse(DEKU_SHIELD); //hylian shield is not helpful for child - AdultReflectShield = IsAdult && CanUse(HYLIAN_SHIELD); //Mirror shield can't reflect attacks - AdultShield = IsAdult && (CanUse(HYLIAN_SHIELD) || CanUse(MIRROR_SHIELD)); + HasShield = CanUse(RG_HYLIAN_SHIELD) || CanUse(RG_DEKU_SHIELD); //Mirror shield can't reflect attacks + CanShield = CanUse(RG_MIRROR_SHIELD) || HasShield; + ChildShield = IsChild && CanUse(RG_DEKU_SHIELD); //hylian shield is not helpful for child + AdultReflectShield = IsAdult && CanUse(RG_HYLIAN_SHIELD); //Mirror shield can't reflect attacks + AdultShield = IsAdult && (CanUse(RG_HYLIAN_SHIELD) || CanUse(RG_MIRROR_SHIELD)); CanShieldFlick = ChildShield || AdultShield; CanJumpslash = IsAdult || Sticks || KokiriSword; - CanUseProjectile = HasExplosives || CanUse(BOW) || CanUse(HOOKSHOT) || CanUse(SLINGSHOT) || CanUse(BOOMERANG); - CanUseMagicArrow = CanUse(FIRE_ARROWS) || CanUse(ICE_ARROWS) || CanUse(LIGHT_ARROWS); + CanUseProjectile = HasExplosives || CanUse(RG_FAIRY_BOW) || CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_BOOMERANG); + CanUseMagicArrow = CanUse(RG_FIRE_ARROWS) || CanUse(RG_ICE_ARROWS) || CanUse(RG_LIGHT_ARROWS); //Bridge and LACS Requirements MedallionCount = (ForestMedallion ? 1:0) + (FireMedallion ? 1:0) + (WaterMedallion ? 1:0) + (SpiritMedallion ? 1:0) + (ShadowMedallion ? 1:0) + (LightMedallion ? 1:0); @@ -627,62 +627,62 @@ namespace Logic { CanCompleteTriforce = TriforcePieces >= TriforceHuntRequired.Value(); } - bool SmallKeys(Key dungeon, uint8_t requiredAmount) { + bool SmallKeys(RandomizerRegion dungeon, uint8_t requiredAmount) { return SmallKeys(dungeon, requiredAmount, requiredAmount); } - bool SmallKeys(Key dungeon, uint8_t requiredAmountGlitchless, uint8_t requiredAmountGlitched) { + bool SmallKeys(RandomizerRegion dungeon, uint8_t requiredAmountGlitchless, uint8_t requiredAmountGlitched) { switch (dungeon) { - case FOREST_TEMPLE: + case RR_FOREST_TEMPLE: /*if (IsGlitched && (GetDifficultyValueFromString(GlitchHookshotJump_Boots) >= static_cast(GlitchDifficulty::INTERMEDIATE) || GetDifficultyValueFromString(GlitchHoverBoost) >= static_cast(GlitchDifficulty::NOVICE) || (GetDifficultyValueFromString(GlitchHover) >= static_cast(GlitchDifficulty::NOVICE) && GetDifficultyValueFromString(GlitchISG) >= static_cast(GlitchDifficulty::INTERMEDIATE)))) { return ForestTempleKeys >= requiredAmountGlitched; }*/ return ForestTempleKeys >= requiredAmountGlitchless; - case FIRE_TEMPLE: + case RR_FIRE_TEMPLE: /*if (IsGlitched && (GetDifficultyValueFromString(GlitchLedgeClip) >= static_cast(GlitchDifficulty::INTERMEDIATE) || GetDifficultyValueFromString(GlitchHover) >= static_cast(GlitchDifficulty::INTERMEDIATE))) { return FireTempleKeys >= requiredAmountGlitched; }*/ return FireTempleKeys >= requiredAmountGlitchless; - case WATER_TEMPLE: + case RR_WATER_TEMPLE: /*if (IsGlitched && (false)) { return WaterTempleKeys >= requiredAmountGlitched; }*/ return WaterTempleKeys >= requiredAmountGlitchless; - case SPIRIT_TEMPLE: + case RR_SPIRIT_TEMPLE: /*if (IsGlitched && (false)) { return SpiritTempleKeys >= requiredAmountGlitched; }*/ return SpiritTempleKeys >= requiredAmountGlitchless; - case SHADOW_TEMPLE: + case RR_SHADOW_TEMPLE: /*if (IsGlitched && (GetDifficultyValueFromString(GlitchHookshotClip) >= static_cast(GlitchDifficulty::NOVICE))) { return ShadowTempleKeys >= requiredAmountGlitched; }*/ return ShadowTempleKeys >= requiredAmountGlitchless; - case BOTTOM_OF_THE_WELL: + case RR_BOTTOM_OF_THE_WELL: /*if (IsGlitched && (false)) { return BottomOfTheWellKeys >= requiredAmountGlitched; }*/ return BottomOfTheWellKeys >= requiredAmountGlitchless; - case GERUDO_TRAINING_GROUNDS: + case RR_GERUDO_TRAINING_GROUNDS: /*if (IsGlitched && (false)) { return GerudoTrainingGroundsKeys >= requiredAmountGlitched; }*/ return GerudoTrainingGroundsKeys >= requiredAmountGlitchless; - case GANONS_CASTLE: + case RR_GANONS_CASTLE: /*if (IsGlitched && (false)) { return GanonsCastleKeys >= requiredAmountGlitched; }*/ return GanonsCastleKeys >= requiredAmountGlitchless; - case MARKET_TREASURE_CHEST_GAME: + case RR_MARKET_TREASURE_CHEST_GAME: /*if (IsGlitched && (false)) { return TreasureGameKeys >= requiredAmountGlitched; }*/ diff --git a/soh/soh/Enhancements/randomizer/3drando/logic.hpp b/soh/soh/Enhancements/randomizer/3drando/logic.hpp index 4d24fd3ff..0262ad005 100644 --- a/soh/soh/Enhancements/randomizer/3drando/logic.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/logic.hpp @@ -1,6 +1,6 @@ #pragma once -#include "keys.hpp" +#include "../randomizerTypes.h" #include namespace Logic { @@ -365,10 +365,10 @@ enum class GlitchDifficulty { void UpdateHelpers(); bool CanPlay(bool song); -bool CanUse(uint32_t itemName); +bool CanUse(RandomizerGet itemName); bool HasProjectile(HasProjectileAge age); -bool SmallKeys(Key dungeon, uint8_t requiredAmount); -bool SmallKeys(Key dungeon, uint8_t requiredAmountGlitchless, uint8_t requiredAmountGlitched); +bool SmallKeys(RandomizerRegion dungeon, uint8_t requiredAmount); +bool SmallKeys(RandomizerRegion dungeon, uint8_t requiredAmountGlitchless, uint8_t requiredAmountGlitched); bool CanDoGlitch(GlitchType glitch); bool EventsUpdated(); void LogicReset(); diff --git a/soh/soh/Enhancements/randomizer/3drando/menu.hpp b/soh/soh/Enhancements/randomizer/3drando/menu.hpp index 333fcbb2b..8079ab2e9 100644 --- a/soh/soh/Enhancements/randomizer/3drando/menu.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/menu.hpp @@ -13,16 +13,16 @@ #define DELETE_PRESET 6 #define RESET_TO_DEFAULTS 8 -#define RESET "\x1b[0m" -#define DIM "\x1b[2m" +// #define RESET "\x1b[0m" +// #define DIM "\x1b[2m" -#define BLACK "\x1b[30m" -#define RED "\x1b[31m" -#define GREEN "\x1b[32m" -#define YELLOW "\x1b[33m" -#define BLUE "\x1b[34m" -#define MEGANTA "\x1b[35m" -#define CYAN "\x1b[36m" -#define WHITE "\x1b[37m" +// #define BLACK "\x1b[30m" +// #define RED "\x1b[31m" +// #define GREEN "\x1b[32m" +// #define YELLOW "\x1b[33m" +// #define BLUE "\x1b[34m" +// #define MEGANTA "\x1b[35m" +// #define CYAN "\x1b[36m" +// #define WHITE "\x1b[37m" std::string GenerateRandomizer(std::unordered_map cvarSetting, std::set excludedLocations, std::set enabledTricks, std::string seedInput); \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/3drando/playthrough.cpp b/soh/soh/Enhancements/randomizer/3drando/playthrough.cpp index 088ba5067..4ae1c3b67 100644 --- a/soh/soh/Enhancements/randomizer/3drando/playthrough.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/playthrough.cpp @@ -16,10 +16,11 @@ int Playthrough_Init(uint32_t seed, std::unordered_mapoverrides.clear(); CustomMessages::ClearMessages(); - ItemReset(); - HintReset(); + ctx->ItemReset(); + ctx->HintReset(); Areas::AccessReset(); Settings::UpdateSettings(cvarSettings, excludedLocations, enabledTricks); @@ -75,9 +76,9 @@ int Playthrough_Init(uint32_t seed, std::unordered_mapplaythroughLocations.clear(); + ctx->wothLocations.clear(); + ctx->playthroughBeatable = false; return 1; } diff --git a/soh/soh/Enhancements/randomizer/3drando/playthrough.hpp b/soh/soh/Enhancements/randomizer/3drando/playthrough.hpp index 90e5988b9..9b59b8f5e 100644 --- a/soh/soh/Enhancements/randomizer/3drando/playthrough.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/playthrough.hpp @@ -1,7 +1,7 @@ #pragma once #include #include -#include "item_location.hpp" +#include "../context.h" namespace Playthrough { int Playthrough_Init(uint32_t seed, std::unordered_map cvarSettings, std::set excludedLocations, std::set enabledTricks); diff --git a/soh/soh/Enhancements/randomizer/3drando/rando_main.cpp b/soh/soh/Enhancements/randomizer/3drando/rando_main.cpp index 167e12667..5b35a85ab 100644 --- a/soh/soh/Enhancements/randomizer/3drando/rando_main.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/rando_main.cpp @@ -1,7 +1,7 @@ #include "menu.hpp" #include "hint_list.hpp" -#include "item_list.hpp" -#include "item_location.hpp" +#include "../static_data.h" +#include "../item_location.h" #include "location_access.hpp" #include "rando_main.hpp" // #include @@ -12,8 +12,6 @@ void RandoMain::GenerateRando(std::unordered_map cvarSettings, std::set excludedLocations, std::set enabledTricks, std::string seedString) { HintTable_Init(); - ItemTable_Init(); - LocationTable_Init(); // std::string settingsFileName = "./randomizer/latest_settings.json"; // CVarSetString("gLoadedPreset", settingsFileName.c_str()); @@ -24,10 +22,4 @@ void RandoMain::GenerateRando(std::unordered_map cvarS CVarSave(); CVarLoad(); CVarSetInteger("gNewSeedGenerated", 1); -} - -std::array* RandoMain::GetFullItemTable() { - ItemTable_Init(); - - return GetFullItemTable_(); -} +} \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/3drando/rando_main.hpp b/soh/soh/Enhancements/randomizer/3drando/rando_main.hpp index 159afb0cb..54ebdf6f8 100644 --- a/soh/soh/Enhancements/randomizer/3drando/rando_main.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/rando_main.hpp @@ -1,8 +1,5 @@ #pragma once - -#include "item.hpp" - +#include "soh/Enhancements/randomizer/item.h" namespace RandoMain { void GenerateRando(std::unordered_map cvarSettings, std::set excludedLocations, std::set enabledTricks, std::string seedInput); -std::array* GetFullItemTable(); } diff --git a/soh/soh/Enhancements/randomizer/3drando/settings.cpp b/soh/soh/Enhancements/randomizer/3drando/settings.cpp index 2cd894ffd..ed84480cf 100644 --- a/soh/soh/Enhancements/randomizer/3drando/settings.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/settings.cpp @@ -2,11 +2,11 @@ #include "dungeon.hpp" #include "fill.hpp" -#include "item_location.hpp" +#include "../context.h" +#include "../item_location.h" #include "random.hpp" #include "randomizer.hpp" #include "trial.hpp" -#include "keys.hpp" using namespace Dungeon; using namespace Trial; @@ -1508,17 +1508,19 @@ namespace Settings { } //Include and Lock the desired locations - static void IncludeAndHide(std::vector locations) { - for (uint32_t loc : locations) { - Location(loc)->GetExcludedOption()->SetSelectedIndex(INCLUDE); - Location(loc)->GetExcludedOption()->Hide(); + static void IncludeAndHide(std::vector locations) { + auto ctx = Rando::Context::GetInstance(); + for (RandomizerCheck loc : locations) { + ctx->GetItemLocation(loc)->GetExcludedOption()->SetSelectedIndex(INCLUDE); + ctx->GetItemLocation(loc)->GetExcludedOption()->Hide(); } } //Unlock the desired locations - static void Unhide(std::vector locations) { - for (uint32_t loc : locations) { - Location(loc)->GetExcludedOption()->Unhide(); + static void Unhide(std::vector locations) { + auto ctx = Rando::Context::GetInstance(); + for (RandomizerCheck loc : locations) { + ctx->GetItemLocation(loc)->GetExcludedOption()->Unhide(); } } @@ -1552,200 +1554,216 @@ namespace Settings { //menu if the player's current settings would require non-junk to be placed //at those locations. Excluded locations will have junk placed at them. void ResolveExcludedLocationConflicts() { + auto ctx = Rando::Context::GetInstance(); + std::vector shopLocations = ctx->GetLocations(ctx->everyPossibleLocation, Category::cShop); + // For now, just always hide shop locations, as not sure how to handle hiding them- + // 1-4 should always be hidden, while the others should be settings dependent, but random shopsanity makes that + // more complicated... Excluded shop locations are also wonky + IncludeAndHide(shopLocations); - std::vector shopLocations = GetLocations(everyPossibleLocation, Category::cShop); - //For now, just always hide shop locations, as not sure how to handle hiding them- - //1-4 should always be hidden, while the others should be settings dependent, but random shopsanity makes that more complicated... - //Excluded shop locations are also wonky - IncludeAndHide(shopLocations); + // Force include song locations + std::vector songLocations = ctx->GetLocations(ctx->everyPossibleLocation, Category::cSong); + std::vector songDungeonRewards = + ctx->GetLocations(ctx->everyPossibleLocation, Category::cSongDungeonReward); - //Force include song locations - std::vector songLocations = GetLocations(everyPossibleLocation, Category::cSong); - std::vector songDungeonRewards = GetLocations(everyPossibleLocation, Category::cSongDungeonReward); + // Unhide all song locations, then lock necessary ones + Unhide(songLocations); + Unhide(songDungeonRewards); - //Unhide all song locations, then lock necessary ones - Unhide(songLocations); - Unhide(songDungeonRewards); - - if (ShuffleSongs.Is(SONGSHUFFLE_SONG_LOCATIONS)) { - IncludeAndHide(songLocations); - } else if (ShuffleSongs.Is(SONGSHUFFLE_DUNGEON_REWARDS)) { - IncludeAndHide(songDungeonRewards); - } - - //Force Include Vanilla Skulltula locations - std::vector skulltulaLocations = GetLocations(everyPossibleLocation, Category::cSkulltula); - Unhide(skulltulaLocations); - if (Tokensanity.IsNot(TOKENSANITY_ALL_TOKENS)) { - if (Tokensanity.Is(TOKENSANITY_OVERWORLD)) { - //filter overworld skulls so we're just left with dungeons - FilterAndEraseFromPool(skulltulaLocations, [](const uint32_t loc){return Location(loc)->GetScene() >= 0x0A;}); - } else if (Tokensanity.Is(TOKENSANITY_DUNGEONS)) { - //filter dungeon skulls so we're just left with overworld - FilterAndEraseFromPool(skulltulaLocations, [](const uint32_t loc){return Location(loc)->GetScene() < 0x0A;}); + if (ShuffleSongs.Is(SONGSHUFFLE_SONG_LOCATIONS)) { + IncludeAndHide(songLocations); + } else if (ShuffleSongs.Is(SONGSHUFFLE_DUNGEON_REWARDS)) { + IncludeAndHide(songDungeonRewards); } - IncludeAndHide(skulltulaLocations); - } - //Force Include scrubs if Scrubsanity is Off - std::vector scrubLocations = GetLocations(everyPossibleLocation, Category::cDekuScrub, Category::cDekuScrubUpgrades); - if (Scrubsanity.Is(OFF)) { - IncludeAndHide(scrubLocations); - } else { - Unhide(scrubLocations); - } + // Force Include Vanilla Skulltula locations + std::vector skulltulaLocations = + ctx->GetLocations(ctx->everyPossibleLocation, Category::cSkulltula); + Unhide(skulltulaLocations); + if (Tokensanity.IsNot(TOKENSANITY_ALL_TOKENS)) { + if (Tokensanity.Is(TOKENSANITY_OVERWORLD)) { + // filter overworld skulls so we're just left with dungeons + FilterAndEraseFromPool(skulltulaLocations, [](const RandomizerCheck loc) { + return Rando::StaticData::GetLocation(loc)->GetScene() >= 0x0A; + }); + } else if (Tokensanity.Is(TOKENSANITY_DUNGEONS)) { + // filter dungeon skulls so we're just left with overworld + FilterAndEraseFromPool(skulltulaLocations, [](const RandomizerCheck loc) { + return Rando::StaticData::GetLocation(loc)->GetScene() < 0x0A; + }); + } + IncludeAndHide(skulltulaLocations); + } - //Force include Cows if Shuffle Cows is Off - std::vector cowLocations = GetLocations(everyPossibleLocation, Category::cCow); - if (ShuffleCows) { - Unhide(cowLocations); - } else { - IncludeAndHide(cowLocations); - } + // Force Include scrubs if Scrubsanity is Off + std::vector scrubLocations = + ctx->GetLocations(ctx->everyPossibleLocation, Category::cDekuScrub, Category::cDekuScrubUpgrades); + if (Scrubsanity.Is(OFF)) { + IncludeAndHide(scrubLocations); + } else { + Unhide(scrubLocations); + } - //Force include the Kokiri Sword Chest if Shuffle Kokiri Sword is Off - if (ShuffleKokiriSword) { - Unhide({KF_KOKIRI_SWORD_CHEST}); - } else { - IncludeAndHide({KF_KOKIRI_SWORD_CHEST}); - } + // Force include Cows if Shuffle Cows is Off + std::vector cowLocations = ctx->GetLocations(ctx->everyPossibleLocation, Category::cCow); + if (ShuffleCows) { + Unhide(cowLocations); + } else { + IncludeAndHide(cowLocations); + } - //Force include the ocarina locations if Shuffle Ocarinas is Off - std::vector ocarinaLocations = {LW_GIFT_FROM_SARIA, HF_OCARINA_OF_TIME_ITEM}; - if (ShuffleOcarinas) { - Unhide(ocarinaLocations); - } else { - IncludeAndHide(ocarinaLocations); - } + // Force include the Kokiri Sword Chest if Shuffle Kokiri Sword is Off + if (ShuffleKokiriSword) { + Unhide({ RC_KF_KOKIRI_SWORD_CHEST }); + } else { + IncludeAndHide({ RC_KF_KOKIRI_SWORD_CHEST }); + } - //Force include Malon if Shuffle Weird Egg is Off - if (ShuffleWeirdEgg) { - Unhide({HC_MALON_EGG}); - } else { - IncludeAndHide({HC_MALON_EGG}); - } + // Force include the ocarina locations if Shuffle Ocarinas is Off + std::vector ocarinaLocations = { RC_LW_GIFT_FROM_SARIA, RC_HF_OCARINA_OF_TIME_ITEM }; + if (ShuffleOcarinas) { + Unhide(ocarinaLocations); + } else { + IncludeAndHide(ocarinaLocations); + } - //Force include Gerudo Membership Card Location if it's not shuffled - if (ShuffleGerudoToken) { - Unhide({GF_GERUDO_MEMBERSHIP_CARD}); - } else { - IncludeAndHide({GF_GERUDO_MEMBERSHIP_CARD}); - } + // Force include Malon if Shuffle Weird Egg is Off + if (ShuffleWeirdEgg) { + Unhide({ RC_HC_MALON_EGG }); + } else { + IncludeAndHide({ RC_HC_MALON_EGG }); + } - //Force include Magic Bean salesman if Shuffle Magic Beans is off - if (ShuffleMagicBeans) { - Unhide({ZR_MAGIC_BEAN_SALESMAN}); - } else { - IncludeAndHide({ZR_MAGIC_BEAN_SALESMAN}); - } + // Force include Gerudo Membership Card GetLocation if it's not shuffled + if (ShuffleGerudoToken) { + Unhide({ RC_GF_GERUDO_MEMBERSHIP_CARD }); + } else { + IncludeAndHide({ RC_GF_GERUDO_MEMBERSHIP_CARD }); + } - //Force include Medigoron, Granny and Carpet salesman if Shuffle Merchants is off - if (ShuffleMerchants.IsNot(SHUFFLEMERCHANTS_OFF)) { - Unhide({GC_MEDIGORON}); - Unhide({KAK_GRANNYS_SHOP}); - Unhide({WASTELAND_BOMBCHU_SALESMAN}); - } else { - IncludeAndHide({GC_MEDIGORON}); - IncludeAndHide({KAK_GRANNYS_SHOP}); - IncludeAndHide({WASTELAND_BOMBCHU_SALESMAN}); - } + // Force include Magic Bean salesman if Shuffle Magic Beans is off + if (ShuffleMagicBeans) { + Unhide({ RC_ZR_MAGIC_BEAN_SALESMAN }); + } else { + IncludeAndHide({ RC_ZR_MAGIC_BEAN_SALESMAN }); + } - //Force include frog song rupees if they're not shuffled - if (ShuffleFrogSongRupees) { - Unhide({ZR_FROGS_ZELDAS_LULLABY}); - Unhide({ZR_FROGS_EPONAS_SONG}); - Unhide({ZR_FROGS_SARIAS_SONG}); - Unhide({ZR_FROGS_SUNS_SONG}); - Unhide({ZR_FROGS_SONG_OF_TIME}); - } else { - IncludeAndHide({ZR_FROGS_ZELDAS_LULLABY}); - IncludeAndHide({ZR_FROGS_EPONAS_SONG}); - IncludeAndHide({ZR_FROGS_SARIAS_SONG}); - IncludeAndHide({ZR_FROGS_SUNS_SONG}); - IncludeAndHide({ZR_FROGS_SONG_OF_TIME}); - } + // Force include Medigoron, Granny and Carpet salesman if Shuffle Merchants is off + if (ShuffleMerchants.IsNot(SHUFFLEMERCHANTS_OFF)) { + Unhide({ RC_GC_MEDIGORON }); + Unhide({ RC_KAK_GRANNYS_SHOP }); + Unhide({ RC_WASTELAND_BOMBCHU_SALESMAN }); + } else { + IncludeAndHide({ RC_GC_MEDIGORON }); + IncludeAndHide({ RC_KAK_GRANNYS_SHOP }); + IncludeAndHide({ RC_WASTELAND_BOMBCHU_SALESMAN }); + } - //Force include adult trade quest if Shuffle Adult Trade Quest is off - std::vector adultTradeLocations = {KAK_TRADE_POCKET_CUCCO, LW_TRADE_COJIRO, KAK_TRADE_ODD_MUSHROOM, LW_TRADE_ODD_POTION, GV_TRADE_SAW, DMT_TRADE_BROKEN_SWORD, ZD_TRADE_PRESCRIPTION, LH_TRADE_FROG, DMT_TRADE_EYEDROPS}; - if (ShuffleAdultTradeQuest) { - Unhide(adultTradeLocations); - } else { - IncludeAndHide(adultTradeLocations); - } + // Force include frog song rupees if they're not shuffled + if (ShuffleFrogSongRupees) { + Unhide({ RC_ZR_FROGS_ZELDAS_LULLABY }); + Unhide({ RC_ZR_FROGS_EPONAS_SONG }); + Unhide({ RC_ZR_FROGS_SARIAS_SONG }); + Unhide({ RC_ZR_FROGS_SUNS_SONG }); + Unhide({ RC_ZR_FROGS_SONG_OF_TIME }); + } else { + IncludeAndHide({ RC_ZR_FROGS_ZELDAS_LULLABY }); + IncludeAndHide({ RC_ZR_FROGS_EPONAS_SONG }); + IncludeAndHide({ RC_ZR_FROGS_SARIAS_SONG }); + IncludeAndHide({ RC_ZR_FROGS_SUNS_SONG }); + IncludeAndHide({ RC_ZR_FROGS_SONG_OF_TIME }); + } - //Force include Chest Game keys if Shuffle Chest Minigame is off - std::vector ChestMinigameLocations = { - MARKET_TREASURE_CHEST_GAME_ITEM_1, MARKET_TREASURE_CHEST_GAME_ITEM_2, MARKET_TREASURE_CHEST_GAME_ITEM_3, - MARKET_TREASURE_CHEST_GAME_ITEM_4, MARKET_TREASURE_CHEST_GAME_ITEM_5 - }; - if (ShuffleChestMinigame) { - Unhide(ChestMinigameLocations); - } else { - IncludeAndHide(ChestMinigameLocations); - } + // Force include adult trade quest if Shuffle Adult Trade Quest is off + std::vector adultTradeLocations = { RC_KAK_TRADE_POCKET_CUCCO, RC_LW_TRADE_COJIRO, + RC_KAK_TRADE_ODD_MUSHROOM, RC_LW_TRADE_ODD_POTION, + RC_GV_TRADE_SAW, RC_DMT_TRADE_BROKEN_SWORD, + RC_ZD_TRADE_PRESCRIPTION, RC_LH_TRADE_FROG, + RC_DMT_TRADE_EYEDROPS }; + if (ShuffleAdultTradeQuest) { + Unhide(adultTradeLocations); + } else { + IncludeAndHide(adultTradeLocations); + } - //Force include 100 GS reward if it isn't shuffled - if (Shuffle100GSReward) { - Unhide({KAK_100_GOLD_SKULLTULA_REWARD}); - } else { - IncludeAndHide({KAK_100_GOLD_SKULLTULA_REWARD}); - } + // Force include Chest Game keys if Shuffle Chest Minigame is off + std::vector ChestMinigameLocations = { RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, + RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, + RC_MARKET_TREASURE_CHEST_GAME_ITEM_3, + RC_MARKET_TREASURE_CHEST_GAME_ITEM_4, + RC_MARKET_TREASURE_CHEST_GAME_ITEM_5 }; + if (ShuffleChestMinigame) { + Unhide(ChestMinigameLocations); + } else { + IncludeAndHide(ChestMinigameLocations); + } - //Force include Triforce Hunt if it's off - if (TriforceHunt) { - Unhide({ TRIFORCE_COMPLETED }); - } else { - IncludeAndHide({ TRIFORCE_COMPLETED }); - } + // Force include 100 GS reward if it isn't shuffled + if (Shuffle100GSReward) { + Unhide({ RC_KAK_100_GOLD_SKULLTULA_REWARD }); + } else { + IncludeAndHide({ RC_KAK_100_GOLD_SKULLTULA_REWARD }); + } - //Force include Map and Compass Chests when Vanilla - std::vector mapChests = GetLocations(everyPossibleLocation, Category::cVanillaMap); - std::vector compassChests = GetLocations(everyPossibleLocation, Category::cVanillaCompass); - if (MapsAndCompasses.Is(MAPSANDCOMPASSES_VANILLA)) { - IncludeAndHide(mapChests); - IncludeAndHide(compassChests); - } else { - Unhide(mapChests); - Unhide(compassChests); - } + // Force include Triforce Hunt if it's off + if (TriforceHunt) { + Unhide({ RC_TRIFORCE_COMPLETED }); + } else { + IncludeAndHide({ RC_TRIFORCE_COMPLETED }); + } - //Force include Vanilla Small Key Locations (except gerudo Fortress) on Vanilla Keys - std::vector smallKeyChests = GetLocations(everyPossibleLocation, Category::cVanillaSmallKey); - if (Keysanity.Is(KEYSANITY_VANILLA)) { - IncludeAndHide(smallKeyChests); - } else { - Unhide(smallKeyChests); - } + // Force include Map and Compass Chests when Vanilla + std::vector mapChests = ctx->GetLocations(ctx->everyPossibleLocation, Category::cVanillaMap); + std::vector compassChests = + ctx->GetLocations(ctx->everyPossibleLocation, Category::cVanillaCompass); + if (MapsAndCompasses.Is(MAPSANDCOMPASSES_VANILLA)) { + IncludeAndHide(mapChests); + IncludeAndHide(compassChests); + } else { + Unhide(mapChests); + Unhide(compassChests); + } - //Force include Gerudo Fortress carpenter fights if GF Small Keys are Vanilla - std::vector vanillaGFKeyLocations = GetLocations(everyPossibleLocation, Category::cVanillaGFSmallKey); - if (GerudoKeys.Is(GERUDOKEYS_VANILLA)) { - IncludeAndHide(vanillaGFKeyLocations); - } else { - Unhide(vanillaGFKeyLocations); - } + // Force include Vanilla Small Key Locations (except gerudo Fortress) on Vanilla Keys + std::vector smallKeyChests = + ctx->GetLocations(ctx->everyPossibleLocation, Category::cVanillaSmallKey); + if (Keysanity.Is(KEYSANITY_VANILLA)) { + IncludeAndHide(smallKeyChests); + } else { + Unhide(smallKeyChests); + } - //Force include Boss Key Chests if Boss Keys are Vanilla - std::vector bossKeyChests = GetLocations(everyPossibleLocation, Category::cVanillaBossKey); - if (BossKeysanity.Is(BOSSKEYSANITY_VANILLA)) { - IncludeAndHide(bossKeyChests); - } else { - Unhide(bossKeyChests); - } + // Force include Gerudo Fortress carpenter fights if GF Small Keys are Vanilla + std::vector vanillaGFKeyLocations = + ctx->GetLocations(ctx->everyPossibleLocation, Category::cVanillaGFSmallKey); + if (GerudoKeys.Is(GERUDOKEYS_VANILLA)) { + IncludeAndHide(vanillaGFKeyLocations); + } else { + Unhide(vanillaGFKeyLocations); + } - //Force include Ganons Boss Key Chest if ganons boss key has to be there - if (GanonsBossKey.Is(GANONSBOSSKEY_VANILLA)) { - IncludeAndHide({GANONS_TOWER_BOSS_KEY_CHEST}); - } else { - Unhide({GANONS_TOWER_BOSS_KEY_CHEST}); - } + // Force include Boss Key Chests if Boss Keys are Vanilla + std::vector bossKeyChests = + ctx->GetLocations(ctx->everyPossibleLocation, Category::cVanillaBossKey); + if (BossKeysanity.Is(BOSSKEYSANITY_VANILLA)) { + IncludeAndHide(bossKeyChests); + } else { + Unhide(bossKeyChests); + } - //Force include Light Arrow item if ganons boss key has to be there - if (GanonsBossKey.Value() >= GANONSBOSSKEY_LACS_VANILLA) { - IncludeAndHide({TOT_LIGHT_ARROWS_CUTSCENE}); - } else { - Unhide({TOT_LIGHT_ARROWS_CUTSCENE}); - } + // Force include Ganons Boss Key Chest if ganons boss key has to be there + if (GanonsBossKey.Is(GANONSBOSSKEY_VANILLA)) { + IncludeAndHide({ RC_GANONS_TOWER_BOSS_KEY_CHEST }); + } else { + Unhide({ RC_GANONS_TOWER_BOSS_KEY_CHEST }); + } + + // Force include Light Arrow item if ganons boss key has to be there + if (GanonsBossKey.Value() >= GANONSBOSSKEY_LACS_VANILLA) { + IncludeAndHide({ RC_TOT_LIGHT_ARROWS_CUTSCENE }); + } else { + Unhide({ RC_TOT_LIGHT_ARROWS_CUTSCENE }); + } } uint8_t DungeonsOfType(uint8_t type) { @@ -2205,10 +2223,10 @@ namespace Settings { } LocationsReachable.SetSelectedIndex(cvarSettings[RSK_ALL_LOCATIONS_REACHABLE]); - - AddExcludedOptions(); - for (auto locationKey : everyPossibleLocation) { - auto location = Location(locationKey); + auto ctx = Rando::Context::GetInstance(); + ctx->AddExcludedOptions(); + for (auto locationKey : ctx->everyPossibleLocation) { + auto location = ctx->GetItemLocation(locationKey); if (excludedLocations.count(location->GetRandomizerCheck())) { location->GetExcludedOption()->SetSelectedIndex(1); } else { diff --git a/soh/soh/Enhancements/randomizer/3drando/settings.hpp b/soh/soh/Enhancements/randomizer/3drando/settings.hpp index 0d3d3c898..a29df2a9b 100644 --- a/soh/soh/Enhancements/randomizer/3drando/settings.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/settings.hpp @@ -737,7 +737,7 @@ class Menu { namespace Settings { void UpdateSettings(std::unordered_map cvarSettings, std::set excludedLocations, std::set enabledTricks); SettingsContext FillContext(); - void ResolveExcludedLocationConflicts(); + //void ResolveExcludedLocationConflicts(); void RandomizeAllSettings(const bool selectOptions = false); void ForceChange(uint32_t kDown, Option* currentSetting); const std::vector GetAllOptionMenus(); diff --git a/soh/soh/Enhancements/randomizer/3drando/shops.cpp b/soh/soh/Enhancements/randomizer/3drando/shops.cpp index 8c47ac976..76839fced 100644 --- a/soh/soh/Enhancements/randomizer/3drando/shops.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/shops.cpp @@ -1,8 +1,6 @@ -#include "item_location.hpp" #include "item_pool.hpp" #include "location_access.hpp" #include "random.hpp" -#include "item.hpp" #include "shops.hpp" #include @@ -18,10 +16,11 @@ bool initTrickNames = false; //Indicates if trick ice trap names have been initi //Set vanilla shop item locations before potentially shuffling void PlaceVanillaShopItems() { + auto ctx = Rando::Context::GetInstance(); //Loop to place vanilla items in each location - for (size_t i = 0; i < ShopLocationLists.size(); i++) { - for (size_t j = 0; j < ShopLocationLists[i].size(); j++) { - Location(ShopLocationLists[i][j])->PlaceVanillaItem(); + for (size_t i = 0; i < Rando::StaticData::shopLocationLists.size(); i++) { + for (size_t j = 0; j < Rando::StaticData::shopLocationLists[i].size(); j++) { + ctx->GetItemLocation(Rando::StaticData::shopLocationLists[i][j])->PlaceVanillaItem(); } } } @@ -31,77 +30,77 @@ void PlaceVanillaShopItems() { //The first 32 items here will always be present in shops //Shopsanity 4 will only have the first 32, shopsanity 1 will have the first 56, etc. //Shopsanity random will have anywhere from the first 32 to the first 56, so the order of items after 32 is relevant -std::vector GetMinVanillaShopItems(int total_replaced) { - std::vector minShopItems = { - BUY_DEKU_SHIELD, - BUY_HYLIAN_SHIELD, - BUY_GORON_TUNIC, - BUY_ZORA_TUNIC, - BUY_DEKU_NUT_5, - BUY_DEKU_NUT_5, - BUY_DEKU_NUT_10, - BUY_DEKU_STICK_1, - BUY_DEKU_STICK_1, - BUY_DEKU_SEEDS_30, - BUY_ARROWS_10, - BUY_ARROWS_10, - BUY_ARROWS_30, - BUY_ARROWS_50, - BUY_BOMBCHU_10, - BUY_BOMBCHU_10, - BUY_BOMBCHU_10, - BUY_BOMBCHU_20, - BUY_BOMBS_525, - BUY_BOMBS_535, - BUY_BOMBS_10, - BUY_BOMBS_20, - BUY_GREEN_POTION, - BUY_RED_POTION_30, - BUY_BLUE_FIRE, - BUY_FAIRYS_SPIRIT, - BUY_BOTTLE_BUG, - BUY_FISH, +std::vector GetMinVanillaShopItems(int total_replaced) { + std::vector minShopItems = { + RG_BUY_DEKU_SHIELD, + RG_BUY_HYLIAN_SHIELD, + RG_BUY_GORON_TUNIC, + RG_BUY_ZORA_TUNIC, + RG_BUY_DEKU_NUT_5, + RG_BUY_DEKU_NUT_5, + RG_BUY_DEKU_NUT_10, + RG_BUY_DEKU_STICK_1, + RG_BUY_DEKU_STICK_1, + RG_BUY_DEKU_SEEDS_30, + RG_BUY_ARROWS_10, + RG_BUY_ARROWS_10, + RG_BUY_ARROWS_30, + RG_BUY_ARROWS_50, + RG_BUY_BOMBCHU_10, + RG_BUY_BOMBCHU_10, + RG_BUY_BOMBCHU_10, + RG_BUY_BOMBCHU_20, + RG_BUY_BOMBS_525, + RG_BUY_BOMBS_535, + RG_BUY_BOMBS_10, + RG_BUY_BOMBS_20, + RG_BUY_GREEN_POTION, + RG_BUY_RED_POTION_30, + RG_BUY_BLUE_FIRE, + RG_BUY_FAIRYS_SPIRIT, + RG_BUY_BOTTLE_BUG, + RG_BUY_FISH, //^First 28 items from OoTR - BUY_HYLIAN_SHIELD, - BUY_BOTTLE_BUG, - BUY_DEKU_STICK_1, - BUY_FAIRYS_SPIRIT, + RG_BUY_HYLIAN_SHIELD, + RG_BUY_BOTTLE_BUG, + RG_BUY_DEKU_STICK_1, + RG_BUY_FAIRYS_SPIRIT, //^First 32 items: Always guaranteed - BUY_BLUE_FIRE, - BUY_FISH, - BUY_BOMBCHU_10, - BUY_DEKU_NUT_5, - BUY_ARROWS_10, - BUY_BOMBCHU_20, - BUY_BOMBS_535, - BUY_RED_POTION_30, + RG_BUY_BLUE_FIRE, + RG_BUY_FISH, + RG_BUY_BOMBCHU_10, + RG_BUY_DEKU_NUT_5, + RG_BUY_ARROWS_10, + RG_BUY_BOMBCHU_20, + RG_BUY_BOMBS_535, + RG_BUY_RED_POTION_30, //^First 40 items: Exist on shopsanity 3 or less - BUY_BOMBS_30, - BUY_BOMBCHU_20, - BUY_DEKU_NUT_5, - BUY_ARROWS_10, - BUY_DEKU_NUT_5, - BUY_ARROWS_30, - BUY_RED_POTION_40, - BUY_FISH, + RG_BUY_BOMBS_30, + RG_BUY_BOMBCHU_20, + RG_BUY_DEKU_NUT_5, + RG_BUY_ARROWS_10, + RG_BUY_DEKU_NUT_5, + RG_BUY_ARROWS_30, + RG_BUY_RED_POTION_40, + RG_BUY_FISH, //^First 48 items: Exist on shopsanity 2 or less - BUY_BOMBCHU_20, - BUY_ARROWS_30, - BUY_RED_POTION_50, - BUY_ARROWS_30, - BUY_DEKU_NUT_5, - BUY_ARROWS_50, - BUY_ARROWS_50, - BUY_GREEN_POTION, + RG_BUY_BOMBCHU_20, + RG_BUY_ARROWS_30, + RG_BUY_RED_POTION_50, + RG_BUY_ARROWS_30, + RG_BUY_DEKU_NUT_5, + RG_BUY_ARROWS_50, + RG_BUY_ARROWS_50, + RG_BUY_GREEN_POTION, //^First 56 items: Exist on shopsanity 1 or less - BUY_POE, - BUY_POE, - BUY_HEART, - BUY_HEART, - BUY_HEART, - BUY_HEART, - BUY_HEART, - BUY_HEART, + RG_BUY_POE, + RG_BUY_POE, + RG_BUY_HEART, + RG_BUY_HEART, + RG_BUY_HEART, + RG_BUY_HEART, + RG_BUY_HEART, + RG_BUY_HEART, //^All 64 items: Only exist with shopsanity 0 }; //Now delete however many items there are to replace @@ -865,9 +864,9 @@ Text GetIceTrapName(uint8_t id) { //Get shop index based on a given location static std::map ShopNameToNum = {{"KF Shop", 0}, {"Kak Potion Shop", 1}, {"MK Bombchu Shop", 2}, {"MK Potion Shop", 3}, {"MK Bazaar", 4}, {"Kak Bazaar", 5}, {"ZD Shop", 6}, {"GC Shop", 7}}; -int GetShopIndex(uint32_t loc) { +int GetShopIndex(RandomizerCheck loc) { //Kind of hacky, but extract the shop and item position from the name - const std::string& name(Location(loc)->GetName()); + const std::string& name(Rando::StaticData::GetLocation(loc)->GetName()); int split = name.find(" Item "); std::string_view shop(name.c_str(), split); int pos = std::stoi(name.substr(split+6, 1)) - 1; diff --git a/soh/soh/Enhancements/randomizer/3drando/shops.hpp b/soh/soh/Enhancements/randomizer/3drando/shops.hpp index 4f9f8a957..33cf57ff4 100644 --- a/soh/soh/Enhancements/randomizer/3drando/shops.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/shops.hpp @@ -1,6 +1,5 @@ #pragma once -#include "item.hpp" -#include "item_location.hpp" +#include "../context.h" #include #include @@ -12,12 +11,12 @@ struct ItemAndPrice { }; extern void PlaceVanillaShopItems(); -extern std::vector GetMinVanillaShopItems(int total_replaced); +extern std::vector GetMinVanillaShopItems(int total_replaced); extern int GetRandomShopPrice(); extern int16_t GetRandomScrubPrice(); extern int GetShopsanityReplaceAmount(); extern Text GetIceTrapName(uint8_t id); -extern int GetShopIndex(uint32_t loc); +extern int GetShopIndex(RandomizerCheck loc); extern int TransformShopIndex(int index); extern std::vector NonShopItems; diff --git a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp index 2884dd6e7..c7f443bd8 100644 --- a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp @@ -1,8 +1,8 @@ #include "spoiler_log.hpp" #include "dungeon.hpp" -#include "item_list.hpp" -#include "item_location.hpp" +#include "../static_data.h" +#include "../context.h" #include "entrance.hpp" #include "random.hpp" #include "settings.hpp" @@ -30,12 +30,12 @@ #include #include -#include +#include using json = nlohmann::ordered_json; json jsonData; -std::map hintedLocations; +std::map hintedLocations; extern std::unordered_map hintTypeNames; extern std::array hintCategoryNames; @@ -79,6 +79,7 @@ static auto GetPlacementLogPath() { } void WriteIngameSpoilerLog() { + auto ctx = Rando::Context::GetInstance(); uint16_t spoilerItemIndex = 0; uint32_t spoilerStringOffset = 0; uint16_t spoilerSphereItemoffset = 0; @@ -91,28 +92,29 @@ void WriteIngameSpoilerLog() { // Some item names, like gold skulltula tokens, can appear many times in a playthrough std::unordered_map itemLocationsMap; // Map of LocationKey to an index into spoiler data item locations - itemLocationsMap.reserve(allLocations.size()); + itemLocationsMap.reserve(ctx->allLocations.size()); std::unordered_map stringOffsetMap; // Map of strings to their offset into spoiler string data array - stringOffsetMap.reserve(allLocations.size() * 2); + stringOffsetMap.reserve(ctx->allLocations.size() * 2); // Sort all locations by their group, so the in-game log can show a group of items by simply starting/ending at // certain indices - std::stable_sort(allLocations.begin(), allLocations.end(), [](const uint32_t& a, const uint32_t& b) { - auto groupA = Location(a)->GetCollectionCheckGroup(); - auto groupB = Location(b)->GetCollectionCheckGroup(); + std::stable_sort(ctx->allLocations.begin(), ctx->allLocations.end(), [](const RandomizerCheck& a, const RandomizerCheck& b) { + auto groupA = Rando::StaticData::GetLocation(a)->GetCollectionCheckGroup(); + auto groupB = Rando::StaticData::GetLocation(b)->GetCollectionCheckGroup(); return groupA < groupB; }); - for (const uint32_t key : allLocations) { - auto loc = Location(key); + for (const RandomizerCheck key : ctx->allLocations) { + auto loc = Rando::StaticData::GetLocation(key); + auto itemLocation = ctx->GetItemLocation(key); // Hide excluded locations from ingame tracker - if (loc->IsExcluded()) { - continue; - } + // if (loc->IsExcluded()) { + // continue; + // } // Cows - else if (!Settings::ShuffleCows && loc->IsCategory(Category::cCow)) { + if (!Settings::ShuffleCows && loc->IsCategory(Category::cCow)) { continue; } // Merchants @@ -130,9 +132,9 @@ void WriteIngameSpoilerLog() { } // Gerudo Fortress else if ((Settings::GerudoFortress.Is(GERUDOFORTRESS_OPEN) && - (loc->IsCategory(Category::cVanillaGFSmallKey) || loc->GetHintKey() == GF_GERUDO_MEMBERSHIP_CARD)) || + (loc->IsCategory(Category::cVanillaGFSmallKey) || loc->GetHintKey() == RHT_GF_GERUDO_MEMBERSHIP_CARD)) || (Settings::GerudoFortress.Is(GERUDOFORTRESS_FAST) && loc->IsCategory(Category::cVanillaGFSmallKey) && - loc->GetHintKey() != GF_NORTH_F1_CARPENTER)) { + loc->GetHintKey() != RHT_GF_NORTH_F1_CARPENTER)) { continue; } @@ -151,8 +153,8 @@ void WriteIngameSpoilerLog() { } } // PURPLE TODO: LOCALIZATION - auto locItem = loc->GetPlacedItemName().GetEnglish(); - if (loc->GetPlacedItemKey() == ICE_TRAP && loc->IsCategory(Category::cShop)) { + auto locItem = itemLocation->GetPlacedItemName().GetEnglish(); + if (itemLocation->GetPlacedRandomizerGet() == RG_ICE_TRAP && loc->IsCategory(Category::cShop)) { locItem = NonShopItems[TransformShopIndex(GetShopIndex(key))].Name.GetEnglish(); } if (stringOffsetMap.find(locItem) == stringOffsetMap.end()) { @@ -175,10 +177,10 @@ void WriteIngameSpoilerLog() { spoilerData.ItemLocations[spoilerItemIndex].LocationFlag = loc->GetCollectionCheck().flag; // Collect Type and Reveal Type - if (key == GANON) { + if (key == RC_GANON) { spoilerData.ItemLocations[spoilerItemIndex].CollectType = COLLECTTYPE_NEVER; spoilerData.ItemLocations[spoilerItemIndex].RevealType = REVEALTYPE_ALWAYS; - } else if (key == MARKET_BOMBCHU_BOWLING_BOMBCHUS) { + } else if (key == RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS) { spoilerData.ItemLocations[spoilerItemIndex].CollectType = COLLECTTYPE_REPEATABLE; spoilerData.ItemLocations[spoilerItemIndex].RevealType = REVEALTYPE_ALWAYS; } @@ -189,9 +191,9 @@ void WriteIngameSpoilerLog() { } else { spoilerData.ItemLocations[spoilerItemIndex].RevealType = REVEALTYPE_SCENE; } - if (loc->GetPlacedItem().GetItemType() == ITEMTYPE_REFILL || - loc->GetPlacedItem().GetItemType() == ITEMTYPE_SHOP || - loc->GetPlacedItem().GetHintKey() == PROGRESSIVE_BOMBCHUS) { + if (itemLocation->GetPlacedItem().GetItemType() == ITEMTYPE_REFILL || + itemLocation->GetPlacedItem().GetItemType() == ITEMTYPE_SHOP || + itemLocation->GetPlacedItem().GetHintKey() == RHT_PROGRESSIVE_BOMBCHUS) { spoilerData.ItemLocations[spoilerItemIndex].CollectType = COLLECTTYPE_REPEATABLE; } } @@ -228,19 +230,19 @@ void WriteIngameSpoilerLog() { bool playthroughItemNotFound = false; // Write playthrough data to in-game spoiler log if (!spoilerOutOfSpace) { - for (uint32_t i = 0; i < playthroughLocations.size(); i++) { + for (uint32_t i = 0; i < ctx->playthroughLocations.size(); i++) { if (i >= SPOILER_SPHERES_MAX) { spoilerOutOfSpace = true; break; } spoilerData.Spheres[i].ItemLocationsOffset = spoilerSphereItemoffset; - for (uint32_t loc = 0; loc < playthroughLocations[i].size(); ++loc) { + for (uint32_t loc = 0; loc < ctx->playthroughLocations[i].size(); ++loc) { if (spoilerSphereItemoffset >= SPOILER_ITEMS_MAX) { spoilerOutOfSpace = true; break; } - const auto foundItemLoc = itemLocationsMap.find(playthroughLocations[i][loc]); + const auto foundItemLoc = itemLocationsMap.find(ctx->playthroughLocations[i][loc]); if (foundItemLoc != itemLocationsMap.end()) { spoilerData.SphereItemLocations[spoilerSphereItemoffset++] = foundItemLoc->second; } else { @@ -252,24 +254,25 @@ void WriteIngameSpoilerLog() { } } if (spoilerOutOfSpace || playthroughItemNotFound) { - printf("%sError!%s ", YELLOW, WHITE); + printf("Error! "); } } } // Writes the location to the specified node. static void WriteLocation( - std::string sphere, const uint32_t locationKey, const bool withPadding = false) { - ItemLocation* location = Location(locationKey); + std::string sphere, const RandomizerCheck locationKey, const bool withPadding = false) { + Rando::Location* location = Rando::StaticData::GetLocation(locationKey); + Rando::ItemLocation* itemLocation = Rando::Context::GetInstance()->GetItemLocation(locationKey); // auto node = parentNode->InsertNewChildElement("location"); switch (gSaveContext.language) { case LANGUAGE_ENG: default: - jsonData["playthrough"][sphere][location->GetName()] = location->GetPlacedItemName().GetEnglish(); + jsonData["playthrough"][sphere][location->GetName()] = itemLocation->GetPlacedItemName().GetEnglish(); break; case LANGUAGE_FRA: - jsonData["playthrough"][sphere][location->GetName()] = location->GetPlacedItemName().GetFrench(); + jsonData["playthrough"][sphere][location->GetName()] = itemLocation->GetPlacedItemName().GetFrench(); break; } // node->SetAttribute("name", location->GetName().c_str()); @@ -412,7 +415,7 @@ static void WriteSettings(const bool printAll = false) { // spoilerLog.RootElement()->InsertEndChild(parentNode); // for (const uint32_t key : allLocations) { - // ItemLocation* location = Location(key); + // ItemLocation* location = GetLocation(key); // settingsJsonData["locations"][location->GetName()] = location->GetPlacedItemName().english; // } } @@ -570,13 +573,14 @@ static void WriteRequiredTrials() { // Writes the intended playthrough to the spoiler log, separated into spheres. static void WritePlaythrough() { // auto playthroughNode = spoilerLog.NewElement("playthrough"); + auto ctx = Rando::Context::GetInstance(); - for (uint32_t i = 0; i < playthroughLocations.size(); ++i) { + for (uint32_t i = 0; i < ctx->playthroughLocations.size(); ++i) { auto sphereNum = std::to_string(i); std::string sphereString = "sphere "; if (i < 10) sphereString += "0"; sphereString += sphereNum; - for (const uint32_t key : playthroughLocations[i]) { + for (const RandomizerCheck key : ctx->playthroughLocations[i]) { WriteLocation(sphereString, key, true); } } @@ -601,7 +605,7 @@ static void WriteShuffledEntrances() { static void WriteWayOfTheHeroLocation(tinyxml2::XMLDocument& spoilerLog) { auto parentNode = spoilerLog.NewElement("way-of-the-hero-locations"); - for (const uint32_t key : wothLocations) { + for (const RandomizerCheck key : Rando::Context::GetInstance()->wothLocations) { // WriteLocation(parentNode, key, true); } @@ -660,8 +664,11 @@ std::string AutoFormatHintTextString(std::string unformattedHintTextString) { return textStr; } -ItemLocation* GetItemLocation(uint32_t item) { - return Location(FilterFromPool(allLocations, [item](const uint32_t loc){return Location(loc)->GetPlaceduint32_t() == item;})[0]); +Rando::ItemLocation* GetItemLocation(RandomizerGet item) { + auto ctx = Rando::Context::GetInstance(); + return ctx->GetItemLocation(FilterFromPool(ctx->allLocations, [item, ctx](const RandomizerCheck loc) { + return ctx->GetItemLocation(loc)->GetPlacedRandomizerGet() == item; + })[0]); } // Writes the hints to the spoiler log, if they are enabled. @@ -709,30 +716,37 @@ static void WriteHints(int language) { break; } - ItemLocation* emeraldLoc = GetItemLocation(KOKIRI_EMERALD); - ItemLocation* rubyLoc = GetItemLocation(GORON_RUBY); - ItemLocation* sapphireLoc = GetItemLocation(ZORA_SAPPHIRE); + Rando::ItemLocation* emeraldLoc = GetItemLocation(RG_KOKIRI_EMERALD); + Rando::ItemLocation* rubyLoc = GetItemLocation(RG_GORON_RUBY); + Rando::ItemLocation* sapphireLoc = GetItemLocation(RG_ZORA_SAPPHIRE); std::string emeraldArea; std::string erubyArea; std::string sapphireArea; - jsonData["childAltar"]["rewards"]["emeraldLoc"] = emeraldLoc->GetName(); - jsonData["childAltar"]["rewards"]["rubyLoc"] = rubyLoc->GetName(); - jsonData["childAltar"]["rewards"]["sapphireLoc"] = sapphireLoc->GetName(); + jsonData["childAltar"]["rewards"]["emeraldLoc"] = Rando::StaticData::GetLocation(emeraldLoc->GetRandomizerCheck())->GetName(); + jsonData["childAltar"]["rewards"]["rubyLoc"] = Rando::StaticData::GetLocation(rubyLoc->GetRandomizerCheck())->GetName(); + jsonData["childAltar"]["rewards"]["sapphireLoc"] = + Rando::StaticData::GetLocation(sapphireLoc->GetRandomizerCheck())->GetName(); - ItemLocation* forestMedallionLoc = GetItemLocation(FOREST_MEDALLION); - ItemLocation* fireMedallionLoc = GetItemLocation(FIRE_MEDALLION); - ItemLocation* waterMedallionLoc = GetItemLocation(WATER_MEDALLION); - ItemLocation* shadowMedallionLoc = GetItemLocation(SHADOW_MEDALLION); - ItemLocation* spiritMedallionLoc = GetItemLocation(SPIRIT_MEDALLION); - ItemLocation* lightMedallionLoc = GetItemLocation(LIGHT_MEDALLION); + Rando::ItemLocation* forestMedallionLoc = GetItemLocation(RG_FOREST_MEDALLION); + Rando::ItemLocation* fireMedallionLoc = GetItemLocation(RG_FIRE_MEDALLION); + Rando::ItemLocation* waterMedallionLoc = GetItemLocation(RG_WATER_MEDALLION); + Rando::ItemLocation* shadowMedallionLoc = GetItemLocation(RG_SHADOW_MEDALLION); + Rando::ItemLocation* spiritMedallionLoc = GetItemLocation(RG_SPIRIT_MEDALLION); + Rando::ItemLocation* lightMedallionLoc = GetItemLocation(RG_LIGHT_MEDALLION); - jsonData["adultAltar"]["rewards"]["forestMedallionLoc"] = forestMedallionLoc->GetName(); - jsonData["adultAltar"]["rewards"]["fireMedallionLoc"] = fireMedallionLoc->GetName(); - jsonData["adultAltar"]["rewards"]["waterMedallionLoc"] = waterMedallionLoc->GetName(); - jsonData["adultAltar"]["rewards"]["shadowMedallionLoc"] = shadowMedallionLoc->GetName(); - jsonData["adultAltar"]["rewards"]["spiritMedallionLoc"] = spiritMedallionLoc->GetName(); - jsonData["adultAltar"]["rewards"]["lightMedallionLoc"] = lightMedallionLoc->GetName(); + jsonData["adultAltar"]["rewards"]["forestMedallionLoc"] = + Rando::StaticData::GetLocation(forestMedallionLoc->GetRandomizerCheck())->GetName(); + jsonData["adultAltar"]["rewards"]["fireMedallionLoc"] = + Rando::StaticData::GetLocation(fireMedallionLoc->GetRandomizerCheck())->GetName(); + jsonData["adultAltar"]["rewards"]["waterMedallionLoc"] = + Rando::StaticData::GetLocation(waterMedallionLoc->GetRandomizerCheck())->GetName(); + jsonData["adultAltar"]["rewards"]["shadowMedallionLoc"] = + Rando::StaticData::GetLocation(shadowMedallionLoc->GetRandomizerCheck())->GetName(); + jsonData["adultAltar"]["rewards"]["spiritMedallionLoc"] = + Rando::StaticData::GetLocation(spiritMedallionLoc->GetRandomizerCheck())->GetName(); + jsonData["adultAltar"]["rewards"]["lightMedallionLoc"] = + Rando::StaticData::GetLocation(lightMedallionLoc->GetRandomizerCheck())->GetName(); std::string ganonText = AutoFormatHintTextString(unformattedGanonText); std::string ganonHintText = AutoFormatHintTextString(unformattedGanonHintText); @@ -747,7 +761,8 @@ static void WriteHints(int language) { jsonData["dampeText"] = dampesText; jsonData["dampeHintLoc"] = GetDampeHintLoc(); jsonData["gregText"] = gregText; - jsonData["gregLoc"] = GetItemLocation(GREG_RUPEE)->GetName(); + jsonData["gregLoc"] = + Rando::StaticData::GetLocation(GetItemLocation(RG_GREG_RUPEE)->GetRandomizerCheck())->GetName(); jsonData["sheikText"] = sheikText; jsonData["sariaText"] = sariaText; jsonData["sariaHintLoc"] = GetSariaHintLoc(); @@ -755,41 +770,43 @@ static void WriteHints(int language) { if (Settings::GossipStoneHints.Is(HINTS_NO_HINTS)) { return; } - - for (const uint32_t key : gossipStoneLocations) { - ItemLocation* location = Location(key); - ItemLocation* hintedLocation = Location(location->GetHintedLocation()); + auto ctx = Rando::Context::GetInstance(); + for (const RandomizerCheck key : Rando::StaticData::gossipStoneLocations) { + Rando::Hint* hint = ctx->GetHint((RandomizerHintKey)(key - RC_DMC_GOSSIP_STONE + 1)); + Rando::ItemLocation* hintedLocation = ctx->GetItemLocation(hint->GetHintedLocation()); std::string unformattedHintTextString; switch (language) { case 0: default: - unformattedHintTextString = location->GetPlacedItemName().GetEnglish(); + unformattedHintTextString = hint->GetText().GetEnglish(); break; case 2: - unformattedHintTextString = location->GetPlacedItemName().GetFrench(); + unformattedHintTextString = hint->GetText().GetFrench(); break; } - HintType hintType = location->GetHintType(); + HintType hintType = hint->GetHintType(); std::string textStr = AutoFormatHintTextString(unformattedHintTextString); - jsonData["hints"][location->GetName()]["hint"] = textStr; - jsonData["hints"][location->GetName()]["type"] = hintTypeNames.find(hintType)->second; + jsonData["hints"][Rando::StaticData::GetLocation(key)->GetName()]["hint"] = textStr; + jsonData["hints"][Rando::StaticData::GetLocation(key)->GetName()]["type"] = hintTypeNames.find(hintType)->second; if (hintType == HINT_TYPE_ITEM || hintType == HINT_TYPE_NAMED_ITEM || hintType == HINT_TYPE_WOTH) { - jsonData["hints"][location->GetName()]["item"] = hintedLocation->GetPlacedItemName().GetEnglish(); + jsonData["hints"][Rando::StaticData::GetLocation(key)->GetName()]["item"] = hintedLocation->GetPlacedItemName().GetEnglish(); if (hintType != HINT_TYPE_NAMED_ITEM || hintType == HINT_TYPE_WOTH) { - jsonData["hints"][location->GetName()]["location"] = hintedLocation->GetName(); + jsonData["hints"][Rando::StaticData::GetLocation(key)->GetName()]["location"] = + Rando::StaticData::GetLocation(hintedLocation->GetRandomizerCheck())->GetName(); } } if (hintType != HINT_TYPE_TRIAL && hintType != HINT_TYPE_JUNK) { - jsonData["hints"][location->GetName()]["area"] = location->GetHintedRegion(); + jsonData["hints"][Rando::StaticData::GetLocation(key)->GetName()]["area"] = hint->GetHintedRegion(); } } } static void WriteAllLocations(int language) { - for (const uint32_t key : allLocations) { - ItemLocation* location = Location(key); + auto ctx = Rando::Context::GetInstance(); + for (const RandomizerCheck key : ctx->allLocations) { + Rando::ItemLocation* location = ctx->GetItemLocation(key); std::string placedItemName; switch (language) { @@ -806,52 +823,43 @@ static void WriteAllLocations(int language) { // just add the name of the item and move on if (!location->HasScrubsanityPrice() && !location->HasShopsanityPrice() && - location->GetPlacedItemKey() != ICE_TRAP) { + location->GetPlacedRandomizerGet() != RG_ICE_TRAP) { - jsonData["locations"][location->GetName()] = placedItemName; + jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()] = placedItemName; continue; } // We're dealing with a complex item, build out the json object for it - jsonData["locations"][location->GetName()]["item"] = placedItemName; + jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()]["item"] = placedItemName; if (location->HasScrubsanityPrice() || location->HasShopsanityPrice()) { - jsonData["locations"][location->GetName()]["price"] = location->GetPrice(); + jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()]["price"] = + location->GetPrice(); } if (location->IsHintedAt()) { - hintedLocations.emplace(location->GetHintKey(), location); + hintedLocations.emplace(Rando::StaticData::GetLocation(key)->GetHintKey(), location); } - if (location->GetPlacedItemKey() == ICE_TRAP) { + if (location->GetPlacedRandomizerGet() == RG_ICE_TRAP) { switch (language) { case 0: default: - jsonData["locations"][location->GetName()]["model"] = - ItemFromGIID(iceTrapModels[location->GetRandomizerCheck()]).GetName().english; - jsonData["locations"][location->GetName()]["trickName"] = - GetIceTrapName(iceTrapModels[location->GetRandomizerCheck()]).english; + jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()]["model"] = + Rando::StaticData::ItemFromGIID(ctx->iceTrapModels[location->GetRandomizerCheck()]).GetName().english; + jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()]["trickName"] = + GetIceTrapName(ctx->iceTrapModels[location->GetRandomizerCheck()]).english; break; case 2: - jsonData["locations"][location->GetName()]["model"] = - ItemFromGIID(iceTrapModels[location->GetRandomizerCheck()]).GetName().french; - jsonData["locations"][location->GetName()]["trickName"] = - GetIceTrapName(iceTrapModels[location->GetRandomizerCheck()]).french; + jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()]["model"] = + Rando::StaticData::ItemFromGIID(ctx->iceTrapModels[location->GetRandomizerCheck()]).GetName().french; + jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()]["trickName"] = + GetIceTrapName(ctx->iceTrapModels[location->GetRandomizerCheck()]).french; break; } } } } -//static void WriteHintData(int language) { -// for (auto [hintKey, item_location] : hintedLocations) { -// ItemLocation *hint_location = Location(hintKey); -// jsonData["hints"][hint_location->GetName()] = { { "text", hint_location->GetPlacedItemName().GetEnglish() }, -// { "item", item_location->GetPlacedItemName().GetEnglish() }, -// { "itemLocation", item_location->GetName() }, -// { "locationArea", item_location->GetParentRegionKey() } }; -// } -//} - const char* SpoilerLog_Write(int language) { auto spoilerLog = tinyxml2::XMLDocument(false); spoilerLog.InsertEndChild(spoilerLog.NewDeclaration()); @@ -884,14 +892,14 @@ const char* SpoilerLog_Write(int language) { WritePlaythrough(); //WriteWayOfTheHeroLocation(spoilerLog); - playthroughLocations.clear(); - playthroughBeatable = false; - wothLocations.clear(); + auto ctx = Rando::Context::GetInstance(); + ctx->playthroughLocations.clear(); + ctx->playthroughBeatable = false; + ctx->wothLocations.clear(); WriteHints(language); WriteShuffledEntrances(); WriteAllLocations(language); - //WriteHintData(language); if (!std::filesystem::exists(LUS::Context::GetPathRelativeToAppDirectory("Randomizer"))) { std::filesystem::create_directory(LUS::Context::GetPathRelativeToAppDirectory("Randomizer")); @@ -914,6 +922,10 @@ const char* SpoilerLog_Write(int language) { jsonFile << std::setw(4) << jsonString << std::endl; jsonFile.close(); + // Note: probably shouldn't return this without making sure this string is stored somewhere, but + // this return value is currently only used in playthrough.cpp as a true/false. Even if the pointer + // is no longer valid it would still not be nullptr if the spoilerfile was written, so it works but + // should probably be changed for correctness later on. return fileName.c_str(); } diff --git a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.hpp b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.hpp index 03bc2077e..50d02a839 100644 --- a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.hpp @@ -29,7 +29,7 @@ typedef enum { SPOILER_CHK_RANDOMIZER_INF, } SpoilerCollectionCheckType; -// Location groups for checks, used to group the checks by logical location +// GetLocation groups for checks, used to group the checks by logical location typedef enum { GROUP_NO_GROUP, GROUP_KOKIRI_FOREST, // 0x55, 0x28 diff --git a/soh/soh/Enhancements/randomizer/3drando/starting_inventory.cpp b/soh/soh/Enhancements/randomizer/3drando/starting_inventory.cpp index 77b11203e..20698e8e9 100644 --- a/soh/soh/Enhancements/randomizer/3drando/starting_inventory.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/starting_inventory.cpp @@ -1,16 +1,16 @@ #include "starting_inventory.hpp" #include "dungeon.hpp" -#include "item_list.hpp" #include "settings.hpp" +#include "soh/Enhancements/randomizer/static_data.h" using namespace Settings; using namespace Dungeon; -std::vector StartingInventory; +std::vector StartingInventory; uint8_t AdditionalHeartContainers; -static void AddItemToInventory(uint32_t item, size_t count = 1) { +static void AddItemToInventory(RandomizerGet item, size_t count = 1) { StartingInventory.insert(StartingInventory.end(), count, item); } @@ -19,11 +19,11 @@ void GenerateStartingInventory() { if (MapsAndCompasses.Is(MAPSANDCOMPASSES_START_WITH)) { for (auto* dungeon : dungeonList) { - if (dungeon->GetMap() != NONE) { + if (dungeon->GetMap() != RG_NONE) { AddItemToInventory(dungeon->GetMap()); } - if (dungeon->GetCompass() != NONE) { + if (dungeon->GetCompass() != RG_NONE) { AddItemToInventory(dungeon->GetCompass()); } } @@ -42,123 +42,123 @@ void GenerateStartingInventory() { // We can resolve this by starting with some extra keys // - OoT Randomizer if (SpiritTemple.IsMQ()) { - AddItemToInventory(SPIRIT_TEMPLE_SMALL_KEY, 3); + AddItemToInventory(RG_SPIRIT_TEMPLE_SMALL_KEY, 3); } } if (BossKeysanity.Is(BOSSKEYSANITY_START_WITH)) { - AddItemToInventory(FOREST_TEMPLE_BOSS_KEY); - AddItemToInventory(FIRE_TEMPLE_BOSS_KEY); - AddItemToInventory(WATER_TEMPLE_BOSS_KEY); - AddItemToInventory(SPIRIT_TEMPLE_BOSS_KEY); - AddItemToInventory(SHADOW_TEMPLE_BOSS_KEY); + AddItemToInventory(RG_FOREST_TEMPLE_BOSS_KEY); + AddItemToInventory(RG_FIRE_TEMPLE_BOSS_KEY); + AddItemToInventory(RG_WATER_TEMPLE_BOSS_KEY); + AddItemToInventory(RG_SPIRIT_TEMPLE_BOSS_KEY); + AddItemToInventory(RG_SHADOW_TEMPLE_BOSS_KEY); } // Add Ganon's Boss key with Triforce Hunt so the game thinks it's obtainable from the start. // During save init, the boss key isn't actually given and it's instead given when completing the triforce. if (GanonsBossKey.Is(GANONSBOSSKEY_START_WITH) || GanonsBossKey.Is(GANONSBOSSKEY_TRIFORCE_HUNT)) { - AddItemToInventory(GANONS_CASTLE_BOSS_KEY); + AddItemToInventory(RG_GANONS_CASTLE_BOSS_KEY); } if (GerudoFortress.Is(GERUDOFORTRESS_OPEN) && !ShuffleGerudoToken) { - AddItemToInventory(GERUDO_MEMBERSHIP_CARD); + AddItemToInventory(RG_GERUDO_MEMBERSHIP_CARD); } //Starting Inventory Menu //Values are associated so that the count of items matches the index of //the option selected. If None is selected, the value will be zero and //zero of the item will be added to the starting inventory. - AddItemToInventory(PROGRESSIVE_STICK_UPGRADE, StartingStickCapacity.Value()); - AddItemToInventory(PROGRESSIVE_NUT_UPGRADE, StartingNutCapacity.Value()); - AddItemToInventory(PROGRESSIVE_BOMB_BAG, StartingBombBag.Value()); - AddItemToInventory((BombchusInLogic ? PROGRESSIVE_BOMBCHUS : BOMBCHU_20), StartingBombchus.Value()); - AddItemToInventory(PROGRESSIVE_BOW, StartingBow.Value()); - AddItemToInventory(FIRE_ARROWS, StartingFireArrows.Value()); - AddItemToInventory(ICE_ARROWS, StartingIceArrows.Value()); - AddItemToInventory(LIGHT_ARROWS, StartingLightArrows.Value()); - AddItemToInventory(DINS_FIRE, StartingDinsFire.Value()); - AddItemToInventory(FARORES_WIND, StartingFaroresWind.Value()); - AddItemToInventory(NAYRUS_LOVE, StartingNayrusLove.Value()); - AddItemToInventory(PROGRESSIVE_SLINGSHOT, StartingSlingshot.Value()); - AddItemToInventory(BOOMERANG, StartingBoomerang.Value()); - AddItemToInventory(LENS_OF_TRUTH, StartingLensOfTruth.Value()); - AddItemToInventory(MAGIC_BEAN_PACK, StartingMagicBean.Value()); - AddItemToInventory(MEGATON_HAMMER, StartingMegatonHammer.Value()); - AddItemToInventory(PROGRESSIVE_HOOKSHOT, StartingHookshot.Value()); - AddItemToInventory(IRON_BOOTS, StartingIronBoots.Value()); - AddItemToInventory(HOVER_BOOTS, StartingHoverBoots.Value()); + AddItemToInventory(RG_PROGRESSIVE_STICK_UPGRADE, StartingStickCapacity.Value()); + AddItemToInventory(RG_PROGRESSIVE_NUT_UPGRADE, StartingNutCapacity.Value()); + AddItemToInventory(RG_PROGRESSIVE_BOMB_BAG, StartingBombBag.Value()); + AddItemToInventory((BombchusInLogic ? RG_PROGRESSIVE_BOMBCHUS : RG_BOMBCHU_20), StartingBombchus.Value()); + AddItemToInventory(RG_PROGRESSIVE_BOW, StartingBow.Value()); + AddItemToInventory(RG_FIRE_ARROWS, StartingFireArrows.Value()); + AddItemToInventory(RG_ICE_ARROWS, StartingIceArrows.Value()); + AddItemToInventory(RG_LIGHT_ARROWS, StartingLightArrows.Value()); + AddItemToInventory(RG_DINS_FIRE, StartingDinsFire.Value()); + AddItemToInventory(RG_FARORES_WIND, StartingFaroresWind.Value()); + AddItemToInventory(RG_NAYRUS_LOVE, StartingNayrusLove.Value()); + AddItemToInventory(RG_PROGRESSIVE_SLINGSHOT, StartingSlingshot.Value()); + AddItemToInventory(RG_BOOMERANG, StartingBoomerang.Value()); + AddItemToInventory(RG_LENS_OF_TRUTH, StartingLensOfTruth.Value()); + AddItemToInventory(RG_MAGIC_BEAN_PACK, StartingMagicBean.Value()); + AddItemToInventory(RG_MEGATON_HAMMER, StartingMegatonHammer.Value()); + AddItemToInventory(RG_PROGRESSIVE_HOOKSHOT, StartingHookshot.Value()); + AddItemToInventory(RG_IRON_BOOTS, StartingIronBoots.Value()); + AddItemToInventory(RG_HOVER_BOOTS, StartingHoverBoots.Value()); //For starting bottles, we need to check if they are a big poe and add that if so // since a big poe bottle is not logically equivalent to an empty bottle. if (StartingBottle1.Value() == STARTINGBOTTLE_BIG_POE) { - AddItemToInventory(BOTTLE_WITH_BIG_POE, 1); + AddItemToInventory(RG_BOTTLE_WITH_BIG_POE, 1); } else if (StartingBottle1.Value()) { - AddItemToInventory(EMPTY_BOTTLE, 1); + AddItemToInventory(RG_EMPTY_BOTTLE, 1); } if (StartingBottle2.Value() == STARTINGBOTTLE_BIG_POE) { - AddItemToInventory(BOTTLE_WITH_BIG_POE, 1); + AddItemToInventory(RG_BOTTLE_WITH_BIG_POE, 1); } else if (StartingBottle2.Value()) { - AddItemToInventory(EMPTY_BOTTLE, 1); + AddItemToInventory(RG_EMPTY_BOTTLE, 1); } if (StartingBottle3.Value() == STARTINGBOTTLE_BIG_POE) { - AddItemToInventory(BOTTLE_WITH_BIG_POE, 1); + AddItemToInventory(RG_BOTTLE_WITH_BIG_POE, 1); } else if (StartingBottle3.Value()) { - AddItemToInventory(EMPTY_BOTTLE, 1); + AddItemToInventory(RG_EMPTY_BOTTLE, 1); } if (StartingBottle4.Value() == STARTINGBOTTLE_BIG_POE) { - AddItemToInventory(BOTTLE_WITH_BIG_POE, 1); + AddItemToInventory(RG_BOTTLE_WITH_BIG_POE, 1); } else if (StartingBottle4.Value()) { - AddItemToInventory(EMPTY_BOTTLE, 1); + AddItemToInventory(RG_EMPTY_BOTTLE, 1); } - AddItemToInventory(RUTOS_LETTER, StartingRutoBottle.Value()); - AddItemToInventory(PROGRESSIVE_OCARINA, StartingOcarina.Value()); - AddItemToInventory(ZELDAS_LULLABY, StartingZeldasLullaby.Value()); - AddItemToInventory(EPONAS_SONG, StartingEponasSong.Value()); - AddItemToInventory(SARIAS_SONG, StartingSariasSong.Value()); - AddItemToInventory(SUNS_SONG, StartingSunsSong.Value()); - AddItemToInventory(SONG_OF_TIME, StartingSongOfTime.Value()); - AddItemToInventory(SONG_OF_STORMS, StartingSongOfStorms.Value()); - AddItemToInventory(MINUET_OF_FOREST, StartingMinuetOfForest.Value()); - AddItemToInventory(BOLERO_OF_FIRE, StartingBoleroOfFire.Value()); - AddItemToInventory(SERENADE_OF_WATER, StartingSerenadeOfWater.Value()); - AddItemToInventory(REQUIEM_OF_SPIRIT, StartingRequiemOfSpirit.Value()); - AddItemToInventory(NOCTURNE_OF_SHADOW, StartingNocturneOfShadow.Value()); - AddItemToInventory(PRELUDE_OF_LIGHT, StartingPreludeOfLight.Value()); - AddItemToInventory(KOKIRI_SWORD, StartingKokiriSword.Value()); + AddItemToInventory(RG_RUTOS_LETTER, StartingRutoBottle.Value()); + AddItemToInventory(RG_PROGRESSIVE_OCARINA, StartingOcarina.Value()); + AddItemToInventory(RG_ZELDAS_LULLABY, StartingZeldasLullaby.Value()); + AddItemToInventory(RG_EPONAS_SONG, StartingEponasSong.Value()); + AddItemToInventory(RG_SARIAS_SONG, StartingSariasSong.Value()); + AddItemToInventory(RG_SUNS_SONG, StartingSunsSong.Value()); + AddItemToInventory(RG_SONG_OF_TIME, StartingSongOfTime.Value()); + AddItemToInventory(RG_SONG_OF_STORMS, StartingSongOfStorms.Value()); + AddItemToInventory(RG_MINUET_OF_FOREST, StartingMinuetOfForest.Value()); + AddItemToInventory(RG_BOLERO_OF_FIRE, StartingBoleroOfFire.Value()); + AddItemToInventory(RG_SERENADE_OF_WATER, StartingSerenadeOfWater.Value()); + AddItemToInventory(RG_REQUIEM_OF_SPIRIT, StartingRequiemOfSpirit.Value()); + AddItemToInventory(RG_NOCTURNE_OF_SHADOW, StartingNocturneOfShadow.Value()); + AddItemToInventory(RG_PRELUDE_OF_LIGHT, StartingPreludeOfLight.Value()); + AddItemToInventory(RG_KOKIRI_SWORD, StartingKokiriSword.Value()); if (ProgressiveGoronSword) { - AddItemToInventory(PROGRESSIVE_GORONSWORD, StartingBiggoronSword.Value()); + AddItemToInventory(RG_PROGRESSIVE_GORONSWORD, StartingBiggoronSword.Value()); } else { - AddItemToInventory(GIANTS_KNIFE, (StartingBiggoronSword.Is(STARTINGBGS_GIANTS_KNIFE)) ? 1 : 0); - AddItemToInventory(BIGGORON_SWORD, (StartingBiggoronSword.Is(STARTINGBGS_BIGGORON_SWORD)) ? 1 : 0); + AddItemToInventory(RG_GIANTS_KNIFE, (StartingBiggoronSword.Is(STARTINGBGS_GIANTS_KNIFE)) ? 1 : 0); + AddItemToInventory(RG_BIGGORON_SWORD, (StartingBiggoronSword.Is(STARTINGBGS_BIGGORON_SWORD)) ? 1 : 0); } - AddItemToInventory(DEKU_SHIELD, StartingDekuShield.Value()); - AddItemToInventory(HYLIAN_SHIELD, StartingHylianShield.Value()); - AddItemToInventory(MIRROR_SHIELD, StartingMirrorShield.Value()); - AddItemToInventory(GORON_TUNIC, StartingGoronTunic.Value()); - AddItemToInventory(ZORA_TUNIC, StartingZoraTunic.Value()); - AddItemToInventory(PROGRESSIVE_MAGIC_METER, StartingMagicMeter.Value()); - AddItemToInventory(PROGRESSIVE_STRENGTH, StartingStrength.Value()); - AddItemToInventory(PROGRESSIVE_SCALE, StartingScale.Value()); - AddItemToInventory(PROGRESSIVE_WALLET, StartingWallet.Value()); - AddItemToInventory(STONE_OF_AGONY, StartingShardOfAgony.Value()); - AddItemToInventory(DOUBLE_DEFENSE, StartingDoubleDefense.Value()); - AddItemToInventory(KOKIRI_EMERALD, StartingKokiriEmerald.Value()); - AddItemToInventory(GORON_RUBY, StartingGoronRuby.Value()); - AddItemToInventory(ZORA_SAPPHIRE, StartingZoraSapphire.Value()); - AddItemToInventory(FOREST_MEDALLION, StartingForestMedallion.Value()); - AddItemToInventory(FIRE_MEDALLION, StartingFireMedallion.Value()); - AddItemToInventory(WATER_MEDALLION, StartingWaterMedallion.Value()); - AddItemToInventory(SPIRIT_MEDALLION, StartingSpiritMedallion.Value()); - AddItemToInventory(SHADOW_MEDALLION, StartingShadowMedallion.Value()); - AddItemToInventory(LIGHT_MEDALLION, StartingLightMedallion.Value()); - AddItemToInventory(GOLD_SKULLTULA_TOKEN, StartingSkulltulaToken.Value()); + AddItemToInventory(RG_DEKU_SHIELD, StartingDekuShield.Value()); + AddItemToInventory(RG_HYLIAN_SHIELD, StartingHylianShield.Value()); + AddItemToInventory(RG_MIRROR_SHIELD, StartingMirrorShield.Value()); + AddItemToInventory(RG_GORON_TUNIC, StartingGoronTunic.Value()); + AddItemToInventory(RG_ZORA_TUNIC, StartingZoraTunic.Value()); + AddItemToInventory(RG_PROGRESSIVE_MAGIC_METER, StartingMagicMeter.Value()); + AddItemToInventory(RG_PROGRESSIVE_STRENGTH, StartingStrength.Value()); + AddItemToInventory(RG_PROGRESSIVE_SCALE, StartingScale.Value()); + AddItemToInventory(RG_PROGRESSIVE_WALLET, StartingWallet.Value()); + AddItemToInventory(RG_STONE_OF_AGONY, StartingShardOfAgony.Value()); + AddItemToInventory(RG_DOUBLE_DEFENSE, StartingDoubleDefense.Value()); + AddItemToInventory(RG_KOKIRI_EMERALD, StartingKokiriEmerald.Value()); + AddItemToInventory(RG_GORON_RUBY, StartingGoronRuby.Value()); + AddItemToInventory(RG_ZORA_SAPPHIRE, StartingZoraSapphire.Value()); + AddItemToInventory(RG_FOREST_MEDALLION, StartingForestMedallion.Value()); + AddItemToInventory(RG_FIRE_MEDALLION, StartingFireMedallion.Value()); + AddItemToInventory(RG_WATER_MEDALLION, StartingWaterMedallion.Value()); + AddItemToInventory(RG_SPIRIT_MEDALLION, StartingSpiritMedallion.Value()); + AddItemToInventory(RG_SHADOW_MEDALLION, StartingShadowMedallion.Value()); + AddItemToInventory(RG_LIGHT_MEDALLION, StartingLightMedallion.Value()); + AddItemToInventory(RG_GOLD_SKULLTULA_TOKEN, StartingSkulltulaToken.Value()); int8_t hearts = StartingHearts.Value() - 2; AdditionalHeartContainers = 0; if (hearts < 0) { - AddItemToInventory(PIECE_OF_HEART, 4); + AddItemToInventory(RG_PIECE_OF_HEART, 4); // Plentiful and minimal have less than 4 standard pieces of heart so also replace the winner heart if (ItemPoolValue.Value() == 0 || ItemPoolValue.Value() == 3) { - AddItemToInventory(TREASURE_GAME_HEART); + AddItemToInventory(RG_TREASURE_GAME_HEART); } AdditionalHeartContainers = 1 - hearts; @@ -167,28 +167,28 @@ void GenerateStartingInventory() { uint8_t maxContainers = 8 * std::max(0, 2 - ItemPoolValue.Value()); if (hearts <= maxContainers) { - AddItemToInventory(HEART_CONTAINER, hearts); + AddItemToInventory(RG_HEART_CONTAINER, hearts); } else { - AddItemToInventory(HEART_CONTAINER, maxContainers); - AddItemToInventory(PIECE_OF_HEART, (hearts - maxContainers) * 4); + AddItemToInventory(RG_HEART_CONTAINER, maxContainers); + AddItemToInventory(RG_PIECE_OF_HEART, (hearts - maxContainers) * 4); } if (hearts == 17) { - AddItemToInventory(TREASURE_GAME_HEART); + AddItemToInventory(RG_TREASURE_GAME_HEART); } } } bool StartingInventoryHasBottle() { - uint32_t bottle = EMPTY_BOTTLE; + RandomizerGet bottle = RG_EMPTY_BOTTLE; return ElementInContainer(bottle, StartingInventory); } void ApplyStartingInventory() { - for (uint32_t item : StartingInventory) { - if (item == PIECE_OF_HEART || item == HEART_CONTAINER || item == TREASURE_GAME_HEART) + for (RandomizerGet item : StartingInventory) { + if (item == RG_PIECE_OF_HEART || item == RG_HEART_CONTAINER || item == RG_TREASURE_GAME_HEART) continue; - ItemTable(item).ApplyEffect(); + Rando::StaticData::RetrieveItem(item).ApplyEffect(); } } diff --git a/soh/soh/Enhancements/randomizer/3drando/starting_inventory.hpp b/soh/soh/Enhancements/randomizer/3drando/starting_inventory.hpp index e2c85c875..6c63dda95 100644 --- a/soh/soh/Enhancements/randomizer/3drando/starting_inventory.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/starting_inventory.hpp @@ -1,11 +1,11 @@ #pragma once -#include "keys.hpp" +#include "../randomizerTypes.h" #include #include -extern std::vector StartingInventory; +extern std::vector StartingInventory; extern uint8_t AdditionalHeartContainers; void GenerateStartingInventory(); diff --git a/soh/soh/Enhancements/randomizer/context.cpp b/soh/soh/Enhancements/randomizer/context.cpp new file mode 100644 index 000000000..8995fa06b --- /dev/null +++ b/soh/soh/Enhancements/randomizer/context.cpp @@ -0,0 +1,188 @@ +#include "context.h" +#include "static_data.h" +#include "3drando/shops.hpp" +#include "3drando/dungeon.hpp" + +#include + +namespace Rando { +std::weak_ptr Context::mContext; + +Context::Context() { + for (int i = 0; i < RC_MAX; i++) { + itemLocationTable[i] = ItemLocation((RandomizerCheck)i); + } +} + +std::shared_ptr Context::CreateInstance() { + if (mContext.expired()) { + auto instance = std::make_shared(); + mContext = instance; + return instance; + } + return GetInstance(); +} + +std::shared_ptr Context::GetInstance() { + return mContext.lock(); +} + +Hint *Context::GetHint(RandomizerHintKey hintKey) { + return &hintTable[hintKey]; +} + +void Context::AddHint(RandomizerHintKey hintId, Text text, RandomizerCheck hintedLocation, HintType hintType, + Text hintedRegion) { + hintTable[hintId] = Hint(text, hintedLocation, hintType, hintedRegion); + GetItemLocation(hintedLocation)->SetHintKey(hintId); +} + +ItemLocation *Context::GetItemLocation(RandomizerCheck locKey) { + return &(itemLocationTable[locKey]); +} + +void Context::PlaceItemInLocation(RandomizerCheck locKey, RandomizerGet item, bool applyEffectImmediately, + bool setHidden) { + auto loc = GetItemLocation(locKey); + SPDLOG_DEBUG("\n"); + SPDLOG_DEBUG(StaticData::RetrieveItem(item).GetName().GetEnglish()); + SPDLOG_DEBUG(" placed at "); + SPDLOG_DEBUG(StaticData::GetLocation(locKey)->GetName()); + SPDLOG_DEBUG("\n\n"); + + if (applyEffectImmediately || Settings::Logic.Is(LOGIC_NONE) || Settings::Logic.Is(LOGIC_VANILLA)) { + Rando::StaticData::RetrieveItem(item).ApplyEffect(); + } + + //TODO? Show Progress + + // If we're placing a non-shop item in a shop location, we want to record it for custom messages + if (StaticData::RetrieveItem(item).GetItemType() != ITEMTYPE_SHOP && + Rando::StaticData::GetLocation(locKey)->IsCategory(Category::cShop)) { + int index = TransformShopIndex(GetShopIndex(locKey)); + NonShopItems[index].Name = Rando::StaticData::RetrieveItem(item).GetName(); + NonShopItems[index].Repurchaseable = Rando::StaticData::RetrieveItem(item).GetItemType() == ITEMTYPE_REFILL || + Rando::StaticData::RetrieveItem(item).GetHintKey() == RHT_PROGRESSIVE_BOMBCHUS; + } + + loc->SetPlacedItem(item); + if (setHidden) { + loc->SetHidden(true); + } +} + +void Context::AddLocation(RandomizerCheck loc, std::vector* destination) { + if (destination == nullptr) { + destination = &allLocations; + } + destination->push_back(loc); +} + +template +void Context::AddLocations(const Container& locations, std::vector* destination) { + if (destination == nullptr) { + destination = &allLocations; + } + destination->insert(destination->end(), std::cbegin(locations), std::cend(locations)); +} + +void Context::GenerateLocationPool() { + allLocations.clear(); + AddLocation(RC_LINKS_POCKET); + if (Settings::TriforceHunt.Is(TRIFORCE_HUNT_ON)) { + AddLocation(RC_TRIFORCE_COMPLETED); + } + AddLocations(StaticData::overworldLocations); + + for (auto dungeon : Dungeon::dungeonList) { + AddLocations(dungeon->GetDungeonLocations()); + } +} + +void Context::AddExcludedOptions() { + AddLocations(StaticData::overworldLocations, &everyPossibleLocation); + for (auto dungeon : Dungeon::dungeonList) { + AddLocations(dungeon->GetEveryLocation(), &everyPossibleLocation); + } + for (RandomizerCheck rc : everyPossibleLocation) { + GetItemLocation(rc)->AddExcludeOption(); + } +} + +std::vector Context::GetLocations(const std::vector& locationPool, + Category categoryInclude, Category categoryExclude) { + std::vector locationsInCategory; + for (RandomizerCheck locKey : locationPool) { + if (StaticData::GetLocation(locKey)->IsCategory(categoryInclude) && + !StaticData::GetLocation(locKey)->IsCategory(categoryExclude)) { + locationsInCategory.push_back(locKey); + } + } + return locationsInCategory; +} + +void Context::ItemReset() { + for (RandomizerCheck il : allLocations) { + GetItemLocation(il)->ResetVariables(); + } + + for (RandomizerCheck il : Rando::StaticData::dungeonRewardLocations) { + GetItemLocation(il)->ResetVariables(); + } +} + +void Context::LocationReset() { + for (RandomizerCheck il : allLocations) { + GetItemLocation(il)->RemoveFromPool(); + } + + for (RandomizerCheck il : Rando::StaticData::dungeonRewardLocations) { + GetItemLocation(il)->RemoveFromPool(); + } + + for (RandomizerCheck il : Rando::StaticData::gossipStoneLocations) { + GetItemLocation(il)->RemoveFromPool(); + } + + GetItemLocation(RC_GANONDORF_HINT)->RemoveFromPool(); +} + +void Context::HintReset() { + for (RandomizerCheck il : Rando::StaticData::gossipStoneLocations) { + GetItemLocation(il)->ResetVariables(); + GetHint((RandomizerHintKey)(il - RC_DMC_GOSSIP_STONE + 1))->ResetVariables(); + } +} + +void Context::CreateItemOverrides() { + SPDLOG_DEBUG("NOW CREATING OVERRIDES\n\n"); + for (RandomizerCheck locKey : allLocations) { + auto loc = Rando::StaticData::GetLocation(locKey); + auto itemLoc = GetItemLocation(locKey); + ItemOverride_Value val = Rando::StaticData::RetrieveItem(itemLoc->GetPlacedRandomizerGet()).Value(); + // If this is an ice trap, store the disguise model in iceTrapModels + if (itemLoc->GetPlacedRandomizerGet() == RG_ICE_TRAP) { + iceTrapModels[loc->GetRandomizerCheck()] = val.looksLikeItemId; + // If this is ice trap is in a shop, change the name based on what the model will look like + if (loc->IsCategory(Category::cShop)) { + NonShopItems[TransformShopIndex(GetShopIndex(locKey))].Name = GetIceTrapName(val.looksLikeItemId); + } + } + overrides.insert({ + .key = itemLoc->Key(), + .value = val, + }); + SPDLOG_DEBUG("\tScene: "); + SPDLOG_DEBUG(std::to_string(itemLoc->Key().scene)); + SPDLOG_DEBUG("\tType: "); + SPDLOG_DEBUG(std::to_string(itemLoc->Key().type)); + SPDLOG_DEBUG("\t"); + SPDLOG_DEBUG(loc->GetName()); + SPDLOG_DEBUG(": "); + SPDLOG_DEBUG(itemLoc->GetPlacedItemName().GetEnglish()); + SPDLOG_DEBUG("\n"); + } + SPDLOG_DEBUG("Overrides Created: "); + SPDLOG_DEBUG(std::to_string(overrides.size())); +} +} diff --git a/soh/soh/Enhancements/randomizer/context.h b/soh/soh/Enhancements/randomizer/context.h new file mode 100644 index 000000000..d008077a8 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/context.h @@ -0,0 +1,56 @@ +#pragma once + +#include "randomizerTypes.h" +#include "item_location.h" +#include "3drando/text.hpp" +#include "hint.h" + +#include +#include + +/** + * @brief Singleton for storing and accessing dynamic Randomizer-related data + * + * The Context class is a class for storing and accessing dynamic Randomizer-related data. + * Dynamic Data, in this context, refers to data that can be different for each randomizer seed, + * i.e. item locations, hint contents and locations, settings, etc. This class is intended to be + * used as a Singleton. + */ +namespace Rando { +class Context { + public: + Context(); + static std::shared_ptr CreateInstance(); + static std::shared_ptr GetInstance(); + Hint* GetHint(RandomizerHintKey hintKey); + void AddHint(RandomizerHintKey hintId, Text text, RandomizerCheck hintedLocation, HintType hintType, + Text hintedRegion); + ItemLocation* GetItemLocation(RandomizerCheck locKey); + void PlaceItemInLocation(RandomizerCheck locKey, RandomizerGet item, bool applyEffectImmediately = false, + bool setHidden = false); + std::vector allLocations; + void AddLocation(RandomizerCheck loc, std::vector* destination = nullptr); + template + void AddLocations(const Container& locations, std::vector* destination = nullptr); + void GenerateLocationPool(); + std::vector GetLocations(const std::vector& locationPool, + Category categoryInclude, Category categoryExclude = Category::cNull); + void AddExcludedOptions(); + void LocationReset(); + void ItemReset(); + void HintReset(); + void CreateItemOverrides(); + std::set overrides = {}; + std::vector> playthroughLocations = {}; + std::vector everyPossibleLocation = {}; + std::vector wothLocations = {}; + std::unordered_map iceTrapModels = {}; + bool playthroughBeatable = false; + bool allLocationsReachable = false; + + private: + static std::weak_ptr mContext; + std::array hintTable = {}; + std::array itemLocationTable = {}; +}; +} // namespace Rando \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/draw.cpp b/soh/soh/Enhancements/randomizer/draw.cpp index c2895dd62..660dee492 100644 --- a/soh/soh/Enhancements/randomizer/draw.cpp +++ b/soh/soh/Enhancements/randomizer/draw.cpp @@ -157,7 +157,7 @@ extern "C" void Randomizer_DrawKeyRing(PlayState* play, GetItemEntry* getItemEnt CLOSE_DISPS(play->state.gfxCtx); } -extern "C" void Randomizer_DrawDoubleDefense(PlayState* play, GetItemEntry getItemEntry) { +extern "C" void Randomizer_DrawDoubleDefense(PlayState* play, GetItemEntry* getItemEntry) { OPEN_DISPS(play->state.gfxCtx); Gfx_SetupDL_25Xlu(play->state.gfxCtx); diff --git a/soh/soh/Enhancements/randomizer/draw.h b/soh/soh/Enhancements/randomizer/draw.h index 19510c2f4..40ca196b6 100644 --- a/soh/soh/Enhancements/randomizer/draw.h +++ b/soh/soh/Enhancements/randomizer/draw.h @@ -12,7 +12,7 @@ extern "C" { void Randomizer_DrawSmallKey(PlayState* play, GetItemEntry* getItemEntry); void Randomizer_DrawKeyRing(PlayState* play, GetItemEntry* getItemEntry); void Randomizer_DrawBossKey(PlayState* play, GetItemEntry* getItemEntry); -void Randomizer_DrawDoubleDefense(PlayState* play, GetItemEntry getItemEntry); +void Randomizer_DrawDoubleDefense(PlayState* play, GetItemEntry* getItemEntry); void Randomizer_DrawTriforcePiece(PlayState* play, GetItemEntry getItemEntry); void Randomizer_DrawTriforcePieceGI(PlayState* play, GetItemEntry getItemEntry); #ifdef __cplusplus diff --git a/soh/soh/Enhancements/randomizer/hint.cpp b/soh/soh/Enhancements/randomizer/hint.cpp new file mode 100644 index 000000000..31c8f67b4 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/hint.cpp @@ -0,0 +1,43 @@ +#include "hint.h" + +namespace Rando { +Hint::Hint() {} +Hint::Hint(Text text_): text(std::move(text_)) {} +Hint::Hint(Text text_, RandomizerCheck hintedLocation_, HintType hintType_, Text hintedRegion_) + : text(std::move(text_)), hintedLocation(hintedLocation_), hintType(hintType_), + hintedRegion(std::move(hintedRegion_)) { +} + +const Text& Hint::GetText() const { + return text; +} + +void Hint::SetHintedLocation(RandomizerCheck location) { + hintedLocation = location; +} + +RandomizerCheck Hint::GetHintedLocation() { + return hintedLocation; +} + +void Hint::SetHintType(HintType type) { + hintType = type; +} + +HintType Hint::GetHintType() { + return hintType; +} + +void Hint::SetHintedRegion(Text region) { + hintedRegion = region; +} + +std::string Hint::GetHintedRegion() { + return hintedRegion.GetEnglish(); +} + +void Hint::ResetVariables() { + hintedLocation = RC_UNKNOWN_CHECK; + addedToPool = false; +} +} \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/hint.h b/soh/soh/Enhancements/randomizer/hint.h new file mode 100644 index 000000000..bba5a0715 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/hint.h @@ -0,0 +1,30 @@ +#pragma once + +#include "3drando/text.hpp" +#include "randomizerTypes.h" + +namespace Rando { +class Hint { + public: + Hint(); + Hint(Text text_); + Hint(Text text_, RandomizerCheck hintedLocation_, HintType hintType_, Text hintedRegion_); + const Text& GetText() const; + RandomizerCheck GetHintedLocation(); + void SetHintedLocation (RandomizerCheck location); + HintType GetHintType(); + void SetHintType (HintType type); + std::string GetHintedRegion(); + void SetHintedRegion (Text region); + void ResetVariables(); + bool IsAddedToPool(); + void AddToPool(); + + private: + Text text; + RandomizerCheck hintedLocation; + HintType hintType; + Text hintedRegion; + bool addedToPool; +}; +} \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/item.cpp b/soh/soh/Enhancements/randomizer/item.cpp new file mode 100644 index 000000000..879a7324d --- /dev/null +++ b/soh/soh/Enhancements/randomizer/item.cpp @@ -0,0 +1,379 @@ +#include "item.h" +#include "item_location.h" + +#include "3drando/logic.hpp" +#include "3drando/random.hpp" +#include "3drando/item_pool.hpp" +#include "z64item.h" +#include "variables.h" +#include "macros.h" +#include "../../OTRGlobals.h" + +namespace Rando { +Item::Item(RandomizerGet randomizerGet_, Text name_, ItemType type_, int16_t getItemId_, bool advancement_, + bool* logicVar_, RandomizerHintTextKey hintKey_, uint16_t itemId_, uint16_t objectId_, uint16_t gid_, + uint16_t textId_, uint16_t field_, int16_t chestAnimation_, GetItemCategory category_, + uint16_t modIndex_, bool progressive_, uint16_t price_) + : randomizerGet(randomizerGet_), name(std::move(name_)), type(type_), getItemId(getItemId_), + advancement(advancement_), logicVar(logicVar_), hintKey(hintKey_), progressive(progressive_), price(price_) { + if (modIndex_ == MOD_RANDOMIZER || getItemId > 0x7D) { + giEntry = std::shared_ptr( + new GetItemEntry(GET_ITEM(itemId_, objectId_, gid_, textId_, field_, chestAnimation_, category_, modIndex_, + (int16_t)randomizerGet_))); + } else { + giEntry = std::shared_ptr(new GetItemEntry( + GET_ITEM(itemId_, objectId_, gid_, textId_, field_, chestAnimation_, category_, modIndex_, getItemId_))); + } +} + +Item::Item(RandomizerGet randomizerGet_, Text name_, ItemType type_, int16_t getItemId_, bool advancement_, + uint8_t* logicVar_, RandomizerHintTextKey hintKey_, uint16_t itemId_, uint16_t objectId_, uint16_t gid_, + uint16_t textId_, uint16_t field_, int16_t chestAnimation_, GetItemCategory category_, + uint16_t modIndex_, bool progressive_, uint16_t price_) + : randomizerGet(randomizerGet_), name(std::move(name_)), type(type_), getItemId(getItemId_), + advancement(advancement_), logicVar(logicVar_), hintKey(hintKey_), progressive(progressive_), price(price_) { + if (modIndex_ == MOD_RANDOMIZER || getItemId > 0x7D) { + giEntry = std::shared_ptr( + new GetItemEntry(GET_ITEM(itemId_, objectId_, gid_, textId_, field_, chestAnimation_, category_, modIndex_, + (int16_t)randomizerGet_))); + } else { + giEntry = std::shared_ptr(new GetItemEntry( + GET_ITEM(itemId_, objectId_, gid_, textId_, field_, chestAnimation_, category_, modIndex_, getItemId_))); + } +} + +Item::Item(RandomizerGet randomizerGet_, Text name_, ItemType type_, int getItemId_, bool advancement_, + bool* logicVar_, RandomizerHintTextKey hintKey_, bool progressive_, uint16_t price_) + : randomizerGet(randomizerGet_), name(std::move(name_)), type(type_), getItemId(getItemId_), + advancement(advancement_), logicVar(logicVar_), hintKey(hintKey_), progressive(progressive_), price(price_) { +} + +Item::Item(RandomizerGet randomizerGet_, Text name_, ItemType type_, int getItemId_, bool advancement_, + uint8_t* logicVar_, RandomizerHintTextKey hintKey_, bool progressive_, uint16_t price_) + : randomizerGet(randomizerGet_), name(std::move(name_)), type(type_), getItemId(getItemId_), + advancement(advancement_), logicVar(logicVar_), hintKey(hintKey_), progressive(progressive_), price(price_) { +} + + Item::~Item() = default; + +void Item::ApplyEffect() { + // If this is a key ring, logically add as many keys as we could need + if (RHT_FOREST_TEMPLE_KEY_RING <= hintKey && hintKey <= RHT_GANONS_CASTLE_KEY_RING) { + *std::get(logicVar) += 10; + } else { + if (std::holds_alternative(logicVar)) { + *std::get(logicVar) = true; + } else { + *std::get(logicVar) += 1; + } + } + Logic::UpdateHelpers(); +} + +void Item::UndoEffect() { + if (RHT_FOREST_TEMPLE_KEY_RING <= hintKey && hintKey <= RHT_GANONS_CASTLE_KEY_RING) { + *std::get(logicVar) -= 10; + } else { + if (std::holds_alternative(logicVar)) { + *std::get(logicVar) = false; + } else { + *std::get(logicVar) -= 1; + } + } + Logic::UpdateHelpers(); +} + +Rando::ItemOverride_Value Item::Value() const { + Rando::ItemOverride_Value val; + + val.all = 0; + val.itemId = getItemId; + if (getItemId == RG_ICE_TRAP) { + val.looksLikeItemId = RandomElement(IceTrapModels); + } + if ((getItemId >= 0x95 && getItemId <= 0x9A)) { // Boss keys + val.looksLikeItemId = GI_KEY_BOSS; + } + if ((getItemId >= 0xAF && getItemId <= 0xB7)) { // Small keys + val.looksLikeItemId = GI_KEY_SMALL; + } + if (type == ITEMTYPE_SHOP) { + // With the current shopsanity implementation, we need a way to detect + // regular shop items. This method should have no unintended side effects + // unless there was a multiworld with 256 players... so, it should be fine. + val.player = 0xFF; + } + return val; +} + +const Text& Item::GetName() const { + return name; +} + +bool Item::IsAdvancement() const { + return advancement; +} + +int Item::GetItemID() const { + return getItemId; +} + +ItemType Item::GetItemType() const { + return type; +} + +RandomizerGet Item::GetRandomizerGet() { + return randomizerGet; +} + +uint16_t Item::GetPrice() const { + return price; +} + +std::shared_ptr Item::GetGIEntry() const { + if (giEntry != nullptr) { + return giEntry; + } + RandomizerGet actual = RG_NONE; + u8 numWallets = + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHOPSANITY) > RO_SHOPSANITY_ZERO_ITEMS ? 3 : 2; + switch (randomizerGet) { + case RG_PROGRESSIVE_STICK_UPGRADE: + switch (CUR_UPG_VALUE(UPG_STICKS)) { + case 0: + case 1: + actual = RG_DEKU_STICK_CAPACITY_20; + break; + case 2: + case 3: + actual = RG_DEKU_STICK_CAPACITY_30; + break; + } + break; + case RG_PROGRESSIVE_NUT_UPGRADE: + switch (CUR_UPG_VALUE(UPG_NUTS)) { + case 0: + case 1: + actual = RG_DEKU_NUT_CAPACITY_30; + break; + case 2: + case 3: + actual = RG_DEKU_NUT_CAPACITY_40; + break; + } + break; + case RG_PROGRESSIVE_BOMB_BAG: + switch (CUR_UPG_VALUE(UPG_BOMB_BAG)) { + case 0: + actual = RG_BOMB_BAG; + break; + case 1: + actual = RG_BIG_BOMB_BAG; + break; + case 2: + case 3: + actual = RG_BIGGEST_BOMB_BAG; + break; + } + break; + case RG_PROGRESSIVE_BOW: + switch (CUR_UPG_VALUE(UPG_QUIVER)) { + case 0: + actual = RG_FAIRY_BOW; + break; + case 1: + actual = RG_BIG_QUIVER; + break; + case 2: + case 3: + actual = RG_BIGGEST_QUIVER; + break; + } + break; + case RG_PROGRESSIVE_SLINGSHOT: + switch (CUR_UPG_VALUE(UPG_BULLET_BAG)) { + case 0: + actual = RG_FAIRY_SLINGSHOT; + break; + case 1: + actual = RG_BIG_BULLET_BAG; + break; + case 2: + case 3: + actual = RG_BIGGEST_BULLET_BAG; + break; + } + break; + case RG_PROGRESSIVE_OCARINA: + switch (INV_CONTENT(ITEM_OCARINA_FAIRY)) { + case ITEM_NONE: + actual = RG_FAIRY_OCARINA; + break; + case ITEM_OCARINA_FAIRY: + case ITEM_OCARINA_TIME: + actual = RG_OCARINA_OF_TIME; + break; + } + break; + case RG_PROGRESSIVE_HOOKSHOT: + switch (INV_CONTENT(ITEM_HOOKSHOT)) { + case ITEM_NONE: + actual = RG_HOOKSHOT; + break; + case ITEM_HOOKSHOT: + case ITEM_LONGSHOT: + actual = RG_LONGSHOT; + break; + } + break; + case RG_PROGRESSIVE_STRENGTH: + switch (CUR_UPG_VALUE(UPG_STRENGTH)) { + case 0: + actual = RG_GORONS_BRACELET; + break; + case 1: + actual = RG_SILVER_GAUNTLETS; + break; + case 2: + case 3: + actual = RG_GOLDEN_GAUNTLETS; + break; + } + break; + case RG_PROGRESSIVE_WALLET: + switch (CUR_UPG_VALUE(UPG_WALLET)) { + case 0: + actual = RG_ADULT_WALLET; + break; + case 1: + actual = RG_GIANT_WALLET; + break; + case 2: + case 3: + actual = numWallets == 3 ? RG_TYCOON_WALLET : RG_GIANT_WALLET; + break; + } + break; + case RG_PROGRESSIVE_SCALE: + switch (CUR_UPG_VALUE(UPG_SCALE)) { + case 0: + actual = RG_SILVER_SCALE; + break; + case 1: + case 2: + actual = RG_GOLDEN_SCALE; + break; + } + break; + case RG_PROGRESSIVE_MAGIC_METER: + switch (gSaveContext.magicLevel) { + case 0: + actual = RG_MAGIC_SINGLE; + break; + case 1: + case 2: + actual = RG_MAGIC_DOUBLE; + break; + } + break; + case RG_PROGRESSIVE_GORONSWORD: // todo progressive? + actual = RG_BIGGORON_SWORD; + break; + default: + actual = RG_NONE; + break; + } + return Rando::StaticData::RetrieveItem(actual).GetGIEntry(); +} + +GetItemEntry Item::GetGIEntry_Copy() { + return *GetGIEntry(); +} + +void Item::SetPrice(uint16_t price_) { + price = price_; +} + +void Item::SetAsPlaythrough() { + playthrough = true; +} + +void Item::SetCustomDrawFunc(CustomDrawFunc drawFunc) { + giEntry->drawFunc = drawFunc; +} + +bool Item::IsPlaythrough() const { + return playthrough; +} + +bool Item::IsBottleItem() const { + return getItemId == 0x0F || // Empty Bottle + getItemId == 0X14 || // Bottle with Milk + (getItemId >= 0x8C && getItemId <= 0x94); // Rest of bottled contents +} + +bool Item::IsMajorItem() const { + using namespace Settings; + if (type == ITEMTYPE_TOKEN) { + return Bridge.Is(RAINBOWBRIDGE_TOKENS) || LACSCondition == LACSCONDITION_TOKENS; + } + + if (type == ITEMTYPE_DROP || type == ITEMTYPE_EVENT || type == ITEMTYPE_SHOP || type == ITEMTYPE_MAP || + type == ITEMTYPE_COMPASS) { + return false; + } + + if (type == ITEMTYPE_DUNGEONREWARD && (ShuffleRewards.Is(REWARDSHUFFLE_END_OF_DUNGEON))) { + return false; + } + + if ((randomizerGet == RG_BOMBCHU_5 || randomizerGet == RG_BOMBCHU_10 || randomizerGet == RG_BOMBCHU_20) && + !BombchusInLogic) { + return false; + } + + if (randomizerGet == RG_HEART_CONTAINER || randomizerGet == RG_PIECE_OF_HEART || + randomizerGet == RG_TREASURE_GAME_HEART) { + return false; + } + + if (type == ITEMTYPE_SMALLKEY && (Keysanity.Is(KEYSANITY_VANILLA) || Keysanity.Is(KEYSANITY_OWN_DUNGEON))) { + return false; + } + + if (type == ITEMTYPE_FORTRESS_SMALLKEY && GerudoKeys.Is(GERUDOKEYS_VANILLA)) { + return false; + } + + if ((type == ITEMTYPE_BOSSKEY && getItemId != 0xAD) && + (BossKeysanity.Is(BOSSKEYSANITY_VANILLA) || BossKeysanity.Is(BOSSKEYSANITY_OWN_DUNGEON))) { + return false; + } + // Ganons Castle Boss Key + if (getItemId == 0xAD && (GanonsBossKey.Is(GANONSBOSSKEY_VANILLA) || GanonsBossKey.Is(GANONSBOSSKEY_OWN_DUNGEON))) { + return false; + } + + if (randomizerGet == RG_GREG_RUPEE) { + return Bridge.Is(RAINBOWBRIDGE_GREG); + } + + return IsAdvancement(); +} + +RandomizerHintTextKey Item::GetHintKey() const { + return hintKey; +} + +const HintText& Item::GetHint() const { + return ::Hint(hintKey); +} + +bool Item::operator==(const Item& right) const { + return type == right.GetItemType() && getItemId == right.GetItemID(); +} + +bool Item::operator!=(const Item& right) const { + return !operator==(right); +} +} diff --git a/soh/soh/Enhancements/randomizer/item.h b/soh/soh/Enhancements/randomizer/item.h new file mode 100644 index 000000000..5fd67760d --- /dev/null +++ b/soh/soh/Enhancements/randomizer/item.h @@ -0,0 +1,88 @@ +#pragma once + +#include +#include +#include + +#include "3drando/text.hpp" +#include "3drando/settings.hpp" +#include "3drando/hint_list.hpp" +#include "randomizerTypes.h" +#include "soh/Enhancements/item-tables/ItemTableTypes.h" + +namespace Rando { +union ItemOverride_Value; +} + +enum ItemType { + ITEMTYPE_ITEM, + ITEMTYPE_MAP, + ITEMTYPE_COMPASS, + ITEMTYPE_BOSSKEY, + ITEMTYPE_SMALLKEY, + ITEMTYPE_TOKEN, + ITEMTYPE_FORTRESS_SMALLKEY, + ITEMTYPE_EVENT, + ITEMTYPE_DROP, + ITEMTYPE_REFILL, + ITEMTYPE_SONG, + ITEMTYPE_SHOP, + ITEMTYPE_DUNGEONREWARD +}; + +namespace Rando { +class Item { + public: + Item() = default; + Item(RandomizerGet randomizerGet_, Text name_, ItemType type_, int16_t getItemId_, bool advancement_, + bool* logicVar_, RandomizerHintTextKey hintKey_, uint16_t itemId_, uint16_t objectId_, uint16_t gid_, + uint16_t textId_, uint16_t field_, int16_t chestAnimation_, GetItemCategory category_, + uint16_t modIndex_, bool progressive = false, uint16_t price_ = 0); + Item(RandomizerGet randomizerGet_, Text name_, ItemType type_, int16_t getItemId_, bool advancement_, + uint8_t* logicVar_, RandomizerHintTextKey hintKey_, uint16_t itemId_, uint16_t objectId_, uint16_t gid_, + uint16_t textId_, uint16_t field_, int16_t chestAnimation_, GetItemCategory category_, uint16_t modIndex_, + bool progressive = false, uint16_t price_ = 0); + Item(RandomizerGet randomizerGet_, Text name_, ItemType type_, int getItemId_, bool advancement_, + bool* logicVar_, RandomizerHintTextKey hintKey_, bool progressive = false, uint16_t price = 0); + Item(RandomizerGet randomizerGet_, Text name_, ItemType type_, int getItemId_, bool advancement_, + uint8_t* logicVar_, RandomizerHintTextKey hintKey_, bool progressive = false, uint16_t price = 0); + ~Item(); + + void ApplyEffect(); + void UndoEffect(); + + Rando::ItemOverride_Value Value() const; + + const Text& GetName() const; + bool IsAdvancement() const; + int GetItemID() const; + ItemType GetItemType() const; + RandomizerGet GetRandomizerGet(); + uint16_t GetPrice() const; + std::shared_ptr GetGIEntry() const; + GetItemEntry GetGIEntry_Copy(); + void SetPrice(uint16_t price_); + void SetAsPlaythrough(); + void SetCustomDrawFunc(CustomDrawFunc); + bool IsPlaythrough() const; + bool IsBottleItem() const; + bool IsMajorItem() const; + RandomizerHintTextKey GetHintKey() const; + const HintText& GetHint() const; + bool operator==(const Item& right) const; + bool operator!=(const Item& right) const; + + private: + RandomizerGet randomizerGet; + Text name; + ItemType type; + int16_t getItemId; + bool advancement; + std::variant logicVar; + RandomizerHintTextKey hintKey; + bool progressive = false; + uint16_t price; + bool playthrough = false; + std::shared_ptr giEntry = nullptr; +}; +} diff --git a/soh/soh/Enhancements/randomizer/item_list.cpp b/soh/soh/Enhancements/randomizer/item_list.cpp new file mode 100644 index 000000000..50ad6c36a --- /dev/null +++ b/soh/soh/Enhancements/randomizer/item_list.cpp @@ -0,0 +1,295 @@ +#include "static_data.h" +#include "3drando/logic.hpp" +#include "z64object.h" +#include "soh/Enhancements/custom-message/CustomMessageTypes.h" +#include "draw.h" + +using namespace Rando; + +std::array Rando::StaticData::itemTable; + +void Rando::StaticData::InitItemTable() { + itemTable[RG_NONE] = Item(RG_NONE, Text{ "No Item", "Rien", "Kein Artikel" }, ITEMTYPE_EVENT, GI_RUPEE_GREEN, false, &Logic::noVariable, RHT_NONE, ITEM_NONE, 0, 0, 0, 0, 0, ITEM_CATEGORY_JUNK, MOD_NONE); + // Randomizer Get Randomizer Get Name Text Type Get Item ID Adv. Logic Variable Hint Text Key Item ID Object ID Draw ID Text ID field Chest Animation Item Category Mod Index + itemTable[RG_KOKIRI_SWORD] = Item(RG_KOKIRI_SWORD, Text{ "Kokiri Sword", "Épée Kokiri", "Kokiri-Schwert" }, ITEMTYPE_ITEM, GI_SWORD_KOKIRI, true, &Logic::KokiriSword, RHT_KOKIRI_SWORD, ITEM_SWORD_KOKIRI, OBJECT_GI_SWORD_1, GID_SWORD_KOKIRI, 0xA4, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_GIANTS_KNIFE] = Item(RG_GIANTS_KNIFE, Text{ "Giant's Knife", "Lame des Géants", "Messer des Riesen" }, ITEMTYPE_ITEM, GI_SWORD_KNIFE, true, &Logic::KokiriSword, RHT_GIANTS_KNIFE, ITEM_SWORD_BGS, OBJECT_GI_LONGSWORD, GID_SWORD_BGS, 0x4B, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_BIGGORON_SWORD] = Item(RG_BIGGORON_SWORD, Text{ "Biggoron's Sword", "Épée de Biggoron", "Biggoron-Schwert" }, ITEMTYPE_ITEM, GI_SWORD_BGS, true, &Logic::BiggoronSword, RHT_BIGGORON_SWORD, ITEM_SWORD_BGS, OBJECT_GI_LONGSWORD, GID_SWORD_BGS, 0x0C, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_DEKU_SHIELD] = Item(RG_DEKU_SHIELD, Text{ "Deku Shield", "Bouclier Mojo", "Deku-Schild" }, ITEMTYPE_ITEM, GI_SHIELD_DEKU, false, &Logic::noVariable, RHT_DEKU_SHIELD, ITEM_SHIELD_DEKU, OBJECT_GI_SHIELD_1, GID_SHIELD_DEKU, 0x4C, 0xA0, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE); + itemTable[RG_HYLIAN_SHIELD] = Item(RG_HYLIAN_SHIELD, Text{ "Hylian Shield", "Bouclier Hylien", "Hylia-Schild" }, ITEMTYPE_ITEM, GI_SHIELD_HYLIAN, false, &Logic::noVariable, RHT_HYLIAN_SHIELD, ITEM_SHIELD_HYLIAN, OBJECT_GI_SHIELD_2, GID_SHIELD_HYLIAN, 0x4D, 0xA0, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE); + itemTable[RG_MIRROR_SHIELD] = Item(RG_MIRROR_SHIELD, Text{ "Mirror Shield", "Bouclier Miroir", "Spiegel-Schild" }, ITEMTYPE_ITEM, GI_SHIELD_MIRROR, true, &Logic::MirrorShield, RHT_MIRROR_SHIELD, ITEM_SHIELD_MIRROR, OBJECT_GI_SHIELD_3, GID_SHIELD_MIRROR, 0x4E, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_GORON_TUNIC] = Item(RG_GORON_TUNIC, Text{ "Goron Tunic", "Tunique Goron", "Goronen-Tunika" }, ITEMTYPE_ITEM, GI_TUNIC_GORON, true, &Logic::GoronTunic, RHT_GORON_TUNIC, ITEM_TUNIC_GORON, OBJECT_GI_CLOTHES, GID_TUNIC_GORON, 0x50, 0xA0, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); + itemTable[RG_ZORA_TUNIC] = Item(RG_ZORA_TUNIC, Text{ "Zora Tunic", "Tunique Zora", "Zora-Tunika" }, ITEMTYPE_ITEM, GI_TUNIC_ZORA, true, &Logic::ZoraTunic, RHT_ZORA_TUNIC, ITEM_TUNIC_ZORA, OBJECT_GI_CLOTHES, GID_TUNIC_ZORA, 0x51, 0xA0, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); + itemTable[RG_IRON_BOOTS] = Item(RG_IRON_BOOTS, Text{ "Iron Boots", "Bottes de plomb", "Eisenstiefel" }, ITEMTYPE_ITEM, GI_BOOTS_IRON, true, &Logic::IronBoots, RHT_IRON_BOOTS, ITEM_BOOTS_IRON, OBJECT_GI_BOOTS_2, GID_BOOTS_IRON, 0x53, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_HOVER_BOOTS] = Item(RG_HOVER_BOOTS, Text{ "Hover Boots", "Bottes de airs", "Gleitstiefel" }, ITEMTYPE_ITEM, GI_BOOTS_HOVER, true, &Logic::HoverBoots, RHT_HOVER_BOOTS, ITEM_BOOTS_HOVER, OBJECT_GI_HOVERBOOTS, GID_BOOTS_HOVER, 0x54, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_BOOMERANG] = Item(RG_BOOMERANG, Text{ "Boomerang", "Boomerang", "Bumerang" }, ITEMTYPE_ITEM, GI_BOOMERANG, true, &Logic::Boomerang, RHT_BOOMERANG, ITEM_BOOMERANG, OBJECT_GI_BOOMERANG, GID_BOOMERANG, 0x35, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_LENS_OF_TRUTH] = Item(RG_LENS_OF_TRUTH, Text{ "Lens of Truth", "Monocle de Vérité", "Auge der Wahrheit" }, ITEMTYPE_ITEM, GI_LENS, true, &Logic::LensOfTruth, RHT_LENS_OF_TRUTH, ITEM_LENS, OBJECT_GI_GLASSES, GID_LENS, 0x39, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_MEGATON_HAMMER] = Item(RG_MEGATON_HAMMER, Text{ "Megaton Hammer", "Masse des Titans", "Stahlhammer" }, ITEMTYPE_ITEM, GI_HAMMER, true, &Logic::Hammer, RHT_MEGATON_HAMMER, ITEM_HAMMER, OBJECT_GI_HAMMER, GID_HAMMER, 0x38, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_STONE_OF_AGONY] = Item(RG_STONE_OF_AGONY, Text{ "Stone of Agony", "Pierre de Souffrance", "Stein der Qualen" }, ITEMTYPE_ITEM, GI_STONE_OF_AGONY, true, &Logic::ShardOfAgony, RHT_STONE_OF_AGONY, ITEM_STONE_OF_AGONY, OBJECT_GI_MAP, GID_STONE_OF_AGONY, 0x68, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_DINS_FIRE] = Item(RG_DINS_FIRE, Text{ "Din's Fire", "Feu de Din", "Dins Feuerinferno" }, ITEMTYPE_ITEM, GI_DINS_FIRE, true, &Logic::DinsFire, RHT_DINS_FIRE, ITEM_DINS_FIRE, OBJECT_GI_GODDESS, GID_DINS_FIRE, 0xAD, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_FARORES_WIND] = Item(RG_FARORES_WIND, Text{ "Farore's Wind", "Vent de Farore", "Farores Donnersturm" }, ITEMTYPE_ITEM, GI_FARORES_WIND, true, &Logic::FaroresWind, RHT_FARORES_WIND, ITEM_FARORES_WIND, OBJECT_GI_GODDESS, GID_FARORES_WIND, 0xAE, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_NAYRUS_LOVE] = Item(RG_NAYRUS_LOVE, Text{ "Nayru's Love", "Amour de Nayru", "Nayrus Umarmung" }, ITEMTYPE_ITEM, GI_NAYRUS_LOVE, true, &Logic::NayrusLove, RHT_NAYRUS_LOVE, ITEM_NAYRUS_LOVE, OBJECT_GI_GODDESS, GID_NAYRUS_LOVE, 0xAF, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_FIRE_ARROWS] = Item(RG_FIRE_ARROWS, Text{ "Fire Arrow", "Flèche de Feu", "Feuerpfeile" }, ITEMTYPE_ITEM, GI_ARROW_FIRE, true, &Logic::FireArrows, RHT_FIRE_ARROWS, ITEM_ARROW_FIRE, OBJECT_GI_M_ARROW, GID_ARROW_FIRE, 0x70, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_ICE_ARROWS] = Item(RG_ICE_ARROWS, Text{ "Ice Arrow", "Flèche de Glace", "Eispfeil" }, ITEMTYPE_ITEM, GI_ARROW_ICE, true, &Logic::IceArrows, RHT_ICE_ARROWS, ITEM_ARROW_ICE, OBJECT_GI_M_ARROW, GID_ARROW_ICE, 0x71, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_LIGHT_ARROWS] = Item(RG_LIGHT_ARROWS, Text{ "Light Arrow", "Flèche de Lumière", "Lichtpfeil" }, ITEMTYPE_ITEM, GI_ARROW_LIGHT, true, &Logic::LightArrows, RHT_LIGHT_ARROWS, ITEM_ARROW_LIGHT, OBJECT_GI_M_ARROW, GID_ARROW_LIGHT, 0x72, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_GERUDO_MEMBERSHIP_CARD] = Item(RG_GERUDO_MEMBERSHIP_CARD, Text{ "Gerudo Membership Card", "Carte Gerudo", "Gerudo Karte" }, ITEMTYPE_ITEM, GI_GERUDO_CARD, true, &Logic::GerudoToken, RHT_GERUDO_MEMBERSHIP_CARD, ITEM_GERUDO_CARD, OBJECT_GI_GERUDO, GID_GERUDO_CARD, 0x7B, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_MAGIC_BEAN] = Item(RG_MAGIC_BEAN, Text{ "Magic Bean", "Haricots Magiques", "Wundererbse" }, ITEMTYPE_ITEM, GI_BEAN, true, &Logic::MagicBean, RHT_MAGIC_BEAN, ITEM_BEAN, OBJECT_GI_BEAN, GID_BEAN, 0x48, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_MAGIC_BEAN_PACK] = Item(RG_MAGIC_BEAN_PACK, Text{ "Magic Bean Pack", "Paquet de Haricots Magiques", "Wundererbsen-Packung" }, ITEMTYPE_ITEM, RG_MAGIC_BEAN_PACK, true, &Logic::MagicBeanPack, RHT_MAGIC_BEAN_PACK, RG_MAGIC_BEAN_PACK, OBJECT_GI_BEAN, GID_BEAN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_DOUBLE_DEFENSE] = Item(RG_DOUBLE_DEFENSE, Text{ "Double Defense", "Double Défence", "Doppelte Verteidigung" }, ITEMTYPE_ITEM, RG_DOUBLE_DEFENSE, true, &Logic::DoubleDefense, RHT_DOUBLE_DEFENSE, RG_DOUBLE_DEFENSE, OBJECT_GI_HEARTS, GID_HEART_CONTAINER,0xE9, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_DOUBLE_DEFENSE].SetCustomDrawFunc(Randomizer_DrawDoubleDefense); + // Trade Quest Items + itemTable[RG_WEIRD_EGG] = Item(RG_WEIRD_EGG, Text{ "Weird Egg", "Oeuf Curieux", "Seltsames Ei" }, ITEMTYPE_ITEM, GI_WEIRD_EGG, true, &Logic::WeirdEgg, RHT_WEIRD_EGG, ITEM_WEIRD_EGG, OBJECT_GI_EGG, GID_EGG, 0x9A, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_ZELDAS_LETTER] = Item(RG_ZELDAS_LETTER, Text{ "Zelda's Letter", "Lettre de Zelda", "Zeldas Brief" }, ITEMTYPE_ITEM, GI_LETTER_ZELDA, true, &Logic::ZeldasLetter, RHT_ZELDAS_LETTER, ITEM_LETTER_ZELDA, OBJECT_GI_LETTER, GID_LETTER_ZELDA, 0x69, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_POCKET_EGG] = Item(RG_POCKET_EGG, Text{ "Pocket Egg", "Oeuf de poche", "Taschenei" }, ITEMTYPE_ITEM, GI_POCKET_EGG, true, &Logic::PocketEgg, RHT_POCKET_EGG, ITEM_POCKET_EGG, OBJECT_GI_EGG, GID_EGG, 0x01, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_COJIRO] = Item(RG_COJIRO, Text{ "Cojiro", "P'tit Poulet", "Cojiro" }, ITEMTYPE_ITEM, GI_COJIRO, true, &Logic::Cojiro, RHT_COJIRO, ITEM_COJIRO, OBJECT_GI_NIWATORI, GID_COJIRO, 0x02, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_ODD_MUSHROOM] = Item(RG_ODD_MUSHROOM, Text{ "Odd Mushroom", "Champigon Suspect", "Seltsamer Pilz" }, ITEMTYPE_ITEM, GI_ODD_MUSHROOM, true, &Logic::OddMushroom, RHT_ODD_MUSHROOM, ITEM_ODD_MUSHROOM, OBJECT_GI_MUSHROOM, GID_ODD_MUSHROOM, 0x03, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_ODD_POTION] = Item(RG_ODD_POTION, Text{ "Odd Potion", "Mixture Suspecte", "Seltsamer Trank" }, ITEMTYPE_ITEM, GI_ODD_POTION, true, &Logic::OddPoultice, RHT_ODD_POTION, ITEM_ODD_POTION, OBJECT_GI_POWDER, GID_ODD_POTION, 0x04, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_POACHERS_SAW] = Item(RG_POACHERS_SAW, Text{ "Poacher's Saw", "Scie du Chasseur", "Wilderer-Säge" }, ITEMTYPE_ITEM, GI_SAW, true, &Logic::PoachersSaw, RHT_POACHERS_SAW, ITEM_SAW, OBJECT_GI_SAW, GID_SAW, 0x05, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_BROKEN_SWORD] = Item(RG_BROKEN_SWORD, Text{ "Broken Goron's Sword", "Épée Brisée de Goron", "Schwert des gebrochenen Goronen" }, ITEMTYPE_ITEM, GI_SWORD_BROKEN, true, &Logic::BrokenSword, RHT_BROKEN_SWORD, ITEM_SWORD_BROKEN, OBJECT_GI_BROKENSWORD, GID_SWORD_BROKEN, 0x08, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_PRESCRIPTION] = Item(RG_PRESCRIPTION, Text{ "Prescription", "Ordonnance", "Verschreibung" }, ITEMTYPE_ITEM, GI_PRESCRIPTION, true, &Logic::Prescription, RHT_PRESCRIPTION, ITEM_PRESCRIPTION, OBJECT_GI_PRESCRIPTION, GID_PRESCRIPTION, 0x09, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_EYEBALL_FROG] = Item(RG_EYEBALL_FROG, Text{ "Eyeball Frog", "Crapaud-qui-louche", "Augapfel-Frosch" }, ITEMTYPE_ITEM, GI_FROG, true, &Logic::EyeballFrog, RHT_EYEBALL_FROG, ITEM_FROG, OBJECT_GI_FROG, GID_FROG, 0x0D, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_EYEDROPS] = Item(RG_EYEDROPS, Text{ "World's Finest Eyedrops", "Super Gouttes", "Supertropfen" }, ITEMTYPE_ITEM, GI_EYEDROPS, true, &Logic::Eyedrops, RHT_EYEDROPS, ITEM_EYEDROPS, OBJECT_GI_EYE_LOTION, GID_EYEDROPS, 0x0E, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_CLAIM_CHECK] = Item(RG_CLAIM_CHECK, Text{ "Claim Check", "Certificat", "Quittung" }, ITEMTYPE_ITEM, GI_CLAIM_CHECK, true, &Logic::ClaimCheck, RHT_CLAIM_CHECK, ITEM_CLAIM_CHECK, OBJECT_GI_TICKETSTONE, GID_CLAIM_CHECK, 0x0A, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + // Skulltula Token + itemTable[RG_GOLD_SKULLTULA_TOKEN] = Item(RG_GOLD_SKULLTULA_TOKEN, Text{ "Gold Skulltula Token", "Symbole de Skulltula d'Or", "Goldenes Skulltula-Symbol" }, ITEMTYPE_TOKEN, GI_SKULL_TOKEN, true, &Logic::GoldSkulltulaTokens, RHT_GOLD_SKULLTULA_TOKEN, ITEM_SKULL_TOKEN, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, 0xB4, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SKULLTULA_TOKEN, MOD_NONE); + // Progressive Items + itemTable[RG_PROGRESSIVE_HOOKSHOT] = Item(RG_PROGRESSIVE_HOOKSHOT, Text{ "Progressive Hookshot", "Grappin (prog.)", "Progressiver Fanghaken" }, ITEMTYPE_ITEM, 0x80, true, &Logic::ProgressiveHookshot, RHT_PROGRESSIVE_HOOKSHOT, true); + itemTable[RG_PROGRESSIVE_STRENGTH] = Item(RG_PROGRESSIVE_STRENGTH, Text{ "Strength Upgrade", "Amélioration de Force (prog.)", "Progressives Kraft-Upgrade" }, ITEMTYPE_ITEM, 0x81, true, &Logic::ProgressiveStrength, RHT_PROGRESSIVE_STRENGTH, true); + itemTable[RG_PROGRESSIVE_BOMB_BAG] = Item(RG_PROGRESSIVE_BOMB_BAG, Text{ "Progressive Bomb Bag", "Sac de Bombes (prog.)", "Progressive Bombentasche" }, ITEMTYPE_ITEM, 0x82, true, &Logic::ProgressiveBombBag, RHT_PROGRESSIVE_BOMB_BAG, true); + itemTable[RG_PROGRESSIVE_BOW] = Item(RG_PROGRESSIVE_BOW, Text{ "Progressive Bow", "Arc (prog.)", "Progressiver Bogen" }, ITEMTYPE_ITEM, 0x83, true, &Logic::ProgressiveBow, RHT_PROGRESSIVE_BOW, true); + itemTable[RG_PROGRESSIVE_SLINGSHOT] = Item(RG_PROGRESSIVE_SLINGSHOT, Text{ "Progressive Slingshot", "Lance-Pierre (prog.)", "Progressive Steinschleuder" }, ITEMTYPE_ITEM, 0x84, true, &Logic::ProgressiveBulletBag,RHT_PROGRESSIVE_SLINGSHOT, true); + itemTable[RG_PROGRESSIVE_WALLET] = Item(RG_PROGRESSIVE_WALLET, Text{ "Progressive Wallet", "Bourse (prog.)", "Progressive Brieftasche" }, ITEMTYPE_ITEM, 0x85, true, &Logic::ProgressiveWallet, RHT_PROGRESSIVE_WALLET, true); + itemTable[RG_PROGRESSIVE_SCALE] = Item(RG_PROGRESSIVE_SCALE, Text{ "Progressive Scale", "Écaille (prog.)", "Progressive Skala" }, ITEMTYPE_ITEM, 0x86, true, &Logic::ProgressiveScale, RHT_PROGRESSIVE_SCALE, true); + itemTable[RG_PROGRESSIVE_NUT_UPGRADE] = Item(RG_PROGRESSIVE_NUT_UPGRADE, Text{ "Progressive Nut Capacity", "Capacité de Noix (prog.)", "Progressive Nusskapazität" }, ITEMTYPE_ITEM, 0x87, false, &Logic::noVariable, RHT_PROGRESSIVE_NUT_UPGRADE, true); + itemTable[RG_PROGRESSIVE_STICK_UPGRADE] = Item(RG_PROGRESSIVE_STICK_UPGRADE, Text{ "Progressive Stick Capacity", "Capacité de Bâtons (prog.)", "Progressive Stick-Kapazität" }, ITEMTYPE_ITEM, 0x88, false, &Logic::noVariable, RHT_PROGRESSIVE_STICK_UPGRADE, true); + itemTable[RG_PROGRESSIVE_BOMBCHUS] = Item(RG_PROGRESSIVE_BOMBCHUS, Text{ "Progressive Bombchu", "Missiles (prog.)", "Progressive Kriechgrube" }, ITEMTYPE_ITEM, 0x89, true, &Logic::Bombchus, RHT_PROGRESSIVE_BOMBCHUS, RG_PROGRESSIVE_BOMBCHUS, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER, true); + itemTable[RG_PROGRESSIVE_MAGIC_METER] = Item(RG_PROGRESSIVE_MAGIC_METER, Text{ "Progressive Magic Meter", "Jauge de Magie (prog.)", "Progressives magisches Messgerät" }, ITEMTYPE_ITEM, 0x8A, true, &Logic::ProgressiveMagic, RHT_PROGRESSIVE_MAGIC_METER, true); + itemTable[RG_PROGRESSIVE_OCARINA] = Item(RG_PROGRESSIVE_OCARINA, Text{ "Progressive Ocarina", "Ocarina (prog.)", "Progressive Okarina" }, ITEMTYPE_ITEM, 0x8B, true, &Logic::ProgressiveOcarina, RHT_PROGRESSIVE_OCARINA, true); + itemTable[RG_PROGRESSIVE_GORONSWORD] = Item(RG_PROGRESSIVE_GORONSWORD, Text{ "Progressive Goron Sword", "Épée Goron (prog.)", "Progressives Goronenschwert" }, ITEMTYPE_ITEM, 0xD4, true, &Logic::ProgressiveGiantKnife,RHT_PROGRESSIVE_GORONSWORD, true); + // Bottles + itemTable[RG_EMPTY_BOTTLE] = Item(RG_EMPTY_BOTTLE, Text{ "Empty Bottle", "Bouteille Vide", "Leere Flasche" }, ITEMTYPE_ITEM, GI_BOTTLE, true, &Logic::Bottles, RHT_BOTTLE_WITH_MILK, ITEM_BOTTLE, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x42, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_BOTTLE_WITH_MILK] = Item(RG_BOTTLE_WITH_MILK, Text{ "Bottle with Milk", "Bouteille avec du Lait", "Flasche mit Milch" }, ITEMTYPE_ITEM, GI_MILK_BOTTLE, true, &Logic::Bottles, RHT_BOTTLE_WITH_MILK, ITEM_MILK_BOTTLE, OBJECT_GI_MILK, GID_MILK, 0x98, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_BOTTLE_WITH_RED_POTION] = Item(RG_BOTTLE_WITH_RED_POTION, Text{ "Bottle with Red Potion", "Bouteille avec une Potion Rouge", "Flasche mit rotem Elixier" }, ITEMTYPE_ITEM, 0x8C, true, &Logic::Bottles, RHT_BOTTLE_WITH_RED_POTION, RG_BOTTLE_WITH_RED_POTION, OBJECT_GI_LIQUID, GID_POTION_RED, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_BOTTLE_WITH_GREEN_POTION] = Item(RG_BOTTLE_WITH_GREEN_POTION, Text{ "Bottle with Green Potion", "Bouteille avec une Potion Verte", "Flasche mit grünem Elixier" }, ITEMTYPE_ITEM, 0x8D, true, &Logic::Bottles, RHT_BOTTLE_WITH_GREEN_POTION,RG_BOTTLE_WITH_GREEN_POTION, OBJECT_GI_LIQUID, GID_POTION_GREEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_BOTTLE_WITH_BLUE_POTION] = Item(RG_BOTTLE_WITH_BLUE_POTION, Text{ "Bottle with Blue Potion", "Bouteille avec une Potion Bleue", "Flasche mit blauem Elixier" }, ITEMTYPE_ITEM, 0x8E, true, &Logic::Bottles, RHT_BOTTLE_WITH_BLUE_POTION,RG_BOTTLE_WITH_BLUE_POTION, OBJECT_GI_LIQUID, GID_POTION_BLUE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_BOTTLE_WITH_FAIRY] = Item(RG_BOTTLE_WITH_FAIRY, Text{ "Bottle with Fairy", "Bouteille avec une Fée", "Flasche mit Fee" }, ITEMTYPE_ITEM, 0x8F, true, &Logic::Bottles, RHT_BOTTLE_WITH_FAIRY, RG_BOTTLE_WITH_FAIRY, OBJECT_GI_BOTTLE, GID_BOTTLE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_BOTTLE_WITH_FISH] = Item(RG_BOTTLE_WITH_FISH, Text{ "Bottle with Fish", "Bouteille avec un Poisson", "Flasche mit Fisch" }, ITEMTYPE_ITEM, 0x90, true, &Logic::Bottles, RHT_BOTTLE_WITH_FISH, RG_BOTTLE_WITH_FISH, OBJECT_GI_FISH, GID_FISH, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_BOTTLE_WITH_BLUE_FIRE] = Item(RG_BOTTLE_WITH_BLUE_FIRE, Text{ "Bottle with Blue Fire", "Bouteille avec une Flamme Bleue", "Flasche mit blauem Feuer" }, ITEMTYPE_ITEM, 0x91, true, &Logic::Bottles, RHT_BOTTLE_WITH_BLUE_FIRE, RG_BOTTLE_WITH_BLUE_FIRE, OBJECT_GI_FIRE, GID_BLUE_FIRE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_BOTTLE_WITH_BUGS] = Item(RG_BOTTLE_WITH_BUGS, Text{ "Bottle with Bugs", "Bouteille avec des Insectes", "Flasche mit Wanzen" }, ITEMTYPE_ITEM, 0x92, true, &Logic::Bottles, RHT_BOTTLE_WITH_BUGS, RG_BOTTLE_WITH_BUGS, OBJECT_GI_INSECT, GID_BUG, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_BOTTLE_WITH_POE] = Item(RG_BOTTLE_WITH_POE, Text{ "Bottle with Poe", "Bouteille avec un Esprit", "Flasche mit einem Geist" }, ITEMTYPE_ITEM, 0x94, true, &Logic::Bottles, RHT_BOTTLE_WITH_POE, RG_BOTTLE_WITH_POE, OBJECT_GI_GHOST, GID_POE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_RUTOS_LETTER] = Item(RG_RUTOS_LETTER, Text{ "Bottle with Ruto's Letter", "Bouteille avec la Lettre de Ruto", "Flasche mit Rutos Brief" }, ITEMTYPE_ITEM, GI_LETTER_RUTO, true, &Logic::RutosLetter, RHT_RUTOS_LETTER, ITEM_LETTER_RUTO, OBJECT_GI_BOTTLE_LETTER,GID_LETTER_RUTO, 0x99, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_BOTTLE_WITH_BIG_POE] = Item(RG_BOTTLE_WITH_BIG_POE, Text{ "Bottle with Big Poe", "Bouteille avec une Âme", "Flasche mit Seele" }, ITEMTYPE_ITEM, 0x93, true, &Logic::BottleWithBigPoe, RHT_BOTTLE_WITH_BIG_POE, RG_BOTTLE_WITH_BIG_POE, OBJECT_GI_GHOST, GID_BIG_POE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + // Songs + itemTable[RG_ZELDAS_LULLABY] = Item(RG_ZELDAS_LULLABY, Text{ "Zelda's Lullaby", "Berceuse de Zelda", "Zeldas Wiegenlied" }, ITEMTYPE_SONG, 0xC1, true, &Logic::ZeldasLullaby, RHT_ZELDAS_LULLABY, ITEM_SONG_LULLABY, OBJECT_GI_MELODY, GID_SONG_ZELDA, 0xD4, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_EPONAS_SONG] = Item(RG_EPONAS_SONG, Text{ "Epona's Song", "Chant d'Epona", "Eponas Lied" }, ITEMTYPE_SONG, 0xC2, true, &Logic::EponasSong, RHT_EPONAS_SONG, ITEM_SONG_EPONA, OBJECT_GI_MELODY, GID_SONG_EPONA, 0xD2, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_SARIAS_SONG] = Item(RG_SARIAS_SONG, Text{ "Saria's Song", "Chant de Saria", "Sarias Lied" }, ITEMTYPE_SONG, 0xC3, true, &Logic::SariasSong, RHT_SARIAS_SONG, ITEM_SONG_SARIA, OBJECT_GI_MELODY, GID_SONG_SARIA, 0xD1, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_SUNS_SONG] = Item(RG_SUNS_SONG, Text{ "Sun's Song", "Chant du Soleil", "Das Lied der Sonne" }, ITEMTYPE_SONG, 0xC4, true, &Logic::SunsSong, RHT_SUNS_SONG, ITEM_SONG_SUN, OBJECT_GI_MELODY, GID_SONG_SUN, 0xD3, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_SONG_OF_TIME] = Item(RG_SONG_OF_TIME, Text{ "Song of Time", "Chant du Temps", "Das Lied der Zeit" }, ITEMTYPE_SONG, 0xC5, true, &Logic::SongOfTime, RHT_SONG_OF_TIME, ITEM_SONG_TIME, OBJECT_GI_MELODY, GID_SONG_TIME, 0xD5, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_SONG_OF_STORMS] = Item(RG_SONG_OF_STORMS, Text{ "Song of Storms", "Chant des Tempêtes", "Lied der Stürme" }, ITEMTYPE_SONG, 0xC6, true, &Logic::SongOfStorms, RHT_SONG_OF_STORMS, ITEM_SONG_STORMS, OBJECT_GI_MELODY, GID_SONG_STORM, 0xD6, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_MINUET_OF_FOREST] = Item(RG_MINUET_OF_FOREST, Text{ "Minuet of Forest", "Menuet des Bois", "Wald-Minuett" }, ITEMTYPE_SONG, 0xBB, true, &Logic::MinuetOfForest, RHT_MINUET_OF_FOREST, ITEM_SONG_MINUET, OBJECT_GI_MELODY, GID_SONG_MINUET, 0x73, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_BOLERO_OF_FIRE] = Item(RG_BOLERO_OF_FIRE, Text{ "Bolero of Fire", "Boléro du Feu", "Bolero des Feuers" }, ITEMTYPE_SONG, 0xBC, true, &Logic::BoleroOfFire, RHT_BOLERO_OF_FIRE, ITEM_SONG_BOLERO, OBJECT_GI_MELODY, GID_SONG_BOLERO, 0x74, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_SERENADE_OF_WATER] = Item(RG_SERENADE_OF_WATER, Text{ "Serenade of Water", "Sérénade de l'Eau", "Serenade des Wassers" }, ITEMTYPE_SONG, 0xBD, true, &Logic::SerenadeOfWater, RHT_SERENADE_OF_WATER, ITEM_SONG_SERENADE, OBJECT_GI_MELODY, GID_SONG_SERENADE, 0x75, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_NOCTURNE_OF_SHADOW] = Item(RG_NOCTURNE_OF_SHADOW, Text{ "Nocturne of Shadow", "Nocturne de l'Ombre", "Nocturne der Schatten " }, ITEMTYPE_SONG, 0xBF, true, &Logic::NocturneOfShadow, RHT_NOCTURNE_OF_SHADOW, ITEM_SONG_NOCTURNE, OBJECT_GI_MELODY, GID_SONG_NOCTURNE, 0x77, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_REQUIEM_OF_SPIRIT] = Item(RG_REQUIEM_OF_SPIRIT, Text{ "Requiem of Spirit", "Requiem des Esprits", "Requiem des Geistes" }, ITEMTYPE_SONG, 0xBE, true, &Logic::RequiemOfSpirit, RHT_REQUIEM_OF_SPIRIT, ITEM_SONG_REQUIEM, OBJECT_GI_MELODY, GID_SONG_REQUIEM, 0x76, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_PRELUDE_OF_LIGHT] = Item(RG_PRELUDE_OF_LIGHT, Text{ "Prelude of Light", "Prélude de la Lumière", "Präludium des Lichts" }, ITEMTYPE_SONG, 0xC0, true, &Logic::PreludeOfLight, RHT_PRELUDE_OF_LIGHT, ITEM_SONG_PRELUDE, OBJECT_GI_MELODY, GID_SONG_PRELUDE, 0x78, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + // Maps and Compasses + itemTable[RG_DEKU_TREE_MAP] = Item(RG_DEKU_TREE_MAP, Text{ "Great Deku Tree Map", "Carte de l'Arbre Mojo", "Karte des Deku-Baums" }, ITEMTYPE_MAP, 0xA5, false, &Logic::noVariable, RHT_DEKU_TREE_MAP, RG_DEKU_TREE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_DODONGOS_CAVERN_MAP] = Item(RG_DODONGOS_CAVERN_MAP, Text{ "Dodongo's Cavern Map", "Carte de la Caverne Dodongo", "Karte der Dodongo-Höhle" }, ITEMTYPE_MAP, 0xA6, false, &Logic::noVariable, RHT_DODONGOS_CAVERN_MAP, RG_DODONGOS_CAVERN_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_JABU_JABUS_BELLY_MAP] = Item(RG_JABU_JABUS_BELLY_MAP, Text{ "Jabu-Jabu's Belly Map", "Carte du Ventre de Jabu-Jabu", "Karte des Jabu-Jabu-Bauchs" }, ITEMTYPE_MAP, 0xA7, false, &Logic::noVariable, RHT_JABU_JABUS_BELLY_MAP, RG_JABU_JABUS_BELLY_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_FOREST_TEMPLE_MAP] = Item(RG_FOREST_TEMPLE_MAP, Text{ "Forest Temple Map", "Carte du Temple de la Forêt", "Waldtempel Karte" }, ITEMTYPE_MAP, 0xA8, false, &Logic::noVariable, RHT_FOREST_TEMPLE_MAP, RG_FOREST_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_FIRE_TEMPLE_MAP] = Item(RG_FIRE_TEMPLE_MAP, Text{ "Fire Temple Map", "Carte due Temple de Feu", "Feuertempel Karte" }, ITEMTYPE_MAP, 0xA9, false, &Logic::noVariable, RHT_FIRE_TEMPLE_MAP, RG_FIRE_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_WATER_TEMPLE_MAP] = Item(RG_WATER_TEMPLE_MAP, Text{ "Water Temple Map", "Carte du Temple de l'Eau", "Wassertempel-Karte" }, ITEMTYPE_MAP, 0xAA, false, &Logic::noVariable, RHT_WATER_TEMPLE_MAP, RG_WATER_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_SPIRIT_TEMPLE_MAP] = Item(RG_SPIRIT_TEMPLE_MAP, Text{ "Spirit Temple Map", "Carte due Temple de l'Esprit", "Geistertempel Karte" }, ITEMTYPE_MAP, 0xAB, false, &Logic::noVariable, RHT_SPIRIT_TEMPLE_MAP, RG_SPIRIT_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_SHADOW_TEMPLE_MAP] = Item(RG_SHADOW_TEMPLE_MAP, Text{ "Shadow Temple Map", "Carte du Temple de l'Ombre", "Karte des Schattentempels" }, ITEMTYPE_MAP, 0xAC, false, &Logic::noVariable, RHT_SHADOW_TEMPLE_MAP, RG_SHADOW_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_BOTTOM_OF_THE_WELL_MAP] = Item(RG_BOTTOM_OF_THE_WELL_MAP, Text{ "Bottom of the Well Map", "Carte du Puits", "Boden des Brunnens Karte" }, ITEMTYPE_MAP, 0xAD, false, &Logic::noVariable, RHT_BOTTOM_OF_THE_WELL_MAP, RG_BOTTOM_OF_THE_WELL_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_ICE_CAVERN_MAP] = Item(RG_ICE_CAVERN_MAP, Text{ "Ice Cavern Map", "Carte de la Caverne Polaire", "Eishöhle Karte" }, ITEMTYPE_MAP, 0xAE, false, &Logic::noVariable, RHT_ICE_CAVERN_MAP, RG_ICE_CAVERN_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_DEKU_TREE_COMPASS] = Item(RG_DEKU_TREE_COMPASS, Text{ "Great Deku Tree Compass", "Boussole de l'Arbre Mojo", "Kompass des Deku-Baums" }, ITEMTYPE_COMPASS, 0x9B, false, &Logic::noVariable, RHT_DEKU_TREE_COMPASS, RG_DEKU_TREE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_DODONGOS_CAVERN_COMPASS] = Item(RG_DODONGOS_CAVERN_COMPASS, Text{ "Dodongo's Cavern Compass", "Boussole de la Caverne Dodongo", "Kompass der Dodongo-Höhle" }, ITEMTYPE_COMPASS, 0x9C, false, &Logic::noVariable, RHT_DODONGOS_CAVERN_COMPASS,RG_DODONGOS_CAVERN_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_JABU_JABUS_BELLY_COMPASS] = Item(RG_JABU_JABUS_BELLY_COMPASS, Text{ "Jabu-Jabu's Belly Compass", "Boussole du Ventre de Jabu-Jabu", "Kompass des Jabu-Jabu-Bauchs" }, ITEMTYPE_COMPASS, 0x9D, false, &Logic::noVariable, RHT_JABU_JABUS_BELLY_COMPASS,RG_JABU_JABUS_BELLY_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_FOREST_TEMPLE_COMPASS] = Item(RG_FOREST_TEMPLE_COMPASS, Text{ "Forest Temple Compass", "Boussole du Temple de la Forêt", "Waldtempel-Kompass" }, ITEMTYPE_COMPASS, 0x9E, false, &Logic::noVariable, RHT_FOREST_TEMPLE_COMPASS, RG_FOREST_TEMPLE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_FIRE_TEMPLE_COMPASS] = Item(RG_FIRE_TEMPLE_COMPASS, Text{ "Fire Temple Compass", "Boussole du Temple du Feu", "Feuertempel-Kompass" }, ITEMTYPE_COMPASS, 0x9F, false, &Logic::noVariable, RHT_FIRE_TEMPLE_COMPASS, RG_FIRE_TEMPLE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_WATER_TEMPLE_COMPASS] = Item(RG_WATER_TEMPLE_COMPASS, Text{ "Water Temple Compass", "Boussole du Temple de l'Eau", "Wassertempel-Kompass" }, ITEMTYPE_COMPASS, 0xA0, false, &Logic::noVariable, RHT_WATER_TEMPLE_COMPASS, RG_WATER_TEMPLE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_SPIRIT_TEMPLE_COMPASS] = Item(RG_SPIRIT_TEMPLE_COMPASS, Text{ "Spirit Temple Compass", "Boussole due Temple de l'Esprit", "Geistiger Tempelkompass" }, ITEMTYPE_COMPASS, 0xA1, false, &Logic::noVariable, RHT_SPIRIT_TEMPLE_COMPASS, RG_SPIRIT_TEMPLE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_SHADOW_TEMPLE_COMPASS] = Item(RG_SHADOW_TEMPLE_COMPASS, Text{ "Shadow Temple Compass", "Boussole du Temple de l'Ombre", "Kompass des Schattentempels" }, ITEMTYPE_COMPASS, 0xA2, false, &Logic::noVariable, RHT_SHADOW_TEMPLE_COMPASS, RG_SHADOW_TEMPLE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_BOTTOM_OF_THE_WELL_COMPASS] = Item(RG_BOTTOM_OF_THE_WELL_COMPASS, Text{ "Bottom of the Well Compass", "Boussole du Puits", "Boden des Brunnenkompasses" }, ITEMTYPE_COMPASS, 0xA3, false, &Logic::noVariable, RHT_BOTTOM_OF_THE_WELL_COMPASS,RG_BOTTOM_OF_THE_WELL_COMPASS,OBJECT_GI_COMPASS, GID_COMPASS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_ICE_CAVERN_COMPASS] = Item(RG_ICE_CAVERN_COMPASS, Text{ "Ice Cavern Compass", "Boussole de la Caverne Polaire", "Eishöhlenkompass" }, ITEMTYPE_COMPASS, 0xA4, false, &Logic::noVariable, RHT_ICE_CAVERN_COMPASS, RG_ICE_CAVERN_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + // Boss Keys + itemTable[RG_FOREST_TEMPLE_BOSS_KEY] = Item(RG_FOREST_TEMPLE_BOSS_KEY, Text{ "Forest Temple Boss Key", "Clé d'Or du Temple de la Forêt", "Waldtempel-Boss-Schlüssel" }, ITEMTYPE_BOSSKEY, 0x95, true, &Logic::BossKeyForestTemple, RHT_FOREST_TEMPLE_BOSS_KEY, RG_FOREST_TEMPLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY,MOD_RANDOMIZER); + itemTable[RG_FOREST_TEMPLE_BOSS_KEY].SetCustomDrawFunc(Randomizer_DrawBossKey); + itemTable[RG_FIRE_TEMPLE_BOSS_KEY] = Item(RG_FIRE_TEMPLE_BOSS_KEY, Text{ "Fire Temple Boss Key", "Clé d'Or du Temple du Feu", "Feuertempel-Boss-Schlüssel" }, ITEMTYPE_BOSSKEY, 0x96, true, &Logic::BossKeyFireTemple, RHT_FIRE_TEMPLE_BOSS_KEY, RG_FIRE_TEMPLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY,MOD_RANDOMIZER); + itemTable[RG_FIRE_TEMPLE_BOSS_KEY].SetCustomDrawFunc(Randomizer_DrawBossKey); + itemTable[RG_WATER_TEMPLE_BOSS_KEY] = Item(RG_WATER_TEMPLE_BOSS_KEY, Text{ "Water Temple Boss Key", "Clé d'Or du Temple de l'Eau", "Wassertempel-Boss-Schlüssel" }, ITEMTYPE_BOSSKEY, 0x97, true, &Logic::BossKeyWaterTemple, RHT_WATER_TEMPLE_BOSS_KEY, RG_WATER_TEMPLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY,MOD_RANDOMIZER); + itemTable[RG_WATER_TEMPLE_BOSS_KEY].SetCustomDrawFunc(Randomizer_DrawBossKey); + itemTable[RG_SPIRIT_TEMPLE_BOSS_KEY] = Item(RG_SPIRIT_TEMPLE_BOSS_KEY, Text{ "Spirit Temple Boss Key", "Clé d'Or du Temple de l'Esprit", "Geistertempel-Boss-Schlüssel" }, ITEMTYPE_BOSSKEY, 0x98, true, &Logic::BossKeySpiritTemple, RHT_SPIRIT_TEMPLE_BOSS_KEY, RG_SPIRIT_TEMPLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY,MOD_RANDOMIZER); + itemTable[RG_SPIRIT_TEMPLE_BOSS_KEY].SetCustomDrawFunc(Randomizer_DrawBossKey); + itemTable[RG_SHADOW_TEMPLE_BOSS_KEY] = Item( RG_SHADOW_TEMPLE_BOSS_KEY, Text{ "Shadow Temple Boss Key", "Clé d'Or du Temple de l'Ombre", "Schlüssel für den Boss des Schattentempels" }, ITEMTYPE_BOSSKEY, 0x99, true, &Logic::BossKeyShadowTemple, RHT_SHADOW_TEMPLE_BOSS_KEY, RG_SHADOW_TEMPLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY,MOD_RANDOMIZER); + itemTable[RG_SHADOW_TEMPLE_BOSS_KEY].SetCustomDrawFunc(Randomizer_DrawBossKey); + itemTable[RG_GANONS_CASTLE_BOSS_KEY] = Item(RG_GANONS_CASTLE_BOSS_KEY, Text{ "Ganon's Castle Boss Key", "Clé d'Or du Château de Ganon", "Ganons Schloss-Boss-Schlüssel" }, ITEMTYPE_BOSSKEY, 0x9A, true, &Logic::BossKeyGanonsCastle, RHT_GANONS_CASTLE_BOSS_KEY, RG_GANONS_CASTLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY,MOD_RANDOMIZER); + itemTable[RG_GANONS_CASTLE_BOSS_KEY].SetCustomDrawFunc(Randomizer_DrawBossKey); + itemTable[RG_FOREST_TEMPLE_SMALL_KEY] = Item(RG_FOREST_TEMPLE_SMALL_KEY, Text{ "Forest Temple Small Key", "Petite Clé du Temple de la Forêt", "Waldtempel Kleiner Schlüssel" }, ITEMTYPE_SMALLKEY, 0xAF, true, &Logic::ForestTempleKeys, RHT_FOREST_TEMPLE_SMALL_KEY,RG_FOREST_TEMPLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_FOREST_TEMPLE_SMALL_KEY].SetCustomDrawFunc(Randomizer_DrawSmallKey); + itemTable[RG_FIRE_TEMPLE_SMALL_KEY] = Item(RG_FIRE_TEMPLE_SMALL_KEY, Text{ "Fire Temple Small Key", "Petite Clé du Temple du Feu", "Feuertempel Kleiner Schlüssel" }, ITEMTYPE_SMALLKEY, 0xB0, true, &Logic::FireTempleKeys, RHT_FIRE_TEMPLE_SMALL_KEY, RG_FIRE_TEMPLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_FIRE_TEMPLE_SMALL_KEY].SetCustomDrawFunc(Randomizer_DrawSmallKey); + itemTable[RG_WATER_TEMPLE_SMALL_KEY] = Item(RG_WATER_TEMPLE_SMALL_KEY, Text{ "Water Temple Small Key", "Petite Clé du Temple de l'Eau", "Wassertempel Kleiner Schlüssel" }, ITEMTYPE_SMALLKEY, 0xB1, true, &Logic::WaterTempleKeys, RHT_WATER_TEMPLE_SMALL_KEY, RG_WATER_TEMPLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_WATER_TEMPLE_SMALL_KEY].SetCustomDrawFunc(Randomizer_DrawSmallKey); + itemTable[RG_SPIRIT_TEMPLE_SMALL_KEY] = Item(RG_SPIRIT_TEMPLE_SMALL_KEY, Text{ "Spirit Temple Small Key", "Petite Clé du Temple de l'Esprit", "Geisttempel Kleiner Schlüssel" }, ITEMTYPE_SMALLKEY, 0xB2, true, &Logic::SpiritTempleKeys, RHT_SPIRIT_TEMPLE_SMALL_KEY,RG_SPIRIT_TEMPLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_SPIRIT_TEMPLE_SMALL_KEY].SetCustomDrawFunc(Randomizer_DrawSmallKey); + itemTable[RG_SHADOW_TEMPLE_SMALL_KEY] = Item(RG_SHADOW_TEMPLE_SMALL_KEY, Text{ "Shadow Temple Small Key", "Petite Clé du Temple de l'Ombre", "Schattentempel Kleiner Schlüssel" }, ITEMTYPE_SMALLKEY, 0xB3, true, &Logic::ShadowTempleKeys, RHT_SHADOW_TEMPLE_SMALL_KEY,RG_SHADOW_TEMPLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_SHADOW_TEMPLE_SMALL_KEY].SetCustomDrawFunc(Randomizer_DrawSmallKey); + itemTable[RG_BOTTOM_OF_THE_WELL_SMALL_KEY] = Item(RG_BOTTOM_OF_THE_WELL_SMALL_KEY, Text{ "Bottom of the Well Small Key", "Petite Clé du Puits", "Boden des Brunnens Kleiner Schlüssel" }, ITEMTYPE_SMALLKEY, 0xB4, true, &Logic::BottomOfTheWellKeys, RHT_BOTTOM_OF_THE_WELL_SMALL_KEY,RG_BOTTOM_OF_THE_WELL_SMALL_KEY,OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_BOTTOM_OF_THE_WELL_SMALL_KEY].SetCustomDrawFunc(Randomizer_DrawSmallKey); + itemTable[RG_GERUDO_TRAINING_GROUNDS_SMALL_KEY] = Item(RG_GERUDO_TRAINING_GROUNDS_SMALL_KEY, Text{ "Training Grounds Small Key", "Petite Clé du Gymnase Gerudo", "Trainingsgelände Kleiner Schlüssel" }, ITEMTYPE_SMALLKEY, 0xB5, true, &Logic::GerudoTrainingGroundsKeys, RHT_GERUDO_TRAINING_GROUNDS_SMALL_KEY,RG_GERUDO_TRAINING_GROUNDS_SMALL_KEY,OBJECT_GI_KEY,GID_KEY_SMALL,TEXT_RANDOMIZER_CUSTOM_ITEM,0x80, CHEST_ANIM_SHORT,ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GERUDO_TRAINING_GROUNDS_SMALL_KEY].SetCustomDrawFunc(Randomizer_DrawSmallKey); + itemTable[RG_GERUDO_FORTRESS_SMALL_KEY] = Item(RG_GERUDO_FORTRESS_SMALL_KEY, Text{ "Gerudo Fortress Small Key", "Petite Clé du Repaire des Voleurs", "Gerudo-Festung Kleiner Schlüssel" }, ITEMTYPE_FORTRESS_SMALLKEY, 0xB6, true, &Logic::GerudoFortressKeys, RHT_GERUDO_FORTRESS_SMALL_KEY,RG_GERUDO_FORTRESS_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GERUDO_FORTRESS_SMALL_KEY].SetCustomDrawFunc(Randomizer_DrawSmallKey); + itemTable[RG_GANONS_CASTLE_SMALL_KEY] = Item(RG_GANONS_CASTLE_SMALL_KEY, Text{ "Ganon's Castle Small Key", "Petite Clé du Château de Ganon", "Ganons Schloss Kleiner Schlüssel" }, ITEMTYPE_SMALLKEY, 0xB7, true, &Logic::GanonsCastleKeys, RHT_GANONS_CASTLE_SMALL_KEY,RG_GANONS_CASTLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GANONS_CASTLE_SMALL_KEY].SetCustomDrawFunc(Randomizer_DrawSmallKey); + itemTable[RG_TREASURE_GAME_SMALL_KEY] = Item(RG_TREASURE_GAME_SMALL_KEY, Text{ "Chest Game Small Key", "Petite Clé du jeu la Chasse-aux-Trésors", "Truhenspiel Kleiner Schlüssel" }, ITEMTYPE_SMALLKEY, 0xDE, true, &Logic::TreasureGameKeys, RHT_TREASURE_GAME_SMALL_KEY,RG_TREASURE_GAME_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + // Key Rings + itemTable[RG_FOREST_TEMPLE_KEY_RING] = Item(RG_FOREST_TEMPLE_KEY_RING, Text{ "Forest Temple Key Ring", "Trousseau du Temple de la Forêt", "Waldtempel Schlüsselanhänger" }, ITEMTYPE_SMALLKEY, 0xD5, true, &Logic::ForestTempleKeys, RHT_FOREST_TEMPLE_KEY_RING, RG_FOREST_TEMPLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_FOREST_TEMPLE_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); + itemTable[RG_FIRE_TEMPLE_KEY_RING] = Item(RG_FIRE_TEMPLE_KEY_RING, Text{ "Fire Temple Key Ring", "Trousseau du Temple du Feu", "Feuertempel Schlüsselanhänger" }, ITEMTYPE_SMALLKEY, 0xD6, true, &Logic::FireTempleKeys, RHT_FIRE_TEMPLE_KEY_RING, RG_FIRE_TEMPLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_FIRE_TEMPLE_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); + itemTable[RG_WATER_TEMPLE_KEY_RING] = Item(RG_WATER_TEMPLE_KEY_RING, Text{ "Water Temple Key Ring", "Trousseau du Temple de l'Eau", "Wassertempel Schlüsselanhänger" }, ITEMTYPE_SMALLKEY, 0xD7, true, &Logic::WaterTempleKeys, RHT_WATER_TEMPLE_KEY_RING, RG_WATER_TEMPLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_WATER_TEMPLE_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); + itemTable[RG_SPIRIT_TEMPLE_KEY_RING] = Item(RG_SPIRIT_TEMPLE_KEY_RING, Text{ "Spirit Temple Key Ring", "Trousseau du Temple de l'Esprit", "Geisttempel Schlüsselanhänger" }, ITEMTYPE_SMALLKEY, 0xD8, true, &Logic::SpiritTempleKeys, RHT_SPIRIT_TEMPLE_KEY_RING, RG_SPIRIT_TEMPLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_SPIRIT_TEMPLE_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); + itemTable[RG_SHADOW_TEMPLE_KEY_RING] = Item(RG_SHADOW_TEMPLE_KEY_RING, Text{ "Shadow Temple Key Ring", "Trousseau du Temple de l'Ombre", "Schattentempel Schlüsselanhänger" }, ITEMTYPE_SMALLKEY, 0xD9, true, &Logic::ShadowTempleKeys, RHT_SHADOW_TEMPLE_KEY_RING, RG_SHADOW_TEMPLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_SHADOW_TEMPLE_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); + itemTable[RG_BOTTOM_OF_THE_WELL_KEY_RING] = Item(RG_BOTTOM_OF_THE_WELL_KEY_RING, Text{ "Bottom of the Well Key Ring", "Trousseau du Puits", "Boden des Brunnens Schlüsselanhänger" }, ITEMTYPE_SMALLKEY, 0xDA, true, &Logic::BottomOfTheWellKeys, RHT_BOTTOM_OF_THE_WELL_KEY_RING,RG_BOTTOM_OF_THE_WELL_KEY_RING,OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_BOTTOM_OF_THE_WELL_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); + itemTable[RG_GERUDO_TRAINING_GROUNDS_KEY_RING] = Item(RG_GERUDO_TRAINING_GROUNDS_KEY_RING, Text{ "Training Grounds Key Ring", "Trousseau du Gymnase Gerudo", "Trainingsgelände Schlüsselanhänger" }, ITEMTYPE_SMALLKEY, 0xDB, true, &Logic::GerudoTrainingGroundsKeys, RHT_GERUDO_TRAINING_GROUNDS_KEY_RING,RG_GERUDO_TRAINING_GROUNDS_KEY_RING,OBJECT_GI_KEY,GID_KEY_SMALL,TEXT_RANDOMIZER_CUSTOM_ITEM,0x80, CHEST_ANIM_SHORT,ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GERUDO_TRAINING_GROUNDS_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); + itemTable[RG_GERUDO_FORTRESS_KEY_RING] = Item(RG_GERUDO_FORTRESS_KEY_RING, Text{ "Gerudo Fortress Key Ring", "Trousseau du Repaire des Voleurs", "Gerudo Festung Schlüsselanhänger" }, ITEMTYPE_FORTRESS_SMALLKEY, 0xDC, true, &Logic::GerudoFortressKeys, RHT_GERUDO_FORTRESS_KEY_RING,RG_GERUDO_FORTRESS_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GERUDO_FORTRESS_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); + itemTable[RG_GANONS_CASTLE_KEY_RING] = Item(RG_GANONS_CASTLE_KEY_RING, Text{ "Ganon's Castle Key Ring", "Trousseau du Château de Ganon", "Ganons Schloss Schlüsselanhänger" }, ITEMTYPE_SMALLKEY, 0xDD, true, &Logic::GanonsCastleKeys, RHT_GANONS_CASTLE_KEY_RING, RG_GANONS_CASTLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GANONS_CASTLE_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); + // Dungeon Rewards + itemTable[RG_KOKIRI_EMERALD] = Item(RG_KOKIRI_EMERALD, Text{ "Kokiri's Emerald", "Émeraude Kokiri", "Kokiri-Smaragd" }, ITEMTYPE_DUNGEONREWARD, 0xCB, true, &Logic::KokiriEmerald, RHT_KOKIRI_EMERALD, ITEM_KOKIRI_EMERALD, OBJECT_GI_JEWEL, GID_KOKIRI_EMERALD, 0x80, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_GORON_RUBY] = Item(RG_GORON_RUBY, Text{ "Goron's Ruby", "Rubis Goron", "Goronen-Rubin" }, ITEMTYPE_DUNGEONREWARD, 0xCC, true, &Logic::GoronRuby, RHT_GORON_RUBY, ITEM_GORON_RUBY, OBJECT_GI_JEWEL, GID_GORON_RUBY, 0x81, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_ZORA_SAPPHIRE] = Item(RG_ZORA_SAPPHIRE, Text{ "Zora's Sapphire", "Saphir Zora", "Zora-Saphir" }, ITEMTYPE_DUNGEONREWARD, 0xCD, true, &Logic::ZoraSapphire, RHT_ZORA_SAPPHIRE, ITEM_ZORA_SAPPHIRE, OBJECT_GI_JEWEL, GID_ZORA_SAPPHIRE, 0x82, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_FOREST_MEDALLION] = Item(RG_FOREST_MEDALLION, Text{ "Forest Medallion", "Médaillon de la Forêt", "Wald Medaillon" }, ITEMTYPE_DUNGEONREWARD, 0xCE, true, &Logic::ForestMedallion, RHT_FOREST_MEDALLION, ITEM_MEDALLION_FOREST, OBJECT_GI_MEDAL, GID_MEDALLION_FOREST,0x3E, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_FIRE_MEDALLION] = Item(RG_FIRE_MEDALLION, Text{ "Fire Medallion", "Médaillon du Feu", "Feuer Medaillon" }, ITEMTYPE_DUNGEONREWARD, 0xCF, true, &Logic::FireMedallion, RHT_FIRE_MEDALLION, ITEM_MEDALLION_FIRE, OBJECT_GI_MEDAL, GID_MEDALLION_FIRE, 0x3C, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_WATER_MEDALLION] = Item(RG_WATER_MEDALLION, Text{ "Water Medallion", "Médaillon de l'Eau", "Wasser Medaillon" }, ITEMTYPE_DUNGEONREWARD, 0xD0, true, &Logic::WaterMedallion, RHT_WATER_MEDALLION, ITEM_MEDALLION_WATER, OBJECT_GI_MEDAL, GID_MEDALLION_WATER,0x3D, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_SPIRIT_MEDALLION] = Item(RG_SPIRIT_MEDALLION, Text{ "Spirit Medallion", "Médaillon de l'Esprit", "Geist Medaillon" }, ITEMTYPE_DUNGEONREWARD, 0xD1, true, &Logic::SpiritMedallion, RHT_SPIRIT_MEDALLION, ITEM_MEDALLION_SPIRIT, OBJECT_GI_MEDAL, GID_MEDALLION_SPIRIT,0x3F, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_SHADOW_MEDALLION] = Item(RG_SHADOW_MEDALLION, Text{ "Shadow Medallion", "Médaillon de l'Ombre", "Schatten Medaillon" }, ITEMTYPE_DUNGEONREWARD, 0xD2, true, &Logic::ShadowMedallion, RHT_SHADOW_MEDALLION, ITEM_MEDALLION_SHADOW, OBJECT_GI_MEDAL, GID_MEDALLION_SHADOW,0x41, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_LIGHT_MEDALLION] = Item(RG_LIGHT_MEDALLION, Text{ "Light Medallion", "Médaillon de la Lumière", "Licht Medaillon" }, ITEMTYPE_DUNGEONREWARD, 0xD3, true, &Logic::LightMedallion, RHT_LIGHT_MEDALLION, ITEM_MEDALLION_LIGHT, OBJECT_GI_MEDAL, GID_MEDALLION_LIGHT,0x40, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + // Generic Items + itemTable[RG_RECOVERY_HEART] = Item(RG_RECOVERY_HEART, Text{ "Recovery Heart", "Coeur de Vie", "Herz" }, ITEMTYPE_ITEM, GI_HEART, false, &Logic::noVariable, RHT_RECOVERY_HEART, ITEM_HEART, OBJECT_GI_HEART, GID_HEART, 0x55, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE); + itemTable[RG_GREEN_RUPEE] = Item(RG_GREEN_RUPEE, Text{ "Green Rupee", "Rubis Vert", "Grüne Rupie" }, ITEMTYPE_ITEM, GI_RUPEE_GREEN, false, &Logic::noVariable, RHT_GREEN_RUPEE, ITEM_RUPEE_GREEN, OBJECT_GI_RUPY, GID_RUPEE_GREEN, 0x6F, 0x00, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); + itemTable[RG_GREG_RUPEE] = Item(RG_GREG_RUPEE, Text{ "Greg the Green Rupee", "Rubis Greg", "Greg Rupie" }, ITEMTYPE_ITEM, GI_RUPEE_GREEN, true, &Logic::Greg, RHT_GREG_RUPEE, RG_GREG_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GREEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_BLUE_RUPEE] = Item(RG_BLUE_RUPEE, Text{ "Blue Rupee", "Rubis Bleu", "Blaue Rupie" }, ITEMTYPE_ITEM, GI_RUPEE_BLUE, false, &Logic::noVariable, RHT_BLUE_RUPEE, ITEM_RUPEE_BLUE, OBJECT_GI_RUPY, GID_RUPEE_BLUE, 0xCC, 0x01, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); + itemTable[RG_RED_RUPEE] = Item(RG_RED_RUPEE, Text{ "Red Rupee", "Rubis Rouge", "Rote Rupie" }, ITEMTYPE_ITEM, GI_RUPEE_RED, false, &Logic::noVariable, RHT_RED_RUPEE, ITEM_RUPEE_RED, OBJECT_GI_RUPY, GID_RUPEE_RED, 0xF0, 0x02, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); + itemTable[RG_PURPLE_RUPEE] = Item(RG_PURPLE_RUPEE, Text{ "Purple Rupee", "Rubis Pourpre", "Lila Rupie" }, ITEMTYPE_ITEM, GI_RUPEE_PURPLE, false, &Logic::noVariable, RHT_PURPLE_RUPEE, ITEM_RUPEE_PURPLE, OBJECT_GI_RUPY, GID_RUPEE_PURPLE, 0xF1, 0x14, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); + itemTable[RG_HUGE_RUPEE] = Item(RG_HUGE_RUPEE, Text{ "Huge Rupee", "Énorme Rubis", "Riesige Rupie" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, false, &Logic::noVariable, RHT_HUGE_RUPEE, ITEM_RUPEE_GOLD, OBJECT_GI_RUPY, GID_RUPEE_GOLD, 0xF2, 0x13, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE); + itemTable[RG_PIECE_OF_HEART] = Item(RG_PIECE_OF_HEART, Text{ "Piece of Heart", "Quart de Coeur", "Herzstück" }, ITEMTYPE_ITEM, GI_HEART_PIECE, true, &Logic::PieceOfHeart, RHT_PIECE_OF_HEART, ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xC2, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); + itemTable[RG_HEART_CONTAINER] = Item(RG_HEART_CONTAINER, Text{ "Heart Container", "Réceptacle de Coeur", "Herz-Container" }, ITEMTYPE_ITEM, GI_HEART_CONTAINER_2,true, &Logic::HeartContainer, RHT_HEART_CONTAINER, ITEM_HEART_CONTAINER, OBJECT_GI_HEARTS, GID_HEART_CONTAINER,0xC6, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); + itemTable[RG_ICE_TRAP] = Item(RG_ICE_TRAP, Text{ "Ice Trap", "Piège de Glace", "Eisfalle" }, ITEMTYPE_ITEM, RG_ICE_TRAP, false, &Logic::noVariable, RHT_ICE_TRAP, RG_ICE_TRAP, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_MILK] = Item(RG_MILK, Text{ "Milk", "Lait", "Milch" }, ITEMTYPE_ITEM, GI_MILK, false, &Logic::noVariable, RHT_NONE, ITEM_MILK, OBJECT_GI_MILK, GID_MILK, 0x98, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE); + // Refills + itemTable[RG_BOMBS_5] = Item(RG_BOMBS_5, Text{ "Bombs (5)", "Bombes (5)", "Bomben (5)" }, ITEMTYPE_REFILL, GI_BOMBS_5, false, &Logic::noVariable, RHT_BOMBS_5, ITEM_BOMBS_5, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); + itemTable[RG_BOMBS_10] = Item(RG_BOMBS_10, Text{ "Bombs (10)", "Bombes (10)", "Bomben (10)" }, ITEMTYPE_REFILL, GI_BOMBS_10, false, &Logic::noVariable, RHT_BOMBS_10, ITEM_BOMBS_10, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); + itemTable[RG_BOMBS_20] = Item(RG_BOMBS_20, Text{ "Bombs (20)", "Bombes (20)", "Bomben (20)" }, ITEMTYPE_REFILL, GI_BOMBS_20, false, &Logic::noVariable, RHT_BOMBS_20, ITEM_BOMBS_20, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); + itemTable[RG_BOMBCHU_5] = Item(RG_BOMBCHU_5, Text{ "Bombchus (5)", "Missiles (5)", "Bombchus (5)" }, ITEMTYPE_REFILL, GI_BOMBCHUS_5, true, &Logic::Bombchus5, RHT_BOMBCHU_5, ITEM_BOMBCHUS_5, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); + itemTable[RG_BOMBCHU_10] = Item(RG_BOMBCHU_10, Text{ "Bombchus (10)", "Missiles (10)", "Bombchus (10)" }, ITEMTYPE_REFILL, GI_BOMBCHUS_10, true, &Logic::Bombchus10, RHT_BOMBCHU_10, ITEM_BOMBCHU, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); + itemTable[RG_BOMBCHU_20] = Item(RG_BOMBCHU_20, Text{ "Bombchus (20)", "Missiles (20)", "Bombchus (20)" }, ITEMTYPE_REFILL, GI_BOMBCHUS_20, true, &Logic::Bombchus20, RHT_BOMBCHU_20, ITEM_BOMBCHUS_20, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); + itemTable[RG_BOMBCHU_DROP] = Item(RG_BOMBCHU_DROP, Text{ "Bombchu Drop", "Drop Missiles", "Bombchus" }, ITEMTYPE_DROP, GI_BOMBCHUS_10, true, &Logic::BombchuDrop, RHT_NONE, ITEM_BOMBCHU, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); + itemTable[RG_ARROWS_5] = Item(RG_ARROWS_5, Text{ "Arrows (5)", "Flèches (5)", "Pfeile (5)" }, ITEMTYPE_REFILL, GI_ARROWS_SMALL, false, &Logic::noVariable, RHT_ARROWS_5, ITEM_ARROWS_SMALL, OBJECT_GI_ARROW, GID_ARROWS_SMALL, 0xE6, 0x48, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); + itemTable[RG_ARROWS_10] = Item(RG_ARROWS_10, Text{ "Arrows (10)", "Flèches (10)", "Pfeile (10)" }, ITEMTYPE_REFILL, GI_ARROWS_MEDIUM, false, &Logic::noVariable, RHT_ARROWS_10, ITEM_ARROWS_MEDIUM, OBJECT_GI_ARROW, GID_ARROWS_MEDIUM, 0xE6, 0x49, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); + itemTable[RG_ARROWS_30] = Item(RG_ARROWS_30, Text{ "Arrows (30)", "Flèches (30)", "Pfeile (30)" }, ITEMTYPE_REFILL, GI_ARROWS_LARGE, false, &Logic::noVariable, RHT_ARROWS_30, ITEM_ARROWS_LARGE, OBJECT_GI_ARROW, GID_ARROWS_LARGE, 0xE6, 0x4A, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); + itemTable[RG_DEKU_NUTS_5] = Item(RG_DEKU_NUTS_5, Text{ "Deku Nuts (5)", "Noix Mojo (5)", "Deku-Nüsse (5)" }, ITEMTYPE_REFILL, GI_NUTS_5, false, &Logic::noVariable, RHT_DEKU_NUTS_5, ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); + itemTable[RG_DEKU_NUTS_10] = Item(RG_DEKU_NUTS_10, Text{ "Deku Nuts (10)", "Noix Mojo (10)", "Deku-Nüsse (10)" }, ITEMTYPE_REFILL, GI_NUTS_10, false, &Logic::noVariable, RHT_DEKU_NUTS_10, ITEM_NUTS_10, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); + itemTable[RG_DEKU_SEEDS_30] = Item(RG_DEKU_SEEDS_30, Text{ "Deku Seeds (30)", "Graines Mojo (30)", "Deku-Samen (30)" }, ITEMTYPE_REFILL, GI_SEEDS_30, false, &Logic::noVariable, RHT_DEKU_SEEDS_30, ITEM_SEEDS_30, OBJECT_GI_SEED, GID_SEEDS, 0xDC, 0x50, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); + itemTable[RG_DEKU_STICK_1] = Item(RG_DEKU_STICK_1, Text{ "Deku Stick (1)", "Bâton Mojo (1)", "Deku-Stick (1)" }, ITEMTYPE_REFILL, GI_STICKS_1, false, &Logic::noVariable, RHT_DEKU_STICK_1, ITEM_STICK, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); + itemTable[RG_RED_POTION_REFILL] = Item(RG_RED_POTION_REFILL, Text{ "Red Potion Refill", "Recharge de Potion Rouge", "Rotes Elixier Nachfüllpackung" }, ITEMTYPE_REFILL, GI_POTION_RED, false, &Logic::noVariable, RHT_NONE, ITEM_POTION_RED, OBJECT_GI_LIQUID, GID_POTION_RED, 0x43, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE); + itemTable[RG_GREEN_POTION_REFILL] = Item(RG_GREEN_POTION_REFILL, Text{ "Green Potion Refill", "Recharge de Potion Verte", "Grünes Elixier Nachfüllpackung" }, ITEMTYPE_REFILL, GI_POTION_GREEN, false, &Logic::noVariable, RHT_NONE, ITEM_POTION_GREEN, OBJECT_GI_LIQUID, GID_POTION_GREEN, 0x44, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE); + itemTable[RG_BLUE_POTION_REFILL] = Item(RG_BLUE_POTION_REFILL, Text{ "Blue Potion Refill", "Recharge de Potion Bleue", "Blaues Elixier Nachfüllpackung" }, ITEMTYPE_REFILL, GI_POTION_BLUE, false, &Logic::noVariable, RHT_NONE, ITEM_POTION_BLUE, OBJECT_GI_LIQUID, GID_POTION_BLUE, 0x45, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE); + // Treasure Game + itemTable[RG_TREASURE_GAME_HEART] = Item(RG_TREASURE_GAME_HEART, Text{ "Piece of Heart (WINNER)", "Quart de Coeur (Chasse-aux-Trésors)", "Herzstück (Schatztruhen-Minispiel)" }, ITEMTYPE_ITEM, GI_HEART_PIECE_WIN, true, &Logic::PieceOfHeart, RHT_TREASURE_GAME_HEART, ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xFA, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); + itemTable[RG_TREASURE_GAME_GREEN_RUPEE] = Item(RG_TREASURE_GAME_GREEN_RUPEE, Text{ "Green Rupee (LOSER)", "Rubis Vert (Chasse-aux-Trésors)", "Grüne Rupie (Schatztruhe-Minispiel)" }, ITEMTYPE_ITEM, GI_RUPEE_GREEN_LOSE,false, &Logic::noVariable, RHT_TREASURE_GAME_GREEN_RUPEE,ITEM_RUPEE_GREEN, OBJECT_GI_RUPY, GID_RUPEE_GREEN, 0xF4, 0x00, CHEST_ANIM_SHORT, ITEM_CATEGORY_MAJOR, MOD_NONE); + // Shop + itemTable[RG_BUY_DEKU_NUT_5] = Item(RG_BUY_DEKU_NUT_5, Text{ "Buy Deku Nut (5)", "Acheter: Noix Mojo (5)", "Deku-Nuss kaufen (5)" }, ITEMTYPE_SHOP, GI_NUTS_5_2, true, &Logic::Nuts, RHT_DEKU_NUTS_5, ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 15); + itemTable[RG_BUY_ARROWS_30] = Item(RG_BUY_ARROWS_30, Text{ "Buy Arrows (30)", "Acheter: Flèches (30)", "Pfeile kaufen (30)" }, ITEMTYPE_SHOP, GI_ARROWS_MEDIUM, true, &Logic::BuyArrow, RHT_ARROWS_30, ITEM_ARROWS_MEDIUM, OBJECT_GI_ARROW, GID_ARROWS_MEDIUM, 0xE6, 0x49, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 60); + itemTable[RG_BUY_ARROWS_50] = Item(RG_BUY_ARROWS_50, Text{ "Buy Arrows (50)", "Acheter: Flèches (50)", "Pfeile kaufen (50)" }, ITEMTYPE_SHOP, GI_ARROWS_LARGE, true, &Logic::BuyArrow, RHT_ARROWS_30, ITEM_ARROWS_LARGE, OBJECT_GI_ARROW, GID_ARROWS_LARGE, 0xE6, 0x4A, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 90); + itemTable[RG_BUY_BOMBS_525] = Item(RG_BUY_BOMBS_525, Text{ "Buy Bombs (5) [25]", "Acheter: Bombes (5) [25]", "Bomben kaufen (5) [25]" }, ITEMTYPE_SHOP, GI_BOMBS_5, true, &Logic::BuyBomb, RHT_BOMBS_5, ITEM_BOMBS_5, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 25); + itemTable[RG_BUY_DEKU_NUT_10] = Item(RG_BUY_DEKU_NUT_10, Text{ "Buy Deku Nut (10)", "Acheter: Noix Mojo (10)", "Deku-Nuss kaufen (10)" }, ITEMTYPE_SHOP, GI_NUTS_10, true, &Logic::Nuts, RHT_DEKU_NUTS_10, ITEM_NUTS_10, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 30); + itemTable[RG_BUY_DEKU_STICK_1] = Item(RG_BUY_DEKU_STICK_1, Text{ "Buy Deku Stick (1)", "Acheter: Bâton Mojo (1)", "Deku-Stick kaufen (1)" }, ITEMTYPE_SHOP, GI_STICKS_1, true, &Logic::Sticks, RHT_DEKU_STICK_1, ITEM_STICK, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 10); + itemTable[RG_BUY_BOMBS_10] = Item(RG_BUY_BOMBS_10, Text{ "Buy Bombs (10)", "Acheter: Bombes (10)", "Bomben kaufen (10)" }, ITEMTYPE_SHOP, GI_BOMBS_10, true, &Logic::BuyBomb, RHT_BOMBS_10, ITEM_BOMBS_10, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 50); + itemTable[RG_BUY_FISH] = Item(RG_BUY_FISH, Text{ "Buy Fish", "Acheter: Poisson", "Fisch kaufen" }, ITEMTYPE_SHOP, GI_FISH, true, &Logic::FishAccess, RHT_BOTTLE_WITH_FISH, ITEM_FISH, OBJECT_GI_FISH, GID_FISH, 0x47, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 200); + itemTable[RG_BUY_RED_POTION_30] = Item(RG_BUY_RED_POTION_30, Text{ "Buy Red Potion [30]", "Acheter: Potion Rouge [30]", "Rotes Elixier kaufen [30]" }, ITEMTYPE_SHOP, GI_POTION_RED, false, &Logic::noVariable, RHT_BOTTLE_WITH_RED_POTION, ITEM_POTION_RED, OBJECT_GI_LIQUID, GID_POTION_RED, 0x43, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 30); + itemTable[RG_BUY_GREEN_POTION] = Item(RG_BUY_GREEN_POTION, Text{ "Buy Green Potion", "Acheter: Potion Verte", "Grünes Elixier kaufen" }, ITEMTYPE_SHOP, GI_POTION_GREEN, true, &Logic::BuyGPotion, RHT_BOTTLE_WITH_GREEN_POTION,ITEM_POTION_GREEN, OBJECT_GI_LIQUID, GID_POTION_GREEN, 0x44, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 30); + itemTable[RG_BUY_BLUE_POTION] = Item(RG_BUY_BLUE_POTION, Text{ "Buy Blue Potion", "Acheter: Potion Bleue", "Blaues Elixier kaufen" }, ITEMTYPE_SHOP, GI_POTION_BLUE, true, &Logic::BuyBPotion, RHT_BOTTLE_WITH_BLUE_POTION,ITEM_POTION_BLUE, OBJECT_GI_LIQUID, GID_POTION_BLUE, 0x45, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 100); + itemTable[RG_BUY_HYLIAN_SHIELD] = Item(RG_BUY_HYLIAN_SHIELD, Text{ "Buy Hylian Shield", "Acheter: Bouclier Hylien", "Hylianischer Schild kaufen" }, ITEMTYPE_SHOP, GI_SHIELD_HYLIAN, true, &Logic::HylianShield, RHT_HYLIAN_SHIELD, ITEM_SHIELD_HYLIAN, OBJECT_GI_SHIELD_2, GID_SHIELD_HYLIAN, 0x4D, 0xA0, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE, false, 80); + itemTable[RG_BUY_DEKU_SHIELD] = Item(RG_BUY_DEKU_SHIELD, Text{ "Buy Deku Shield", "Acheter: Bouclier Mojo", "Deku-Schild kaufen" }, ITEMTYPE_SHOP, GI_SHIELD_DEKU, true, &Logic::DekuShield, RHT_DEKU_SHIELD, ITEM_SHIELD_DEKU, OBJECT_GI_SHIELD_1, GID_SHIELD_DEKU, 0x4C, 0xA0, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE, false, 40); + itemTable[RG_BUY_GORON_TUNIC] = Item(RG_BUY_GORON_TUNIC, Text{ "Buy Goron Tunic", "Acheter: Tunique Goron", "Goronen-Tunika kaufen" }, ITEMTYPE_SHOP, GI_TUNIC_GORON, true, &Logic::GoronTunic, RHT_GORON_TUNIC, ITEM_TUNIC_GORON, OBJECT_GI_CLOTHES, GID_TUNIC_GORON, 0x50, 0xA0, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE, false, 200); + itemTable[RG_BUY_ZORA_TUNIC] = Item(RG_BUY_ZORA_TUNIC, Text{ "Buy Zora Tunic", "Acheter: Tunique Zora", "Zora-Tunika kaufen" }, ITEMTYPE_SHOP, GI_TUNIC_ZORA, true, &Logic::ZoraTunic, RHT_ZORA_TUNIC, ITEM_TUNIC_ZORA, OBJECT_GI_CLOTHES, GID_TUNIC_ZORA, 0x51, 0xA0, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE, false, 300); + itemTable[RG_BUY_HEART] = Item(RG_BUY_HEART, Text{ "Buy Heart", "Acheter: Coeur de Vie", "Herz kaufen" }, ITEMTYPE_SHOP, GI_HEART, false, &Logic::noVariable, RHT_RECOVERY_HEART, ITEM_HEART, OBJECT_GI_HEART, GID_HEART, 0x55, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 10); + itemTable[RG_BUY_BOMBCHU_10] = Item(RG_BUY_BOMBCHU_10, Text{ "Buy Bombchu (10)", "Acheter: Missiles (10)", "Bomchu kaufen (10)" }, ITEMTYPE_SHOP, GI_BOMBCHUS_10, true, &Logic::BuyBombchus10, RHT_BOMBCHU_10, ITEM_BOMBCHU, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 99); + itemTable[RG_BUY_BOMBCHU_20] = Item(RG_BUY_BOMBCHU_20, Text{ "Buy Bombchu (20)", "Acheter: Missiles (20)", "Bomchu kaufen (20)" }, ITEMTYPE_SHOP, GI_BOMBCHUS_20, true, &Logic::BuyBombchus20, RHT_BOMBCHU_20, ITEM_BOMBCHUS_20, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 180); + itemTable[RG_BUY_DEKU_SEEDS_30] = Item(RG_BUY_DEKU_SEEDS_30, Text{ "Buy Deku Seeds (30)", "Acheter: Graines Mojo (30)", "Deku-Samen kaufen (30)" }, ITEMTYPE_SHOP, GI_SEEDS_30, true, &Logic::BuySeed, RHT_DEKU_SEEDS_30, ITEM_SEEDS_30, OBJECT_GI_SEED, GID_SEEDS, 0xDC, 0x50, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 30); + itemTable[RG_SOLD_OUT] = Item(RG_SOLD_OUT, Text{ "Sold Out", "Rupture de stock", "Ausverkauft" }, ITEMTYPE_SHOP, RG_SOLD_OUT, false, &Logic::noVariable, RHT_NONE, false, 0); + itemTable[RG_BUY_BLUE_FIRE] = Item(RG_BUY_BLUE_FIRE, Text{ "Buy Blue Fire", "Acheter: Flamme Bleue", "Blaues Feuer kaufen" }, ITEMTYPE_SHOP, GI_BLUE_FIRE, true, &Logic::BlueFireAccess, RHT_BOTTLE_WITH_BLUE_FIRE, ITEM_BLUE_FIRE, OBJECT_GI_FIRE, GID_BLUE_FIRE, 0x5D, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 300); + itemTable[RG_BUY_BOTTLE_BUG] = Item(RG_BUY_BOTTLE_BUG, Text{ "Buy Bottle Bug", "Acheter: Insecte en bouteille", "Flaschenkäfer kaufen" }, ITEMTYPE_SHOP, GI_BUGS, true, &Logic::BugsAccess, RHT_BOTTLE_WITH_BUGS, ITEM_BUG, OBJECT_GI_INSECT, GID_BUG, 0x7A, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 50); + itemTable[RG_BUY_POE] = Item(RG_BUY_POE, Text{ "Buy Poe", "Acheter: Esprit", "Geist kaufen" }, ITEMTYPE_SHOP, RG_BUY_POE, false, &Logic::noVariable, RHT_BOTTLE_WITH_BIG_POE, ITEM_POE, OBJECT_GI_GHOST, GID_POE, 0x97, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 30); + itemTable[RG_BUY_FAIRYS_SPIRIT] = Item(RG_BUY_FAIRYS_SPIRIT, Text{ "Buy Fairy's Spirit", "Acheter: Esprit de Fée", "Feengeist kaufen" }, ITEMTYPE_SHOP, GI_FAIRY, true, &Logic::FairyAccess, RHT_BOTTLE_WITH_FAIRY, ITEM_FAIRY, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x46, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 50); + itemTable[RG_BUY_ARROWS_10] = Item(RG_BUY_ARROWS_10, Text{ "Buy Arrows (10)", "Acheter: Flèches (10)", "Pfeile kaufen (10)" }, ITEMTYPE_SHOP, GI_ARROWS_SMALL, true, &Logic::BuyArrow, RHT_ARROWS_10, ITEM_ARROWS_SMALL, OBJECT_GI_ARROW, GID_ARROWS_SMALL, 0xE6, 0x48, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 20); + itemTable[RG_BUY_BOMBS_20] = Item(RG_BUY_BOMBS_20, Text{ "Buy Bombs (20)", "Acheter: Bombes (20)", "Bomben kaufen (20)" }, ITEMTYPE_SHOP, GI_BOMBS_20, true, &Logic::BuyBomb, RHT_BOMBS_20, ITEM_BOMBS_20, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 80); + itemTable[RG_BUY_BOMBS_30] = Item(RG_BUY_BOMBS_30, Text{ "Buy Bombs (30)", "Acheter: Bombes (30)", "Bomben kaufen (30)" }, ITEMTYPE_SHOP, GI_BOMBS_30, true, &Logic::BuyBomb, RHT_BOMBS_20, ITEM_BOMBS_30, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 120); + itemTable[RG_BUY_BOMBS_535] = Item(RG_BUY_BOMBS_535, Text{ "Buy Bombs (5) [35]", "Acheter: Bombes (5) [35]", "Bomben kaufen (5) [35]" }, ITEMTYPE_SHOP, GI_BOMBS_5, true, &Logic::BuyBomb, RHT_BOMBS_5, ITEM_BOMBS_5, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 35); + itemTable[RG_BUY_RED_POTION_40] = Item(RG_BUY_RED_POTION_40, Text{ "Buy Red Potion [40]", "Acheter: Potion Rouge [40]", "Rotes Elixier kaufen [40]" }, ITEMTYPE_SHOP, GI_POTION_RED, false, &Logic::noVariable, RHT_BOTTLE_WITH_RED_POTION, ITEM_POTION_RED, OBJECT_GI_LIQUID, GID_POTION_RED, 0x43, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 40); + itemTable[RG_BUY_RED_POTION_50] = Item(RG_BUY_RED_POTION_50, Text{ "Buy Red Potion [50]", "Acheter: Potion Rouge [50]", "Rotes Elixier kaufen [50]" }, ITEMTYPE_SHOP, GI_POTION_RED, false, &Logic::noVariable, RHT_BOTTLE_WITH_RED_POTION, ITEM_POTION_RED, OBJECT_GI_LIQUID, GID_POTION_RED, 0x43, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 50); + // Misc. + 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); + // 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); + itemTable[RG_FAIRY_OCARINA] = Item(RG_FAIRY_OCARINA, Text{ "Fairy Ocarina", "Ocarina des fées", "Feen-Okarina" }, ITEMTYPE_ITEM, GI_OCARINA_FAIRY, true, &Logic::ProgressiveOcarina, RHT_FAIRY_OCARINA, ITEM_OCARINA_FAIRY, OBJECT_GI_OCARINA_0, GID_OCARINA_FAIRY, 0x4A, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_OCARINA_OF_TIME] = Item(RG_OCARINA_OF_TIME, Text{ "Ocarina of Time", "Ocarina du Temps", "Okarina der Zeit" }, ITEMTYPE_ITEM, GI_OCARINA_OOT, true, &Logic::ProgressiveOcarina, RHT_OCARINA_OF_TIME, ITEM_OCARINA_TIME, OBJECT_GI_OCARINA, GID_OCARINA_TIME, 0x3A, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_BOMB_BAG] = Item(RG_BOMB_BAG, Text{ "Bomb Bag", "Sac de Bombes", "Bombentasche" }, ITEMTYPE_ITEM, GI_BOMB_BAG_20, true, &Logic::ProgressiveBombBag, RHT_BOMB_BAG, ITEM_BOMB_BAG_20, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_20, 0x58, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_BIG_BOMB_BAG] = Item(RG_BIG_BOMB_BAG, Text{ "Big Bomb Bag", "Grand Sac de Bombes", "Große Bombentasche" }, ITEMTYPE_ITEM, GI_BOMB_BAG_30, true, &Logic::ProgressiveBombBag, RHT_BIG_BOMB_BAG, ITEM_BOMB_BAG_30, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_30, 0x59, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); + itemTable[RG_BIGGEST_BOMB_BAG] = Item(RG_BIGGEST_BOMB_BAG, Text{ "Biggest Bomb Bag", "Énorme Sac de Bombes", "Größte Bombentasche" }, ITEMTYPE_ITEM, GI_BOMB_BAG_40, true, &Logic::ProgressiveBombBag, RHT_BIGGEST_BOMB_BAG, ITEM_BOMB_BAG_40, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_40, 0x5A, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); + itemTable[RG_FAIRY_BOW] = Item(RG_FAIRY_BOW, Text{ "Fairy Bow", "Arc des Fées", "Feen-Bogen" }, ITEMTYPE_ITEM, GI_BOW, true, &Logic::ProgressiveBow, RHT_FAIRY_BOW, ITEM_BOW, OBJECT_GI_BOW, GID_BOW, 0x31, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_BIG_QUIVER] = Item(RG_BIG_QUIVER, Text{ "Big Quiver", "Grand carquois", "Großer Köcher" }, ITEMTYPE_ITEM, GI_QUIVER_40, true, &Logic::ProgressiveBow, RHT_BIG_QUIVER, ITEM_QUIVER_40, OBJECT_GI_ARROWCASE, GID_QUIVER_40, 0x56, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); + itemTable[RG_BIGGEST_QUIVER] = Item(RG_BIGGEST_QUIVER, Text{ "Biggest Quiver", "Énorme carquois", "Größter Köcher" }, ITEMTYPE_ITEM, GI_QUIVER_50, true, &Logic::ProgressiveBow, RHT_BIGGEST_QUIVER, ITEM_QUIVER_50, OBJECT_GI_ARROWCASE, GID_QUIVER_50, 0x57, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); + itemTable[RG_FAIRY_SLINGSHOT] = Item(RG_FAIRY_SLINGSHOT, Text{ "Fairy Slingshot", "Lance-Pierre des Fées", "Feen-Schleuder" }, ITEMTYPE_ITEM, GI_SLINGSHOT, true, &Logic::ProgressiveBulletBag,RHT_FAIRY_SLINGSHOT, ITEM_SLINGSHOT, OBJECT_GI_PACHINKO, GID_SLINGSHOT, 0x30, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_BIG_BULLET_BAG] = Item(RG_BIG_BULLET_BAG, Text{ "Big Deku Seed Bullet Bag", "Grand sac de graines mojo", "Großer Deku-Samenkugelsack" }, ITEMTYPE_ITEM, GI_BULLET_BAG_40, true, &Logic::ProgressiveBulletBag,RHT_BIG_BULLET_BAG, ITEM_BULLET_BAG_40, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, 0x07, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); + itemTable[RG_BIGGEST_BULLET_BAG] = Item(RG_BIGGEST_BULLET_BAG, Text{ "Biggest Deku Seed Bullet Bag", "Énorme sac de graines mojo", "Größte Deku-Samenkugelsack" }, ITEMTYPE_ITEM, GI_BULLET_BAG_50, true, &Logic::ProgressiveBulletBag,RHT_BIGGEST_BULLET_BAG, ITEM_BULLET_BAG_50, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, 0x07, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); + itemTable[RG_GORONS_BRACELET] = Item(RG_GORONS_BRACELET, Text{ "Goron's Bracelet", "Bracelet Goron", "Goronen-Armband" }, ITEMTYPE_ITEM, GI_BRACELET, true, &Logic::ProgressiveStrength, RHT_GORONS_BRACELET, ITEM_BRACELET, OBJECT_GI_BRACELET, GID_BRACELET, 0x79, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_SILVER_GAUNTLETS] = Item(RG_SILVER_GAUNTLETS, Text{ "Silver Gauntlets", "Gantelets d'argent", "Silberne Fehdehandschuhe" }, ITEMTYPE_ITEM, GI_GAUNTLETS_SILVER,true, &Logic::ProgressiveStrength, RHT_SILVER_GAUNTLETS, ITEM_GAUNTLETS_SILVER, OBJECT_GI_GLOVES, GID_GAUNTLETS_SILVER,0x5B, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_GOLDEN_GAUNTLETS] = Item(RG_GOLDEN_GAUNTLETS, Text{ "Golden Gauntlets", "Gantelets d'or", "Goldene Fehdehandschuhe" }, ITEMTYPE_ITEM, GI_GAUNTLETS_GOLD, true, &Logic::ProgressiveStrength, RHT_GOLDEN_GAUNTLETS, ITEM_GAUNTLETS_GOLD, OBJECT_GI_GLOVES, GID_GAUNTLETS_GOLD, 0x5C, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_SILVER_SCALE] = Item(RG_SILVER_SCALE, Text{ "Silver Scale", "Écaille d'argent", "Silberne Skala" }, ITEMTYPE_ITEM, GI_SCALE_SILVER, true, &Logic::ProgressiveScale, RHT_SILVER_SCALE, ITEM_SCALE_SILVER, OBJECT_GI_SCALE, GID_SCALE_SILVER, 0xCD, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_GOLDEN_SCALE] = Item(RG_GOLDEN_SCALE, Text{ "Golden Scale", "Écaille d'or", "Goldene Skala" }, ITEMTYPE_ITEM, GI_SCALE_GOLD, true, &Logic::ProgressiveScale, RHT_GOLDEN_SCALE, ITEM_SCALE_GOLDEN, OBJECT_GI_SCALE, GID_SCALE_GOLDEN, 0xCE, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_ADULT_WALLET] = Item(RG_ADULT_WALLET, Text{ "Adult Wallet", "Grande Bourse", "Erwachsene Geldbörse" }, ITEMTYPE_ITEM, GI_WALLET_ADULT, true, &Logic::ProgressiveWallet, RHT_ADULT_WALLET, ITEM_WALLET_ADULT, OBJECT_GI_PURSE, GID_WALLET_ADULT, 0x5E, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_GIANT_WALLET] = Item(RG_GIANT_WALLET, Text{ "Giant Wallet", "Bourse de Géant", "Riesige Geldbörse" }, ITEMTYPE_ITEM, GI_WALLET_GIANT, true, &Logic::ProgressiveWallet, RHT_GIANT_WALLET, ITEM_WALLET_GIANT, OBJECT_GI_PURSE, GID_WALLET_GIANT, 0x5F, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_TYCOON_WALLET] = Item(RG_TYCOON_WALLET, Text{ "Tycoon Wallet", "Bourse de Magnat", "Reiche Geldbörse" }, ITEMTYPE_ITEM, RG_TYCOON_WALLET, true, &Logic::ProgressiveWallet, RHT_TYCOON_WALLET, RG_TYCOON_WALLET, OBJECT_GI_PURSE, GID_WALLET_GIANT, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_DEKU_NUT_CAPACITY_30] = Item(RG_DEKU_NUT_CAPACITY_30, Text{ "Deku Nut Capacity (30)", "Capacité de noix Mojo (30)", "Deku Nuss Kapazität (30)" }, ITEMTYPE_ITEM, GI_NUT_UPGRADE_30, false, &Logic::noVariable, RHT_DEKU_NUT_CAPACITY_30, ITEM_NUT_UPGRADE_30, OBJECT_GI_NUTS, GID_NUTS, 0xA7, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE); + itemTable[RG_DEKU_NUT_CAPACITY_40] = Item(RG_DEKU_NUT_CAPACITY_40, Text{ "Deku Nut Capacity (40)", "Capacité de noix Mojo (40)", "Deku Nuss Kapazität (40)" }, ITEMTYPE_ITEM, GI_NUT_UPGRADE_40, false, &Logic::noVariable, RHT_DEKU_NUT_CAPACITY_40, ITEM_NUT_UPGRADE_40, OBJECT_GI_NUTS, GID_NUTS, 0xA8, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE); + itemTable[RG_DEKU_STICK_CAPACITY_20] = Item(RG_DEKU_STICK_CAPACITY_20, Text{ "Deku Stick Capacity (20)", "Capacité de Bâtons Mojo (20)", "Deku Stick Kapazität (20)" }, ITEMTYPE_ITEM, GI_STICK_UPGRADE_20,false, &Logic::noVariable, RHT_DEKU_STICK_CAPACITY_20, ITEM_STICK_UPGRADE_20, OBJECT_GI_STICK, GID_STICK, 0x90, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE); + itemTable[RG_DEKU_STICK_CAPACITY_30] = Item(RG_DEKU_STICK_CAPACITY_30, Text{ "Deku Stick Capacity (30)", "Capacité de Bâtons Mojo (30)", "Deku Stick Kapazität (30)" }, ITEMTYPE_ITEM, GI_STICK_UPGRADE_30,false, &Logic::noVariable, RHT_DEKU_STICK_CAPACITY_30, ITEM_STICK_UPGRADE_30, OBJECT_GI_STICK, GID_STICK, 0x91, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE); + itemTable[RG_MAGIC_SINGLE] = Item(RG_MAGIC_SINGLE, Text{ "Magic Meter", "Jauge de Magie", "Magisches Messgerät" }, ITEMTYPE_ITEM, 0x8A, true, &Logic::ProgressiveMagic, RHT_MAGIC_SINGLE, RG_MAGIC_SINGLE, OBJECT_GI_MAGICPOT, GID_MAGIC_SMALL, 0xE4, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_MAGIC_DOUBLE] = Item(RG_MAGIC_DOUBLE, Text{ "Enhanced Magic Meter", "Jauge de Magie améliorée", "Verbesserte Magieanzeige" }, ITEMTYPE_ITEM, 0x8A, true, &Logic::ProgressiveMagic, RHT_MAGIC_DOUBLE, RG_MAGIC_DOUBLE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0xE8, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_TRIFORCE_PIECE] = Item(RG_TRIFORCE_PIECE, Text{ "Triforce Piece", "Triforce Piece", "Triforce Piece" }, ITEMTYPE_ITEM, 0xDF, true, &Logic::TriforcePieces, RHT_TRIFORCE_PIECE, RG_TRIFORCE_PIECE, OBJECT_GI_BOMB_2, GID_TRIFORCE_PIECE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); +} + +Item& Rando::StaticData::RetrieveItem(const RandomizerGet rgid) { + return itemTable[rgid]; +} + +Item& Rando::StaticData::ItemFromGIID(const int giid) { + uint32_t index = 0; + while (index < RG_MAX) { + if (itemTable[index].GetItemID() == giid) { + return itemTable[index]; + } + index++; + } + + // there are vanilla items that don't exist in the item table we're reading from here + // if we made it this far, it means we didn't find an item in the table + // if we don't return anything, the game will crash, so, as a workaround, return greg + return itemTable[RG_GREEN_RUPEE]; +} + +std::array& Rando::StaticData::GetItemTable() { + return itemTable; +} \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/item_location.cpp b/soh/soh/Enhancements/randomizer/item_location.cpp new file mode 100644 index 000000000..62016b282 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/item_location.cpp @@ -0,0 +1,189 @@ +#include "item_location.h" + +namespace Rando { +ItemLocation::ItemLocation(RandomizerCheck rc_) : rc(rc_) {} + +RandomizerCheck ItemLocation::GetRandomizerCheck() const { + return rc; +} + +bool ItemLocation::IsAddedToPool() const { + return addedToPool; +} + +void ItemLocation::AddToPool() { + addedToPool = true; +} + +void ItemLocation::RemoveFromPool() { + addedToPool = false; +} + +const Item& ItemLocation::GetPlacedItem() const { + return Rando::StaticData::RetrieveItem(placedItem); +} + +const Text& ItemLocation::GetPlacedItemName() const { + return Rando::StaticData::RetrieveItem(placedItem).GetName(); +} + +RandomizerGet ItemLocation::GetPlacedRandomizerGet() const { + return placedItem; +} + +void ItemLocation::SetPlacedItem(const RandomizerGet item) { + placedItem = item; + SetPrice (StaticData::RetrieveItem(placedItem).GetPrice()); +} + +void ItemLocation::SetDelayedItem(const RandomizerGet item) { + delayedItem = item; +} + +void ItemLocation::SaveDelayedItem () { + placedItem = delayedItem; + delayedItem = RG_NONE; +} + +void ItemLocation::SetParentRegion(RandomizerRegion region) { + parentRegion = region; +} + +RandomizerRegion ItemLocation::GetParentRegionKey() const { + return parentRegion; +} + +void ItemLocation::PlaceVanillaItem() { + placedItem = Rando::StaticData::GetLocation(rc)->GetVanillaItem(); +} + +void ItemLocation::ApplyPlacedItemEffect() { + Rando::StaticData::RetrieveItem(placedItem).ApplyEffect(); +} + +uint16_t ItemLocation::GetPrice() const { + if (StaticData::RetrieveItem(placedItem).GetItemType() == ITEMTYPE_SHOP) { + return Rando::StaticData::RetrieveItem(placedItem).GetPrice(); + } + return price; +} + +void ItemLocation::SetPrice(uint16_t price_) { + if (hasShopsanityPrice || hasScrubsanityPrice) { + return; + } + price = price_; +} + +bool ItemLocation::HasShopsanityPrice() const { + return hasShopsanityPrice; +} + +void ItemLocation::SetShopsanityPrice(uint16_t price_) { + price = price_; + hasShopsanityPrice = true; +} + +bool ItemLocation::HasScrubsanityPrice() const { + return hasScrubsanityPrice; +} + +void ItemLocation::SetScrubsanityPrice(uint16_t price_) { + price = price_; + hasScrubsanityPrice = true; +} + +bool ItemLocation::IsHintable() const { + return isHintable; +} + +void ItemLocation::SetAsHintable() { + isHintable = true; +} + +bool ItemLocation::IsHintedAt() const { + return hintedAt; +} + +void ItemLocation::SetAsHinted() { + hintedAt = true; +} + +RandomizerHintKey ItemLocation::GetHintKey() const { + return hintedBy; +} + +void ItemLocation::SetHintKey(RandomizerHintKey hintKey) { + hintedBy = hintKey; +} + +bool ItemLocation::IsHidden() const { + return hidden; +} + +void ItemLocation::SetHidden(const bool hidden_) { + hidden = hidden_; +} + +bool ItemLocation::IsExcluded() const { + return excludedOption.Value(); +} + +Option* ItemLocation::GetExcludedOption() { + return &excludedOption; +} + +void ItemLocation::AddExcludeOption() { + const std::string name = StaticData::GetLocation(rc)->GetName(); + if (name.length() < 23) { + excludedOption = Option::Bool(name, {"Include", "Exclude"}); + } else { + size_t lastSpace = name.rfind(' ', 23); + std::string settingText = name; + settingText.replace(lastSpace, 1, "\n "); + + excludedOption = Option::Bool(settingText, {"Include", "Exclude"}); + } + // RANDOTODO: this without string compares and loops + bool alreadyAdded = false; + Rando::Location* loc = StaticData::GetLocation(rc); + for (const Option* location : Settings::excludeLocationsOptionsVector[loc->GetCollectionCheckGroup()]) { + if (location->GetName() == excludedOption.GetName()) { + alreadyAdded = true; + } + } + if (!alreadyAdded) { + Settings::excludeLocationsOptionsVector[loc->GetCollectionCheckGroup()].push_back(&excludedOption); + } +} + +bool ItemLocation::IsVisible() const { + return visibleInImGui; +} +void ItemLocation::SetVisible(bool visibleInImGui_) { + visibleInImGui = visibleInImGui_; + +} + +ItemOverride_Key ItemLocation::Key() const { + ItemOverride_Key key; + key.all = 0; + + key.scene = Rando::StaticData::GetLocation(rc)->GetScene(); + key.type = static_cast(StaticData::GetLocation(rc)->GetLocationType()); // TODO make sure these match up + return key; +} + +void ItemLocation::ResetVariables() { + addedToPool = false; + placedItem = RG_NONE; + delayedItem = RG_NONE; + isHintable = false; + hintedAt = false; + hintedBy = RH_NONE; + price = 0; + hasShopsanityPrice = false; + hasScrubsanityPrice = false; + hidden = 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 new file mode 100644 index 000000000..5b1c0dba7 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/item_location.h @@ -0,0 +1,105 @@ +#pragma once + +#include "randomizerTypes.h" +#include "item.h" +#include "3drando/text.hpp" +#include "static_data.h" + +namespace Rando { +enum ItemOverride_Type { + OVR_BASE_ITEM = 0, + OVR_CHEST = 1, + OVR_COLLECTABLE = 2, + OVR_SKULL = 3, + OVR_GROTTO_SCRUB = 4, + OVR_DELAYED = 5, + OVR_TEMPLE = 6, +}; + +typedef union ItemOverride_Key { + uint32_t all; + struct { + char pad_; + uint8_t scene; + uint8_t type; + }; +} ItemOverride_Key; + +typedef union ItemOverride_Value { + uint32_t all; + struct { + uint16_t itemId; + uint8_t player; + uint8_t looksLikeItemId; + }; +} ItemOverride_Value; + +typedef struct ItemOverride { + ItemOverride_Key key; + ItemOverride_Value value; +} ItemOverride; + +class ItemOverride_Compare { + public: + bool operator()(ItemOverride lhs, ItemOverride rhs) const { + return lhs.key.all < rhs.key.all; + } +}; + +class ItemLocation { + public: + ItemLocation() = default; + ItemLocation(RandomizerCheck rc); + RandomizerCheck GetRandomizerCheck() const; + bool IsAddedToPool() const; + void AddToPool(); + void RemoveFromPool(); + const Item& GetPlacedItem() const; + const Text& GetPlacedItemName() const; + RandomizerGet GetPlacedRandomizerGet() const; + void SetPlacedItem(const RandomizerGet item); + void SetDelayedItem(const RandomizerGet item); + RandomizerRegion GetParentRegionKey() const; + void SetParentRegion (RandomizerRegion region); + void PlaceVanillaItem(); + void ApplyPlacedItemEffect(); + void SaveDelayedItem(); + uint16_t GetPrice() const; + void SetPrice(uint16_t price_); + bool HasShopsanityPrice() const; + void SetShopsanityPrice(uint16_t price_); + bool HasScrubsanityPrice() const; + void SetScrubsanityPrice(uint16_t price_); + bool IsHintable() const; + void SetAsHintable(); + bool IsHintedAt() const; + void SetAsHinted(); + RandomizerHintKey GetHintKey() const; + void SetHintKey(RandomizerHintKey hintKey); + bool IsHidden() const; + bool IsExcluded() const; + void AddExcludeOption(); + Option* GetExcludedOption(); + void SetHidden(const bool hidden_); + bool IsVisible() const; + void SetVisible(bool visibleInImGui_); + Rando::ItemOverride_Key Key() const; + void ResetVariables(); + + private: + RandomizerCheck rc; + RandomizerHintKey hintedBy; + bool hintedAt = false; + bool isHintable = false; + bool addedToPool = false; + RandomizerGet placedItem = RG_NONE; + RandomizerGet delayedItem = RG_NONE; + Option excludedOption = Option::Bool(StaticData::GetLocation(rc)->GetName(), {"Include", "Exclude"}); + uint16_t price = 0; + RandomizerRegion parentRegion = RR_NONE; + bool hasShopsanityPrice = false; + bool hasScrubsanityPrice = false; + bool hidden = false; + bool visibleInImGui = false; +}; +} // namespace Rando \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/location.cpp b/soh/soh/Enhancements/randomizer/location.cpp new file mode 100644 index 000000000..e50b21be0 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/location.cpp @@ -0,0 +1,252 @@ +#include "location.h" +#include "3drando/hint_list.hpp" + +RandomizerCheck Rando::Location::GetRandomizerCheck() const { + return rc; +} + +Rando::SpoilerCollectionCheck Rando::Location::GetCollectionCheck() const { + return collectionCheck; +} + +SpoilerCollectionCheckGroup Rando::Location::GetCollectionCheckGroup() const { + return collectionCheckGroup; +} + +RandomizerCheckQuest Rando::Location::GetQuest() const { + return quest; +} + +RandomizerCheckArea Rando::Location::GetArea() const { + return area; +} + +RandomizerCheckType Rando::Location::GetRCType() const { + return checkType; +} + +ActorID Rando::Location::GetActorID() const { + return actorId; +} + +int32_t Rando::Location::GetActorParams() const { + return actorParams; +} + +SceneID Rando::Location::GetScene() const { + return (SceneID)scene; +} + +uint8_t Rando::Location::GetFlag() const { + return flag; +} + +RandomizerHintTextKey Rando::Location::GetHintKey() const { + return hintKey; +} + +HintText* Rando::Location::GetHint() { + return &hintTable[hintKey]; +} + +const std::string& Rando::Location::GetName() const { + return spoilerName; +} + +const std::string& Rando::Location::GetShortName() const { + return shortName; +} + +Rando::LocationType Rando::Location::GetLocationType() const { + return locationType; +} + +bool Rando::Location::IsCategory(Category category) const { + return std::any_of(categories.begin(), categories.end(), [category](auto entry) { return entry == category; }); +} + +bool Rando::Location::IsDungeon() const { + return (locationType != LocationType::GSToken && + (scene < SCENE_GANONS_TOWER_COLLAPSE_INTERIOR || + (scene > SCENE_TREASURE_BOX_SHOP && scene < SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR))) || + (locationType == LocationType::GSToken && scene < SCENE_GANONS_TOWER); +} + +bool Rando::Location::IsOverworld() const { + return !IsDungeon(); +} + +bool Rando::Location::IsShop() const { + return (scene >= SCENE_BAZAAR && scene <= SCENE_BOMBCHU_SHOP); +} + +bool Rando::Location::IsVanillaCompletion() const { + return isVanillaCompletion; +} + +uint32_t Rando::Location::Getuint32_t() const { + return hintKey; +} + +const HintText& Rando::Location::GetHint() const { + return Hint(hintKey); +} + +RandomizerGet Rando::Location::GetVanillaItem() const { + return vanillaItem; +} + +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_, + const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, + std::vector&& categories, SpoilerCollectionCheck collectionCheck, + SpoilerCollectionCheckGroup collectionCheckGroup, bool isVanillaCompletion_) { + return Location(rc, quest_, checkType_, area_, LocationType::Base, actorId_, scene_, actorParams_, flag_, + std::move(shortName_), std::move(spoilerName_), hintKey, vanillaItem, std::move(categories), + isVanillaCompletion_, collectionCheck, collectionCheckGroup); +} + +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_, + std::string&& spoilerName_, const RandomizerHintTextKey hintKey, + const RandomizerGet vanillaItem, std::vector&& categories, + SpoilerCollectionCheckGroup collectionCheckGroup, bool isVanillaCompletion_) { + return Location(rc, quest_, checkType_, area_, LocationType::Chest, actorId_, scene_, actorParams_, flag_, + std::move(shortName_), std::move(spoilerName_), hintKey, vanillaItem, std::move(categories), + isVanillaCompletion_, + SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_CHEST, scene_, flag_), + collectionCheckGroup); +} + +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_, + std::string&& spoilerName_, const RandomizerHintTextKey hintKey, + const RandomizerGet vanillaItem, std::vector&& categories, + SpoilerCollectionCheck collectionCheck, + SpoilerCollectionCheckGroup collectionCheckGroup, bool isVanillaCompletion_) { + return Location(rc, quest_, checkType_, area_, LocationType::Chest, actorId_, scene_, actorParams_, flag_, + std::move(shortName_), std::move(spoilerName_), hintKey, vanillaItem, std::move(categories), + isVanillaCompletion_, collectionCheck, collectionCheckGroup); +} + +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_, + std::string&& spoilerName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, + std::vector&& categories, SpoilerCollectionCheckGroup collectionCheckGroup, bool isVanillaCompletion_) { + return Location(rc, quest_, checkType_, area_, LocationType::Collectable, actorId_, scene_, actorParams_, flag_, + std::move(shortName_), std::move(spoilerName_), hintKey, vanillaItem, std::move(categories), + isVanillaCompletion_, + SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_COLLECTABLE, scene_, flag_), + collectionCheckGroup); +} + +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_, std::string&& spoilerName_, + const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, + std::vector&& categories, uint8_t collectFlag_, + SpoilerCollectionCheckGroup collectionCheckGroup, + bool isVanillaCompletion_) { + return Location(rc, quest_, checkType_, area_, LocationType::Collectable, actorId_, scene_, actorParams_, flag_, + std::move(shortName_), std::move(spoilerName_), hintKey, vanillaItem, std::move(categories), + isVanillaCompletion_, + SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_COLLECTABLE, scene_, collectFlag_), + collectionCheckGroup); +} + +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_, std::string&& spoilerName_, + const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, + std::vector&& categories, SpoilerCollectionCheck collectionCheck, + SpoilerCollectionCheckGroup collectionCheckGroup, + bool isVanillaCompletion_) { + return Location(rc, quest_, checkType_, area_, LocationType::Collectable, actorId_, scene_, actorParams_, flag_, + std::move(shortName_), std::move(spoilerName_), hintKey, vanillaItem, std::move(categories), + isVanillaCompletion_, collectionCheck, collectionCheckGroup); +} + +Rando::Location Rando::Location::GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + std::string&& spoilerName_, const RandomizerHintTextKey hintKey, + std::vector&& categories, + SpoilerCollectionCheckGroup collectionCheckGroup, bool isVanillaCompletion_) { + return Location(rc, quest_, RCTYPE_SKULL_TOKEN, area_, LocationType::GSToken, ACTOR_EN_SI, scene_, actorParams_, + flag_, std::move(shortName_), std::move(spoilerName_), hintKey, RG_GOLD_SKULLTULA_TOKEN, + std::move(categories), isVanillaCompletion_, + SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_GOLD_SKULLTULA, scene_, flag_), + collectionCheckGroup); +} + +Rando::Location Rando::Location::GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + std::string&& spoilerName_, const RandomizerHintTextKey hintKey, + std::vector&& categories, uint8_t skullScene_, + SpoilerCollectionCheckGroup collectionCheckGroup, bool isVanillaCompletion_) { + return Location(rc, quest_, RCTYPE_SKULL_TOKEN, area_, LocationType::GSToken, ACTOR_EN_SI, scene_, actorParams_, + flag_, std::move(shortName_), std::move(spoilerName_), hintKey, RG_GOLD_SKULLTULA_TOKEN, + std::move(categories), isVanillaCompletion_, + SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_GOLD_SKULLTULA, skullScene_, flag_), + collectionCheckGroup); +} + +Rando::Location Rando::Location::GrottoScrub(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_, + const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, + std::vector&& categories, SpoilerCollectionCheck collectionCheck, + SpoilerCollectionCheckGroup collectionCheckGroup, + bool isVanillaCompletion_) { + return Location(rc, quest_, checkType_, area_, LocationType::GrottoScrub, actorId_, scene_, actorParams_, flag_, + std::move(shortName_), std::move(spoilerName_), hintKey, vanillaItem, std::move(categories), + isVanillaCompletion_, collectionCheck, collectionCheckGroup); +} + +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_, + std::string&& spoilerName_, const RandomizerHintTextKey hintKey, + const RandomizerGet vanillaItem, std::vector&& categories, + SpoilerCollectionCheck collectionCheck, + SpoilerCollectionCheckGroup collectionCheckGroup, bool isVanillaCompletion_) { + return Location(rc, quest_, checkType_, area_, LocationType::Delayed, actorId_, scene_, actorParams_, flag_, + std::move(shortName_), std::move(spoilerName_), hintKey, vanillaItem, std::move(categories), + isVanillaCompletion_, collectionCheck, collectionCheckGroup); +} + +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_, + std::string&& spoilerName_, const RandomizerHintTextKey hintKey, + const RandomizerGet vanillaItem, std::vector&& categories, + SpoilerCollectionCheck collectionCheck, + SpoilerCollectionCheckGroup collectionCheckGroup, bool isVanillaCompletion_) { + return Location(rc, quest_, checkType_, area_, LocationType::TempleReward, actorId_, scene_, actorParams_, flag_, + std::move(shortName_), std::move(spoilerName_), hintKey, vanillaItem, std::move(categories), + isVanillaCompletion_, collectionCheck, collectionCheckGroup); +} + +Rando::Location Rando::Location::OtherHint(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_, + std::vector&& categories, bool isVanillaCompletion_) { + return Location(rc, quest_, checkType_, area_, LocationType::OtherHint, actorId_, scene_, actorParams_, flag_, + std::move(shortName_), std::move(spoilerName_), RHT_NONE, RG_NONE, std::move(categories), isVanillaCompletion_); +} + +Rando::Location Rando::Location::HintStone(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + uint8_t scene_, int32_t actorParams_, uint8_t flag_, + std::string&& shortName_, std::string&& spoilerName_, + std::vector&& categories, bool isVanillaCompletion_) { + return Location(rc, quest_, RCTYPE_GOSSIP_STONE, area_, LocationType::Base, ACTOR_EN_GS, scene_, actorParams_, flag_, + std::move(shortName_), std::move(spoilerName_), RHT_NONE, RG_NONE, std::move(categories), + isVanillaCompletion_); +} diff --git a/soh/soh/Enhancements/randomizer/location.h b/soh/soh/Enhancements/randomizer/location.h new file mode 100644 index 000000000..a1a47fd8f --- /dev/null +++ b/soh/soh/Enhancements/randomizer/location.h @@ -0,0 +1,285 @@ +#pragma once + +#include + +#include "3drando/spoiler_log.hpp" +#include "3drando/category.hpp" +#include "3drando/hints.hpp" + +#include "z64item.h" +#include "randomizerTypes.h" +#include "z64actor_enum.h" +#include "z64scene.h" + +namespace Rando { +class SpoilerCollectionCheck { + public: + SpoilerCollectionCheckType type = SpoilerCollectionCheckType::SPOILER_CHK_NONE; + uint8_t scene = 0; + uint8_t flag = 0; + + SpoilerCollectionCheck() { + } + SpoilerCollectionCheck(SpoilerCollectionCheckType type_, uint8_t scene_, uint8_t flag_) + : type(type_), scene(scene_), flag(flag_) { + } + + static auto None() { + return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_NONE, 0x00, 0x00); + } + + static auto AlwaysCollected() { + return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_ALWAYS_COLLECTED, 0x00, 0x00); + } + + static auto ItemGetInf(uint8_t slot) { + return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_ITEM_GET_INF, 0x00, slot); + } + + static auto EventChkInf(uint8_t flag) { + return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_EVENT_CHK_INF, 0xFF, flag); + } + + static auto InfTable(uint8_t offset, uint8_t bit) { + return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_INF_TABLE, offset, bit); + } + + static auto Collectable(uint8_t scene, uint8_t flag) { + return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_COLLECTABLE, scene, flag); + } + + static auto Chest(uint8_t scene, uint8_t flag) { + return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_CHEST, scene, flag); + } + + static auto Cow(uint8_t scene, uint8_t flag) { + return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_COW, scene, flag); + } + + static auto Fishing(uint8_t bit) { + return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_MINIGAME, 0x00, bit); + } + + static auto Scrub(uint8_t scene, uint8_t bit) { + return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_SCRUB, scene, bit); + } + + static auto GerudoToken() { + return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_GERUDO_MEMBERSHIP_CARD, 0x00, 0x00); + } + + static auto BigPoePoints() { + return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_POE_POINTS, 0x00, 0x00); + } + + static auto Gravedigger(uint8_t scene, uint8_t flag) { + return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_GRAVEDIGGER, scene, flag); + } + + static auto ShopItem(uint8_t scene, uint8_t itemSlot) { + return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_SHOP_ITEM, scene, itemSlot); + } + + static auto MagicBeans(uint8_t scene, uint8_t flag) { + return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_MAGIC_BEANS, scene, flag); + } + + static auto Merchant(int8_t scene, uint8_t flag) { + return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_MERCHANT, scene, flag); + } + + static auto RandomizerInf(int8_t scene, uint8_t flag) { + return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_RANDOMIZER_INF, scene, flag); + } +}; + +enum class LocationType { + Base, + Chest, + Collectable, + GSToken, + GrottoScrub, + Delayed, + TempleReward, + HintStone, + OtherHint, +}; + +class Location { + public: + Location() = default; + Location(RandomizerCheck rc_, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + RandomizerCheckArea area_, LocationType locationType_, ActorID actorId_, uint8_t scene_, + int32_t actorParams_, uint8_t flag_, std::string shortName_, std::string spoilerName_, + RandomizerHintTextKey hintKey_, RandomizerGet vanillaItem_, std::vector categories_, + bool isVanillaCompletion_ = false, SpoilerCollectionCheck collectionCheck_ = SpoilerCollectionCheck(), + SpoilerCollectionCheckGroup collectionCheckGroup_ = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) + : rc(rc_), quest(quest_), checkType(checkType_), area(area_), locationType(locationType_), actorId(actorId_), + scene(scene_), actorParams(actorParams_), flag(flag_), shortName(std::move(shortName_)), + spoilerName(spoilerName_), hintKey(hintKey_), vanillaItem(vanillaItem_), categories(std::move(categories_)), + isVanillaCompletion(isVanillaCompletion_), collectionCheck(collectionCheck_), + collectionCheckGroup(collectionCheckGroup_) { + } + + RandomizerCheck GetRandomizerCheck() const; + SpoilerCollectionCheck GetCollectionCheck() const; + SpoilerCollectionCheckGroup GetCollectionCheckGroup() const; + RandomizerCheckQuest GetQuest() const; + RandomizerCheckArea GetArea() const; + RandomizerCheckType GetRCType() const; + ActorID GetActorID() const; + int32_t GetActorParams() const; + SceneID GetScene() const; + uint8_t GetFlag() const; + RandomizerHintTextKey GetHintKey() const; + HintText* GetHint(); + const std::string& GetName() const; + const std::string& GetShortName() const; + LocationType GetLocationType() const; + bool IsCategory(Category category) const; + bool IsDungeon() const; + bool IsOverworld() const; + bool IsShop() const; + bool IsVanillaCompletion() const; + uint32_t Getuint32_t() const; + const HintText& GetHint() const; + RandomizerGet GetVanillaItem() const; + + 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_, + const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, + std::vector&& categories, + SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), + SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP, + bool isVanillaCompletion_ = false); + + 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_, + std::string&& spoilerName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, + std::vector&& categories, + SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP, + bool isVanillaCompletion_ = false); + + 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_, + std::string&& spoilerName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, + std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), + SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP, + bool isVanillaCompletion_ = false); + + static Location + Collectable(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_, const RandomizerHintTextKey hintKey, + const RandomizerGet vanillaItem, std::vector&& categories, + SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP, + bool isVanillaCompletion_ = false); + + static Location + Collectable(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_, const RandomizerHintTextKey hintKey, + const RandomizerGet vanillaItem, std::vector&& categories, uint8_t collectFlag_, + SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP, + bool isVanillaCompletion_ = false); + + static Location + Collectable(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_, const RandomizerHintTextKey hintKey, + const RandomizerGet vanillaItem, std::vector&& categories, + SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), + SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP, + bool isVanillaCompletion_ = false); + + static Location + GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + uint8_t scene, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + std::string&& spoilerName_, const RandomizerHintTextKey hintKey, std::vector&& categories, + SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP, + bool isVanillaCompletion_ = true); + + /// @brief For certain scenes, the sceneId and the "Scene" in spoiler collection check later used to check the + /// GS flags don't necessarily match. Use this constructor for those. scene_ should be the actual scene where + /// the GS is located, skullScene_ is the value passed to GET_GS_FLAGS to get the correct skulltula. It is normal + /// and expected that these don't always match, and the naming is a holdover from 3drando. + /// @param rc + /// @param quest_ + /// @param area_ + /// @param scene_ + /// @param actorParams_ + /// @param flag_ + /// @param shortName_ + /// @param spoilerName_ + /// @param hintKey + /// @param categories + /// @param collectionCheckGroup + /// @param skullScene_ + /// @param isVanillaCompletion_ + /// @return + static Location + GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + std::string&& spoilerName_, const RandomizerHintTextKey hintKey, std::vector&& categories, + uint8_t skullScene_, + SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP, + bool isVanillaCompletion_ = true); + + static Location + GrottoScrub(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_, const RandomizerHintTextKey hintKey, + const RandomizerGet vanillaItem, std::vector&& categories, + SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), + SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP, + bool isVanillaCompletion_ = false); + + 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_, + std::string&& spoilerName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, + std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), + SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::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_, + std::string&& spoilerName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, + std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), + SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP, bool isVanillaCompletion_ = false); + + static Location OtherHint(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_, + 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_, std::string&& spoilerName_, + std::vector&& categories, bool isVanillaCompletion_ = false); + + private: + RandomizerCheck rc; + RandomizerCheckQuest quest; + RandomizerCheckType checkType; + RandomizerCheckArea area; + LocationType locationType; + ActorID actorId; + uint8_t scene; + int32_t actorParams; + uint8_t flag; + bool checked = false; + std::string shortName; + std::string spoilerName; + RandomizerHintTextKey hintKey = RHT_NONE; + RandomizerGet vanillaItem = RG_NONE; + std::vector categories; + bool isVanillaCompletion = false; + SpoilerCollectionCheck collectionCheck; + SpoilerCollectionCheckGroup collectionCheckGroup; + bool isHintable = false; +}; +} // namespace Rando \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp new file mode 100644 index 000000000..05b28fc17 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -0,0 +1,1417 @@ +#include "static_data.h" + +#define TWO_ACTOR_PARAMS(a, b) (abs(a) << 16) | abs(b) + +std::array Rando::StaticData::locationTable; + +std::vector KF_ShopLocations = { + RC_KF_SHOP_ITEM_1, RC_KF_SHOP_ITEM_2, RC_KF_SHOP_ITEM_3, RC_KF_SHOP_ITEM_4, + RC_KF_SHOP_ITEM_5, RC_KF_SHOP_ITEM_6, RC_KF_SHOP_ITEM_7, RC_KF_SHOP_ITEM_8, +}; +std::vector Kak_PotionShopLocations = { + RC_KAK_POTION_SHOP_ITEM_1, RC_KAK_POTION_SHOP_ITEM_2, RC_KAK_POTION_SHOP_ITEM_3, RC_KAK_POTION_SHOP_ITEM_4, + RC_KAK_POTION_SHOP_ITEM_5, RC_KAK_POTION_SHOP_ITEM_6, RC_KAK_POTION_SHOP_ITEM_7, RC_KAK_POTION_SHOP_ITEM_8, +}; +std::vector MK_BombchuShopLocations = { + RC_MARKET_BOMBCHU_SHOP_ITEM_1, RC_MARKET_BOMBCHU_SHOP_ITEM_2, RC_MARKET_BOMBCHU_SHOP_ITEM_3, + RC_MARKET_BOMBCHU_SHOP_ITEM_4, RC_MARKET_BOMBCHU_SHOP_ITEM_5, RC_MARKET_BOMBCHU_SHOP_ITEM_6, + RC_MARKET_BOMBCHU_SHOP_ITEM_7, RC_MARKET_BOMBCHU_SHOP_ITEM_8, +}; +std::vector MK_PotionShopLocations = { + RC_MARKET_POTION_SHOP_ITEM_1, RC_MARKET_POTION_SHOP_ITEM_2, RC_MARKET_POTION_SHOP_ITEM_3, + RC_MARKET_POTION_SHOP_ITEM_4, RC_MARKET_POTION_SHOP_ITEM_5, RC_MARKET_POTION_SHOP_ITEM_6, + RC_MARKET_POTION_SHOP_ITEM_7, RC_MARKET_POTION_SHOP_ITEM_8, +}; +std::vector MK_BazaarLocations = { + RC_MARKET_BAZAAR_ITEM_1, RC_MARKET_BAZAAR_ITEM_2, RC_MARKET_BAZAAR_ITEM_3, RC_MARKET_BAZAAR_ITEM_4, + RC_MARKET_BAZAAR_ITEM_5, RC_MARKET_BAZAAR_ITEM_6, RC_MARKET_BAZAAR_ITEM_7, RC_MARKET_BAZAAR_ITEM_8, +}; +std::vector Kak_BazaarLocations = { + RC_KAK_BAZAAR_ITEM_1, RC_KAK_BAZAAR_ITEM_2, RC_KAK_BAZAAR_ITEM_3, RC_KAK_BAZAAR_ITEM_4, + RC_KAK_BAZAAR_ITEM_5, RC_KAK_BAZAAR_ITEM_6, RC_KAK_BAZAAR_ITEM_7, RC_KAK_BAZAAR_ITEM_8, +}; +std::vector ZD_ShopLocations = { + RC_ZD_SHOP_ITEM_1, RC_ZD_SHOP_ITEM_2, RC_ZD_SHOP_ITEM_3, RC_ZD_SHOP_ITEM_4, + RC_ZD_SHOP_ITEM_5, RC_ZD_SHOP_ITEM_6, RC_ZD_SHOP_ITEM_7, RC_ZD_SHOP_ITEM_8, +}; +std::vector GC_ShopLocations = { + RC_GC_SHOP_ITEM_1, RC_GC_SHOP_ITEM_2, RC_GC_SHOP_ITEM_3, RC_GC_SHOP_ITEM_4, + RC_GC_SHOP_ITEM_5, RC_GC_SHOP_ITEM_6, RC_GC_SHOP_ITEM_7, RC_GC_SHOP_ITEM_8, +}; +// List of shop location lists, used for shop shuffle +std::vector> Rando::StaticData::shopLocationLists = { + KF_ShopLocations, Kak_PotionShopLocations, MK_BombchuShopLocations, MK_PotionShopLocations, + MK_BazaarLocations, Kak_BazaarLocations, ZD_ShopLocations, GC_ShopLocations, +}; + +std::vector Rando::StaticData::scrubLocations = { + RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, + RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, + RC_LW_DEKU_SCRUB_NEAR_BRIDGE, + RC_LW_DEKU_SCRUB_GROTTO_REAR, + RC_LW_DEKU_SCRUB_GROTTO_FRONT, + RC_SFM_DEKU_SCRUB_GROTTO_REAR, + RC_SFM_DEKU_SCRUB_GROTTO_FRONT, + RC_HF_DEKU_SCRUB_GROTTO, + RC_LH_DEKU_SCRUB_GROTTO_LEFT, + RC_LH_DEKU_SCRUB_GROTTO_RIGHT, + RC_LH_DEKU_SCRUB_GROTTO_CENTER, + RC_GV_DEKU_SCRUB_GROTTO_REAR, + RC_GV_DEKU_SCRUB_GROTTO_FRONT, + RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, + RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, + RC_GC_DEKU_SCRUB_GROTTO_LEFT, + RC_GC_DEKU_SCRUB_GROTTO_RIGHT, + RC_GC_DEKU_SCRUB_GROTTO_CENTER, + RC_DMC_DEKU_SCRUB, + RC_DMC_DEKU_SCRUB_GROTTO_LEFT, + RC_DMC_DEKU_SCRUB_GROTTO_RIGHT, + RC_DMC_DEKU_SCRUB_GROTTO_CENTER, + RC_ZR_DEKU_SCRUB_GROTTO_REAR, + RC_ZR_DEKU_SCRUB_GROTTO_FRONT, + RC_LLR_DEKU_SCRUB_GROTTO_LEFT, + RC_LLR_DEKU_SCRUB_GROTTO_RIGHT, + RC_LLR_DEKU_SCRUB_GROTTO_CENTER, + RC_DEKU_TREE_MQ_DEKU_SCRUB, + RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, + RC_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, + RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, + RC_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, + RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, + RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, + RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, + RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, + RC_JABU_JABUS_BELLY_DEKU_SCRUB, + RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, + RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, + RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT, + RC_GANONS_CASTLE_DEKU_SCRUB_LEFT, + RC_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, + RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, + RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, + RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, + RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, +}; + +std::vector Rando::StaticData::dungeonRewardLocations = { + // Bosses + RC_QUEEN_GOHMA, RC_KING_DODONGO, RC_BARINADE, RC_PHANTOM_GANON, RC_VOLVAGIA, + RC_MORPHA, RC_TWINROVA, RC_BONGO_BONGO, RC_LINKS_POCKET, +}; + +std::vector Rando::StaticData::overworldLocations = { + // Kokiri Forest + RC_KF_KOKIRI_SWORD_CHEST, + RC_KF_MIDOS_TOP_LEFT_CHEST, + RC_KF_MIDOS_TOP_RIGHT_CHEST, + RC_KF_MIDOS_BOTTOM_LEFT_CHEST, + RC_KF_MIDOS_BOTTOM_RIGHT_CHEST, + RC_KF_STORMS_GROTTO_CHEST, + RC_KF_LINKS_HOUSE_COW, + + // Shop + RC_KF_SHOP_ITEM_1, + RC_KF_SHOP_ITEM_2, + RC_KF_SHOP_ITEM_3, + RC_KF_SHOP_ITEM_4, + RC_KF_SHOP_ITEM_5, + RC_KF_SHOP_ITEM_6, + RC_KF_SHOP_ITEM_7, + RC_KF_SHOP_ITEM_8, + + // Lost Woods + RC_LW_GIFT_FROM_SARIA, + RC_LW_SKULL_KID, + RC_LW_TRADE_COJIRO, + RC_LW_TRADE_ODD_POTION, + RC_LW_OCARINA_MEMORY_GAME, + RC_LW_TARGET_IN_WOODS, + RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, + RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, + RC_LW_DEKU_SCRUB_NEAR_BRIDGE, + RC_LW_NEAR_SHORTCUTS_GROTTO_CHEST, + RC_LW_DEKU_SCRUB_GROTTO_REAR, + RC_LW_DEKU_SCRUB_GROTTO_FRONT, + RC_DEKU_THEATER_SKULL_MASK, + RC_DEKU_THEATER_MASK_OF_TRUTH, + + // Sacred Forest Meadow + RC_SONG_FROM_SARIA, + RC_SHEIK_IN_FOREST, + RC_SFM_WOLFOS_GROTTO_CHEST, + RC_SFM_DEKU_SCRUB_GROTTO_REAR, + RC_SFM_DEKU_SCRUB_GROTTO_FRONT, + + // Hyrule Field + RC_HF_SOUTHEAST_GROTTO_CHEST, + RC_HF_OPEN_GROTTO_CHEST, + RC_HF_NEAR_MARKET_GROTTO_CHEST, + RC_HF_OCARINA_OF_TIME_ITEM, + RC_SONG_FROM_OCARINA_OF_TIME, + RC_HF_TEKTITE_GROTTO_FREESTANDING_POH, + RC_HF_DEKU_SCRUB_GROTTO, + RC_HF_COW_GROTTO_COW, + + // Lake Hylia + RC_LH_CHILD_FISHING, + RC_LH_ADULT_FISHING, + RC_LH_LAB_DIVE, + RC_LH_TRADE_FROG, + RC_LH_UNDERWATER_ITEM, + RC_LH_SUN, + RC_LH_FREESTANDING_POH, + RC_LH_DEKU_SCRUB_GROTTO_LEFT, + RC_LH_DEKU_SCRUB_GROTTO_RIGHT, + RC_LH_DEKU_SCRUB_GROTTO_CENTER, + + // Gerudo Valley + RC_GV_CHEST, + RC_GV_TRADE_SAW, + RC_GV_WATERFALL_FREESTANDING_POH, + RC_GV_CRATE_FREESTANDING_POH, + RC_GV_DEKU_SCRUB_GROTTO_REAR, + RC_GV_DEKU_SCRUB_GROTTO_FRONT, + RC_GV_COW, + + // Gerudo Fortress + RC_GF_CHEST, + RC_GF_HBA_1000_POINTS, + RC_GF_HBA_1500_POINTS, + RC_GF_NORTH_F1_CARPENTER, + RC_GF_NORTH_F2_CARPENTER, + RC_GF_SOUTH_F1_CARPENTER, + RC_GF_SOUTH_F2_CARPENTER, + RC_GF_GERUDO_MEMBERSHIP_CARD, + + // Haunted Wasteland + RC_WASTELAND_CHEST, + RC_WASTELAND_BOMBCHU_SALESMAN, + + // Desert Colossus + RC_SHEIK_AT_COLOSSUS, + RC_COLOSSUS_FREESTANDING_POH, + RC_COLOSSUS_GREAT_FAIRY_REWARD, + RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, + RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, + + // Market + RC_MARKET_TREASURE_CHEST_GAME_REWARD, + RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, + RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, + RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS, + RC_MARKET_LOST_DOG, + RC_MARKET_SHOOTING_GALLERY_REWARD, + RC_MARKET_10_BIG_POES, + RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, + RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, + RC_MARKET_TREASURE_CHEST_GAME_ITEM_3, + RC_MARKET_TREASURE_CHEST_GAME_ITEM_4, + RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, + + // Market Shops + RC_MARKET_BOMBCHU_SHOP_ITEM_1, + RC_MARKET_BOMBCHU_SHOP_ITEM_2, + RC_MARKET_BOMBCHU_SHOP_ITEM_3, + RC_MARKET_BOMBCHU_SHOP_ITEM_4, + RC_MARKET_BOMBCHU_SHOP_ITEM_5, + RC_MARKET_BOMBCHU_SHOP_ITEM_6, + RC_MARKET_BOMBCHU_SHOP_ITEM_7, + RC_MARKET_BOMBCHU_SHOP_ITEM_8, + RC_MARKET_POTION_SHOP_ITEM_1, + RC_MARKET_POTION_SHOP_ITEM_2, + RC_MARKET_POTION_SHOP_ITEM_3, + RC_MARKET_POTION_SHOP_ITEM_4, + RC_MARKET_POTION_SHOP_ITEM_5, + RC_MARKET_POTION_SHOP_ITEM_6, + RC_MARKET_POTION_SHOP_ITEM_7, + RC_MARKET_POTION_SHOP_ITEM_8, + RC_MARKET_BAZAAR_ITEM_1, + RC_MARKET_BAZAAR_ITEM_2, + RC_MARKET_BAZAAR_ITEM_3, + RC_MARKET_BAZAAR_ITEM_4, + RC_MARKET_BAZAAR_ITEM_5, + RC_MARKET_BAZAAR_ITEM_6, + RC_MARKET_BAZAAR_ITEM_7, + RC_MARKET_BAZAAR_ITEM_8, + + // Hyrule Castle + RC_HC_MALON_EGG, + RC_HC_ZELDAS_LETTER, + RC_SONG_FROM_IMPA, + RC_HC_GREAT_FAIRY_REWARD, + RC_OGC_GREAT_FAIRY_REWARD, + + // Temple of Time + RC_SHEIK_AT_TEMPLE, + RC_TOT_LIGHT_ARROWS_CUTSCENE, + + // Kakariko + RC_SHEIK_IN_KAKARIKO, + RC_KAK_REDEAD_GROTTO_CHEST, + RC_KAK_OPEN_GROTTO_CHEST, + RC_KAK_10_GOLD_SKULLTULA_REWARD, + RC_KAK_20_GOLD_SKULLTULA_REWARD, + RC_KAK_30_GOLD_SKULLTULA_REWARD, + RC_KAK_40_GOLD_SKULLTULA_REWARD, + RC_KAK_50_GOLD_SKULLTULA_REWARD, + RC_KAK_100_GOLD_SKULLTULA_REWARD, + RC_KAK_MAN_ON_ROOF, + RC_KAK_SHOOTING_GALLERY_REWARD, + RC_KAK_TRADE_ODD_MUSHROOM, + RC_KAK_GRANNYS_SHOP, + RC_KAK_ANJU_AS_CHILD, + RC_KAK_ANJU_AS_ADULT, + RC_KAK_TRADE_POCKET_CUCCO, + RC_KAK_IMPAS_HOUSE_FREESTANDING_POH, + RC_KAK_WINDMILL_FREESTANDING_POH, + RC_SONG_FROM_WINDMILL, + RC_KAK_IMPAS_HOUSE_COW, + + // Kakariko Shops + RC_KAK_POTION_SHOP_ITEM_1, + RC_KAK_POTION_SHOP_ITEM_2, + RC_KAK_POTION_SHOP_ITEM_3, + RC_KAK_POTION_SHOP_ITEM_4, + RC_KAK_POTION_SHOP_ITEM_5, + RC_KAK_POTION_SHOP_ITEM_6, + RC_KAK_POTION_SHOP_ITEM_7, + RC_KAK_POTION_SHOP_ITEM_8, + RC_KAK_BAZAAR_ITEM_1, + RC_KAK_BAZAAR_ITEM_2, + RC_KAK_BAZAAR_ITEM_3, + RC_KAK_BAZAAR_ITEM_4, + RC_KAK_BAZAAR_ITEM_5, + RC_KAK_BAZAAR_ITEM_6, + RC_KAK_BAZAAR_ITEM_7, + RC_KAK_BAZAAR_ITEM_8, + + // Graveyard + RC_GRAVEYARD_HOOKSHOT_CHEST, + RC_GRAVEYARD_SHIELD_GRAVE_CHEST, + RC_GRAVEYARD_HEART_PIECE_GRAVE_CHEST, + RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST, + RC_SONG_FROM_ROYAL_FAMILYS_TOMB, + RC_GRAVEYARD_FREESTANDING_POH, + RC_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, + RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, + + // Death Mountain Trail + RC_DMT_CHEST, + RC_DMT_STORMS_GROTTO_CHEST, + RC_DMT_TRADE_BROKEN_SWORD, + RC_DMT_TRADE_EYEDROPS, + RC_DMT_TRADE_CLAIM_CHECK, + RC_DMT_GREAT_FAIRY_REWARD, + RC_DMT_FREESTANDING_POH, + RC_DMT_COW_GROTTO_COW, + + // Goron City + RC_GC_MAZE_LEFT_CHEST, + RC_GC_MAZE_CENTER_CHEST, + RC_GC_MAZE_RIGHT_CHEST, + RC_GC_ROLLING_GORON_AS_CHILD, + RC_GC_ROLLING_GORON_AS_ADULT, + RC_GC_DARUNIAS_JOY, + RC_GC_POT_FREESTANDING_POH, + RC_GC_DEKU_SCRUB_GROTTO_LEFT, + RC_GC_DEKU_SCRUB_GROTTO_RIGHT, + RC_GC_DEKU_SCRUB_GROTTO_CENTER, + RC_GC_MEDIGORON, + + // Goron City Shop + RC_GC_SHOP_ITEM_1, + RC_GC_SHOP_ITEM_2, + RC_GC_SHOP_ITEM_3, + RC_GC_SHOP_ITEM_4, + RC_GC_SHOP_ITEM_5, + RC_GC_SHOP_ITEM_6, + RC_GC_SHOP_ITEM_7, + RC_GC_SHOP_ITEM_8, + + // Death Mountain + RC_DMC_UPPER_GROTTO_CHEST, + RC_DMC_WALL_FREESTANDING_POH, + RC_DMC_VOLCANO_FREESTANDING_POH, + RC_SHEIK_IN_CRATER, + RC_DMC_DEKU_SCRUB, + RC_DMC_GREAT_FAIRY_REWARD, + RC_DMC_DEKU_SCRUB_GROTTO_LEFT, + RC_DMC_DEKU_SCRUB_GROTTO_RIGHT, + RC_DMC_DEKU_SCRUB_GROTTO_CENTER, + + // Zoras River + RC_ZR_OPEN_GROTTO_CHEST, + RC_ZR_MAGIC_BEAN_SALESMAN, + RC_ZR_FROGS_ZELDAS_LULLABY, + RC_ZR_FROGS_EPONAS_SONG, + RC_ZR_FROGS_SARIAS_SONG, + RC_ZR_FROGS_SUNS_SONG, + RC_ZR_FROGS_SONG_OF_TIME, + RC_ZR_FROGS_IN_THE_RAIN, + RC_ZR_FROGS_OCARINA_GAME, + RC_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, + RC_ZR_NEAR_DOMAIN_FREESTANDING_POH, + RC_ZR_DEKU_SCRUB_GROTTO_REAR, + RC_ZR_DEKU_SCRUB_GROTTO_FRONT, + + // Zoras Domain + RC_ZD_CHEST, + RC_ZD_DIVING_MINIGAME, + RC_ZD_KING_ZORA_THAWED, + RC_ZD_TRADE_PRESCRIPTION, + + // Zora's Domain Shop + RC_ZD_SHOP_ITEM_1, + RC_ZD_SHOP_ITEM_2, + RC_ZD_SHOP_ITEM_3, + RC_ZD_SHOP_ITEM_4, + RC_ZD_SHOP_ITEM_5, + RC_ZD_SHOP_ITEM_6, + RC_ZD_SHOP_ITEM_7, + RC_ZD_SHOP_ITEM_8, + + // Zoras Fountain + RC_ZF_ICEBERC_FREESTANDING_POH, + RC_ZF_BOTTOM_FREESTANDING_POH, + RC_ZF_GREAT_FAIRY_REWARD, + + // Lon Lon Ranch + RC_SONG_FROM_MALON, + RC_LLR_TALONS_CHICKENS, + RC_LLR_FREESTANDING_POH, + RC_LLR_DEKU_SCRUB_GROTTO_LEFT, + RC_LLR_DEKU_SCRUB_GROTTO_RIGHT, + RC_LLR_DEKU_SCRUB_GROTTO_CENTER, + RC_LLR_STABLES_LEFT_COW, + RC_LLR_STABLES_RIGHT_COW, + RC_LLR_TOWER_LEFT_COW, + RC_LLR_TOWER_RIGHT_COW, + + /*------------------------------- + --- GOLD SKULLTULA TOKENS --- + -------------------------------*/ + + // Overworld + RC_KF_GS_BEAN_PATCH, + RC_KF_GS_KNOW_IT_ALL_HOUSE, + RC_KF_GS_HOUSE_OF_TWINS, + + RC_LW_GS_BEAN_PATCH_NEAR_BRIDGE, + RC_LW_GS_BEAN_PATCH_NEAR_THEATER, + RC_LW_GS_ABOVE_THEATER, + RC_SFM_GS, + + RC_HF_GS_COW_GROTTO, + RC_HF_GS_NEAR_KAK_GROTTO, + + RC_LH_GS_BEAN_PATCH, + RC_LH_GS_SMALL_ISLAND, + RC_LH_GS_LAB_WALL, + RC_LH_GS_LAB_CRATE, + RC_LH_GS_TREE, + + RC_GV_GS_BEAN_PATCH, + RC_GV_GS_SMALL_BRIDGE, + RC_GV_GS_PILLAR, + RC_GV_GS_BEHIND_TENT, + + RC_GF_GS_ARCHERY_RANGE, + RC_GF_GS_TOP_FLOOR, + + RC_WASTELAND_GS, + RC_COLOSSUS_GS_BEAN_PATCH, + RC_COLOSSUS_GS_HILL, + RC_COLOSSUS_GS_TREE, + + RC_OGC_GS, + RC_HC_GS_STORMS_GROTTO, + RC_HC_GS_TREE, + RC_MARKET_GS_GUARD_HOUSE, + + RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION, + RC_KAK_GS_SKULLTULA_HOUSE, + RC_KAK_GS_GUARDS_HOUSE, + RC_KAK_GS_TREE, + RC_KAK_GS_WATCHTOWER, + RC_KAK_GS_ABOVE_IMPAS_HOUSE, + + RC_DMC_GS_BEAN_PATCH, + RC_DMC_GS_CRATE, + + RC_DMT_GS_BEAN_PATCH, + RC_DMT_GS_NEAR_KAK, + RC_DMT_GS_ABOVE_DODONGOS_CAVERN, + RC_DMT_GS_FALLING_ROCKS_PATH, + + RC_GC_GS_CENTER_PLATFORM, + RC_GC_GS_BOULDER_MAZE, + RC_GRAVEYARD_GS_WALL, + RC_GRAVEYARD_GS_BEAN_PATCH, + + RC_ZR_GS_LADDER, + RC_ZR_GS_TREE, + RC_ZR_GS_ABOVE_BRIDGE, + RC_ZR_GS_NEAR_RAISED_GROTTOS, + + RC_ZD_GS_FROZEN_WATERFALL, + RC_ZF_GS_ABOVE_THE_LOG, + RC_ZF_GS_HIDDEN_CAVE, + RC_ZF_GS_TREE, + + RC_LLR_GS_BACK_WALL, + RC_LLR_GS_RAIN_SHED, + RC_LLR_GS_HOUSE_WINDOW, + RC_LLR_GS_TREE, +}; + +std::vector Rando::StaticData::gossipStoneLocations = { + RC_COLOSSUS_GOSSIP_STONE, + RC_DMC_GOSSIP_STONE, + RC_DMC_UPPER_GROTTO_GOSSIP_STONE, + RC_DMT_GOSSIP_STONE, + RC_DMT_STORMS_GROTTO_GOSSIP_STONE, + RC_DODONGOS_CAVERN_GOSSIP_STONE, + RC_FAIRY_GOSSIP_STONE, + RC_GC_MAZE_GOSSIP_STONE, + RC_GC_MEDIGORON_GOSSIP_STONE, + RC_GV_GOSSIP_STONE, + RC_GY_GOSSIP_STONE, + RC_HC_MALON_GOSSIP_STONE, + RC_HC_ROCK_WALL_GOSSIP_STONE, + RC_HC_STORMS_GROTTO_GOSSIP_STONE, + RC_HF_COW_GROTTO_GOSSIP_STONE, + RC_HF_NEAR_MARKET_GOSSIP_STONE, + RC_HF_OPEN_GROTTO_GOSSIP_STONE, + RC_HF_SOUTHEAST_GOSSIP_STONE, + RC_JABU_GOSSIP_STONE, + RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE, + RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE, + RC_KF_GOSSIP_STONE, + RC_KF_STORMS_GOSSIP_STONE, + RC_KAK_OPEN_GROTTO_GOSSIP_STONE, + RC_LH_LAB_GOSSIP_STONE, + RC_LH_SOUTHEAST_GOSSIP_STONE, + RC_LH_SOUTHWEST_GOSSIP_STONE, + RC_LW_GOSSIP_STONE, + RC_LW_NEAR_SHORTCUTS_GOSSIP_STONE, + RC_SFM_MAZE_LOWER_GOSSIP_STONE, + RC_SFM_MAZE_UPPER_GOSSIP_STONE, + RC_SFM_SARIA_GOSSIP_STONE, + RC_TOT_LEFT_CENTER_GOSSIP_STONE, + RC_TOT_LEFT_GOSSIP_STONE, + RC_TOT_RIGHT_CENTER_GOSSIP_STONE, + RC_TOT_RIGHT_GOSSIP_STONE, + RC_ZD_GOSSIP_STONE, + RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, + RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, + RC_ZR_OPEN_GROTTO_GOSSIP_STONE, +}; + +typedef enum { + DUNGEON_DEKU_TREE = 0, + DUNGEON_DODONGOS_CAVERN, + DUNGEON_JABUJABUS_BELLY, + DUNGEON_FOREST_TEMPLE, + DUNGEON_FIRE_TEMPLE, + DUNGEON_WATER_TEMPLE, + DUNGEON_SPIRIT_TEMPLE, + DUNGEON_SHADOW_TEMPLE, + DUNGEON_BOTTOM_OF_THE_WELL, + DUNGEON_ICE_CAVERN, + DUNGEON_GANONS_CASTLE_SECOND_PART, + DUNGEON_GERUDO_TRAINING_GROUNDS, + DUNGEON_GERUDO_FORTRESS, + DUNGEON_GANONS_CASTLE_FIRST_PART, + DUNGEON_GANONS_CASTLE_FLOOR_BENEATH_BOSS_CHAMBER, + DUNGEON_GANONS_CASTLE_CRUMBLING, + DUNGEON_TREASURE_CHEST_SHOP, + DUNGEON_DEKU_TREE_BOSS_ROOM, + DUNGEON_DODONGOS_CAVERN_BOSS_ROOM, + DUNGEON_JABUJABUS_BELLY_BOSS_ROOM, +} DungeonId; + +using namespace Rando; + +void Rando::StaticData::InitLocationTable() { + // clang-format off + locationTable[RC_UNKNOWN_CHECK] = Location::Base(RC_UNKNOWN_CHECK, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_INVALID, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, 0x00, "Invalid Location", "Invalid Location", RHT_NONE, RG_NONE, {}, SpoilerCollectionCheck::None()); + // Randomizer Check Randomizer Check Quest Type Area Actor ID Scene ID Params Flags Short Name Spoiler Name Hint Text Key Vanilla Item Categories Spoiler Collection Check Collection Check Group Vanilla Progression + // Kokiri Forest + locationTable[RC_KF_KOKIRI_SWORD_CHEST] = Location::Chest(RC_KF_KOKIRI_SWORD_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, ACTOR_EN_BOX, SCENE_KOKIRI_FOREST, 1248, 0x00, "Kokiri Sword Chest", "KF Kokiri Sword Chest", RHT_KF_KOKIRI_SWORD_CHEST, RG_KOKIRI_SWORD, {}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST, true); + locationTable[RC_KF_MIDOS_TOP_LEFT_CHEST] = Location::Chest(RC_KF_MIDOS_TOP_LEFT_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, ACTOR_EN_BOX, SCENE_MIDOS_HOUSE, 22944, 0x00, "Mido Top Left Chest", "KF Mido Top Left Chest", RHT_KF_MIDOS_TOP_LEFT_CHEST, RG_BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_MIDOS_TOP_RIGHT_CHEST] = Location::Chest(RC_KF_MIDOS_TOP_RIGHT_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, ACTOR_EN_BOX, SCENE_MIDOS_HOUSE, 22945, 0x01, "Mido Top Right Chest", "KF Mido Top Right Chest", RHT_KF_MIDOS_TOP_RIGHT_CHEST, RG_BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_MIDOS_BOTTOM_LEFT_CHEST] = Location::Chest(RC_KF_MIDOS_BOTTOM_LEFT_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, ACTOR_EN_BOX, SCENE_MIDOS_HOUSE, 22914, 0x02, "Mido Bottom Left Chest", "KF Mido Bottom Left Chest", RHT_KF_MIDOS_BOTTOM_LEFT_CHEST, RG_GREG_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_MIDOS_BOTTOM_RIGHT_CHEST] = Location::Chest(RC_KF_MIDOS_BOTTOM_RIGHT_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, ACTOR_EN_BOX, SCENE_MIDOS_HOUSE, 22787, 0x03, "Mido Bottom Right Chest", "KF Mido Bottom Right Chest", RHT_KF_MIDOS_BOTTOM_RIGHT_CHEST, RG_RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_STORMS_GROTTO_CHEST] = Location::Chest(RC_KF_STORMS_GROTTO_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, ACTOR_EN_BOX, SCENE_GROTTOS, 22988, 0x0C, "Storms Grotto Chest", "KF Storms Grotto Chest", RHT_KF_STORMS_GROTTO_CHEST, RG_RED_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + // Lost Woods + locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_CHEST] = Location::Chest(RC_LW_NEAR_SHORTCUTS_GROTTO_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_LOST_WOODS, ACTOR_EN_BOX, SCENE_GROTTOS, 22964, 0x14, "Near Shortcuts Grotto Chest", "LW Near Shortcuts Grotto Chest", RHT_KF_STORMS_GROTTO_CHEST, RG_RED_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_LW_SKULL_KID] = Location::Base(RC_LW_SKULL_KID, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_LOST_WOODS, ACTOR_ID_MAX, SCENE_LOST_WOODS, 0x00, 0x3E, "Skull Kid", "LW Skull Kid", RHT_LW_SKULL_KID, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheck::ItemGetInf(30), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS, true); + locationTable[RC_LW_TRADE_COJIRO] = Location::Base(RC_LW_TRADE_COJIRO, RCQUEST_BOTH, RCTYPE_ADULT_TRADE, RCAREA_LOST_WOODS, ACTOR_ID_MAX, SCENE_LOST_WOODS, 0x00, 0x1F, "Trade Cojiro", "LW Trade Cojiro", RHT_LW_TRADE_COJIRO, RG_ODD_MUSHROOM, { Category::cAdultTrade }, SpoilerCollectionCheck::RandomizerInf(0x5B, 0x1F), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS, true); + locationTable[RC_LW_TRADE_ODD_POTION] = Location::Base(RC_LW_TRADE_ODD_POTION, RCQUEST_BOTH, RCTYPE_ADULT_TRADE, RCAREA_LOST_WOODS, ACTOR_ID_MAX, SCENE_LOST_WOODS, 0x00, 0x21, "Trade Odd Potion", "LW Trade Odd Potion", RHT_LW_TRADE_COJIRO, RG_POACHERS_SAW, { Category::cAdultTrade }, SpoilerCollectionCheck::ItemGetInf(57), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS, true); + locationTable[RC_LW_OCARINA_MEMORY_GAME] = Location::Base(RC_LW_OCARINA_MEMORY_GAME, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_LOST_WOODS, ACTOR_ID_MAX, SCENE_LOST_WOODS, 0x00, 0x21, "Ocarina Memory Game", "LW Ocarina Memory Game", RHT_LW_OCARINA_MEMORY_GAME, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheck::ItemGetInf(31), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS, true); + locationTable[RC_LW_TARGET_IN_WOODS] = Location::Base(RC_LW_TARGET_IN_WOODS, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_LOST_WOODS, ACTOR_ID_MAX, SCENE_LOST_WOODS, 0x00, 0x60, "Target in Woods", "LW Target in Woods", RHT_LW_TARGET_IN_WOODS, RG_PROGRESSIVE_SLINGSHOT, {}, SpoilerCollectionCheck::ItemGetInf(21), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS, true); + locationTable[RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT] = Location::Base(RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT,RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_LOST_WOODS, ACTOR_EN_DNS, SCENE_LOST_WOODS, 0x00, 0x30, "Deku Scrub Near Deku Theater Right","LW Deku Scrub Near Deku Theater Right",RHT_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT,RG_BUY_DEKU_NUT_5, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x5B, 0x01), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT] = Location::Base(RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_LOST_WOODS, ACTOR_EN_DNS, SCENE_LOST_WOODS, 0x01, 0x31, "Deku Scrub Near Deku Theater Left", "LW Deku Scrub Near Deku Theater Left", RHT_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT,RG_BUY_DEKU_STICK_1, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x5B, 0x02), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_DEKU_SCRUB_NEAR_BRIDGE] = Location::Base(RC_LW_DEKU_SCRUB_NEAR_BRIDGE, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_LOST_WOODS, ACTOR_EN_DNS, SCENE_LOST_WOODS, 0x09, 0x77, "Deku Scrub Near Bridge", "LW Deku Scrub Near Bridge", RHT_LW_DEKU_SCRUB_NEAR_BRIDGE, RG_PROGRESSIVE_STICK_UPGRADE,{ Category::cDekuScrub, Category::cDekuScrubUpgrades }, SpoilerCollectionCheck::Scrub(0x5B, 0x0A), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS, true); + locationTable[RC_LW_DEKU_SCRUB_GROTTO_REAR] = Location::GrottoScrub(RC_LW_DEKU_SCRUB_GROTTO_REAR, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_LOST_WOODS, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x03, 0xF5), 0x33, "Deku Scrub Grotto Rear", "LW Deku Scrub Grotto Rear", RHT_LW_DEKU_SCRUB_GROTTO_REAR, RG_BUY_DEKU_SEEDS_30, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x1F, 0x04), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_DEKU_SCRUB_GROTTO_FRONT] = Location::GrottoScrub(RC_LW_DEKU_SCRUB_GROTTO_FRONT, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_LOST_WOODS, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x0A, 0xF5), 0x79, "Deku Scrub Grotto Front", "LW Deku Scrub Grotto Front", RHT_LW_DEKU_SCRUB_GROTTO_FRONT, RG_PROGRESSIVE_NUT_UPGRADE,{ Category::cDekuScrub, Category::cDekuScrubUpgrades }, SpoilerCollectionCheck::Scrub(0x1F, 0x0B), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_DEKU_THEATER_SKULL_MASK] = Location::Base(RC_DEKU_THEATER_SKULL_MASK, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_LOST_WOODS, ACTOR_ID_MAX, SCENE_GROTTOS, 0x00, 0x77, "Deku Theater Skull Mask", "Deku Theater Skull Mask", RHT_DEKU_THEATER_SKULL_MASK, RG_PROGRESSIVE_STICK_UPGRADE,{}, SpoilerCollectionCheck::Chest(0x3E, 0x1F), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS, true); + locationTable[RC_DEKU_THEATER_MASK_OF_TRUTH] = Location::Base(RC_DEKU_THEATER_MASK_OF_TRUTH, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_LOST_WOODS, ACTOR_ID_MAX, SCENE_GROTTOS, 0x00, 0x7A, "Deku Theater Mask of Truth", "Deku Theater Mask of Truth", RHT_DEKU_THEATER_MASK_OF_TRUTH, RG_PROGRESSIVE_NUT_UPGRADE,{}, SpoilerCollectionCheck::Chest(0x3E, 0x1E), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS, true); + // Sacred Forest Meadow + locationTable[RC_SFM_WOLFOS_GROTTO_CHEST] = Location::Chest(RC_SFM_WOLFOS_GROTTO_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, ACTOR_EN_BOX, SCENE_GROTTOS, 31409, 0x11, "Wolfos Grotto Chest", "SFM Wolfos Grotto Chest", RHT_SFM_WOLFOS_GROTTO_CHEST, RG_PURPLE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_SFM_DEKU_SCRUB_GROTTO_REAR] = Location::GrottoScrub(RC_SFM_DEKU_SCRUB_GROTTO_REAR, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_SACRED_FOREST_MEADOW, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x07, 0xEE), 0x39, "Deku Scrub Grotto Rear", "SFM Deku Scrub Grotto Rear", RHT_SFM_DEKU_SCRUB_GROTTO_REAR, RG_BUY_RED_POTION_30, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x18, 0x08), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_SFM_DEKU_SCRUB_GROTTO_FRONT] = Location::GrottoScrub(RC_SFM_DEKU_SCRUB_GROTTO_FRONT, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_SACRED_FOREST_MEADOW, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x08, 0xEE), 0x3A, "Deku Scrub Grotto Front", "SFM Deku Scrub Grotto Front", RHT_SFM_DEKU_SCRUB_GROTTO_FRONT, RG_BUY_GREEN_POTION, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x18, 0x09), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + // Hyrule Field + locationTable[RC_HF_SOUTHEAST_GROTTO_CHEST] = Location::Chest(RC_HF_SOUTHEAST_GROTTO_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, ACTOR_EN_BOX, SCENE_GROTTOS, 22978, 0x02, "Southeast Grotto Chest", "HF Southeast Grotto Chest", RHT_HF_SOUTHEAST_GROTTO_CHEST, RG_RED_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_HF_OPEN_GROTTO_CHEST] = Location::Chest(RC_HF_OPEN_GROTTO_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, ACTOR_EN_BOX, SCENE_GROTTOS, 22947, 0x03, "Open Grotto Chest", "HF Open Grotto Chest", RHT_HF_OPEN_GROTTO_CHEST, RG_BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_HF_NEAR_MARKET_GROTTO_CHEST] = Location::Chest(RC_HF_NEAR_MARKET_GROTTO_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, ACTOR_EN_BOX, SCENE_GROTTOS, 22944, 0x00, "Near Market Grotto Chest", "HF Near Market Grotto Chest", RHT_HF_NEAR_MARKET_GROTTO_CHEST, RG_BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_HF_OCARINA_OF_TIME_ITEM] = Location::Base(RC_HF_OCARINA_OF_TIME_ITEM, RCQUEST_BOTH, RCTYPE_OCARINA, RCAREA_HYRULE_FIELD, ACTOR_ID_MAX, SCENE_HYRULE_FIELD, 0x00, 0x0C, "Ocarina of Time Item", "HF Ocarina of Time Item", RHT_HF_OCARINA_OF_TIME_ITEM, RG_PROGRESSIVE_OCARINA, {}, SpoilerCollectionCheck::EventChkInf(0x43), SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_HF_TEKTITE_GROTTO_FREESTANDING_POH] = Location::Collectable(RC_HF_TEKTITE_GROTTO_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, ACTOR_EN_ITEM00, SCENE_GROTTOS, 262, 0x01, "Tektite Grotto Freestanding PoH", "HF Tektite Grotto Freestanding PoH", RHT_HF_TEKTITE_GROTTO_FREESTANDING_POH, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD, true); + locationTable[RC_HF_DEKU_SCRUB_GROTTO] = Location::GrottoScrub(RC_HF_DEKU_SCRUB_GROTTO, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_HYRULE_FIELD, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x02, 0xE6), 0x3E, "Deku Scrub Grotto", "HF Deku Scrub Grotto", RHT_HF_DEKU_SCRUB_GROTTO, RG_PIECE_OF_HEART, { Category::cDekuScrub, Category::cDekuScrubUpgrades }, SpoilerCollectionCheck::Scrub(0x10, 0x03), SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD, true); + // Lake Hylia + locationTable[RC_LH_CHILD_FISHING] = Location::Base(RC_LH_CHILD_FISHING, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, ACTOR_ID_MAX, SCENE_FISHING_POND, 0x00, 0x3E, "Child Fishing", "LH Child Fishing", RHT_LH_CHILD_FISHING, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheck::RandomizerInf(SCENE_FISHING_POND, RAND_INF_CHILD_FISHING), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA, true); + locationTable[RC_LH_ADULT_FISHING] = Location::Base(RC_LH_ADULT_FISHING, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, ACTOR_ID_MAX, SCENE_FISHING_POND, 0x00, 0x38, "Adult Fishing", "LH Adult Fishing", RHT_LH_ADULT_FISHING, RG_PROGRESSIVE_SCALE, {}, SpoilerCollectionCheck::RandomizerInf(SCENE_FISHING_POND, RAND_INF_ADULT_FISHING), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA, true); + locationTable[RC_LH_LAB_DIVE] = Location::Base(RC_LH_LAB_DIVE, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, ACTOR_ID_MAX, SCENE_LAKESIDE_LABORATORY, 0x00, 0x3E, "Lab Dive", "LH Lab Dive", RHT_LH_LAB_DIVE, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheck::ItemGetInf(24), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA, true); + locationTable[RC_LH_TRADE_FROG] = Location::Base(RC_LH_TRADE_FROG, RCQUEST_BOTH, RCTYPE_ADULT_TRADE, RCAREA_LAKE_HYLIA, ACTOR_ID_MAX, SCENE_LAKESIDE_LABORATORY, 0x00, 0x25, "Lab Trade Eyeball Frog", "LH Lab Trade Eyeball Frog", RHT_LH_TRADE_FROG, RG_EYEDROPS, { Category::cAdultTrade }, SpoilerCollectionCheck::RandomizerInf(0x38, 0x1F), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA, true); + locationTable[RC_LH_UNDERWATER_ITEM] = Location::Base(RC_LH_UNDERWATER_ITEM, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, ACTOR_ID_MAX, SCENE_LAKE_HYLIA, 0x00, 0x15, "Underwater Item", "LH Underwater Item", RHT_LH_UNDERWATER_ITEM, RG_RUTOS_LETTER, {}, SpoilerCollectionCheck::EventChkInf(0x31), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA, true); + locationTable[RC_LH_SUN] = Location::Base(RC_LH_SUN, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, ACTOR_ID_MAX, SCENE_LAKE_HYLIA, 0x00, 0x58, "Sun", "LH Sun", RHT_LH_SUN, RG_FIRE_ARROWS, {}, SpoilerCollectionCheck::Chest(0x57, 0x1F), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA, true); + locationTable[RC_LH_FREESTANDING_POH] = Location::Collectable(RC_LH_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, ACTOR_EN_ITEM00, SCENE_LAKE_HYLIA, 7686, 0x1E, "Freestanding PoH", "LH Freestanding PoH", RHT_LH_FREESTANDING_POH, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA, true); + locationTable[RC_LH_DEKU_SCRUB_GROTTO_LEFT] = Location::GrottoScrub(RC_LH_DEKU_SCRUB_GROTTO_LEFT, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_LAKE_HYLIA, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x00, 0xEF), 0x30, "Deku Scrub Grotto Left", "LH Deku Scrub Grotto Left", RHT_LH_DEKU_SCRUB_GROTTO_LEFT, RG_BUY_DEKU_NUT_5, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x19, 0x01), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[RC_LH_DEKU_SCRUB_GROTTO_RIGHT] = Location::GrottoScrub(RC_LH_DEKU_SCRUB_GROTTO_RIGHT, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_LAKE_HYLIA, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x05, 0xEF), 0x37, "Deku Scrub Grotto Right", "LH Deku Scrub Grotto Right", RHT_LH_DEKU_SCRUB_GROTTO_RIGHT, RG_BUY_BOMBS_535, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x19, 0x06), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[RC_LH_DEKU_SCRUB_GROTTO_CENTER] = Location::GrottoScrub(RC_LH_DEKU_SCRUB_GROTTO_CENTER, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_LAKE_HYLIA, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x03, 0xEF), 0x33, "Deku Scrub Grotto Center", "LH Deku Scrub Grotto Center", RHT_LH_DEKU_SCRUB_GROTTO_CENTER, RG_BUY_DEKU_SEEDS_30, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x19, 0x04), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + // Gerudo Valley + locationTable[RC_GV_CHEST] = Location::Chest(RC_GV_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, ACTOR_EN_BOX, SCENE_GERUDO_VALLEY, 23200, 0x00, "Chest", "GV Chest", RHT_GV_CHEST, RG_PURPLE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GV_TRADE_SAW] = Location::Base(RC_GV_TRADE_SAW, RCQUEST_BOTH, RCTYPE_ADULT_TRADE, RCAREA_GERUDO_VALLEY, ACTOR_ID_MAX, SCENE_GERUDO_VALLEY, 0x00, 0x22, "Trade Saw", "GV Trade Saw", RHT_GV_TRADE_SAW, RG_BROKEN_SWORD, { Category::cAdultTrade }, SpoilerCollectionCheck::RandomizerInf(0x5A, 0x1F), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY, true); + locationTable[RC_GV_WATERFALL_FREESTANDING_POH] = Location::Collectable(RC_GV_WATERFALL_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, ACTOR_EN_ITEM00, SCENE_GERUDO_VALLEY, 262, 0x01, "Waterfall Freestanding PoH", "GV Waterfall Freestanding PoH", RHT_GV_WATERFALL_FREESTANDING_POH, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY, true); + locationTable[RC_GV_CRATE_FREESTANDING_POH] = Location::Collectable(RC_GV_CRATE_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, ACTOR_EN_ITEM00, SCENE_GERUDO_VALLEY, 518, 0x02, "Crate Freestanding PoH", "GV Crate Freestanding PoH", RHT_GV_CRATE_FREESTANDING_POH, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY, true); + locationTable[RC_GV_DEKU_SCRUB_GROTTO_REAR] = Location::GrottoScrub(RC_GV_DEKU_SCRUB_GROTTO_REAR, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_GERUDO_VALLEY, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x07, 0xF0), 0x39, "Deku Scrub Grotto Rear", "GV Deku Scrub Grotto Rear", RHT_GV_DEKU_SCRUB_GROTTO_FRONT, RG_BUY_GREEN_POTION, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x1A, 0x09), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GV_DEKU_SCRUB_GROTTO_FRONT] = Location::GrottoScrub(RC_GV_DEKU_SCRUB_GROTTO_FRONT, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_GERUDO_VALLEY, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x08, 0xF0), 0x3A, "Deku Scrub Grotto Front", "GV Deku Scrub Grotto Front", RHT_GV_DEKU_SCRUB_GROTTO_FRONT, RG_BUY_GREEN_POTION, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x1A, 0x09), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + // Gerudo Fortress + locationTable[RC_GF_CHEST] = Location::Chest(RC_GF_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, ACTOR_EN_BOX, SCENE_GERUDOS_FORTRESS, 1984, 0x00, "Chest", "GF Chest", RHT_GF_CHEST, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY, true); + locationTable[RC_GF_HBA_1000_POINTS] = Location::Base(RC_GF_HBA_1000_POINTS, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, ACTOR_ID_MAX, SCENE_GERUDOS_FORTRESS, 0x00, 0x3E, "GF HBA 1000 Points", "GF HBA 1000 Points", RHT_GF_HBA_1000_POINTS, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheck::InfTable(0x19, 0x08), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY, true); + locationTable[RC_GF_HBA_1500_POINTS] = Location::Base(RC_GF_HBA_1500_POINTS, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, ACTOR_ID_MAX, SCENE_GERUDOS_FORTRESS, 0x00, 0x30, "GF HBA 1500 Points", "GF HBA 1500 Points", RHT_GF_HBA_1500_POINTS, RG_PROGRESSIVE_BOW, {}, SpoilerCollectionCheck::ItemGetInf(7), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY, true); + // RandoTodo: Do we replace these with the RC_HIDEOUT keys or keep these? + locationTable[RC_GF_GERUDO_MEMBERSHIP_CARD] = Location::Base(RC_GF_GERUDO_MEMBERSHIP_CARD, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, ACTOR_ID_MAX, SCENE_THIEVES_HIDEOUT, 0x00, 0x3A, "GF Gerudo Membership Card", "GF Gerudo Membership Card", RHT_GF_GERUDO_MEMBERSHIP_CARD, RG_GERUDO_MEMBERSHIP_CARD,{}, SpoilerCollectionCheck::GerudoToken(), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY, true); + locationTable[RC_GF_NORTH_F1_CARPENTER] = Location::Collectable(RC_GF_NORTH_F1_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, RCAREA_GERUDO_FORTRESS, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 3089, 0x0C, "GF North F1 Carpenter", "GF North F1 Carpenter", RHT_GF_NORTH_F1_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY,{ Category::cVanillaGFSmallKey }, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY, true); + locationTable[RC_GF_NORTH_F2_CARPENTER] = Location::Collectable(RC_GF_NORTH_F2_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, RCAREA_GERUDO_FORTRESS, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 2577, 0x0A, "GF North F2 Carpenter", "GF North F2 Carpenter", RHT_GF_NORTH_F2_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY,{ Category::cVanillaGFSmallKey }, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY, true); + locationTable[RC_GF_SOUTH_F1_CARPENTER] = Location::Collectable(RC_GF_SOUTH_F1_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, RCAREA_GERUDO_FORTRESS, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 3601, 0x0E, "GF South F1 Carpenter", "GF South F1 Carpenter", RHT_GF_SOUTH_F1_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY,{ Category::cVanillaGFSmallKey }, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY, true); + locationTable[RC_GF_SOUTH_F2_CARPENTER] = Location::Collectable(RC_GF_SOUTH_F2_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, RCAREA_GERUDO_FORTRESS, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 3857, 0x0F, "GF South F2 Carpenter", "GF South F2 Carpenter", RHT_GF_SOUTH_F2_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY,{ Category::cVanillaGFSmallKey }, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY, true); + // Haunted Wasteland + locationTable[RC_WASTELAND_CHEST] = Location::Chest(RC_WASTELAND_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_WASTELAND, ACTOR_EN_BOX, SCENE_HAUNTED_WASTELAND, -30048, 0x00, "Chest", "Wasteland Chest", RHT_WASTELAND_CHEST, RG_PURPLE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_WASTELAND_BOMBCHU_SALESMAN] = Location::Base(RC_WASTELAND_BOMBCHU_SALESMAN, RCQUEST_BOTH, RCTYPE_MERCHANT, RCAREA_WASTELAND, ACTOR_ID_MAX, SCENE_HAUNTED_WASTELAND, 0x00, 0x03, "Carpet Salesman", "Wasteland Carpet Salesman", RHT_WASTELAND_BOMBCHU_SALESMAN, RG_BOMBCHU_10, { Category::cMerchant }, SpoilerCollectionCheck::Merchant(0x5E, 0x86), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + // Desert Colossus + locationTable[RC_COLOSSUS_FREESTANDING_POH] = Location::Collectable(RC_COLOSSUS_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, ACTOR_EN_ITEM00, SCENE_DESERT_COLOSSUS, 3334, 0x0D, "Freestanding PoH", "Colossus Freestanding PoH", RHT_COLOSSUS_FREESTANDING_POH, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY, true); + locationTable[RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR] = Location::GrottoScrub(RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_DESERT_COLOSSUS, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x07, 0xFD), 0x39, "Deku Scrub Grotto Rear", "Colossus Deku Scrub Grotto Rear", RHT_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, RG_BUY_RED_POTION_30, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x27, 0x08), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT] = Location::GrottoScrub(RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_DESERT_COLOSSUS, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x08, 0xFD), 0x3A, "Deku Scrub Grotto Front", "Colossus Deku Scrub Grotto Front", RHT_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, RG_BUY_GREEN_POTION, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x27, 0x09), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + // Market + locationTable[RC_MARKET_TREASURE_CHEST_GAME_REWARD] = Location::Chest(RC_MARKET_TREASURE_CHEST_GAME_REWARD, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_MARKET, ACTOR_EN_BOX, SCENE_TREASURE_BOX_SHOP, 0x00, 0x0A, "Treasure Chest Game Reward", "MK Treasure Chest Game Reward", RHT_MARKET_TREASURE_CHEST_GAME_REWARD, RG_TREASURE_GAME_HEART, {}, SpoilerCollectionCheck::ItemGetInf(19), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE, true); + locationTable[RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE] = Location::Base(RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_BOMBCHU_BOWLING_ALLEY, 0x00, 0x33, "Bombchu Bowling First Prize", "MK Bombchu Bowling First Prize", RHT_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, RG_PROGRESSIVE_BOMB_BAG, {}, SpoilerCollectionCheck::ItemGetInf(25), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE, true); + locationTable[RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE] = Location::Base(RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_BOMBCHU_BOWLING_ALLEY, 0x00, 0x3E, "Bombchu Bowling Second Prize", "MK Bombchu Bowling Second Prize", RHT_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheck::ItemGetInf(26), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE, true); + locationTable[RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS] = Location::Base(RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_BOMBCHU_BOWLING_ALLEY, 0x00, 0x00, "Bombchu Bowling Bombchus", "MK Bombchu Bowling Bombchus", RHT_MARKET_BOMBCHU_BOWLING_BOMBCHUS, RG_BOMBCHU_DROP, {}, SpoilerCollectionCheck::None(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_MARKET_LOST_DOG] = Location::Base(RC_MARKET_LOST_DOG, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_DOG_LADY_HOUSE, 0x00, 0x3E, "Lost Dog", "MK Lost Dog", RHT_MARKET_LOST_DOG, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheck::InfTable(0x19, 0x09), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE, true); + locationTable[RC_MARKET_SHOOTING_GALLERY_REWARD] = Location::Base(RC_MARKET_SHOOTING_GALLERY_REWARD, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_SHOOTING_GALLERY, 0x00, 0x60, "Shooting Gallery", "MK Shooting Gallery", RHT_MARKET_SHOOTING_GALLERY_REWARD, RG_PROGRESSIVE_SLINGSHOT, {}, SpoilerCollectionCheck::ItemGetInf(5), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE, true); + locationTable[RC_MARKET_10_BIG_POES] = Location::Base(RC_MARKET_10_BIG_POES, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_MARKET_GUARD_HOUSE, 0x00, 0x0F, "10 Big Poes", "MK 10 Big Poes", RHT_MARKET_10_BIG_POES, RG_EMPTY_BOTTLE, {}, SpoilerCollectionCheck::RandomizerInf(SCENE_MARKET_GUARD_HOUSE, RAND_INF_10_BIG_POES), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE, true); + locationTable[RC_MARKET_TREASURE_CHEST_GAME_ITEM_1] = Location::Chest(RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, RCQUEST_BOTH, RCTYPE_CHEST_GAME, RCAREA_MARKET, ACTOR_EN_BOX, SCENE_TREASURE_BOX_SHOP, 0x00, 0x01, "Chest Game First Room Chest", "MK Chest Game First Room Chest", RHT_MARKET_TREASURE_CHEST_GAME_ITEM_1, RG_TREASURE_GAME_SMALL_KEY,{ Category::cChestMinigame }, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_MARKET_TREASURE_CHEST_GAME_ITEM_2] = Location::Chest(RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, RCQUEST_BOTH, RCTYPE_CHEST_GAME, RCAREA_MARKET, ACTOR_EN_BOX, SCENE_TREASURE_BOX_SHOP, 0x00, 0x03, "Chest Game Second Room Chest", "MK Chest Game Second Room Chest", RHT_MARKET_TREASURE_CHEST_GAME_ITEM_2, RG_TREASURE_GAME_SMALL_KEY,{ Category::cChestMinigame }, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_MARKET_TREASURE_CHEST_GAME_ITEM_3] = Location::Chest(RC_MARKET_TREASURE_CHEST_GAME_ITEM_3, RCQUEST_BOTH, RCTYPE_CHEST_GAME, RCAREA_MARKET, ACTOR_EN_BOX, SCENE_TREASURE_BOX_SHOP, 0x00, 0x05, "Chest Game Third Room Chest", "MK Chest Game Third Room Chest", RHT_MARKET_TREASURE_CHEST_GAME_ITEM_3, RG_TREASURE_GAME_SMALL_KEY,{ Category::cChestMinigame }, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_MARKET_TREASURE_CHEST_GAME_ITEM_4] = Location::Chest(RC_MARKET_TREASURE_CHEST_GAME_ITEM_4, RCQUEST_BOTH, RCTYPE_CHEST_GAME, RCAREA_MARKET, ACTOR_EN_BOX, SCENE_TREASURE_BOX_SHOP, 0x00, 0x07, "Chest Game Fourth Room Chest", "MK Chest Game Fourth Room Chest", RHT_MARKET_TREASURE_CHEST_GAME_ITEM_4, RG_TREASURE_GAME_SMALL_KEY,{ Category::cChestMinigame }, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_MARKET_TREASURE_CHEST_GAME_ITEM_5] = Location::Chest(RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, RCQUEST_BOTH, RCTYPE_CHEST_GAME, RCAREA_MARKET, ACTOR_EN_BOX, SCENE_TREASURE_BOX_SHOP, 0x00, 0x09, "Chest Game Fifth Room Chest", "MK Chest Game Fifth Room Chest", RHT_MARKET_TREASURE_CHEST_GAME_ITEM_5, RG_TREASURE_GAME_SMALL_KEY,{ Category::cChestMinigame }, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + // Hyrule Castle + locationTable[RC_HC_MALON_EGG] = Location::Base(RC_HC_MALON_EGG, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, ACTOR_ID_MAX, SCENE_HYRULE_CASTLE, 0x00, 0x47, "Malon Egg", "HC Malon Egg", RHT_HC_MALON_EGG, RG_WEIRD_EGG, {}, SpoilerCollectionCheck::EventChkInf(0x12), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE, true); + locationTable[RC_HC_ZELDAS_LETTER] = Location::Base(RC_HC_ZELDAS_LETTER, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, ACTOR_ID_MAX, SCENE_CASTLE_COURTYARD_ZELDA, 0x00, 0x0B, "Zeldas Letter", "HC Zeldas Letter", RHT_HC_ZELDAS_LETTER, RG_ZELDAS_LETTER, {}, SpoilerCollectionCheck::EventChkInf(0x40), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE, true); + // Kakariko + locationTable[RC_KAK_REDEAD_GROTTO_CHEST] = Location::Chest(RC_KAK_REDEAD_GROTTO_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_BOX, SCENE_GROTTOS, 31434, 0x0A, "Redead Grotto Chest", "Kak Redead Grotto Chest", RHT_KAK_REDEAD_GROTTO_CHEST, RG_HUGE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_KAK_OPEN_GROTTO_CHEST] = Location::Chest(RC_KAK_OPEN_GROTTO_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_BOX, SCENE_GROTTOS, 22984, 0x08, "Open Grotto Chest", "Kak Open Grotto Chest", RHT_KAK_OPEN_GROTTO_CHEST, RG_RED_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_KAK_10_GOLD_SKULLTULA_REWARD] = Location::Base(RC_KAK_10_GOLD_SKULLTULA_REWARD, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, ACTOR_ID_MAX, SCENE_HOUSE_OF_SKULLTULA, 0x00, 0x45, "10 Gold Skulltula Reward", "Kak 10 Gold Skulltula Reward", RHT_KAK_10_GOLD_SKULLTULA_REWARD, RG_PROGRESSIVE_WALLET, {}, SpoilerCollectionCheck::EventChkInf(0xDA), SpoilerCollectionCheckGroup::GROUP_KAKARIKO, true); + locationTable[RC_KAK_20_GOLD_SKULLTULA_REWARD] = Location::Base(RC_KAK_20_GOLD_SKULLTULA_REWARD, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, ACTOR_ID_MAX, SCENE_HOUSE_OF_SKULLTULA, 0x00, 0x39, "20 Gold Skulltula Reward", "Kak 20 Gold Skulltula Reward", RHT_KAK_20_GOLD_SKULLTULA_REWARD, RG_STONE_OF_AGONY, {}, SpoilerCollectionCheck::EventChkInf(0xDB), SpoilerCollectionCheckGroup::GROUP_KAKARIKO, true); + locationTable[RC_KAK_30_GOLD_SKULLTULA_REWARD] = Location::Base(RC_KAK_30_GOLD_SKULLTULA_REWARD, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, ACTOR_ID_MAX, SCENE_HOUSE_OF_SKULLTULA, 0x00, 0x46, "30 Gold Skulltula Reward", "Kak 30 Gold Skulltula Reward", RHT_KAK_30_GOLD_SKULLTULA_REWARD, RG_PROGRESSIVE_WALLET, {}, SpoilerCollectionCheck::EventChkInf(0xDC), SpoilerCollectionCheckGroup::GROUP_KAKARIKO, true); + locationTable[RC_KAK_40_GOLD_SKULLTULA_REWARD] = Location::Base(RC_KAK_40_GOLD_SKULLTULA_REWARD, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, ACTOR_ID_MAX, SCENE_HOUSE_OF_SKULLTULA, 0x00, 0x03, "40 Gold Skulltula Reward", "Kak 40 Gold Skulltula Reward", RHT_KAK_40_GOLD_SKULLTULA_REWARD, RG_BOMBCHU_10, {}, SpoilerCollectionCheck::EventChkInf(0xDD), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_KAK_50_GOLD_SKULLTULA_REWARD] = Location::Base(RC_KAK_50_GOLD_SKULLTULA_REWARD, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, ACTOR_ID_MAX, SCENE_HOUSE_OF_SKULLTULA, 0x00, 0x3E, "50 Gold Skulltula Reward", "Kak 50 Gold Skulltula Reward", RHT_KAK_50_GOLD_SKULLTULA_REWARD, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheck::EventChkInf(0xDE), SpoilerCollectionCheckGroup::GROUP_KAKARIKO, true); + locationTable[RC_KAK_100_GOLD_SKULLTULA_REWARD] = Location::Base(RC_KAK_100_GOLD_SKULLTULA_REWARD, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, ACTOR_ID_MAX, SCENE_HOUSE_OF_SKULLTULA, 0x00, 0x3E, "100 Gold Skulltula Reward", "Kak 100 Gold Skulltula Reward", RHT_KAK_100_GOLD_SKULLTULA_REWARD, RG_HUGE_RUPEE, {}, SpoilerCollectionCheck::EventChkInf(0xDF), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_KAK_MAN_ON_ROOF] = Location::Base(RC_KAK_MAN_ON_ROOF, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, ACTOR_ID_MAX, SCENE_KAKARIKO_VILLAGE, 0x00, 0x3E, "Man on Roof", "Kak Man on Roof", RHT_KAK_MAN_ON_ROOF, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheck::ItemGetInf(29), SpoilerCollectionCheckGroup::GROUP_KAKARIKO, true); + locationTable[RC_KAK_SHOOTING_GALLERY_REWARD] = Location::Base(RC_KAK_SHOOTING_GALLERY_REWARD, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, ACTOR_ID_MAX, SCENE_SHOOTING_GALLERY, 0x00, 0x30, "Shooting Gallery Reward", "Kak Shooting Gallery Reward", RHT_KAK_SHOOTING_GALLERY_REWARD, RG_PROGRESSIVE_BOW, {}, SpoilerCollectionCheck::Chest(0x42, 0x1F), SpoilerCollectionCheckGroup::GROUP_KAKARIKO, true); + locationTable[RC_KAK_TRADE_ODD_MUSHROOM] = Location::Base(RC_KAK_TRADE_ODD_MUSHROOM, RCQUEST_BOTH, RCTYPE_ADULT_TRADE, RCAREA_KAKARIKO_VILLAGE, ACTOR_ID_MAX, SCENE_POTION_SHOP_GRANNY, 0x00, 0x20, "Trade Odd Mushroom", "Kak Trade Odd Mushroom", RHT_KAK_TRADE_ODD_MUSHROOM, RG_ODD_POTION, { Category::cAdultTrade }, SpoilerCollectionCheck::ItemGetInf(56), SpoilerCollectionCheckGroup::GROUP_KAKARIKO, true); + locationTable[RC_KAK_GRANNYS_SHOP] = Location::Base(RC_KAK_GRANNYS_SHOP, RCQUEST_BOTH, RCTYPE_MERCHANT, RCAREA_KAKARIKO_VILLAGE, ACTOR_ID_MAX, SCENE_POTION_SHOP_GRANNY, 0x00, 0x4E, "Granny's Shop", "Kak Granny's Shop", RHT_KAK_GRANNYS_SHOP, RG_BUY_BLUE_POTION, {}, SpoilerCollectionCheck::RandomizerInf(SCENE_POTION_SHOP_GRANNY, RAND_INF_MERCHANTS_GRANNYS_SHOP), SpoilerCollectionCheckGroup::GROUP_KAKARIKO, true); + locationTable[RC_KAK_ANJU_AS_ADULT] = Location::Base(RC_KAK_ANJU_AS_ADULT, RCQUEST_BOTH, RCTYPE_ADULT_TRADE, RCAREA_KAKARIKO_VILLAGE, ACTOR_ID_MAX, SCENE_KAKARIKO_VILLAGE, 0x00, 0x1D, "Anju as Adult", "Kak Anju as Adult", RHT_KAK_ANJU_AS_ADULT, RG_CLAIM_CHECK, {}, SpoilerCollectionCheck::ItemGetInf(36), SpoilerCollectionCheckGroup::GROUP_KAKARIKO, true); + locationTable[RC_KAK_ANJU_AS_CHILD] = Location::Base(RC_KAK_ANJU_AS_CHILD, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, ACTOR_ID_MAX, SCENE_KAKARIKO_VILLAGE, 0x00, 0x0F, "Anju as Child", "Kak Anju as Child", RHT_KAK_ANJU_AS_CHILD, RG_EMPTY_BOTTLE, {}, SpoilerCollectionCheck::ItemGetInf(4), SpoilerCollectionCheckGroup::GROUP_KAKARIKO, true); + locationTable[RC_KAK_TRADE_POCKET_CUCCO] = Location::Base(RC_KAK_TRADE_POCKET_CUCCO, RCQUEST_BOTH, RCTYPE_ADULT_TRADE, RCAREA_KAKARIKO_VILLAGE, ACTOR_ID_MAX, SCENE_KAKARIKO_VILLAGE, 0x00, 0x0E, "Trade Pocket Cucco", "Kak Trade Pocket Cucco", RHT_KAK_TRADE_POCKET_CUCCO, RG_COJIRO, { Category::cAdultTrade }, SpoilerCollectionCheck::ItemGetInf(38), SpoilerCollectionCheckGroup::GROUP_KAKARIKO, true); + locationTable[RC_KAK_IMPAS_HOUSE_FREESTANDING_POH] = Location::Collectable(RC_KAK_IMPAS_HOUSE_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_ITEM00, SCENE_IMPAS_HOUSE, 262, 0x01, "Impas House Freestanding PoH", "Kak Impas House Freestanding PoH", RHT_KAK_IMPAS_HOUSE_FREESTANDING_POH, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO, true); + locationTable[RC_KAK_WINDMILL_FREESTANDING_POH] = Location::Collectable(RC_KAK_WINDMILL_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, 262, 0x01, "Windmill Freestanding PoH", "Kak Windmill Freestanding PoH", RHT_KAK_WINDMILL_FREESTANDING_POH, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO, true); + // Graveyard + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_CHEST] = Location::Chest(RC_GRAVEYARD_SHIELD_GRAVE_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_GRAVEYARD, ACTOR_EN_BOX, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN,21824, 0x00, "Shield Grave Chest", "GY Shield Grave Chest", RHT_GRAVEYARD_SHIELD_GRAVE_CHEST, RG_HYLIAN_SHIELD, {}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_HEART_PIECE_GRAVE_CHEST] = Location::Chest(RC_GRAVEYARD_HEART_PIECE_GRAVE_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_GRAVEYARD, ACTOR_EN_BOX, SCENE_REDEAD_GRAVE, -22592, 0x00, "Heart Piece Grave Chest", "GY Heart Piece Grave Chest", RHT_GRAVEYARD_HEART_PIECE_GRAVE_CHEST, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO, true); + locationTable[RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST] = Location::Chest(RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_GRAVEYARD, ACTOR_EN_BOX, SCENE_ROYAL_FAMILYS_TOMB, -32736, 0x00, "Composers Grave Chest", "GY Composers Grave Chest", RHT_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST, RG_BOMBS_5, {}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_HOOKSHOT_CHEST] = Location::Chest(RC_GRAVEYARD_HOOKSHOT_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_GRAVEYARD, ACTOR_EN_BOX, SCENE_WINDMILL_AND_DAMPES_GRAVE, 4352, 0x00, "Hookshot Chest", "GY Hookshot Chest", RHT_GRAVEYARD_HOOKSHOT_CHEST, RG_PROGRESSIVE_HOOKSHOT, {}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO, true); + locationTable[RC_GRAVEYARD_FREESTANDING_POH] = Location::Collectable(RC_GRAVEYARD_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_GRAVEYARD, 1030, 0x04, "Freestanding PoH", "GY Freestanding PoH", RHT_GRAVEYARD_FREESTANDING_POH, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO, true); + locationTable[RC_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH] =Location::Collectable(RC_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH,RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, 1798, 0x07, "Dampe Race Freestanding PoH", "GY Dampe Race Freestanding PoH", RHT_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH,RG_PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO, true); + locationTable[RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR] = Location::Collectable(RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_GRAVEYARD, 7942, 0x08, "Dampe Gravedigging Tour", "GY Dampe Gravedigging Tour", RHT_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheck::Gravedigger(0x53, 0x1F), SpoilerCollectionCheckGroup::GROUP_KAKARIKO, true); + // Death Mountain + locationTable[RC_DMT_CHEST] = Location::Chest(RC_DMT_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_BOX, SCENE_DEATH_MOUNTAIN_TRAIL, 23201, 0x01, "Chest", "DMT Chest", RHT_DMT_CHEST, RG_PURPLE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_STORMS_GROTTO_CHEST] = Location::Chest(RC_DMT_STORMS_GROTTO_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_BOX, SCENE_GROTTOS, 23255, 0x17, "Storms Grotto Chest", "DMT Storms Grotto Chest", RHT_DMT_STORMS_GROTTO_CHEST, RG_HUGE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_TRADE_BROKEN_SWORD] = Location::Base(RC_DMT_TRADE_BROKEN_SWORD, RCQUEST_BOTH, RCTYPE_ADULT_TRADE, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_ID_MAX, SCENE_DEATH_MOUNTAIN_TRAIL, 0x00, 0x23, "Trade Broken Sword", "DMT Trade Broken Sword", RHT_DMT_TRADE_BROKEN_SWORD, RG_PRESCRIPTION, { Category::cAdultTrade }, SpoilerCollectionCheck::RandomizerInf(0x60, 0x1D), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN, true); + locationTable[RC_DMT_TRADE_EYEDROPS] = Location::Base(RC_DMT_TRADE_EYEDROPS, RCQUEST_BOTH, RCTYPE_ADULT_TRADE, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_ID_MAX, SCENE_DEATH_MOUNTAIN_TRAIL, 0x00, 0x26, "Trade Eyedrops", "DMT Trade Eyedrops", RHT_DMT_TRADE_EYEDROPS, RG_CLAIM_CHECK, { Category::cAdultTrade }, SpoilerCollectionCheck::RandomizerInf(0x60, 0x1E), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN, true); + locationTable[RC_DMT_TRADE_CLAIM_CHECK] = Location::Base(RC_DMT_TRADE_CLAIM_CHECK, RCQUEST_BOTH, RCTYPE_ADULT_TRADE, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_ID_MAX, SCENE_DEATH_MOUNTAIN_TRAIL, 0x00, 0x57, "Trade Claim Check", "DMT Trade Claim Check", RHT_DMT_TRADE_CLAIM_CHECK, RG_BIGGORON_SWORD, {}, SpoilerCollectionCheck::Chest(0x60, 0x1F), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN, true); + locationTable[RC_DMT_FREESTANDING_POH] = Location::Collectable(RC_DMT_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_TRAIL, 7686, 0x1E, "Freestanding PoH", "DMT Freestanding PoH", RHT_DMT_FREESTANDING_POH, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN, true); + // Goron City + locationTable[RC_GC_MAZE_LEFT_CHEST] = Location::Chest(RC_GC_MAZE_LEFT_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_GORON_CITY, ACTOR_EN_BOX, SCENE_GORON_CITY, 23232, 0x00, "Maze Left Chest", "GC Maze Left Chest", RHT_GC_MAZE_LEFT_CHEST, RG_HUGE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[RC_GC_MAZE_RIGHT_CHEST] = Location::Chest(RC_GC_MAZE_RIGHT_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_GORON_CITY, ACTOR_EN_BOX, SCENE_GORON_CITY, 23201, 0x01, "Maze Right Chest", "GC Maze Right Chest", RHT_GC_MAZE_RIGHT_CHEST, RG_PURPLE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[RC_GC_MAZE_CENTER_CHEST] = Location::Chest(RC_GC_MAZE_CENTER_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_GORON_CITY, ACTOR_EN_BOX, SCENE_GORON_CITY, 23202, 0x02, "Maze Center Chest", "GC Maze Center Chest", RHT_GC_MAZE_CENTER_CHEST, RG_PURPLE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[RC_GC_ROLLING_GORON_AS_CHILD] = Location::Base(RC_GC_ROLLING_GORON_AS_CHILD, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_GORON_CITY, ACTOR_ID_MAX, SCENE_GORON_CITY, 0x00, 0x34, "Rolling Goron as Child", "GC Rolling Goron as Child", RHT_GC_ROLLING_GORON_AS_CHILD, RG_PROGRESSIVE_BOMB_BAG, {}, SpoilerCollectionCheck::InfTable(0x11, 0x06), SpoilerCollectionCheckGroup::GROUP_GORON_CITY, true); + locationTable[RC_GC_ROLLING_GORON_AS_ADULT] = Location::Base(RC_GC_ROLLING_GORON_AS_ADULT, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_GORON_CITY, ACTOR_ID_MAX, SCENE_GORON_CITY, 0x00, 0x2C, "Rolling Goron as Adult", "GC Rolling Goron as Adult", RHT_GC_ROLLING_GORON_AS_ADULT, RG_GORON_TUNIC, {}, SpoilerCollectionCheck::InfTable(0x10, 0x01), SpoilerCollectionCheckGroup::GROUP_GORON_CITY, true); + locationTable[RC_GC_DARUNIAS_JOY] = Location::Base(RC_GC_DARUNIAS_JOY, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_GORON_CITY, ACTOR_ID_MAX, SCENE_GORON_CITY, 0x00, 0x54, "Darunias Joy", "GC Darunias Joy", RHT_GC_DARUNIAS_JOY, RG_PROGRESSIVE_STRENGTH, {}, SpoilerCollectionCheck::Chest(0x62, 0x1E), SpoilerCollectionCheckGroup::GROUP_GORON_CITY, true); + locationTable[RC_GC_POT_FREESTANDING_POH] = Location::Collectable(RC_GC_POT_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_GORON_CITY, ACTOR_EN_ITEM00, SCENE_GORON_CITY, 7942, 0x1F, "Pot Freestanding PoH", "GC Pot Freestanding PoH", RHT_GC_POT_FREESTANDING_POH, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_GORON_CITY, true); + locationTable[RC_GC_DEKU_SCRUB_GROTTO_LEFT] = Location::GrottoScrub(RC_GC_DEKU_SCRUB_GROTTO_LEFT, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_GORON_CITY, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x00, 0xFB), 0x30, "Deku Scrub Grotto Left", "GC Deku Scrub Grotto Left", RHT_GC_DEKU_SCRUB_GROTTO_LEFT, RG_BUY_DEKU_NUT_5, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x25, 0x01), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[RC_GC_DEKU_SCRUB_GROTTO_RIGHT] = Location::GrottoScrub(RC_GC_DEKU_SCRUB_GROTTO_RIGHT, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_GORON_CITY, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x05, 0xFB), 0x37, "Deku Scrub Grotto Right", "GC Deku Scrub Grotto Right", RHT_GC_DEKU_SCRUB_GROTTO_RIGHT, RG_BUY_BOMBS_535, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x25, 0x06), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[RC_GC_DEKU_SCRUB_GROTTO_CENTER] = Location::GrottoScrub(RC_GC_DEKU_SCRUB_GROTTO_CENTER, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_GORON_CITY, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x03, 0xFB), 0x33, "Deku Scrub Grotto Center", "GC Deku Scrub Grotto Center", RHT_GC_DEKU_SCRUB_GROTTO_CENTER, RG_BUY_ARROWS_30, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x25, 0x04), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[RC_GC_MEDIGORON] = Location::Base(RC_GC_MEDIGORON, RCQUEST_BOTH, RCTYPE_MERCHANT, RCAREA_GORON_CITY, ACTOR_ID_MAX, SCENE_GORON_CITY, 0x00, 0x51, "Medigoron", "GC Medigoron", RHT_GC_MEDIGORON, RG_GIANTS_KNIFE, { Category::cMerchant }, SpoilerCollectionCheck::Merchant(0x62, 0x87), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + // Death Mountain Crater + locationTable[RC_DMC_UPPER_GROTTO_CHEST] = Location::Chest(RC_DMC_UPPER_GROTTO_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_BOX, SCENE_GROTTOS, 23802, 0x1A, "Upper Grotto Chest", "DMC Upper Grotto Chest", RHT_DMC_UPPER_GROTTO_CHEST, RG_BOMBS_20, {}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_WALL_FREESTANDING_POH] = Location::Collectable(RC_DMC_WALL_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, 518, 0x02, "Wall Freestanding PoH", "DMC Wall Freestanding PoH", RHT_DMC_WALL_FREESTANDING_POH, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN, true); + locationTable[RC_DMC_VOLCANO_FREESTANDING_POH] = Location::Collectable(RC_DMC_VOLCANO_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, 2054, 0x08, "Volcano Freestanding PoH", "DMC Volcano Freestanding PoH", RHT_DMC_WALL_FREESTANDING_POH, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN, true); + locationTable[RC_DMC_DEKU_SCRUB] = Location::Base(RC_DMC_DEKU_SCRUB, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_DNS, SCENE_DEATH_MOUNTAIN_CRATER, 0x05, 0x37, "Deku Scrub", "DMC Deku Scrub", RHT_DMC_DEKU_SCRUB, RG_BUY_BOMBS_535, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x61, 0x06), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_DEKU_SCRUB_GROTTO_LEFT] = Location::GrottoScrub(RC_DMC_DEKU_SCRUB_GROTTO_LEFT, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x00, 0xF9), 0x30, "Deku Scrub Grotto Left", "DMC Deku Scrub Grotto Left", RHT_DMC_DEKU_SCRUB_GROTTO_LEFT, RG_BUY_DEKU_NUT_5, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x23, 0x01), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_DEKU_SCRUB_GROTTO_RIGHT] = Location::GrottoScrub(RC_DMC_DEKU_SCRUB_GROTTO_RIGHT, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x05, 0xF9), 0x37, "Deku Scrub Grotto Right", "DMC Deku Scrub Grotto Right", RHT_DMC_DEKU_SCRUB_GROTTO_RIGHT, RG_BUY_BOMBS_535, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x23, 0x06), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_DEKU_SCRUB_GROTTO_CENTER] = Location::GrottoScrub(RC_DMC_DEKU_SCRUB_GROTTO_CENTER, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x03, 0xF9), 0x33, "Deku Scrub Grotto Center", "DMC Deku Scrub Grotto Center", RHT_DMC_DEKU_SCRUB_GROTTO_CENTER, RG_BUY_ARROWS_30, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x23, 0x04), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + // Zoras River + locationTable[RC_ZR_OPEN_GROTTO_CHEST] = Location::Chest(RC_ZR_OPEN_GROTTO_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, ACTOR_EN_BOX, SCENE_GROTTOS, 22985, 0x09, "Open Grotto Chest", "ZR Open Grotto Chest", RHT_ZR_OPEN_GROTTO_CHEST, RG_RED_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZR_MAGIC_BEAN_SALESMAN] = Location::Base(RC_ZR_MAGIC_BEAN_SALESMAN, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, ACTOR_ID_MAX, SCENE_ZORAS_RIVER, 0x00, 0x16, "Magic Bean Salesman", "ZR Magic Bean Salesman", RHT_ZR_MAGIC_BEAN_SALESMAN, RG_MAGIC_BEAN, {}, SpoilerCollectionCheck::MagicBeans(0x54, 0x01), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER, true); + locationTable[RC_ZR_FROGS_ZELDAS_LULLABY] = Location::Base(RC_ZR_FROGS_ZELDAS_LULLABY, RCQUEST_BOTH, RCTYPE_FROG_SONG, RCAREA_ZORAS_RIVER, ACTOR_EN_FR, SCENE_ZORAS_RIVER, 0x00, 0x3E, "Frogs Zelda's Lullaby", "ZR Frogs Zelda's Lullaby", RHT_ZR_FROGS_ZELDAS_LULLABY, RG_PURPLE_RUPEE, {}, SpoilerCollectionCheck::EventChkInf(0xD1), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZR_FROGS_EPONAS_SONG] = Location::Base(RC_ZR_FROGS_EPONAS_SONG, RCQUEST_BOTH, RCTYPE_FROG_SONG, RCAREA_ZORAS_RIVER, ACTOR_EN_FR, SCENE_ZORAS_RIVER, 0x00, 0x3E, "Frogs Epona's Song", "ZR Frogs Epona's Song", RHT_ZR_FROGS_EPONAS_SONG, RG_PURPLE_RUPEE, {}, SpoilerCollectionCheck::EventChkInf(0xD2), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZR_FROGS_SARIAS_SONG] = Location::Base(RC_ZR_FROGS_SARIAS_SONG, RCQUEST_BOTH, RCTYPE_FROG_SONG, RCAREA_ZORAS_RIVER, ACTOR_EN_FR, SCENE_ZORAS_RIVER, 0x00, 0x3E, "Frogs Saria's Song", "ZR Frogs Saria's Song", RHT_ZR_FROGS_SARIAS_SONG, RG_PURPLE_RUPEE, {}, SpoilerCollectionCheck::EventChkInf(0xD4), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZR_FROGS_SUNS_SONG] = Location::Base(RC_ZR_FROGS_SUNS_SONG, RCQUEST_BOTH, RCTYPE_FROG_SONG, RCAREA_ZORAS_RIVER, ACTOR_EN_FR, SCENE_ZORAS_RIVER, 0x00, 0x3E, "Frogs Sun's Song", "ZR Frogs Sun's Song", RHT_ZR_FROGS_SUNS_SONG, RG_PURPLE_RUPEE, {}, SpoilerCollectionCheck::EventChkInf(0xD3), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZR_FROGS_SONG_OF_TIME] = Location::Base(RC_ZR_FROGS_SONG_OF_TIME, RCQUEST_BOTH, RCTYPE_FROG_SONG, RCAREA_ZORAS_RIVER, ACTOR_EN_FR, SCENE_ZORAS_RIVER, 0x00, 0x3E, "Frogs Song of Time", "ZR Frogs Song of Time", RHT_ZR_FROGS_SONG_OF_TIME, RG_PURPLE_RUPEE, {}, SpoilerCollectionCheck::EventChkInf(0xD5), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZR_FROGS_IN_THE_RAIN] = Location::Base(RC_ZR_FROGS_IN_THE_RAIN, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, ACTOR_EN_FR, SCENE_ZORAS_RIVER, 0x00, 0x3E, "Frogs in the Rain", "ZR Frogs in the Rain", RHT_ZR_FROGS_IN_THE_RAIN, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheck::EventChkInf(0xD6), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER, true); + locationTable[RC_ZR_FROGS_OCARINA_GAME] = Location::Base(RC_ZR_FROGS_OCARINA_GAME, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, ACTOR_EN_FR, SCENE_ZORAS_RIVER, 0x00, 0x76, "Frogs Ocarina Game", "ZR Frogs Ocarina Game", RHT_ZR_FROGS_OCARINA_GAME, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheck::EventChkInf(0xD0), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER, true); + locationTable[RC_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH] = Location::Collectable(RC_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, ACTOR_EN_ITEM00, SCENE_ZORAS_RIVER, 1030, 0x04, "Near Open Grotto Freestanding PoH", "ZR Near Open Grotto Freestanding PoH", RHT_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER, true); + locationTable[RC_ZR_NEAR_DOMAIN_FREESTANDING_POH] = Location::Collectable(RC_ZR_NEAR_DOMAIN_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, ACTOR_EN_ITEM00, SCENE_ZORAS_RIVER, 2822, 0x0B, "Near Domain Freestanding PoH", "ZR Near Domain Freestanding PoH", RHT_ZR_NEAR_DOMAIN_FREESTANDING_POH, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER, true); + locationTable[RC_ZR_DEKU_SCRUB_GROTTO_REAR] = Location::GrottoScrub(RC_ZR_DEKU_SCRUB_GROTTO_REAR, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_ZORAS_RIVER, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x07, 0xEB), 0x39, "Deku Scrub Grotto Rear", "ZR Deku Scrub Grotto Rear", RHT_ZR_DEKU_SCRUB_GROTTO_REAR, RG_BUY_RED_POTION_30, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x15, 0x08), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZR_DEKU_SCRUB_GROTTO_FRONT] = Location::GrottoScrub(RC_ZR_DEKU_SCRUB_GROTTO_FRONT, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_ZORAS_RIVER, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x08, 0xEB), 0x3A, "Deku Scrub Grotto Front", "ZR Deku Scrub Grotto Front", RHT_ZR_DEKU_SCRUB_GROTTO_FRONT, RG_BUY_GREEN_POTION, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x15, 0x09), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + // Zoras Domain + locationTable[RC_ZD_CHEST] = Location::Chest(RC_ZD_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, ACTOR_EN_BOX, SCENE_ZORAS_DOMAIN, -18496, 0x00, "Chest", "ZD Chest", RHT_ZD_CHEST, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN, true); + locationTable[RC_ZD_DIVING_MINIGAME] = Location::Base(RC_ZD_DIVING_MINIGAME, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, ACTOR_ID_MAX, SCENE_ZORAS_DOMAIN, 0x00, 0x37, "Diving Minigame", "ZD Diving Minigame", RHT_ZD_DIVING_MINIGAME, RG_PROGRESSIVE_SCALE, {}, SpoilerCollectionCheck::EventChkInf(0x38), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN, true); + locationTable[RC_ZD_KING_ZORA_THAWED] = Location::Base(RC_ZD_KING_ZORA_THAWED, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, ACTOR_ID_MAX, SCENE_ZORAS_DOMAIN, 0x00, 0x2D, "King Zora Thawed", "ZD King Zora Thawed", RHT_ZD_KING_ZORA_THAWED, RG_ZORA_TUNIC, {}, SpoilerCollectionCheck::InfTable(0x13, 0x01), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN, true); + locationTable[RC_ZD_TRADE_PRESCRIPTION] = Location::Base(RC_ZD_TRADE_PRESCRIPTION, RCQUEST_BOTH, RCTYPE_ADULT_TRADE, RCAREA_ZORAS_DOMAIN, ACTOR_ID_MAX, SCENE_ZORAS_DOMAIN, 0x00, 0x24, "Trade Prescription", "ZD Trade Prescription", RHT_ZD_TRADE_PRESCRIPTION, RG_EYEBALL_FROG, { Category::cAdultTrade }, SpoilerCollectionCheck::Chest(0x58, 0x1F), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN, true); + // Zora's Fountain + locationTable[RC_ZF_ICEBERC_FREESTANDING_POH] = Location::Collectable(RC_ZF_ICEBERC_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 262, 0x01, "Iceberg Freestanding PoH", "ZF Iceberg Freestanding PoH", RHT_ZF_ICEBERG_FREESTANDING_POH, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN, true); + locationTable[RC_ZF_BOTTOM_FREESTANDING_POH] = Location::Collectable(RC_ZF_BOTTOM_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 5126, 0x14, "Bottom Freestanding PoH", "ZF Bottom Freestanding PoH", RHT_ZF_BOTTOM_FREESTANDING_POH, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN, true); + // Lon Lon Ranch + locationTable[RC_LLR_TALONS_CHICKENS] = Location::Base(RC_LLR_TALONS_CHICKENS, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, ACTOR_ID_MAX, SCENE_LON_LON_BUILDINGS, 0x00, 0x14, "Talons Chickens", "LLR Talons Chickens", RHT_LLR_TALONS_CHICKENS, RG_BOTTLE_WITH_MILK, {}, SpoilerCollectionCheck::ItemGetInf(10), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH, true); + locationTable[RC_LLR_FREESTANDING_POH] = Location::Collectable(RC_LLR_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, ACTOR_EN_ITEM00, SCENE_LON_LON_BUILDINGS, 262, 0x01, "Freestanding PoH", "LLR Freestanding PoH", RHT_LLR_FREESTANDING_POH, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH, true); + locationTable[RC_LLR_DEKU_SCRUB_GROTTO_LEFT] = Location::GrottoScrub(RC_LLR_DEKU_SCRUB_GROTTO_LEFT, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_LON_LON_RANCH, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x00, 0xFC), 0x30, "Deku Scrub Grotto Left", "LLR Deku Scrub Grotto Left", RHT_LLR_DEKU_SCRUB_GROTTO_LEFT, RG_BUY_DEKU_NUT_5, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x26, 0x01), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); + locationTable[RC_LLR_DEKU_SCRUB_GROTTO_RIGHT] = Location::GrottoScrub(RC_LLR_DEKU_SCRUB_GROTTO_RIGHT, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_LON_LON_RANCH, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x05, 0xFC), 0x37, "Deku Scrub Grotto Right", "LLR Deku Scrub Grotto Right", RHT_LLR_DEKU_SCRUB_GROTTO_RIGHT, RG_BUY_BOMBS_535, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x26, 0x06), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); + locationTable[RC_LLR_DEKU_SCRUB_GROTTO_CENTER] = Location::GrottoScrub(RC_LLR_DEKU_SCRUB_GROTTO_CENTER, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_LON_LON_RANCH, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x03, 0xFC), 0x33, "Deku Scrub Grotto Center", "LLR Deku Scrub Grotto Center", RHT_LLR_DEKU_SCRUB_GROTTO_CENTER, RG_BUY_DEKU_SEEDS_30, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x26, 0x04), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); + + // Dungeons + // Randomizer Check Randomizer Check Quest Type Area Actor ID Scene ID Params Flags Short Name Spoiler Name Hint Text Key Vanilla Item Categories Spoiler Collection Check Collection Check Group Vanilla Progression + // Deku Tree Vanilla + locationTable[RC_DEKU_TREE_MAP_CHEST] = Location::Chest(RC_DEKU_TREE_MAP_CHEST, RCQUEST_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_DEKU_TREE, ACTOR_EN_BOX, SCENE_DEKU_TREE, 2083, 0x03, "Map Chest", "Deku Tree Map Chest", RHT_DEKU_TREE_MAP_CHEST, RG_DEKU_TREE_MAP, { Category::cVanillaMap }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE, true); + locationTable[RC_DEKU_TREE_COMPASS_CHEST] = Location::Chest(RC_DEKU_TREE_COMPASS_CHEST, RCQUEST_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_DEKU_TREE, ACTOR_EN_BOX, SCENE_DEKU_TREE, 2050, 0x02, "Compass Chest", "Deku Tree Compass Chest", RHT_DEKU_TREE_COMPASS_CHEST, RG_DEKU_TREE_COMPASS, { Category::cVanillaCompass }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE, true); + locationTable[RC_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST] = Location::Chest(RC_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, ACTOR_EN_BOX, SCENE_DEKU_TREE, 22790, 0x06, "Compass Room Side Chest", "Deku Tree Compass Room Side Chest", RHT_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, RG_RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[RC_DEKU_TREE_BASEMENT_CHEST] = Location::Chest(RC_DEKU_TREE_BASEMENT_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, ACTOR_EN_BOX, SCENE_DEKU_TREE, 22788, 0x04, "Basement Chest", "Deku Tree Basement Chest", RHT_DEKU_TREE_BASEMENT_CHEST, RG_RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[RC_DEKU_TREE_SLINGSHOT_CHEST] = Location::Chest(RC_DEKU_TREE_SLINGSHOT_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, ACTOR_EN_BOX, SCENE_DEKU_TREE, 161, 0x01, "Slingshot Chest", "Deku Tree Slingshot Chest", RHT_DEKU_TREE_SLINGSHOT_CHEST, RG_PROGRESSIVE_SLINGSHOT, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE, true); + locationTable[RC_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST] = Location::Chest(RC_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, ACTOR_EN_BOX, SCENE_DEKU_TREE, 22789, 0x05, "Slingshot Room Side Chest", "Deku Tree Slingshot Room Side Chest", RHT_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, RG_RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + // Deku Tree MQ + locationTable[RC_DEKU_TREE_MQ_MAP_CHEST] = Location::Chest(RC_DEKU_TREE_MQ_MAP_CHEST, RCQUEST_MQ, RCTYPE_MAP_COMPASS, RCAREA_DEKU_TREE, ACTOR_EN_BOX, SCENE_DEKU_TREE, 2083, 0x03, "MQ Map Chest", "Deku Tree MQ Map Chest", RHT_DEKU_TREE_MQ_MAP_CHEST, RG_DEKU_TREE_MAP, { Category::cVanillaMap }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE, true); + locationTable[RC_DEKU_TREE_MQ_COMPASS_CHEST] = Location::Chest(RC_DEKU_TREE_MQ_COMPASS_CHEST, RCQUEST_MQ, RCTYPE_MAP_COMPASS, RCAREA_DEKU_TREE, ACTOR_EN_BOX, SCENE_DEKU_TREE, 2049, 0x01, "MQ Compass Chest", "Deku Tree MQ Compass Chest", RHT_DEKU_TREE_MQ_COMPASS_CHEST, RG_DEKU_TREE_COMPASS, { Category::cVanillaCompass }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE, true); + locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_CHEST] = Location::Chest(RC_DEKU_TREE_MQ_SLINGSHOT_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, ACTOR_EN_BOX, SCENE_DEKU_TREE, 4262, 0x06, "MQ Slingshot Chest", "Deku Tree MQ Slingshot Chest", RHT_DEKU_TREE_MQ_SLINGSHOT_CHEST, RG_PROGRESSIVE_SLINGSHOT, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE, true); + locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST] = Location::Chest(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, ACTOR_EN_BOX, SCENE_DEKU_TREE, -31454, 0x02, "MQ Slingshot Room Back Chest", "Deku Tree MQ Slingshot Room Back Chest", RHT_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, RG_DEKU_SHIELD, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_CHEST] = Location::Chest(RC_DEKU_TREE_MQ_BASEMENT_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, ACTOR_EN_BOX, SCENE_DEKU_TREE, -31452, 0x04, "MQ Basement Chest", "Deku Tree MQ Basement Chest", RHT_DEKU_TREE_MQ_BASEMENT_CHEST, RG_DEKU_SHIELD, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[RC_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST] = Location::Chest(RC_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, ACTOR_EN_BOX, SCENE_DEKU_TREE, 22789, 0x05, "MQ Before Spinning Log Chest", "Deku Tree MQ Before Spinning Log Chest", RHT_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, RG_RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[RC_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST] = Location::Chest(RC_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, ACTOR_EN_BOX, SCENE_DEKU_TREE, 23200, 0x00, "MQ After Spinning Log Chest", "Deku Tree MQ After Spinning Log Chest", RHT_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, RG_PURPLE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[RC_DEKU_TREE_MQ_DEKU_SCRUB] = Location::Base(RC_DEKU_TREE_MQ_DEKU_SCRUB, RCQUEST_MQ, RCTYPE_SCRUB, RCAREA_DEKU_TREE, ACTOR_EN_DNS, SCENE_DEKU_TREE, 0x04, 0x34, "MQ Deku Scrub", "Deku Tree MQ Deku Scrub", RHT_DEKU_TREE_MQ_DEKU_SCRUB, RG_BUY_DEKU_SHIELD, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x00, 0x05), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + + // Randomizer Check Randomizer Check Quest Type Area Actor ID Scene ID Params Flags Short Name Spoiler Name Hint Text Key Vanilla Item Categories Spoiler Collection Check Collection Check Group Vanilla Progression + // Dodongo's Cavern Shared + locationTable[RC_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = Location::Chest(RC_DODONGOS_CAVERN_BOSS_ROOM_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, ACTOR_EN_BOX, SCENE_DODONGOS_CAVERN_BOSS, 20512, 0x00, "Boss Room Chest", "Dodongos Cavern Boss Room Chest", RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST, RG_BOMBS_5, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + // Dodongo's Cavern Vanilla + locationTable[RC_DODONGOS_CAVERN_MAP_CHEST] = Location::Chest(RC_DODONGOS_CAVERN_MAP_CHEST, RCQUEST_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_DODONGOS_CAVERN, ACTOR_EN_BOX, SCENE_DODONGOS_CAVERN, 2088, 0x08, "Map Chest", "Dodongos Cavern Map Chest", RHT_DODONGOS_CAVERN_MAP_CHEST, RG_DODONGOS_CAVERN_MAP, { Category::cVanillaMap }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN, true); + locationTable[RC_DODONGOS_CAVERN_COMPASS_CHEST] = Location::Chest(RC_DODONGOS_CAVERN_COMPASS_CHEST, RCQUEST_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_DODONGOS_CAVERN, ACTOR_EN_BOX, SCENE_DODONGOS_CAVERN, 2053, 0x05, "Compass Chest", "Dodongos Cavern Compass Chest", RHT_DODONGOS_CAVERN_COMPASS_CHEST, RG_DODONGOS_CAVERN_COMPASS, { Category::cVanillaCompass }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN, true); + locationTable[RC_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST] = Location::Chest(RC_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, ACTOR_EN_BOX, SCENE_DODONGOS_CAVERN, 22982, 0x06, "Bomb Flower Platform Chest", "Dodongos Cavern Bomb Flower Platform Chest", RHT_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, RG_RED_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_DODONGOS_CAVERN_BOMB_BAG_CHEST] = Location::Chest(RC_DODONGOS_CAVERN_BOMB_BAG_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, ACTOR_EN_BOX, SCENE_DODONGOS_CAVERN, 1604, 0x04, "Bomb Bag Chest", "Dodongos Cavern Bomb Bag Chest", RHT_DODONGOS_CAVERN_BOMB_BAG_CHEST, RG_PROGRESSIVE_BOMB_BAG, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN, true); + locationTable[RC_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST] = Location::Chest(RC_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, ACTOR_EN_BOX, SCENE_DODONGOS_CAVERN, 21802, 0x0A, "End Of Bridge Chest", "Dodongos Cavern End Of Bridge Chest", RHT_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, RG_DEKU_SHIELD, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT] = Location::Base(RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, RCQUEST_VANILLA, RCTYPE_SCRUB, RCAREA_DODONGOS_CAVERN, ACTOR_EN_DNS, SCENE_DODONGOS_CAVERN, 0x00, 0x30, "Deku Scrub Near Bomb Bag Left", "Dodongos Cavern Deku Scrub Near Bomb Bag Left", RHT_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, RG_BUY_DEKU_NUT_5, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x01, 0x01), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS] = Location::Base(RC_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, RCQUEST_VANILLA, RCTYPE_SCRUB, RCAREA_DODONGOS_CAVERN, ACTOR_EN_DNS, SCENE_DODONGOS_CAVERN, 0x01, 0x31, "Deku Scrub Side Room Near Dodongos", "Dodongos Cavern Deku Scrub Side Room Near Dodongos", RHT_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, RG_BUY_DEKU_STICK_1, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x01, 0x02), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT] = Location::Base(RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, RCQUEST_VANILLA, RCTYPE_SCRUB, RCAREA_DODONGOS_CAVERN, ACTOR_EN_DNS, SCENE_DODONGOS_CAVERN, 0x03, 0x33, "Deku Scrub Near Bomb Bag Right", "Dodongos Cavern Deku Scrub Near Bomb Bag Right", RHT_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, RG_BUY_DEKU_SEEDS_30, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x01, 0x04), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY] = Location::Base(RC_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, RCQUEST_VANILLA, RCTYPE_SCRUB, RCAREA_DODONGOS_CAVERN, ACTOR_EN_DNS, SCENE_DODONGOS_CAVERN, 0x04, 0x34, "Deku Scrub Lobby", "Dodongos Cavern Deku Scrub Lobby", RHT_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, RG_BUY_DEKU_SHIELD, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x01, 0x05), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + // Dodongo's Cavern MQ + locationTable[RC_DODONGOS_CAVERN_MQ_MAP_CHEST] = Location::Chest(RC_DODONGOS_CAVERN_MQ_MAP_CHEST, RCQUEST_MQ, RCTYPE_MAP_COMPASS, RCAREA_DODONGOS_CAVERN, ACTOR_EN_BOX, SCENE_DODONGOS_CAVERN, 2080, 0x00, "MQ Map Chest", "Dodongos Cavern MQ Map Chest", RHT_DODONGOS_CAVERN_MQ_MAP_CHEST, RG_DODONGOS_CAVERN_MAP, { Category::cVanillaMap }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN, true); + locationTable[RC_DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST] = Location::Chest(RC_DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, ACTOR_EN_BOX, SCENE_DODONGOS_CAVERN, 1604, 0x04, "MQ Bomb Bag Chest", "Dodongos Cavern MQ Bomb Bag Chest", RHT_DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST, RG_PROGRESSIVE_BOMB_BAG, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN, true); + locationTable[RC_DODONGOS_CAVERN_MQ_COMPASS_CHEST] = Location::Chest(RC_DODONGOS_CAVERN_MQ_COMPASS_CHEST, RCQUEST_MQ, RCTYPE_MAP_COMPASS, RCAREA_DODONGOS_CAVERN, ACTOR_EN_BOX, SCENE_DODONGOS_CAVERN, 6149, 0x05, "MQ Compass Chest", "Dodongos Cavern MQ Compass Chest", RHT_DODONGOS_CAVERN_MQ_COMPASS_CHEST, RG_DODONGOS_CAVERN_COMPASS, { Category::cVanillaCompass }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN, true); + locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST] = Location::Chest(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, ACTOR_EN_BOX, SCENE_DODONGOS_CAVERN, 29986, 0x02, "MQ Larvae Room Chest", "Dodongos Cavern MQ Larvae Room Chest", RHT_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, RG_DEKU_SHIELD, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST] = Location::Chest(RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, ACTOR_EN_BOX, SCENE_DODONGOS_CAVERN, 22947, 0x03, "MQ Torch Puzzle Room Chest", "Dodongos Cavern MQ Torch Puzzle Room Chest", RHT_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST, RG_BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST] = Location::Chest(RC_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, ACTOR_EN_BOX, SCENE_DODONGOS_CAVERN, 21825, 0x01, "MQ Under Grave Chest", "Dodongos Cavern MQ Under Grave Chest", RHT_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, RG_HYLIAN_SHIELD, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR] = Location::Base(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, RCQUEST_MQ, RCTYPE_SCRUB, RCAREA_DODONGOS_CAVERN, ACTOR_EN_DNS, SCENE_DODONGOS_CAVERN, 0x01, 0x31, "MQ Deku Scrub Lobby Rear", "Dodongos Cavern Deku Scrub Lobby Rear", RHT_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, RG_BUY_DEKU_STICK_1, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x01, 0x02), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT] = Location::Base(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, RCQUEST_MQ, RCTYPE_SCRUB, RCAREA_DODONGOS_CAVERN, ACTOR_EN_DNS, SCENE_DODONGOS_CAVERN, 0x03, 0x33, "MQ Deku Scrub Lobby Front", "Dodongos Cavern Deku Scrub Lobby Front", RHT_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, RG_BUY_DEKU_SEEDS_30, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x01, 0x04), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE] = Location::Base(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, RCQUEST_MQ, RCTYPE_SCRUB, RCAREA_DODONGOS_CAVERN, ACTOR_EN_DNS, SCENE_DODONGOS_CAVERN, 0x04, 0x34, "MQ Deku Scrub Staircase", "Dodongos Cavern Deku Scrub Staircase", RHT_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, RG_BUY_DEKU_SHIELD, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x01, 0x05), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS] = Location::Base(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, RCQUEST_MQ, RCTYPE_SCRUB, RCAREA_DODONGOS_CAVERN, ACTOR_EN_DNS, SCENE_DODONGOS_CAVERN, 0x07, 0x39, "MQ Deku Scrub Side Room Near Lower Lizalfos", "Dodongos Cavern Deku Scrub Side Room Near Lower Lizalfos", RHT_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, RG_BUY_RED_POTION_30, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x01, 0x08), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + + // Randomizer Check Randomizer Check Quest Type Area Actor ID Scene ID Params Flags Short Name Spoiler Name Hint Text Key Vanilla Item Categories Spoiler Collection Check Collection Check Group Vanilla Progression + // Jabu-Jabu's Belly Vanilla + locationTable[RC_JABU_JABUS_BELLY_MAP_CHEST] = Location::Chest(RC_JABU_JABUS_BELLY_MAP_CHEST, RCQUEST_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_BOX, SCENE_JABU_JABU, 6178, 0x02, "Map Chest", "Jabu Jabus Belly Map Chest", RHT_JABU_JABUS_BELLY_MAP_CHEST, RG_JABU_JABUS_BELLY_MAP, { Category::cVanillaMap }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY, true); + locationTable[RC_JABU_JABUS_BELLY_COMPASS_CHEST] = Location::Chest(RC_JABU_JABUS_BELLY_COMPASS_CHEST, RCQUEST_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_BOX, SCENE_JABU_JABU, -18428, 0x04, "Compass Chest", "Jabu Jabus Belly Compass Chest", RHT_JABU_JABUS_BELLY_COMPASS_CHEST, RG_JABU_JABUS_BELLY_COMPASS, { Category::cVanillaCompass }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY, true); + locationTable[RC_JABU_JABUS_BELLY_BOOMERANG_CHEST] = Location::Chest(RC_JABU_JABUS_BELLY_BOOMERANG_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_BOX, SCENE_JABU_JABU, 4289, 0x01, "Boomerang Chest", "Jabu Jabus Belly Boomerang Chest", RHT_JABU_JABUS_BELLY_BOOMERANG_CHEST, RG_BOOMERANG, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY, true); + locationTable[RC_JABU_JABUS_BELLY_DEKU_SCRUB] = Location::Base(RC_JABU_JABUS_BELLY_DEKU_SCRUB, RCQUEST_VANILLA, RCTYPE_SCRUB, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_DNS, SCENE_JABU_JABU, 0x00, 0x30, "Deku Scrub", "Jabu Jabus Belly Deku Scrub", RHT_JABU_JABUS_BELLY_DEKU_SCRUB, RG_BUY_DEKU_NUT_5, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x02, 0x01), SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + // Jabu-Jabu's Belly MQ + locationTable[RC_JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST] = Location::Chest(RC_JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_BOX, SCENE_JABU_JABU, -32699, 0x05, "MQ First Room Side Chest", "Jabu Jabus Belly MQ First Room Side Chest", RHT_JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, RG_DEKU_NUTS_5, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[RC_JABU_JABUS_BELLY_MQ_MAP_CHEST] = Location::Chest(RC_JABU_JABUS_BELLY_MQ_MAP_CHEST, RCQUEST_MQ, RCTYPE_MAP_COMPASS, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_BOX, SCENE_JABU_JABU, -18397, 0x03, "MQ Map Chest", "Jabu Jabus Belly MQ Map Chest", RHT_JABU_JABUS_BELLY_MQ_MAP_CHEST, RG_JABU_JABUS_BELLY_MAP, { Category::cVanillaMap }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY, true); + locationTable[RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST] = Location::Chest(RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_BOX, SCENE_JABU_JABU, 20546, 0x02, "MQ Second Room Lower Chest", "Jabu Jabus Belly MQ Second Room Lower Chest", RHT_JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST, RG_DEKU_NUTS_5, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[RC_JABU_JABUS_BELLY_MQ_COMPASS_CHEST] = Location::Chest(RC_JABU_JABUS_BELLY_MQ_COMPASS_CHEST, RCQUEST_MQ, RCTYPE_MAP_COMPASS, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_BOX, SCENE_JABU_JABU, -18432, 0x00, "MQ Compass Chest", "Jabu Jabus Belly MQ Compass Chest", RHT_JABU_JABUS_BELLY_MQ_COMPASS_CHEST, RG_JABU_JABUS_BELLY_COMPASS, { Category::cVanillaCompass }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY, true); + locationTable[RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST] = Location::Chest(RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_BOX, SCENE_JABU_JABU, -30457, 0x07, "MQ Second Room Upper Chest", "Jabu Jabus Belly MQ Second Room Upper Chest", RHT_JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST, RG_RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST] = Location::Chest(RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_BOX, SCENE_JABU_JABU, -32696, 0x08, "MQ Basement Near Switches Chest", "Jabu Jabus Belly MQ Basement Near Switches Chest", RHT_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, RG_DEKU_NUTS_5, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST] = Location::Chest(RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_BOX, SCENE_JABU_JABU, -32668, 0x04, "MQ Basement Near Vines Chest", "Jabu Jabus Belly MQ Basement Near Vines Chest", RHT_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, RG_BOMBCHU_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[RC_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST] = Location::Chest(RC_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_BOX, SCENE_JABU_JABU, -31446, 0x0A, "MQ Near Boss Chest", "Jabu Jabus Belly MQ Near Boss Chest", RHT_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, RG_DEKU_SHIELD, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST] = Location::Chest(RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_BOX, SCENE_JABU_JABU, 28905, 0x09, "MQ Falling Like Like Room Chest", "Jabu Jabus Belly MQ Falling Like Like Room Chest", RHT_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, RG_DEKU_STICK_1, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[RC_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST] = Location::Chest(RC_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_BOX, SCENE_JABU_JABU, 20545, 0x01, "MQ Boomerang Room Small Chest", "Jabu Jabus Belly MQ Boomerang Room Small Chest", RHT_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, RG_DEKU_NUTS_5, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[RC_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST] = Location::Chest(RC_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_BOX, SCENE_JABU_JABU, 4294, 0x06, "MQ Boomerang Chest", "Jabu Jabus Belly MQ Boomerang Chest", RHT_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, RG_BOOMERANG, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY, true); + + // Randomizer Check Randomizer Check Quest Type Area Actor ID Scene ID Params Flags Short Name Spoiler Name Hint Text Key Vanilla Item Categories Collection Check Group Vanilla Progression + // Forest Temple Vanilla + locationTable[RC_FOREST_TEMPLE_FIRST_ROOM_CHEST] = Location::Chest(RC_FOREST_TEMPLE_FIRST_ROOM_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 22595, 0x03, "First Room Chest", "Forest Temple First Room Chest", RHT_FOREST_TEMPLE_FIRST_ROOM_CHEST, RG_FOREST_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE, true); + locationTable[RC_FOREST_TEMPLE_FIRST_STALFOS_CHEST] = Location::Chest(RC_FOREST_TEMPLE_FIRST_STALFOS_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 30784, 0x00, "First Stalfos Chest", "Forest Temple First Stalfos Chest", RHT_FOREST_TEMPLE_FIRST_STALFOS_CHEST, RG_FOREST_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE, true); + locationTable[RC_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST] = Location::Chest(RC_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 22789, 0x05, "Raised Island Courtyard Chest", "Forest Temple Raised Island Courtyard Chest", RHT_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, RG_RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[RC_FOREST_TEMPLE_MAP_CHEST] = Location::Chest(RC_FOREST_TEMPLE_MAP_CHEST, RCQUEST_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 6177, 0x01, "Map Chest", "Forest Temple Map Chest", RHT_FOREST_TEMPLE_MAP_CHEST, RG_FOREST_TEMPLE_MAP, { Category::cVanillaMap }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE, true); + locationTable[RC_FOREST_TEMPLE_WELL_CHEST] = Location::Chest(RC_FOREST_TEMPLE_WELL_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 22601, 0x09, "Well Chest", "Forest Temple Well Chest", RHT_FOREST_TEMPLE_WELL_CHEST, RG_FOREST_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE, true); + locationTable[RC_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST] = Location::Chest(RC_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 22855, 0x07, "Falling Ceiling Room Chest", "Forest Temple Falling Ceiling Room Chest", RHT_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST, RG_ARROWS_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[RC_FOREST_TEMPLE_EYE_SWITCH_CHEST] = Location::Chest(RC_FOREST_TEMPLE_EYE_SWITCH_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, -30364, 0x04, "Eye Switch Chest", "Forest Temple Eye Switch Chest", RHT_FOREST_TEMPLE_EYE_SWITCH_CHEST, RG_ARROWS_30, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[RC_FOREST_TEMPLE_BOSS_KEY_CHEST] = Location::Chest(RC_FOREST_TEMPLE_BOSS_KEY_CHEST, RCQUEST_VANILLA, RCTYPE_BOSS_KEY, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 10222, 0x0E, "Boss Key Chest", "Forest Temple Boss Key Chest", RHT_FOREST_TEMPLE_BOSS_KEY_CHEST, RG_FOREST_TEMPLE_BOSS_KEY, { Category::cVanillaBossKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE, true); + locationTable[RC_FOREST_TEMPLE_FLOORMASTER_CHEST] = Location::Chest(RC_FOREST_TEMPLE_FLOORMASTER_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 30786, 0x02, "Floormaster Chest", "Forest Temple Floormaster Chest", RHT_FOREST_TEMPLE_FLOORMASTER_CHEST, RG_FOREST_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE, true); + locationTable[RC_FOREST_TEMPLE_BOW_CHEST] = Location::Chest(RC_FOREST_TEMPLE_BOW_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, -20340, 0x0C, "Bow Chest", "Forest Temple Bow Chest", RHT_FOREST_TEMPLE_BOW_CHEST, RG_PROGRESSIVE_BOW, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE, true); + locationTable[RC_FOREST_TEMPLE_RED_POE_CHEST] = Location::Chest(RC_FOREST_TEMPLE_RED_POE_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 30797, 0x0D, "Red Poe Chest", "Forest Temple Red Poe Chest", RHT_FOREST_TEMPLE_RED_POE_CHEST, RG_FOREST_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE, true); + locationTable[RC_FOREST_TEMPLE_BLUE_POE_CHEST] = Location::Chest(RC_FOREST_TEMPLE_BLUE_POE_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 6159, 0x0F, "Blue Poe Chest", "Forest Temple Blue Poe Chest", RHT_FOREST_TEMPLE_BLUE_POE_CHEST, RG_FOREST_TEMPLE_COMPASS, { Category::cVanillaCompass }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE, true); + locationTable[RC_FOREST_TEMPLE_BASEMENT_CHEST] = Location::Chest(RC_FOREST_TEMPLE_BASEMENT_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 22827, 0x0B, "Basement Chest", "Forest Temple Basement Chest", RHT_FOREST_TEMPLE_BASEMENT_CHEST, RG_ARROWS_5, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + // Forest Temple MQ + locationTable[RC_FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST] = Location::Chest(RC_FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST, RCQUEST_MQ, RCTYPE_SMALL_KEY, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, -30653, 0x03, "MQ First Room Chest", "Forest Temple MQ First Room Chest", RHT_FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST, RG_FOREST_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[RC_FOREST_TEMPLE_MQ_WOLFOS_CHEST] = Location::Chest(RC_FOREST_TEMPLE_MQ_WOLFOS_CHEST, RCQUEST_MQ, RCTYPE_SMALL_KEY, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 30784, 0x00, "MQ Wolfos Chest", "Forest Temple MQ Wolfos Chest", RHT_FOREST_TEMPLE_MQ_WOLFOS_CHEST, RG_FOREST_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE, true); + locationTable[RC_FOREST_TEMPLE_MQ_BOW_CHEST] = Location::Chest(RC_FOREST_TEMPLE_MQ_BOW_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, -20340, 0x0C, "MQ Bow Chest", "Forest Temple MQ Bow Chest", RHT_FOREST_TEMPLE_MQ_BOW_CHEST, RG_PROGRESSIVE_BOW, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE, true); + locationTable[RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST] = Location::Chest(RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST, RCQUEST_MQ, RCTYPE_SMALL_KEY, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 22593, 0x01, "MQ Raised Island Courtyard Lower Chest", "Forest Temple MQ Raised Island Courtyard Lower Chest", RHT_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST, RG_FOREST_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE, true); + locationTable[RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST] = Location::Chest(RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST, RCQUEST_MQ, RCTYPE_SMALL_KEY, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 22597, 0x05, "MQ Raised Island Courtyard Upper Chest", "Forest Temple MQ Raised Island Courtyard Upper Chest", RHT_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST, RG_FOREST_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE, true); + locationTable[RC_FOREST_TEMPLE_MQ_WELL_CHEST] = Location::Chest(RC_FOREST_TEMPLE_MQ_WELL_CHEST, RCQUEST_MQ, RCTYPE_SMALL_KEY, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 22601, 0x09, "MQ Well Chest", "Forest Temple MQ Well Chest", RHT_FOREST_TEMPLE_MQ_WELL_CHEST, RG_FOREST_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE, true); + locationTable[RC_FOREST_TEMPLE_MQ_MAP_CHEST] = Location::Chest(RC_FOREST_TEMPLE_MQ_MAP_CHEST, RCQUEST_MQ, RCTYPE_MAP_COMPASS, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 6189, 0x0D, "MQ Map Chest", "Forest Temple MQ Map Chest", RHT_FOREST_TEMPLE_MQ_MAP_CHEST, RG_FOREST_TEMPLE_MAP, { Category::cVanillaMap }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE, true); + locationTable[RC_FOREST_TEMPLE_MQ_COMPASS_CHEST] = Location::Chest(RC_FOREST_TEMPLE_MQ_COMPASS_CHEST, RCQUEST_MQ, RCTYPE_MAP_COMPASS, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 6159, 0x0F, "MQ Compass Chest", "Forest Temple MQ Compass Chest", RHT_FOREST_TEMPLE_MQ_COMPASS_CHEST, RG_FOREST_TEMPLE_COMPASS, { Category::cVanillaCompass }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE, true); + locationTable[RC_FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST] = Location::Chest(RC_FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, -30426, 0x06, "MQ Falling Ceiling Room Chest", "Forest Temple MQ Falling Ceiling Room Chest", RHT_FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST, RG_ARROWS_5, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[RC_FOREST_TEMPLE_MQ_BASEMENT_CHEST] = Location::Chest(RC_FOREST_TEMPLE_MQ_BASEMENT_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 22827, 0x0B, "MQ Basement Chest", "Forest Temple MQ Basement Chest", RHT_FOREST_TEMPLE_MQ_BASEMENT_CHEST, RG_ARROWS_5, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[RC_FOREST_TEMPLE_MQ_REDEAD_CHEST] = Location::Chest(RC_FOREST_TEMPLE_MQ_REDEAD_CHEST, RCQUEST_MQ, RCTYPE_SMALL_KEY, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 30786, 0x02, "MQ Redead Chest", "Forest Temple MQ Redead Chest", RHT_FOREST_TEMPLE_MQ_REDEAD_CHEST, RG_FOREST_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE, true); + locationTable[RC_FOREST_TEMPLE_MQ_BOSS_KEY_CHEST] = Location::Chest(RC_FOREST_TEMPLE_MQ_BOSS_KEY_CHEST, RCQUEST_MQ, RCTYPE_BOSS_KEY, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 10222, 0x0E, "MQ Boss Key Chest", "Forest Temple MQ Boss Key Chest", RHT_FOREST_TEMPLE_MQ_BOSS_KEY_CHEST, RG_FOREST_TEMPLE_BOSS_KEY, { Category::cVanillaBossKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE, true); + + // Randomizer Check Randomizer Check Quest Type Area Actor ID Scene ID Params Flags Short Name Spoiler Name Hint Text Key Vanilla Item Categories Collection Check Group Vanilla Progression + // Fire Temple Vanilla + locationTable[RC_FIRE_TEMPLE_NEAR_BOSS_CHEST] = Location::Chest(RC_FIRE_TEMPLE_NEAR_BOSS_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 22593, 0x01, "Near Boss Chest", "Fire Temple Near Boss Chest", RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST, RG_FIRE_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE, true); + locationTable[RC_FIRE_TEMPLE_FLARE_DANCER_CHEST] = Location::Chest(RC_FIRE_TEMPLE_FLARE_DANCER_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 31936, 0x00, "Flare Dancer Chest", "Fire Temple Flare Dancer Chest", RHT_FIRE_TEMPLE_FLARE_DANCER_CHEST, RG_BOMBS_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_FIRE_TEMPLE_BOSS_KEY_CHEST] = Location::Chest(RC_FIRE_TEMPLE_BOSS_KEY_CHEST, RCQUEST_VANILLA, RCTYPE_BOSS_KEY, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 10220, 0x0C, "Boss Key Chest", "Fire Temple Boss Key Chest", RHT_FIRE_TEMPLE_BOSS_KEY_CHEST, RG_FIRE_TEMPLE_BOSS_KEY, { Category::cVanillaBossKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE, true); + locationTable[RC_FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST] = Location::Chest(RC_FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 22594, 0x02, "Big Lava Room Blocked Door Chest", "Fire Temple Big Lava Room Blocked Door Chest", RHT_FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, RG_FIRE_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE, true); + locationTable[RC_FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST] = Location::Chest(RC_FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 22596, 0x04, "Big Lava Room Lower Open Door Chest", "Fire Temple Big Lava Room Lower Open Door Chest", RHT_FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST, RG_FIRE_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE, true); + locationTable[RC_FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST] = Location::Chest(RC_FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 22595, 0x03, "Boulder Maze Lower Chest", "Fire Temple Boulder Maze Lower Chest", RHT_FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST, RG_FIRE_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE, true); + locationTable[RC_FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST] = Location::Chest(RC_FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 22598, 0x06, "Boulder Maze Upper Chest", "Fire Temple Boulder Maze Upper Chest", RHT_FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST, RG_FIRE_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE, true); + locationTable[RC_FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST] = Location::Chest(RC_FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 22600, 0x08, "Boulder Maze Side Room Chest", "Fire Temple Boulder Maze Side Room Chest", RHT_FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST, RG_FIRE_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE, true); + locationTable[RC_FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST] = Location::Chest(RC_FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 22603, 0x0B, "Boulder Maze Shortcut Chest", "Fire Temple Boulder Maze Shortcut Chest", RHT_FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST, RG_FIRE_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE, true); + locationTable[RC_FIRE_TEMPLE_SCARECROW_CHEST] = Location::Chest(RC_FIRE_TEMPLE_SCARECROW_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 23245, 0x0D, "Scarecrow Chest", "Fire Temple Scarecrow Chest", RHT_FIRE_TEMPLE_SCARECROW_CHEST, RG_HUGE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_FIRE_TEMPLE_MAP_CHEST] = Location::Chest(RC_FIRE_TEMPLE_MAP_CHEST, RCQUEST_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 2090, 0x0A, "Map Chest", "Fire Temple Map Chest", RHT_FIRE_TEMPLE_MAP_CHEST, RG_FIRE_TEMPLE_MAP, { Category::cVanillaMap }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE, true); + locationTable[RC_FIRE_TEMPLE_COMPASS_CHEST] = Location::Chest(RC_FIRE_TEMPLE_COMPASS_CHEST, RCQUEST_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 2055, 0x07, "Compass Chest", "Fire Temple Compass Chest", RHT_FIRE_TEMPLE_COMPASS_CHEST, RG_FIRE_TEMPLE_COMPASS, { Category::cVanillaCompass }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE, true); + locationTable[RC_FIRE_TEMPLE_HIGHEST_GORON_CHEST] = Location::Chest(RC_FIRE_TEMPLE_HIGHEST_GORON_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 22601, 0x09, "Highest Goron Chest", "Fire Temple Highest Goron Chest", RHT_FIRE_TEMPLE_HIGHEST_GORON_CHEST, RG_FIRE_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE, true); + locationTable[RC_FIRE_TEMPLE_MEGATON_HAMMER_CHEST] = Location::Chest(RC_FIRE_TEMPLE_MEGATON_HAMMER_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 421, 0x05, "Megaton Hammer Chest", "Fire Temple Megaton Hammer Chest", RHT_FIRE_TEMPLE_MEGATON_HAMMER_CHEST, RG_MEGATON_HAMMER, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE, true); + // Fire Temple MQ + locationTable[RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST] = Location::Chest(RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, RCQUEST_MQ, RCTYPE_SMALL_KEY, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 22599, 0x07, "MQ Near Boss Chest", "Fire Temple MQ Near Boss Chest", RHT_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, RG_FIRE_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE, true); + locationTable[RC_FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST] = Location::Chest(RC_FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 4512, 0x00, "MQ Megaton Hammer Chest", "Fire Temple MQ Megaton Hammer Chest", RHT_FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, RG_MEGATON_HAMMER, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE, true); + locationTable[RC_FIRE_TEMPLE_MQ_COMPASS_CHEST] = Location::Chest(RC_FIRE_TEMPLE_MQ_COMPASS_CHEST, RCQUEST_MQ, RCTYPE_MAP_COMPASS, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 2059, 0x0B, "MQ Compass Chest", "Fire Temple MQ Compass Chest", RHT_FIRE_TEMPLE_MQ_COMPASS_CHEST, RG_FIRE_TEMPLE_COMPASS, { Category::cVanillaCompass }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE, true); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST] = Location::Chest(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 23747, 0x03, "MQ Lizalfos Maze Lower Chest", "Fire Temple MQ Lizalfos Maze Lower Chest", RHT_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, RG_BOMBS_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST] = Location::Chest(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 23782, 0x06, "MQ Lizalfos Maze Upper Chest", "Fire Temple MQ Lizalfos Maze Upper Chest", RHT_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, RG_BOMBS_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_FIRE_TEMPLE_MQ_CHEST_ON_FIRE] = Location::Chest(RC_FIRE_TEMPLE_MQ_CHEST_ON_FIRE, RCQUEST_MQ, RCTYPE_SMALL_KEY, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 22597, 0x05, "MQ Chest on Fire", "Fire Temple MQ Chest on Fire", RHT_FIRE_TEMPLE_MQ_CHEST_ON_FIRE, RG_FIRE_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE, true); + locationTable[RC_FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST] = Location::Chest(RC_FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 30018, 0x02, "MQ Map Room Side Chest", "Fire Temple MQ Map Room Side Chest", RHT_FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, RG_HYLIAN_SHIELD, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_FIRE_TEMPLE_MQ_MAP_CHEST] = Location::Chest(RC_FIRE_TEMPLE_MQ_MAP_CHEST, RCQUEST_MQ, RCTYPE_MAP_COMPASS, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 2092, 0x0C, "MQ Map Chest", "Fire Temple MQ Map Chest", RHT_FIRE_TEMPLE_MQ_MAP_CHEST, RG_FIRE_TEMPLE_MAP, { Category::cVanillaMap }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE, true); + locationTable[RC_FIRE_TEMPLE_MQ_BOSS_KEY_CHEST] = Location::Chest(RC_FIRE_TEMPLE_MQ_BOSS_KEY_CHEST, RCQUEST_MQ, RCTYPE_BOSS_KEY, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 10212, 0x04, "MQ Boss Key Chest", "Fire Temple MQ Boss Key Chest", RHT_FIRE_TEMPLE_MQ_BOSS_KEY_CHEST, RG_FIRE_TEMPLE_BOSS_KEY, { Category::cVanillaBossKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE, true); + locationTable[RC_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST] = Location::Chest(RC_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, RCQUEST_MQ, RCTYPE_SMALL_KEY, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 22593, 0x01, "MQ Big Lava Room Blocked Door Chest", "Fire Temple MQ Big Lava Room Blocked Door Chest", RHT_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, RG_FIRE_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE, true); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST] = Location::Chest(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, RCQUEST_MQ, RCTYPE_SMALL_KEY, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 22600, 0x08, "MQ Lizalfos Maze Side Room Chest", "Fire Temple MQ Lizalfos Maze Side Room Chest", RHT_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, RG_FIRE_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE, true); + locationTable[RC_FIRE_TEMPLE_MQ_FREESTANDING_KEY] = Location::Collectable(RC_FIRE_TEMPLE_MQ_FREESTANDING_KEY, RCQUEST_MQ, RCTYPE_SMALL_KEY, RCAREA_FIRE_TEMPLE, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, 7185, 0x1C, "MQ Freestanding Key", "Fire Temple MQ Freestanding Key", RHT_FIRE_TEMPLE_MQ_FREESTANDING_KEY, RG_FIRE_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE, true); + + // Randomizer Check Randomizer Check Quest Type Area Actor ID Scene ID Params Flags Short Name Spoiler Name Hint Text Key Randomizer Get Categories Collection Check Group Vanilla Progression + // Water Temple Vanilla + locationTable[RC_WATER_TEMPLE_MAP_CHEST] = Location::Chest(RC_WATER_TEMPLE_MAP_CHEST, RCQUEST_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_WATER_TEMPLE, ACTOR_EN_BOX, SCENE_WATER_TEMPLE, 6178, 0x02, "Map Chest", "Water Temple Map Chest", RHT_WATER_TEMPLE_MAP_CHEST, RG_WATER_TEMPLE_MAP, { Category::cVanillaMap }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE, true); + locationTable[RC_WATER_TEMPLE_COMPASS_CHEST] = Location::Chest(RC_WATER_TEMPLE_COMPASS_CHEST, RCQUEST_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_WATER_TEMPLE, ACTOR_EN_BOX, SCENE_WATER_TEMPLE, 2057, 0x09, "Compass Chest", "Water Temple Compass Chest", RHT_WATER_TEMPLE_COMPASS_CHEST, RG_WATER_TEMPLE_COMPASS, { Category::cVanillaCompass }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE, true); + locationTable[RC_WATER_TEMPLE_TORCHES_CHEST] = Location::Chest(RC_WATER_TEMPLE_TORCHES_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_WATER_TEMPLE, ACTOR_EN_BOX, SCENE_WATER_TEMPLE, 30785, 0x01, "Torches Chest", "Water Temple Torches Chest", RHT_WATER_TEMPLE_TORCHES_CHEST, RG_WATER_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE, true); + locationTable[RC_WATER_TEMPLE_DRAGON_CHEST] = Location::Chest(RC_WATER_TEMPLE_DRAGON_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_WATER_TEMPLE, ACTOR_EN_BOX, SCENE_WATER_TEMPLE, 22602, 0x0A, "Dragon Chest", "Water Temple Dragon Chest", RHT_WATER_TEMPLE_DRAGON_CHEST, RG_WATER_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE, true); + locationTable[RC_WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST] = Location::Chest(RC_WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_WATER_TEMPLE, ACTOR_EN_BOX, SCENE_WATER_TEMPLE, 22600, 0x08, "Central Bow Target Chest", "Water Temple Central Bow Target Chest", RHT_WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST, RG_WATER_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE, true); + locationTable[RC_WATER_TEMPLE_CENTRAL_PILLAR_CHEST] = Location::Chest(RC_WATER_TEMPLE_CENTRAL_PILLAR_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_WATER_TEMPLE, ACTOR_EN_BOX, SCENE_WATER_TEMPLE, 22598, 0x06, "Central Pillar Chest", "Water Temple Central Pillar Chest", RHT_WATER_TEMPLE_CENTRAL_PILLAR_CHEST, RG_WATER_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE, true); + locationTable[RC_WATER_TEMPLE_CRACKED_WALL_CHEST] = Location::Chest(RC_WATER_TEMPLE_CRACKED_WALL_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_WATER_TEMPLE, ACTOR_EN_BOX, SCENE_WATER_TEMPLE, 22592, 0x00, "Cracked Wall Chest", "Water Temple Cracked Wall Chest", RHT_WATER_TEMPLE_CRACKED_WALL_CHEST, RG_WATER_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE, true); + locationTable[RC_WATER_TEMPLE_BOSS_KEY_CHEST] = Location::Chest(RC_WATER_TEMPLE_BOSS_KEY_CHEST, RCQUEST_VANILLA, RCTYPE_BOSS_KEY, RCAREA_WATER_TEMPLE, ACTOR_EN_BOX, SCENE_WATER_TEMPLE, 10213, 0x05, "Boss Key Chest", "Water Temple Boss Key Chest", RHT_WATER_TEMPLE_BOSS_KEY_CHEST, RG_WATER_TEMPLE_BOSS_KEY, { Category::cVanillaBossKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE, true); + locationTable[RC_WATER_TEMPLE_LONGSHOT_CHEST] = Location::Chest(RC_WATER_TEMPLE_LONGSHOT_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, ACTOR_EN_BOX, SCENE_WATER_TEMPLE, 295, 0x07, "Longshot Chest", "Water Temple Longshot Chest", RHT_WATER_TEMPLE_LONGSHOT_CHEST, RG_PROGRESSIVE_HOOKSHOT, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE, true); + locationTable[RC_WATER_TEMPLE_RIVER_CHEST] = Location::Chest(RC_WATER_TEMPLE_RIVER_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_WATER_TEMPLE, ACTOR_EN_BOX, SCENE_WATER_TEMPLE, 22595, 0x03, "River Chest", "Water Temple River Chest", RHT_WATER_TEMPLE_RIVER_CHEST, RG_WATER_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE, true); + // Water Temple MQ + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST] = Location::Chest(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, RCQUEST_MQ, RCTYPE_SMALL_KEY, RCAREA_WATER_TEMPLE, ACTOR_EN_BOX, SCENE_WATER_TEMPLE, -30650, 0x06, "MQ Central Pillar Chest", "Water Temple MQ Central Pillar Chest", RHT_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, RG_WATER_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE, true); + locationTable[RC_WATER_TEMPLE_MQ_BOSS_KEY_CHEST] = Location::Chest(RC_WATER_TEMPLE_MQ_BOSS_KEY_CHEST, RCQUEST_MQ, RCTYPE_BOSS_KEY, RCAREA_WATER_TEMPLE, ACTOR_EN_BOX, SCENE_WATER_TEMPLE, 10213, 0x05, "MQ Boss Key Chest", "Water Temple MQ Boss Key Chest", RHT_WATER_TEMPLE_MQ_BOSS_KEY_CHEST, RG_WATER_TEMPLE_BOSS_KEY, { Category::cVanillaBossKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE, true); + locationTable[RC_WATER_TEMPLE_MQ_LONGSHOT_CHEST] = Location::Chest(RC_WATER_TEMPLE_MQ_LONGSHOT_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, ACTOR_EN_BOX, SCENE_WATER_TEMPLE, -20192, 0x00, "MQ Longshot Chest", "Water Temple MQ Longshot Chest", RHT_WATER_TEMPLE_MQ_LONGSHOT_CHEST, RG_PROGRESSIVE_HOOKSHOT, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE, true); + locationTable[RC_WATER_TEMPLE_MQ_COMPASS_CHEST] = Location::Chest(RC_WATER_TEMPLE_MQ_COMPASS_CHEST, RCQUEST_MQ, RCTYPE_MAP_COMPASS, RCAREA_WATER_TEMPLE, ACTOR_EN_BOX, SCENE_WATER_TEMPLE, 6145, 0x01, "MQ Compass Chest", "Water Temple MQ Compass Chest", RHT_WATER_TEMPLE_MQ_COMPASS_CHEST, RG_WATER_TEMPLE_COMPASS, { Category::cVanillaCompass }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE, true); + locationTable[RC_WATER_TEMPLE_MQ_MAP_CHEST] = Location::Chest(RC_WATER_TEMPLE_MQ_MAP_CHEST, RCQUEST_MQ, RCTYPE_MAP_COMPASS, RCAREA_WATER_TEMPLE, ACTOR_EN_BOX, SCENE_WATER_TEMPLE, -18398, 0x02, "MQ Map Chest", "Water Temple MQ Map Chest", RHT_WATER_TEMPLE_MQ_MAP_CHEST, RG_WATER_TEMPLE_MAP, { Category::cVanillaMap }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE, true); + locationTable[RC_WATER_TEMPLE_MQ_FREESTANDING_KEY] = Location::Collectable(RC_WATER_TEMPLE_MQ_FREESTANDING_KEY, RCQUEST_MQ, RCTYPE_SMALL_KEY, RCAREA_WATER_TEMPLE, ACTOR_EN_ITEM00, SCENE_WATER_TEMPLE, 273, 0x01, "MQ Freestanding Key", "Water Temple MQ Freestanding Key", RHT_WATER_TEMPLE_MQ_FREESTANDING_KEY, RG_WATER_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE, true); + + // Randomizer Check Randomizer Check Quest Type Area Actor ID Scene ID Params Flags Short Name Spoiler Name Hint Text Key Vanilla Item Categories Collection Check Group Vanilla Progression + // Spirit Temple Shared + locationTable[RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_DESERT_COLOSSUS, 1707, 0x0B, "Silver Gauntlets Chest", "Spirit Temple Silver Gauntlets Chest", RHT_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, RG_PROGRESSIVE_STRENGTH, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE, true); + locationTable[RC_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_DESERT_COLOSSUS, 13673, 0x09, "Mirror Shield Chest", "Spirit Temple Mirror Shield Chest", RHT_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, RG_MIRROR_SHIELD, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE, true); + // Spirit Temple Vanilla + locationTable[RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, 21800, 0x08, "Child Bridge Chest", "Spirit Temple Child Bridge Chest", RHT_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, RG_DEKU_SHIELD, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -30656, 0x00, "Child Early Torches Chest", "Spirit Temple Child Early Torches Chest", RHT_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, RG_SPIRIT_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE, true); + locationTable[RC_SPIRIT_TEMPLE_COMPASS_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_COMPASS_CHEST, RCQUEST_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, 14340, 0x04, "Compass Chest", "Spirit Temple Compass Chest", RHT_SPIRIT_TEMPLE_COMPASS_CHEST, RG_SPIRIT_TEMPLE_COMPASS, { Category::cVanillaCompass }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE, true); + locationTable[RC_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, 22599, 0x07, "Early Adult Right Chest", "Spirit Temple Early Adult Right Chest", RHT_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, RG_SPIRIT_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE, true); + locationTable[RC_SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -30451, 0x0D, "First Mirror Left Chest", "Spirit Temple First Mirror Left Chest", RHT_SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, RG_ICE_TRAP, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -28786, 0x0E, "First Mirror Right Chest", "Spirit Temple First Mirror Right Chest", RHT_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, RG_RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_MAP_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_MAP_CHEST, RCQUEST_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -18397, 0x03, "Map Chest", "Spirit Temple Map Chest", RHT_SPIRIT_TEMPLE_MAP_CHEST, RG_SPIRIT_TEMPLE_MAP, { Category::cVanillaMap }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE, true); + locationTable[RC_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -32666, 0x06, "Child Climb North Chest", "Spirit Temple Child Climb North Chest", RHT_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, RG_BOMBCHU_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -31444, 0x0C, "Child Climb East Chest", "Spirit Temple Child Climb East Chest", RHT_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, RG_DEKU_SHIELD, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -30655, 0x01, "Sun Block Room Chest", "Spirit Temple Sun Block Room Chest", RHT_SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST, RG_SPIRIT_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE, true); + locationTable[RC_SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -30654, 0x02, "Statue Room Hand Chest", "Spirit Temple Statue Room Hand Chest", RHT_SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST, RG_SPIRIT_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE, true); + locationTable[RC_SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -30577, 0x0F, "Statue Room Northeast Chest", "Spirit Temple Statue Room Northeast Chest", RHT_SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST, RG_BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, 22597, 0x05, "Near Four Armos Chest", "Spirit Temple Near Four Armos Chest", RHT_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, RG_SPIRIT_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE, true); + locationTable[RC_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, 26900, 0x14, "Hallway Right Invisible Chest", "Spirit Temple Hallway Right Invisible Chest", RHT_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, RG_RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, 26901, 0x15, "Hallway Left Invisible Chest", "Spirit Temple Hallway Left Invisible Chest", RHT_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, RG_RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_BOSS_KEY_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_BOSS_KEY_CHEST, RCQUEST_VANILLA, RCTYPE_BOSS_KEY, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, 10218, 0x0A, "Boss Key Chest", "Spirit Temple Boss Key Chest", RHT_SPIRIT_TEMPLE_BOSS_KEY_CHEST, RG_SPIRIT_TEMPLE_BOSS_KEY, { Category::cVanillaBossKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE, true); + locationTable[RC_SPIRIT_TEMPLE_TOPMOST_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_TOPMOST_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -29454, 0x12, "Topmost Chest", "Spirit Temple Topmost Chest", RHT_SPIRIT_TEMPLE_TOPMOST_CHEST, RG_BOMBS_20, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE, true); + // Spirit Temple MQ + locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, 20602, 0x1A, "MQ Entrance Front Left Chest", "Spirit Temple MQ Entrance Front Left Chest", RHT_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST, RG_BOMBCHU_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -32641, 0x1F, "MQ Entrance Back Right Chest", "Spirit Temple MQ Entrance Back Right Chest", RHT_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST, RG_BOMBCHU_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST, RCQUEST_MQ, RCTYPE_SMALL_KEY, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -30629, 0x1B, "MQ Entrance Front Right Chest", "Spirit Temple MQ Entrance Front Right Chest", RHT_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST, RG_SPIRIT_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE, true); + locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST, RCQUEST_MQ, RCTYPE_SMALL_KEY, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -30626, 0x1E, "MQ Entrance Back Left Chest", "Spirit Temple MQ Entrance Back Left Chest", RHT_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST, RG_SPIRIT_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE, true); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST, RCQUEST_MQ, RCTYPE_SMALL_KEY, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -30627, 0x1D, "MQ Child Hammer Switch Chest", "Spirit Temple MQ Child Hammer Switch Chest", RHT_SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST, RG_SPIRIT_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE, true); + locationTable[RC_SPIRIT_TEMPLE_MQ_MAP_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_MQ_MAP_CHEST, RCQUEST_MQ, RCTYPE_MAP_COMPASS, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, 2080, 0x00, "MQ Map Chest", "Spirit Temple MQ Map Chest", RHT_SPIRIT_TEMPLE_MQ_MAP_CHEST, RG_SPIRIT_TEMPLE_MAP, { Category::cVanillaMap }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE, true); + locationTable[RC_SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST, RCQUEST_MQ, RCTYPE_SMALL_KEY, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, 30792, 0x08, "MQ Map Room Enemy Chest", "Spirit Temple MQ Map Room Enemy Chest", RHT_SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST, RG_SPIRIT_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE, true); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, 28774, 0x06, "MQ Child Climb North Chest", "Spirit Temple MQ Child Climb North Chest", RHT_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST, RG_BOMBCHU_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST, RCQUEST_MQ, RCTYPE_SMALL_KEY, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -30644, 0x0C, "MQ Child Climb South Chest", "Spirit Temple MQ Child Climb South Chest", RHT_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST, RG_SPIRIT_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE, true); + locationTable[RC_SPIRIT_TEMPLE_MQ_COMPASS_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_MQ_COMPASS_CHEST, RCQUEST_MQ, RCTYPE_MAP_COMPASS, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -18429, 0x03, "MQ Compass Chest", "Spirit Temple MQ Compass Chest", RHT_SPIRIT_TEMPLE_MQ_COMPASS_CHEST, RG_SPIRIT_TEMPLE_COMPASS, { Category::cVanillaCompass }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE, true); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -30577, 0x0F, "MQ Statue Room Lullaby Chest", "Spirit Temple MQ Statue Room Lullaby Chest", RHT_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, RG_BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, 26882, 0x02, "MQ Statue Room Invisible Chest", "Spirit Temple MQ Statue Room Invisible Chest", RHT_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST, RG_RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, RCQUEST_MQ, RCTYPE_SMALL_KEY, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -30628, 0x1C, "MQ Silver Block Hallway Chest", "Spirit Temple MQ Silver Block Hallway Chest", RHT_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, RG_SPIRIT_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE, true); + locationTable[RC_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -30463, 0x01, "MQ Sun Block Room Chest", "Spirit Temple MQ Sun Block Room Chest", RHT_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST, RG_RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, 23207, 0x07, "MQ Symphony Room Chest", "Spirit Temple MQ Symphony Room Chest", RHT_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST, RG_PURPLE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, 31396, 0x04, "MQ Leever Room Chest", "Spirit Temple MQ Leever Room Chest", RHT_SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST, RG_PURPLE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, 24472, 0x19, "MQ Beamos Room Chest", "Spirit Temple MQ Beamos Room Chest", RHT_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, RG_RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, 31097, 0x18, "MQ Chest Switch Chest", "Spirit Temple MQ Chest Switch Chest", RHT_SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST, RG_ICE_TRAP, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST, RCQUEST_MQ, RCTYPE_BOSS_KEY, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, 10213, 0x05, "MQ Boss Key Chest", "Spirit Temple MQ Boss Key Chest", RHT_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST, RG_SPIRIT_TEMPLE_BOSS_KEY, { Category::cVanillaBossKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE, true); + locationTable[RC_SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST] = Location::Chest(RC_SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST, RCQUEST_MQ, RCTYPE_SMALL_KEY, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, 26706, 0x12, "MQ Mirror Puzzle Invisible Chest", "Spirit Temple MQ Mirror Puzzle Invisible Chest", RHT_SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST, RG_SPIRIT_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE, true); + + // Randomizer Check Randomizer Check Quest Type Area Actor ID Scene ID Params Flags Short Name Spoiler Name Hint Text Key Vanilla Item Categories Collection Check Group Vanilla Progression + // Shadow Temple Vanilla + locationTable[RC_SHADOW_TEMPLE_MAP_CHEST] = Location::Chest(RC_SHADOW_TEMPLE_MAP_CHEST, RCQUEST_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 6177, 0x01, "Map Chest", "Shadow Temple Map Chest", RHT_SHADOW_TEMPLE_MAP_CHEST, RG_SHADOW_TEMPLE_MAP, { Category::cVanillaMap }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE, true); + locationTable[RC_SHADOW_TEMPLE_HOVER_BOOTS_CHEST] = Location::Chest(RC_SHADOW_TEMPLE_HOVER_BOOTS_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 5607, 0x07, "Hover Boots Chest", "Shadow Temple Hover Boots Chest", RHT_SHADOW_TEMPLE_HOVER_BOOTS_CHEST, RG_HOVER_BOOTS, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE, true); + locationTable[RC_SHADOW_TEMPLE_COMPASS_CHEST] = Location::Chest(RC_SHADOW_TEMPLE_COMPASS_CHEST, RCQUEST_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 6147, 0x03, "Compass Chest", "Shadow Temple Compass Chest", RHT_SHADOW_TEMPLE_COMPASS_CHEST, RG_SHADOW_TEMPLE_COMPASS, { Category::cVanillaCompass }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE, true); + locationTable[RC_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST] = Location::Chest(RC_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 22594, 0x02, "Early Silver Rupee Chest", "Shadow Temple Early Silver Rupee Chest", RHT_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, RG_SHADOW_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE, true); + locationTable[RC_SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST] = Location::Chest(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 22668, 0x0C, "Invisible Blades Visible Chest", "Shadow Temple Invisible Blades Visible Chest", RHT_SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, RG_BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST] = Location::Chest(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 26998, 0x16, "Invisible Blades Invisible Chest", "Shadow Temple Invisible Blades Invisible Chest", RHT_SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, RG_ARROWS_30, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST] = Location::Chest(RC_SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 22853, 0x05, "Falling Spikes Lower Chest", "Shadow Temple Falling Spikes Lower Chest", RHT_SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST, RG_ARROWS_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST] = Location::Chest(RC_SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 22662, 0x06, "Falling Spikes Upper Chest", "Shadow Temple Falling Spikes Upper Chest", RHT_SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST, RG_BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST] = Location::Chest(RC_SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, -30652, 0x04, "Falling Spikes Switch Chest", "Shadow Temple Falling Spikes Switch Chest", RHT_SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST, RG_SHADOW_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE, true); + locationTable[RC_SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST] = Location::Chest(RC_SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 30857, 0x09, "Invisible Spikes Chest", "Shadow Temple Invisible Spikes Chest", RHT_SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST, RG_BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_WIND_HINT_CHEST] = Location::Chest(RC_SHADOW_TEMPLE_WIND_HINT_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 26965, 0x15, "Wind Hint Chest", "Shadow Temple Wind Hint Chest", RHT_SHADOW_TEMPLE_WIND_HINT_CHEST, RG_ARROWS_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST] = Location::Chest(RC_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 30856, 0x08, "After Wind Enemy Chest", "Shadow Temple After Wind Enemy Chest", RHT_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, RG_BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST] = Location::Chest(RC_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 26708, 0x14, "After Wind Hidden Chest", "Shadow Temple After Wind Hidden Chest", RHT_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, RG_SHADOW_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE, true); + locationTable[RC_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST] = Location::Chest(RC_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 22666, 0x0A, "Spike Walls Left Chest", "Shadow Temple Spike Walls Left Chest", RHT_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, RG_BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_BOSS_KEY_CHEST] = Location::Chest(RC_SHADOW_TEMPLE_BOSS_KEY_CHEST, RCQUEST_VANILLA, RCTYPE_BOSS_KEY, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 10219, 0x0B, "Boss Key Chest", "Shadow Temple Boss Key Chest", RHT_SHADOW_TEMPLE_BOSS_KEY_CHEST, RG_SHADOW_TEMPLE_BOSS_KEY, { Category::cVanillaBossKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE, true); + locationTable[RC_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST] = Location::Chest(RC_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 30797, 0x0D, "Invisible Floormaster Chest", "Shadow Temple Invisible Floormaster Chest", RHT_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, RG_SHADOW_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE, true); + locationTable[RC_SHADOW_TEMPLE_FREESTANDING_KEY] = Location::Collectable(RC_SHADOW_TEMPLE_FREESTANDING_KEY, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 273, 0x01, "Freestanding Key", "Shadow Temple Freestanding Key", RHT_SHADOW_TEMPLE_FREESTANDING_KEY, RG_SHADOW_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE, true); + // Shadow Temple MQ + locationTable[RC_SHADOW_TEMPLE_MQ_COMPASS_CHEST] = Location::Chest(RC_SHADOW_TEMPLE_MQ_COMPASS_CHEST, RCQUEST_MQ, RCTYPE_MAP_COMPASS, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 6145, 0x01, "MQ Compass Chest", "Shadow Temple MQ Compass Chest", RHT_SHADOW_TEMPLE_MQ_COMPASS_CHEST, RG_SHADOW_TEMPLE_COMPASS, { Category::cVanillaCompass }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE, true); + locationTable[RC_SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST] = Location::Chest(RC_SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 5607, 0x07, "MQ Hover Boots Chest", "Shadow Temple MQ Hover Boots Chest", RHT_SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST, RG_HOVER_BOOTS, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE, true); + locationTable[RC_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST] = Location::Chest(RC_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, RCQUEST_MQ, RCTYPE_SMALL_KEY, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 30787, 0x03, "MQ Early Gibdos Chest", "Shadow Temple MQ Early Gibdos Chest", RHT_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, RG_SHADOW_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE, true); + locationTable[RC_SHADOW_TEMPLE_MQ_MAP_CHEST] = Location::Chest(RC_SHADOW_TEMPLE_MQ_MAP_CHEST, RCQUEST_MQ, RCTYPE_MAP_COMPASS, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 2082, 0x02, "MQ Map Chest", "Shadow Temple MQ Map Chest", RHT_SHADOW_TEMPLE_MQ_MAP_CHEST, RG_SHADOW_TEMPLE_MAP, { Category::cVanillaMap }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE, true); + locationTable[RC_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST] = Location::Chest(RC_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, -30417, 0x0F, "MQ Beamos Silver Rupees Chest", "Shadow Temple MQ Beamos Silver Rupees Chest", RHT_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, RG_ARROWS_5, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST] = Location::Chest(RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 22662, 0x04, "MQ Falling Spikes Switch Chest", "Shadow Temple MQ Falling Spikes Switch Chest", RHT_SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST, RG_SHADOW_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE, true); + locationTable[RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST] = Location::Chest(RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 22853, 0x05, "MQ Falling Spikes Lower Chest", "Shadow Temple MQ Falling Spikes Lower Chest", RHT_SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST, RG_ARROWS_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST] = Location::Chest(RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST, RCQUEST_MQ, RCTYPE_SMALL_KEY, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, -30652, 0x06, "MQ Falling Spikes Upper Chest", "Shadow Temple MQ Falling Spikes Upper Chest", RHT_SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST, RG_ARROWS_5, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST] = Location::Chest(RC_SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 30857, 0x09, "MQ Invisible Spikes Chest", "Shadow Temple MQ Invisible Spikes Chest", RHT_SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST, RG_BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST] = Location::Chest(RC_SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST, RCQUEST_MQ, RCTYPE_BOSS_KEY, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 10219, 0x0B, "MQ Boss Key Chest", "Shadow Temple MQ Boss Key Chest", RHT_SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST, RG_SHADOW_TEMPLE_BOSS_KEY, { Category::cVanillaBossKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE, true); + locationTable[RC_SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST] = Location::Chest(RC_SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST, RCQUEST_MQ, RCTYPE_SMALL_KEY, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 22666, 0x0A, "MQ Spike Walls Left Chest", "Shadow Temple MQ Spike Walls Left Chest", RHT_SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST, RG_BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST] = Location::Chest(RC_SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 31184, 0x10, "MQ Stalfos Room Chest", "Shadow Temple MQ Stalfos Room Chest", RHT_SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST, RG_RED_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST] = Location::Chest(RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST, RCQUEST_MQ, RCTYPE_SMALL_KEY, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 26710, 0x16, "MQ Invisible Blades Invisible Chest", "Shadow Temple MQ Invisible Blades Invisible Chest", RHT_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST, RG_SHADOW_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE, true); + locationTable[RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST] = Location::Chest(RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 22668, 0x0C, "MQ Invisible Blades Visible Chest", "Shadow Temple MQ Invisible Blades Visible Chest", RHT_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST, RG_BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST] = Location::Chest(RC_SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 31053, 0x0D, "MQ Bomb Flower Chest", "Shadow Temple MQ Bomb Flower Chest", RHT_SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST, RG_ARROWS_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_MQ_WIND_HINT_CHEST] = Location::Chest(RC_SHADOW_TEMPLE_MQ_WIND_HINT_CHEST, RCQUEST_MQ, RCTYPE_SMALL_KEY, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 26709, 0x15, "MQ Wind Hint Chest", "Shadow Temple MQ Wind Hint Chest", RHT_SHADOW_TEMPLE_MQ_WIND_HINT_CHEST, RG_SHADOW_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE, true); + locationTable[RC_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST] = Location::Chest(RC_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 26932, 0x14, "MQ After Wind Hidden Chest", "Shadow Temple MQ After Wind Hidden Chest", RHT_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST, RG_ARROWS_5, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST] = Location::Chest(RC_SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 30856, 0x08, "MQ After Wind Enemy Chest", "Shadow Temple MQ After Wind Enemy Chest", RHT_SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST, RG_BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST] = Location::Chest(RC_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, RCQUEST_MQ, RCTYPE_SMALL_KEY, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 26702, 0x0E, "MQ Near Ship Invisible Chest", "Shadow Temple MQ Near Ship Invisible Chest", RHT_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, RG_SHADOW_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE, true); + locationTable[RC_SHADOW_TEMPLE_MQ_FREESTANDING_KEY] = Location::Collectable(RC_SHADOW_TEMPLE_MQ_FREESTANDING_KEY, RCQUEST_MQ, RCTYPE_SMALL_KEY, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 1553, 0x06, "MQ Freestanding Key", "Shadow Temple MQ Freestanding Key", RHT_SHADOW_TEMPLE_MQ_FREESTANDING_KEY, RG_SHADOW_TEMPLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE, true); + + // Randomizer Check Randomizer Check Quest Type Area Actor ID Scene ID Params Flags Short Name Spoiler Name Hint Text Key Vanilla Item Categories Collection Check Group Vanilla Progression + // Bottom of the Well Vanilla + locationTable[RC_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST] = Location::Chest( RC_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_BOX, SCENE_BOTTOM_OF_THE_WELL, 22600, 0x08, "Front Left Fake Wall Chest", "Bottom of the Well Front Left Fake Wall Chest", RHT_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, RG_BOTTOM_OF_THE_WELL_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL, true); + locationTable[RC_BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST] = Location::Chest( RC_BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_BOX, SCENE_BOTTOM_OF_THE_WELL, 20578, 0x02, "Front Center Bombable Chest", "Bottom of the Well Front Center Bombable Chest", RHT_BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST, RG_BOMBCHU_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST] = Location::Chest( RC_BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_BOX, SCENE_BOTTOM_OF_THE_WELL, 22597, 0x05, "Right Bottom Fake Wall Chest", "Bottom of the Well Right Bottom Fake Wall Chest", RHT_BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST, RG_BOTTOM_OF_THE_WELL_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL, true); + locationTable[RC_BOTTOM_OF_THE_WELL_COMPASS_CHEST] = Location::Chest( RC_BOTTOM_OF_THE_WELL_COMPASS_CHEST, RCQUEST_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_BOX, SCENE_BOTTOM_OF_THE_WELL, 2049, 0x01, "Compass Chest", "Bottom of the Well Compass Chest", RHT_BOTTOM_OF_THE_WELL_COMPASS_CHEST, RG_BOTTOM_OF_THE_WELL_COMPASS, { Category::cVanillaCompass }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL, true); + locationTable[RC_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST] = Location::Chest( RC_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_BOX, SCENE_BOTTOM_OF_THE_WELL, 20558, 0x0E, "Center Skulltula Chest", "Bottom of the Well Center Skulltula Chest", RHT_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST, RG_DEKU_NUTS_5, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST] = Location::Chest( RC_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_BOX, SCENE_BOTTOM_OF_THE_WELL, 23684, 0x04, "Back Left Bombable Chest", "Bottom of the Well Back Left Bombable Chest", RHT_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST, RG_DEKU_NUTS_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST] = Location::Chest( RC_BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST, RCQUEST_VANILLA, RCTYPE_BOSS_HEART_OR_OTHER_REWARD, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_BOX, SCENE_BOTTOM_OF_THE_WELL, 4419, 0x03, "Lens of Truth Chest", "Bottom of the Well Lens of Truth Chest", RHT_BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST, RG_LENS_OF_TRUTH, { Category::cSongDungeonReward }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL, true); + locationTable[RC_BOTTOM_OF_THE_WELL_INVISIBLE_CHEST] = Location::Chest( RC_BOTTOM_OF_THE_WELL_INVISIBLE_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_BOX, SCENE_BOTTOM_OF_THE_WELL, 27348, 0x14, "Invisible Chest", "Bottom of the Well Invisible Chest", RHT_BOTTOM_OF_THE_WELL_INVISIBLE_CHEST, RG_HUGE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST] = Location::Chest( RC_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_BOX, SCENE_BOTTOM_OF_THE_WELL, 23760, 0x10, "Underwater Front Chest", "Bottom of the Well Underwater Front Chest", RHT_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST, RG_BOMBS_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST] = Location::Chest( RC_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_BOX, SCENE_BOTTOM_OF_THE_WELL, 22793, 0x09, "Underwater Left Chest", "Bottom of the Well Underwater Left Chest", RHT_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST, RG_RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_MAP_CHEST] = Location::Chest( RC_BOTTOM_OF_THE_WELL_MAP_CHEST, RCQUEST_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_BOX, SCENE_BOTTOM_OF_THE_WELL, 2087, 0x07, "Map Chest", "Bottom of the Well Map Chest", RHT_BOTTOM_OF_THE_WELL_MAP_CHEST, RG_BOTTOM_OF_THE_WELL_MAP, { Category::cVanillaMap }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL, true); + locationTable[RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST] = Location::Chest( RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_BOX, SCENE_BOTTOM_OF_THE_WELL, 21802, 0x0A, "Fire Keese Chest", "Bottom of the Well Fire Keese Chest", RHT_BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST, RG_DEKU_SHIELD, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST] = Location::Chest( RC_BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_BOX, SCENE_BOTTOM_OF_THE_WELL, 21836, 0x0C, "Like Like Chest", "Bottom of the Well Like Like Chest", RHT_BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST, RG_HYLIAN_SHIELD, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_FREESTANDING_KEY] = Location::Chest( RC_BOTTOM_OF_THE_WELL_FREESTANDING_KEY, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 273, 0x01, "Freestanding Key", "Bottom of the Well Freestanding Key", RHT_BOTTOM_OF_THE_WELL_FREESTANDING_KEY, RG_BOTTOM_OF_THE_WELL_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL, true); + // Bottom of the Well Master Quest + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_MAP_CHEST] = Location::Chest( RC_BOTTOM_OF_THE_WELL_MQ_MAP_CHEST, RCQUEST_MQ, RCTYPE_MAP_COMPASS, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_BOX, SCENE_BOTTOM_OF_THE_WELL, 2083, 0x03, "MQ Map Chest", "Bottom of the Well MQ Map Chest", RHT_BOTTOM_OF_THE_WELL_MQ_MAP_CHEST, RG_BOTTOM_OF_THE_WELL_MAP, { Category::cVanillaMap }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL, true); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST] = Location::Chest( RC_BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST, RCQUEST_MQ, RCTYPE_BOSS_HEART_OR_OTHER_REWARD, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_BOX, SCENE_BOTTOM_OF_THE_WELL, -20159, 0x01, "MQ Lens of Truth Chest", "Bottom of the Well MQ Lens of Truth Chest", RHT_BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST, RG_LENS_OF_TRUTH, { Category::cSongDungeonReward }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL, true); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST] = Location::Chest( RC_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, RCQUEST_MQ, RCTYPE_MAP_COMPASS, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_BOX, SCENE_BOTTOM_OF_THE_WELL, 6146, 0x02, "MQ Compass Chest", "Bottom of the Well MQ Compass Chest", RHT_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, RG_BOTTOM_OF_THE_WELL_COMPASS, { Category::cVanillaCompass }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL, true); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY, RCQUEST_MQ, RCTYPE_SMALL_KEY, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 529, 0x02, "MQ Dead Hand Freestanding Key", "Bottom of the Well MQ Dead Hand Freestanding Key", RHT_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY, RG_BOTTOM_OF_THE_WELL_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL, true); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY, RCQUEST_MQ, RCTYPE_SMALL_KEY, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 273, 0x01, "MQ East Inner Room Freestanding Key", "Bottom of the Well MQ East Inner Room Freestanding Key", RHT_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY, RG_BOTTOM_OF_THE_WELL_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL, true); + + // Randomizer Check Randomizer Check Quest Type Area Actor ID Scene ID Params Flag Short Name Spoiler Name Hint Text Key Vanilla Item Categories Collection Check Group Vanilla Progression + // Ice Cavern Vanilla + locationTable[RC_ICE_CAVERN_MAP_CHEST] = Location::Chest( RC_ICE_CAVERN_MAP_CHEST, RCQUEST_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_ICE_CAVERN, ACTOR_EN_BOX, SCENE_ICE_CAVERN, 2080, 0x00, "Map Chest", "Ice Cavern Map Chest", RHT_ICE_CAVERN_MAP_CHEST, RG_ICE_CAVERN_MAP, { Category::cVanillaMap }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN, true); + locationTable[RC_ICE_CAVERN_COMPASS_CHEST] = Location::Chest( RC_ICE_CAVERN_COMPASS_CHEST, RCQUEST_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_ICE_CAVERN, ACTOR_EN_BOX, SCENE_ICE_CAVERN, 2049, 0x01, "Compass Chest", "Ice Cavern Compass Chest", RHT_ICE_CAVERN_COMPASS_CHEST, RG_ICE_CAVERN_COMPASS, { Category::cVanillaCompass }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN, true); + locationTable[RC_ICE_CAVERN_IRON_BOOTS_CHEST] = Location::Chest( RC_ICE_CAVERN_IRON_BOOTS_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, ACTOR_EN_BOX, SCENE_ICE_CAVERN, 5570, 0x02, "Iron Boots Chest", "Ice Cavern Iron Boots Chest", RHT_ICE_CAVERN_IRON_BOOTS_CHEST, RG_IRON_BOOTS, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN, true); + locationTable[RC_ICE_CAVERN_FREESTANDING_POH] = Location::Collectable(RC_ICE_CAVERN_FREESTANDING_POH, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, 262, 0x01, "Freestanding PoH", "Ice Cavern Freestanding PoH", RHT_ICE_CAVERN_FREESTANDING_POH, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN, true); + // Ice Cavern Master Quest + locationTable[RC_ICE_CAVERN_MQ_IRON_BOOTS_CHEST] = Location::Chest( RC_ICE_CAVERN_MQ_IRON_BOOTS_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, ACTOR_EN_BOX, SCENE_ICE_CAVERN, 5570, 0x02, "MQ Iron Boots Chest", "Ice Cavern MQ Iron Boots Chest", RHT_ICE_CAVERN_MQ_IRON_BOOTS_CHEST, RG_IRON_BOOTS, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN, true); + locationTable[RC_ICE_CAVERN_MQ_COMPASS_CHEST] = Location::Chest( RC_ICE_CAVERN_MQ_COMPASS_CHEST, RCQUEST_MQ, RCTYPE_MAP_COMPASS, RCAREA_ICE_CAVERN, ACTOR_EN_BOX, SCENE_ICE_CAVERN, 2048, 0x00, "MQ Compass Chest", "Ice Cavern MQ Compass Chest", RHT_ICE_CAVERN_MQ_COMPASS_CHEST, RG_ICE_CAVERN_COMPASS, { Category::cVanillaCompass }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN, true); + locationTable[RC_ICE_CAVERN_MQ_MAP_CHEST] = Location::Chest( RC_ICE_CAVERN_MQ_MAP_CHEST, RCQUEST_MQ, RCTYPE_MAP_COMPASS, RCAREA_ICE_CAVERN, ACTOR_EN_BOX, SCENE_ICE_CAVERN, -18399, 0x01, "MQ Map Chest", "Ice Cavern MQ Map Chest", RHT_ICE_CAVERN_MQ_MAP_CHEST, RG_ICE_CAVERN_MAP, { Category::cVanillaMap }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN, true); + locationTable[RC_ICE_CAVERN_MQ_FREESTANDING_POH] = Location::Collectable(RC_ICE_CAVERN_MQ_FREESTANDING_POH, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, 262, 0x01, "MQ Freestanding PoH", "Ice Cavern MQ Freestanding PoH", RHT_ICE_CAVERN_MQ_FREESTANDING_POH, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN, true); + + // Randomizer Check Randomizer Check Quest Type Area Actor ID Scene ID Params Flag Short Name Spoiler Name Hint Text Key Vanilla Item Categories Collection Check Group Vanilla Progression + // Gerudo Training Grounds Vanilla + locationTable[RC_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, -30573, 0x13, "Lobby Left Chest", "Gerudo Training Grounds Lobby Left Chest", RHT_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST, RG_BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[RC_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, -30393, 0x07, "Lobby Right Chest", "Gerudo Training Grounds Lobby Right Chest", RHT_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST, RG_ARROWS_10, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[RC_GERUDO_TRAINING_GROUND_STALFOS_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_STALFOS_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, -30656, 0x00, "Stalfos Chest", "Gerudo Training Grounds Stalfos Chest", RHT_GERUDO_TRAINING_GROUND_STALFOS_CHEST, RG_GERUDO_TRAINING_GROUNDS_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND, true); + locationTable[RC_GERUDO_TRAINING_GROUND_BEAMOS_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_BEAMOS_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, -30655, 0x01, "Beamos Chest", "Gerudo Training Grounds Beamos Chest", RHT_GERUDO_TRAINING_GROUND_BEAMOS_CHEST, RG_GERUDO_TRAINING_GROUNDS_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND, true); + locationTable[RC_GERUDO_TRAINING_GROUND_HIDDEN_CEILING_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_HIDDEN_CEILING_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 22603, 0x0B, "Hidden Ceiling Chest", "Gerudo Training Grounds Hidden Ceiling Chest", RHT_GERUDO_TRAINING_GROUND_HIDDEN_CEILING_CHEST, RG_GERUDO_TRAINING_GROUNDS_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND, true); + locationTable[RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FIRST_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FIRST_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 23206, 0x06, "Maze Path First Chest", "Gerudo Training Grounds Maze Path First Chest", RHT_GERUDO_TRAINING_GROUND_MAZE_PATH_FIRST_CHEST, RG_PURPLE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[RC_GERUDO_TRAINING_GROUND_MAZE_PATH_SECOND_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_MAZE_PATH_SECOND_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 22986, 0x0A, "Maze Path Second Chest", "Gerudo Training Grounds Maze Path Second Chest", RHT_GERUDO_TRAINING_GROUND_MAZE_PATH_SECOND_CHEST, RG_RED_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[RC_GERUDO_TRAINING_GROUND_MAZE_PATH_THIRD_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_MAZE_PATH_THIRD_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 22889, 0x09, "Maze Path Third Chest", "Gerudo Training Grounds Maze Path Third Chest", RHT_GERUDO_TRAINING_GROUND_MAZE_PATH_THIRD_CHEST, RG_ARROWS_30, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FINAL_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FINAL_CHEST, RCQUEST_VANILLA, RCTYPE_BOSS_HEART_OR_OTHER_REWARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 2860, 0x0C, "Maze Path Final Chest", "Gerudo Training Grounds Maze Path Final Chest", RHT_GERUDO_TRAINING_GROUND_MAZE_PATH_FINAL_CHEST, RG_ICE_ARROWS, { Category::cSongDungeonReward }, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND, true); + locationTable[RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_CENTRAL_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_CENTRAL_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 23877, 0x05, "Maze Right Central Chest", "Gerudo Training Grounds Maze Right Central Chest", RHT_GERUDO_TRAINING_GROUND_MAZE_RIGHT_CENTRAL_CHEST, RG_BOMBCHU_5, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 22888, 0x08, "Maze Right Side Chest", "Gerudo Training Grounds Maze Right Side Chest", RHT_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST, RG_ARROWS_30, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[RC_GERUDO_TRAINING_GROUND_UNDERWATER_SILVER_RUPEE_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_UNDERWATER_SILVER_RUPEE_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, -30643, 0x0D, "Underwater Silver Rupee Chest", "Gerudo Training Grounds Underwater Silver Rupee Chest", RHT_GERUDO_TRAINING_GROUND_UNDERWATER_SILVER_RUPEE_CHEST, RG_GERUDO_TRAINING_GROUNDS_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND, true); + locationTable[RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 31058, 0x12, "Hammer Room Clear Chest", "Gerudo Training Grounds Hammer Room Clear Chest", RHT_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST, RG_ARROWS_10, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_SWITCH_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_SWITCH_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 22608, 0x10, "Hammer Room Switch Chest", "Gerudo Training Grounds Hammer Room Switch Chest", RHT_GERUDO_TRAINING_GROUND_HAMMER_ROOM_SWITCH_CHEST, RG_GERUDO_TRAINING_GROUNDS_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND, true); + locationTable[RC_GERUDO_TRAINING_GROUND_EYE_STATUE_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_EYE_STATUE_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, -30653, 0x03, "Eye Statue Chest", "Gerudo Training Grounds Eye Statue Chest", RHT_GERUDO_TRAINING_GROUND_EYE_STATUE_CHEST, RG_GERUDO_TRAINING_GROUNDS_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND, true); + locationTable[RC_GERUDO_TRAINING_GROUND_NEAR_SCARECROW_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_NEAR_SCARECROW_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 22596, 0x04, "Near Scarecrow Chest", "Gerudo Training Grounds Near Scarecrow Chest", RHT_GERUDO_TRAINING_GROUND_NEAR_SCARECROW_CHEST, RG_GERUDO_TRAINING_GROUNDS_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND, true); + locationTable[RC_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 31089, 0x11, "Before Heavy Block Chest", "Gerudo Training Grounds Before Heavy Block Chest", RHT_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST, RG_ARROWS_30, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FIRST_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FIRST_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 31439, 0x0F, "Heavy Block First Chest", "Gerudo Training Grounds Heavy Block First Chest", RHT_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FIRST_CHEST, RG_HUGE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_SECOND_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_SECOND_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 30862, 0x0E, "Heavy Block Second Chest", "Gerudo Training Grounds Heavy Block Second Chest", RHT_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_SECOND_CHEST, RG_BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 26708, 0x14, "Heavy Block Third Chest", "Gerudo Training Grounds Heavy Block Third Chest", RHT_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST, RG_GERUDO_TRAINING_GROUNDS_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND, true); + locationTable[RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 24450, 0x02, "Heavy Block Fourth Chest", "Gerudo Training Grounds Heavy Block Fourth Chest", RHT_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST, RG_ICE_TRAP, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[RC_GERUDO_TRAINING_GROUND_FREESTANDING_KEY] = Location::Collectable(RC_GERUDO_TRAINING_GROUND_FREESTANDING_KEY, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, 273, 0x01, "Freestanding Key", "Gerudo Training Grounds Freestanding Key", RHT_GERUDO_TRAINING_GROUND_FREESTANDING_KEY, RG_GERUDO_TRAINING_GROUNDS_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND, true); + // Gerudo Training Grounds Master Quest + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 23879, 0x07, "MQ Lobby Right Chest", "Gerudo Training Grounds MQ Lobby Right Chest", RHT_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_CHEST, RG_BOMBCHU_5, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 22867, 0x13, "MQ Lobby Left Chest", "Gerudo Training Grounds MQ Lobby Left Chest", RHT_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_CHEST, RG_ARROWS_10, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, -30304, 0x00, "MQ First Iron Knuckle Chest", "Gerudo Training Grounds MQ First Iron Knuckle Chest", RHT_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST, RG_BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_BEFORE_HEAVY_BLOCK_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_MQ_BEFORE_HEAVY_BLOCK_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 31057, 0x11, "MQ Before Heavy Block Chest", "Gerudo Training Grounds MQ Before Heavy Block Chest", RHT_GERUDO_TRAINING_GROUND_MQ_BEFORE_HEAVY_BLOCK_CHEST, RG_ARROWS_10, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_EYE_STATUE_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_MQ_EYE_STATUE_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, -32669, 0x03, "MQ Eye Statue Chest", "Gerudo Training Grounds MQ Eye Statue Chest", RHT_GERUDO_TRAINING_GROUND_MQ_EYE_STATUE_CHEST, RG_BOMBCHU_10, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_FLAME_CIRCLE_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_MQ_FLAME_CIRCLE_CHEST, RCQUEST_MQ, RCTYPE_SMALL_KEY, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, -30642, 0x0E, "MQ Flame Circle Chest", "Gerudo Training Grounds MQ Flame Circle Chest", RHT_GERUDO_TRAINING_GROUND_MQ_FLAME_CIRCLE_CHEST, RG_GERUDO_TRAINING_GROUNDS_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND, true); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_SECOND_IRON_KNUCKLE_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_MQ_SECOND_IRON_KNUCKLE_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 31058, 0x12, "MQ Second Iron Knuckle Chest", "Gerudo Training Grounds MQ Second Iron Knuckle Chest", RHT_GERUDO_TRAINING_GROUND_MQ_SECOND_IRON_KNUCKLE_CHEST, RG_ARROWS_10, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST, RCQUEST_MQ, RCTYPE_SMALL_KEY, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, -30655, 0x01, "MQ Dinolfos Chest", "Gerudo Training Grounds MQ Dinolfos Chest", RHT_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST, RG_GERUDO_TRAINING_GROUNDS_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND, true); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_ICE_ARROWS_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_MQ_ICE_ARROWS_CHEST, RCQUEST_MQ, RCTYPE_BOSS_HEART_OR_OTHER_REWARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, -17628, 0x04, "MQ Ice Arrows Chest", "Gerudo Training Grounds MQ Ice Arrows Chest", RHT_GERUDO_TRAINING_GROUND_MQ_ICE_ARROWS_CHEST, RG_ICE_ARROWS, { Category::cSongDungeonReward }, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND, true); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_CENTRAL_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_CENTRAL_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 22661, 0x05, "MQ Maze Right Central Chest", "Gerudo Training Grounds MQ Maze Right Central Chest", RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_CENTRAL_CHEST, RG_BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_FIRST_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_FIRST_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 22918, 0x06, "MQ Maze Path First Chest", "Gerudo Training Grounds MQ Maze Path First Chest", RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_FIRST_CHEST, RG_GREEN_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_SIDE_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_SIDE_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 24136, 0x08, "MQ Maze Right Side Chest", "Gerudo Training Grounds MQ Maze Right Side Chest", RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_SIDE_CHEST, RG_TREASURE_GAME_GREEN_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST] = Location::Chest( RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 24137, 0x09, "MQ Maze Path Third Chest", "Gerudo Training Grounds MQ Maze Path Third Chest", RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST, RG_TREASURE_GAME_GREEN_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_SECOND_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_SECOND_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 22986, 0x0A, "MQ Maze Path Second Chest", "Gerudo Training Grounds MQ Maze Path Second Chest", RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_SECOND_CHEST, RG_RED_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 23211, 0x0B, "MQ Hidden Ceiling Chest", "Gerudo Training Grounds MQ Hidden Ceiling Chest", RHT_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST, RG_PURPLE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, RCQUEST_MQ, RCTYPE_SMALL_KEY, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, -30643, 0x0D, "MQ Underwater Silver Rupee Chest", "Gerudo Training Grounds MQ Underwater Silver Rupee Chest", RHT_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, RG_TREASURE_GAME_GREEN_RUPEE, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND, true); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST] = Location::Chest(RC_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 31394, 0x02, "MQ Heavy Block Chest", "Gerudo Training Grounds MQ Heavy Block Chest", RHT_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST, RG_PURPLE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + + // Randomizer Check Randomizer Check Quest Type Area Actor ID Scene ID Params Flag Short Name Spoiler Name Hint Text Key Vanilla Item Categories Spoiler Collection Check Collection Check Group Vanilla Progression + // Ganon's Castle Shared + locationTable[RC_GANONS_TOWER_BOSS_KEY_CHEST] = Location::Chest(RC_GANONS_TOWER_BOSS_KEY_CHEST, RCQUEST_BOTH, RCTYPE_GANON_BOSS_KEY, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_GANONS_TOWER, 10219, 0x0B, "Boss Key Chest", "Ganon's Tower Boss Key Chest", RHT_GANONS_TOWER_BOSS_KEY_CHEST, RG_GANONS_CASTLE_BOSS_KEY, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE, true); + // Ganon's Castle Vanilla + locationTable[RC_GANONS_CASTLE_FOREST_TRIAL_CHEST] = Location::Chest(RC_GANONS_CASTLE_FOREST_TRIAL_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, 30857, 0x09, "Forest Trial Chest", "Ganon's Castle Forest Trial Chest", RHT_GANONS_CASTLE_FOREST_TRIAL_CHEST, RG_BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST] = Location::Chest(RC_GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, 24455, 0x07, "Water Trial Left Chest", "Ganon's Castle Water Trial Left Chest", RHT_GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST, RG_ICE_TRAP, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST] = Location::Chest(RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, 22790, 0x06, "Water Trial Right Chest", "Ganon's Castle Water Trial Right Chest", RHT_GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST, RG_RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST] = Location::Chest(RC_GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, 22664, 0x08, "Shadow Trial Front Chest", "Ganon's Castle Shadow Trial Front Chest", RHT_GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST, RG_BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST] = Location::Chest(RC_GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, 14021, 0x05, "Shadow Trial Golden Gauntlets Chest", "Ganon's Castle Shadow Trial Golden Gauntlets Chest", RHT_GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST, RG_PROGRESSIVE_STRENGTH, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE, true); + locationTable[RC_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST] = Location::Chest(RC_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, -29326, 0x12, "Spirit Trial Crystal Switch Chest", "Ganon's Castle Spirit Trial Crystal Switch Chest", RHT_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, RG_BOMBCHU_20, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST] = Location::Chest(RC_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, 26964, 0x14, "Spirit Trial Invisible Chest", "Ganon's Castle Spirit Trial Invisible Chest", RHT_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, RG_ARROWS_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST] = Location::Chest(RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, 22668, 0x0C, "Light Trial First Left Chest", "Ganon's Castle Light Trial First Left Chest", RHT_GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST, RG_BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST] = Location::Chest(RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, 24459, 0x0B, "Light Trial Second Left Chest", "Ganon's Castle Light Trial Second Left Chest", RHT_GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST, RG_ICE_TRAP, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST] = Location::Chest(RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, 22797, 0x0D, "Light Trial Third Left Chest", "Ganon's Castle Light Trial Third Left Chest", RHT_GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST, RG_RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST] = Location::Chest(RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, 24462, 0x0E, "Light Trial First Right Chest", "Ganon's Castle Light Trial First Right Chest", RHT_GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST, RG_ICE_TRAP, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST] = Location::Chest(RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, 22890, 0x0A, "Light Trial Second Right Chest", "Ganon's Castle Light Trial Second Right Chest", RHT_GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST, RG_ARROWS_30, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST] = Location::Chest(RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, 24463, 0x0F, "Light Trial Third Right Chest", "Ganon's Castle Light Trial Third Right Chest", RHT_GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST, RG_ICE_TRAP, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST] = Location::Chest(RC_GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, 30800, 0x10, "Light Trial Invisible Enemies Chest", "Ganon's Castle Light Trial Invisible Enemies Chest", RHT_GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST, RG_GANONS_CASTLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE, true); + locationTable[RC_GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST] = Location::Chest(RC_GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST, RCQUEST_VANILLA, RCTYPE_SMALL_KEY, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, -30639, 0x11, "Light Trial Lullaby Chest", "Ganon's Castle Light Trial Lullaby Chest", RHT_GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST, RG_GANONS_CASTLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE, true); + locationTable[RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT] = Location::Base(RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, RCQUEST_VANILLA, RCTYPE_SCRUB, RCAREA_GANONS_CASTLE, ACTOR_EN_DNS, SCENE_INSIDE_GANONS_CASTLE, 0x05, 0x37, "Deku Scrub Center-Left", "Ganon's Castle Deku Scrub Center-Left", RHT_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, RG_BUY_BOMBS_535, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x0D, 0x06), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT] = Location::Base(RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, RCQUEST_VANILLA, RCTYPE_SCRUB, RCAREA_GANONS_CASTLE, ACTOR_EN_DNS, SCENE_INSIDE_GANONS_CASTLE, 0x03, 0x33, "Deku Scrub Center-Right", "Ganon's Castle Deku Scrub Center-Right", RHT_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, RG_BUY_ARROWS_30, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x0D, 0x04), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT] = Location::Base(RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT, RCQUEST_VANILLA, RCTYPE_SCRUB, RCAREA_GANONS_CASTLE, ACTOR_EN_DNS, SCENE_INSIDE_GANONS_CASTLE, 0x07, 0x39, "Deku Scrub Right", "Ganon's Castle Deku Scrub Right", RHT_GANONS_CASTLE_DEKU_SCRUB_RIGHT, RG_BUY_RED_POTION_30, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x0D, 0x08), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_DEKU_SCRUB_LEFT] = Location::Base(RC_GANONS_CASTLE_DEKU_SCRUB_LEFT, RCQUEST_VANILLA, RCTYPE_SCRUB, RCAREA_GANONS_CASTLE, ACTOR_EN_DNS, SCENE_INSIDE_GANONS_CASTLE, 0x08, 0x3A, "Deku Scrub Left", "Ganon's Castle Deku Scrub Left", RHT_GANONS_CASTLE_DEKU_SCRUB_LEFT, RG_BUY_GREEN_POTION, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x0D, 0x09), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + // Ganon's Castle MQ + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST] = Location::Chest(RC_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, 22977, 0x01, "MQ Water Trial Chest", "Ganon's Castle MQ Water Trial Chest", RHT_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, RG_RED_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST] = Location::Chest(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, -30398, 0x02, "MQ Forest Trial Eye Switch Chest", "Ganon's Castle MQ Forest Trial Eye Switch Chest", RHT_GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, RG_ARROWS_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST] = Location::Chest(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, -32733, 0x03, "MQ Forest Trial Frozen Eye Switch Chest", "Ganon's Castle MQ Forest Trial Frozen Eye Switch Chest", RHT_GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST, RG_BOMBS_5, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST] = Location::Chest(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, -30460, 0x04, "MQ Light Trial Lullaby Chest", "Ganon's Castle MQ Light Trial Lullaby Chest", RHT_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, RG_RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST] = Location::Chest(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, -30400, 0x00, "MQ Shadow Trial Bomb Flower Chest", "Ganon's Castle MQ Shadow Trial Bomb Flower Chest", RHT_GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST, RG_ARROWS_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST] = Location::Chest(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, RCQUEST_MQ, RCTYPE_SMALL_KEY, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, -30651, 0x05, "MQ Shadow Trial Eye Switch Chest", "Ganon's Castle MQ Shadow Trial Eye Switch Chest", RHT_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, RG_GANONS_CASTLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE, true); + locationTable[RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST] = Location::Chest(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, -18746, 0x06, "MQ Spirit Trial Golden Gauntlets Chest", "Ganon's Castle MQ Spirit Trial Golden Gauntlets Chest", RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST, RG_PROGRESSIVE_STRENGTH, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE, true); + locationTable[RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST] = Location::Chest(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, -30457, 0x07, "MQ Spirit Trial Sun Back Right Chest", "Ganon's Castle MQ Spirit Trial Sun Back Right Chest", RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST, RG_RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST] = Location::Chest(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST, RCQUEST_MQ, RCTYPE_SMALL_KEY, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, -30648, 0x08, "MQ Spirit Trial Sun Back Left Chest", "Ganon's Castle MQ Spirit Trial Sun Back Left Chest", RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST, RG_GANONS_CASTLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST] = Location::Chest(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, -30455, 0x09, "MQ Spirit Trial Sun Front Left Chest", "Ganon's Castle MQ Spirit Trial Sun Front Left Chest", RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST, RG_RECOVERY_HEART, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST] = Location::Chest(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, 20586, 0x0A, "MQ Spirit Trial First Chest", "Ganon's Castle MQ Spirit Trial First Chest", RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST, RG_BOMBCHU_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST] = Location::Chest(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, 26964, 0x14, "MQ Spirit Trial Invisible Chest", "Ganon's Castle MQ Spirit Trial Invisible Chest", RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, RG_ARROWS_10, {}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY] = Location::Collectable(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, RCQUEST_MQ, RCTYPE_SMALL_KEY, RCAREA_GANONS_CASTLE, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, 273, 0x01, "MQ Forest Trial Freestanding Key", "Ganon's Castle MQ Forest Trial Freestanding Key", RHT_GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, RG_GANONS_CASTLE_SMALL_KEY, { Category::cVanillaSmallKey }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE, true); + locationTable[RC_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT] = Location::Base(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, RCQUEST_MQ, RCTYPE_SCRUB, RCAREA_GANONS_CASTLE, ACTOR_EN_DNS, SCENE_INSIDE_GANONS_CASTLE, 0x00, 0x30, "MQ Deku Scrub Right", "Ganon's Castle MQ Deku Scrub Right", RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, RG_BUY_DEKU_NUT_5, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x0D, 0x01), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT] = Location::Base(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, RCQUEST_MQ, RCTYPE_SCRUB, RCAREA_GANONS_CASTLE, ACTOR_EN_DNS, SCENE_INSIDE_GANONS_CASTLE, 0x05, 0x37, "MQ Deku Scrub Center-Left", "Ganon's Castle MQ Deku Scrub Center-Left", RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, RG_BUY_BOMBS_535, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x0D, 0x06), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER] = Location::Base(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, RCQUEST_MQ, RCTYPE_SCRUB, RCAREA_GANONS_CASTLE, ACTOR_EN_DNS, SCENE_INSIDE_GANONS_CASTLE, 0x03, 0x33, "MQ Deku Scrub Center", "Ganon's Castle MQ Deku Scrub Center", RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, RG_BUY_ARROWS_30, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x0D, 0x04), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT] = Location::Base(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, RCQUEST_MQ, RCTYPE_SCRUB, RCAREA_GANONS_CASTLE, ACTOR_EN_DNS, SCENE_INSIDE_GANONS_CASTLE, 0x07, 0x39, "MQ Deku Scrub Center-Right", "Ganon's Castle MQ Deku Scrub Center-Right", RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, RG_BUY_RED_POTION_30, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x0D, 0x08), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT] = Location::Base(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, RCQUEST_MQ, RCTYPE_SCRUB, RCAREA_GANONS_CASTLE, ACTOR_EN_DNS, SCENE_INSIDE_GANONS_CASTLE, 0x08, 0x3A, "MQ Deku Scrub Left", "Ganon's Castle MQ Deku Scrub Left", RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, RG_BUY_GREEN_POTION, { Category::cDekuScrub }, SpoilerCollectionCheck::Scrub(0x0D, 0x09), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + + // Gold Skulltula Tokens + + // Dungeons + // Deku Tree RandomizerCheck RandomizerCheck Quest Area Scene ID params Flag Short Name Spoiler Name Hint Text Key Categories Collection Check Group + locationTable[RC_DEKU_TREE_GS_BASEMENT_BACK_ROOM] = Location::GSToken(RC_DEKU_TREE_GS_BASEMENT_BACK_ROOM, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, 8193, 0x01, "GS Basement Back Room", "Deku Tree GS Basement Back Room", RHT_DEKU_TREE_GS_BASEMENT_BACK_ROOM, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[RC_DEKU_TREE_GS_BASEMENT_GATE] = Location::GSToken(RC_DEKU_TREE_GS_BASEMENT_GATE, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, 8194, 0x02, "GS Basement Gate", "Deku Tree GS Basement Gate", RHT_DEKU_TREE_GS_BASEMENT_GATE, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[RC_DEKU_TREE_GS_BASEMENT_VINES] = Location::GSToken(RC_DEKU_TREE_GS_BASEMENT_VINES, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, 8196, 0x04, "GS Basement Vines", "Deku Tree GS Basement Vines", RHT_DEKU_TREE_GS_BASEMENT_VINES, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[RC_DEKU_TREE_GS_COMPASS_ROOM] = Location::GSToken(RC_DEKU_TREE_GS_COMPASS_ROOM, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, 8200, 0x08, "GS Compass Room", "Deku Tree GS Compass Room", RHT_DEKU_TREE_GS_COMPASS_ROOM, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[RC_DEKU_TREE_MQ_GS_LOBBY] = Location::GSToken(RC_DEKU_TREE_MQ_GS_LOBBY, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, 8194, 0x02, "MQ GS Lobby", "Deku Tree MQ GS Lobby", RHT_DEKU_TREE_MQ_GS_LOBBY, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[RC_DEKU_TREE_MQ_GS_COMPASS_ROOM] = Location::GSToken(RC_DEKU_TREE_MQ_GS_COMPASS_ROOM, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, 8200, 0x08, "MQ GS Compass Room", "Deku Tree MQ GS Compass Room", RHT_DEKU_TREE_MQ_GS_COMPASS_ROOM, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[RC_DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM] = Location::GSToken(RC_DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, 8196, 0x04, "MQ GS Basement Graves Room", "Deku Tree MQ GS Basement Graves Room", RHT_DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[RC_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM] = Location::GSToken(RC_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, 8193, 0x01, "MQ GS Basement Back Room", "Deku Tree MQ GS Basement Back Room", RHT_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + // Dodongo's Cavern + locationTable[RC_DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS] = Location::GSToken(RC_DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, 8449, 0x01, "GS Vines Above Stairs", "Dodongos Cavern GS Vines Above Stairs", RHT_DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_DODONGOS_CAVERN_GS_SCARECROW] = Location::GSToken(RC_DODONGOS_CAVERN_GS_SCARECROW, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, 8450, 0x02, "GS Scarecrow", "Dodongos Cavern GS Scarecrow", RHT_DODONGOS_CAVERN_GS_SCARECROW, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS] = Location::GSToken(RC_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, 8452, 0x04, "GS Alcove Above Stairs", "Dodongos Cavern GS Alcove Above Stairs", RHT_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_DODONGOS_CAVERN_GS_BACK_ROOM] = Location::GSToken(RC_DODONGOS_CAVERN_GS_BACK_ROOM, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, 8456, 0x08, "GS Back Room", "Dodongos Cavern GS Back Room", RHT_DODONGOS_CAVERN_GS_BACK_ROOM, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS] = Location::GSToken(RC_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, 8464, 0x10, "GS Side Room Near Lower Lizalfos", "Dodongos Cavern GS Side Room Near Lower Lizalfos", RHT_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM] = Location::GSToken(RC_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, 8450, 0x02, "MQ GS Scrub Room", "Dodongos Cavern MQ GS Scrub Room", RHT_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM] = Location::GSToken(RC_DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, 8456, 0x08, "MQ GS Song of Time Block Room", "Dodongos Cavern MQ GS Song of Time Block Room", RHT_DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM] = Location::GSToken(RC_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, 8452, 0x04, "MQ GS Lizalfos Room", "Dodongos Cavern MQ GS Lizalfos Room", RHT_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM] = Location::GSToken(RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, 8464, 0x10, "MQ GS Larvae Room", "Dodongos Cavern MQ GS Larvae Room", RHT_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_DODONGOS_CAVERN_MQ_GS_BACK_AREA] = Location::GSToken(RC_DODONGOS_CAVERN_MQ_GS_BACK_AREA, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, 8449, 0x01, "MQ GS Back Room", "Dodongos Cavern MQ GS Back Room", RHT_DODONGOS_CAVERN_MQ_GS_BACK_AREA, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER] = Location::GSToken(RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, 8705, 0x01, "GS Lobby Basement Lower", "Jabu Jabus Belly GS Lobby Basement Lower", RHT_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER] = Location::GSToken(RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, 8706, 0x02, "GS Lobby Basement Upper", "Jabu Jabus Belly GS Lobby Basement Upper", RHT_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[RC_JABU_JABUS_BELLY_GS_NEAR_BOSS] = Location::GSToken(RC_JABU_JABUS_BELLY_GS_NEAR_BOSS, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, 8708, 0x04, "GS Near Boss", "Jabu Jabus Belly GS Near Boss", RHT_JABU_JABUS_BELLY_GS_NEAR_BOSS, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[RC_JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM] = Location::GSToken(RC_JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, 8712, 0x08, "GS Water Switch Room", "Jabu Jabus Belly GS Water Switch Room", RHT_JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[RC_JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM] = Location::GSToken(RC_JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, 8708, 0x04, "MQ GS Tail Parasan Room", "Jabu Jabus Belly MQ GS Tail Parasan Room", RHT_JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[RC_JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM] = Location::GSToken(RC_JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, 8712, 0x08, "MQ GS Invisible Enemies Room", "Jabu Jabus Belly MQ GS Invisible Enemies Room", RHT_JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[RC_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM] = Location::GSToken(RC_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, 8705, 0x01, "MQ GS Boomerang Chest Room", "Jabu Jabus Belly MQ GS Boomerang Chest Room", RHT_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[RC_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS] = Location::GSToken(RC_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, 8706, 0x02, "MQ GS Near Boss", "Jabu Jabus Belly MQ GS Near Boss", RHT_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[RC_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD] = Location::GSToken(RC_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, 8961, 0x01, "GS Raised Island Courtyard", "Forest Temple GS Raised Island Courtyard", RHT_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[RC_FOREST_TEMPLE_GS_FIRST_ROOM] = Location::GSToken(RC_FOREST_TEMPLE_GS_FIRST_ROOM, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, 8962, 0x02, "GS First Room", "Forest Temple GS First Room", RHT_FOREST_TEMPLE_GS_FIRST_ROOM, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[RC_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD] = Location::GSToken(RC_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, 8964, 0x04, "GS Level Island Courtyard", "Forest Temple GS Level Island Courtyard", RHT_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[RC_FOREST_TEMPLE_GS_LOBBY] = Location::GSToken(RC_FOREST_TEMPLE_GS_LOBBY, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, 8968, 0x08, "GS Lobby", "Forest Temple GS Lobby", RHT_FOREST_TEMPLE_GS_LOBBY, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[RC_FOREST_TEMPLE_GS_BASEMENT] = Location::GSToken(RC_FOREST_TEMPLE_GS_BASEMENT, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, 8976, 0x10, "GS Basement", "Forest Temple GS Basement", RHT_FOREST_TEMPLE_GS_BASEMENT, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[RC_FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY] = Location::GSToken(RC_FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, 8962, 0x02, "MQ GS First Hallway", "Forest Temple MQ GS First Hallway", RHT_FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[RC_FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM] = Location::GSToken(RC_FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, 8976, 0x10, "MQ GS Block Push Room", "Forest Temple MQ GS Block Push Room", RHT_FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[RC_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD] = Location::GSToken(RC_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, 8961, 0x01, "MQ GS Raised Island Courtyard", "Forest Temple MQ GS Raised Island Courtyard", RHT_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[RC_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD] = Location::GSToken(RC_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, 8964, 0x04, "MQ GS Level Island Courtyard", "Forest Temple MQ GS Level Island Courtyard", RHT_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[RC_FOREST_TEMPLE_MQ_GS_WELL] = Location::GSToken(RC_FOREST_TEMPLE_MQ_GS_WELL, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, 8968, 0x08, "MQ GS Well", "Forest Temple MQ GS Well", RHT_FOREST_TEMPLE_MQ_GS_WELL, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + // Fire Temple + locationTable[RC_FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM] = Location::GSToken(RC_FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, 9217, 0x01, "GS Song of Time Room", "Fire Temple GS Song of Time Room", RHT_FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_FIRE_TEMPLE_GS_BOSS_KEY_LOOP] = Location::GSToken(RC_FIRE_TEMPLE_GS_BOSS_KEY_LOOP, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, 9218, 0x02, "GS Boss Key Loop", "Fire Temple GS Boss Key Loop", RHT_FIRE_TEMPLE_GS_BOSS_KEY_LOOP, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_FIRE_TEMPLE_GS_BOULDER_MAZE] = Location::GSToken(RC_FIRE_TEMPLE_GS_BOULDER_MAZE, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, 9220, 0x04, "GS Boulder Maze", "Fire Temple GS Boulder Maze", RHT_FIRE_TEMPLE_GS_BOULDER_MAZE, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_FIRE_TEMPLE_GS_SCARECROW_TOP] = Location::GSToken(RC_FIRE_TEMPLE_GS_SCARECROW_TOP, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, 9224, 0x08, "GS Scarecrow Top", "Fire Temple GS Scarecrow Top", RHT_FIRE_TEMPLE_GS_SCARECROW_TOP, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_FIRE_TEMPLE_GS_SCARECROW_CLIMB] = Location::GSToken(RC_FIRE_TEMPLE_GS_SCARECROW_CLIMB, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, 9232, 0x10, "GS Scarecrow Climb", "Fire Temple GS Scarecrow Climb", RHT_FIRE_TEMPLE_GS_SCARECROW_CLIMB, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE] = Location::GSToken(RC_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, 9218, 0x02, "MQ GS Above Fire Wall Maze", "Fire Temple MQ GS Above Fire Wall Maze", RHT_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER] = Location::GSToken(RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, 9224, 0x08, "MQ GS Fire Wall Maze Center", "Fire Temple MQ GS Fire Wall Maze Center", RHT_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR] = Location::GSToken(RC_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, 9217, 0x01, "MQ GS Big Lava Room Open Door", "Fire Temple MQ GS Big Lava Room Open Door", RHT_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM] = Location::GSToken(RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, 9232, 0x10, "MQ GS Fire Wall Maze Side Room", "Fire Temple MQ GS Fire Wall Maze Side Room", RHT_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE] = Location::GSToken(RC_FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, 9220, 0x04, "MQ GS Skull on Fire", "Fire Temple MQ GS Skull on Fire", RHT_FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + // Water Temple + locationTable[RC_WATER_TEMPLE_GS_BEHIND_GATE] = Location::GSToken(RC_WATER_TEMPLE_GS_BEHIND_GATE, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, 9473, 0x01, "GS Behind Gate", "Water Temple GS Behind Gate", RHT_WATER_TEMPLE_GS_BEHIND_GATE, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[RC_WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM] = Location::GSToken(RC_WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, 9474, 0x02, "GS Falling Platform Room", "Water Temple GS Falling Platform Room", RHT_WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[RC_WATER_TEMPLE_GS_CENTRAL_PILLAR] = Location::GSToken(RC_WATER_TEMPLE_GS_CENTRAL_PILLAR, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, 9476, 0x04, "GS Central Pillar", "Water Temple GS Central Pillar", RHT_WATER_TEMPLE_GS_CENTRAL_PILLAR, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[RC_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST] = Location::GSToken(RC_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, 9480, 0x08, "GS Near Boss Key Chest", "Water Temple GS Near Boss Key Chest", RHT_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[RC_WATER_TEMPLE_GS_RIVER] = Location::GSToken(RC_WATER_TEMPLE_GS_RIVER, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, 9488, 0x10, "GS River", "Water Temple GS River", RHT_WATER_TEMPLE_GS_RIVER, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[RC_WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH] = Location::GSToken(RC_WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, 9476, 0x04, "MQ GS Before Upper Water Switch", "Water Temple MQ GS Before Upper Water Switch", RHT_WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[RC_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA] = Location::GSToken(RC_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, 9480, 0x08, "MQ GS Freestanding Key Area", "Water Temple MQ GS Freestanding Key Area", RHT_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[RC_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY] = Location::GSToken(RC_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, 9473, 0x01, "MQ GS Lizalfos Hallway", "Water Temple MQ GS Lizalfos Hallway", RHT_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[RC_WATER_TEMPLE_MQ_GS_RIVER] = Location::GSToken(RC_WATER_TEMPLE_MQ_GS_RIVER, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, 9474, 0x02, "MQ GS River", "Water Temple MQ GS River", RHT_WATER_TEMPLE_MQ_GS_RIVER, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[RC_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH] = Location::GSToken(RC_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, 9488, 0x10, "MQ GS Triple Wall Torch", "Water Temple MQ GS Triple Wall Torch", RHT_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + // Spirit Temple + locationTable[RC_SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM] = Location::GSToken(RC_SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, 9729, 0x01, "GS Hall After Sun Block Room", "Spirit Temple GS Hall After Sun Block Room", RHT_SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_GS_BOULDER_ROOM] = Location::GSToken(RC_SPIRIT_TEMPLE_GS_BOULDER_ROOM, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, 9730, 0x02, "GS Boulder Room", "Spirit Temple GS Boulder Room", RHT_SPIRIT_TEMPLE_GS_BOULDER_ROOM, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_GS_LOBBY] = Location::GSToken(RC_SPIRIT_TEMPLE_GS_LOBBY, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, 9732, 0x04, "GS Lobby", "Spirit Temple GS Lobby", RHT_SPIRIT_TEMPLE_GS_LOBBY, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM] = Location::GSToken(RC_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, 9736, 0x08, "GS Sun on Floor Room", "Spirit Temple GS Sun on Floor Room", RHT_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_GS_METAL_FENCE] = Location::GSToken(RC_SPIRIT_TEMPLE_GS_METAL_FENCE, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, 9744, 0x10, "GS Metal Fence", "Spirit Temple GS Metal Fence", RHT_SPIRIT_TEMPLE_GS_METAL_FENCE, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM] = Location::GSToken(RC_SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, 9736, 0x08, "MQ GS Symphony Room", "Spirit Temple MQ GS Symphony Room", RHT_SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM] = Location::GSToken(RC_SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, 9730, 0x02, "MQ GS Leever Room", "Spirit Temple MQ GS Leever Room", RHT_SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST] = Location::GSToken(RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, 9732, 0x04, "MQ GS Nine Thrones Room West", "Spirit Temple MQ GS Nine Thrones Room West", RHT_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH] = Location::GSToken(RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, 9744, 0x10, "MQ GS Nine Thrones Room North", "Spirit Temple MQ GS Nine Thrones Room North", RHT_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM] = Location::GSToken(RC_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, 9729, 0x01, "MQ GS Sun Block Room", "Spirit Temple MQ GS Sun Block Room", RHT_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + // Shadow Temple + locationTable[RC_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT] = Location::GSToken(RC_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, 9985, 0x01, "GS Single Giant Pot", "Shadow Temple GS Single Giant Pot", RHT_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM] = Location::GSToken(RC_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, 9986, 0x02, "GS Falling Spikes Room", "Shadow Temple GS Falling Spikes Room", RHT_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT] = Location::GSToken(RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, 9988, 0x04, "GS Triple Giant Pot", "Shadow Temple GS Triple Giant Pot", RHT_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM] = Location::GSToken(RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, 9992, 0x08, "GS Like Like Room", "Shadow Temple GS Like Like Room", RHT_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_GS_NEAR_SHIP] = Location::GSToken(RC_SHADOW_TEMPLE_GS_NEAR_SHIP, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, 10000, 0x10, "GS Near Ship", "Shadow Temple GS Near Ship", RHT_SHADOW_TEMPLE_GS_NEAR_SHIP, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM] = Location::GSToken(RC_SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, 9986, 0x02, "MQ GS Falling Spikes Room", "Shadow Temple MQ GS Falling Spikes Room", RHT_SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM] = Location::GSToken(RC_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, 9985, 0x01, "MQ GS Wind Hint Room", "Shadow Temple MQ GS Wind Hint Room", RHT_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_MQ_GS_AFTER_WIND] = Location::GSToken(RC_SHADOW_TEMPLE_MQ_GS_AFTER_WIND, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, 9992, 0x08, "MQ GS After Wind", "Shadow Temple MQ GS After Wind", RHT_SHADOW_TEMPLE_MQ_GS_AFTER_WIND, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP] = Location::GSToken(RC_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, 10000, 0x10, "MQ GS After Ship", "Shadow Temple MQ GS After Ship", RHT_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS] = Location::GSToken(RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, 9988, 0x04, "MQ GS Near Boss", "Shadow Temple MQ GS Near Boss", RHT_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + // Bottom of the Well + locationTable[RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE] = Location::GSToken(RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, 10241, 0x01, "GS Like Like Cage", "Bottom of the Well GS Like Like Cage", RHT_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM] = Location::GSToken(RC_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, 10242, 0x02, "GS East Inner Room", "Bottom of the Well GS East Inner Room", RHT_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM] = Location::GSToken(RC_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, 10244, 0x04, "GS West Inner Room", "Bottom of the Well GS West Inner Room", RHT_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT] = Location::GSToken(RC_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, 10241, 0x01, "MQ GS Basement", "Bottom of the Well MQ GS Basement", RHT_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM] = Location::GSToken(RC_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, 10244, 0x04, "MQ GS Coffin Room", "Bottom of the Well MQ GS Coffin Room", RHT_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM] = Location::GSToken(RC_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, 10242, 0x02, "MQ GS West Inner Room", "Bottom of the Well MQ GS West Inner Room", RHT_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + // Ice Cavern + locationTable[RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM] = Location::GSToken(RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, 10497, 0x01, "GS Push Block Room", "Ice Cavern GS Push Block Room", RHT_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM] = Location::GSToken(RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, 10498, 0x02, "GS Spinning Scythe Room", "Ice Cavern GS Spinning Scythe Room", RHT_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[RC_ICE_CAVERN_GS_HEART_PIECE_ROOM] = Location::GSToken(RC_ICE_CAVERN_GS_HEART_PIECE_ROOM, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, 10500, 0x04, "GS Heart Piece Room", "Ice Cavern GS Heart Piece Room", RHT_ICE_CAVERN_GS_HEART_PIECE_ROOM, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[RC_ICE_CAVERN_MQ_GS_SCARECROW] = Location::GSToken(RC_ICE_CAVERN_MQ_GS_SCARECROW, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, 10497, 0x01, "MQ GS Scarecrow", "Ice Cavern MQ GS Scarecrow", RHT_ICE_CAVERN_MQ_GS_SCARECROW, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[RC_ICE_CAVERN_MQ_GS_ICE_BLOCK] = Location::GSToken(RC_ICE_CAVERN_MQ_GS_ICE_BLOCK, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, 10500, 0x04, "MQ GS Ice Block", "Ice Cavern MQ GS Ice Block", RHT_ICE_CAVERN_MQ_GS_ICE_BLOCK, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[RC_ICE_CAVERN_MQ_GS_RED_ICE] = Location::GSToken(RC_ICE_CAVERN_MQ_GS_RED_ICE, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, 10498, 0x02, "MQ GS Red Ice", "Ice Cavern MQ GS Red Ice", RHT_ICE_CAVERN_MQ_GS_RED_ICE, { Category::cSkulltula }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + // Overworld + // Kokiri Forest RandomizerCheck RandomizerCheck Quest Area Scene ID params Flag Short Name Spoiler Name Hint Text Key Categories Map Index Collection Check Group + locationTable[RC_KF_GS_BEAN_PATCH] = Location::GSToken(RC_KF_GS_BEAN_PATCH, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, 27649, 0x01, "GS Bean Patch", "KF GS Bean Patch", RHT_KF_GS_BEAN_PATCH, { Category::cSkulltula }, 0x0C, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_GS_KNOW_IT_ALL_HOUSE] = Location::GSToken(RC_KF_GS_KNOW_IT_ALL_HOUSE, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, 19458, 0x02, "GS Know It All House", "KF GS Know It All House", RHT_KF_GS_KNOW_IT_ALL_HOUSE, { Category::cSkulltula }, 0x0C, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_GS_HOUSE_OF_TWINS] = Location::GSToken(RC_KF_GS_HOUSE_OF_TWINS, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, 19460, 0x04, "GS House of Twins", "KF GS House of Twins", RHT_KF_GS_HOUSE_OF_TWINS, { Category::cSkulltula }, 0x0C, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + // Lost Woods + locationTable[RC_LW_GS_BEAN_PATCH_NEAR_BRIDGE] = Location::GSToken(RC_LW_GS_BEAN_PATCH_NEAR_BRIDGE, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 27905, 0x01, "GS Bean Patch Near Bridge", "LW GS Bean Patch Near Bridge", RHT_LW_GS_BEAN_PATCH_NEAR_BRIDGE, { Category::cSkulltula }, 0x0D, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_GS_BEAN_PATCH_NEAR_THEATER] = Location::GSToken(RC_LW_GS_BEAN_PATCH_NEAR_THEATER, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 27906, 0x02, "GS Bean Patch Near Theater", "LW GS Bean Patch Near Theater", RHT_LW_GS_BEAN_PATCH_NEAR_THEATER, { Category::cSkulltula }, 0x0D, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_GS_ABOVE_THEATER] = Location::GSToken(RC_LW_GS_ABOVE_THEATER, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 19716, 0x04, "GS Above Theater", "LW GS Above Theater", RHT_LW_GS_ABOVE_THEATER, { Category::cSkulltula }, 0x0D, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_SFM_GS] = Location::GSToken(RC_SFM_GS, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, 19720, 0x08, "GS", "SFM GS", RHT_SFM_GS, { Category::cSkulltula }, 0x0D, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + // Hyrule Field + locationTable[RC_HF_GS_COW_GROTTO] = Location::GSToken(RC_HF_GS_COW_GROTTO, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, 10753, 0x01, "GS Cow Grotto", "HF GS Cow Grotto", RHT_HF_GS_COW_GROTTO, { Category::cSkulltula }, 0x0A, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_HF_GS_NEAR_KAK_GROTTO] = Location::GSToken(RC_HF_GS_NEAR_KAK_GROTTO, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, 10754, 0x02, "GS Near Kak Grotto", "HF GS Near Kak Grotto", RHT_HF_GS_NEAR_KAK_GROTTO, { Category::cSkulltula }, 0x0A, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + // Lake Hylia + locationTable[RC_LH_GS_BEAN_PATCH] = Location::GSToken(RC_LH_GS_BEAN_PATCH, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 29185, 0x01, "GS Bean Patch", "LH GS Bean Patch", RHT_LH_GS_BEAN_PATCH, { Category::cSkulltula }, 0x12, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[RC_LH_GS_SMALL_ISLAND] = Location::GSToken(RC_LH_GS_SMALL_ISLAND, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 20994, 0x02, "GS Small Island", "LH GS Small Island", RHT_LH_GS_SMALL_ISLAND, { Category::cSkulltula }, 0x12, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[RC_LH_GS_LAB_WALL] = Location::GSToken(RC_LH_GS_LAB_WALL, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 20996, 0x04, "GS Lab Wall", "LH GS Lab Wall", RHT_LH_GS_LAB_WALL, { Category::cSkulltula }, 0x12, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[RC_LH_GS_LAB_CRATE] = Location::GSToken(RC_LH_GS_LAB_CRATE, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKESIDE_LABORATORY, -28152, 0x08, "GS Lab Crate", "LH GS Lab Crate", RHT_LH_GS_LAB_CRATE, { Category::cSkulltula }, 0x12, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[RC_LH_GS_TREE] = Location::GSToken(RC_LH_GS_TREE, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 21008, 0x10, "GS Tree", "LH GS Tree", RHT_LH_GS_TREE, { Category::cSkulltula }, 0x12, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + // Gerudo Valley + locationTable[RC_GV_GS_BEAN_PATCH] = Location::GSToken(RC_GV_GS_BEAN_PATCH, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, 29441, 0x01, "GS Bean Patch", "GV GS Bean Patch", RHT_GV_GS_BEAN_PATCH, { Category::cSkulltula }, 0x13, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GV_GS_SMALL_BRIDGE] = Location::GSToken(RC_GV_GS_SMALL_BRIDGE, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, 21250, 0x02, "GS Small Bridge", "GV GS Small Bridge", RHT_GV_GS_SMALL_BRIDGE, { Category::cSkulltula }, 0x13, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GV_GS_PILLAR] = Location::GSToken(RC_GV_GS_PILLAR, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, 21252, 0x04, "GS Pillar", "GV GS Pillar", RHT_GV_GS_PILLAR, { Category::cSkulltula }, 0x13, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GV_GS_BEHIND_TENT] = Location::GSToken(RC_GV_GS_BEHIND_TENT, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, 21256, 0x08, "GS Behind Tent", "GV GS Behind Tent", RHT_GV_GS_BEHIND_TENT, { Category::cSkulltula }, 0x13, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + // Gerudo Fortress + locationTable[RC_GF_GS_ARCHERY_RANGE] = Location::GSToken(RC_GF_GS_ARCHERY_RANGE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, 21505, 0x01, "GS Archery Range", "GF GS Archery Range", RHT_GF_GS_ARCHERY_RANGE, { Category::cSkulltula }, 0x14, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GF_GS_TOP_FLOOR] = Location::GSToken(RC_GF_GS_TOP_FLOOR, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, 21506, 0x02, "GS Top Floor", "GF GS Top Floor", RHT_GF_GS_TOP_FLOOR, { Category::cSkulltula }, 0x14, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + // Wasteland & Desert Colossus + locationTable[RC_WASTELAND_GS] = Location::GSToken(RC_WASTELAND_GS, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, 13570, 0x02, "GS", "Wasteland GS", RHT_WASTELAND_GS, { Category::cSkulltula }, 0x15, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_COLOSSUS_GS_BEAN_PATCH] = Location::GSToken(RC_COLOSSUS_GS_BEAN_PATCH, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 29953, 0x01, "GS Bean Patch", "Colossus GS Bean Patch", RHT_COLOSSUS_GS_BEAN_PATCH, { Category::cSkulltula }, 0x15, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_COLOSSUS_GS_HILL] = Location::GSToken(RC_COLOSSUS_GS_HILL, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 21764, 0x04, "GS Hill", "Colossus GS Hill", RHT_COLOSSUS_GS_HILL, { Category::cSkulltula }, 0x15, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_COLOSSUS_GS_TREE] = Location::GSToken(RC_COLOSSUS_GS_TREE, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 21768, 0x08, "GS Tree", "Colossus GS Tree", RHT_COLOSSUS_GS_TREE, { Category::cSkulltula }, 0x15, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + // Hyrule Castle, Market, and Outside Ganon's Castle + locationTable[RC_OGC_GS] = Location::GSToken(RC_OGC_GS, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_OUTSIDE_GANONS_CASTLE,11777, 0x01, "OGC GS", "OGC GS", RHT_OGC_GS, { Category::cSkulltula }, 0x0E, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_HC_GS_STORMS_GROTTO] = Location::GSToken(RC_HC_GS_STORMS_GROTTO, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, 11778, 0x02, "GS Storms Grotto", "HC GS Storms Grotto", RHT_HC_GS_STORMS_GROTTO, { Category::cSkulltula }, 0x0E, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_HC_GS_TREE] = Location::GSToken(RC_HC_GS_TREE, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, -29180, 0x04, "GS Tree", "HC GS Tree", RHT_HC_GS_TREE, { Category::cSkulltula }, 0x0E, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_MARKET_GS_GUARD_HOUSE] = Location::GSToken(RC_MARKET_GS_GUARD_HOUSE, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, -29176, 0x08, "Market GS Guard House", "Market GS Guard House", RHT_MARKET_GS_GUARD_HOUSE, { Category::cSkulltula }, 0x0E, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + // Kakariko + locationTable[RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION] = Location::GSToken(RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, 20488, 0x08, "GS House Under Construction", "Kak GS House Under Construction", RHT_KAK_GS_HOUSE_UNDER_CONSTRUCTION, { Category::cSkulltula }, 0x10, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_KAK_GS_SKULLTULA_HOUSE] = Location::GSToken(RC_KAK_GS_SKULLTULA_HOUSE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, 20496, 0x10, "GS Skulltula House", "Kak GS Skulltula House", RHT_KAK_GS_SKULLTULA_HOUSE, { Category::cSkulltula }, 0x10, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_KAK_GS_GUARDS_HOUSE] = Location::GSToken(RC_KAK_GS_GUARDS_HOUSE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, 20482, 0x02, "GS Guards House", "Kak GS Guards House", RHT_KAK_GS_GUARDS_HOUSE, { Category::cSkulltula }, 0x10, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_KAK_GS_TREE] = Location::GSToken(RC_KAK_GS_TREE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, -28640, 0x20, "GS Tree", "Kak GS Tree", RHT_KAK_GS_TREE, { Category::cSkulltula }, 0x10, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_KAK_GS_WATCHTOWER] = Location::GSToken(RC_KAK_GS_WATCHTOWER, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, 20484, 0x04, "GS Watchtower", "Kak GS Watchtower", RHT_KAK_GS_WATCHTOWER, { Category::cSkulltula }, 0x10, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_KAK_GS_ABOVE_IMPAS_HOUSE] = Location::GSToken(RC_KAK_GS_ABOVE_IMPAS_HOUSE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, 20544, 0x40, "GS Above Impas House", "Kak GS Above Impas House", RHT_KAK_GS_ABOVE_IMPAS_HOUSE, { Category::cSkulltula }, 0x10, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + // Graveyard + locationTable[RC_GRAVEYARD_GS_WALL] = Location::GSToken(RC_GRAVEYARD_GS_WALL, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, 20608, 0x80, "GS Wall", "Graveyard GS Wall", RHT_GRAVEYARD_GS_WALL, { Category::cSkulltula }, 0x10, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_GS_BEAN_PATCH] = Location::GSToken(RC_GRAVEYARD_GS_BEAN_PATCH, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, 28673, 0x01, "GS Bean Patch", "Graveyard GS Bean Patch", RHT_GRAVEYARD_GS_BEAN_PATCH, { Category::cSkulltula }, 0x10, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + // Death Mountain + locationTable[RC_DMC_GS_BEAN_PATCH] = Location::GSToken(RC_DMC_GS_BEAN_PATCH, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER,28417, 0x01, "GS Bean Patch", "DMC GS Bean Patch", RHT_DMC_GS_BEAN_PATCH, { Category::cSkulltula }, 0x0F, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_GS_CRATE] = Location::GSToken(RC_DMC_GS_CRATE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER,-28800, 0x80, "GS Crate", "DMC GS Crate", RHT_DMC_GS_CRATE, { Category::cSkulltula }, 0x0F, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_GS_BEAN_PATCH] = Location::GSToken(RC_DMT_GS_BEAN_PATCH, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 28418, 0x02, "GS Bean Patch", "DMT GS Bean Patch", RHT_DMT_GS_BEAN_PATCH, { Category::cSkulltula }, 0x0F, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_GS_NEAR_KAK] = Location::GSToken(RC_DMT_GS_NEAR_KAK, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 12036, 0x04, "GS Near Kak", "DMT GS Near Kak", RHT_DMT_GS_NEAR_KAK, { Category::cSkulltula }, 0x0F, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_GS_ABOVE_DODONGOS_CAVERN] = Location::GSToken(RC_DMT_GS_ABOVE_DODONGOS_CAVERN, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 20232, 0x08, "GS Above Dodongos Cavern", "DMT GS Above Dodongos Cavern", RHT_DMT_GS_ABOVE_DODONGOS_CAVERN, { Category::cSkulltula }, 0x0F, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_GS_FALLING_ROCKS_PATH] = Location::GSToken(RC_DMT_GS_FALLING_ROCKS_PATH, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 20240, 0x10, "GS Falling Rocks Path", "DMT GS Falling Rocks Path", RHT_DMT_GS_FALLING_ROCKS_PATH, { Category::cSkulltula }, 0x0F, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_GC_GS_CENTER_PLATFORM] = Location::GSToken(RC_GC_GS_CENTER_PLATFORM, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, 12064, 0x20, "GS Center Platform", "GC GS Center Platform", RHT_GC_GS_CENTER_PLATFORM, { Category::cSkulltula }, 0x0F, SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[RC_GC_GS_BOULDER_MAZE] = Location::GSToken(RC_GC_GS_BOULDER_MAZE, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, -28864, 0x40, "GS Boulder Maze", "GC GS Boulder Maze", RHT_GC_GS_BOULDER_MAZE, { Category::cSkulltula }, 0x0F, SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + // Zora's River, Domain, and Fountain + locationTable[RC_ZR_GS_LADDER] = Location::GSToken(RC_ZR_GS_LADDER, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 20737, 0x01, "GS Ladder", "ZR GS Ladder", RHT_ZR_GS_LADDER, { Category::cSkulltula }, 0x11, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZR_GS_TREE] = Location::GSToken(RC_ZR_GS_TREE, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, -28414, 0x02, "GS Tree", "ZR GS Tree", RHT_ZR_GS_TREE, { Category::cSkulltula }, 0x11, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZR_GS_ABOVE_BRIDGE] = Location::GSToken(RC_ZR_GS_ABOVE_BRIDGE, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 20744, 0x08, "GS Above Bridge", "ZR GS Above Bridge", RHT_ZR_GS_ABOVE_BRIDGE, { Category::cSkulltula }, 0x11, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZR_GS_NEAR_RAISED_GROTTOS] = Location::GSToken(RC_ZR_GS_NEAR_RAISED_GROTTOS, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 20752, 0x10, "GS Near Raised Grottos", "ZR GS Near Raised Grottos", RHT_ZR_GS_NEAR_RAISED_GROTTOS, { Category::cSkulltula }, 0x11, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZD_GS_FROZEN_WATERFALL] = Location::GSToken(RC_ZD_GS_FROZEN_WATERFALL, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, 20800, 0x40, "GS Frozen Waterfall", "ZD GS Frozen Waterfall", RHT_ZD_GS_FROZEN_WATERFALL, { Category::cSkulltula }, 0x11, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_GS_ABOVE_THE_LOG] = Location::GSToken(RC_ZF_GS_ABOVE_THE_LOG, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, 20740, 0x04, "GS Above The Log", "ZF GS Above The Log", RHT_ZF_GS_ABOVE_THE_LOG, { Category::cSkulltula }, 0x11, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_GS_HIDDEN_CAVE] = Location::GSToken(RC_ZF_GS_HIDDEN_CAVE, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, 20768, 0x20, "GS Hidden Cave", "ZF GS Hidden Cave", RHT_ZF_GS_HIDDEN_CAVE, { Category::cSkulltula }, 0x11, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_GS_TREE] = Location::GSToken(RC_ZF_GS_TREE, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, -28288, 0x80, "GS Tree", "ZF GS Tree", RHT_ZF_GS_TREE, { Category::cSkulltula }, 0x11, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + // Lon Lon Ranch + locationTable[RC_LLR_GS_BACK_WALL] = Location::GSToken(RC_LLR_GS_BACK_WALL, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, 11009, 0x01, "GS Back Wall", "LLR GS Back Wall", RHT_LLR_GS_BACK_WALL, { Category::cSkulltula }, 0x0B, SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); + locationTable[RC_LLR_GS_RAIN_SHED] = Location::GSToken(RC_LLR_GS_RAIN_SHED, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, 11010, 0x02, "GS Rain Shed", "LLR GS Rain Shed", RHT_LLR_GS_RAIN_SHED, { Category::cSkulltula }, 0x0B, SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); + locationTable[RC_LLR_GS_HOUSE_WINDOW] = Location::GSToken(RC_LLR_GS_HOUSE_WINDOW, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, 11012, 0x04, "GS House Window", "LLR GS House Window", RHT_LLR_GS_HOUSE_WINDOW, { Category::cSkulltula }, 0x0B, SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); + locationTable[RC_LLR_GS_TREE] = Location::GSToken(RC_LLR_GS_TREE, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, -29944, 0x08, "GS Tree", "LLR GS Tree", RHT_LLR_GS_TREE, { Category::cSkulltula }, 0x0B, SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); + + // Bosses Randomizer Check Randomizer Check Quest Type Area Actor ID Scene ID Params Flags Short Name Spoiler Name Hint Text Key Vanilla Item Categories Spoiler Collection Check Collection Check Group Vanilla Progression + locationTable[RC_LINKS_POCKET] = Location::Reward(RC_LINKS_POCKET, RCQUEST_BOTH, RCTYPE_LINKS_POCKET, RCAREA_KOKIRI_FOREST, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, 0x00, "Link's Pocket", "Link's Pocket", RHT_LINKS_POCKET, RG_LIGHT_MEDALLION, {}, SpoilerCollectionCheck::AlwaysCollected(), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST, true); + locationTable[RC_QUEEN_GOHMA] = Location::Reward( RC_QUEEN_GOHMA, RCQUEST_BOTH, RCTYPE_DUNGEON_REWARD, RCAREA_DEKU_TREE, ACTOR_DOOR_WARP1, SCENE_DEKU_TREE_BOSS, 0x00, DungeonId::DUNGEON_DEKU_TREE, "Queen Gohma", "Queen Gohma", RHT_QUEEN_GOHMA, RG_KOKIRI_EMERALD, {}, SpoilerCollectionCheck::Chest(0x11, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE, true); + locationTable[RC_KING_DODONGO] = Location::Reward(RC_KING_DODONGO, RCQUEST_BOTH, RCTYPE_DUNGEON_REWARD, RCAREA_DODONGOS_CAVERN, ACTOR_DOOR_WARP1, SCENE_DODONGOS_CAVERN_BOSS, 0x00, DungeonId::DUNGEON_DODONGOS_CAVERN, "King Dodongo", "King Dodongo", RHT_KING_DODONGO, RG_GORON_RUBY, {}, SpoilerCollectionCheck::Chest(0x12, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN, true); + locationTable[RC_BARINADE] = Location::Reward(RC_BARINADE, RCQUEST_BOTH, RCTYPE_DUNGEON_REWARD, RCAREA_JABU_JABUS_BELLY, ACTOR_DOOR_WARP1, SCENE_JABU_JABU_BOSS, 0x00, DungeonId::DUNGEON_JABUJABUS_BELLY, "Barinade", "Barinade", RHT_BARINADE, RG_ZORA_SAPPHIRE, {}, SpoilerCollectionCheck::Chest(0x13, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY, true); + locationTable[RC_PHANTOM_GANON] = Location::Reward(RC_PHANTOM_GANON, RCQUEST_BOTH, RCTYPE_DUNGEON_REWARD, RCAREA_FOREST_TEMPLE, ACTOR_DOOR_WARP1, SCENE_FOREST_TEMPLE_BOSS, 0x00, DungeonId::DUNGEON_FOREST_TEMPLE, "Phantom Ganon", "Phantom Ganon", RHT_PHANTOM_GANON, RG_FOREST_MEDALLION, {}, SpoilerCollectionCheck::Chest(0x14, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE, true); + locationTable[RC_VOLVAGIA] = Location::Reward(RC_VOLVAGIA, RCQUEST_BOTH, RCTYPE_DUNGEON_REWARD, RCAREA_FIRE_TEMPLE, ACTOR_DOOR_WARP1, SCENE_FIRE_TEMPLE_BOSS, 0x00, DungeonId::DUNGEON_FIRE_TEMPLE, "Volvagia", "Volvagia", RHT_VOLVAGIA, RG_FIRE_MEDALLION, {}, SpoilerCollectionCheck::Chest(0x15, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE, true); + locationTable[RC_MORPHA] = Location::Reward(RC_MORPHA, RCQUEST_BOTH, RCTYPE_DUNGEON_REWARD, RCAREA_WATER_TEMPLE, ACTOR_DOOR_WARP1, SCENE_WATER_TEMPLE_BOSS, 0x00, DungeonId::DUNGEON_WATER_TEMPLE, "Morpha", "Morpha", RHT_MORPHA, RG_WATER_MEDALLION, {}, SpoilerCollectionCheck::Chest(0x16, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE, true); + locationTable[RC_TWINROVA] = Location::Reward(RC_TWINROVA, RCQUEST_BOTH, RCTYPE_DUNGEON_REWARD, RCAREA_SPIRIT_TEMPLE, ACTOR_DOOR_WARP1, SCENE_SPIRIT_TEMPLE_BOSS, 0x00, DungeonId::DUNGEON_SPIRIT_TEMPLE, "Twinrova", "Twinrova", RHT_TWINROVA, RG_SPIRIT_MEDALLION, {}, SpoilerCollectionCheck::Chest(0x17, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE, true); + locationTable[RC_BONGO_BONGO] = Location::Reward(RC_BONGO_BONGO, RCQUEST_BOTH, RCTYPE_DUNGEON_REWARD, RCAREA_SHADOW_TEMPLE, ACTOR_DOOR_WARP1, SCENE_SHADOW_TEMPLE_BOSS, 0x00, DungeonId::DUNGEON_SHADOW_TEMPLE, "Bongo Bongo", "Bongo Bongo", RHT_BONGO_BONGO, RG_SHADOW_MEDALLION, {}, SpoilerCollectionCheck::Chest(0x18, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE, true); + locationTable[RC_GANON] = Location::Reward(RC_GANON, RCQUEST_BOTH, RCTYPE_DUNGEON_REWARD, RCAREA_GANONS_CASTLE, ACTOR_DOOR_WARP1, SCENE_GANON_BOSS, 0x00, DungeonId::DUNGEON_GANONS_CASTLE_CRUMBLING, "Ganon", "Ganon", RHT_NONE, RG_TRIFORCE, {}, SpoilerCollectionCheck::None(), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GIFT_FROM_SAGES] = Location::Reward(RC_GIFT_FROM_SAGES, RCQUEST_BOTH, RCTYPE_DUNGEON_REWARD, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, 0x00, "Gift from Raoru", "Gift from Raoru", RHT_NONE, RG_LIGHT_MEDALLION, {}, SpoilerCollectionCheck::None(), SpoilerCollectionCheckGroup::GROUP_NO_GROUP, true); + + // Heart Containers Randomizer Check Randomizer Check Quest Type Area Actor ID Scene ID Params Flags Short Name Spoiler Name Hint Text Key Vanilla Item Categories Spoiler Collection Check Collection Check Group Vanilla Progression + locationTable[RC_DEKU_TREE_QUEEN_GOHMA_HEART] = Location::Base(RC_DEKU_TREE_QUEEN_GOHMA_HEART, RCQUEST_BOTH, RCTYPE_BOSS_HEART_OR_OTHER_REWARD, RCAREA_DEKU_TREE, ACTOR_ITEM_B_HEART, SCENE_DEKU_TREE_BOSS, 0x00, 0x4F, "Queen Gohma Heart Container", "Deku Tree Queen Gohma Heart Container", RHT_DEKU_TREE_QUEEN_GOHMA_HEART, RG_HEART_CONTAINER, { Category::cSongDungeonReward }, SpoilerCollectionCheck::Collectable(0x11, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE, true); + locationTable[RC_DODONGOS_CAVERN_KING_DODONGO_HEART] = Location::Base(RC_DODONGOS_CAVERN_KING_DODONGO_HEART, RCQUEST_BOTH, RCTYPE_BOSS_HEART_OR_OTHER_REWARD, RCAREA_DODONGOS_CAVERN, ACTOR_ITEM_B_HEART, SCENE_DODONGOS_CAVERN_BOSS, 0x00, 0x4F, "King Dodongo Heart Container", "Dodongos Cavern King Dodongo Heart Container", RHT_DODONGOS_CAVERN_KING_DODONGO_HEART, RG_HEART_CONTAINER, { Category::cSongDungeonReward }, SpoilerCollectionCheck::Collectable(0x12, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN, true); + locationTable[RC_JABU_JABUS_BELLY_BARINADE_HEART] = Location::Base(RC_JABU_JABUS_BELLY_BARINADE_HEART, RCQUEST_BOTH, RCTYPE_BOSS_HEART_OR_OTHER_REWARD, RCAREA_JABU_JABUS_BELLY, ACTOR_ITEM_B_HEART, SCENE_JABU_JABU_BOSS, 0x00, 0x4F, "Barinade Heart Container", "Jabu Jabus Belly Barinade Heart Container", RHT_JABU_JABUS_BELLY_BARINADE_HEART, RG_HEART_CONTAINER, { Category::cSongDungeonReward }, SpoilerCollectionCheck::Collectable(0x13, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY, true); + locationTable[RC_FOREST_TEMPLE_PHANTOM_GANON_HEART] = Location::Base(RC_FOREST_TEMPLE_PHANTOM_GANON_HEART, RCQUEST_BOTH, RCTYPE_BOSS_HEART_OR_OTHER_REWARD, RCAREA_FOREST_TEMPLE, ACTOR_ITEM_B_HEART, SCENE_FOREST_TEMPLE_BOSS, 0x00, 0x4F, "Phantom Ganon Heart Container", "Forest Temple Phantom Ganon Heart Container", RHT_FOREST_TEMPLE_PHANTOM_GANON_HEART, RG_HEART_CONTAINER, { Category::cSongDungeonReward }, SpoilerCollectionCheck::Collectable(0x14, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE, true); + locationTable[RC_FIRE_TEMPLE_VOLVAGIA_HEART] = Location::Base(RC_FIRE_TEMPLE_VOLVAGIA_HEART, RCQUEST_BOTH, RCTYPE_BOSS_HEART_OR_OTHER_REWARD, RCAREA_FIRE_TEMPLE, ACTOR_ITEM_B_HEART, SCENE_FIRE_TEMPLE_BOSS, 0x00, 0x4F, "Volvagia Heart Container", "Fire Temple Volvagia Heart Container", RHT_FIRE_TEMPLE_VOLVAGIA_HEART, RG_HEART_CONTAINER, { Category::cSongDungeonReward }, SpoilerCollectionCheck::Collectable(0x15, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE, true); + locationTable[RC_WATER_TEMPLE_MORPHA_HEART] = Location::Base(RC_WATER_TEMPLE_MORPHA_HEART, RCQUEST_BOTH, RCTYPE_BOSS_HEART_OR_OTHER_REWARD, RCAREA_WATER_TEMPLE, ACTOR_ITEM_B_HEART, SCENE_WATER_TEMPLE_BOSS, 0x00, 0x4F, "Morpha Heart Container", "Water Temple Morpha Heart Container", RHT_WATER_TEMPLE_MORPHA_HEART, RG_HEART_CONTAINER, { Category::cSongDungeonReward }, SpoilerCollectionCheck::Collectable(0x16, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE, true); + locationTable[RC_SPIRIT_TEMPLE_TWINROVA_HEART] = Location::Base(RC_SPIRIT_TEMPLE_TWINROVA_HEART, RCQUEST_BOTH, RCTYPE_BOSS_HEART_OR_OTHER_REWARD, RCAREA_SPIRIT_TEMPLE, ACTOR_ITEM_B_HEART, SCENE_SPIRIT_TEMPLE_BOSS, 0x00, 0x4F, "Twinrova Heart Container", "Spirit Temple Twinrova Heart Container", RHT_SPIRIT_TEMPLE_TWINROVA_HEART, RG_HEART_CONTAINER, { Category::cSongDungeonReward }, SpoilerCollectionCheck::Collectable(0x17, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE, true); + locationTable[RC_SHADOW_TEMPLE_BONGO_BONGO_HEART] = Location::Base(RC_SHADOW_TEMPLE_BONGO_BONGO_HEART, RCQUEST_BOTH, RCTYPE_BOSS_HEART_OR_OTHER_REWARD, RCAREA_SHADOW_TEMPLE, ACTOR_ITEM_B_HEART, SCENE_SHADOW_TEMPLE_BOSS, 0x00, 0x4F, "Bongo Bongo Heart Container", "Shadow Temple Bongo Bongo Heart Container", RHT_SHADOW_TEMPLE_BONGO_BONGO_HEART, RG_HEART_CONTAINER, { Category::cSongDungeonReward }, SpoilerCollectionCheck::Collectable(0x18, 0x1F), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE, true); + + // Cutscenes Randomizer Check Randomizer Check Quest Type Area Actor ID Scene ID Params Flags Short Name Spoiler Name Hint Text Key Vanilla Item Categories Spoiler Collection Check Collection Check Group Vanilla Progression + locationTable[RC_TOT_LIGHT_ARROWS_CUTSCENE] = Location::Delayed(RC_TOT_LIGHT_ARROWS_CUTSCENE, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, 0x01, "ToT Light Arrow Cutscene", "ToT Light Arrow Cutscene", RHT_TOT_LIGHT_ARROWS_CUTSCENE, RG_LIGHT_ARROWS, {}, SpoilerCollectionCheck::Chest(0x43, 0x1E), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE, true); + locationTable[RC_LW_GIFT_FROM_SARIA] = Location::Delayed(RC_LW_GIFT_FROM_SARIA, RCQUEST_BOTH, RCTYPE_OCARINA, RCAREA_LOST_WOODS, ACTOR_ID_MAX, SCENE_LOST_WOODS, 0x00, 0x02, "Gift From Saria", "LW Gift From Saria", RHT_LW_GIFT_FROM_SARIA, RG_PROGRESSIVE_OCARINA, {}, SpoilerCollectionCheck::EventChkInf(0xC1), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS, true); + locationTable[RC_ZF_GREAT_FAIRY_REWARD] = Location::Delayed(RC_ZF_GREAT_FAIRY_REWARD, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_ZORAS_FOUNTAIN, ACTOR_BG_DY_YOSEIZO, SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, 1, 0x10, "Great Fairy Reward", "ZF Great Fairy Reward", RHT_ZF_GREAT_FAIRY_REWARD, RG_FARORES_WIND, {}, SpoilerCollectionCheck::Chest(0x3D, 0x01), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN, true); + locationTable[RC_HC_GREAT_FAIRY_REWARD] = Location::Delayed(RC_HC_GREAT_FAIRY_REWARD, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, ACTOR_BG_DY_YOSEIZO, SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, 2, 0x11, "Great Fairy Reward", "HC Great Fairy Reward", RHT_HC_GREAT_FAIRY_REWARD, RG_DINS_FIRE, {}, SpoilerCollectionCheck::Chest(0x3D, 0x02), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE, true); + locationTable[RC_COLOSSUS_GREAT_FAIRY_REWARD] = Location::Delayed(RC_COLOSSUS_GREAT_FAIRY_REWARD, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, ACTOR_BG_DY_YOSEIZO, SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, 3, 0x12, "Great Fairy Reward", "Colossus Great Fairy Reward", RHT_COLOSSUS_GREAT_FAIRY_REWARD, RG_NAYRUS_LOVE, {}, SpoilerCollectionCheck::Chest(0x3D, 0x03), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY, true); + locationTable[RC_DMT_GREAT_FAIRY_REWARD] = Location::Delayed(RC_DMT_GREAT_FAIRY_REWARD, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_BG_DY_YOSEIZO, SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 1, 0x13, "Great Fairy Reward", "DMT Great Fairy Reward", RHT_DMT_GREAT_FAIRY_REWARD, RG_PROGRESSIVE_MAGIC_METER, {}, SpoilerCollectionCheck::Chest(0x3B, 0x01), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN, true); + locationTable[RC_DMC_GREAT_FAIRY_REWARD] = Location::Delayed(RC_DMC_GREAT_FAIRY_REWARD, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_BG_DY_YOSEIZO, SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 2, 0x14, "Great Fairy Reward", "DMC Great Fairy Reward", RHT_DMC_GREAT_FAIRY_REWARD, RG_PROGRESSIVE_MAGIC_METER, {}, SpoilerCollectionCheck::Chest(0x3B, 0x02), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN, true); + locationTable[RC_OGC_GREAT_FAIRY_REWARD] = Location::Delayed(RC_OGC_GREAT_FAIRY_REWARD, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, ACTOR_BG_DY_YOSEIZO, SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 3, 0x15, "OGC Great Fairy Reward", "OGC Great Fairy Reward", RHT_OGC_GREAT_FAIRY_REWARD, RG_DOUBLE_DEFENSE, {}, SpoilerCollectionCheck::Chest(0x3B, 0x03), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE, true); + + // Songs Randomizer Check Randomizer Check Quest Type Area Actor ID Scene ID Params Flags Short Name Spoiler Name Hint Text Key Vanilla Item Categories Spoiler Collection Check Collection Check Group Vanilla Progression + locationTable[RC_SHEIK_IN_FOREST] = Location::Delayed(RC_SHEIK_IN_FOREST, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, RCAREA_SACRED_FOREST_MEADOW, ACTOR_ID_MAX, SCENE_SACRED_FOREST_MEADOW, 0x00, 0x20, "Sheik in Forest", "Sheik in Forest", RHT_SHEIK_IN_FOREST, RG_MINUET_OF_FOREST, { Category::cSong }, SpoilerCollectionCheck::EventChkInf(0x50), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS, true); + locationTable[RC_SHEIK_IN_CRATER] = Location::Delayed(RC_SHEIK_IN_CRATER, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, 0x21, "Sheik in Crater", "Sheik in Crater", RHT_SHEIK_IN_CRATER, RG_BOLERO_OF_FIRE, { Category::cSong }, SpoilerCollectionCheck::EventChkInf(0x51), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN, true); + locationTable[RC_SHEIK_IN_ICE_CAVERN] = Location::Delayed(RC_SHEIK_IN_ICE_CAVERN, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, RCAREA_ICE_CAVERN, ACTOR_ID_MAX, SCENE_ICE_CAVERN, 0x00, 0x22, "Sheik in Ice Cavern", "Sheik in Ice Cavern", RHT_SHEIK_IN_ICE_CAVERN, RG_SERENADE_OF_WATER, { Category::cSong, Category::cSongDungeonReward }, SpoilerCollectionCheck::EventChkInf(0x52), SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN, true); + locationTable[RC_SHEIK_AT_COLOSSUS] = Location::Delayed(RC_SHEIK_AT_COLOSSUS, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, RCAREA_DESERT_COLOSSUS, ACTOR_ID_MAX, SCENE_DESERT_COLOSSUS, 0x00, 0x23, "Sheik at Colossus", "Sheik at Colossus", RHT_SHEIK_AT_COLOSSUS, RG_REQUIEM_OF_SPIRIT, { Category::cSong }, SpoilerCollectionCheck::EventChkInf(0xAC), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY, true); + locationTable[RC_SHEIK_IN_KAKARIKO] = Location::Delayed(RC_SHEIK_IN_KAKARIKO, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, RCAREA_KAKARIKO_VILLAGE, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, 0x24, "Sheik in Kakariko", "Sheik in Kakariko", RHT_SHEIK_IN_KAKARIKO, RG_NOCTURNE_OF_SHADOW, { Category::cSong }, SpoilerCollectionCheck::EventChkInf(0xAA), SpoilerCollectionCheckGroup::GROUP_KAKARIKO, true); + locationTable[RC_SHEIK_AT_TEMPLE] = Location::Delayed(RC_SHEIK_AT_TEMPLE, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, 0x25, "Sheik at Temple", "Sheik at Temple", RHT_SHEIK_AT_TEMPLE, RG_PRELUDE_OF_LIGHT, { Category::cSong }, SpoilerCollectionCheck::Chest(0x43, 0x1F), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE, true); + locationTable[RC_SONG_FROM_IMPA] = Location::Delayed(RC_SONG_FROM_IMPA, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, RCAREA_HYRULE_CASTLE, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, 0x26, "Song from Impa", "Song from Impa", RHT_SONG_FROM_IMPA, RG_ZELDAS_LULLABY, { Category::cSong, Category::cSongDungeonReward }, SpoilerCollectionCheck::EventChkInf(0x59), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE, true); + locationTable[RC_SONG_FROM_MALON] = Location::Delayed(RC_SONG_FROM_MALON, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, RCAREA_LON_LON_RANCH, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, 0x27, "Song from Malon", "Song from Malon", RHT_SONG_FROM_MALON, RG_EPONAS_SONG, { Category::cSong }, SpoilerCollectionCheck::Chest(0x63, 0x1F), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH, true); + locationTable[RC_SONG_FROM_SARIA] = Location::Delayed(RC_SONG_FROM_SARIA, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, RCAREA_SACRED_FOREST_MEADOW, ACTOR_ID_MAX, SCENE_SACRED_FOREST_MEADOW, 0x00, 0x28, "Song from Saria", "Song from Saria", RHT_SONG_FROM_SARIA, RG_SARIAS_SONG, { Category::cSong }, SpoilerCollectionCheck::Chest(0x56, 0x1F), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS, true); + locationTable[RC_SONG_FROM_ROYAL_FAMILYS_TOMB] = Location::Delayed(RC_SONG_FROM_ROYAL_FAMILYS_TOMB, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, RCAREA_GRAVEYARD, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, 0x29, "Song from Composers Grave", "Song from Composers Grave", RHT_SONG_FROM_ROYAL_FAMILYS_TOMB, RG_SUNS_SONG, { Category::cSong }, SpoilerCollectionCheck::Chest(0x41, 0x1F), SpoilerCollectionCheckGroup::GROUP_KAKARIKO, true); + locationTable[RC_SONG_FROM_OCARINA_OF_TIME] = Location::Delayed(RC_SONG_FROM_OCARINA_OF_TIME, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, RCAREA_HYRULE_FIELD, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, 0x2A, "Song from Ocarina of Time", "Song from Ocarina of Time", RHT_SONG_FROM_OCARINA_OF_TIME, RG_SONG_OF_TIME, { Category::cSong }, SpoilerCollectionCheck::Chest(0x51, 0x1F), SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD, true); + locationTable[RC_SONG_FROM_WINDMILL] = Location::Delayed(RC_SONG_FROM_WINDMILL, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, RCAREA_KAKARIKO_VILLAGE, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, 0x2B, "Song from Windmill", "Song from Windmill", RHT_SONG_FROM_WINDMILL, RG_SONG_OF_STORMS, { Category::cSong }, SpoilerCollectionCheck::EventChkInf(0x5B), SpoilerCollectionCheckGroup::GROUP_KAKARIKO, true); + + // Cows Randomizer Check Randomizer Check Quest Type Area Actor ID Scene ID Params Flags Short Name Spoiler Name Hint Text Key Vanilla Item Categories Spoiler Collection Check Collection Check Group + locationTable[RC_KF_LINKS_HOUSE_COW] = Location::Base(RC_KF_LINKS_HOUSE_COW, RCQUEST_BOTH, RCTYPE_COW, RCAREA_KOKIRI_FOREST, ACTOR_EN_COW, SCENE_LINKS_HOUSE, 0x00, 0x15, "Links House Cow", "KF Links House Cow", RHT_KF_LINKS_HOUSE_COW, RG_MILK, { Category::cCow }, SpoilerCollectionCheck::Cow(0x34, 0x15), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_HF_COW_GROTTO_COW] = Location::Base(RC_HF_COW_GROTTO_COW, RCQUEST_BOTH, RCTYPE_COW, RCAREA_HYRULE_FIELD, ACTOR_EN_COW, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3485, -291), 0x16, "Cow Grotto Cow", "HF Cow Grotto Cow", RHT_HF_COW_GROTTO_COW, RG_MILK, { Category::cCow }, SpoilerCollectionCheck::Cow(0x3E, 0x16), SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_LLR_STABLES_LEFT_COW] = Location::Base(RC_LLR_STABLES_LEFT_COW, RCQUEST_BOTH, RCTYPE_COW, RCAREA_LON_LON_RANCH, ACTOR_EN_COW, SCENE_STABLE, TWO_ACTOR_PARAMS(-122, -254), 0x16, "Stables Left Cow", "LLR Stables Left Cow", RHT_LLR_STABLES_LEFT_COW, RG_MILK, { Category::cCow }, SpoilerCollectionCheck::Cow(0x36, 0x16), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); + locationTable[RC_LLR_STABLES_RIGHT_COW] = Location::Base(RC_LLR_STABLES_RIGHT_COW, RCQUEST_BOTH, RCTYPE_COW, RCAREA_LON_LON_RANCH, ACTOR_EN_COW, SCENE_STABLE, TWO_ACTOR_PARAMS(116, -254), 0x15, "Stables Right Cow", "LLR Stables Right Cow", RHT_LLR_STABLES_RIGHT_COW, RG_MILK, { Category::cCow }, SpoilerCollectionCheck::Cow(0x36, 0x15), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); + locationTable[RC_LLR_TOWER_LEFT_COW] = Location::Base(RC_LLR_TOWER_LEFT_COW, RCQUEST_BOTH, RCTYPE_COW, RCAREA_LON_LON_RANCH, ACTOR_EN_COW, SCENE_LON_LON_BUILDINGS, TWO_ACTOR_PARAMS(-229, 157), 0x15, "Tower Left Cow", "LLR Tower Left Cow", RHT_LLR_TOWER_LEFT_COW, RG_MILK, { Category::cCow }, SpoilerCollectionCheck::Cow(0x4C, 0x16), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); + locationTable[RC_LLR_TOWER_RIGHT_COW] = Location::Base(RC_LLR_TOWER_RIGHT_COW, RCQUEST_BOTH, RCTYPE_COW, RCAREA_LON_LON_RANCH, ACTOR_EN_COW, SCENE_LON_LON_BUILDINGS, TWO_ACTOR_PARAMS(-142, -140), 0x16, "Tower Right Cow", "LLR Tower Right Cow", RHT_LLR_TOWER_RIGHT_COW, RG_MILK, { Category::cCow }, SpoilerCollectionCheck::Cow(0x4C, 0x15), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); + locationTable[RC_KAK_IMPAS_HOUSE_COW] = Location::Base(RC_KAK_IMPAS_HOUSE_COW, RCQUEST_BOTH, RCTYPE_COW, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_COW, SCENE_IMPAS_HOUSE, 0x00, 0x15, "Impas House Cow", "Kak Impas House Cow", RHT_KAK_IMPAS_HOUSE_COW, RG_MILK, { Category::cCow }, SpoilerCollectionCheck::Cow(0x37, 0x15), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_DMT_COW_GROTTO_COW] = Location::Base(RC_DMT_COW_GROTTO_COW, RCQUEST_BOTH, RCTYPE_COW, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_COW, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2444, -471), 0x15, "Cow Grotto Cow", "DMT Cow Grotto Cow", RHT_DMT_COW_GROTTO_COW, RG_MILK, { Category::cCow }, SpoilerCollectionCheck::Cow(0x3E, 0x15), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_GV_COW] = Location::Base(RC_GV_COW, RCQUEST_BOTH, RCTYPE_COW, RCAREA_GERUDO_VALLEY, ACTOR_EN_COW, SCENE_GERUDO_VALLEY, 0x00, 0x15, "Cow", "GV Cow", RHT_GV_COW, RG_MILK, { Category::cCow }, SpoilerCollectionCheck::Cow(0x5A, 0x15), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_JABU_JABUS_BELLY_MQ_COW] = Location::Base(RC_JABU_JABUS_BELLY_MQ_COW, RCQUEST_MQ, RCTYPE_COW, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_COW, SCENE_JABU_JABU, 0x00, 0x15, "MQ Cow", "Jabu Jabus Belly MQ Cow", RHT_JABU_JABUS_BELLY_MQ_COW, RG_MILK, { Category::cCow }, SpoilerCollectionCheck::Cow(0x02, 0x15), SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + + /*------------------------------- + --- SHOPS --- + 8 6 2 4 + + 7 5 1 3 + -------------------------------*/ + // Randomizer Check Randomizer Check Quest Type Area Actor ID Scene ID Params Flags Short Name Spoiler Name Hint Text Key Vanilla Item Categories Spoiler Collection Check Spoiler Collection Check Group + // Kokiri Forest + locationTable[RC_KF_SHOP_ITEM_1] = Location::Base(RC_KF_SHOP_ITEM_1, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, ACTOR_EN_GIRLA, SCENE_KOKIRI_SHOP, 0x00, 0x00, "Shop Item 1", "KF Shop Item 1", RHT_KF_SHOP_ITEM_1, RG_BUY_DEKU_SHIELD, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x2D, 0), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_SHOP_ITEM_2] = Location::Base(RC_KF_SHOP_ITEM_2, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, ACTOR_EN_GIRLA, SCENE_KOKIRI_SHOP, 0x01, 0x01, "Shop Item 2", "KF Shop Item 2", RHT_KF_SHOP_ITEM_2, RG_BUY_DEKU_NUT_5, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x2D, 1), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_SHOP_ITEM_3] = Location::Base(RC_KF_SHOP_ITEM_3, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, ACTOR_EN_GIRLA, SCENE_KOKIRI_SHOP, 0x02, 0x02, "Shop Item 3", "KF Shop Item 3", RHT_KF_SHOP_ITEM_3, RG_BUY_DEKU_NUT_10, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x2D, 2), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_SHOP_ITEM_4] = Location::Base(RC_KF_SHOP_ITEM_4, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, ACTOR_EN_GIRLA, SCENE_KOKIRI_SHOP, 0x03, 0x03, "Shop Item 4", "KF Shop Item 4", RHT_KF_SHOP_ITEM_4, RG_BUY_DEKU_STICK_1, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x2D, 3), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_SHOP_ITEM_5] = Location::Base(RC_KF_SHOP_ITEM_5, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, ACTOR_EN_GIRLA, SCENE_KOKIRI_SHOP, 0x04, 0x04, "Shop Item 5", "KF Shop Item 5", RHT_KF_SHOP_ITEM_5, RG_BUY_DEKU_SEEDS_30, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x2D, 4), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_SHOP_ITEM_6] = Location::Base(RC_KF_SHOP_ITEM_6, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, ACTOR_EN_GIRLA, SCENE_KOKIRI_SHOP, 0x05, 0x05, "Shop Item 6", "KF Shop Item 6", RHT_KF_SHOP_ITEM_6, RG_BUY_ARROWS_10, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x2D, 5), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_SHOP_ITEM_7] = Location::Base(RC_KF_SHOP_ITEM_7, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, ACTOR_EN_GIRLA, SCENE_KOKIRI_SHOP, 0x06, 0x06, "Shop Item 7", "KF Shop Item 7", RHT_KF_SHOP_ITEM_7, RG_BUY_ARROWS_30, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x2D, 6), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_SHOP_ITEM_8] = Location::Base(RC_KF_SHOP_ITEM_8, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, ACTOR_EN_GIRLA, SCENE_KOKIRI_SHOP, 0x07, 0x07, "Shop Item 8", "KF Shop Item 8", RHT_KF_SHOP_ITEM_8, RG_BUY_HEART, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x2D, 7), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + + // Kakariko Village + locationTable[RC_KAK_POTION_SHOP_ITEM_1] = Location::Base(RC_KAK_POTION_SHOP_ITEM_1, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_GIRLA, SCENE_POTION_SHOP_KAKARIKO, 0x00, 0x30, "Potion Shop Item 1", "Kak Potion Shop Item 1", RHT_KAK_POTION_SHOP_ITEM_1, RG_BUY_GREEN_POTION, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x30, 0), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_KAK_POTION_SHOP_ITEM_2] = Location::Base(RC_KAK_POTION_SHOP_ITEM_2, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_GIRLA, SCENE_POTION_SHOP_KAKARIKO, 0x01, 0x31, "Potion Shop Item 2", "Kak Potion Shop Item 2", RHT_KAK_POTION_SHOP_ITEM_2, RG_BUY_BLUE_FIRE, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x30, 1), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_KAK_POTION_SHOP_ITEM_3] = Location::Base(RC_KAK_POTION_SHOP_ITEM_3, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_GIRLA, SCENE_POTION_SHOP_KAKARIKO, 0x02, 0x32, "Potion Shop Item 3", "Kak Potion Shop Item 3", RHT_KAK_POTION_SHOP_ITEM_3, RG_BUY_RED_POTION_30, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x30, 2), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_KAK_POTION_SHOP_ITEM_4] = Location::Base(RC_KAK_POTION_SHOP_ITEM_4, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_GIRLA, SCENE_POTION_SHOP_KAKARIKO, 0x03, 0x33, "Potion Shop Item 4", "Kak Potion Shop Item 4", RHT_KAK_POTION_SHOP_ITEM_4, RG_BUY_FAIRYS_SPIRIT, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x30, 3), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_KAK_POTION_SHOP_ITEM_5] = Location::Base(RC_KAK_POTION_SHOP_ITEM_5, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_GIRLA, SCENE_POTION_SHOP_KAKARIKO, 0x04, 0x34, "Potion Shop Item 5", "Kak Potion Shop Item 5", RHT_KAK_POTION_SHOP_ITEM_5, RG_BUY_DEKU_NUT_5, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x30, 4), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_KAK_POTION_SHOP_ITEM_6] = Location::Base(RC_KAK_POTION_SHOP_ITEM_6, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_GIRLA, SCENE_POTION_SHOP_KAKARIKO, 0x05, 0x35, "Potion Shop Item 6", "Kak Potion Shop Item 6", RHT_KAK_POTION_SHOP_ITEM_6, RG_BUY_BOTTLE_BUG, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x30, 5), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_KAK_POTION_SHOP_ITEM_7] = Location::Base(RC_KAK_POTION_SHOP_ITEM_7, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_GIRLA, SCENE_POTION_SHOP_KAKARIKO, 0x06, 0x36, "Potion Shop Item 7", "Kak Potion Shop Item 7", RHT_KAK_POTION_SHOP_ITEM_7, RG_BUY_POE, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x30, 6), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_KAK_POTION_SHOP_ITEM_8] = Location::Base(RC_KAK_POTION_SHOP_ITEM_8, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_GIRLA, SCENE_POTION_SHOP_KAKARIKO, 0x07, 0x37, "Potion Shop Item 8", "Kak Potion Shop Item 8", RHT_KAK_POTION_SHOP_ITEM_8, RG_BUY_FISH, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x30, 7), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_KAK_BAZAAR_ITEM_1] = Location::Base(RC_KAK_BAZAAR_ITEM_1, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_GIRLA, SCENE_TEST01, 0x00, 0x38, "Bazaar Item 1", "Kak Bazaar Item 1", RHT_KAK_BAZAAR_ITEM_1, RG_BUY_HYLIAN_SHIELD, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x33, 0), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_KAK_BAZAAR_ITEM_2] = Location::Base(RC_KAK_BAZAAR_ITEM_2, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_GIRLA, SCENE_TEST01, 0x01, 0x39, "Bazaar Item 2", "Kak Bazaar Item 2", RHT_KAK_BAZAAR_ITEM_2, RG_BUY_BOMBS_535, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x33, 1), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_KAK_BAZAAR_ITEM_3] = Location::Base(RC_KAK_BAZAAR_ITEM_3, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_GIRLA, SCENE_TEST01, 0x02, 0x3A, "Bazaar Item 3", "Kak Bazaar Item 3", RHT_KAK_BAZAAR_ITEM_3, RG_BUY_DEKU_NUT_5, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x33, 2), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_KAK_BAZAAR_ITEM_4] = Location::Base(RC_KAK_BAZAAR_ITEM_4, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_GIRLA, SCENE_TEST01, 0x03, 0x3B, "Bazaar Item 4", "Kak Bazaar Item 4", RHT_KAK_BAZAAR_ITEM_4, RG_BUY_HEART, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x33, 3), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_KAK_BAZAAR_ITEM_5] = Location::Base(RC_KAK_BAZAAR_ITEM_5, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_GIRLA, SCENE_TEST01, 0x04, 0x3C, "Bazaar Item 5", "Kak Bazaar Item 5", RHT_KAK_BAZAAR_ITEM_5, RG_BUY_ARROWS_10, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x33, 4), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_KAK_BAZAAR_ITEM_6] = Location::Base(RC_KAK_BAZAAR_ITEM_6, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_GIRLA, SCENE_TEST01, 0x05, 0x3D, "Bazaar Item 6", "Kak Bazaar Item 6", RHT_KAK_BAZAAR_ITEM_6, RG_BUY_ARROWS_50, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x33, 5), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_KAK_BAZAAR_ITEM_7] = Location::Base(RC_KAK_BAZAAR_ITEM_7, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_GIRLA, SCENE_TEST01, 0x06, 0x3E, "Bazaar Item 7", "Kak Bazaar Item 7", RHT_KAK_BAZAAR_ITEM_7, RG_BUY_DEKU_STICK_1, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x33, 6), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_KAK_BAZAAR_ITEM_8] = Location::Base(RC_KAK_BAZAAR_ITEM_8, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_GIRLA, SCENE_TEST01, 0x07, 0x3F, "Bazaar Item 8", "Kak Bazaar Item 8", RHT_KAK_BAZAAR_ITEM_8, RG_BUY_ARROWS_30, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x33, 7), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + + // Market + locationTable[RC_MARKET_BOMBCHU_SHOP_ITEM_1] = Location::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_1, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BOMBCHU_SHOP, 0x00, 0x30, "Bombchu Shop Item 1", "MK Bombchu Shop Item 1", RHT_MARKET_BOMBCHU_SHOP_ITEM_1, RG_BUY_BOMBCHU_10, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x32, 0), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_MARKET_BOMBCHU_SHOP_ITEM_2] = Location::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_2, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BOMBCHU_SHOP, 0x01, 0x31, "Bombchu Shop Item 2", "MK Bombchu Shop Item 2", RHT_MARKET_BOMBCHU_SHOP_ITEM_2, RG_BUY_BOMBCHU_10, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x32, 1), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_MARKET_BOMBCHU_SHOP_ITEM_3] = Location::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_3, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BOMBCHU_SHOP, 0x02, 0x32, "Bombchu Shop Item 3", "MK Bombchu Shop Item 3", RHT_MARKET_BOMBCHU_SHOP_ITEM_3, RG_BUY_BOMBCHU_10, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x32, 2), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_MARKET_BOMBCHU_SHOP_ITEM_4] = Location::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_4, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BOMBCHU_SHOP, 0x03, 0x33, "Bombchu Shop Item 4", "MK Bombchu Shop Item 4", RHT_MARKET_BOMBCHU_SHOP_ITEM_4, RG_BUY_BOMBCHU_10, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x32, 3), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_MARKET_BOMBCHU_SHOP_ITEM_5] = Location::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_5, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BOMBCHU_SHOP, 0x04, 0x34, "Bombchu Shop Item 5", "MK Bombchu Shop Item 5", RHT_MARKET_BOMBCHU_SHOP_ITEM_5, RG_BUY_BOMBCHU_20, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x32, 4), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_MARKET_BOMBCHU_SHOP_ITEM_6] = Location::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_6, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BOMBCHU_SHOP, 0x05, 0x35, "Bombchu Shop Item 6", "MK Bombchu Shop Item 6", RHT_MARKET_BOMBCHU_SHOP_ITEM_6, RG_BUY_BOMBCHU_20, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x32, 5), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_MARKET_BOMBCHU_SHOP_ITEM_7] = Location::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_7, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BOMBCHU_SHOP, 0x06, 0x36, "Bombchu Shop Item 7", "MK Bombchu Shop Item 7", RHT_MARKET_BOMBCHU_SHOP_ITEM_7, RG_BUY_BOMBCHU_20, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x32, 6), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_MARKET_BOMBCHU_SHOP_ITEM_8] = Location::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_8, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BOMBCHU_SHOP, 0x07, 0x37, "Bombchu Shop Item 8", "MK Bombchu Shop Item 8", RHT_MARKET_BOMBCHU_SHOP_ITEM_8, RG_BUY_BOMBCHU_20, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x32, 7), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_MARKET_POTION_SHOP_ITEM_1] = Location::Base(RC_MARKET_POTION_SHOP_ITEM_1, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_POTION_SHOP_MARKET, 0x00, 0x30, "Potion Shop Item 1", "MK Potion Shop Item 1", RHT_MARKET_POTION_SHOP_ITEM_1, RG_BUY_GREEN_POTION, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x31, 0), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_MARKET_POTION_SHOP_ITEM_2] = Location::Base(RC_MARKET_POTION_SHOP_ITEM_2, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_POTION_SHOP_MARKET, 0x01, 0x31, "Potion Shop Item 2", "MK Potion Shop Item 2", RHT_MARKET_POTION_SHOP_ITEM_2, RG_BUY_BLUE_FIRE, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x31, 1), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_MARKET_POTION_SHOP_ITEM_3] = Location::Base(RC_MARKET_POTION_SHOP_ITEM_3, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_POTION_SHOP_MARKET, 0x02, 0x32, "Potion Shop Item 3", "MK Potion Shop Item 3", RHT_MARKET_POTION_SHOP_ITEM_3, RG_BUY_RED_POTION_30, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x31, 2), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_MARKET_POTION_SHOP_ITEM_4] = Location::Base(RC_MARKET_POTION_SHOP_ITEM_4, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_POTION_SHOP_MARKET, 0x03, 0x33, "Potion Shop Item 4", "MK Potion Shop Item 4", RHT_MARKET_POTION_SHOP_ITEM_4, RG_BUY_FAIRYS_SPIRIT, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x31, 3), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_MARKET_POTION_SHOP_ITEM_5] = Location::Base(RC_MARKET_POTION_SHOP_ITEM_5, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_POTION_SHOP_MARKET, 0x04, 0x34, "Potion Shop Item 5", "MK Potion Shop Item 5", RHT_MARKET_POTION_SHOP_ITEM_5, RG_BUY_DEKU_NUT_5, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x31, 4), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_MARKET_POTION_SHOP_ITEM_6] = Location::Base(RC_MARKET_POTION_SHOP_ITEM_6, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_POTION_SHOP_MARKET, 0x05, 0x35, "Potion Shop Item 6", "MK Potion Shop Item 6", RHT_MARKET_POTION_SHOP_ITEM_6, RG_BUY_BOTTLE_BUG, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x31, 5), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_MARKET_POTION_SHOP_ITEM_7] = Location::Base(RC_MARKET_POTION_SHOP_ITEM_7, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_POTION_SHOP_MARKET, 0x06, 0x36, "Potion Shop Item 7", "MK Potion Shop Item 7", RHT_MARKET_POTION_SHOP_ITEM_7, RG_BUY_POE, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x31, 6), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_MARKET_POTION_SHOP_ITEM_8] = Location::Base(RC_MARKET_POTION_SHOP_ITEM_8, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_POTION_SHOP_MARKET, 0x07, 0x37, "Potion Shop Item 8", "MK Potion Shop Item 8", RHT_MARKET_POTION_SHOP_ITEM_8, RG_BUY_FISH, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x31, 7), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_MARKET_BAZAAR_ITEM_1] = Location::Base(RC_MARKET_BAZAAR_ITEM_1, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BAZAAR, 0x00, 0x30, "Bazaar Item 1", "MK Bazaar Item 1", RHT_MARKET_BAZAAR_ITEM_1, RG_BUY_HYLIAN_SHIELD, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x2C, 0), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_MARKET_BAZAAR_ITEM_2] = Location::Base(RC_MARKET_BAZAAR_ITEM_2, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BAZAAR, 0x01, 0x31, "Bazaar Item 2", "MK Bazaar Item 2", RHT_MARKET_BAZAAR_ITEM_2, RG_BUY_BOMBS_535, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x2C, 1), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_MARKET_BAZAAR_ITEM_3] = Location::Base(RC_MARKET_BAZAAR_ITEM_3, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BAZAAR, 0x02, 0x32, "Bazaar Item 3", "MK Bazaar Item 3", RHT_MARKET_BAZAAR_ITEM_3, RG_BUY_DEKU_NUT_5, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x2C, 2), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_MARKET_BAZAAR_ITEM_4] = Location::Base(RC_MARKET_BAZAAR_ITEM_4, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BAZAAR, 0x03, 0x33, "Bazaar Item 4", "MK Bazaar Item 4", RHT_MARKET_BAZAAR_ITEM_4, RG_BUY_HEART, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x2C, 3), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_MARKET_BAZAAR_ITEM_5] = Location::Base(RC_MARKET_BAZAAR_ITEM_5, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BAZAAR, 0x04, 0x34, "Bazaar Item 5", "MK Bazaar Item 5", RHT_MARKET_BAZAAR_ITEM_5, RG_BUY_ARROWS_10, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x2C, 4), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_MARKET_BAZAAR_ITEM_6] = Location::Base(RC_MARKET_BAZAAR_ITEM_6, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BAZAAR, 0x05, 0x35, "Bazaar Item 6", "MK Bazaar Item 6", RHT_MARKET_BAZAAR_ITEM_6, RG_BUY_ARROWS_50, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x2C, 5), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_MARKET_BAZAAR_ITEM_7] = Location::Base(RC_MARKET_BAZAAR_ITEM_7, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BAZAAR, 0x06, 0x36, "Bazaar Item 7", "MK Bazaar Item 7", RHT_MARKET_BAZAAR_ITEM_7, RG_BUY_DEKU_STICK_1, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x2C, 6), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_MARKET_BAZAAR_ITEM_8] = Location::Base(RC_MARKET_BAZAAR_ITEM_8, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BAZAAR, 0x07, 0x37, "Bazaar Item 8", "MK Bazaar Item 8", RHT_MARKET_BAZAAR_ITEM_8, RG_BUY_ARROWS_30, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x2C, 7), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + + // Zora's Domain + locationTable[RC_ZD_SHOP_ITEM_1] = Location::Base(RC_ZD_SHOP_ITEM_1, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, ACTOR_EN_GIRLA, SCENE_ZORA_SHOP, 0x00, 0x30, "Shop Item 1", "ZD Shop Item 1", RHT_ZD_SHOP_ITEM_1, RG_BUY_ZORA_TUNIC, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x2F, 0), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZD_SHOP_ITEM_2] = Location::Base(RC_ZD_SHOP_ITEM_2, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, ACTOR_EN_GIRLA, SCENE_ZORA_SHOP, 0x01, 0x31, "Shop Item 2", "ZD Shop Item 2", RHT_ZD_SHOP_ITEM_2, RG_BUY_ARROWS_10, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x2F, 1), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZD_SHOP_ITEM_3] = Location::Base(RC_ZD_SHOP_ITEM_3, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, ACTOR_EN_GIRLA, SCENE_ZORA_SHOP, 0x02, 0x32, "Shop Item 3", "ZD Shop Item 3", RHT_ZD_SHOP_ITEM_3, RG_BUY_HEART, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x2F, 2), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZD_SHOP_ITEM_4] = Location::Base(RC_ZD_SHOP_ITEM_4, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, ACTOR_EN_GIRLA, SCENE_ZORA_SHOP, 0x03, 0x33, "Shop Item 4", "ZD Shop Item 4", RHT_ZD_SHOP_ITEM_4, RG_BUY_ARROWS_30, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x2F, 3), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZD_SHOP_ITEM_5] = Location::Base(RC_ZD_SHOP_ITEM_5, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, ACTOR_EN_GIRLA, SCENE_ZORA_SHOP, 0x04, 0x34, "Shop Item 5", "ZD Shop Item 5", RHT_ZD_SHOP_ITEM_5, RG_BUY_DEKU_NUT_5, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x2F, 4), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZD_SHOP_ITEM_6] = Location::Base(RC_ZD_SHOP_ITEM_6, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, ACTOR_EN_GIRLA, SCENE_ZORA_SHOP, 0x05, 0x35, "Shop Item 6", "ZD Shop Item 6", RHT_ZD_SHOP_ITEM_6, RG_BUY_ARROWS_50, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x2F, 5), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZD_SHOP_ITEM_7] = Location::Base(RC_ZD_SHOP_ITEM_7, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, ACTOR_EN_GIRLA, SCENE_ZORA_SHOP, 0x06, 0x36, "Shop Item 7", "ZD Shop Item 7", RHT_ZD_SHOP_ITEM_7, RG_BUY_FISH, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x2F, 6), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZD_SHOP_ITEM_8] = Location::Base(RC_ZD_SHOP_ITEM_8, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, ACTOR_EN_GIRLA, SCENE_ZORA_SHOP, 0x07, 0x37, "Shop Item 8", "ZD Shop Item 8", RHT_ZD_SHOP_ITEM_8, RG_BUY_RED_POTION_50, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x2F, 7), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + + // Goron City + locationTable[RC_GC_SHOP_ITEM_1] = Location::Base(RC_GC_SHOP_ITEM_1, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_GORON_CITY, ACTOR_EN_GIRLA, SCENE_GORON_SHOP, 0x00, 0x30, "Shop Item 1", "GC Shop Item 1", RHT_GC_SHOP_ITEM_1, RG_BUY_BOMBS_525, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x2E, 0), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[RC_GC_SHOP_ITEM_2] = Location::Base(RC_GC_SHOP_ITEM_2, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_GORON_CITY, ACTOR_EN_GIRLA, SCENE_GORON_SHOP, 0x01, 0x31, "Shop Item 2", "GC Shop Item 2", RHT_GC_SHOP_ITEM_2, RG_BUY_BOMBS_10, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x2E, 1), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[RC_GC_SHOP_ITEM_3] = Location::Base(RC_GC_SHOP_ITEM_3, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_GORON_CITY, ACTOR_EN_GIRLA, SCENE_GORON_SHOP, 0x02, 0x32, "Shop Item 3", "GC Shop Item 3", RHT_GC_SHOP_ITEM_3, RG_BUY_BOMBS_20, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x2E, 2), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[RC_GC_SHOP_ITEM_4] = Location::Base(RC_GC_SHOP_ITEM_4, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_GORON_CITY, ACTOR_EN_GIRLA, SCENE_GORON_SHOP, 0x03, 0x33, "Shop Item 4", "GC Shop Item 4", RHT_GC_SHOP_ITEM_4, RG_BUY_BOMBS_30, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x2E, 3), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[RC_GC_SHOP_ITEM_5] = Location::Base(RC_GC_SHOP_ITEM_5, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_GORON_CITY, ACTOR_EN_GIRLA, SCENE_GORON_SHOP, 0x04, 0x34, "Shop Item 5", "GC Shop Item 5", RHT_GC_SHOP_ITEM_5, RG_BUY_GORON_TUNIC, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x2E, 4), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[RC_GC_SHOP_ITEM_6] = Location::Base(RC_GC_SHOP_ITEM_6, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_GORON_CITY, ACTOR_EN_GIRLA, SCENE_GORON_SHOP, 0x05, 0x35, "Shop Item 6", "GC Shop Item 6", RHT_GC_SHOP_ITEM_6, RG_BUY_HEART, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x2E, 5), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[RC_GC_SHOP_ITEM_7] = Location::Base(RC_GC_SHOP_ITEM_7, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_GORON_CITY, ACTOR_EN_GIRLA, SCENE_GORON_SHOP, 0x06, 0x36, "Shop Item 7", "GC Shop Item 7", RHT_GC_SHOP_ITEM_7, RG_BUY_RED_POTION_40, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x2E, 6), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[RC_GC_SHOP_ITEM_8] = Location::Base(RC_GC_SHOP_ITEM_8, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_GORON_CITY, ACTOR_EN_GIRLA, SCENE_GORON_SHOP, 0x07, 0x37, "Shop Item 8", "GC Shop Item 8", RHT_GC_SHOP_ITEM_8, RG_BUY_HEART, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x2E, 7), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + + // 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", {}); + 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", "DMT Gossip Stone", {}); + locationTable[RC_COLOSSUS_GOSSIP_STONE] = Location::HintStone(RC_COLOSSUS_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 14362, 0x1A, "Gossip Stone", "Colossus Gossip Stone", {}); + locationTable[RC_DODONGOS_CAVERN_GOSSIP_STONE] = Location::HintStone(RC_DODONGOS_CAVERN_GOSSIP_STONE, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, 4372, 0x14, "Gossip Stone", "Dodongo's Cavern Gossip Stone", {}); + locationTable[RC_GV_GOSSIP_STONE] = Location::HintStone(RC_GV_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, 14353, 0x11, "Gossip Stone", "GV Gossip Stone", {}); + locationTable[RC_GC_MAZE_GOSSIP_STONE] = Location::HintStone(RC_GC_MAZE_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, 14357, 0x15, "Maze Gossip Stone", "GC Maze Gossip Stone", {}); + locationTable[RC_GC_MEDIGORON_GOSSIP_STONE] = Location::HintStone(RC_GC_MEDIGORON_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, 14873, 0x19, "Medigoron Gossip Stone", "GC Medigoron Gossip Stone", {}); + locationTable[RC_GY_GOSSIP_STONE] = Location::HintStone(RC_GY_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, 14346, 0x0A, "Gossip Stone", "GY Gossip Stone", {}); + locationTable[RC_HC_MALON_GOSSIP_STONE] = Location::HintStone(RC_HC_MALON_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, 14610, 0x12, "Malon Gossip Stone", "HC Malon Gossip Stone", {}); + locationTable[RC_HC_ROCK_WALL_GOSSIP_STONE] = Location::HintStone(RC_HC_ROCK_WALL_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, 14347, 0x0B, "Rock Wall Gossip Stone", "HC Rock Wall Gossip Stone", {}); + locationTable[RC_HC_STORMS_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_HC_STORMS_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, 14355, 0x13, "Storms Grotto Gossip Stone", "HC Storms Grotto Gossip Stone", {}); + locationTable[RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE] = Location::HintStone(RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, 14623, 0x1F, "Deku Tree Left Gossip Stone", "KF Deku Tree Left Gossip Stone", {}); + locationTable[RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE] = Location::HintStone(RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, 14880, 0x20, "Deku Tree Right Gossip Stone", "KF Deku Tree Right Gossip Stone", {}); + locationTable[RC_KF_GOSSIP_STONE] = Location::HintStone(RC_KF_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, 14366, 0x1E, "Gossip Stone", "KF Gossip Stone", {}); + locationTable[RC_KF_STORMS_GOSSIP_STONE] = Location::HintStone(RC_KF_STORMS_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_GROTTOS, -22988, 0x3C, "Storms Gossip Stone", "KF Storms Gossip Stone", {}); + locationTable[RC_LH_LAB_GOSSIP_STONE] = Location::HintStone(RC_LH_LAB_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 14339, 0x03, "Lab Gossip Stone", "LH Lab Gossip Stone", {}); + locationTable[RC_LH_SOUTHEAST_GOSSIP_STONE] = Location::HintStone(RC_LH_SOUTHEAST_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 14863, 0x0F, "Southeast Gossip Stone", "LH Southeast Gossip Stone", {}); + locationTable[RC_LH_SOUTHWEST_GOSSIP_STONE] = Location::HintStone(RC_LH_SOUTHWEST_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 14600, 0x08, "Southwest Gossip Stone", "LH Southwest Gossip Stone", {}); + locationTable[RC_LW_GOSSIP_STONE] = Location::HintStone(RC_LW_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 14365, 0x1D, "Gossip Stone", "LW Gossip Stone", {}); + locationTable[RC_SFM_MAZE_LOWER_GOSSIP_STONE] = Location::HintStone(RC_SFM_MAZE_LOWER_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, 14358, 0x16, "Maze Lower Gossip Stone", "SFM Maze Lower Gossip Stone", {}); + locationTable[RC_SFM_MAZE_UPPER_GOSSIP_STONE] = Location::HintStone(RC_SFM_MAZE_UPPER_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, 14615, 0x17, "Maze Upper Gossip Stone", "SFM Maze Upper Gossip Stone", {}); + locationTable[RC_SFM_SARIA_GOSSIP_STONE] = Location::HintStone(RC_SFM_SARIA_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, 14876, 0x1C, "Saria Gossip Stone", "SFM Saria Gossip Stone", {}); + locationTable[RC_TOT_LEFT_GOSSIP_STONE] = Location::HintStone(RC_TOT_LEFT_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_MARKET, SCENE_ID_MAX, 0x00, 0x06, "ToT Left Gossip Stone", "ToT Left Gossip Stone", {}); + locationTable[RC_TOT_RIGHT_GOSSIP_STONE] = Location::HintStone(RC_TOT_RIGHT_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_MARKET, SCENE_ID_MAX, 0x00, 0x07, "ToT Right Gossip Stone", "ToT Right Gossip Stone", {}); + locationTable[RC_TOT_RIGHT_CENTER_GOSSIP_STONE] = Location::HintStone(RC_TOT_RIGHT_CENTER_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_MARKET, SCENE_ID_MAX, 0x00, 0x10, "ToT Right Center Gossip Stone", "ToT Right Center Gossip Stone", {}); + locationTable[RC_TOT_LEFT_CENTER_GOSSIP_STONE] = Location::HintStone(RC_TOT_LEFT_CENTER_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_MARKET, SCENE_ID_MAX, 0x00, 0x0E, "ToT Left Center Gossip Stone", "ToT Left Center Gossip Stone", {}); + locationTable[RC_ZD_GOSSIP_STONE] = Location::HintStone(RC_ZD_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, 14345, 0x09, "Gossip Stone", "ZD Gossip Stone", {}); + locationTable[RC_FAIRY_GOSSIP_STONE] = Location::HintStone(RC_FAIRY_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, 0x00, 0x01, "Fairy Gossip Stone", "Fairy Gossip Stone", {}); + locationTable[RC_JABU_GOSSIP_STONE] = Location::HintStone(RC_JABU_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, 0x00, 0x02, "Jabu Gossip Stone", "Jabu Gossip Stone", {}); + locationTable[RC_ZR_NEAR_GROTTOS_GOSSIP_STONE] = Location::HintStone(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 14605, 0x0D, "Near Grottos Gossip Stone", "ZR Near Grottos Gossip Stone", {}); + locationTable[RC_ZR_NEAR_DOMAIN_GOSSIP_STONE] = Location::HintStone(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 14860, 0x0C, "Near Domain Gossip Stone", "ZR Near Domain Gossip Stone", {}); + locationTable[RC_HF_COW_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_HF_COW_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, 14363, 0x1B, "Cow Grotto Gossip Stone", "HF Cow Grotto Gossip Stone", {}); + locationTable[RC_HF_NEAR_MARKET_GOSSIP_STONE] = Location::HintStone(RC_HF_NEAR_MARKET_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, -22944, 0x30, "Near Market Gossip Stone", "HF Near Market Gossip Stone", {}); + locationTable[RC_HF_SOUTHEAST_GOSSIP_STONE] = Location::HintStone(RC_HF_SOUTHEAST_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, -22978, 0x32, "Southeast Gossip Stone", "HF Southeast Gossip Stone", {}); + locationTable[RC_HF_OPEN_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_HF_OPEN_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, -22947, 0x33, "Open Grotto Gossip Stone", "HF Open Grotto Gossip Stone", {}); + locationTable[RC_KAK_OPEN_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_KAK_OPEN_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_GROTTOS, -22984, 0x38, "Open Grotto Gossip Stone", "Kak Open Grotto Gossip Stone", {}); + locationTable[RC_ZR_OPEN_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_ZR_OPEN_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_GROTTOS, -22985, 0x39, "Open Grotto Gossip Stone", "ZR Open Grotto Gossip Stone", {}); + locationTable[RC_LW_NEAR_SHORTCUTS_GOSSIP_STONE] = Location::HintStone(RC_LW_NEAR_SHORTCUTS_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_GROTTOS, -22964, 0x34, "Near Shortcuts Gossip Stone", "LW Near Shortcuts Gossip Stone", {}); + locationTable[RC_DMT_STORMS_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_DMT_STORMS_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, -23255, 0x37, "Storms Grotto Gossip Stone", "DMT Storms Grotto Gossip Stone", {}); + locationTable[RC_DMC_UPPER_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_DMC_UPPER_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_GROTTOS, -23802, 0x3A, "Upper Grotto Gossip Stone", "DMC Upper Grotto Gossip Stone", {}); + + // Other Hints + locationTable[RC_GANONDORF_HINT] = Location::OtherHint(RC_GANONDORF_HINT, RCQUEST_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_GANONS_CASTLE, ACTOR_EN_GANON_MANT, SCENE_GANON_BOSS, 0x00, 0x00, "Hint", "Ganondorf 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 +} + +Location* Rando::StaticData::GetLocation(RandomizerCheck locKey) { + return &(locationTable[locKey]); +} + +std::array& Rando::StaticData::GetLocationTable() { + return locationTable; +} diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 578532a33..5239e0f45 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -26,6 +26,7 @@ #include #include "draw.h" #include "rando_hash.h" +#include "static_data.h" #include "soh/Enhancements/game-interactor/GameInteractor.h" #include #include "randomizer_settings_window.h" @@ -44,7 +45,7 @@ std::unordered_map SpoilerfileCheckNameToEnum; std::unordered_map SpoilerfileGetNameToEnum; std::unordered_map SpoilerfileAreaNameToEnum; std::unordered_map SpoilerfileHintTypeNameToEnum; -std::multimap, RandomizerCheckObject> checkFromActorMultimap; +std::multimap, RandomizerCheck> checkFromActorMultimap; std::set excludedLocations; std::set enabledTricks; std::set enabledGlitches; @@ -118,14 +119,16 @@ static const char* frenchRupeeNames[36] = { }; Randomizer::Randomizer() { - for (auto& [randomizerCheck, rcObject] : RandomizerCheckObjects::GetAllRCObjects()) { - SpoilerfileCheckNameToEnum[rcObject.rcSpoilerName] = rcObject.rc; - checkFromActorMultimap.emplace(std::make_tuple((s16)rcObject.actorId, (s16)rcObject.sceneId, rcObject.actorParams), rcObject); + Rando::StaticData::InitItemTable(); + Rando::StaticData::InitLocationTable(); + for (auto& location : Rando::StaticData::GetLocationTable()) { + SpoilerfileCheckNameToEnum[location.GetName()] = location.GetRandomizerCheck(); + checkFromActorMultimap.emplace(std::make_tuple((s16)location.GetActorID(), (s16)location.GetScene(), location.GetActorParams()), location.GetRandomizerCheck()); } SpoilerfileCheckNameToEnum["Invalid Location"] = RC_UNKNOWN_CHECK; SpoilerfileCheckNameToEnum["Link's Pocket"] = RC_LINKS_POCKET; - for (auto& item: *RandoMain::GetFullItemTable()) { + for (auto& item: Rando::StaticData::GetItemTable()) { // Easiest way to filter out all the empty values from the array, since we still technically want the 0/RG_NONE entry if (item.GetName().english.empty()) continue; SpoilerfileGetNameToEnum[item.GetName().english] = item.GetRandomizerGet(); @@ -2573,7 +2576,7 @@ std::map rcToRandomizerInf = { { RC_MARKET_10_BIG_POES, RAND_INF_10_BIG_POES }, }; -RandomizerCheckObject Randomizer::GetCheckObjectFromActor(s16 actorId, s16 sceneNum, s32 actorParams = 0x00) { +Rando::Location* Randomizer::GetCheckObjectFromActor(s16 actorId, s16 sceneNum, s32 actorParams = 0x00) { RandomizerCheck specialRc = RC_UNKNOWN_CHECK; // TODO: Migrate these special cases into table, or at least document why they are special switch(sceneNum) { @@ -2674,22 +2677,22 @@ RandomizerCheckObject Randomizer::GetCheckObjectFromActor(s16 actorId, s16 scene } if (specialRc != RC_UNKNOWN_CHECK) { - return RandomizerCheckObjects::GetAllRCObjects()[specialRc]; + return Rando::StaticData::GetLocation(specialRc); } auto range = checkFromActorMultimap.equal_range(std::make_tuple(actorId, sceneNum, actorParams)); for (auto it = range.first; it != range.second; ++it) { if ( - it->second.vOrMQ == RCVORMQ_BOTH || - (it->second.vOrMQ == RCVORMQ_VANILLA && !ResourceMgr_IsGameMasterQuest()) || - (it->second.vOrMQ == RCVORMQ_MQ && ResourceMgr_IsGameMasterQuest()) + Rando::StaticData::GetLocation(it->second)->GetQuest() == RCQUEST_BOTH || + (Rando::StaticData::GetLocation(it->second)->GetQuest() == RCQUEST_VANILLA && !ResourceMgr_IsGameMasterQuest()) || + (Rando::StaticData::GetLocation(it->second)->GetQuest() == RCQUEST_MQ && ResourceMgr_IsGameMasterQuest()) ) { - return it->second; + return Rando::StaticData::GetLocation(it->second); } } - return RandomizerCheckObjects::GetAllRCObjects()[RC_UNKNOWN_CHECK]; + return Rando::StaticData::GetLocation(RC_UNKNOWN_CHECK); } ScrubIdentity Randomizer::IdentifyScrub(s32 sceneNum, s32 actorParams, s32 respawnData) { @@ -2708,15 +2711,15 @@ ScrubIdentity Randomizer::IdentifyScrub(s32 sceneNum, s32 actorParams, s32 respa actorParams = TWO_ACTOR_PARAMS(actorParams, respawnData); } - RandomizerCheckObject rcObject = GetCheckObjectFromActor(ACTOR_EN_DNS, sceneNum, actorParams); + Rando::Location* location = GetCheckObjectFromActor(ACTOR_EN_DNS, sceneNum, actorParams); - if (rcObject.rc != RC_UNKNOWN_CHECK) { - scrubIdentity.randomizerInf = rcToRandomizerInf[rcObject.rc]; - scrubIdentity.randomizerCheck = rcObject.rc; - scrubIdentity.getItemId = rcObject.ogItemId; + if (location->GetRandomizerCheck() != RC_UNKNOWN_CHECK) { + scrubIdentity.randomizerInf = rcToRandomizerInf[location->GetRandomizerCheck()]; + scrubIdentity.randomizerCheck = location->GetRandomizerCheck(); + scrubIdentity.getItemId = (GetItemID)Rando::StaticData::RetrieveItem(location->GetVanillaItem()).GetItemID(); scrubIdentity.isShuffled = GetRandoSettingValue(RSK_SHUFFLE_SCRUBS) != RO_SCRUBS_OFF; - if (rcObject.rc == RC_HF_DEKU_SCRUB_GROTTO || rcObject.rc == RC_LW_DEKU_SCRUB_GROTTO_FRONT || rcObject.rc == RC_LW_DEKU_SCRUB_NEAR_BRIDGE) { + if (location->GetRandomizerCheck() == RC_HF_DEKU_SCRUB_GROTTO || location->GetRandomizerCheck() == RC_LW_DEKU_SCRUB_GROTTO_FRONT || location->GetRandomizerCheck() == RC_LW_DEKU_SCRUB_NEAR_BRIDGE) { scrubIdentity.isShuffled = true; } @@ -2737,14 +2740,14 @@ ShopItemIdentity Randomizer::IdentifyShopItem(s32 sceneNum, u8 slotIndex) { shopItemIdentity.itemPrice = -1; shopItemIdentity.enGirlAShopItem = 0x32; - RandomizerCheckObject rcObject = GetCheckObjectFromActor(ACTOR_EN_GIRLA, + Rando::Location* location = GetCheckObjectFromActor(ACTOR_EN_GIRLA, // Bazaar (SHOP1) scene is reused, so if entering from Kak use debug scene to identify (sceneNum == SCENE_BAZAAR && gSaveContext.entranceIndex == 0xB7) ? SCENE_TEST01 : sceneNum, slotIndex); - if (rcObject.rc != RC_UNKNOWN_CHECK) { - shopItemIdentity.randomizerInf = rcToRandomizerInf[rcObject.rc]; - shopItemIdentity.randomizerCheck = rcObject.rc; - shopItemIdentity.ogItemId = rcObject.ogItemId; + if (location->GetRandomizerCheck() != RC_UNKNOWN_CHECK) { + shopItemIdentity.randomizerInf = rcToRandomizerInf[location->GetRandomizerCheck()]; + shopItemIdentity.randomizerCheck = location->GetRandomizerCheck(); + shopItemIdentity.ogItemId = (GetItemID)Rando::StaticData::RetrieveItem(location->GetVanillaItem()).GetItemID(); RandomizerGetData randoGet = GetRandomizerGetDataFromKnownCheck(shopItemIdentity.randomizerCheck); if (randomizerGetToEnGirlShopItem.find(randoGet.rgID) != randomizerGetToEnGirlShopItem.end()) { @@ -2771,11 +2774,11 @@ CowIdentity Randomizer::IdentifyCow(s32 sceneNum, s32 posX, s32 posZ) { actorParams = TWO_ACTOR_PARAMS(posX, posZ); } - RandomizerCheckObject rcObject = GetCheckObjectFromActor(ACTOR_EN_COW, sceneNum, actorParams); + Rando::Location* location = GetCheckObjectFromActor(ACTOR_EN_COW, sceneNum, actorParams); - if (rcObject.rc != RC_UNKNOWN_CHECK) { - cowIdentity.randomizerInf = rcToRandomizerInf[rcObject.rc]; - cowIdentity.randomizerCheck = rcObject.rc; + if (location->GetRandomizerCheck() != RC_UNKNOWN_CHECK) { + cowIdentity.randomizerInf = rcToRandomizerInf[location->GetRandomizerCheck()]; + cowIdentity.randomizerCheck = location->GetRandomizerCheck(); } return cowIdentity; @@ -2793,27 +2796,17 @@ GetItemEntry Randomizer::GetItemEntryFromRGData(RandomizerGetData rgData, GetIte if (checkObtainability && OTRGlobals::Instance->gRandomizer->GetItemObtainabilityFromRandomizerGet(rgData.rgID) != CAN_OBTAIN) { return ItemTableManager::Instance->RetrieveItemEntry(MOD_NONE, GI_RUPEE_BLUE); } - // Can't get RG_ICE_TRAP if the rgID corresponds to a vanilla item - if (IsItemVanilla(rgData.rgID)) { - return ItemTableManager::Instance->RetrieveItemEntry(MOD_NONE, GetItemIdFromRandomizerGet(rgData.rgID, ogItemId)); - } - // After this point we can assume we are dealing with a randomizer exclusive item. - GetItemEntry giEntry = ItemTableManager::Instance->RetrieveItemEntry( - MOD_RANDOMIZER, GetItemIdFromRandomizerGet(rgData.rgID, ogItemId)); - // If we have an ice trap, we want to change the GID and DrawFunc to the fakeRgID's values. + + Rando::Item item = Rando::StaticData::RetrieveItem(rgData.rgID); + GetItemEntry giEntry = item.GetGIEntry_Copy(); + // If we have an ice trap, we want to change the GID and drawFunc to the fakeRgID's values. if (rgData.rgID == RG_ICE_TRAP) { - ModIndex modIndex; - if (IsItemVanilla(rgData.fakeRgID)) { - modIndex = MOD_NONE; - } else { - modIndex = MOD_RANDOMIZER; - } - GetItemEntry fakeGiEntry = ItemTableManager::Instance->RetrieveItemEntry(modIndex, GetItemIdFromRandomizerGet(rgData.fakeRgID, ogItemId)); - giEntry.gid = fakeGiEntry.gid; - giEntry.gi = fakeGiEntry.gi; - giEntry.drawItemId = fakeGiEntry.drawItemId; - giEntry.drawModIndex = fakeGiEntry.drawModIndex; - giEntry.drawFunc = fakeGiEntry.drawFunc; + std::shared_ptr fakeGiEntry = Rando::StaticData::RetrieveItem(rgData.fakeRgID).GetGIEntry(); + giEntry.gid = fakeGiEntry->gid; + giEntry.gi = fakeGiEntry->gi; + giEntry.drawItemId = fakeGiEntry->drawItemId; + giEntry.drawModIndex = fakeGiEntry->drawModIndex; + giEntry.drawFunc = fakeGiEntry->drawFunc; } return giEntry; } @@ -2824,7 +2817,7 @@ GetItemEntry Randomizer::GetItemFromKnownCheck(RandomizerCheck randomizerCheck, } RandomizerCheck Randomizer::GetCheckFromActor(s16 actorId, s16 sceneNum, s16 actorParams) { - return GetCheckObjectFromActor(actorId, sceneNum, actorParams).rc; + return GetCheckObjectFromActor(actorId, sceneNum, actorParams)->GetRandomizerCheck(); } RandomizerInf Randomizer::GetRandomizerInfFromCheck(RandomizerCheck rc) { @@ -3060,9 +3053,10 @@ void GenerateRandomizerImgui(std::string seed = "") { RandomizerCheckObjects::UpdateImGuiVisibility(); // Remove excludes for locations that are no longer allowed to be excluded - for (auto& [randomizerCheck, rcObject] : RandomizerCheckObjects::GetAllRCObjects()) { - auto elfound = excludedLocations.find(rcObject.rc); - if (!rcObject.visibleInImgui && elfound != excludedLocations.end()) { + auto ctx = Rando::Context::GetInstance(); + for (auto& location : Rando::StaticData::GetLocationTable()) { + auto elfound = excludedLocations.find(location.GetRandomizerCheck()); + if (!ctx->GetItemLocation(location.GetRandomizerCheck())->IsVisible() && elfound != excludedLocations.end()) { excludedLocations.erase(elfound); } } @@ -3085,6 +3079,7 @@ bool GenerateRandomizer(std::string seed /*= ""*/) { } void RandomizerSettingsWindow::DrawElement() { + auto ctx = Rando::Context::GetInstance(); if (generated) { generated = 0; randoThread.join(); @@ -4632,11 +4627,11 @@ void RandomizerSettingsWindow::DrawElement() { locationSearch.Draw(); ImGui::BeginChild("ChildIncludedLocations", ImVec2(0, -8)); - for (auto& [rcArea, rcObjects] : RandomizerCheckObjects::GetAllRCObjectsByArea()) { + for (auto& [rcArea, locations] : RandomizerCheckObjects::GetAllRCObjectsByArea()) { bool hasItems = false; - for (auto& [randomizerCheck, rcObject] : rcObjects) { - if (rcObject->visibleInImgui && !excludedLocations.count(rcObject->rc) && - locationSearch.PassFilter(rcObject->rcSpoilerName.c_str())) { + for (RandomizerCheck rc : locations) { + if (ctx->GetItemLocation(rc)->IsVisible() && !excludedLocations.count(rc) && + locationSearch.PassFilter(Rando::StaticData::GetLocation(rc)->GetName().c_str())) { hasItems = true; break; @@ -4646,12 +4641,12 @@ void RandomizerSettingsWindow::DrawElement() { if (hasItems) { ImGui::SetNextItemOpen(true, ImGuiCond_Once); if (ImGui::TreeNode(RandomizerCheckObjects::GetRCAreaName(rcArea).c_str())) { - for (auto& [randomizerCheck, rcObject] : rcObjects) { - if (rcObject->visibleInImgui && !excludedLocations.count(rcObject->rc) && - locationSearch.PassFilter(rcObject->rcSpoilerName.c_str())) { + for (auto& location : locations) { + if (ctx->GetItemLocation(location)->IsVisible() && !excludedLocations.count(location) && + locationSearch.PassFilter(Rando::StaticData::GetLocation(location)->GetName().c_str())) { - if (ImGui::ArrowButton(std::to_string(rcObject->rc).c_str(), ImGuiDir_Right)) { - excludedLocations.insert(rcObject->rc); + if (ImGui::ArrowButton(std::to_string(location).c_str(), ImGuiDir_Right)) { + excludedLocations.insert(location); // todo: this efficently when we build out cvar array support std::string excludedLocationString = ""; for (auto excludedLocationIt : excludedLocations) { @@ -4662,7 +4657,7 @@ void RandomizerSettingsWindow::DrawElement() { LUS::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); } ImGui::SameLine(); - ImGui::Text("%s", rcObject->rcShortName.c_str()); + ImGui::Text("%s", Rando::StaticData::GetLocation(location)->GetShortName().c_str()); } } ImGui::TreePop(); @@ -4676,10 +4671,10 @@ void RandomizerSettingsWindow::DrawElement() { window->DC.CurrLineTextBaseOffset = 0.0f; ImGui::BeginChild("ChildExcludedLocations", ImVec2(0, -8)); - for (auto& [rcArea, rcObjects] : RandomizerCheckObjects::GetAllRCObjectsByArea()) { + for (auto& [rcArea, locations] : RandomizerCheckObjects::GetAllRCObjectsByArea()) { bool hasItems = false; - for (auto& [randomizerCheck, rcObject] : rcObjects) { - if (rcObject->visibleInImgui && excludedLocations.count(rcObject->rc)) { + for (RandomizerCheck rc : locations) { + if (ctx->GetItemLocation(rc)->IsVisible() && excludedLocations.count(rc)) { hasItems = true; break; } @@ -4688,10 +4683,10 @@ void RandomizerSettingsWindow::DrawElement() { if (hasItems) { ImGui::SetNextItemOpen(true, ImGuiCond_Once); if (ImGui::TreeNode(RandomizerCheckObjects::GetRCAreaName(rcArea).c_str())) { - for (auto& [randomizerCheck, rcObject] : rcObjects) { - auto elfound = excludedLocations.find(rcObject->rc); - if (rcObject->visibleInImgui && elfound != excludedLocations.end()) { - if (ImGui::ArrowButton(std::to_string(rcObject->rc).c_str(), ImGuiDir_Left)) { + for (auto& location : locations) { + auto elfound = excludedLocations.find(location); + if (ctx->GetItemLocation(location)->IsVisible() && elfound != excludedLocations.end()) { + if (ImGui::ArrowButton(std::to_string(location).c_str(), ImGuiDir_Left)) { excludedLocations.erase(elfound); // todo: this efficently when we build out cvar array support std::string excludedLocationString = ""; @@ -4703,7 +4698,7 @@ void RandomizerSettingsWindow::DrawElement() { LUS::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); } ImGui::SameLine(); - ImGui::Text("%s", rcObject->rcShortName.c_str()); + ImGui::Text("%s", Rando::StaticData::GetLocation(location)->GetShortName().c_str()); } } ImGui::TreePop(); @@ -6118,125 +6113,8 @@ class ExtendedVanillaTableInvalidItemIdException: public std::exception { } }; -void InitRandoItemTable() { - // These entries have ItemIDs from vanilla, but not GetItemIDs or entries in the old sGetItemTable - static GetItemEntry extendedVanillaGetItemTable[] = { - GET_ITEM(ITEM_MEDALLION_LIGHT, OBJECT_GI_MEDAL, GID_MEDALLION_LIGHT, 0x40, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_LIGHT_MEDALLION), - GET_ITEM(ITEM_MEDALLION_FOREST, OBJECT_GI_MEDAL, GID_MEDALLION_FOREST, 0x3E, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_FOREST_MEDALLION), - GET_ITEM(ITEM_MEDALLION_FIRE, OBJECT_GI_MEDAL, GID_MEDALLION_FIRE, 0x3C, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_FIRE_MEDALLION), - GET_ITEM(ITEM_MEDALLION_WATER, OBJECT_GI_MEDAL, GID_MEDALLION_WATER, 0x3D, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_WATER_MEDALLION), - GET_ITEM(ITEM_MEDALLION_SHADOW, OBJECT_GI_MEDAL, GID_MEDALLION_SHADOW, 0x41, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_SHADOW_MEDALLION), - GET_ITEM(ITEM_MEDALLION_SPIRIT, OBJECT_GI_MEDAL, GID_MEDALLION_SPIRIT, 0x3F, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_SPIRIT_MEDALLION), - - GET_ITEM(ITEM_KOKIRI_EMERALD, OBJECT_GI_JEWEL, GID_KOKIRI_EMERALD, 0x80, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_KOKIRI_EMERALD), - GET_ITEM(ITEM_GORON_RUBY, OBJECT_GI_JEWEL, GID_GORON_RUBY, 0x81, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_GORON_RUBY), - GET_ITEM(ITEM_ZORA_SAPPHIRE, OBJECT_GI_JEWEL, GID_ZORA_SAPPHIRE, 0x82, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_ZORA_SAPPHIRE), - - GET_ITEM(ITEM_SONG_LULLABY, OBJECT_GI_MELODY, GID_SONG_ZELDA, 0xD4, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_ZELDAS_LULLABY), - GET_ITEM(ITEM_SONG_SUN, OBJECT_GI_MELODY, GID_SONG_SUN, 0xD3, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_SUNS_SONG), - GET_ITEM(ITEM_SONG_EPONA, OBJECT_GI_MELODY, GID_SONG_EPONA, 0xD2, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_EPONAS_SONG), - GET_ITEM(ITEM_SONG_STORMS, OBJECT_GI_MELODY, GID_SONG_STORM, 0xD6, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_SONG_OF_STORMS), - GET_ITEM(ITEM_SONG_TIME, OBJECT_GI_MELODY, GID_SONG_TIME, 0xD5, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_SONG_OF_TIME), - GET_ITEM(ITEM_SONG_SARIA, OBJECT_GI_MELODY, GID_SONG_SARIA, 0xD1, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_SARIAS_SONG), - - GET_ITEM(ITEM_SONG_MINUET, OBJECT_GI_MELODY, GID_SONG_MINUET, 0x73, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_MINUET_OF_FOREST), - GET_ITEM(ITEM_SONG_BOLERO, OBJECT_GI_MELODY, GID_SONG_BOLERO, 0x74, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_BOLERO_OF_FIRE), - GET_ITEM(ITEM_SONG_SERENADE, OBJECT_GI_MELODY, GID_SONG_SERENADE, 0x75, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_SERENADE_OF_WATER), - GET_ITEM(ITEM_SONG_NOCTURNE, OBJECT_GI_MELODY, GID_SONG_NOCTURNE, 0x77, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_NOCTURNE_OF_SHADOW), - GET_ITEM(ITEM_SONG_REQUIEM, OBJECT_GI_MELODY, GID_SONG_REQUIEM, 0x76, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_REQUIEM_OF_SPIRIT), - GET_ITEM(ITEM_SONG_PRELUDE, OBJECT_GI_MELODY, GID_SONG_PRELUDE, 0x78, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_PRELUDE_OF_LIGHT), - }; - - // These do not have ItemIDs or GetItemIDs from vanilla, so I'm using their - // RandomizerGet enum values for both. - static GetItemEntry randoGetItemTable[] = { - GET_ITEM(RG_ICE_TRAP, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER, RG_ICE_TRAP), - GET_ITEM(RG_MAGIC_SINGLE, OBJECT_GI_MAGICPOT, GID_MAGIC_SMALL, 0xE4, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER, RG_MAGIC_SINGLE), - GET_ITEM(RG_MAGIC_DOUBLE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0xE8, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER, RG_MAGIC_DOUBLE), - GET_ITEM(RG_DOUBLE_DEFENSE, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xE9, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER, RG_DOUBLE_DEFENSE), - GET_ITEM(RG_GREG_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GREEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER, RG_GREG_RUPEE), - GET_ITEM(RG_BOTTLE_WITH_RED_POTION, OBJECT_GI_LIQUID, GID_POTION_RED, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER, RG_BOTTLE_WITH_RED_POTION), - GET_ITEM(RG_BOTTLE_WITH_GREEN_POTION, OBJECT_GI_LIQUID, GID_POTION_GREEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER, RG_BOTTLE_WITH_GREEN_POTION), - GET_ITEM(RG_BOTTLE_WITH_BLUE_POTION, OBJECT_GI_LIQUID, GID_POTION_BLUE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER, RG_BOTTLE_WITH_BLUE_POTION), - GET_ITEM(RG_BOTTLE_WITH_FAIRY, OBJECT_GI_BOTTLE, GID_BOTTLE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER, RG_BOTTLE_WITH_FAIRY), - GET_ITEM(RG_BOTTLE_WITH_FISH, OBJECT_GI_FISH, GID_FISH, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER, RG_BOTTLE_WITH_FISH), - GET_ITEM(RG_BOTTLE_WITH_BLUE_FIRE, OBJECT_GI_FIRE, GID_BLUE_FIRE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER, RG_BOTTLE_WITH_BLUE_FIRE), - GET_ITEM(RG_BOTTLE_WITH_BUGS, OBJECT_GI_INSECT, GID_BUG, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER, RG_BOTTLE_WITH_BUGS), - GET_ITEM(RG_BOTTLE_WITH_POE, OBJECT_GI_GHOST, GID_POE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER, RG_BOTTLE_WITH_POE), - GET_ITEM(RG_BOTTLE_WITH_BIG_POE, OBJECT_GI_GHOST, GID_BIG_POE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER, RG_BOTTLE_WITH_BIG_POE), - GET_ITEM(RG_GERUDO_FORTRESS_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_ITEM_KEY_SMALL, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY, MOD_RANDOMIZER, RG_GERUDO_FORTRESS_SMALL_KEY), - GET_ITEM(RG_FOREST_TEMPLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_ITEM_KEY_SMALL, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY, MOD_RANDOMIZER, RG_FOREST_TEMPLE_SMALL_KEY), - GET_ITEM(RG_FIRE_TEMPLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_ITEM_KEY_SMALL, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY, MOD_RANDOMIZER, RG_FIRE_TEMPLE_SMALL_KEY), - GET_ITEM(RG_WATER_TEMPLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_ITEM_KEY_SMALL, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY, MOD_RANDOMIZER, RG_WATER_TEMPLE_SMALL_KEY), - GET_ITEM(RG_SPIRIT_TEMPLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_ITEM_KEY_SMALL, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY, MOD_RANDOMIZER, RG_SPIRIT_TEMPLE_SMALL_KEY), - GET_ITEM(RG_SHADOW_TEMPLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_ITEM_KEY_SMALL, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY, MOD_RANDOMIZER, RG_SHADOW_TEMPLE_SMALL_KEY), - GET_ITEM(RG_BOTTOM_OF_THE_WELL_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_ITEM_KEY_SMALL, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY, MOD_RANDOMIZER, RG_BOTTOM_OF_THE_WELL_SMALL_KEY), - GET_ITEM(RG_GERUDO_TRAINING_GROUNDS_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_ITEM_KEY_SMALL, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY, MOD_RANDOMIZER, RG_GERUDO_TRAINING_GROUNDS_SMALL_KEY), - GET_ITEM(RG_GANONS_CASTLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_ITEM_KEY_SMALL, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY, MOD_RANDOMIZER, RG_GANONS_CASTLE_SMALL_KEY), - GET_ITEM(RG_GERUDO_FORTRESS_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY, MOD_RANDOMIZER, RG_GERUDO_FORTRESS_KEY_RING), - GET_ITEM(RG_FOREST_TEMPLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY, MOD_RANDOMIZER, RG_FOREST_TEMPLE_KEY_RING), - GET_ITEM(RG_FIRE_TEMPLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY, MOD_RANDOMIZER, RG_FIRE_TEMPLE_KEY_RING), - GET_ITEM(RG_WATER_TEMPLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY, MOD_RANDOMIZER, RG_WATER_TEMPLE_KEY_RING), - GET_ITEM(RG_SPIRIT_TEMPLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY, MOD_RANDOMIZER, RG_SPIRIT_TEMPLE_KEY_RING), - GET_ITEM(RG_SHADOW_TEMPLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY, MOD_RANDOMIZER, RG_SHADOW_TEMPLE_KEY_RING), - GET_ITEM(RG_BOTTOM_OF_THE_WELL_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY, MOD_RANDOMIZER, RG_BOTTOM_OF_THE_WELL_KEY_RING), - GET_ITEM(RG_GERUDO_TRAINING_GROUNDS_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY, MOD_RANDOMIZER, RG_GERUDO_TRAINING_GROUNDS_KEY_RING), - GET_ITEM(RG_GANONS_CASTLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY, MOD_RANDOMIZER, RG_GANONS_CASTLE_KEY_RING), - GET_ITEM(RG_FOREST_TEMPLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_ITEM_KEY_BOSS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY, MOD_RANDOMIZER, RG_FOREST_TEMPLE_BOSS_KEY), - GET_ITEM(RG_FIRE_TEMPLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_ITEM_KEY_BOSS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY, MOD_RANDOMIZER, RG_FIRE_TEMPLE_BOSS_KEY), - GET_ITEM(RG_WATER_TEMPLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_ITEM_KEY_BOSS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY, MOD_RANDOMIZER, RG_WATER_TEMPLE_BOSS_KEY), - GET_ITEM(RG_SPIRIT_TEMPLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_ITEM_KEY_BOSS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY, MOD_RANDOMIZER, RG_SPIRIT_TEMPLE_BOSS_KEY), - GET_ITEM(RG_SHADOW_TEMPLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_ITEM_KEY_BOSS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY, MOD_RANDOMIZER, RG_SHADOW_TEMPLE_BOSS_KEY), - GET_ITEM(RG_GANONS_CASTLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_ITEM_KEY_BOSS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY, MOD_RANDOMIZER, RG_GANONS_CASTLE_BOSS_KEY), - GET_ITEM(RG_DEKU_TREE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER, RG_DEKU_TREE_MAP), - GET_ITEM(RG_DODONGOS_CAVERN_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER, RG_DODONGOS_CAVERN_MAP), - GET_ITEM(RG_JABU_JABUS_BELLY_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER, RG_JABU_JABUS_BELLY_MAP), - GET_ITEM(RG_FOREST_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER, RG_FOREST_TEMPLE_MAP), - GET_ITEM(RG_FIRE_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER, RG_FIRE_TEMPLE_MAP), - GET_ITEM(RG_WATER_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER, RG_WATER_TEMPLE_MAP), - GET_ITEM(RG_SPIRIT_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER, RG_SPIRIT_TEMPLE_MAP), - GET_ITEM(RG_SHADOW_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER, RG_SHADOW_TEMPLE_MAP), - GET_ITEM(RG_BOTTOM_OF_THE_WELL_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER, RG_BOTTOM_OF_THE_WELL_MAP), - GET_ITEM(RG_ICE_CAVERN_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER, RG_ICE_CAVERN_MAP), - GET_ITEM(RG_DEKU_TREE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER, RG_DEKU_TREE_COMPASS), - GET_ITEM(RG_DODONGOS_CAVERN_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER, RG_DODONGOS_CAVERN_COMPASS), - GET_ITEM(RG_JABU_JABUS_BELLY_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER, RG_JABU_JABUS_BELLY_COMPASS), - GET_ITEM(RG_FOREST_TEMPLE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER, RG_FOREST_TEMPLE_COMPASS), - GET_ITEM(RG_FIRE_TEMPLE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER, RG_FIRE_TEMPLE_COMPASS), - GET_ITEM(RG_WATER_TEMPLE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER, RG_WATER_TEMPLE_COMPASS), - GET_ITEM(RG_SPIRIT_TEMPLE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER, RG_SPIRIT_TEMPLE_COMPASS), - GET_ITEM(RG_SHADOW_TEMPLE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER, RG_SHADOW_TEMPLE_COMPASS), - GET_ITEM(RG_BOTTOM_OF_THE_WELL_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER, RG_BOTTOM_OF_THE_WELL_COMPASS), - GET_ITEM(RG_ICE_CAVERN_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER, RG_ICE_CAVERN_COMPASS), - GET_ITEM(RG_MAGIC_BEAN_PACK, OBJECT_GI_BEAN, GID_BEAN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER, RG_MAGIC_BEAN_PACK), - GET_ITEM(RG_TYCOON_WALLET, OBJECT_GI_PURSE, GID_WALLET_GIANT, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER, RG_TYCOON_WALLET), - GET_ITEM(RG_PROGRESSIVE_BOMBCHUS, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER, RG_PROGRESSIVE_BOMBCHUS), - GET_ITEM(RG_TRIFORCE_PIECE, OBJECT_GI_BOMB_2, GID_TRIFORCE_PIECE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER, RG_TRIFORCE_PIECE), - }; - ItemTableManager::Instance->AddItemTable(MOD_RANDOMIZER); - for (int i = 0; i < ARRAY_COUNT(extendedVanillaGetItemTable); i++) { - ItemTableManager::Instance->AddItemEntry(MOD_RANDOMIZER, extendedVanillaGetItemTable[i].getItemId, extendedVanillaGetItemTable[i]); - } - for (int i = 0; i < ARRAY_COUNT(randoGetItemTable); i++) { - if (randoGetItemTable[i].itemId >= RG_FOREST_TEMPLE_SMALL_KEY && randoGetItemTable[i].itemId <= RG_GANONS_CASTLE_SMALL_KEY - && randoGetItemTable[i].itemId != RG_GERUDO_FORTRESS_SMALL_KEY) { - randoGetItemTable[i].drawFunc = (CustomDrawFunc)Randomizer_DrawSmallKey; - } else if (randoGetItemTable[i].itemId >= RG_FOREST_TEMPLE_KEY_RING && randoGetItemTable[i].itemId <= RG_GANONS_CASTLE_KEY_RING) { - randoGetItemTable[i].drawFunc = (CustomDrawFunc)Randomizer_DrawKeyRing; - } else if (randoGetItemTable[i].itemId >= RG_FOREST_TEMPLE_BOSS_KEY && randoGetItemTable[i].itemId <= RG_GANONS_CASTLE_BOSS_KEY) { - randoGetItemTable[i].drawFunc = (CustomDrawFunc)Randomizer_DrawBossKey; - } else if (randoGetItemTable[i].itemId == RG_DOUBLE_DEFENSE) { - randoGetItemTable[i].drawFunc = (CustomDrawFunc)Randomizer_DrawDoubleDefense; - } else if (randoGetItemTable[i].itemId == RG_TRIFORCE_PIECE) { - randoGetItemTable[i].drawFunc = (CustomDrawFunc)Randomizer_DrawTriforcePiece; - } - ItemTableManager::Instance->AddItemEntry(MOD_RANDOMIZER, randoGetItemTable[i].itemId, randoGetItemTable[i]); - } -} - void RandomizerSettingsWindow::InitElement() { Randomizer::CreateCustomMessages(); seedString = (char*)calloc(MAX_SEED_STRING_SIZE, sizeof(char)); - InitRandoItemTable(); } diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h index a726cecde..ed3a45cb4 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.h +++ b/soh/soh/Enhancements/randomizer/randomizer.h @@ -7,6 +7,7 @@ #include #include "z64item.h" #include +#include "context.h" #include #include "soh/Enhancements/randomizer/randomizer_check_objects.h" #include "soh/Enhancements/randomizer/randomizer_tricks.h" @@ -85,7 +86,7 @@ class Randomizer { std::string GetDampeText() const; std::string GetSheikText() const; std::string GetSariaText() const; - RandomizerCheckObject GetCheckObjectFromActor(s16 actorId, s16 sceneNum, s32 actorParams); + Rando::Location* GetCheckObjectFromActor(s16 actorId, s16 sceneNum, s32 actorParams); ScrubIdentity IdentifyScrub(s32 sceneNum, s32 actorParams, s32 respawnData); ShopItemIdentity IdentifyShopItem(s32 sceneNum, u8 slotIndex); CowIdentity IdentifyCow(s32 sceneNum, s32 posX, s32 posZ); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index b1e843497..4dc5a590a 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -44,6 +44,7 @@ typedef enum { HINT_TYPE_DUNGEON, HINT_TYPE_JUNK, HINT_TYPE_NAMED_ITEM, + HINT_TYPE_STATIC, // For special hints, like Light Arrows or Hookshot Hints HINT_TYPE_MAX } HintType; @@ -71,7 +72,7 @@ typedef enum { RCTYPE_OCARINA, // Ocarina locations } RandomizerCheckType; -typedef enum { RCVORMQ_VANILLA, RCVORMQ_MQ, RCVORMQ_BOTH } RandomizerCheckVanillaOrMQ; +typedef enum { RCQUEST_VANILLA, RCQUEST_MQ, RCQUEST_BOTH } RandomizerCheckQuest; typedef enum { RCAREA_KOKIRI_FOREST, @@ -110,6 +111,496 @@ typedef enum { RCAREA_INVALID } RandomizerCheckArea; +typedef enum { + RR_NONE, + RR_ROOT, + RR_ROOT_EXITS, + RR_CHILD_SPAWN, + RR_ADULT_SPAWN, + RR_MINUET_OF_FOREST_WARP, + RR_BOLERO_OF_FIRE_WARP, + RR_SERENADE_OF_WATER_WARP, + RR_REQUIEM_OF_SPIRIT_WARP, + RR_NOCTURNE_OF_SHADOW_WARP, + RR_PRELUDE_OF_LIGHT_WARP, + RR_KOKIRI_FOREST, + RR_KF_LINKS_HOUSE, + RR_KF_MIDOS_HOUSE, + RR_KF_SARIAS_HOUSE, + RR_KF_HOUSE_OF_TWINS, + RR_KF_KNOW_IT_ALL_HOUSE, + RR_KF_KOKIRI_SHOP, + RR_KF_OUTSIDE_DEKU_TREE, + RR_KF_STORMS_GROTTO, + RR_THE_LOST_WOODS, + RR_LW_BRIDGE_FROM_FOREST, + RR_LW_BRIDGE, + RR_LW_FOREST_EXIT, + RR_LW_BEYOND_MIDO, + RR_LW_NEAR_SHORTCUTS_GROTTO, + RR_DEKU_THEATER, + RR_LW_SCRUBS_GROTTO, + RR_SFM_ENTRYWAY, + RR_SACRED_FOREST_MEADOW, + RR_SFM_WOLFOS_GROTTO, + RR_SFM_FAIRY_GROTTO, + RR_SFM_STORMS_GROTTO, + RR_HYRULE_FIELD, + RR_HF_SOUTHEAST_GROTTO, + RR_HF_OPEN_GROTTO, + RR_HF_INSIDE_FENCE_GROTTO, + RR_HF_COW_GROTTO, + RR_HF_NEAR_MARKET_GROTTO, + RR_HF_FAIRY_GROTTO, + RR_HF_NEAR_KAK_GROTTO, + RR_HF_TEKTITE_GROTTO, + RR_LAKE_HYLIA, + RR_LH_FISHING_ISLAND, + RR_LH_OWL_FLIGHT, + RR_LH_LAB, + RR_LH_FISHING_HOLE, + RR_LH_GROTTO, + RR_GERUDO_VALLEY, + RR_GV_UPPER_STREAM, + RR_GV_LOWER_STREAM, + RR_GV_GROTTO_LEDGE, + RR_GV_CRATE_LEDGE, + RR_GV_OCTOROK_GROTTO, + RR_GV_FORTRESS_SIDE, + RR_GV_CARPENTER_TENT, + RR_GV_STORMS_GROTTO, + RR_GERUDO_FORTRESS, + RR_GF_OUTSIDE_GATE, + RR_GF_STORMS_GROTTO, + RR_WASTELAND_NEAR_FORTRESS, + RR_HAUNTED_WASTELAND, + RR_WASTELAND_NEAR_COLOSSUS, + RR_DESERT_COLOSSUS, + RR_DESERT_COLOSSUS_FROM_SPIRIT_ENTRYWAY, + RR_COLOSSUS_GREAT_FAIRY_FOUNTAIN, + RR_COLOSSUS_GROTTO, + RR_MARKET_ENTRANCE, + RR_THE_MARKET, + RR_MARKET_GUARD_HOUSE, + RR_MARKET_BAZAAR, + RR_MARKET_MASK_SHOP, + RR_MARKET_SHOOTING_GALLERY, + RR_MARKET_BOMBCHU_BOWLING, + RR_MARKET_TREASURE_CHEST_GAME, + RR_MARKET_POTION_SHOP, + RR_MARKET_BACK_ALLEY, + RR_MARKET_BOMBCHU_SHOP, + RR_MARKET_DOG_LADY_HOUSE, + RR_MARKET_MAN_IN_GREEN_HOUSE, + RR_TOT_ENTRANCE, + RR_TEMPLE_OF_TIME, + RR_TOT_BEYOND_DOOR_OF_TIME, + RR_CASTLE_GROUNDS, + RR_CASTLE_GROUNDS_FROM_GANONS_CASTLE, + RR_HYRULE_CASTLE_GROUNDS, + RR_HC_GARDEN, + RR_HC_GREAT_FAIRY_FOUNTAIN, + RR_HC_STORMS_GROTTO, + RR_GANONS_CASTLE_GROUNDS, + RR_OGC_GREAT_FAIRY_FOUNTAIN, + RR_GANONS_CASTLE_LEDGE, + RR_KAKARIKO_VILLAGE, + RR_KAK_CARPENTER_BOSS_HOUSE, + RR_KAK_HOUSE_OF_SKULLTULA, + RR_KAK_IMPAS_HOUSE, + RR_KAK_IMPAS_LEDGE, + RR_KAK_IMPAS_HOUSE_BACK, + RR_KAK_IMPAS_HOUSE_NEAR_COW, + RR_KAK_WINDMILL, + RR_KAK_BAZAAR, + RR_KAK_SHOOTING_GALLERY, + RR_KAK_POTION_SHOP_FRONT, + RR_KAK_POTION_SHOP_BACK, + RR_KAK_ROOFTOP, + RR_KAK_IMPAS_ROOFTOP, + RR_KAK_BEHIND_GATE, + RR_KAK_BACKYARD, + RR_KAK_ODD_POTION_BUILDING, + RR_KAK_REDEAD_GROTTO, + RR_KAK_OPEN_GROTTO, + RR_THE_GRAVEYARD, + RR_GRAVEYARD_DAMPES_GRAVE, + RR_GRAVEYARD_DAMPES_HOUSE, + RR_GRAVEYARD_SHIELD_GRAVE, + RR_GRAVEYARD_COMPOSERS_GRAVE, + RR_GRAVEYARD_HEART_PIECE_GRAVE, + RR_GRAVEYARD_WARP_PAD_REGION, + RR_DEATH_MOUNTAIN_TRAIL, + RR_DEATH_MOUNTAIN_SUMMIT, + RR_DMT_OWL_FLIGHT, + RR_DMT_GREAT_FAIRY_FOUNTAIN, + RR_DMT_COW_GROTTO, + RR_DMT_STORMS_GROTTO, + RR_GORON_CITY, + RR_GC_WOODS_WARP, + RR_GC_DARUNIAS_CHAMBER, + RR_GC_GROTTO_PLATFORM, + RR_GC_SHOP, + RR_GC_GROTTO, + RR_DMC_UPPER_LOCAL, + RR_DMC_CENTRAL_LOCAL, + RR_DMC_LOWER_LOCAL, + RR_DMC_LOWER_NEARBY, + RR_DMC_UPPER_NEARBY, + RR_DMC_CENTRAL_NEARBY, + RR_DMC_LADDER_AREA_NEARBY, + RR_DMC_UPPER_GROTTO, + RR_DMC_HAMMER_GROTTO, + RR_DMC_GREAT_FAIRY_FOUNTAIN, + RR_ZR_FRONT, + RR_ZORAS_RIVER, + RR_ZR_BEHIND_WATERFALL, + RR_ZR_OPEN_GROTTO, + RR_ZR_FAIRY_GROTTO, + RR_ZR_STORMS_GROTTO, + RR_ZORAS_DOMAIN, + RR_ZD_BEHIND_KING_ZORA, + RR_ZD_SHOP, + RR_ZD_STORMS_GROTTO, + RR_ZORAS_FOUNTAIN, + RR_ZF_GREAT_FAIRY_FOUNTAIN, + RR_LON_LON_RANCH, + RR_LLR_TALONS_HOUSE, + RR_LLR_STABLES, + RR_LLR_TOWER, + RR_LLR_GROTTO, + + RR_DEKU_TREE_ENTRYWAY, + RR_DODONGOS_CAVERN_ENTRYWAY, + RR_JABU_JABUS_BELLY_ENTRYWAY, + RR_FOREST_TEMPLE_ENTRYWAY, + RR_FIRE_TEMPLE_ENTRYWAY, + RR_WATER_TEMPLE_ENTRYWAY, + RR_SPIRIT_TEMPLE_ENTRYWAY, + RR_SHADOW_TEMPLE_ENTRYWAY, + RR_BOTTOM_OF_THE_WELL_ENTRYWAY, + RR_ICE_CAVERN_ENTRYWAY, + RR_GERUDO_TRAINING_GROUNDS_ENTRYWAY, + RR_GANONS_CASTLE_ENTRYWAY, + + RR_DEKU_TREE_LOBBY, + RR_DEKU_TREE_2F_MIDDLE_ROOM, + RR_DEKU_TREE_SLINGSHOT_ROOM, + RR_DEKU_TREE_COMPASS_ROOM, + RR_DEKU_TREE_BASEMENT_LOWER, + RR_DEKU_TREE_BASEMENT_SCRUB_ROOM, + RR_DEKU_TREE_BASEMENT_WATER_ROOM, + RR_DEKU_TREE_BASEMENT_TORCH_ROOM, + RR_DEKU_TREE_BASEMENT_BACK_LOBBY, + RR_DEKU_TREE_BASEMENT_BACK_ROOM, + RR_DEKU_TREE_BASEMENT_UPPER, + RR_DEKU_TREE_OUTSIDE_BOSS_ROOM, + + RR_DEKU_TREE_MQ_LOBBY, + RR_DEKU_TREE_MQ_COMPASS_ROOM, + RR_DEKU_TREE_MQ_BASEMENT_WATER_ROOM_FRONT, + RR_DEKU_TREE_MQ_BASEMENT_WATER_ROOM_BACK, + RR_DEKU_TREE_MQ_BASEMENT_BACK_ROOM, + RR_DEKU_TREE_MQ_BASEMENT_LEDGE, + RR_DEKU_TREE_MQ_OUTSIDE_BOSS_ROOM, + + RR_DEKU_TREE_BOSS_ENTRYWAY, + RR_DEKU_TREE_BOSS_ROOM, + + RR_DODONGOS_CAVERN_BEGINNING, + RR_DODONGOS_CAVERN_LOBBY, + RR_DODONGOS_CAVERN_LOBBY_SWITCH, + RR_DODONGOS_CAVERN_SE_CORRIDOR, + RR_DODONGOS_CAVERN_SE_ROOM, + RR_DODONGOS_CAVERN_NEAR_LOWER_LIZALFOS, + RR_DODONGOS_CAVERN_LOWER_LIZALFOS, + RR_DODONGOS_CAVERN_DODONGO_ROOM, + RR_DODONGOS_CAVERN_NEAR_DODONGO_ROOM, + RR_DODONGOS_CAVERN_STAIRS_LOWER, + RR_DODONGOS_CAVERN_STAIRS_UPPER, + RR_DODONGOS_CAVERN_COMPASS_ROOM, + RR_DODONGOS_CAVERN_ARMOS_ROOM, + RR_DODONGOS_CAVERN_BOMB_ROOM_LOWER, + RR_DODONGOS_CAVERN_2F_SIDE_ROOM, + RR_DODONGOS_CAVERN_FIRST_SLINGSHOT_ROOM, + RR_DODONGOS_CAVERN_UPPER_LIZALFOS, + RR_DODONGOS_CAVERN_SECOND_SLINGSHOT_ROOM, + RR_DODONGOS_CAVERN_BOMB_ROOM_UPPER, + RR_DODONGOS_CAVERN_FAR_BRIDGE, + RR_DODONGOS_CAVERN_BOSS_AREA, + RR_DODONGOS_CAVERN_BACK_ROOM, + + RR_DODONGOS_CAVERN_MQ_BEGINNING, + RR_DODONGOS_CAVERN_MQ_LOBBY, + RR_DODONGOS_CAVERN_MQ_LOWER_RIGHT_SIDE, + RR_DODONGOS_CAVERN_MQ_BOMB_BAG_AREA, + RR_DODONGOS_CAVERN_MQ_BOSS_AREA, + + RR_DODONGOS_CAVERN_BOSS_ENTRYWAY, + RR_DODONGOS_CAVERN_BOSS_ROOM, + + RR_JABU_JABUS_BELLY_BEGINNING, + RR_JABU_JABUS_BELLY_LIFT_MIDDLE, + RR_JABU_JABUS_BELLY_MAIN_UPPER, + RR_JABU_JABUS_BELLY_MAIN_LOWER, + RR_JABU_JABUS_BELLY_SHABOMB_CORRIDOR, + RR_JABU_JABUS_BELLY_LOWER_SIDE_ROOM, + RR_JABU_JABUS_BELLY_LIFT_LOWER, + RR_JABU_JABUS_BELLY_FORKED_CORRIDOR, + RR_JABU_JABUS_BELLY_BOOMERANG_ROOM, + RR_JABU_JABUS_BELLY_MAP_ROOM, + RR_JABU_JABUS_BELLY_COMPASS_ROOM, + RR_JABU_JABUS_BELLY_BLUE_TENTACLE, + RR_JABU_JABUS_BELLY_GREEN_TENTACLE, + RR_JABU_JABUS_BELLY_BIGOCTO_ROOM, + RR_JABU_JABUS_BELLY_ABOVE_BIGOCTO, + RR_JABU_JABUS_BELLY_LIFT_UPPER, + RR_JABU_JABUS_BELLY_NEAR_BOSS_ROOM, + + RR_JABU_JABUS_BELLY_MQ_BEGINNING, + RR_JABU_JABUS_BELLY_MQ_MAIN, + RR_JABU_JABUS_BELLY_MQ_DEPTHS, + RR_JABU_JABUS_BELLY_MQ_BOSS_AREA, + + RR_JABU_JABUS_BELLY_BOSS_ENTRYWAY, + RR_JABU_JABUS_BELLY_BOSS_ROOM, + + RR_FOREST_TEMPLE_FIRST_ROOM, + RR_FOREST_TEMPLE_SOUTH_CORRIDOR, + RR_FOREST_TEMPLE_LOBBY, + RR_FOREST_TEMPLE_NORTH_CORRIDOR, + RR_FOREST_TEMPLE_LOWER_STALFOS, + RR_FOREST_TEMPLE_NW_OUTDOORS_LOWER, + RR_FOREST_TEMPLE_NW_OUTDOORS_UPPER, + RR_FOREST_TEMPLE_NE_OUTDOORS_LOWER, + RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER, + RR_FOREST_TEMPLE_MAP_ROOM, + RR_FOREST_TEMPLE_SEWER, + RR_FOREST_TEMPLE_BELOW_BOSS_KEY_CHEST, + RR_FOREST_TEMPLE_FLOORMASTER_ROOM, + RR_FOREST_TEMPLE_WEST_CORRIDOR, + RR_FOREST_TEMPLE_BLOCK_PUSH_ROOM, + RR_FOREST_TEMPLE_NW_CORRIDOR_TWISTED, + RR_FOREST_TEMPLE_NW_CORRIDOR_STRAIGHTENED, + RR_FOREST_TEMPLE_RED_POE_ROOM, + RR_FOREST_TEMPLE_UPPER_STALFOS, + RR_FOREST_TEMPLE_BLUE_POE_ROOM, + RR_FOREST_TEMPLE_NE_CORRIDOR_STRAIGHTENED, + RR_FOREST_TEMPLE_NE_CORRIDOR_TWISTED, + RR_FOREST_TEMPLE_FROZEN_EYE_ROOM, + RR_FOREST_TEMPLE_FALLING_ROOM, + RR_FOREST_TEMPLE_GREEN_POE_ROOM, + RR_FOREST_TEMPLE_EAST_CORRIDOR, + RR_FOREST_TEMPLE_BOSS_REGION, + + RR_FOREST_TEMPLE_MQ_LOBBY, + RR_FOREST_TEMPLE_MQ_CENTRAL_AREA, + RR_FOREST_TEMPLE_MQ_AFTER_BLOCK_PUZZLE, + RR_FOREST_TEMPLE_MQ_OUTDOOR_LEDGE, + RR_FOREST_TEMPLE_MQ_NW_OUTDOORS, + RR_FOREST_TEMPLE_MQ_NE_OUTDOORS, + RR_FOREST_TEMPLE_MQ_OUTDOORS_TOP_LEDGES, + RR_FOREST_TEMPLE_MQ_NE_OUTDOORS_LEDGE, + RR_FOREST_TEMPLE_MQ_BOW_REGION, + RR_FOREST_TEMPLE_MQ_FALLING_ROOM, + RR_FOREST_TEMPLE_MQ_BOSS_REGION, + + RR_FOREST_TEMPLE_BOSS_ENTRYWAY, + RR_FOREST_TEMPLE_BOSS_ROOM, + + RR_FIRE_TEMPLE_FIRST_ROOM, + RR_FIRE_TEMPLE_NEAR_BOSS_ROOM, + RR_FIRE_TEMPLE_LOOP_ENEMIES, + RR_FIRE_TEMPLE_LOOP_TILES, + RR_FIRE_TEMPLE_LOOP_FLARE_DANCER, + RR_FIRE_TEMPLE_LOOP_HAMMER_SWITCH, + RR_FIRE_TEMPLE_LOOP_GORON_ROOM, + RR_FIRE_TEMPLE_LOOP_EXIT, + RR_FIRE_TEMPLE_BIG_LAVA_ROOM, + RR_FIRE_TEMPLE_BIG_LAVA_ROOM_NORTH_GORON, + RR_FIRE_TEMPLE_BIG_LAVA_ROOM_NORTH_TILES, + RR_FIRE_TEMPLE_BIG_LAVA_ROOM_SOUTH_GORON, + RR_FIRE_TEMPLE_FIRE_PILLAR_ROOM, + RR_FIRE_TEMPLE_SHORTCUT_ROOM, + RR_FIRE_TEMPLE_SHORTCUT_CLIMB, + RR_FIRE_TEMPLE_BOULDER_MAZE_LOWER, + RR_FIRE_TEMPLE_BOULDER_MAZE_LOWER_SIDE_ROOM, + RR_FIRE_TEMPLE_EAST_CENTRAL_ROOM, + RR_FIRE_TEMPLE_FIRE_WALL_CHASE, + RR_FIRE_TEMPLE_MAP_AREA, + RR_FIRE_TEMPLE_BOULDER_MAZE_UPPER, + RR_FIRE_TEMPLE_SCARECROW_ROOM, + RR_FIRE_TEMPLE_EAST_PEAK, + RR_FIRE_TEMPLE_CORRIDOR, + RR_FIRE_TEMPLE_FIRE_MAZE_ROOM, + RR_FIRE_TEMPLE_FIRE_MAZE_UPPER, + RR_FIRE_TEMPLE_FIRE_MAZE_SIDE_ROOM, + RR_FIRE_TEMPLE_WEST_CENTRAL_LOWER, + RR_FIRE_TEMPLE_WEST_CENTRAL_UPPER, + RR_FIRE_TEMPLE_LATE_FIRE_MAZE, + RR_FIRE_TEMPLE_UPPER_FLARE_DANCER, + RR_FIRE_TEMPLE_WEST_CLIMB, + RR_FIRE_TEMPLE_WEST_PEAK, + RR_FIRE_TEMPLE_HAMMER_RETURN_PATH, + RR_FIRE_TEMPLE_ABOVE_FIRE_MAZE, + + RR_FIRE_TEMPLE_MQ_LOWER, + RR_FIRE_TEMPLE_MQ_LOWER_LOCKED_DOOR, + RR_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM, + RR_FIRE_TEMPLE_MQ_LOWER_MAZE, + RR_FIRE_TEMPLE_MQ_UPPER_MAZE, + RR_FIRE_TEMPLE_MQ_UPPER, + + RR_FIRE_TEMPLE_BOSS_ENTRYWAY, + RR_FIRE_TEMPLE_BOSS_ROOM, + + RR_WATER_TEMPLE_LOBBY, + RR_WATER_TEMPLE_EAST_LOWER, + RR_WATER_TEMPLE_MAP_ROOM, + RR_WATER_TEMPLE_CRACKED_WALL, + RR_WATER_TEMPLE_TORCH_ROOM, + RR_WATER_TEMPLE_NORTH_LOWER, + RR_WATER_TEMPLE_BOULDERS_LOWER, + RR_WATER_TEMPLE_BLOCK_ROOM, + RR_WATER_TEMPLE_JETS_ROOM, + RR_WATER_TEMPLE_BOULDERS_UPPER, + RR_WATER_TEMPLE_BOSS_KEY_ROOM, + RR_WATER_TEMPLE_SOUTH_LOWER, + RR_WATER_TEMPLE_WEST_LOWER, + RR_WATER_TEMPLE_DRAGON_ROOM, + RR_WATER_TEMPLE_CENTRAL_PILLAR_LOWER, + RR_WATER_TEMPLE_CENTRAL_PILLAR_UPPER, + RR_WATER_TEMPLE_CENTRAL_PILLAR_BASEMENT, + RR_WATER_TEMPLE_EAST_MIDDLE, + RR_WATER_TEMPLE_WEST_MIDDLE, + RR_WATER_TEMPLE_HIGH_WATER, + RR_WATER_TEMPLE_BLOCK_CORRIDOR, + RR_WATER_TEMPLE_FALLING_PLATFORM_ROOM, + RR_WATER_TEMPLE_DRAGON_PILLARS_ROOM, + RR_WATER_TEMPLE_DARK_LINK_ROOM, + RR_WATER_TEMPLE_LONGSHOT_ROOM, + RR_WATER_TEMPLE_RIVER, + RR_WATER_TEMPLE_PRE_BOSS_ROOM, + + RR_WATER_TEMPLE_MQ_LOBBY, + RR_WATER_TEMPLE_MQ_DIVE, + RR_WATER_TEMPLE_MQ_LOWERED_WATER_LEVELS, + RR_WATER_TEMPLE_MQ_DARK_LINK_REGION, + RR_WATER_TEMPLE_MQ_BASEMENT_GATED_AREAS, + + RR_WATER_TEMPLE_BOSS_ENTRYWAY, + RR_WATER_TEMPLE_BOSS_ROOM, + + RR_SPIRIT_TEMPLE_LOBBY, + RR_SPIRIT_TEMPLE_CHILD, + RR_SPIRIT_TEMPLE_CHILD_CLIMB, + RR_SPIRIT_TEMPLE_EARLY_ADULT, + RR_SPIRIT_TEMPLE_CENTRAL_CHAMBER, + RR_SPIRIT_TEMPLE_OUTDOOR_HANDS, + RR_SPIRIT_TEMPLE_BEYOND_CENTRAL_LOCKED_DOOR, + RR_SPIRIT_TEMPLE_BEYOND_FINAL_LOCKED_DOOR, + RR_SPIRIT_TEMPLE_INSIDE_STATUE_HEAD, + + RR_SPIRIT_TEMPLE_MQ_LOBBY, + RR_SPIRIT_TEMPLE_MQ_CHILD, + RR_SPIRIT_TEMPLE_MQ_ADULT, + RR_SPIRIT_TEMPLE_MQ_SHARED, + RR_SPIRIT_TEMPLE_MQ_LOWER_ADULT, + RR_SPIRIT_TEMPLE_MQ_BOSS_AREA, + RR_SPIRIT_TEMPLE_MQ_MIRROR_SHIELD_HAND, + RR_SPIRIT_TEMPLE_MQ_SILVER_GAUNTLETS_HAND, + RR_SPIRIT_TEMPLE_MQ_INSIDE_STATUE_HEAD, + + RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY, + RR_SPIRIT_TEMPLE_BOSS_ROOM, + + RR_SHADOW_TEMPLE_BEGINNING, + RR_SHADOW_TEMPLE_FIRST_BEAMOS, + RR_SHADOW_TEMPLE_HUGE_PIT, + RR_SHADOW_TEMPLE_WIND_TUNNEL, + RR_SHADOW_TEMPLE_BEYOND_BOAT, + + RR_SHADOW_TEMPLE_MQ_ENTRYWAY, + RR_SHADOW_TEMPLE_MQ_BEGINNING, + RR_SHADOW_TEMPLE_MQ_DEAD_HAND_AREA, + RR_SHADOW_TEMPLE_MQ_FIRST_BEAMOS, + RR_SHADOW_TEMPLE_MQ_UPPER_HUGE_PIT, + RR_SHADOW_TEMPLE_MQ_LOWER_HUGE_PIT, + RR_SHADOW_TEMPLE_MQ_WIND_TUNNEL, + RR_SHADOW_TEMPLE_MQ_BEYOND_BOAT, + RR_SHADOW_TEMPLE_MQ_INVISIBLE_MAZE, + + RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, + RR_SHADOW_TEMPLE_BOSS_ROOM, + + RR_BOTTOM_OF_THE_WELL_MAIN_AREA, + + RR_BOTTOM_OF_THE_WELL_MQ_PERIMETER, + RR_BOTTOM_OF_THE_WELL_MQ_MIDDLE, + + RR_ICE_CAVERN_BEGINNING, + RR_ICE_CAVERN_MAIN, + + RR_ICE_CAVERN_MQ_BEGINNING, + RR_ICE_CAVERN_MQ_MAP_ROOM, + RR_ICE_CAVERN_MQ_IRON_BOOTS_REGION, + RR_ICE_CAVERN_MQ_COMPASS_ROOM, + + RR_GERUDO_TRAINING_GROUNDS_LOBBY, + RR_GERUDO_TRAINING_GROUNDS_CENTRAL_MAZE, + RR_GERUDO_TRAINING_GROUNDS_CENTRAL_MAZE_RIGHT, + RR_GERUDO_TRAINING_GROUNDS_LAVA_ROOM, + RR_GERUDO_TRAINING_GROUNDS_HAMMER_ROOM, + RR_GERUDO_TRAINING_GROUNDS_EYE_STATUE_LOWER, + RR_GERUDO_TRAINING_GROUNDS_EYE_STATUE_UPPER, + RR_GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_ROOM, + RR_GERUDO_TRAINING_GROUNDS_LIKE_LIKE_ROOM, + + RR_GERUDO_TRAINING_GROUNDS_MQ_LOBBY, + RR_GERUDO_TRAINING_GROUNDS_MQ_RIGHT_SIDE, + RR_GERUDO_TRAINING_GROUNDS_MQ_UNDERWATER, + RR_GERUDO_TRAINING_GROUNDS_MQ_LEFT_SIDE, + RR_GERUDO_TRAINING_GROUNDS_MQ_STALFOS_ROOM, + RR_GERUDO_TRAINING_GROUNDS_MQ_BACK_AREAS, + RR_GERUDO_TRAINING_GROUNDS_MQ_CENTRAL_MAZE_RIGHT, + + RR_GANONS_CASTLE_LOBBY, + RR_GANONS_CASTLE_DEKU_SCRUBS, + RR_GANONS_CASTLE_FOREST_TRIAL, + RR_GANONS_CASTLE_FIRE_TRIAL, + RR_GANONS_CASTLE_WATER_TRIAL, + RR_GANONS_CASTLE_SHADOW_TRIAL, + RR_GANONS_CASTLE_SPIRIT_TRIAL, + RR_GANONS_CASTLE_LIGHT_TRIAL, + RR_GANONS_CASTLE_TOWER, + + RR_GANONS_CASTLE_MQ_LOBBY, + RR_GANONS_CASTLE_MQ_DEKU_SCRUBS, + RR_GANONS_CASTLE_MQ_FOREST_TRIAL, + RR_GANONS_CASTLE_MQ_FIRE_TRIAL, + RR_GANONS_CASTLE_MQ_WATER_TRIAL, + RR_GANONS_CASTLE_MQ_SHADOW_TRIAL, + RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL, + RR_GANONS_CASTLE_MQ_LIGHT_TRIAL, + + RR_MARKER_AREAS_END, // Used for area key count + + // DUNGEONS + RR_DEKU_TREE, + RR_DODONGOS_CAVERN, + RR_JABU_JABUS_BELLY, + RR_FOREST_TEMPLE, + RR_FIRE_TEMPLE, + RR_WATER_TEMPLE, + RR_SPIRIT_TEMPLE, + RR_SHADOW_TEMPLE, + RR_BOTTOM_OF_THE_WELL, + RR_ICE_CAVERN, + RR_GERUDO_TRAINING_GROUNDS, + RR_GANONS_CASTLE, + RR_MAX, +} RandomizerRegion; + typedef enum { RC_UNKNOWN_CHECK, RC_LINKS_POCKET, @@ -1123,6 +1614,7 @@ typedef enum { typedef enum { RG_NONE, RG_KOKIRI_SWORD, + RG_MASTER_SWORD, RG_GIANTS_KNIFE, RG_BIGGORON_SWORD, RG_DEKU_SHIELD, @@ -1316,9 +1808,1395 @@ typedef enum { RG_TRIFORCE_PIECE, RG_HINT, RG_TYCOON_WALLET, + RG_FAIRY_OCARINA, + RG_OCARINA_OF_TIME, + RG_BOMB_BAG, + RG_BIG_BOMB_BAG, + RG_BIGGEST_BOMB_BAG, + RG_FAIRY_BOW, + RG_BIG_QUIVER, + RG_BIGGEST_QUIVER, + RG_FAIRY_SLINGSHOT, + RG_BIG_BULLET_BAG, + RG_BIGGEST_BULLET_BAG, + RG_GORONS_BRACELET, + RG_SILVER_GAUNTLETS, + RG_GOLDEN_GAUNTLETS, + RG_SILVER_SCALE, + RG_GOLDEN_SCALE, + RG_ADULT_WALLET, + RG_GIANT_WALLET, + RG_DEKU_NUT_CAPACITY_30, + RG_DEKU_NUT_CAPACITY_40, + RG_DEKU_STICK_CAPACITY_20, + RG_DEKU_STICK_CAPACITY_30, + RG_HOOKSHOT, + RG_LONGSHOT, + RG_SCARECROW, + // Logic Only + RG_DISTANT_SCARECROW, + RG_STICKS, RG_MAX } RandomizerGet; +typedef enum { + RH_NONE, + RH_DMC_GOSSIP_STONE, + RH_DMT_GOSSIP_STONE, + RH_COLOSSUS_GOSSIP_STONE, + RH_DODONGOS_CAVERN_GOSSIP_STONE, + RH_GV_GOSSIP_STONE, + RH_GC_MAZE_GOSSIP_STONE, + RH_GC_MEDIGORON_GOSSIP_STONE, + RH_GRAVEYARD_GOSSIP_STONE, + RH_HC_MALON_GOSSIP_STONE, + RH_HC_ROCK_WALL_GOSSIP_STONE, + RH_HC_STORMS_GROTTO_GOSSIP_STONE, + RH_KF_DEKU_TREE_GOSSIP_STONE_LEFT, + RH_KF_DEKU_TREE_GOSSIP_STONE_RIGHT, + RH_KF_GOSSIP_STONE, + RH_LH_LAB_GOSSIP_STONE, + RH_LH_GOSSIP_STONE_SOUTHEAST, + RH_LH_GOSSIP_STONE_SOUTHWEST, + RH_LW_GOSSIP_STONE, + RH_SFM_MAZE_GOSSIP_STONE_LOWER, + RH_SFM_MAZE_GOSSIP_STONE_UPPER, + RH_SFM_SARIA_GOSSIP_STONE, + RH_TOT_GOSSIP_STONE_LEFT, + RH_TOT_GOSSIP_STONE_RIGHT, + RH_TOT_GOSSIP_STONE_RIGHT_CENTER, + RH_TOT_GOSSIP_STONE_LEFT_CENTER, + RH_ZD_GOSSIP_STONE, + RH_ZF_FAIRY_GOSSIP_STONE, + RH_ZF_JABU_GOSSIP_STONE, + RH_ZR_NEAR_GROTTOS_GOSSIP_STONE, + RH_ZR_NEAR_DOMAIN_GOSSIP_STONE, + RH_HF_COW_GROTTO_GOSSIP_STONE, + RH_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE, + RH_HF_SOUTHEAST_GROTTO_GOSSIP_STONE, + RH_HF_OPEN_GROTTO_GOSSIP_STONE, + RH_KAK_OPEN_GROTTO_GOSSIP_STONE, + RH_ZR_OPEN_GROTTO_GOSSIP_STONE, + RH_KF_STORMS_GROTTO_GOSSIP_STONE, + RH_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE, + RH_DMT_STORMS_GROTTO_GOSSIP_STONE, + RH_DMC_UPPER_GROTTO_GOSSIP_STONE, + RH_GANONDORF_HINT, + RH_DAMPES_DIARY, + RH_GREG_RUPEE, + RH_MEDIGORON, + RH_GRANNYS_SHOP, + RH_WASTELAND_BOMBCHU_SALESMAN, + RH_ALTAR_CHILD, + RH_ALTAR_ADULT, + RH_MAX, +} RandomizerHintKey; + +typedef enum { + RHT_NONE, + RHT_PREFIX, + RHT_WAY_OF_THE_HERO, + RHT_PLUNDERING, + RHT_FOOLISH, + RHT_CAN_BE_FOUND_AT, + RHT_HOARDS, + // Junk + RHT_JUNK02, + RHT_JUNK03, + RHT_JUNK04, + RHT_JUNK05, + RHT_JUNK06, + RHT_JUNK07, + RHT_JUNK08, + RHT_JUNK09, + RHT_JUNK10, + RHT_JUNK11, + RHT_JUNK12, + RHT_JUNK13, + RHT_JUNK14, + RHT_JUNK15, + RHT_JUNK16, + RHT_JUNK17, + RHT_JUNK18, + RHT_JUNK19, + RHT_JUNK20, + RHT_JUNK21, + RHT_JUNK22, + RHT_JUNK23, + RHT_JUNK24, + RHT_JUNK25, + RHT_JUNK26, + RHT_JUNK27, + RHT_JUNK28, + RHT_JUNK29, + RHT_JUNK30, + RHT_JUNK31, + RHT_JUNK32, + RHT_JUNK33, + RHT_JUNK34, + RHT_JUNK35, + RHT_JUNK36, + RHT_JUNK37, + RHT_JUNK38, + RHT_JUNK39, + RHT_JUNK40, + RHT_JUNK41, + RHT_JUNK42, + RHT_JUNK43, + RHT_JUNK44, + RHT_JUNK45, + RHT_JUNK46, + RHT_JUNK47, + RHT_JUNK48, + RHT_JUNK49, + RHT_JUNK50, + RHT_JUNK51, + RHT_JUNK52, + RHT_JUNK53, + RHT_JUNK54, + RHT_JUNK55, + RHT_JUNK56, + RHT_JUNK57, + RHT_JUNK58, + RHT_JUNK59, + RHT_JUNK60, + RHT_JUNK61, + RHT_JUNK62, + RHT_JUNK63, + RHT_JUNK64, + RHT_JUNK65, + RHT_JUNK66, + RHT_JUNK67, + RHT_JUNK68, + RHT_JUNK69, + RHT_JUNK70, + RHT_JUNK71, + RHT_JUNK72, + RHT_JUNK73, + RHT_JUNK74, + RHT_JUNK75, + RHT_JUNK76, + RHT_JUNK77, + RHT_JUNK78, + RHT_JUNK79, + RHT_JUNK80, + RHT_JUNK81, + RHT_JUNK_WTC_1, + RHT_JUNK_WTC_2, + RHT_JUNK_WTC_3, + RHT_JUNK_WTC_4, + RHT_JUNK_WTC_5, + RHT_JUNK_WTC_6, + RHT_JUNK_WTC_7, + RHT_JUNK_WTC_8, + RHT_JUNK_WTC_9, + RHT_JUNK_WTC_10, + RHT_JUNK_WTC_11, + RHT_JUNK_WTC_12, + RHT_JUNK_SEI_1, + RHT_JUNK_SEI_2, + RHT_JUNK_SEI_3, + RHT_JUNK_SEI_4, + RHT_JUNK_SEI_5, + RHT_JUNK_SEI_6, + RHT_JUNK_SEI_7, + RHT_JUNK_SEI_8, + RHT_JUNK_SEI_9, + RHT_JUNK_SEI_10, + RHT_JUNK_SEI_11, + RHT_JUNK_SEI_12, + RHT_JUNK_SEI_13, + RHT_JUNK_SEI_14, + RHT_JUNK_SEI_15, + RHT_JUNK_SEI_16, + RHT_JUNK_SEI_17, + RHT_JUNK_SEI_18, + RHT_JUNK_SEI_19, + RHT_JUNK_SEI_20, + RHT_JUNK_SEI_21, + RHT_JUNK_SEI_22, + RHT_JUNK_SEI_23, + RHT_JUNK_SEI_24, + RHT_JUNK_SEI_25, + RHT_JUNK_SEI_26, + RHT_JUNK_SEI_27, + RHT_JUNK_SEI_28, + RHT_JUNK_SEI_29, + RHT_JUNK_OTR_MEANS_1, + RHT_JUNK_OTR_MEANS_2, + RHT_JUNK_OTR_MEANS_3, + RHT_JUNK_OTR_MEANS_4, + RHT_JUNK_OTR_MEANS_5, + RHT_JUNK_OTR_MEANS_6, + RHT_JUNK_OTR_MEANS_7, + RHT_JUNK_OTR_MEANS_8, + RHT_JUNK_OTR_MEANS_9, + RHT_JUNK_OTR_MEANS_10, + RHT_JUNK_OTR_MEANS_11, + RHT_JUNK_OTR_MEANS_12, + RHT_JUNK_OTR_MEANS_13, + RHT_JUNK_OTR_MEANS_14, + RHT_JUNK_OTR_MEANS_15, + RHT_JUNK_OTR_MEANS_16, + RHT_JUNK_OTR_MEANS_17, + RHT_JUNK_OTR_MEANS_18, + RHT_JUNK_OTR_MEANS_19, + RHT_JUNK_OTR_MEANS_20, + RHT_JUNK_OTR_MEANS_21, + RHT_JUNK_OTR_MEANS_22, + RHT_JUNK_OTR_MEANS_23, + RHT_JUNK_OTR_MEANS_24, + RHT_JUNK_OTR_MEANS_25, + RHT_JUNK_OTR_MEANS_26, + RHT_JUNK_OTR_MEANS_27, + RHT_JUNK_OTR_MEANS_28, + RHT_JUNK_OTR_MEANS_29, + RHT_JUNK_OTR_MEANS_30, + RHT_JUNK_MISC_1, + RHT_JUNK_MISC_2, + RHT_JUNK_MISC_3, + RHT_JUNK_MISC_4, + RHT_JUNK_MISC_5, + RHT_JUNK_MISC_6, + RHT_JUNK_MISC_7, + RHT_JUNK_MISC_8, + RHT_JUNK_MISC_9, + RHT_JUNK_MISC_10, + RHT_JUNK_MISC_11, + RHT_JUNK_MISC_12, + RHT_JUNK_MISC_13, + RHT_JUNK_MISC_14, + RHT_JUNK_MISC_15, + RHT_JUNK_MISC_16, + RHT_JUNK_MISC_17, + RHT_JUNK_SG_1, + RHT_JUNK_SG_2, + RHT_JUNK_SG_3, + RHT_JUNK_SG_4, + RHT_JUNK_SG_5, + RHT_JUNK_SG_6, + RHT_JUNK_SG_7, + RHT_JUNK_SG_8, + // Locations + RHT_LINKS_POCKET, + RHT_QUEEN_GOHMA, + RHT_KING_DODONGO, + RHT_BARINADE, + RHT_PHANTOM_GANON, + RHT_VOLVAGIA, + RHT_MORPHA, + RHT_BONGO_BONGO, + RHT_TWINROVA, + RHT_SONG_FROM_IMPA, + RHT_SONG_FROM_MALON, + RHT_SONG_FROM_SARIA, + RHT_SONG_FROM_ROYAL_FAMILYS_TOMB, + RHT_SONG_FROM_OCARINA_OF_TIME, + RHT_SONG_FROM_WINDMILL, + RHT_SHEIK_IN_FOREST, + RHT_SHEIK_IN_CRATER, + RHT_SHEIK_IN_ICE_CAVERN, + RHT_SHEIK_AT_COLOSSUS, + RHT_SHEIK_IN_KAKARIKO, + RHT_SHEIK_AT_TEMPLE, + RHT_KF_MIDOS_TOP_LEFT_CHEST, + RHT_KF_MIDOS_TOP_RIGHT_CHEST, + RHT_KF_MIDOS_BOTTOM_LEFT_CHEST, + RHT_KF_MIDOS_BOTTOM_RIGHT_CHEST, + RHT_KF_KOKIRI_SWORD_CHEST, + RHT_KF_STORMS_GROTTO_CHEST, + RHT_KF_LINKS_HOUSE_COW, + RHT_KF_GS_KNOW_IT_ALL_HOUSE, + RHT_KF_GS_BEAN_PATCH, + RHT_KF_GS_HOUSE_OF_TWINS, + RHT_KF_SHOP_ITEM_1, + RHT_KF_SHOP_ITEM_2, + RHT_KF_SHOP_ITEM_3, + RHT_KF_SHOP_ITEM_4, + RHT_KF_SHOP_ITEM_5, + RHT_KF_SHOP_ITEM_6, + RHT_KF_SHOP_ITEM_7, + RHT_KF_SHOP_ITEM_8, + RHT_LW_GIFT_FROM_SARIA, + RHT_LW_OCARINA_MEMORY_GAME, + RHT_LW_TARGET_IN_WOODS, + RHT_LW_NEAR_SHORTCUTS_GROTTO_CHEST, + RHT_LW_TRADE_COJIRO, + RHT_DEKU_THEATER_SKULL_MASK, + RHT_DEKU_THEATER_MASK_OF_TRUTH, + RHT_LW_SKULL_KID, + RHT_LW_TRADE_ODD_POTION, + RHT_LW_DEKU_SCRUB_NEAR_BRIDGE, + RHT_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, + RHT_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, + RHT_LW_DEKU_SCRUB_GROTTO_FRONT, + RHT_LW_DEKU_SCRUB_GROTTO_REAR, + RHT_LW_GS_BEAN_PATCH_NEAR_BRIDGE, + RHT_LW_GS_BEAN_PATCH_NEAR_THEATER, + RHT_LW_GS_ABOVE_THEATER, + RHT_SFM_WOLFOS_GROTTO_CHEST, + RHT_SFM_DEKU_SCRUB_GROTTO_FRONT, + RHT_SFM_DEKU_SCRUB_GROTTO_REAR, + RHT_SFM_GS, + RHT_HF_OCARINA_OF_TIME_ITEM, + RHT_HF_NEAR_MARKET_GROTTO_CHEST, + RHT_HF_TEKTITE_GROTTO_FREESTANDING_POH, + RHT_HF_SOUTHEAST_GROTTO_CHEST, + RHT_HF_OPEN_GROTTO_CHEST, + RHT_HF_DEKU_SCRUB_GROTTO, + RHT_HF_COW_GROTTO_COW, + RHT_HF_GS_COW_GROTTO, + RHT_HF_GS_NEAR_KAK_GROTTO, + RHT_MARKET_SHOOTING_GALLERY_REWARD, + RHT_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, + RHT_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, + RHT_MARKET_BOMBCHU_BOWLING_BOMBCHUS, + RHT_MARKET_LOST_DOG, + RHT_MARKET_TREASURE_CHEST_GAME_REWARD, + RHT_MARKET_10_BIG_POES, + RHT_MARKET_TREASURE_CHEST_GAME_ITEM_1, + RHT_MARKET_TREASURE_CHEST_GAME_ITEM_2, + RHT_MARKET_TREASURE_CHEST_GAME_ITEM_3, + RHT_MARKET_TREASURE_CHEST_GAME_ITEM_4, + RHT_MARKET_TREASURE_CHEST_GAME_ITEM_5, + RHT_MARKET_GS_GUARD_HOUSE, + RHT_MARKET_BAZAAR_ITEM_1, + RHT_MARKET_BAZAAR_ITEM_2, + RHT_MARKET_BAZAAR_ITEM_3, + RHT_MARKET_BAZAAR_ITEM_4, + RHT_MARKET_BAZAAR_ITEM_5, + RHT_MARKET_BAZAAR_ITEM_6, + RHT_MARKET_BAZAAR_ITEM_7, + RHT_MARKET_BAZAAR_ITEM_8, + RHT_MARKET_POTION_SHOP_ITEM_1, + RHT_MARKET_POTION_SHOP_ITEM_2, + RHT_MARKET_POTION_SHOP_ITEM_3, + RHT_MARKET_POTION_SHOP_ITEM_4, + RHT_MARKET_POTION_SHOP_ITEM_5, + RHT_MARKET_POTION_SHOP_ITEM_6, + RHT_MARKET_POTION_SHOP_ITEM_7, + RHT_MARKET_POTION_SHOP_ITEM_8, + RHT_MARKET_BOMBCHU_SHOP_ITEM_1, + RHT_MARKET_BOMBCHU_SHOP_ITEM_2, + RHT_MARKET_BOMBCHU_SHOP_ITEM_3, + RHT_MARKET_BOMBCHU_SHOP_ITEM_4, + RHT_MARKET_BOMBCHU_SHOP_ITEM_5, + RHT_MARKET_BOMBCHU_SHOP_ITEM_6, + RHT_MARKET_BOMBCHU_SHOP_ITEM_7, + RHT_MARKET_BOMBCHU_SHOP_ITEM_8, + RHT_TOT_LIGHT_ARROWS_CUTSCENE, + RHT_HC_MALON_EGG, + RHT_HC_ZELDAS_LETTER, + RHT_HC_GREAT_FAIRY_REWARD, + RHT_HC_GS_TREE, + RHT_HC_GS_STORMS_GROTTO, + RHT_LLR_TALONS_CHICKENS, + RHT_LLR_FREESTANDING_POH, + RHT_LLR_DEKU_SCRUB_GROTTO_LEFT, + RHT_LLR_DEKU_SCRUB_GROTTO_CENTER, + RHT_LLR_DEKU_SCRUB_GROTTO_RIGHT, + RHT_LLR_STABLES_LEFT_COW, + RHT_LLR_STABLES_RIGHT_COW, + RHT_LLR_TOWER_LEFT_COW, + RHT_LLR_TOWER_RIGHT_COW, + RHT_LLR_GS_HOUSE_WINDOW, + RHT_LLR_GS_TREE, + RHT_LLR_GS_RAIN_SHED, + RHT_LLR_GS_BACK_WALL, + RHT_KAK_ANJU_AS_CHILD, + RHT_KAK_ANJU_AS_ADULT, + RHT_KAK_IMPAS_HOUSE_FREESTANDING_POH, + RHT_KAK_WINDMILL_FREESTANDING_POH, + RHT_KAK_MAN_ON_ROOF, + RHT_KAK_OPEN_GROTTO_CHEST, + RHT_KAK_REDEAD_GROTTO_CHEST, + RHT_KAK_SHOOTING_GALLERY_REWARD, + RHT_KAK_TRADE_ODD_MUSHROOM, + RHT_KAK_GRANNYS_SHOP, + RHT_KAK_TRADE_POCKET_CUCCO, + RHT_KAK_10_GOLD_SKULLTULA_REWARD, + RHT_KAK_20_GOLD_SKULLTULA_REWARD, + RHT_KAK_30_GOLD_SKULLTULA_REWARD, + RHT_KAK_40_GOLD_SKULLTULA_REWARD, + RHT_KAK_50_GOLD_SKULLTULA_REWARD, + RHT_KAK_100_GOLD_SKULLTULA_REWARD, + RHT_KAK_IMPAS_HOUSE_COW, + RHT_KAK_GS_TREE, + RHT_KAK_GS_GUARDS_HOUSE, + RHT_KAK_GS_WATCHTOWER, + RHT_KAK_GS_SKULLTULA_HOUSE, + RHT_KAK_GS_HOUSE_UNDER_CONSTRUCTION, + RHT_KAK_GS_ABOVE_IMPAS_HOUSE, + RHT_KAK_BAZAAR_ITEM_1, + RHT_KAK_BAZAAR_ITEM_2, + RHT_KAK_BAZAAR_ITEM_3, + RHT_KAK_BAZAAR_ITEM_4, + RHT_KAK_BAZAAR_ITEM_5, + RHT_KAK_BAZAAR_ITEM_6, + RHT_KAK_BAZAAR_ITEM_7, + RHT_KAK_BAZAAR_ITEM_8, + RHT_KAK_POTION_SHOP_ITEM_1, + RHT_KAK_POTION_SHOP_ITEM_2, + RHT_KAK_POTION_SHOP_ITEM_3, + RHT_KAK_POTION_SHOP_ITEM_4, + RHT_KAK_POTION_SHOP_ITEM_5, + RHT_KAK_POTION_SHOP_ITEM_6, + RHT_KAK_POTION_SHOP_ITEM_7, + RHT_KAK_POTION_SHOP_ITEM_8, + RHT_GRAVEYARD_SHIELD_GRAVE_CHEST, + RHT_GRAVEYARD_HEART_PIECE_GRAVE_CHEST, + RHT_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST, + RHT_GRAVEYARD_FREESTANDING_POH, + RHT_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, + RHT_GRAVEYARD_HOOKSHOT_CHEST, + RHT_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, + RHT_GRAVEYARD_GS_BEAN_PATCH, + RHT_GRAVEYARD_GS_WALL, + RHT_DMT_FREESTANDING_POH, + RHT_DMT_CHEST, + RHT_DMT_STORMS_GROTTO_CHEST, + RHT_DMT_TRADE_BROKEN_SWORD, + RHT_DMT_TRADE_EYEDROPS, + RHT_DMT_TRADE_CLAIM_CHECK, + RHT_DMT_GREAT_FAIRY_REWARD, + RHT_DMT_COW_GROTTO_COW, + RHT_DMT_GS_NEAR_KAK, + RHT_DMT_GS_BEAN_PATCH, + RHT_DMT_GS_ABOVE_DODONGOS_CAVERN, + RHT_DMT_GS_FALLING_ROCKS_PATH, + RHT_GC_DARUNIAS_JOY, + RHT_GC_POT_FREESTANDING_POH, + RHT_GC_ROLLING_GORON_AS_CHILD, + RHT_GC_ROLLING_GORON_AS_ADULT, + RHT_GC_MEDIGORON, + RHT_GC_MAZE_LEFT_CHEST, + RHT_GC_MAZE_RIGHT_CHEST, + RHT_GC_MAZE_CENTER_CHEST, + RHT_GC_DEKU_SCRUB_GROTTO_LEFT, + RHT_GC_DEKU_SCRUB_GROTTO_CENTER, + RHT_GC_DEKU_SCRUB_GROTTO_RIGHT, + RHT_GC_GS_CENTER_PLATFORM, + RHT_GC_GS_BOULDER_MAZE, + RHT_GC_SHOP_ITEM_1, + RHT_GC_SHOP_ITEM_2, + RHT_GC_SHOP_ITEM_3, + RHT_GC_SHOP_ITEM_4, + RHT_GC_SHOP_ITEM_5, + RHT_GC_SHOP_ITEM_6, + RHT_GC_SHOP_ITEM_7, + RHT_GC_SHOP_ITEM_8, + RHT_DMC_VOLCANO_FREESTANDING_POH, + RHT_DMC_WALL_FREESTANDING_POH, + RHT_DMC_UPPER_GROTTO_CHEST, + RHT_DMC_GREAT_FAIRY_REWARD, + RHT_DMC_DEKU_SCRUB, + RHT_DMC_DEKU_SCRUB_GROTTO_LEFT, + RHT_DMC_DEKU_SCRUB_GROTTO_CENTER, + RHT_DMC_DEKU_SCRUB_GROTTO_RIGHT, + RHT_DMC_GS_CRATE, + RHT_DMC_GS_BEAN_PATCH, + RHT_ZR_MAGIC_BEAN_SALESMAN, + RHT_ZR_OPEN_GROTTO_CHEST, + RHT_ZR_FROGS_ZELDAS_LULLABY, + RHT_ZR_FROGS_EPONAS_SONG, + RHT_ZR_FROGS_SARIAS_SONG, + RHT_ZR_FROGS_SUNS_SONG, + RHT_ZR_FROGS_SONG_OF_TIME, + RHT_ZR_FROGS_IN_THE_RAIN, + RHT_ZR_FROGS_OCARINA_GAME, + RHT_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, + RHT_ZR_NEAR_DOMAIN_FREESTANDING_POH, + RHT_ZR_DEKU_SCRUB_GROTTO_FRONT, + RHT_ZR_DEKU_SCRUB_GROTTO_REAR, + RHT_ZR_GS_TREE, + RHT_ZR_GS_LADDER, + RHT_ZR_GS_NEAR_RAISED_GROTTOS, + RHT_ZR_GS_ABOVE_BRIDGE, + RHT_ZD_DIVING_MINIGAME, + RHT_ZD_CHEST, + RHT_ZD_KING_ZORA_THAWED, + RHT_ZD_TRADE_PRESCRIPTION, + RHT_ZD_GS_FROZEN_WATERFALL, + RHT_ZD_SHOP_ITEM_1, + RHT_ZD_SHOP_ITEM_2, + RHT_ZD_SHOP_ITEM_3, + RHT_ZD_SHOP_ITEM_4, + RHT_ZD_SHOP_ITEM_5, + RHT_ZD_SHOP_ITEM_6, + RHT_ZD_SHOP_ITEM_7, + RHT_ZD_SHOP_ITEM_8, + RHT_ZF_GREAT_FAIRY_REWARD, + RHT_ZF_ICEBERG_FREESTANDING_POH, + RHT_ZF_BOTTOM_FREESTANDING_POH, + RHT_ZF_GS_ABOVE_THE_LOG, + RHT_ZF_GS_TREE, + RHT_ZF_GS_HIDDEN_CAVE, + RHT_LH_UNDERWATER_ITEM, + RHT_LH_CHILD_FISHING, + RHT_LH_ADULT_FISHING, + RHT_LH_LAB_DIVE, + RHT_LH_TRADE_FROG, + RHT_LH_FREESTANDING_POH, + RHT_LH_SUN, + RHT_LH_DEKU_SCRUB_GROTTO_LEFT, + RHT_LH_DEKU_SCRUB_GROTTO_CENTER, + RHT_LH_DEKU_SCRUB_GROTTO_RIGHT, + RHT_LH_GS_BEAN_PATCH, + RHT_LH_GS_LAB_WALL, + RHT_LH_GS_SMALL_ISLAND, + RHT_LH_GS_LAB_CRATE, + RHT_LH_GS_TREE, + RHT_GV_CRATE_FREESTANDING_POH, + RHT_GV_WATERFALL_FREESTANDING_POH, + RHT_GV_CHEST, + RHT_GV_TRADE_SAW, + RHT_GV_DEKU_SCRUB_GROTTO_FRONT, + RHT_GV_DEKU_SCRUB_GROTTO_REAR, + RHT_GV_COW, + RHT_GV_GS_SMALL_BRIDGE, + RHT_GV_GS_BEAN_PATCH, + RHT_GV_GS_BEHIND_TENT, + RHT_GV_GS_PILLAR, + RHT_GF_CHEST, + RHT_GF_HBA_1000_POINTS, + RHT_GF_HBA_1500_POINTS, + RHT_GF_GERUDO_MEMBERSHIP_CARD, + RHT_GF_NORTH_F1_CARPENTER, + RHT_GF_NORTH_F2_CARPENTER, + RHT_GF_SOUTH_F1_CARPENTER, + RHT_GF_SOUTH_F2_CARPENTER, + RHT_GF_GS_TOP_FLOOR, + RHT_GF_GS_ARCHERY_RANGE, + RHT_HIDEOUT_JAIL_GUARD_1_TORCH, + RHT_HIDEOUT_JAIL_GUARD_2_TORCHES, + RHT_HIDEOUT_JAIL_GUARD_3_TORCHES, + RHT_HIDEOUT_JAIL_GUARD_4_TORCHES, + RHT_HIDEOUT_GERUDO_MEMBERSHIP_CARD, + RHT_WASTELAND_BOMBCHU_SALESMAN, + RHT_WASTELAND_CHEST, + RHT_WASTELAND_GS, + RHT_COLOSSUS_GREAT_FAIRY_REWARD, + RHT_COLOSSUS_FREESTANDING_POH, + RHT_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, + RHT_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, + RHT_COLOSSUS_GS_BEAN_PATCH, + RHT_COLOSSUS_GS_TREE, + RHT_COLOSSUS_GS_HILL, + RHT_OGC_GREAT_FAIRY_REWARD, + RHT_OGC_GS, + RHT_DEKU_TREE_MAP_CHEST, + RHT_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, + RHT_DEKU_TREE_SLINGSHOT_CHEST, + RHT_DEKU_TREE_COMPASS_CHEST, + RHT_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, + RHT_DEKU_TREE_BASEMENT_CHEST, + RHT_DEKU_TREE_GS_COMPASS_ROOM, + RHT_DEKU_TREE_GS_BASEMENT_VINES, + RHT_DEKU_TREE_GS_BASEMENT_GATE, + RHT_DEKU_TREE_GS_BASEMENT_BACK_ROOM, + RHT_DEKU_TREE_MQ_MAP_CHEST, + RHT_DEKU_TREE_MQ_SLINGSHOT_CHEST, + RHT_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, + RHT_DEKU_TREE_MQ_COMPASS_CHEST, + RHT_DEKU_TREE_MQ_BASEMENT_CHEST, + RHT_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, + RHT_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, + RHT_DEKU_TREE_MQ_DEKU_SCRUB, + RHT_DEKU_TREE_MQ_GS_LOBBY, + RHT_DEKU_TREE_MQ_GS_COMPASS_ROOM, + RHT_DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, + RHT_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, + RHT_DEKU_TREE_QUEEN_GOHMA_HEART, + RHT_DODONGOS_CAVERN_MAP_CHEST, + RHT_DODONGOS_CAVERN_COMPASS_CHEST, + RHT_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, + RHT_DODONGOS_CAVERN_BOMB_BAG_CHEST, + RHT_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, + RHT_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, + RHT_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, + RHT_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, + RHT_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, + RHT_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, + RHT_DODONGOS_CAVERN_GS_SCARECROW, + RHT_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, + RHT_DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS, + RHT_DODONGOS_CAVERN_GS_BACK_ROOM, + RHT_DODONGOS_CAVERN_MQ_MAP_CHEST, + RHT_DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST, + RHT_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST, + RHT_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, + RHT_DODONGOS_CAVERN_MQ_COMPASS_CHEST, + RHT_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, + RHT_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, + RHT_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, + RHT_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, + RHT_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, + RHT_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, + RHT_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, + RHT_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, + RHT_DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, + RHT_DODONGOS_CAVERN_MQ_GS_BACK_AREA, + RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST, + RHT_DODONGOS_CAVERN_KING_DODONGO_HEART, + RHT_JABU_JABUS_BELLY_BOOMERANG_CHEST, + RHT_JABU_JABUS_BELLY_MAP_CHEST, + RHT_JABU_JABUS_BELLY_COMPASS_CHEST, + RHT_JABU_JABUS_BELLY_DEKU_SCRUB, + RHT_JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM, + RHT_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER, + RHT_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER, + RHT_JABU_JABUS_BELLY_GS_NEAR_BOSS, + RHT_JABU_JABUS_BELLY_MQ_MAP_CHEST, + RHT_JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, + RHT_JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST, + RHT_JABU_JABUS_BELLY_MQ_COMPASS_CHEST, + RHT_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, + RHT_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, + RHT_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, + RHT_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, + RHT_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, + RHT_JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST, + RHT_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, + RHT_JABU_JABUS_BELLY_MQ_COW, + RHT_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, + RHT_JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, + RHT_JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, + RHT_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, + RHT_JABU_JABUS_BELLY_BARINADE_HEART, + RHT_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, + RHT_BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST, + RHT_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST, + RHT_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST, + RHT_BOTTOM_OF_THE_WELL_FREESTANDING_KEY, + RHT_BOTTOM_OF_THE_WELL_COMPASS_CHEST, + RHT_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST, + RHT_BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST, + RHT_BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST, + RHT_BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST, + RHT_BOTTOM_OF_THE_WELL_MAP_CHEST, + RHT_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST, + RHT_BOTTOM_OF_THE_WELL_INVISIBLE_CHEST, + RHT_BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST, + RHT_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, + RHT_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, + RHT_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, + RHT_BOTTOM_OF_THE_WELL_MQ_MAP_CHEST, + RHT_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY, + RHT_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, + RHT_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY, + RHT_BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST, + RHT_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, + RHT_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM, + RHT_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, + RHT_FOREST_TEMPLE_FIRST_ROOM_CHEST, + RHT_FOREST_TEMPLE_FIRST_STALFOS_CHEST, + RHT_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, + RHT_FOREST_TEMPLE_MAP_CHEST, + RHT_FOREST_TEMPLE_WELL_CHEST, + RHT_FOREST_TEMPLE_EYE_SWITCH_CHEST, + RHT_FOREST_TEMPLE_BOSS_KEY_CHEST, + RHT_FOREST_TEMPLE_FLOORMASTER_CHEST, + RHT_FOREST_TEMPLE_RED_POE_CHEST, + RHT_FOREST_TEMPLE_BOW_CHEST, + RHT_FOREST_TEMPLE_BLUE_POE_CHEST, + RHT_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST, + RHT_FOREST_TEMPLE_BASEMENT_CHEST, + RHT_FOREST_TEMPLE_GS_FIRST_ROOM, + RHT_FOREST_TEMPLE_GS_LOBBY, + RHT_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, + RHT_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, + RHT_FOREST_TEMPLE_GS_BASEMENT, + RHT_FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST, + RHT_FOREST_TEMPLE_MQ_WOLFOS_CHEST, + RHT_FOREST_TEMPLE_MQ_WELL_CHEST, + RHT_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST, + RHT_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST, + RHT_FOREST_TEMPLE_MQ_BOSS_KEY_CHEST, + RHT_FOREST_TEMPLE_MQ_REDEAD_CHEST, + RHT_FOREST_TEMPLE_MQ_MAP_CHEST, + RHT_FOREST_TEMPLE_MQ_BOW_CHEST, + RHT_FOREST_TEMPLE_MQ_COMPASS_CHEST, + RHT_FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST, + RHT_FOREST_TEMPLE_MQ_BASEMENT_CHEST, + RHT_FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY, + RHT_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, + RHT_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, + RHT_FOREST_TEMPLE_MQ_GS_WELL, + RHT_FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM, + RHT_FOREST_TEMPLE_PHANTOM_GANON_HEART, + RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST, + RHT_FIRE_TEMPLE_FLARE_DANCER_CHEST, + RHT_FIRE_TEMPLE_BOSS_KEY_CHEST, + RHT_FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST, + RHT_FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, + RHT_FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST, + RHT_FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST, + RHT_FIRE_TEMPLE_MAP_CHEST, + RHT_FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST, + RHT_FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST, + RHT_FIRE_TEMPLE_SCARECROW_CHEST, + RHT_FIRE_TEMPLE_COMPASS_CHEST, + RHT_FIRE_TEMPLE_MEGATON_HAMMER_CHEST, + RHT_FIRE_TEMPLE_HIGHEST_GORON_CHEST, + RHT_FIRE_TEMPLE_GS_BOSS_KEY_LOOP, + RHT_FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM, + RHT_FIRE_TEMPLE_GS_BOULDER_MAZE, + RHT_FIRE_TEMPLE_GS_SCARECROW_CLIMB, + RHT_FIRE_TEMPLE_GS_SCARECROW_TOP, + RHT_FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, + RHT_FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, + RHT_FIRE_TEMPLE_MQ_MAP_CHEST, + RHT_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, + RHT_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, + RHT_FIRE_TEMPLE_MQ_BOSS_KEY_CHEST, + RHT_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, + RHT_FIRE_TEMPLE_MQ_COMPASS_CHEST, + RHT_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, + RHT_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, + RHT_FIRE_TEMPLE_MQ_FREESTANDING_KEY, + RHT_FIRE_TEMPLE_MQ_CHEST_ON_FIRE, + RHT_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, + RHT_FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE, + RHT_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER, + RHT_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, + RHT_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE, + RHT_FIRE_TEMPLE_VOLVAGIA_HEART, + RHT_WATER_TEMPLE_COMPASS_CHEST, + RHT_WATER_TEMPLE_MAP_CHEST, + RHT_WATER_TEMPLE_CRACKED_WALL_CHEST, + RHT_WATER_TEMPLE_TORCHES_CHEST, + RHT_WATER_TEMPLE_BOSS_KEY_CHEST, + RHT_WATER_TEMPLE_CENTRAL_PILLAR_CHEST, + RHT_WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST, + RHT_WATER_TEMPLE_LONGSHOT_CHEST, + RHT_WATER_TEMPLE_RIVER_CHEST, + RHT_WATER_TEMPLE_DRAGON_CHEST, + RHT_WATER_TEMPLE_GS_BEHIND_GATE, + RHT_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST, + RHT_WATER_TEMPLE_GS_CENTRAL_PILLAR, + RHT_WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM, + RHT_WATER_TEMPLE_GS_RIVER, + RHT_WATER_TEMPLE_MQ_LONGSHOT_CHEST, + RHT_WATER_TEMPLE_MQ_MAP_CHEST, + RHT_WATER_TEMPLE_MQ_COMPASS_CHEST, + RHT_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, + RHT_WATER_TEMPLE_MQ_BOSS_KEY_CHEST, + RHT_WATER_TEMPLE_MQ_FREESTANDING_KEY, + RHT_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, + RHT_WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH, + RHT_WATER_TEMPLE_MQ_GS_RIVER, + RHT_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, + RHT_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, + RHT_WATER_TEMPLE_MORPHA_HEART, + RHT_SHADOW_TEMPLE_MAP_CHEST, + RHT_SHADOW_TEMPLE_HOVER_BOOTS_CHEST, + RHT_SHADOW_TEMPLE_COMPASS_CHEST, + RHT_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, + RHT_SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, + RHT_SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, + RHT_SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST, + RHT_SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST, + RHT_SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST, + RHT_SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST, + RHT_SHADOW_TEMPLE_FREESTANDING_KEY, + RHT_SHADOW_TEMPLE_WIND_HINT_CHEST, + RHT_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, + RHT_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, + RHT_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, + RHT_SHADOW_TEMPLE_BOSS_KEY_CHEST, + RHT_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, + RHT_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, + RHT_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, + RHT_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, + RHT_SHADOW_TEMPLE_GS_NEAR_SHIP, + RHT_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, + RHT_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, + RHT_SHADOW_TEMPLE_MQ_MAP_CHEST, + RHT_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, + RHT_SHADOW_TEMPLE_MQ_COMPASS_CHEST, + RHT_SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST, + RHT_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST, + RHT_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST, + RHT_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, + RHT_SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST, + RHT_SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST, + RHT_SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST, + RHT_SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST, + RHT_SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST, + RHT_SHADOW_TEMPLE_MQ_WIND_HINT_CHEST, + RHT_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST, + RHT_SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST, + RHT_SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST, + RHT_SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST, + RHT_SHADOW_TEMPLE_MQ_FREESTANDING_KEY, + RHT_SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST, + RHT_SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM, + RHT_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, + RHT_SHADOW_TEMPLE_MQ_GS_AFTER_WIND, + RHT_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, + RHT_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, + RHT_SHADOW_TEMPLE_BONGO_BONGO_HEART, + RHT_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, + RHT_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, + RHT_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, + RHT_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, + RHT_SPIRIT_TEMPLE_MAP_CHEST, + RHT_SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST, + RHT_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST, + RHT_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST, + RHT_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST, + RHT_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST, + RHT_SPIRIT_TEMPLE_MQ_MAP_CHEST, + RHT_SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST, + RHT_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST, + RHT_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST, + RHT_SPIRIT_TEMPLE_MQ_COMPASS_CHEST, + RHT_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, + RHT_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST, + RHT_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, + RHT_SPIRIT_TEMPLE_COMPASS_CHEST, + RHT_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, + RHT_SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, + RHT_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, + RHT_SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST, + RHT_SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST, + RHT_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, + RHT_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, + RHT_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, + RHT_SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST, + RHT_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, + RHT_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST, + RHT_SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST, + RHT_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST, + RHT_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, + RHT_SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST, + RHT_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST, + RHT_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, + RHT_SPIRIT_TEMPLE_BOSS_KEY_CHEST, + RHT_SPIRIT_TEMPLE_TOPMOST_CHEST, + RHT_SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST, + RHT_SPIRIT_TEMPLE_GS_METAL_FENCE, + RHT_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, + RHT_SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM, + RHT_SPIRIT_TEMPLE_GS_LOBBY, + RHT_SPIRIT_TEMPLE_GS_BOULDER_ROOM, + RHT_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM, + RHT_SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM, + RHT_SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM, + RHT_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, + RHT_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, + RHT_SPIRIT_TEMPLE_TWINROVA_HEART, + RHT_ICE_CAVERN_MAP_CHEST, + RHT_ICE_CAVERN_COMPASS_CHEST, + RHT_ICE_CAVERN_FREESTANDING_POH, + RHT_ICE_CAVERN_IRON_BOOTS_CHEST, + RHT_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, + RHT_ICE_CAVERN_GS_HEART_PIECE_ROOM, + RHT_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, + RHT_ICE_CAVERN_MQ_MAP_CHEST, + RHT_ICE_CAVERN_MQ_COMPASS_CHEST, + RHT_ICE_CAVERN_MQ_FREESTANDING_POH, + RHT_ICE_CAVERN_MQ_IRON_BOOTS_CHEST, + RHT_ICE_CAVERN_MQ_GS_RED_ICE, + RHT_ICE_CAVERN_MQ_GS_ICE_BLOCK, + RHT_ICE_CAVERN_MQ_GS_SCARECROW, + RHT_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST, + RHT_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST, + RHT_GERUDO_TRAINING_GROUND_STALFOS_CHEST, + RHT_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST, + RHT_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FIRST_CHEST, + RHT_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_SECOND_CHEST, + RHT_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST, + RHT_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST, + RHT_GERUDO_TRAINING_GROUND_EYE_STATUE_CHEST, + RHT_GERUDO_TRAINING_GROUND_NEAR_SCARECROW_CHEST, + RHT_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST, + RHT_GERUDO_TRAINING_GROUND_HAMMER_ROOM_SWITCH_CHEST, + RHT_GERUDO_TRAINING_GROUND_FREESTANDING_KEY, + RHT_GERUDO_TRAINING_GROUND_MAZE_RIGHT_CENTRAL_CHEST, + RHT_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST, + RHT_GERUDO_TRAINING_GROUND_UNDERWATER_SILVER_RUPEE_CHEST, + RHT_GERUDO_TRAINING_GROUND_BEAMOS_CHEST, + RHT_GERUDO_TRAINING_GROUND_HIDDEN_CEILING_CHEST, + RHT_GERUDO_TRAINING_GROUND_MAZE_PATH_FIRST_CHEST, + RHT_GERUDO_TRAINING_GROUND_MAZE_PATH_SECOND_CHEST, + RHT_GERUDO_TRAINING_GROUND_MAZE_PATH_THIRD_CHEST, + RHT_GERUDO_TRAINING_GROUND_MAZE_PATH_FINAL_CHEST, + RHT_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_CHEST, + RHT_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_CHEST, + RHT_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST, + RHT_GERUDO_TRAINING_GROUND_MQ_BEFORE_HEAVY_BLOCK_CHEST, + RHT_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST, + RHT_GERUDO_TRAINING_GROUND_MQ_EYE_STATUE_CHEST, + RHT_GERUDO_TRAINING_GROUND_MQ_ICE_ARROWS_CHEST, + RHT_GERUDO_TRAINING_GROUND_MQ_SECOND_IRON_KNUCKLE_CHEST, + RHT_GERUDO_TRAINING_GROUND_MQ_FLAME_CIRCLE_CHEST, + RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_CENTRAL_CHEST, + RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_SIDE_CHEST, + RHT_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, + RHT_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST, + RHT_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST, + RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_FIRST_CHEST, + RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST, + RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_SECOND_CHEST, + RHT_GANONS_CASTLE_FOREST_TRIAL_CHEST, + RHT_GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST, + RHT_GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST, + RHT_GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST, + RHT_GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST, + RHT_GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST, + RHT_GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST, + RHT_GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST, + RHT_GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST, + RHT_GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST, + RHT_GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST, + RHT_GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST, + RHT_GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST, + RHT_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, + RHT_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, + RHT_GANONS_CASTLE_DEKU_SCRUB_LEFT, + RHT_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, + RHT_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, + RHT_GANONS_CASTLE_DEKU_SCRUB_RIGHT, + RHT_GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, + RHT_GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, + RHT_GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST, + RHT_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, + RHT_GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST, + RHT_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, + RHT_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, + RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST, + RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, + RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST, + RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST, + RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST, + RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST, + RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, + RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, + RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, + RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, + RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, + RHT_GANONS_TOWER_BOSS_KEY_CHEST, + RHT_DELIVER_RUTOS_LETTER, + RHT_MASTER_SWORD_PEDESTAL, + // Items + RHT_KOKIRI_SWORD, + RHT_MASTER_SWORD, + RHT_GIANTS_KNIFE, + RHT_BIGGORON_SWORD, + RHT_DEKU_SHIELD, + RHT_HYLIAN_SHIELD, + RHT_MIRROR_SHIELD, + RHT_GORON_TUNIC, + RHT_ZORA_TUNIC, + RHT_IRON_BOOTS, + RHT_HOVER_BOOTS, + RHT_BOOMERANG, + RHT_LENS_OF_TRUTH, + RHT_MEGATON_HAMMER, + RHT_STONE_OF_AGONY, + RHT_DINS_FIRE, + RHT_FARORES_WIND, + RHT_NAYRUS_LOVE, + RHT_FIRE_ARROWS, + RHT_ICE_ARROWS, + RHT_LIGHT_ARROWS, + RHT_GERUDO_MEMBERSHIP_CARD, + RHT_MAGIC_BEAN, + RHT_MAGIC_BEAN_PACK, + RHT_DOUBLE_DEFENSE, + RHT_WEIRD_EGG, + RHT_ZELDAS_LETTER, + RHT_POCKET_EGG, + RHT_POCKET_CUCCO, + RHT_COJIRO, + RHT_ODD_MUSHROOM, + RHT_ODD_POTION, + RHT_POACHERS_SAW, + RHT_BROKEN_SWORD, + RHT_PRESCRIPTION, + RHT_EYEBALL_FROG, + RHT_EYEDROPS, + RHT_CLAIM_CHECK, + RHT_GOLD_SKULLTULA_TOKEN, + RHT_PROGRESSIVE_HOOKSHOT, + RHT_PROGRESSIVE_STRENGTH, + RHT_PROGRESSIVE_BOMB_BAG, + RHT_PROGRESSIVE_BOW, + RHT_PROGRESSIVE_SLINGSHOT, + RHT_PROGRESSIVE_WALLET, + RHT_PROGRESSIVE_SCALE, + RHT_PROGRESSIVE_NUT_UPGRADE, + RHT_PROGRESSIVE_STICK_UPGRADE, + RHT_PROGRESSIVE_BOMBCHUS, + RHT_PROGRESSIVE_MAGIC_METER, + RHT_MAGIC_SINGLE, // Added for refactor of GetItemEntries + RHT_MAGIC_DOUBLE, // Added for refactor of GetItemEntries + RHT_PROGRESSIVE_OCARINA, + RHT_PROGRESSIVE_GORONSWORD, + RHT_EMPTY_BOTTLE, + RHT_BOTTLE_WITH_MILK, + RHT_BOTTLE_WITH_RED_POTION, + RHT_BOTTLE_WITH_GREEN_POTION, + RHT_BOTTLE_WITH_BLUE_POTION, + RHT_BOTTLE_WITH_FAIRY, + RHT_BOTTLE_WITH_FISH, + RHT_BOTTLE_WITH_BLUE_FIRE, + RHT_BOTTLE_WITH_BUGS, + RHT_BOTTLE_WITH_POE, + RHT_RUTOS_LETTER, + RHT_BOTTLE_WITH_BIG_POE, + RHT_ZELDAS_LULLABY, + RHT_EPONAS_SONG, + RHT_SARIAS_SONG, + RHT_SUNS_SONG, + RHT_SONG_OF_TIME, + RHT_SONG_OF_STORMS, + RHT_MINUET_OF_FOREST, + RHT_BOLERO_OF_FIRE, + RHT_SERENADE_OF_WATER, + RHT_REQUIEM_OF_SPIRIT, + RHT_NOCTURNE_OF_SHADOW, + RHT_PRELUDE_OF_LIGHT, + RHT_DEKU_TREE_MAP, + RHT_DODONGOS_CAVERN_MAP, + RHT_JABU_JABUS_BELLY_MAP, + RHT_FOREST_TEMPLE_MAP, + RHT_FIRE_TEMPLE_MAP, + RHT_WATER_TEMPLE_MAP, + RHT_SPIRIT_TEMPLE_MAP, + RHT_SHADOW_TEMPLE_MAP, + RHT_BOTTOM_OF_THE_WELL_MAP, + RHT_ICE_CAVERN_MAP, + RHT_DEKU_TREE_COMPASS, + RHT_DODONGOS_CAVERN_COMPASS, + RHT_JABU_JABUS_BELLY_COMPASS, + RHT_FOREST_TEMPLE_COMPASS, + RHT_FIRE_TEMPLE_COMPASS, + RHT_WATER_TEMPLE_COMPASS, + RHT_SPIRIT_TEMPLE_COMPASS, + RHT_SHADOW_TEMPLE_COMPASS, + RHT_BOTTOM_OF_THE_WELL_COMPASS, + RHT_ICE_CAVERN_COMPASS, + RHT_FOREST_TEMPLE_BOSS_KEY, + RHT_FIRE_TEMPLE_BOSS_KEY, + RHT_WATER_TEMPLE_BOSS_KEY, + RHT_SPIRIT_TEMPLE_BOSS_KEY, + RHT_SHADOW_TEMPLE_BOSS_KEY, + RHT_GANONS_CASTLE_BOSS_KEY, + RHT_FOREST_TEMPLE_SMALL_KEY, + RHT_FIRE_TEMPLE_SMALL_KEY, + RHT_WATER_TEMPLE_SMALL_KEY, + RHT_SPIRIT_TEMPLE_SMALL_KEY, + RHT_SHADOW_TEMPLE_SMALL_KEY, + RHT_BOTTOM_OF_THE_WELL_SMALL_KEY, + RHT_GERUDO_TRAINING_GROUNDS_SMALL_KEY, + RHT_GERUDO_FORTRESS_SMALL_KEY, + RHT_GANONS_CASTLE_SMALL_KEY, + RHT_TREASURE_GAME_SMALL_KEY, + RHT_FOREST_TEMPLE_KEY_RING, + RHT_FIRE_TEMPLE_KEY_RING, + RHT_WATER_TEMPLE_KEY_RING, + RHT_SPIRIT_TEMPLE_KEY_RING, + RHT_SHADOW_TEMPLE_KEY_RING, + RHT_BOTTOM_OF_THE_WELL_KEY_RING, + RHT_GERUDO_TRAINING_GROUNDS_KEY_RING, + RHT_GERUDO_FORTRESS_KEY_RING, + RHT_GANONS_CASTLE_KEY_RING, + RHT_KOKIRI_EMERALD, + RHT_GORON_RUBY, + RHT_ZORA_SAPPHIRE, + RHT_FOREST_MEDALLION, + RHT_FIRE_MEDALLION, + RHT_WATER_MEDALLION, + RHT_SPIRIT_MEDALLION, + RHT_SHADOW_MEDALLION, + RHT_LIGHT_MEDALLION, + RHT_RECOVERY_HEART, + RHT_GREEN_RUPEE, + RHT_GREG_RUPEE, + RHT_BLUE_RUPEE, + RHT_RED_RUPEE, + RHT_PURPLE_RUPEE, + RHT_HUGE_RUPEE, + RHT_PIECE_OF_HEART, + RHT_HEART_CONTAINER, + RHT_ICE_TRAP, + RHT_MILK, + RHT_BOMBS_5, + RHT_BOMBS_10, + RHT_BOMBS_20, + RHT_BOMBCHU_5, + RHT_BOMBCHU_10, + RHT_BOMBCHU_20, + RHT_BOMBCHU_DROP, + RHT_ARROWS_5, + RHT_ARROWS_10, + RHT_ARROWS_30, + RHT_DEKU_NUTS_5, + RHT_DEKU_NUTS_10, + RHT_DEKU_SEEDS_30, + RHT_DEKU_STICK_1, + RHT_RED_POTION_REFILL, + RHT_GREEN_POTION_REFILL, + RHT_BLUE_POTION_REFILL, + RHT_TREASURE_GAME_HEART, + RHT_TREASURE_GAME_GREEN_RUPEE, + RHT_BUY_DEKU_NUT_5, + RHT_BUY_ARROWS_30, + RHT_BUY_ARROWS_50, + RHT_BUY_BOMBS_525, + RHT_BUY_DEKU_NUT_10, + RHT_BUY_DEKU_STICK_1, + RHT_BUY_BOMBS_10, + RHT_BUY_FISH, + RHT_BUY_RED_POTION_30, + RHT_BUY_GREEN_POTION, + RHT_BUY_BLUE_POTION, + RHT_BUY_HYLIAN_SHIELD, + RHT_BUY_DEKU_SHIELD, + RHT_BUY_GORON_TUNIC, + RHT_BUY_ZORA_TUNIC, + RHT_BUY_HEART, + RHT_BUY_BOMBCHU_10, + RHT_BUY_BOMBCHU_20, + RHT_BUY_DEKU_SEEDS_30, + RHT_SOLD_OUT, + RHT_BUY_BLUE_FIRE, + RHT_BUY_BOTTLE_BUG, + RHT_BUY_POE, + RHT_BUY_FAIRYS_SPIRIT, + RHT_BUY_ARROWS_10, + RHT_BUY_BOMBS_20, + RHT_BUY_BOMBS_30, + RHT_BUY_BOMBS_535, + RHT_BUY_RED_POTION_40, + RHT_BUY_RED_POTION_50, + RHT_TRIFORCE, + RHT_HINT, + RHT_TYCOON_WALLET, + RHT_HOOKSHOT, + RHT_LONGSHOT, + RHT_FAIRY_OCARINA, + RHT_OCARINA_OF_TIME, + RHT_BOMB_BAG, + RHT_BIG_BOMB_BAG, + RHT_BIGGEST_BOMB_BAG, + RHT_FAIRY_BOW, + RHT_BIG_QUIVER, + RHT_BIGGEST_QUIVER, + RHT_FAIRY_SLINGSHOT, + RHT_BIG_BULLET_BAG, + RHT_BIGGEST_BULLET_BAG, + RHT_GORONS_BRACELET, + RHT_SILVER_GAUNTLETS, + RHT_GOLDEN_GAUNTLETS, + RHT_SILVER_SCALE, + RHT_GOLDEN_SCALE, + RHT_ADULT_WALLET, + RHT_GIANT_WALLET, + RHT_DEKU_NUT_CAPACITY_30, + RHT_DEKU_NUT_CAPACITY_40, + RHT_DEKU_STICK_CAPACITY_20, + RHT_DEKU_STICK_CAPACITY_30, + RHT_TRIFORCE_PIECE, + RHT_EPONA, + // Entrances + RHT_DESERT_COLOSSUS_TO_COLOSSUS_GROTTO, + RHT_GV_GROTTO_LEDGE_TO_GV_OCTOROK_GROTTO, + RHT_GC_GROTTO_PLATFORM_TO_GC_GROTTO, + RHT_GERUDO_FORTRESS_TO_GF_STORMS_GROTTO, + RHT_ZORAS_DOMAIN_TO_ZD_STORMS_GROTTO, + RHT_HYRULE_CASTLE_GROUNDS_TO_HC_STORMS_GROTTO, + RHT_GV_FORTRESS_SIDE_TO_GV_STORMS_GROTTO, + RHT_DESERT_COLOSSUS_TO_COLOSSUS_GREAT_FAIRY_FOUNTAIN, + RHT_GANONS_CASTLE_GROUNDS_TO_OGC_GREAT_FAIRY_FOUNTAIN, + RHT_ZORAS_FOUNTAIN_TO_ZF_GREAT_FAIRY_FOUNTAIN, + RHT_GV_FORTRESS_SIDE_TO_GV_CARPENTER_TENT, + RHT_GRAVEYARD_WARP_PAD_REGION_TO_SHADOW_TEMPLE_ENTRYWAY, + RHT_LAKE_HYLIA_TO_WATER_TEMPLE_LOBBY, + RHT_GERUDO_FORTRESS_TO_GERUDO_TRAINING_GROUNDS_LOBBY, + RHT_ZORAS_FOUNTAIN_TO_JABU_JABUS_BELLY_BEGINNING, + RHT_KAKARIKO_VILLAGE_TO_BOTTOM_OF_THE_WELL, + // Exits + RHT_KOKIRI_FOREST, + RHT_THE_LOST_WOODS, + RHT_SACRED_FOREST_MEADOW, + RHT_HYRULE_FIELD, + RHT_LAKE_HYLIA, + RHT_GERUDO_VALLEY, + RHT_GERUDO_FORTRESS, + RHT_HAUNTED_WASTELAND, + RHT_DESERT_COLOSSUS, + RHT_THE_MARKET, + RHT_TEMPLE_OF_TIME, + RHT_HYRULE_CASTLE, + RHT_OUTSIDE_GANONS_CASTLE, + RHT_KAKARIKO_VILLAGE, + RHT_THE_GRAVEYARD, + RHT_DEATH_MOUNTAIN_TRAIL, + RHT_GORON_CITY, + RHT_DEATH_MOUNTAIN_CRATER, + RHT_ZORAS_RIVER, + RHT_ZORAS_DOMAIN, + RHT_ZORAS_FOUNTAIN, + RHT_LON_LON_RANCH, + // Regions + RHT_KF_LINKS_HOUSE, + RHT_KF_MIDOS_HOUSE, + RHT_KF_SARIAS_HOUSE, + RHT_KF_HOUSE_OF_TWINS, + RHT_KF_KNOW_IT_ALL_HOUSE, + RHT_KF_KOKIRI_SHOP, + RHT_LH_LAB, + RHT_LH_FISHING_HOLE, + RHT_GV_CARPENTER_TENT, + RHT_MARKET_GUARD_HOUSE, + RHT_MARKET_MASK_SHOP, + RHT_MARKET_BOMBCHU_BOWLING, + RHT_MARKET_POTION_SHOP, + RHT_MARKET_TREASURE_CHEST_GAME, + RHT_MARKET_BOMBCHU_SHOP, + RHT_MARKET_MAN_IN_GREEN_HOUSE, + RHT_KAK_WINDMILL, + RHT_KAK_CARPENTER_BOSS_HOUSE, + RHT_KAK_HOUSE_OF_SKULLTULA, + RHT_KAK_IMPAS_HOUSE, + RHT_KAK_IMPAS_HOUSE_BACK, + RHT_KAK_ODD_POTION_BUILDING, + RHT_GRAVEYARD_DAMPES_HOUSE, + RHT_GC_SHOP, + RHT_ZD_SHOP, + RHT_LLR_TALONS_HOUSE, + RHT_LLR_STABLES, + RHT_LLR_TOWER, + RHT_MARKET_BAZAAR, + RHT_MARKET_SHOOTING_GALLERY, + RHT_KAK_BAZAAR, + RHT_KAK_POTION_SHOP_FRONT, + RHT_KAK_POTION_SHOP_BACK, + RHT_KAK_SHOOTING_GALLERY, + RHT_COLOSSUS_GREAT_FAIRY_FOUNTAIN, + RHT_HC_GREAT_FAIRY_FOUNTAIN, + RHT_OGC_GREAT_FAIRY_FOUNTAIN, + RHT_DMC_GREAT_FAIRY_FOUNTAIN, + RHT_DMT_GREAT_FAIRY_FOUNTAIN, + RHT_ZF_GREAT_FAIRY_FOUNTAIN, + RHT_GRAVEYARD_SHIELD_GRAVE, + RHT_GRAVEYARD_HEART_PIECE_GRAVE, + RHT_GRAVEYARD_COMPOSERS_GRAVE, + RHT_GRAVEYARD_DAMPES_GRAVE, + RHT_DMT_COW_GROTTO, + RHT_HC_STORMS_GROTTO, + RHT_HF_TEKTITE_GROTTO, + RHT_HF_NEAR_KAK_GROTTO, + RHT_HF_COW_GROTTO, + RHT_KAK_REDEAD_GROTTO, + RHT_SFM_WOLFOS_GROTTO, + RHT_GV_OCTOROK_GROTTO, + RHT_DEKU_THEATER, + RHT_ZR_OPEN_GROTTO, + RHT_DMC_UPPER_GROTTO, + RHT_DMT_STORMS_GROTTO, + RHT_KAK_OPEN_GROTTO, + RHT_HF_NEAR_MARKET_GROTTO, + RHT_HF_OPEN_GROTTO, + RHT_HF_SOUTHEAST_GROTTO, + RHT_KF_STORMS_GROTTO, + RHT_LW_NEAR_SHORTCUTS_GROTTO, + RHT_HF_INSIDE_FENCE_GROTTO, + RHT_LW_SCRUBS_GROTTO, + RHT_COLOSSUS_GROTTO, + RHT_ZR_STORMS_GROTTO, + RHT_SFM_STORMS_GROTTO, + RHT_GV_STORMS_GROTTO, + RHT_LH_GROTTO, + RHT_DMC_HAMMER_GROTTO, + RHT_GC_GROTTO, + RHT_LLR_GROTTO, + RHT_ZR_FAIRY_GROTTO, + RHT_HF_FAIRY_GROTTO, + RHT_SFM_FAIRY_GROTTO, + RHT_ZD_STORMS_GROTTO, + RHT_GF_STORMS_GROTTO, + RHT_DEKU_TREE, + RHT_DODONGOS_CAVERN, + RHT_JABU_JABUS_BELLY, + RHT_FOREST_TEMPLE, + RHT_FIRE_TEMPLE, + RHT_WATER_TEMPLE, + RHT_SPIRIT_TEMPLE, + RHT_SHADOW_TEMPLE, + RHT_ICE_CAVERN, + RHT_BOTTOM_OF_THE_WELL, + RHT_GERUDO_TRAINING_GROUND, + RHT_GANONS_CASTLE, + // Bridge Hints + RHT_BRIDGE_OPEN_HINT, + RHT_BRIDGE_VANILLA_HINT, + RHT_BRIDGE_STONES_HINT, + RHT_BRIDGE_MEDALLIONS_HINT, + RHT_BRIDGE_REWARDS_HINT, + RHT_BRIDGE_DUNGEONS_HINT, + RHT_BRIDGE_TOKENS_HINT, + RHT_BRIDGE_GREG_HINT, + // Ganon Boss Key + RHT_GANON_BK_START_WITH_HINT, + RHT_GANON_BK_VANILLA_HINT, + RHT_GANON_BK_OWN_DUNGEON_HINT, + RHT_GANON_BK_OVERWORLD_HINT, + RHT_GANON_BK_ANY_DUNGEON_HINT, + RHT_GANON_BK_ANYWHERE_HINT, + RHT_GANON_BK_TRIFORCE_HINT, + RHT_GANON_BK_SKULLTULA_HINT, + // LACS + RHT_LACS_VANILLA_HINT, + RHT_LACS_MEDALLIONS_HINT, + RHT_LACS_STONES_HINT, + RHT_LACS_REWARDS_HINT, + RHT_LACS_DUNGEONS_HINT, + RHT_LACS_TOKENS_HINT, + // Trials + RHT_SIX_TRIALS, + RHT_ZERO_TRIALS, + RHT_FOUR_TO_FIVE_TRIALS, + RHT_ONE_TO_THREE_TRIALS, + // Altar + RHT_SPIRITUAL_STONE_TEXT_START, + RHT_CHILD_ALTAR_TEXT_END_DOTOPEN, + RHT_CHILD_ALTAR_TEXT_END_DOTSONGONLY, + RHT_CHILD_ALTAR_TEXT_END_DOTCLOSED, + RHT_ADULT_ALTAR_TEXT_START, + RHT_ADULT_ALTAR_TEXT_END, + // Validation Line + RHT_VALIDATION_LINE, + // Light Arrow Location + RHT_LIGHT_ARROW_LOCATION_HINT, + // Your Pocket + RHT_YOUR_POCKET, + // Ganon Line + RHT_GANON_LINE01, + RHT_GANON_LINE02, + RHT_GANON_LINE03, + RHT_GANON_LINE04, + RHT_GANON_LINE05, + RHT_GANON_LINE06, + RHT_GANON_LINE07, + RHT_GANON_LINE08, + RHT_GANON_LINE09, + RHT_GANON_LINE10, + RHT_GANON_LINE11, + // Merchants + RHT_MEDIGORON_DIALOG_FIRST, + RHT_MEDIGORON_DIALOG_SECOND, + RHT_CARPET_SALESMAN_DIALOG_FIRST, + RHT_CARPET_SALESMAN_DIALOG_SECOND, + RHT_CARPET_SALESMAN_DIALOG_THIRD, + RHT_CARPET_SALESMAN_DIALOG_FOURTH, + RHT_GRANNY_DIALOG, + RHT_MAX +} RandomizerHintTextKey; + typedef struct { RandomizerGet rgID; RandomizerGet fakeRgID; diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp index be05be35d..ff0adf7a3 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp @@ -1,852 +1,56 @@ #include "randomizer_check_objects.h" +#include "static_data.h" +#include "context.h" #include #include #include #include "z64.h" -// RandomizerCheck, RCVORMQ, RCTYPE, RCAREA, ActorId, SceneId, ActorParams, OG ItemID, "Short name", "Spoiler name", vanillaCompletion -std::map rcObjects = { - RC_OBJECT(RC_KF_KOKIRI_SWORD_CHEST, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, ACTOR_EN_BOX, SCENE_KOKIRI_FOREST, 1248, GI_SWORD_KOKIRI, "Kokiri Sword Chest", "KF Kokiri Sword Chest", true), - RC_OBJECT(RC_KF_MIDOS_TOP_LEFT_CHEST, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, ACTOR_EN_BOX, SCENE_MIDOS_HOUSE, 22944, GI_RUPEE_BLUE, "Mido Top Left Chest", "KF Mido Top Left Chest", false), - RC_OBJECT(RC_KF_MIDOS_TOP_RIGHT_CHEST, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, ACTOR_EN_BOX, SCENE_MIDOS_HOUSE, 22945, GI_RUPEE_BLUE, "Mido Top Right Chest", "KF Mido Top Right Chest", false), - RC_OBJECT(RC_KF_MIDOS_BOTTOM_LEFT_CHEST, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, ACTOR_EN_BOX, SCENE_MIDOS_HOUSE, 22914, GI_RUPEE_GREEN, "Mido Bottom Left Chest", "KF Mido Bottom Left Chest", false), - RC_OBJECT(RC_KF_MIDOS_BOTTOM_RIGHT_CHEST, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, ACTOR_EN_BOX, SCENE_MIDOS_HOUSE, 22787, GI_HEART, "Mido Bottom Right Chest", "KF Mido Bottom Right Chest", false), - RC_OBJECT(RC_KF_STORMS_GROTTO_CHEST, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, ACTOR_EN_BOX, SCENE_GROTTOS, 22988, GI_RUPEE_RED, "Storms Grotto Chest", "KF Storms Grotto Chest", false), - RC_OBJECT(RC_KF_GS_BEAN_PATCH, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_KOKIRI_FOREST, ACTOR_EN_SI, SCENE_KOKIRI_FOREST, 27649, GI_SKULL_TOKEN, "GS Bean Patch", "KF GS Bean Patch", true), - RC_OBJECT(RC_KF_GS_KNOW_IT_ALL_HOUSE, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_KOKIRI_FOREST, ACTOR_EN_SI, SCENE_KOKIRI_FOREST, 19458, GI_SKULL_TOKEN, "GS Know It All House", "KF GS Know It All House", true), - RC_OBJECT(RC_KF_GS_HOUSE_OF_TWINS, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_KOKIRI_FOREST, ACTOR_EN_SI, SCENE_KOKIRI_FOREST, 19460, GI_SKULL_TOKEN, "GS House of Twins", "KF GS House of Twins", true), - RC_OBJECT(RC_KF_LINKS_HOUSE_COW, RCVORMQ_BOTH, RCTYPE_COW, RCAREA_KOKIRI_FOREST, ACTOR_EN_COW, SCENE_LINKS_HOUSE, 0x00, GI_MILK, "Links House Cow", "KF Links House Cow", false), - RC_OBJECT(RC_KF_SHOP_ITEM_1, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, ACTOR_EN_GIRLA, SCENE_KOKIRI_SHOP, 0x00, GI_SHIELD_DEKU, "Shop Item 1", "KF Shop Item 1", true), - RC_OBJECT(RC_KF_SHOP_ITEM_2, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, ACTOR_EN_GIRLA, SCENE_KOKIRI_SHOP, 0x01, GI_NUTS_5_2, "Shop Item 2", "KF Shop Item 2", false), - RC_OBJECT(RC_KF_SHOP_ITEM_3, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, ACTOR_EN_GIRLA, SCENE_KOKIRI_SHOP, 0x02, GI_NUTS_10, "Shop Item 3", "KF Shop Item 3", false), - RC_OBJECT(RC_KF_SHOP_ITEM_4, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, ACTOR_EN_GIRLA, SCENE_KOKIRI_SHOP, 0x03, GI_STICKS_1, "Shop Item 4", "KF Shop Item 4", false), - RC_OBJECT(RC_KF_SHOP_ITEM_5, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, ACTOR_EN_GIRLA, SCENE_KOKIRI_SHOP, 0x04, GI_SEEDS_30, "Shop Item 5", "KF Shop Item 5", false), - RC_OBJECT(RC_KF_SHOP_ITEM_6, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, ACTOR_EN_GIRLA, SCENE_KOKIRI_SHOP, 0x05, GI_ARROWS_SMALL, "Shop Item 6", "KF Shop Item 6", false), - RC_OBJECT(RC_KF_SHOP_ITEM_7, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, ACTOR_EN_GIRLA, SCENE_KOKIRI_SHOP, 0x06, GI_ARROWS_MEDIUM, "Shop Item 7", "KF Shop Item 7", false), - RC_OBJECT(RC_KF_SHOP_ITEM_8, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, ACTOR_EN_GIRLA, SCENE_KOKIRI_SHOP, 0x07, GI_HEART, "Shop Item 8", "KF Shop Item 8", false), - RC_OBJECT(RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_KOKIRI_FOREST, ACTOR_EN_GS, SCENE_KOKIRI_FOREST, 14623, GI_NONE, "Deku Tree Left Gossip Stone", "KF Deku Tree Left Gossip Stone", false), - RC_OBJECT(RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_KOKIRI_FOREST, ACTOR_EN_GS, SCENE_KOKIRI_FOREST, 14880, GI_NONE, "Deku Tree Right Gossip Stone", "KF Deku Tree Right Gossip Stone", false), - RC_OBJECT(RC_KF_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_KOKIRI_FOREST, ACTOR_EN_GS, SCENE_KOKIRI_FOREST, 14366, GI_NONE, "Gossip Stone", "KF Gossip Stone", false), - RC_OBJECT(RC_KF_STORMS_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_KOKIRI_FOREST, ACTOR_EN_GS, SCENE_GROTTOS, -22988, GI_NONE, "Storms Gossip Stone", "KF Storms Gossip Stone", false), - - - RC_OBJECT(RC_LW_NEAR_SHORTCUTS_GROTTO_CHEST, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_LOST_WOODS, ACTOR_EN_BOX, SCENE_GROTTOS, 22964, GI_RUPEE_BLUE, "Near Shortcuts Grotto Chest", "LW Near Shortcuts Grotto Chest", false), - RC_OBJECT(RC_LW_SKULL_KID, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_LOST_WOODS, ACTOR_ID_MAX, SCENE_LOST_WOODS, 0x00, GI_HEART_PIECE, "Skull Kid", "LW Skull Kid", true), - RC_OBJECT(RC_LW_TRADE_COJIRO, RCVORMQ_BOTH, RCTYPE_ADULT_TRADE, RCAREA_LOST_WOODS, ACTOR_ID_MAX, SCENE_LOST_WOODS, 0x00, GI_ODD_MUSHROOM, "Trade Cojiro", "LW Trade Cojiro", true), - RC_OBJECT(RC_LW_TRADE_ODD_POTION, RCVORMQ_BOTH, RCTYPE_ADULT_TRADE, RCAREA_LOST_WOODS, ACTOR_ID_MAX, SCENE_LOST_WOODS, 0x00, GI_SAW, "Trade Odd Potion", "LW Trade Odd Potion", true), - RC_OBJECT(RC_LW_OCARINA_MEMORY_GAME, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_LOST_WOODS, ACTOR_ID_MAX, SCENE_LOST_WOODS, 0x00, GI_HEART_PIECE, "Ocarina Memory Game", "LW Ocarina Memory Game", true), - RC_OBJECT(RC_LW_TARGET_IN_WOODS, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_LOST_WOODS, ACTOR_ID_MAX, SCENE_LOST_WOODS, 0x00, GI_NONE, "Target in Woods", "LW Target in Woods", true), - RC_OBJECT(RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, RCVORMQ_BOTH, RCTYPE_SCRUB, RCAREA_LOST_WOODS, ACTOR_EN_DNS, SCENE_LOST_WOODS, 0x00, GI_NUTS_5_2, "Deku Scrub Near Deku Theater Right", "LW Deku Scrub Near Deku Theater Right", false), - RC_OBJECT(RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, RCVORMQ_BOTH, RCTYPE_SCRUB, RCAREA_LOST_WOODS, ACTOR_EN_DNS, SCENE_LOST_WOODS, 0x01, GI_STICKS_1, "Deku Scrub Near Deku Theater Left", "LW Deku Scrub Near Deku Theater Left", false), - RC_OBJECT(RC_LW_DEKU_SCRUB_NEAR_BRIDGE, RCVORMQ_BOTH, RCTYPE_SCRUB, RCAREA_LOST_WOODS, ACTOR_EN_DNS, SCENE_LOST_WOODS, 0x09, GI_STICK_UPGRADE_20, "Deku Scrub Near Bridge", "LW Deku Scrub Near Bridge", true), - RC_OBJECT(RC_LW_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_BOTH, RCTYPE_SCRUB, RCAREA_LOST_WOODS, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x03,0xF5), GI_SEEDS_30, "Deku Scrub Grotto Rear", "LW Deku Scrub Grotto Rear", false), - RC_OBJECT(RC_LW_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_BOTH, RCTYPE_SCRUB, RCAREA_LOST_WOODS, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x0A,0xF5), GI_NUT_UPGRADE_30, "Deku Scrub Grotto Front", "LW Deku Scrub Grotto Front", false), - RC_OBJECT(RC_DEKU_THEATER_SKULL_MASK, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_LOST_WOODS, ACTOR_ID_MAX, SCENE_GROTTOS, 0x00, GI_NONE, "Deku Theater Skull Mask", "Deku Theater Skull Mask", true), - RC_OBJECT(RC_DEKU_THEATER_MASK_OF_TRUTH, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_LOST_WOODS, ACTOR_ID_MAX, SCENE_GROTTOS, 0x00, GI_NONE, "Deku Theater Mask of Truth", "Deku Theater Mask of Truth", true), - RC_OBJECT(RC_LW_GS_BEAN_PATCH_NEAR_BRIDGE, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_LOST_WOODS, ACTOR_EN_SI, SCENE_LOST_WOODS, 27905, GI_SKULL_TOKEN, "GS Bean Patch Near Bridge", "LW GS Bean Patch Near Bridge", true), - RC_OBJECT(RC_LW_GS_BEAN_PATCH_NEAR_THEATER, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_LOST_WOODS, ACTOR_EN_SI, SCENE_LOST_WOODS, 27906, GI_SKULL_TOKEN, "GS Bean Patch Near Theater", "LW GS Bean Patch Near Theater", true), - RC_OBJECT(RC_LW_GS_ABOVE_THEATER, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_LOST_WOODS, ACTOR_EN_SI, SCENE_LOST_WOODS, 19716, GI_SKULL_TOKEN, "GS Above Theater", "LW GS Above Theater", true), - RC_OBJECT(RC_LW_GIFT_FROM_SARIA, RCVORMQ_BOTH, RCTYPE_OCARINA, RCAREA_LOST_WOODS, ACTOR_ID_MAX, SCENE_LOST_WOODS, 0x00, GI_OCARINA_FAIRY, "Gift From Saria", "LW Gift From Saria", true), - RC_OBJECT(RC_LW_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_LOST_WOODS, ACTOR_EN_GS, SCENE_LOST_WOODS, 14365, GI_NONE, "Gossip Stone", "LW Gossip Stone", false), - RC_OBJECT(RC_LW_NEAR_SHORTCUTS_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_LOST_WOODS, ACTOR_EN_GS, SCENE_GROTTOS, -22964, GI_NONE, "Near Shortcuts Gossip Stone", "LW Near Shortcuts Gossip Stone", false), - - - RC_OBJECT(RC_SFM_WOLFOS_GROTTO_CHEST, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, ACTOR_EN_BOX, SCENE_GROTTOS, 31409, GI_RUPEE_PURPLE, "Wolfos Grotto Chest", "SFM Wolfos Grotto Chest", false), - RC_OBJECT(RC_SFM_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_BOTH, RCTYPE_SCRUB, RCAREA_SACRED_FOREST_MEADOW, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x07,0xEE), GI_POTION_RED, "Deku Scrub Grotto Rear", "SFM Deku Scrub Grotto Rear", false), - RC_OBJECT(RC_SFM_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_BOTH, RCTYPE_SCRUB, RCAREA_SACRED_FOREST_MEADOW, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x08,0xEE), GI_POTION_GREEN, "Deku Scrub Grotto Front", "SFM Deku Scrub Grotto Front", false), - RC_OBJECT(RC_SFM_GS, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_SACRED_FOREST_MEADOW, ACTOR_EN_SI, SCENE_SACRED_FOREST_MEADOW, 19720, GI_SKULL_TOKEN, "GS", "SFM GS", true), - RC_OBJECT(RC_SHEIK_IN_FOREST, RCVORMQ_BOTH, RCTYPE_SONG_LOCATION, RCAREA_SACRED_FOREST_MEADOW, ACTOR_ID_MAX, SCENE_SACRED_FOREST_MEADOW, 0x00, GI_NONE, "Sheik in Forest", "Sheik in Forest", true), - RC_OBJECT(RC_SONG_FROM_SARIA, RCVORMQ_BOTH, RCTYPE_SONG_LOCATION, RCAREA_SACRED_FOREST_MEADOW, ACTOR_ID_MAX, SCENE_SACRED_FOREST_MEADOW, 0x00, GI_NONE, "Song from Saria", "Song from Saria", true), - RC_OBJECT(RC_SFM_MAZE_LOWER_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_SACRED_FOREST_MEADOW, ACTOR_EN_GS, SCENE_SACRED_FOREST_MEADOW, 14358, GI_NONE, "Maze Lower Gossip Stone", "SFM Maze Lower Gossip Stone", false), - RC_OBJECT(RC_SFM_MAZE_UPPER_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_SACRED_FOREST_MEADOW, ACTOR_EN_GS, SCENE_SACRED_FOREST_MEADOW, 14615, GI_NONE, "Maze Upper Gossip Stone", "SFM Maze Upper Gossip Stone", false), - RC_OBJECT(RC_SFM_SARIA_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_SACRED_FOREST_MEADOW, ACTOR_EN_GS, SCENE_SACRED_FOREST_MEADOW, 14876, GI_NONE, "Saria Gossip Stone", "SFM Saria Gossip Stone", false), - - - RC_OBJECT(RC_HF_SOUTHEAST_GROTTO_CHEST, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, ACTOR_EN_BOX, SCENE_GROTTOS, 22978, GI_RUPEE_RED, "Southeast Grotto Chest", "HF Southeast Grotto Chest", false), - RC_OBJECT(RC_HF_OPEN_GROTTO_CHEST, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, ACTOR_EN_BOX, SCENE_GROTTOS, 22947, GI_RUPEE_BLUE, "Open Grotto Chest", "HF Open Grotto Chest", false), - RC_OBJECT(RC_HF_NEAR_MARKET_GROTTO_CHEST, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, ACTOR_EN_BOX, SCENE_GROTTOS, 22944, GI_RUPEE_BLUE, "Near Market Grotto Chest", "HF Near Market Grotto Chest", false), - RC_OBJECT(RC_HF_OCARINA_OF_TIME_ITEM, RCVORMQ_BOTH, RCTYPE_OCARINA, RCAREA_HYRULE_FIELD, ACTOR_ID_MAX, SCENE_HYRULE_FIELD, 0x00, GI_OCARINA_OOT, "Ocarina of Time Item", "HF Ocarina of Time Item", true), - RC_OBJECT(RC_HF_TEKTITE_GROTTO_FREESTANDING_POH, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, ACTOR_EN_ITEM00, SCENE_GROTTOS, 262, GI_HEART_PIECE, "Tektite Grotto Freestanding PoH", "HF Tektite Grotto Freestanding PoH", true), - RC_OBJECT(RC_HF_DEKU_SCRUB_GROTTO, RCVORMQ_BOTH, RCTYPE_SCRUB, RCAREA_HYRULE_FIELD, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x02,0xE6), GI_HEART_PIECE, "Deku Scrub Grotto", "HF Deku Scrub Grotto", true), - RC_OBJECT(RC_HF_GS_COW_GROTTO, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_FIELD, ACTOR_EN_SI, SCENE_GROTTOS, 10753, GI_SKULL_TOKEN, "GS Cow Grotto", "HF GS Cow Grotto", true), - RC_OBJECT(RC_HF_GS_NEAR_KAK_GROTTO, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_FIELD, ACTOR_EN_SI, SCENE_GROTTOS, 10754, GI_SKULL_TOKEN, "GS Near Kak Grotto", "HF GS Near Kak Grotto", true), - RC_OBJECT(RC_SONG_FROM_OCARINA_OF_TIME, RCVORMQ_BOTH, RCTYPE_SONG_LOCATION, RCAREA_HYRULE_FIELD, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, GI_NONE, "Song from Ocarina of Time", "Song from Ocarina of Time", true), - RC_OBJECT(RC_HF_COW_GROTTO_COW, RCVORMQ_BOTH, RCTYPE_COW, RCAREA_HYRULE_FIELD, ACTOR_EN_COW, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3485,-291), GI_MILK, "Cow Grotto Cow", "HF Cow Grotto Cow", false), - RC_OBJECT(RC_HF_COW_GROTTO_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_FIELD, ACTOR_EN_GS, SCENE_GROTTOS, 14363, GI_NONE, "Cow Grotto Gossip Stone", "HF Cow Grotto Gossip Stone", false), - RC_OBJECT(RC_HF_NEAR_MARKET_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_FIELD, ACTOR_EN_GS, SCENE_GROTTOS, -22944, GI_NONE, "Near Market Gossip Stone", "HF Near Market Gossip Stone", false), - RC_OBJECT(RC_HF_OPEN_GROTTO_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_FIELD, ACTOR_EN_GS, SCENE_GROTTOS, -22947, GI_NONE, "Open Grotto Gossip Stone", "HF Open Grotto Gossip Stone", false), - RC_OBJECT(RC_HF_SOUTHEAST_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_FIELD, ACTOR_EN_GS, SCENE_GROTTOS, -22978, GI_NONE, "Southeast Gossip Stone", "HF Southeast Gossip Stone", false), - - - RC_OBJECT(RC_LH_CHILD_FISHING, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, ACTOR_ID_MAX, SCENE_FISHING_POND, 0x00, GI_HEART_PIECE, "Child Fishing", "LH Child Fishing", true), - RC_OBJECT(RC_LH_ADULT_FISHING, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, ACTOR_ID_MAX, SCENE_FISHING_POND, 0x00, GI_SCALE_GOLD, "Adult Fishing", "LH Adult Fishing", true), - RC_OBJECT(RC_LH_LAB_DIVE, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, ACTOR_ID_MAX, SCENE_LAKESIDE_LABORATORY, 0x00, GI_HEART_PIECE, "Lab Dive", "LH Lab Dive", true), - RC_OBJECT(RC_LH_TRADE_FROG, RCVORMQ_BOTH, RCTYPE_ADULT_TRADE, RCAREA_LAKE_HYLIA, ACTOR_ID_MAX, SCENE_LAKESIDE_LABORATORY, 0x00, GI_FROG, "Lab Trade Eyeball Frog", "LH Lab Trade Eyeball Frog", true), - RC_OBJECT(RC_LH_UNDERWATER_ITEM, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, ACTOR_ID_MAX, SCENE_LAKE_HYLIA, 0x00, GI_LETTER_RUTO, "Underwater Item", "LH Underwater Item", true), - RC_OBJECT(RC_LH_SUN, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, ACTOR_ID_MAX, SCENE_LAKE_HYLIA, 0x00, GI_ARROW_FIRE, "Sun", "LH Sun", true), - RC_OBJECT(RC_LH_FREESTANDING_POH, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, ACTOR_EN_ITEM00, SCENE_LAKE_HYLIA, 7686, GI_HEART_PIECE, "Freestanding PoH", "LH Freestanding PoH", true), - RC_OBJECT(RC_LH_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_BOTH, RCTYPE_SCRUB, RCAREA_LAKE_HYLIA, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x00,0xEF), GI_NUTS_5_2, "Deku Scrub Grotto Left", "LH Deku Scrub Grotto Left", false), - RC_OBJECT(RC_LH_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_BOTH, RCTYPE_SCRUB, RCAREA_LAKE_HYLIA, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x05,0xEF), GI_BOMBS_5, "Deku Scrub Grotto Right", "LH Deku Scrub Grotto Right", false), - RC_OBJECT(RC_LH_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_BOTH, RCTYPE_SCRUB, RCAREA_LAKE_HYLIA, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x03,0xEF), GI_SEEDS_30, "Deku Scrub Grotto Center", "LH Deku Scrub Grotto Center", false), - RC_OBJECT(RC_LH_GS_BEAN_PATCH, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, ACTOR_EN_SI, SCENE_LAKE_HYLIA, 29185, GI_SKULL_TOKEN, "GS Bean Patch", "LH GS Bean Patch", true), - RC_OBJECT(RC_LH_GS_SMALL_ISLAND, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, ACTOR_EN_SI, SCENE_LAKE_HYLIA, 20994, GI_SKULL_TOKEN, "GS Small Island", "LH GS Small Island", true), - RC_OBJECT(RC_LH_GS_LAB_WALL, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, ACTOR_EN_SI, SCENE_LAKE_HYLIA, 20996, GI_SKULL_TOKEN, "GS Lab Wall", "LH GS Lab Wall", true), - RC_OBJECT(RC_LH_GS_LAB_CRATE, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, ACTOR_EN_SI, SCENE_LAKESIDE_LABORATORY, -28152, GI_SKULL_TOKEN, "GS Lab Crate", "LH GS Lab Crate", true), - RC_OBJECT(RC_LH_GS_TREE, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, ACTOR_EN_SI, SCENE_LAKE_HYLIA, 21008, GI_SKULL_TOKEN, "GS Tree", "LH GS Tree", true), - RC_OBJECT(RC_LH_LAB_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_LAKE_HYLIA, ACTOR_EN_GS, SCENE_LAKE_HYLIA, 14339, GI_NONE, "Lab Gossip Stone", "LH Lab Gossip Stone", false), - RC_OBJECT(RC_LH_SOUTHEAST_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_LAKE_HYLIA, ACTOR_EN_GS, SCENE_LAKE_HYLIA, 14863, GI_NONE, "Southeast Gossip Stone", "LH Southeast Gossip Stone", false), - RC_OBJECT(RC_LH_SOUTHWEST_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_LAKE_HYLIA, ACTOR_EN_GS, SCENE_LAKE_HYLIA, 14600, GI_NONE, "Southwest Gossip Stone", "LH Southwest Gossip Stone", false), - - - RC_OBJECT(RC_GV_CHEST, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, ACTOR_EN_BOX, SCENE_GERUDO_VALLEY, 23200, GI_RUPEE_PURPLE, "Chest", "GV Chest", false), - RC_OBJECT(RC_GV_TRADE_SAW, RCVORMQ_BOTH, RCTYPE_ADULT_TRADE, RCAREA_GERUDO_VALLEY, ACTOR_ID_MAX, SCENE_GERUDO_VALLEY, 0x00, GI_NONE, "Trade Saw", "GV Trade Saw", true), - RC_OBJECT(RC_GV_WATERFALL_FREESTANDING_POH, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, ACTOR_EN_ITEM00, SCENE_GERUDO_VALLEY, 262, GI_HEART_PIECE, "Waterfall Freestanding PoH", "GV Waterfall Freestanding PoH", true), - RC_OBJECT(RC_GV_CRATE_FREESTANDING_POH, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, ACTOR_EN_ITEM00, SCENE_GERUDO_VALLEY, 518, GI_HEART_PIECE, "Crate Freestanding PoH", "GV Crate Freestanding PoH", true), - RC_OBJECT(RC_GV_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_BOTH, RCTYPE_SCRUB, RCAREA_GERUDO_VALLEY, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x07,0xF0), GI_POTION_RED, "Deku Scrub Grotto Rear", "GV Deku Scrub Grotto Rear", false), - RC_OBJECT(RC_GV_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_BOTH, RCTYPE_SCRUB, RCAREA_GERUDO_VALLEY, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x08,0xF0), GI_POTION_GREEN, "Deku Scrub Grotto Front", "GV Deku Scrub Grotto Front", false), - RC_OBJECT(RC_GV_GS_BEAN_PATCH, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_VALLEY, ACTOR_EN_SI, SCENE_GERUDO_VALLEY, 29441, GI_SKULL_TOKEN, "GS Bean Patch", "GV GS Bean Patch", true), - RC_OBJECT(RC_GV_GS_SMALL_BRIDGE, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_VALLEY, ACTOR_EN_SI, SCENE_GERUDO_VALLEY, 21250, GI_SKULL_TOKEN, "GS Small Bridge", "GV GS Small Bridge", true), - RC_OBJECT(RC_GV_GS_PILLAR, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_VALLEY, ACTOR_EN_SI, SCENE_GERUDO_VALLEY, 21252, GI_SKULL_TOKEN, "GS Pillar", "GV GS Pillar", true), - RC_OBJECT(RC_GV_GS_BEHIND_TENT, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_VALLEY, ACTOR_EN_SI, SCENE_GERUDO_VALLEY, 21256, GI_SKULL_TOKEN, "GS Behind Tent", "GV GS Behind Tent", true), - RC_OBJECT(RC_GV_COW, RCVORMQ_BOTH, RCTYPE_COW, RCAREA_GERUDO_VALLEY, ACTOR_EN_COW, SCENE_GERUDO_VALLEY, 0x00, GI_MILK, "Cow", "GV Cow", false), - RC_OBJECT(RC_GV_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_GERUDO_VALLEY, ACTOR_EN_GS, SCENE_GERUDO_VALLEY, 14353, GI_NONE, "Gossip Stone", "GV Gossip Stone", false), - - - RC_OBJECT(RC_GF_CHEST, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, ACTOR_EN_BOX, SCENE_GERUDOS_FORTRESS, 1984, GI_HEART_PIECE, "Chest", "GF Chest", true), - RC_OBJECT(RC_GF_HBA_1000_POINTS, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, ACTOR_ID_MAX, SCENE_GERUDOS_FORTRESS, 0x00, GI_HEART_PIECE, "GF HBA 1000 Points", "GF HBA 1000 Points", true), - RC_OBJECT(RC_GF_HBA_1500_POINTS, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, ACTOR_ID_MAX, SCENE_GERUDOS_FORTRESS, 0x00, GI_QUIVER_50, "GF HBA 1500 Points", "GF HBA 1500 Points", true), - RC_OBJECT(RC_GF_GERUDO_MEMBERSHIP_CARD, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, ACTOR_ID_MAX, SCENE_THIEVES_HIDEOUT, 0x00, GI_HEART_PIECE, "GF Gerudo Membership Card", "GF Gerudo Membership Card", true), - RC_OBJECT(RC_GF_NORTH_F1_CARPENTER, RCVORMQ_BOTH, RCTYPE_GF_KEY, RCAREA_GERUDO_FORTRESS, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 3089, GI_KEY_SMALL, "GF North F1 Carpenter", "GF North F1 Carpenter", true), - RC_OBJECT(RC_GF_NORTH_F2_CARPENTER, RCVORMQ_BOTH, RCTYPE_GF_KEY, RCAREA_GERUDO_FORTRESS, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 2577, GI_KEY_SMALL, "GF North F2 Carpenter", "GF North F2 Carpenter", true), - RC_OBJECT(RC_GF_SOUTH_F1_CARPENTER, RCVORMQ_BOTH, RCTYPE_GF_KEY, RCAREA_GERUDO_FORTRESS, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 3601, GI_KEY_SMALL, "GF South F1 Carpenter", "GF South F1 Carpenter", true), - RC_OBJECT(RC_GF_SOUTH_F2_CARPENTER, RCVORMQ_BOTH, RCTYPE_GF_KEY, RCAREA_GERUDO_FORTRESS, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 3857, GI_KEY_SMALL, "GF South F2 Carpenter", "GF South F2 Carpenter", true), - RC_OBJECT(RC_GF_GS_ARCHERY_RANGE, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_FORTRESS, ACTOR_EN_SI, SCENE_GERUDOS_FORTRESS, 21505, GI_SKULL_TOKEN, "GS Archery Range", "GF GS Archery Range", true), - RC_OBJECT(RC_GF_GS_TOP_FLOOR, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_FORTRESS, ACTOR_EN_SI, SCENE_GERUDOS_FORTRESS, 21506, GI_SKULL_TOKEN, "GS Top Floor", "GF GS Top Floor", true), - - - RC_OBJECT(RC_WASTELAND_CHEST, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_WASTELAND, ACTOR_EN_BOX, SCENE_HAUNTED_WASTELAND, -30048, GI_RUPEE_PURPLE, "Chest", "Wasteland Chest", false), - RC_OBJECT(RC_WASTELAND_BOMBCHU_SALESMAN, RCVORMQ_BOTH, RCTYPE_MERCHANT, RCAREA_WASTELAND, ACTOR_ID_MAX, SCENE_HAUNTED_WASTELAND, 0x00, GI_NONE, "Carpet Salesman", "Wasteland Carpet Salesman", false), - RC_OBJECT(RC_WASTELAND_GS, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_WASTELAND, ACTOR_EN_SI, SCENE_HAUNTED_WASTELAND, 13570, GI_SKULL_TOKEN, "GS", "Wasteland GS", true), - - - RC_OBJECT(RC_COLOSSUS_FREESTANDING_POH, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, ACTOR_EN_ITEM00, SCENE_DESERT_COLOSSUS, 3334, GI_HEART_PIECE, "Freestanding PoH", "Colossus Freestanding PoH", true), - RC_OBJECT(RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_BOTH, RCTYPE_SCRUB, RCAREA_DESERT_COLOSSUS, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x07,0xFD), GI_POTION_RED, "Deku Scrub Grotto Rear", "Colossus Deku Scrub Grotto Rear", false), - RC_OBJECT(RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_BOTH, RCTYPE_SCRUB, RCAREA_DESERT_COLOSSUS, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x08,0xFD), GI_POTION_GREEN, "Deku Scrub Grotto Front", "Colossus Deku Scrub Grotto Front", false), - RC_OBJECT(RC_COLOSSUS_GS_BEAN_PATCH, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_DESERT_COLOSSUS, ACTOR_EN_SI, SCENE_DESERT_COLOSSUS, 29953, GI_SKULL_TOKEN, "GS Bean Patch", "Colossus GS Bean Patch", true), - RC_OBJECT(RC_COLOSSUS_GS_HILL, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_DESERT_COLOSSUS, ACTOR_EN_SI, SCENE_DESERT_COLOSSUS, 21764, GI_SKULL_TOKEN, "GS Hill", "Colossus GS Hill", true), - RC_OBJECT(RC_COLOSSUS_GS_TREE, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_DESERT_COLOSSUS, ACTOR_EN_SI, SCENE_DESERT_COLOSSUS, 21768, GI_SKULL_TOKEN, "GS Tree", "Colossus GS Tree", true), - RC_OBJECT(RC_COLOSSUS_GREAT_FAIRY_REWARD, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, ACTOR_BG_DY_YOSEIZO,SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, 3, GI_NONE, "Great Fairy Reward", "Colossus Great Fairy Reward", true), - RC_OBJECT(RC_SHEIK_AT_COLOSSUS, RCVORMQ_BOTH, RCTYPE_SONG_LOCATION, RCAREA_DESERT_COLOSSUS, ACTOR_ID_MAX, SCENE_DESERT_COLOSSUS, 0x00, GI_NONE, "Sheik at Colossus", "Sheik at Colossus", true), - RC_OBJECT(RC_COLOSSUS_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_DESERT_COLOSSUS, ACTOR_EN_GS, SCENE_DESERT_COLOSSUS, 14362, GI_NONE, "Gossip Stone", "Colossus Gossip Stone", false), - - - RC_OBJECT(RC_MARKET_TREASURE_CHEST_GAME_REWARD, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_MARKET, ACTOR_EN_BOX, SCENE_TREASURE_BOX_SHOP, 0x00, GI_HEART_PIECE, "Treasure Chest Game Reward", "MK Treasure Chest Game Reward", true), - RC_OBJECT(RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_BOMBCHU_BOWLING_ALLEY, 0x00, GI_NONE, "Bombchu Bowling First Prize", "MK Bombchu Bowling First Prize", true), - RC_OBJECT(RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_BOMBCHU_BOWLING_ALLEY, 0x00, GI_HEART_PIECE, "Bombchu Bowling Second Prize", "MK Bombchu Bowling Second Prize", true), - RC_OBJECT(RC_MARKET_LOST_DOG, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_DOG_LADY_HOUSE, 0x00, GI_HEART_PIECE, "Lost Dog", "MK Lost Dog", true), - RC_OBJECT(RC_MARKET_SHOOTING_GALLERY_REWARD, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_SHOOTING_GALLERY, 0x00, GI_BULLET_BAG_40, "Shooting Gallery", "MK Shooting Gallery", true), - RC_OBJECT(RC_MARKET_10_BIG_POES, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_MARKET_GUARD_HOUSE, 0x00, GI_BOTTLE, "10 Big Poes", "MK 10 Big Poes", true), - RC_OBJECT(RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, RCVORMQ_BOTH, RCTYPE_CHEST_GAME, RCAREA_MARKET, ACTOR_EN_BOX, SCENE_TREASURE_BOX_SHOP, 0x00, GI_NONE, "Chest Game First Room Chest", "MK Chest Game First Room Chest", false), - RC_OBJECT(RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, RCVORMQ_BOTH, RCTYPE_CHEST_GAME, RCAREA_MARKET, ACTOR_EN_BOX, SCENE_TREASURE_BOX_SHOP, 0x00, GI_NONE, "Chest Game Second Room Chest", "MK Chest Game Second Room Chest", false), - RC_OBJECT(RC_MARKET_TREASURE_CHEST_GAME_ITEM_3, RCVORMQ_BOTH, RCTYPE_CHEST_GAME, RCAREA_MARKET, ACTOR_EN_BOX, SCENE_TREASURE_BOX_SHOP, 0x00, GI_NONE, "Chest Game Third Room Chest", "MK Chest Game Third Room Chest", false), - RC_OBJECT(RC_MARKET_TREASURE_CHEST_GAME_ITEM_4, RCVORMQ_BOTH, RCTYPE_CHEST_GAME, RCAREA_MARKET, ACTOR_EN_BOX, SCENE_TREASURE_BOX_SHOP, 0x00, GI_NONE, "Chest Game Fourth Room Chest", "MK Chest Game Fourth Room Chest", false), - RC_OBJECT(RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, RCVORMQ_BOTH, RCTYPE_CHEST_GAME, RCAREA_MARKET, ACTOR_EN_BOX, SCENE_TREASURE_BOX_SHOP, 0x00, GI_NONE, "Chest Game Fifth Room Chest", "MK Chest Game Fifth Room Chest", false), - RC_OBJECT(RC_MARKET_GS_GUARD_HOUSE, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_MARKET, ACTOR_EN_SI, SCENE_MARKET_GUARD_HOUSE, -29176, GI_SKULL_TOKEN, "Market GS Guard House", "Market GS Guard House", true), - RC_OBJECT(RC_TOT_LIGHT_ARROWS_CUTSCENE, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, GI_ARROW_LIGHT, "ToT Light Arrow Cutscene", "ToT Light Arrow Cutscene", true), - RC_OBJECT(RC_SHEIK_AT_TEMPLE, RCVORMQ_BOTH, RCTYPE_SONG_LOCATION, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, GI_NONE, "Sheik at Temple", "Sheik at Temple", true), - RC_OBJECT(RC_MARKET_BOMBCHU_SHOP_ITEM_1, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BOMBCHU_SHOP, 0x00, GI_BOMBCHUS_10, "Bombchu Shop Item 1", "MK Bombchu Shop Item 1", false), - RC_OBJECT(RC_MARKET_BOMBCHU_SHOP_ITEM_2, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BOMBCHU_SHOP, 0x01, GI_BOMBCHUS_10, "Bombchu Shop Item 2", "MK Bombchu Shop Item 2", false), - RC_OBJECT(RC_MARKET_BOMBCHU_SHOP_ITEM_3, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BOMBCHU_SHOP, 0x02, GI_BOMBCHUS_10, "Bombchu Shop Item 3", "MK Bombchu Shop Item 3", false), - RC_OBJECT(RC_MARKET_BOMBCHU_SHOP_ITEM_4, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BOMBCHU_SHOP, 0x03, GI_BOMBCHUS_10, "Bombchu Shop Item 4", "MK Bombchu Shop Item 4", false), - RC_OBJECT(RC_MARKET_BOMBCHU_SHOP_ITEM_5, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BOMBCHU_SHOP, 0x04, GI_BOMBCHUS_20, "Bombchu Shop Item 5", "MK Bombchu Shop Item 5", false), - RC_OBJECT(RC_MARKET_BOMBCHU_SHOP_ITEM_6, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BOMBCHU_SHOP, 0x05, GI_BOMBCHUS_20, "Bombchu Shop Item 6", "MK Bombchu Shop Item 6", false), - RC_OBJECT(RC_MARKET_BOMBCHU_SHOP_ITEM_7, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BOMBCHU_SHOP, 0x06, GI_BOMBCHUS_20, "Bombchu Shop Item 7", "MK Bombchu Shop Item 7", false), - RC_OBJECT(RC_MARKET_BOMBCHU_SHOP_ITEM_8, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BOMBCHU_SHOP, 0x07, GI_BOMBCHUS_20, "Bombchu Shop Item 8", "MK Bombchu Shop Item 8", false), - RC_OBJECT(RC_MARKET_POTION_SHOP_ITEM_1, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_POTION_SHOP_MARKET, 0x00, GI_POTION_GREEN, "Potion Shop Item 1", "MK Potion Shop Item 1", false), - RC_OBJECT(RC_MARKET_POTION_SHOP_ITEM_2, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_POTION_SHOP_MARKET, 0x01, GI_BLUE_FIRE, "Potion Shop Item 2", "MK Potion Shop Item 2", false), - RC_OBJECT(RC_MARKET_POTION_SHOP_ITEM_3, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_POTION_SHOP_MARKET, 0x02, GI_POTION_RED, "Potion Shop Item 3", "MK Potion Shop Item 3", false), - RC_OBJECT(RC_MARKET_POTION_SHOP_ITEM_4, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_POTION_SHOP_MARKET, 0x03, GI_FAIRY, "Potion Shop Item 4", "MK Potion Shop Item 4", false), - RC_OBJECT(RC_MARKET_POTION_SHOP_ITEM_5, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_POTION_SHOP_MARKET, 0x04, GI_NUTS_5_2, "Potion Shop Item 5", "MK Potion Shop Item 5", false), - RC_OBJECT(RC_MARKET_POTION_SHOP_ITEM_6, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_POTION_SHOP_MARKET, 0x05, GI_BUGS, "Potion Shop Item 6", "MK Potion Shop Item 6", false), - RC_OBJECT(RC_MARKET_POTION_SHOP_ITEM_7, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_POTION_SHOP_MARKET, 0x06, GI_POE, "Potion Shop Item 7", "MK Potion Shop Item 7", false), - RC_OBJECT(RC_MARKET_POTION_SHOP_ITEM_8, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_POTION_SHOP_MARKET, 0x07, GI_FISH, "Potion Shop Item 8", "MK Potion Shop Item 8", false), - RC_OBJECT(RC_MARKET_BAZAAR_ITEM_1, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BAZAAR, 0x00, GI_SHIELD_HYLIAN, "Bazaar Item 1", "MK Bazaar Item 1", false), - RC_OBJECT(RC_MARKET_BAZAAR_ITEM_2, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BAZAAR, 0x01, GI_BOMBS_5, "Bazaar Item 2", "MK Bazaar Item 2", false), - RC_OBJECT(RC_MARKET_BAZAAR_ITEM_3, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BAZAAR, 0x02, GI_NUTS_5_2, "Bazaar Item 3", "MK Bazaar Item 3", false), - RC_OBJECT(RC_MARKET_BAZAAR_ITEM_4, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BAZAAR, 0x03, GI_HEART, "Bazaar Item 4", "MK Bazaar Item 4", false), - RC_OBJECT(RC_MARKET_BAZAAR_ITEM_5, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BAZAAR, 0x04, GI_ARROWS_SMALL, "Bazaar Item 5", "MK Bazaar Item 5", false), - RC_OBJECT(RC_MARKET_BAZAAR_ITEM_6, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BAZAAR, 0x05, GI_ARROWS_LARGE, "Bazaar Item 6", "MK Bazaar Item 6", false), - RC_OBJECT(RC_MARKET_BAZAAR_ITEM_7, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BAZAAR, 0x06, GI_STICKS_1, "Bazaar Item 7", "MK Bazaar Item 7", false), - RC_OBJECT(RC_MARKET_BAZAAR_ITEM_8, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BAZAAR, 0x07, GI_ARROWS_MEDIUM, "Bazaar Item 8", "MK Bazaar Item 8", false), - RC_OBJECT(RC_TOT_LEFT_CENTER_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_MARKET, ACTOR_EN_GS, SCENE_ID_MAX, 0x00, GI_NONE, "ToT Left Center Gossip Stone", "ToT Left Center Gossip Stone", false), - RC_OBJECT(RC_TOT_LEFT_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_MARKET, ACTOR_EN_GS, SCENE_ID_MAX, 0x00, GI_NONE, "ToT Left Gossip Stone", "ToT Left Gossip Stone", false), - RC_OBJECT(RC_TOT_RIGHT_CENTER_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_MARKET, ACTOR_EN_GS, SCENE_ID_MAX, 0x00, GI_NONE, "ToT Right Center Gossip Stone", "ToT Right Center Gossip Stone", false), - RC_OBJECT(RC_TOT_RIGHT_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_MARKET, ACTOR_EN_GS, SCENE_ID_MAX, 0x00, GI_NONE, "ToT Right Gossip Stone", "ToT Right Gossip Stone", false), - - - RC_OBJECT(RC_HC_MALON_EGG, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, ACTOR_ID_MAX, SCENE_HYRULE_CASTLE, 0x00, GI_NONE, "Malon Egg", "HC Malon Egg", true), - RC_OBJECT(RC_HC_ZELDAS_LETTER, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, ACTOR_ID_MAX, SCENE_CASTLE_COURTYARD_ZELDA, 0x00, GI_LETTER_ZELDA, "Zeldas Letter", "HC Zeldas Letter", true), - RC_OBJECT(RC_OGC_GS, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_CASTLE, ACTOR_EN_SI, SCENE_OUTSIDE_GANONS_CASTLE, 11777, GI_SKULL_TOKEN, "OGC GS", "OGC GS", true), - RC_OBJECT(RC_HC_GS_STORMS_GROTTO, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_CASTLE, ACTOR_EN_SI, SCENE_GROTTOS, 11778, GI_SKULL_TOKEN, "GS Storms Grotto", "HC GS Storms Grotto", true), - RC_OBJECT(RC_HC_GS_TREE, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_CASTLE, ACTOR_EN_SI, SCENE_HYRULE_CASTLE, -29180, GI_SKULL_TOKEN, "GS Tree", "HC GS Tree", true), - RC_OBJECT(RC_HC_GREAT_FAIRY_REWARD, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, ACTOR_BG_DY_YOSEIZO,SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, 2, GI_MAGIC_SMALL, "Great Fairy Reward", "HC Great Fairy Reward", true), - RC_OBJECT(RC_OGC_GREAT_FAIRY_REWARD, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, ACTOR_BG_DY_YOSEIZO,SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 3, GI_NONE, "OGC Great Fairy Reward", "OGC Great Fairy Reward", true), - RC_OBJECT(RC_SONG_FROM_IMPA, RCVORMQ_BOTH, RCTYPE_SONG_LOCATION, RCAREA_HYRULE_CASTLE, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, GI_NONE, "Song from Impa", "Song from Impa", true), - RC_OBJECT(RC_HC_MALON_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_CASTLE, ACTOR_EN_GS, SCENE_HYRULE_CASTLE, 14610, GI_NONE, "Malon Gossip Stone", "HC Malon Gossip Stone", false), - RC_OBJECT(RC_HC_ROCK_WALL_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_CASTLE, ACTOR_EN_GS, SCENE_HYRULE_CASTLE, 14347, GI_NONE, "Rock Wall Gossip Stone", "HC Rock Wall Gossip Stone", false), - RC_OBJECT(RC_HC_STORMS_GROTTO_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_CASTLE, ACTOR_EN_GS, SCENE_GROTTOS, 14355, GI_NONE, "Storms Grotto Gossip Stone", "HC Storms Grotto Gossip Stone", false), - - - RC_OBJECT(RC_KAK_REDEAD_GROTTO_CHEST, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_BOX, SCENE_GROTTOS, 31434, GI_RUPEE_GOLD, "Redead Grotto Chest", "Kak Redead Grotto Chest", false), - RC_OBJECT(RC_KAK_OPEN_GROTTO_CHEST, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_BOX, SCENE_GROTTOS, 22984, GI_RUPEE_RED, "Open Grotto Chest", "Kak Open Grotto Chest", false), - RC_OBJECT(RC_KAK_10_GOLD_SKULLTULA_REWARD, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, ACTOR_ID_MAX, SCENE_HOUSE_OF_SKULLTULA, 0x00, GI_WALLET_ADULT, "10 Gold Skulltula Reward", "Kak 10 Gold Skulltula Reward", true), - RC_OBJECT(RC_KAK_20_GOLD_SKULLTULA_REWARD, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, ACTOR_ID_MAX, SCENE_HOUSE_OF_SKULLTULA, 0x00, GI_STONE_OF_AGONY, "20 Gold Skulltula Reward", "Kak 20 Gold Skulltula Reward", true), - RC_OBJECT(RC_KAK_30_GOLD_SKULLTULA_REWARD, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, ACTOR_ID_MAX, SCENE_HOUSE_OF_SKULLTULA, 0x00, GI_WALLET_GIANT, "30 Gold Skulltula Reward", "Kak 30 Gold Skulltula Reward", true), - RC_OBJECT(RC_KAK_40_GOLD_SKULLTULA_REWARD, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, ACTOR_ID_MAX, SCENE_HOUSE_OF_SKULLTULA, 0x00, GI_BOMBCHUS_10, "40 Gold Skulltula Reward", "Kak 40 Gold Skulltula Reward", false), - RC_OBJECT(RC_KAK_50_GOLD_SKULLTULA_REWARD, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, ACTOR_ID_MAX, SCENE_HOUSE_OF_SKULLTULA, 0x00, GI_HEART_PIECE, "50 Gold Skulltula Reward", "Kak 50 Gold Skulltula Reward", true), - RC_OBJECT(RC_KAK_100_GOLD_SKULLTULA_REWARD, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, ACTOR_ID_MAX, SCENE_HOUSE_OF_SKULLTULA, 0x00, GI_RUPEE_GOLD, "100 Gold Skulltula Reward", "Kak 100 Gold Skulltula Reward", false), - RC_OBJECT(RC_KAK_MAN_ON_ROOF, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, ACTOR_ID_MAX, SCENE_KAKARIKO_VILLAGE, 0x00, GI_HEART_PIECE, "Man on Roof", "Kak Man on Roof", true), - RC_OBJECT(RC_KAK_SHOOTING_GALLERY_REWARD, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, ACTOR_ID_MAX, SCENE_SHOOTING_GALLERY, 0x00, GI_NONE, "Shooting Gallery Reward", "Kak Shooting Gallery Reward", true), - RC_OBJECT(RC_KAK_TRADE_ODD_MUSHROOM, RCVORMQ_BOTH, RCTYPE_ADULT_TRADE, RCAREA_KAKARIKO_VILLAGE, ACTOR_ID_MAX, SCENE_POTION_SHOP_GRANNY, 0x00, GI_ODD_POTION, "Trade Odd Mushroom", "Kak Trade Odd Mushroom", true), - RC_OBJECT(RC_KAK_GRANNYS_SHOP, RCVORMQ_BOTH, RCTYPE_MERCHANT, RCAREA_KAKARIKO_VILLAGE, ACTOR_ID_MAX, SCENE_POTION_SHOP_GRANNY, 0x00, GI_POTION_BLUE, "Granny's Shop", "Kak Granny's Shop", false), - RC_OBJECT(RC_KAK_ANJU_AS_ADULT, RCVORMQ_BOTH, RCTYPE_ADULT_TRADE, RCAREA_KAKARIKO_VILLAGE, ACTOR_ID_MAX, SCENE_KAKARIKO_VILLAGE, 0x00, GI_POCKET_EGG, "Anju as Adult", "Kak Anju as Adult", true), - RC_OBJECT(RC_KAK_ANJU_AS_CHILD, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, ACTOR_ID_MAX, SCENE_KAKARIKO_VILLAGE, 0x00, GI_BOTTLE, "Anju as Child", "Kak Anju as Child", true), - RC_OBJECT(RC_KAK_TRADE_POCKET_CUCCO, RCVORMQ_BOTH, RCTYPE_ADULT_TRADE, RCAREA_KAKARIKO_VILLAGE, ACTOR_ID_MAX, SCENE_KAKARIKO_VILLAGE, 0x00, GI_COJIRO, "Trade Pocket Cucco", "Kak Trade Pocket Cucco", true), - RC_OBJECT(RC_KAK_IMPAS_HOUSE_FREESTANDING_POH, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_ITEM00, SCENE_IMPAS_HOUSE, 262, GI_HEART_PIECE, "Impas House Freestanding PoH", "Kak Impas House Freestanding PoH", true), - RC_OBJECT(RC_KAK_WINDMILL_FREESTANDING_POH, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, 262, GI_HEART_PIECE, "Windmill Freestanding PoH", "Kak Windmill Freestanding PoH", true), - RC_OBJECT(RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_SI, SCENE_KAKARIKO_VILLAGE, 20488, GI_SKULL_TOKEN, "GS House Under Construction", "Kak GS House Under Construction", true), - RC_OBJECT(RC_KAK_GS_SKULLTULA_HOUSE, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_SI, SCENE_KAKARIKO_VILLAGE, 20496, GI_SKULL_TOKEN, "GS Skulltula House", "Kak GS Skulltula House", true), - RC_OBJECT(RC_KAK_GS_GUARDS_HOUSE, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_SI, SCENE_KAKARIKO_VILLAGE, 20482, GI_SKULL_TOKEN, "GS Guards House", "Kak GS Guards House", true), - RC_OBJECT(RC_KAK_GS_TREE, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_SI, SCENE_KAKARIKO_VILLAGE, -28640, GI_SKULL_TOKEN, "GS Tree", "Kak GS Tree", true), - RC_OBJECT(RC_KAK_GS_WATCHTOWER, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_SI, SCENE_KAKARIKO_VILLAGE, 20484, GI_SKULL_TOKEN, "GS Watchtower", "Kak GS Watchtower", true), - RC_OBJECT(RC_KAK_GS_ABOVE_IMPAS_HOUSE, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_SI, SCENE_KAKARIKO_VILLAGE, 20544, GI_SKULL_TOKEN, "GS Above Impas House", "Kak GS Above Impas House", true), - RC_OBJECT(RC_SHEIK_IN_KAKARIKO, RCVORMQ_BOTH, RCTYPE_SONG_LOCATION, RCAREA_KAKARIKO_VILLAGE, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, GI_NONE, "Sheik in Kakariko", "Sheik in Kakariko", true), - RC_OBJECT(RC_SONG_FROM_WINDMILL, RCVORMQ_BOTH, RCTYPE_SONG_LOCATION, RCAREA_KAKARIKO_VILLAGE, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, GI_NONE, "Song from Windmill", "Song from Windmill", true), - RC_OBJECT(RC_KAK_IMPAS_HOUSE_COW, RCVORMQ_BOTH, RCTYPE_COW, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_COW, SCENE_IMPAS_HOUSE, 0x00, GI_MILK, "Impas House Cow", "Kak Impas House Cow", false), - RC_OBJECT(RC_KAK_POTION_SHOP_ITEM_1, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_GIRLA, SCENE_POTION_SHOP_KAKARIKO, 0x00, GI_POTION_GREEN, "Potion Shop Item 1", "Kak Potion Shop Item 1", false), - RC_OBJECT(RC_KAK_POTION_SHOP_ITEM_2, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_GIRLA, SCENE_POTION_SHOP_KAKARIKO, 0x01, GI_BLUE_FIRE, "Potion Shop Item 2", "Kak Potion Shop Item 2", false), - RC_OBJECT(RC_KAK_POTION_SHOP_ITEM_3, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_GIRLA, SCENE_POTION_SHOP_KAKARIKO, 0x02, GI_POTION_RED, "Potion Shop Item 3", "Kak Potion Shop Item 3", false), - RC_OBJECT(RC_KAK_POTION_SHOP_ITEM_4, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_GIRLA, SCENE_POTION_SHOP_KAKARIKO, 0x03, GI_FAIRY, "Potion Shop Item 4", "Kak Potion Shop Item 4", false), - RC_OBJECT(RC_KAK_POTION_SHOP_ITEM_5, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_GIRLA, SCENE_POTION_SHOP_KAKARIKO, 0x04, GI_NUTS_5_2, "Potion Shop Item 5", "Kak Potion Shop Item 5", false), - RC_OBJECT(RC_KAK_POTION_SHOP_ITEM_6, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_GIRLA, SCENE_POTION_SHOP_KAKARIKO, 0x05, GI_BUGS, "Potion Shop Item 6", "Kak Potion Shop Item 6", false), - RC_OBJECT(RC_KAK_POTION_SHOP_ITEM_7, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_GIRLA, SCENE_POTION_SHOP_KAKARIKO, 0x06, GI_POE, "Potion Shop Item 7", "Kak Potion Shop Item 7", false), - RC_OBJECT(RC_KAK_POTION_SHOP_ITEM_8, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_GIRLA, SCENE_POTION_SHOP_KAKARIKO, 0x07, GI_FISH, "Potion Shop Item 8", "Kak Potion Shop Item 8", false), - RC_OBJECT(RC_KAK_BAZAAR_ITEM_1, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_GIRLA, SCENE_TEST01, 0x00, GI_SHIELD_HYLIAN, "Bazaar Item 1", "Kak Bazaar Item 1", false), - RC_OBJECT(RC_KAK_BAZAAR_ITEM_2, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_GIRLA, SCENE_TEST01, 0x01, GI_BOMBS_5, "Bazaar Item 2", "Kak Bazaar Item 2", false), - RC_OBJECT(RC_KAK_BAZAAR_ITEM_3, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_GIRLA, SCENE_TEST01, 0x02, GI_NUTS_5_2, "Bazaar Item 3", "Kak Bazaar Item 3", false), - RC_OBJECT(RC_KAK_BAZAAR_ITEM_4, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_GIRLA, SCENE_TEST01, 0x03, GI_HEART, "Bazaar Item 4", "Kak Bazaar Item 4", false), - RC_OBJECT(RC_KAK_BAZAAR_ITEM_5, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_GIRLA, SCENE_TEST01, 0x04, GI_ARROWS_SMALL, "Bazaar Item 5", "Kak Bazaar Item 5", false), - RC_OBJECT(RC_KAK_BAZAAR_ITEM_6, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_GIRLA, SCENE_TEST01, 0x05, GI_ARROWS_LARGE, "Bazaar Item 6", "Kak Bazaar Item 6", false), - RC_OBJECT(RC_KAK_BAZAAR_ITEM_7, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_GIRLA, SCENE_TEST01, 0x06, GI_STICKS_1, "Bazaar Item 7", "Kak Bazaar Item 7", false), - RC_OBJECT(RC_KAK_BAZAAR_ITEM_8, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_GIRLA, SCENE_TEST01, 0x07, GI_ARROWS_MEDIUM, "Bazaar Item 8", "Kak Bazaar Item 8", false), - RC_OBJECT(RC_KAK_OPEN_GROTTO_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_GS, SCENE_GROTTOS, -22984, GI_NONE, "Open Grotto Gossip Stone", "Kak Open Grotto Gossip Stone", false), - - - RC_OBJECT(RC_GRAVEYARD_SHIELD_GRAVE_CHEST, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_GRAVEYARD, ACTOR_EN_BOX, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 21824, GI_SHIELD_HYLIAN, "Shield Grave Chest", "GY Shield Grave Chest", false), - RC_OBJECT(RC_GRAVEYARD_HEART_PIECE_GRAVE_CHEST, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_GRAVEYARD, ACTOR_EN_BOX, SCENE_REDEAD_GRAVE, -22592, GI_HEART_PIECE, "Heart Piece Grave Chest", "GY Heart Piece Grave Chest", true), - RC_OBJECT(RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_GRAVEYARD, ACTOR_EN_BOX, SCENE_ROYAL_FAMILYS_TOMB, -32736, GI_BOMBS_5, "Composers Grave Chest", "GY Composers Grave Chest", false), - RC_OBJECT(RC_GRAVEYARD_HOOKSHOT_CHEST, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_GRAVEYARD, ACTOR_EN_BOX, SCENE_WINDMILL_AND_DAMPES_GRAVE, 4352, GI_HOOKSHOT, "Hookshot Chest", "GY Hookshot Chest", true), - RC_OBJECT(RC_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, 1798, GI_HEART_PIECE, "Dampe Race Freestanding PoH", "GY Dampe Race Freestanding PoH", true), - RC_OBJECT(RC_GRAVEYARD_FREESTANDING_POH, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_GRAVEYARD, 1030, GI_HEART_PIECE, "Freestanding PoH", "GY Freestanding PoH", true), - RC_OBJECT(RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_GRAVEYARD, 7942, GI_HEART_PIECE, "Dampe Gravedigging Tour", "GY Dampe Gravedigging Tour", true), - RC_OBJECT(RC_GRAVEYARD_GS_WALL, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_GRAVEYARD, ACTOR_EN_SI, SCENE_GRAVEYARD, 20608, GI_SKULL_TOKEN, "GS Wall", "Graveyard GS Wall", true), - RC_OBJECT(RC_GRAVEYARD_GS_BEAN_PATCH, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_GRAVEYARD, ACTOR_EN_SI, SCENE_GRAVEYARD, 28673, GI_SKULL_TOKEN, "GS Bean Patch", "Graveyard GS Bean Patch", true), - RC_OBJECT(RC_SONG_FROM_ROYAL_FAMILYS_TOMB, RCVORMQ_BOTH, RCTYPE_SONG_LOCATION, RCAREA_GRAVEYARD, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, GI_NONE, "Song from Composers Grave", "Song from Composers Grave", true), - RC_OBJECT(RC_GY_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_GRAVEYARD, ACTOR_EN_GS, SCENE_GRAVEYARD, 14346, GI_NONE, "Gossip Stone", "GY Gossip Stone", false), - - - RC_OBJECT(RC_DMT_CHEST, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_BOX, SCENE_DEATH_MOUNTAIN_TRAIL, 23201, GI_RUPEE_PURPLE, "Chest", "DMT Chest", false), - RC_OBJECT(RC_DMT_STORMS_GROTTO_CHEST, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_BOX, SCENE_GROTTOS, 23255, GI_RUPEE_GOLD, "Storms Grotto Chest", "DMT Storms Grotto Chest", false), - RC_OBJECT(RC_DMT_TRADE_BROKEN_SWORD, RCVORMQ_BOTH, RCTYPE_ADULT_TRADE, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_ID_MAX, SCENE_DEATH_MOUNTAIN_TRAIL, 0x00, GI_NONE, "Trade Broken Sword", "DMT Trade Broken Sword", true), - RC_OBJECT(RC_DMT_TRADE_EYEDROPS, RCVORMQ_BOTH, RCTYPE_ADULT_TRADE, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_ID_MAX, SCENE_DEATH_MOUNTAIN_TRAIL, 0x00, GI_NONE, "Trade Eyedrops", "DMT Trade Eyedrops", true), - RC_OBJECT(RC_DMT_TRADE_CLAIM_CHECK, RCVORMQ_BOTH, RCTYPE_ADULT_TRADE, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_ID_MAX, SCENE_DEATH_MOUNTAIN_TRAIL, 0x00, GI_NONE, "Trade Claim Check", "DMT Trade Claim Check", true), - RC_OBJECT(RC_DMT_FREESTANDING_POH, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_TRAIL, 7686, GI_HEART_PIECE, "Freestanding PoH", "DMT Freestanding PoH", true), - RC_OBJECT(RC_DMT_GS_BEAN_PATCH, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_SI, SCENE_DEATH_MOUNTAIN_TRAIL, 28418, GI_SKULL_TOKEN, "GS Bean Patch", "DMT GS Bean Patch", true), - RC_OBJECT(RC_DMT_GS_NEAR_KAK, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_SI, SCENE_DEATH_MOUNTAIN_TRAIL, 12036, GI_SKULL_TOKEN, "GS Near Kak", "DMT GS Near Kak", true), - RC_OBJECT(RC_DMT_GS_ABOVE_DODONGOS_CAVERN, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_SI, SCENE_DEATH_MOUNTAIN_TRAIL, 20232, GI_SKULL_TOKEN, "GS Above Dodongos Cavern", "DMT GS Above Dodongos Cavern", true), - RC_OBJECT(RC_DMT_GS_FALLING_ROCKS_PATH, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_SI, SCENE_DEATH_MOUNTAIN_TRAIL, 20240, GI_SKULL_TOKEN, "GS Falling Rocks Path", "DMT GS Falling Rocks Path", true), - RC_OBJECT(RC_DMT_GREAT_FAIRY_REWARD, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_BG_DY_YOSEIZO,SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 1, GI_NONE, "Great Fairy Reward", "DMT Great Fairy Reward", true), - RC_OBJECT(RC_DMT_COW_GROTTO_COW, RCVORMQ_BOTH, RCTYPE_COW, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_COW, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2444,-471), GI_MILK, "Cow Grotto Cow", "DMT Cow Grotto Cow", false), - RC_OBJECT(RC_DMT_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_GS, SCENE_DEATH_MOUNTAIN_TRAIL, 14340, GI_NONE, "Gossip Stone", "DMT Gossip Stone", false), - RC_OBJECT(RC_DMT_STORMS_GROTTO_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_GS, SCENE_GROTTOS, -23255, GI_NONE, "Storms Grotto Gossip Stone", "DMT Storms Grotto Gossip Stone", false), - - - RC_OBJECT(RC_GC_MAZE_LEFT_CHEST, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_GORON_CITY, ACTOR_EN_BOX, SCENE_GORON_CITY, 23232, GI_RUPEE_GOLD, "Maze Left Chest", "GC Maze Left Chest", false), - RC_OBJECT(RC_GC_MAZE_RIGHT_CHEST, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_GORON_CITY, ACTOR_EN_BOX, SCENE_GORON_CITY, 23201, GI_RUPEE_PURPLE, "Maze Right Chest", "GC Maze Right Chest", false), - RC_OBJECT(RC_GC_MAZE_CENTER_CHEST, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_GORON_CITY, ACTOR_EN_BOX, SCENE_GORON_CITY, 23202, GI_RUPEE_PURPLE, "Maze Center Chest", "GC Maze Center Chest", false), - RC_OBJECT(RC_GC_ROLLING_GORON_AS_CHILD, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_GORON_CITY, ACTOR_ID_MAX, SCENE_GORON_CITY, 0x00, GI_NONE, "Rolling Goron as Child", "GC Rolling Goron as Child", true), - RC_OBJECT(RC_GC_ROLLING_GORON_AS_ADULT, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_GORON_CITY, ACTOR_ID_MAX, SCENE_GORON_CITY, 0x00, GI_NONE, "Rolling Goron as Adult", "GC Rolling Goron as Adult", true), - RC_OBJECT(RC_GC_DARUNIAS_JOY, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_GORON_CITY, ACTOR_ID_MAX, SCENE_GORON_CITY, 0x00, GI_NONE, "Darunias Joy", "GC Darunias Joy", true), - RC_OBJECT(RC_GC_POT_FREESTANDING_POH, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_GORON_CITY, ACTOR_EN_ITEM00, SCENE_GORON_CITY, 7942, GI_HEART_PIECE, "Pot Freestanding PoH", "GC Pot Freestanding PoH", true), - RC_OBJECT(RC_GC_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_BOTH, RCTYPE_SCRUB, RCAREA_GORON_CITY, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x00,0xFB), GI_NUTS_5_2, "Deku Scrub Grotto Left", "GC Deku Scrub Grotto Left", false), - RC_OBJECT(RC_GC_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_BOTH, RCTYPE_SCRUB, RCAREA_GORON_CITY, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x05,0xFB), GI_BOMBS_5, "Deku Scrub Grotto Right", "GC Deku Scrub Grotto Right", false), - RC_OBJECT(RC_GC_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_BOTH, RCTYPE_SCRUB, RCAREA_GORON_CITY, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x03,0xFB), GI_SEEDS_30, "Deku Scrub Grotto Center", "GC Deku Scrub Grotto Center", false), - RC_OBJECT(RC_GC_MEDIGORON, RCVORMQ_BOTH, RCTYPE_MERCHANT, RCAREA_GORON_CITY, ACTOR_ID_MAX, SCENE_GORON_CITY, 0x00, GI_NONE, "Medigoron", "GC Medigoron", false), - RC_OBJECT(RC_GC_GS_CENTER_PLATFORM, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_GORON_CITY, ACTOR_EN_SI, SCENE_GORON_CITY, 12064, GI_SKULL_TOKEN, "GS Center Platform", "GC GS Center Platform", true), - RC_OBJECT(RC_GC_GS_BOULDER_MAZE, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_GORON_CITY, ACTOR_EN_SI, SCENE_GORON_CITY, -28864, GI_SKULL_TOKEN, "GS Boulder Maze", "GC GS Boulder Maze", true), - RC_OBJECT(RC_GC_SHOP_ITEM_1, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_GORON_CITY, ACTOR_EN_GIRLA, SCENE_GORON_SHOP, 0x00, GI_BOMBS_5, "Shop Item 1", "GC Shop Item 1", false), - RC_OBJECT(RC_GC_SHOP_ITEM_2, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_GORON_CITY, ACTOR_EN_GIRLA, SCENE_GORON_SHOP, 0x01, GI_BOMBS_10, "Shop Item 2", "GC Shop Item 2", false), - RC_OBJECT(RC_GC_SHOP_ITEM_3, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_GORON_CITY, ACTOR_EN_GIRLA, SCENE_GORON_SHOP, 0x02, GI_BOMBS_20, "Shop Item 3", "GC Shop Item 3", false), - RC_OBJECT(RC_GC_SHOP_ITEM_4, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_GORON_CITY, ACTOR_EN_GIRLA, SCENE_GORON_SHOP, 0x03, GI_BOMBS_30, "Shop Item 4", "GC Shop Item 4", false), - RC_OBJECT(RC_GC_SHOP_ITEM_5, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_GORON_CITY, ACTOR_EN_GIRLA, SCENE_GORON_SHOP, 0x04, GI_TUNIC_GORON, "Shop Item 5", "GC Shop Item 5", false), - RC_OBJECT(RC_GC_SHOP_ITEM_6, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_GORON_CITY, ACTOR_EN_GIRLA, SCENE_GORON_SHOP, 0x05, GI_HEART, "Shop Item 6", "GC Shop Item 6", false), - RC_OBJECT(RC_GC_SHOP_ITEM_7, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_GORON_CITY, ACTOR_EN_GIRLA, SCENE_GORON_SHOP, 0x06, GI_POTION_RED, "Shop Item 7", "GC Shop Item 7", false), - RC_OBJECT(RC_GC_SHOP_ITEM_8, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_GORON_CITY, ACTOR_EN_GIRLA, SCENE_GORON_SHOP, 0x07, GI_HEART, "Shop Item 8", "GC Shop Item 8", false), - RC_OBJECT(RC_GC_MAZE_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_GORON_CITY, ACTOR_EN_GS, SCENE_GORON_CITY, 14357, GI_NONE, "Maze Gossip Stone", "GC Maze Gossip Stone", false), - RC_OBJECT(RC_GC_MEDIGORON_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_GORON_CITY, ACTOR_EN_GS, SCENE_GORON_CITY, 14873, GI_NONE, "Medigoron Gossip Stone", "GC Medigoron Gossip Stone", false), - - - RC_OBJECT(RC_DMC_UPPER_GROTTO_CHEST, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_BOX, SCENE_GROTTOS, 23802, GI_BOMBS_20, "Upper Grotto Chest", "DMC Upper Grotto Chest", false), - RC_OBJECT(RC_DMC_WALL_FREESTANDING_POH, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, 518, GI_HEART_PIECE, "Wall Freestanding PoH", "DMC Wall Freestanding PoH", true), - RC_OBJECT(RC_DMC_VOLCANO_FREESTANDING_POH, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, 2054, GI_HEART_PIECE, "Volcano Freestanding PoH", "DMC Volcano Freestanding PoH", true), - RC_OBJECT(RC_DMC_DEKU_SCRUB, RCVORMQ_BOTH, RCTYPE_SCRUB, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_DNS, SCENE_DEATH_MOUNTAIN_CRATER, 0x05, GI_BOMBS_5, "Deku Scrub", "DMC Deku Scrub", false), - RC_OBJECT(RC_DMC_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_BOTH, RCTYPE_SCRUB, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x00,0xF9), GI_NUTS_5_2, "Deku Scrub Grotto Left", "DMC Deku Scrub Grotto Left", false), - RC_OBJECT(RC_DMC_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_BOTH, RCTYPE_SCRUB, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x05,0xF9), GI_BOMBS_5, "Deku Scrub Grotto Right", "DMC Deku Scrub Grotto Right", false), - RC_OBJECT(RC_DMC_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_BOTH, RCTYPE_SCRUB, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x03,0xF9), GI_SEEDS_30, "Deku Scrub Grotto Center", "DMC Deku Scrub Grotto Center", false), - RC_OBJECT(RC_DMC_GS_BEAN_PATCH, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_SI, SCENE_DEATH_MOUNTAIN_CRATER, 28417, GI_SKULL_TOKEN, "GS Bean Patch", "DMC GS Bean Patch", true), - RC_OBJECT(RC_DMC_GS_CRATE, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_SI, SCENE_DEATH_MOUNTAIN_CRATER, -28800, GI_SKULL_TOKEN, "GS Crate", "DMC GS Crate", true), - RC_OBJECT(RC_DMC_GREAT_FAIRY_REWARD, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_BG_DY_YOSEIZO,SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 2, GI_NONE, "Great Fairy Reward", "DMC Great Fairy Reward", true), - RC_OBJECT(RC_SHEIK_IN_CRATER, RCVORMQ_BOTH, RCTYPE_SONG_LOCATION, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, GI_NONE, "Sheik in Crater", "Sheik in Crater", true), - RC_OBJECT(RC_DMC_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_GS, SCENE_DEATH_MOUNTAIN_CRATER, 14341, GI_NONE, "Gossip Stone", "DMC Gossip Stone", false), - RC_OBJECT(RC_DMC_UPPER_GROTTO_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_GS, SCENE_GROTTOS, -23802, GI_NONE, "Upper Grotto Gossip Stone", "DMC Upper Grotto Gossip Stone", false), - - - RC_OBJECT(RC_ZR_OPEN_GROTTO_CHEST, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, ACTOR_EN_BOX, SCENE_GROTTOS, 22985, GI_RUPEE_RED, "Open Grotto Chest", "ZR Open Grotto Chest", false), - RC_OBJECT(RC_ZR_MAGIC_BEAN_SALESMAN, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, ACTOR_ID_MAX, SCENE_ZORAS_RIVER, 0x00, GI_NONE, "Magic Bean Salesman", "ZR Magic Bean Salesman", true), - RC_OBJECT(RC_ZR_FROGS_ZELDAS_LULLABY, RCVORMQ_BOTH, RCTYPE_FROG_SONG, RCAREA_ZORAS_RIVER, ACTOR_EN_FR, SCENE_ZORAS_RIVER, 0x00, GI_NONE, "Frogs Zelda's Lullaby", "ZR Frogs Zelda's Lullaby", false), - RC_OBJECT(RC_ZR_FROGS_EPONAS_SONG, RCVORMQ_BOTH, RCTYPE_FROG_SONG, RCAREA_ZORAS_RIVER, ACTOR_EN_FR, SCENE_ZORAS_RIVER, 0x00, GI_NONE, "Frogs Epona's Song", "ZR Frogs Epona's Song", false), - RC_OBJECT(RC_ZR_FROGS_SARIAS_SONG, RCVORMQ_BOTH, RCTYPE_FROG_SONG, RCAREA_ZORAS_RIVER, ACTOR_EN_FR, SCENE_ZORAS_RIVER, 0x00, GI_NONE, "Frogs Saria's Song", "ZR Frogs Saria's Song", false), - RC_OBJECT(RC_ZR_FROGS_SUNS_SONG, RCVORMQ_BOTH, RCTYPE_FROG_SONG, RCAREA_ZORAS_RIVER, ACTOR_EN_FR, SCENE_ZORAS_RIVER, 0x00, GI_NONE, "Frogs Sun's Song", "ZR Frogs Sun's Song", false), - RC_OBJECT(RC_ZR_FROGS_SONG_OF_TIME, RCVORMQ_BOTH, RCTYPE_FROG_SONG, RCAREA_ZORAS_RIVER, ACTOR_EN_FR, SCENE_ZORAS_RIVER, 0x00, GI_NONE, "Frogs Song of Time", "ZR Frogs Song of Time", false), - RC_OBJECT(RC_ZR_FROGS_IN_THE_RAIN, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, ACTOR_EN_FR, SCENE_ZORAS_RIVER, 0x00, GI_HEART_PIECE, "Frogs in the Rain", "ZR Frogs in the Rain", true), - RC_OBJECT(RC_ZR_FROGS_OCARINA_GAME, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, ACTOR_EN_FR, SCENE_ZORAS_RIVER, 0x00, GI_HEART_PIECE, "Frogs Ocarina Game", "ZR Frogs Ocarina Game", true), - RC_OBJECT(RC_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, ACTOR_EN_ITEM00, SCENE_ZORAS_RIVER, 1030, GI_HEART_PIECE, "Near Open Grotto Freestanding PoH", "ZR Near Open Grotto Freestanding PoH", true), - RC_OBJECT(RC_ZR_NEAR_DOMAIN_FREESTANDING_POH, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, ACTOR_EN_ITEM00, SCENE_ZORAS_RIVER, 2822, GI_HEART_PIECE, "Near Domain Freestanding PoH", "ZR Near Domain Freestanding PoH", true), - RC_OBJECT(RC_ZR_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_BOTH, RCTYPE_SCRUB, RCAREA_ZORAS_RIVER, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x07,0xEB), GI_POTION_RED, "Deku Scrub Grotto Rear", "ZR Deku Scrub Grotto Rear", false), - RC_OBJECT(RC_ZR_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_BOTH, RCTYPE_SCRUB, RCAREA_ZORAS_RIVER, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x08,0xEB), GI_POTION_GREEN, "Deku Scrub Grotto Front", "ZR Deku Scrub Grotto Front", false), - RC_OBJECT(RC_ZR_GS_LADDER, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_RIVER, ACTOR_EN_SI, SCENE_ZORAS_RIVER, 20737, GI_SKULL_TOKEN, "GS Ladder", "ZR GS Ladder", true), - RC_OBJECT(RC_ZR_GS_TREE, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_RIVER, ACTOR_EN_SI, SCENE_ZORAS_RIVER, -28414, GI_SKULL_TOKEN, "GS Tree", "ZR GS Tree", true), - RC_OBJECT(RC_ZR_GS_ABOVE_BRIDGE, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_RIVER, ACTOR_EN_SI, SCENE_ZORAS_RIVER, 20744, GI_SKULL_TOKEN, "GS Above Bridge", "ZR GS Above Bridge", true), - RC_OBJECT(RC_ZR_GS_NEAR_RAISED_GROTTOS, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_RIVER, ACTOR_EN_SI, SCENE_ZORAS_RIVER, 20752, GI_SKULL_TOKEN, "GS Near Raised Grottos", "ZR GS Near Raised Grottos", true), - RC_OBJECT(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_RIVER, ACTOR_EN_GS, SCENE_ZORAS_RIVER, 14860, GI_NONE, "Near Domain Gossip Stone", "ZR Near Domain Gossip Stone", false), - RC_OBJECT(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_RIVER, ACTOR_EN_GS, SCENE_ZORAS_RIVER, 14605, GI_NONE, "Near Grottos Gossip Stone", "ZR Near Grottos Gossip Stone", false), - RC_OBJECT(RC_ZR_OPEN_GROTTO_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_RIVER, ACTOR_EN_GS, SCENE_GROTTOS, -22985, GI_NONE, "Open Grotto Gossip Stone", "ZR Open Grotto Gossip Stone", false), - - - RC_OBJECT(RC_ZD_CHEST, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, ACTOR_EN_BOX, SCENE_ZORAS_DOMAIN, -18496, GI_HEART_PIECE, "Chest", "ZD Chest", true), - RC_OBJECT(RC_ZD_DIVING_MINIGAME, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, ACTOR_ID_MAX, SCENE_ZORAS_DOMAIN, 0x00, GI_NONE, "Diving Minigame", "ZD Diving Minigame", true), - RC_OBJECT(RC_ZD_KING_ZORA_THAWED, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, ACTOR_ID_MAX, SCENE_ZORAS_DOMAIN, 0x00, GI_NONE, "King Zora Thawed", "ZD King Zora Thawed", true), - RC_OBJECT(RC_ZD_TRADE_PRESCRIPTION, RCVORMQ_BOTH, RCTYPE_ADULT_TRADE, RCAREA_ZORAS_DOMAIN, ACTOR_ID_MAX, SCENE_ZORAS_DOMAIN, 0x00, GI_NONE, "Trade Prescription", "ZD Trade Prescription", true), - RC_OBJECT(RC_ZD_GS_FROZEN_WATERFALL, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_DOMAIN, ACTOR_EN_SI, SCENE_ZORAS_DOMAIN, 20800, GI_SKULL_TOKEN, "GS Frozen Waterfall", "ZD GS Frozen Waterfall", true), - RC_OBJECT(RC_ZD_SHOP_ITEM_1, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, ACTOR_EN_GIRLA, SCENE_ZORA_SHOP, 0x00, GI_TUNIC_ZORA, "Shop Item 1", "ZD Shop Item 1", false), - RC_OBJECT(RC_ZD_SHOP_ITEM_2, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, ACTOR_EN_GIRLA, SCENE_ZORA_SHOP, 0x01, GI_ARROWS_SMALL, "Shop Item 2", "ZD Shop Item 2", false), - RC_OBJECT(RC_ZD_SHOP_ITEM_3, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, ACTOR_EN_GIRLA, SCENE_ZORA_SHOP, 0x02, GI_HEART, "Shop Item 3", "ZD Shop Item 3", false), - RC_OBJECT(RC_ZD_SHOP_ITEM_4, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, ACTOR_EN_GIRLA, SCENE_ZORA_SHOP, 0x03, GI_ARROWS_MEDIUM, "Shop Item 4", "ZD Shop Item 4", false), - RC_OBJECT(RC_ZD_SHOP_ITEM_5, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, ACTOR_EN_GIRLA, SCENE_ZORA_SHOP, 0x04, GI_NUTS_5_2, "Shop Item 5", "ZD Shop Item 5", false), - RC_OBJECT(RC_ZD_SHOP_ITEM_6, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, ACTOR_EN_GIRLA, SCENE_ZORA_SHOP, 0x05, GI_ARROWS_LARGE, "Shop Item 6", "ZD Shop Item 6", false), - RC_OBJECT(RC_ZD_SHOP_ITEM_7, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, ACTOR_EN_GIRLA, SCENE_ZORA_SHOP, 0x06, GI_FISH, "Shop Item 7", "ZD Shop Item 7", false), - RC_OBJECT(RC_ZD_SHOP_ITEM_8, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, ACTOR_EN_GIRLA, SCENE_ZORA_SHOP, 0x07, GI_POTION_RED, "Shop Item 8", "ZD Shop Item 8", false), - RC_OBJECT(RC_ZD_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_DOMAIN, ACTOR_EN_GS, SCENE_ZORAS_DOMAIN, 14345, GI_NONE, "Gossip Stone", "ZD Gossip Stone", false), - - - RC_OBJECT(RC_ZF_ICEBERC_FREESTANDING_POH, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 262, GI_HEART_PIECE, "Iceberg Freestanding PoH", "ZF Iceberg Freestanding PoH", true), - RC_OBJECT(RC_ZF_BOTTOM_FREESTANDING_POH, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 5126, GI_HEART_PIECE, "Bottom Freestanding PoH", "ZF Bottom Freestanding PoH", true), - RC_OBJECT(RC_ZF_GS_ABOVE_THE_LOG, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_SI, SCENE_ZORAS_FOUNTAIN, 20740, GI_SKULL_TOKEN, "GS Above The Log", "ZF GS Above The Log", true), - RC_OBJECT(RC_ZF_GS_HIDDEN_CAVE, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_SI, SCENE_ZORAS_FOUNTAIN, 20768, GI_SKULL_TOKEN, "GS Hidden Cave", "ZF GS Hidden Cave", true), - RC_OBJECT(RC_ZF_GS_TREE, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_SI, SCENE_ZORAS_FOUNTAIN, -28288, GI_SKULL_TOKEN, "GS Tree", "ZF GS Tree", true), - RC_OBJECT(RC_ZF_GREAT_FAIRY_REWARD, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_ZORAS_FOUNTAIN, ACTOR_BG_DY_YOSEIZO,SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, 1, GI_NONE, "Great Fairy Reward", "ZF Great Fairy Reward", true), - RC_OBJECT(RC_FAIRY_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_GS, SCENE_ZORAS_FOUNTAIN, 0x00, GI_NONE, "Fairy Gossip Stone", "Fairy Gossip Stone", false), - RC_OBJECT(RC_JABU_GOSSIP_STONE, RCVORMQ_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_GS, SCENE_ZORAS_FOUNTAIN, 0x00, GI_NONE, "Jabu Gossip Stone", "Jabu Gossip Stone", false), - - - RC_OBJECT(RC_LLR_TALONS_CHICKENS, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, ACTOR_ID_MAX, SCENE_LON_LON_BUILDINGS, 0x00, GI_NONE, "Talons Chickens", "LLR Talons Chickens", true), - RC_OBJECT(RC_LLR_FREESTANDING_POH, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, ACTOR_EN_ITEM00, SCENE_LON_LON_BUILDINGS, 262, GI_HEART_PIECE, "Freestanding PoH", "LLR Freestanding PoH", true), - RC_OBJECT(RC_LLR_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_BOTH, RCTYPE_SCRUB, RCAREA_LON_LON_RANCH, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x00,0xFC), GI_NUTS_5_2, "Deku Scrub Grotto Left", "LLR Deku Scrub Grotto Left", false), - RC_OBJECT(RC_LLR_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_BOTH, RCTYPE_SCRUB, RCAREA_LON_LON_RANCH, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x05,0xFC), GI_BOMBS_5, "Deku Scrub Grotto Right", "LLR Deku Scrub Grotto Right", false), - RC_OBJECT(RC_LLR_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_BOTH, RCTYPE_SCRUB, RCAREA_LON_LON_RANCH, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x03,0xFC), GI_SEEDS_30, "Deku Scrub Grotto Center", "LLR Deku Scrub Grotto Center", false), - RC_OBJECT(RC_LLR_GS_BACK_WALL, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_LON_LON_RANCH, ACTOR_EN_SI, SCENE_LON_LON_RANCH, 11009, GI_SKULL_TOKEN, "GS Back Wall", "LLR GS Back Wall", true), - RC_OBJECT(RC_LLR_GS_RAIN_SHED, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_LON_LON_RANCH, ACTOR_EN_SI, SCENE_LON_LON_RANCH, 11010, GI_SKULL_TOKEN, "GS Rain Shed", "LLR GS Rain Shed", true), - RC_OBJECT(RC_LLR_GS_HOUSE_WINDOW, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_LON_LON_RANCH, ACTOR_EN_SI, SCENE_LON_LON_RANCH, 11012, GI_SKULL_TOKEN, "GS House Window", "LLR GS House Window", true), - RC_OBJECT(RC_LLR_GS_TREE, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_LON_LON_RANCH, ACTOR_EN_SI, SCENE_LON_LON_RANCH, -29944, GI_SKULL_TOKEN, "GS Tree", "LLR GS Tree", true), - RC_OBJECT(RC_SONG_FROM_MALON, RCVORMQ_BOTH, RCTYPE_SONG_LOCATION, RCAREA_LON_LON_RANCH, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, GI_NONE, "Song from Malon", "Song from Malon", true), - RC_OBJECT(RC_LLR_STABLES_LEFT_COW, RCVORMQ_BOTH, RCTYPE_COW, RCAREA_LON_LON_RANCH, ACTOR_EN_COW, SCENE_STABLE, TWO_ACTOR_PARAMS(-122,-254), GI_MILK, "Stables Left Cow", "LLR Stables Left Cow", false), - RC_OBJECT(RC_LLR_STABLES_RIGHT_COW, RCVORMQ_BOTH, RCTYPE_COW, RCAREA_LON_LON_RANCH, ACTOR_EN_COW, SCENE_STABLE, TWO_ACTOR_PARAMS(116,-254), GI_MILK, "Stables Right Cow", "LLR Stables Right Cow", false), - RC_OBJECT(RC_LLR_TOWER_LEFT_COW, RCVORMQ_BOTH, RCTYPE_COW, RCAREA_LON_LON_RANCH, ACTOR_EN_COW, SCENE_LON_LON_BUILDINGS, TWO_ACTOR_PARAMS(-229,157), GI_MILK, "Tower Left Cow", "LLR Tower Left Cow", false), - RC_OBJECT(RC_LLR_TOWER_RIGHT_COW, RCVORMQ_BOTH, RCTYPE_COW, RCAREA_LON_LON_RANCH, ACTOR_EN_COW, SCENE_LON_LON_BUILDINGS, TWO_ACTOR_PARAMS(-142,-140), GI_MILK, "Tower Right Cow", "LLR Tower Right Cow", false), - - - RC_OBJECT(RC_DEKU_TREE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_DEKU_TREE, ACTOR_EN_BOX, SCENE_DEKU_TREE, 2083, GI_MAP, "Map Chest", "Deku Tree Map Chest", true), - RC_OBJECT(RC_DEKU_TREE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_DEKU_TREE, ACTOR_EN_BOX, SCENE_DEKU_TREE, 2050, GI_COMPASS, "Compass Chest", "Deku Tree Compass Chest", true), - RC_OBJECT(RC_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, ACTOR_EN_BOX, SCENE_DEKU_TREE, 22790, GI_HEART, "Compass Room Side Chest", "Deku Tree Compass Room Side Chest", false), - RC_OBJECT(RC_DEKU_TREE_BASEMENT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, ACTOR_EN_BOX, SCENE_DEKU_TREE, 22788, GI_HEART, "Basement Chest", "Deku Tree Basement Chest", false), - RC_OBJECT(RC_DEKU_TREE_SLINGSHOT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, ACTOR_EN_BOX, SCENE_DEKU_TREE, 161, GI_SLINGSHOT, "Slingshot Chest", "Deku Tree Slingshot Chest", true), - RC_OBJECT(RC_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, ACTOR_EN_BOX, SCENE_DEKU_TREE, 22789, GI_HEART, "Slingshot Room Side Chest", "Deku Tree Slingshot Room Side Chest", false), - RC_OBJECT(RC_DEKU_TREE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_DEKU_TREE, ACTOR_EN_BOX, SCENE_DEKU_TREE, 2083, GI_MAP, "MQ Map Chest", "Deku Tree MQ Map Chest", true), - RC_OBJECT(RC_DEKU_TREE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_DEKU_TREE, ACTOR_EN_BOX, SCENE_DEKU_TREE, 2049, GI_COMPASS, "MQ Compass Chest", "Deku Tree MQ Compass Chest", true), - RC_OBJECT(RC_DEKU_TREE_MQ_SLINGSHOT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, ACTOR_EN_BOX, SCENE_DEKU_TREE, 4262, GI_SLINGSHOT, "MQ Slingshot Chest", "Deku Tree MQ Slingshot Chest", true), - RC_OBJECT(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, ACTOR_EN_BOX, SCENE_DEKU_TREE, -31454, GI_SHIELD_DEKU, "MQ Slingshot Room Back Chest", "Deku Tree MQ Slingshot Room Back Chest", false), - RC_OBJECT(RC_DEKU_TREE_MQ_BASEMENT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, ACTOR_EN_BOX, SCENE_DEKU_TREE, -31452, GI_SHIELD_DEKU, "MQ Basement Chest", "Deku Tree MQ Basement Chest", false), - RC_OBJECT(RC_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, ACTOR_EN_BOX, SCENE_DEKU_TREE, 22789, GI_HEART, "MQ Before Spinning Log Chest", "Deku Tree MQ Before Spinning Log Chest", false), - RC_OBJECT(RC_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, ACTOR_EN_BOX, SCENE_DEKU_TREE, 23200, GI_RUPEE_PURPLE, "MQ After Spinning Log Chest", "Deku Tree MQ After Spinning Log Chest", false), - RC_OBJECT(RC_DEKU_TREE_MQ_DEKU_SCRUB, RCVORMQ_MQ, RCTYPE_SCRUB, RCAREA_DEKU_TREE, ACTOR_EN_DNS, SCENE_DEKU_TREE, 0x04, GI_SHIELD_DEKU, "MQ Deku Scrub", "Deku Tree MQ Deku Scrub", false), - RC_OBJECT(RC_DEKU_TREE_GS_BASEMENT_BACK_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, ACTOR_EN_SI, SCENE_DEKU_TREE, 8193, GI_SKULL_TOKEN, "GS Basement Back Room", "Deku Tree GS Basement Back Room", true), - RC_OBJECT(RC_DEKU_TREE_GS_BASEMENT_GATE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, ACTOR_EN_SI, SCENE_DEKU_TREE, 8194, GI_SKULL_TOKEN, "GS Basement Gate", "Deku Tree GS Basement Gate", true), - RC_OBJECT(RC_DEKU_TREE_GS_BASEMENT_VINES, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, ACTOR_EN_SI, SCENE_DEKU_TREE, 8196, GI_SKULL_TOKEN, "GS Basement Vines", "Deku Tree GS Basement Vines", true), - RC_OBJECT(RC_DEKU_TREE_GS_COMPASS_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, ACTOR_EN_SI, SCENE_DEKU_TREE, 8200, GI_SKULL_TOKEN, "GS Compass Room", "Deku Tree GS Compass Room", true), - RC_OBJECT(RC_DEKU_TREE_MQ_GS_LOBBY, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, ACTOR_EN_SI, SCENE_DEKU_TREE, 8194, GI_SKULL_TOKEN, "MQ GS Lobby", "Deku Tree MQ GS Lobby", true), - RC_OBJECT(RC_DEKU_TREE_MQ_GS_COMPASS_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, ACTOR_EN_SI, SCENE_DEKU_TREE, 8200, GI_SKULL_TOKEN, "MQ GS Compass Room", "Deku Tree MQ GS Compass Room", true), - RC_OBJECT(RC_DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, ACTOR_EN_SI, SCENE_DEKU_TREE, 8196, GI_SKULL_TOKEN, "MQ GS Basement Graves Room", "Deku Tree MQ GS Basement Graves Room", true), - RC_OBJECT(RC_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, ACTOR_EN_SI, SCENE_DEKU_TREE, 8193, GI_SKULL_TOKEN, "MQ GS Basement Back Room", "Deku Tree MQ GS Basement Back Room", true), - RC_OBJECT(RC_QUEEN_GOHMA, RCVORMQ_BOTH, RCTYPE_DUNGEON_REWARD, RCAREA_DEKU_TREE, ACTOR_DOOR_WARP1, SCENE_DEKU_TREE_BOSS, 0x00, GI_NONE, "Queen Gohma", "Queen Gohma", true), - RC_OBJECT(RC_DEKU_TREE_QUEEN_GOHMA_HEART, RCVORMQ_BOTH, RCTYPE_BOSS_HEART_OR_OTHER_REWARD, RCAREA_DEKU_TREE, ACTOR_ITEM_B_HEART, SCENE_DEKU_TREE_BOSS, 0x00, GI_HEART_CONTAINER, "Queen Gohma Heart Container", "Deku Tree Queen Gohma Heart Container", true), - - - RC_OBJECT(RC_DODONGOS_CAVERN_BOSS_ROOM_CHEST, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, ACTOR_EN_BOX, SCENE_DODONGOS_CAVERN_BOSS, 20512, GI_BOMBS_5, "Boss Room Chest", "Dodongos Cavern Boss Room Chest", false), - RC_OBJECT(RC_DODONGOS_CAVERN_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_DODONGOS_CAVERN, ACTOR_EN_BOX, SCENE_DODONGOS_CAVERN, 2088, GI_MAP, "Map Chest", "Dodongos Cavern Map Chest", true), - RC_OBJECT(RC_DODONGOS_CAVERN_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_DODONGOS_CAVERN, ACTOR_EN_BOX, SCENE_DODONGOS_CAVERN, 2053, GI_COMPASS, "Compass Chest", "Dodongos Cavern Compass Chest", true), - RC_OBJECT(RC_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, ACTOR_EN_BOX, SCENE_DODONGOS_CAVERN, 22982, GI_RUPEE_RED, "Bomb Flower Platform Chest", "Dodongos Cavern Bomb Flower Platform Chest", false), - RC_OBJECT(RC_DODONGOS_CAVERN_BOMB_BAG_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, ACTOR_EN_BOX, SCENE_DODONGOS_CAVERN, 1604, GI_BOMB_BAG_20, "Bomb Bag Chest", "Dodongos Cavern Bomb Bag Chest", true), - RC_OBJECT(RC_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, ACTOR_EN_BOX, SCENE_DODONGOS_CAVERN, 21802, GI_SHIELD_DEKU, "End Of Bridge Chest", "Dodongos Cavern End Of Bridge Chest", false), - RC_OBJECT(RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, RCVORMQ_VANILLA, RCTYPE_SCRUB, RCAREA_DODONGOS_CAVERN, ACTOR_EN_DNS, SCENE_DODONGOS_CAVERN, 0x00, GI_NUTS_5_2, "Deku Scrub Near Bomb Bag Left", "Dodongos Cavern Deku Scrub Near Bomb Bag Left", false), - RC_OBJECT(RC_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, RCVORMQ_VANILLA, RCTYPE_SCRUB, RCAREA_DODONGOS_CAVERN, ACTOR_EN_DNS, SCENE_DODONGOS_CAVERN, 0x01, GI_STICKS_1, "Deku Scrub Side Room Near Dodongos", "Dodongos Cavern Deku Scrub Side Room Near Dodongos", false), - RC_OBJECT(RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, RCVORMQ_VANILLA, RCTYPE_SCRUB, RCAREA_DODONGOS_CAVERN, ACTOR_EN_DNS, SCENE_DODONGOS_CAVERN, 0x03, GI_SEEDS_30, "Deku Scrub Near Bomb Bag Right", "Dodongos Cavern Deku Scrub Near Bomb Bag Right", false), - RC_OBJECT(RC_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, RCVORMQ_VANILLA, RCTYPE_SCRUB, RCAREA_DODONGOS_CAVERN, ACTOR_EN_DNS, SCENE_DODONGOS_CAVERN, 0x04, GI_SHIELD_DEKU, "Deku Scrub Lobby", "Dodongos Cavern Deku Scrub Lobby", false), - RC_OBJECT(RC_DODONGOS_CAVERN_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_DODONGOS_CAVERN, ACTOR_EN_BOX, SCENE_DODONGOS_CAVERN, 2080, GI_MAP, "MQ Map Chest", "Dodongos Cavern MQ Map Chest", true), - RC_OBJECT(RC_DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, ACTOR_EN_BOX, SCENE_DODONGOS_CAVERN, 1604, GI_BOMB_BAG_20, "MQ Bomb Bag Chest", "Dodongos Cavern MQ Bomb Bag Chest", true), - RC_OBJECT(RC_DODONGOS_CAVERN_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_DODONGOS_CAVERN, ACTOR_EN_BOX, SCENE_DODONGOS_CAVERN, 6149, GI_COMPASS, "MQ Compass Chest", "Dodongos Cavern MQ Compass Chest", true), - RC_OBJECT(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, ACTOR_EN_BOX, SCENE_DODONGOS_CAVERN, 29986, GI_SHIELD_DEKU, "MQ Larvae Room Chest", "Dodongos Cavern MQ Larvae Room Chest", false), - RC_OBJECT(RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, ACTOR_EN_BOX, SCENE_DODONGOS_CAVERN, 22947, GI_RUPEE_BLUE, "MQ Torch Puzzle Room Chest", "Dodongos Cavern MQ Torch Puzzle Room Chest", false), - RC_OBJECT(RC_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, ACTOR_EN_BOX, SCENE_DODONGOS_CAVERN, 21825, GI_SHIELD_HYLIAN, "MQ Under Grave Chest", "Dodongos Cavern MQ Under Grave Chest", false), - RC_OBJECT(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, RCVORMQ_MQ, RCTYPE_SCRUB, RCAREA_DODONGOS_CAVERN, ACTOR_EN_DNS, SCENE_DODONGOS_CAVERN, 0x01, GI_STICKS_1, "MQ Deku Scrub Lobby Rear", "Dodongos Cavern Deku Scrub Lobby Rear", false), - RC_OBJECT(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, RCVORMQ_MQ, RCTYPE_SCRUB, RCAREA_DODONGOS_CAVERN, ACTOR_EN_DNS, SCENE_DODONGOS_CAVERN, 0x03, GI_SEEDS_30, "MQ Deku Scrub Lobby Front", "Dodongos Cavern Deku Scrub Lobby Front", false), - RC_OBJECT(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, RCVORMQ_MQ, RCTYPE_SCRUB, RCAREA_DODONGOS_CAVERN, ACTOR_EN_DNS, SCENE_DODONGOS_CAVERN, 0x04, GI_SHIELD_DEKU, "MQ Deku Scrub Staircase", "Dodongos Cavern Deku Scrub Staircase", false), - RC_OBJECT(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, RCVORMQ_MQ, RCTYPE_SCRUB, RCAREA_DODONGOS_CAVERN, ACTOR_EN_DNS, SCENE_DODONGOS_CAVERN, 0x07, GI_POTION_RED, "MQ Deku Scrub Side Room Near Lower Lizalfos", "Dodongos Cavern Deku Scrub Side Room Near Lower Lizalfos", false), - RC_OBJECT(RC_DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, ACTOR_EN_SI, SCENE_DODONGOS_CAVERN, 8449, GI_SKULL_TOKEN, "GS Vines Above Stairs", "Dodongos Cavern GS Vines Above Stairs", true), - RC_OBJECT(RC_DODONGOS_CAVERN_GS_SCARECROW, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, ACTOR_EN_SI, SCENE_DODONGOS_CAVERN, 8450, GI_SKULL_TOKEN, "GS Scarecrow", "Dodongos Cavern GS Scarecrow", true), - RC_OBJECT(RC_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, ACTOR_EN_SI, SCENE_DODONGOS_CAVERN, 8452, GI_SKULL_TOKEN, "GS Alcove Above Stairs", "Dodongos Cavern GS Alcove Above Stairs", true), - RC_OBJECT(RC_DODONGOS_CAVERN_GS_BACK_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, ACTOR_EN_SI, SCENE_DODONGOS_CAVERN, 8456, GI_SKULL_TOKEN, "GS Back Room", "Dodongos Cavern GS Back Room", true), - RC_OBJECT(RC_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, ACTOR_EN_SI, SCENE_DODONGOS_CAVERN, 8464, GI_SKULL_TOKEN, "GS Side Room Near Lower Lizalfos", "Dodongos Cavern GS Side Room Near Lower Lizalfos", true), - RC_OBJECT(RC_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, ACTOR_EN_SI, SCENE_DODONGOS_CAVERN, 8450, GI_SKULL_TOKEN, "MQ GS Scrub Room", "Dodongos Cavern MQ GS Scrub Room", true), - RC_OBJECT(RC_DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, ACTOR_EN_SI, SCENE_DODONGOS_CAVERN, 8456, GI_SKULL_TOKEN, "MQ GS Song of Time Block Room", "Dodongos Cavern MQ GS Song of Time Block Room", true), - RC_OBJECT(RC_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, ACTOR_EN_SI, SCENE_DODONGOS_CAVERN, 8452, GI_SKULL_TOKEN, "MQ GS Lizalfos Room", "Dodongos Cavern MQ GS Lizalfos Room", true), - RC_OBJECT(RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, ACTOR_EN_SI, SCENE_DODONGOS_CAVERN, 8464, GI_SKULL_TOKEN, "MQ GS Larvae Room", "Dodongos Cavern MQ GS Larvae Room", true), - RC_OBJECT(RC_DODONGOS_CAVERN_MQ_GS_BACK_AREA, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, ACTOR_EN_SI, SCENE_DODONGOS_CAVERN, 8449, GI_SKULL_TOKEN, "MQ GS Back Room", "Dodongos Cavern MQ GS Back Room", true), - RC_OBJECT(RC_KING_DODONGO, RCVORMQ_BOTH, RCTYPE_DUNGEON_REWARD, RCAREA_DODONGOS_CAVERN, ACTOR_DOOR_WARP1, SCENE_DODONGOS_CAVERN_BOSS, 0x00, GI_NONE, "King Dodongo", "King Dodongo", true), - RC_OBJECT(RC_DODONGOS_CAVERN_KING_DODONGO_HEART, RCVORMQ_BOTH, RCTYPE_BOSS_HEART_OR_OTHER_REWARD, RCAREA_DODONGOS_CAVERN, ACTOR_ITEM_B_HEART, SCENE_DODONGOS_CAVERN_BOSS, 0x00, GI_HEART_CONTAINER, "King Dodongo Heart Container", "Dodongos Cavern King Dodongo Heart Container", true), - RC_OBJECT(RC_DODONGOS_CAVERN_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DODONGOS_CAVERN, ACTOR_EN_GS, SCENE_DODONGOS_CAVERN, 4372, GI_NONE, "Gossip Stone", "Dodongo's Cavern Gossip Stone", false), - - - RC_OBJECT(RC_JABU_JABUS_BELLY_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_BOX, SCENE_JABU_JABU, 6178, GI_MAP, "Map Chest", "Jabu Jabus Belly Map Chest", true), - RC_OBJECT(RC_JABU_JABUS_BELLY_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_BOX, SCENE_JABU_JABU, -18428, GI_COMPASS, "Compass Chest", "Jabu Jabus Belly Compass Chest", true), - RC_OBJECT(RC_JABU_JABUS_BELLY_BOOMERANG_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_BOX, SCENE_JABU_JABU, 4289, GI_BOOMERANG, "Boomerang Chest", "Jabu Jabus Belly Boomerang Chest", true), - RC_OBJECT(RC_JABU_JABUS_BELLY_DEKU_SCRUB, RCVORMQ_VANILLA, RCTYPE_SCRUB, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_DNS, SCENE_JABU_JABU, 0x00, GI_NUTS_5_2, "Deku Scrub", "Jabu Jabus Belly Deku Scrub", false), - RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_BOX, SCENE_JABU_JABU, -32699, GI_NUTS_5, "MQ First Room Side Chest", "Jabu Jabus Belly MQ First Room Side Chest", false), - RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_BOX, SCENE_JABU_JABU, -18397, GI_MAP, "MQ Map Chest", "Jabu Jabus Belly MQ Map Chest", true), - RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_BOX, SCENE_JABU_JABU, 20546, GI_NUTS_5, "MQ Second Room Lower Chest", "Jabu Jabus Belly MQ Second Room Lower Chest", false), - RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_BOX, SCENE_JABU_JABU, -18432, GI_COMPASS, "MQ Compass Chest", "Jabu Jabus Belly MQ Compass Chest", true), - RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_BOX, SCENE_JABU_JABU, -30457, GI_HEART, "MQ Second Room Upper Chest", "Jabu Jabus Belly MQ Second Room Upper Chest", false), - RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_BOX, SCENE_JABU_JABU, -32696, GI_NUTS_5, "MQ Basement Near Switches Chest", "Jabu Jabus Belly MQ Basement Near Switches Chest", false), - RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_BOX, SCENE_JABU_JABU, -32668, GI_BOMBCHUS_10, "MQ Basement Near Vines Chest", "Jabu Jabus Belly MQ Basement Near Vines Chest", false), - RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_BOX, SCENE_JABU_JABU, -31446, GI_SHIELD_DEKU, "MQ Near Boss Chest", "Jabu Jabus Belly MQ Near Boss Chest", false), - RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_BOX, SCENE_JABU_JABU, 28905, GI_STICKS_1, "MQ Falling Like Like Room Chest", "Jabu Jabus Belly MQ Falling Like Like Room Chest", false), - RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_BOX, SCENE_JABU_JABU, 20545, GI_NUTS_5, "MQ Boomerang Room Small Chest", "Jabu Jabus Belly MQ Boomerang Room Small Chest", false), - RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_BOX, SCENE_JABU_JABU, 4294, GI_BOOMERANG, "MQ Boomerang Chest", "Jabu Jabus Belly MQ Boomerang Chest", true), - RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_COW, RCVORMQ_MQ, RCTYPE_COW, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_COW, SCENE_JABU_JABU, 0x00, GI_MILK, "MQ Cow", "Jabu Jabus Belly MQ Cow", false), - RC_OBJECT(RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_SI, SCENE_JABU_JABU, 8705, GI_SKULL_TOKEN, "GS Lobby Basement Lower", "Jabu Jabus Belly GS Lobby Basement Lower", true), - RC_OBJECT(RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_SI, SCENE_JABU_JABU, 8706, GI_SKULL_TOKEN, "GS Lobby Basement Upper", "Jabu Jabus Belly GS Lobby Basement Upper", true), - RC_OBJECT(RC_JABU_JABUS_BELLY_GS_NEAR_BOSS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_SI, SCENE_JABU_JABU, 8708, GI_SKULL_TOKEN, "GS Near Boss", "Jabu Jabus Belly GS Near Boss", true), - RC_OBJECT(RC_JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_SI, SCENE_JABU_JABU, 8712, GI_SKULL_TOKEN, "GS Water Switch Room", "Jabu Jabus Belly GS Water Switch Room", true), - RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_SI, SCENE_JABU_JABU, 8708, GI_SKULL_TOKEN, "MQ GS Tail Parasan Room", "Jabu Jabus Belly MQ GS Tail Parasan Room", true), - RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_SI, SCENE_JABU_JABU, 8712, GI_SKULL_TOKEN, "MQ GS Invisible Enemies Room", "Jabu Jabus Belly MQ GS Invisible Enemies Room", true), - RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_SI, SCENE_JABU_JABU, 8705, GI_SKULL_TOKEN, "MQ GS Boomerang Chest Room", "Jabu Jabus Belly MQ GS Boomerang Chest Room", true), - RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_SI, SCENE_JABU_JABU, 8706, GI_SKULL_TOKEN, "MQ GS Near Boss", "Jabu Jabus Belly MQ GS Near Boss", true), - RC_OBJECT(RC_BARINADE, RCVORMQ_BOTH, RCTYPE_DUNGEON_REWARD, RCAREA_JABU_JABUS_BELLY, ACTOR_DOOR_WARP1, SCENE_JABU_JABU_BOSS, 0x00, GI_NONE, "Barinade", "Barinade", true), - RC_OBJECT(RC_JABU_JABUS_BELLY_BARINADE_HEART, RCVORMQ_BOTH, RCTYPE_BOSS_HEART_OR_OTHER_REWARD, RCAREA_JABU_JABUS_BELLY, ACTOR_ITEM_B_HEART, SCENE_JABU_JABU_BOSS, 0x00, GI_HEART_CONTAINER, "Barinade Heart Container", "Jabu Jabus Belly Barinade Heart Container", true), - - - RC_OBJECT(RC_FOREST_TEMPLE_FIRST_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 22595, GI_KEY_SMALL, "First Room Chest", "Forest Temple First Room Chest", true), - RC_OBJECT(RC_FOREST_TEMPLE_FIRST_STALFOS_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 30784, GI_KEY_SMALL, "First Stalfos Chest", "Forest Temple First Stalfos Chest", true), - RC_OBJECT(RC_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 22789, GI_HEART, "Raised Island Courtyard Chest", "Forest Temple Raised Island Courtyard Chest", false), - RC_OBJECT(RC_FOREST_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 6177, GI_MAP, "Map Chest", "Forest Temple Map Chest", true), - RC_OBJECT(RC_FOREST_TEMPLE_WELL_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 22601, GI_KEY_SMALL, "Well Chest", "Forest Temple Well Chest", true), - RC_OBJECT(RC_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 22855, GI_ARROWS_MEDIUM, "Falling Ceiling Room Chest", "Forest Temple Falling Ceiling Room Chest", false), - RC_OBJECT(RC_FOREST_TEMPLE_EYE_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, -30364, GI_ARROWS_LARGE, "Eye Switch Chest", "Forest Temple Eye Switch Chest", false), - RC_OBJECT(RC_FOREST_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_BOSS_KEY, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 10222, GI_KEY_BOSS, "Boss Key Chest", "Forest Temple Boss Key Chest", true), - RC_OBJECT(RC_FOREST_TEMPLE_FLOORMASTER_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 30786, GI_KEY_SMALL, "Floormaster Chest", "Forest Temple Floormaster Chest", true), - RC_OBJECT(RC_FOREST_TEMPLE_BOW_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, -20340, GI_BOW, "Bow Chest", "Forest Temple Bow Chest", true), - RC_OBJECT(RC_FOREST_TEMPLE_RED_POE_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 30797, GI_KEY_SMALL, "Red Poe Chest", "Forest Temple Red Poe Chest", true), - RC_OBJECT(RC_FOREST_TEMPLE_BLUE_POE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 6159, GI_COMPASS, "Blue Poe Chest", "Forest Temple Blue Poe Chest", true), - RC_OBJECT(RC_FOREST_TEMPLE_BASEMENT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 22827, GI_ARROWS_SMALL, "Basement Chest", "Forest Temple Basement Chest", false), - RC_OBJECT(RC_FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_SMALL_KEY, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, -30653, GI_KEY_SMALL, "MQ First Room Chest", "Forest Temple MQ First Room Chest", true), - RC_OBJECT(RC_FOREST_TEMPLE_MQ_WOLFOS_CHEST, RCVORMQ_MQ, RCTYPE_SMALL_KEY, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 30784, GI_KEY_SMALL, "MQ Wolfos Chest", "Forest Temple MQ Wolfos Chest", true), - RC_OBJECT(RC_FOREST_TEMPLE_MQ_BOW_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, -20340, GI_BOW, "MQ Bow Chest", "Forest Temple MQ Bow Chest", true), - RC_OBJECT(RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST, RCVORMQ_MQ, RCTYPE_SMALL_KEY, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 22593, GI_KEY_SMALL, "MQ Raised Island Courtyard Lower Chest", "Forest Temple MQ Raised Island Courtyard Lower Chest", true), - RC_OBJECT(RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST, RCVORMQ_MQ, RCTYPE_SMALL_KEY, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 22597, GI_KEY_SMALL, "MQ Raised Island Courtyard Upper Chest", "Forest Temple MQ Raised Island Courtyard Upper Chest", true), - RC_OBJECT(RC_FOREST_TEMPLE_MQ_WELL_CHEST, RCVORMQ_MQ, RCTYPE_SMALL_KEY, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 22601, GI_KEY_SMALL, "MQ Well Chest", "Forest Temple MQ Well Chest", true), - RC_OBJECT(RC_FOREST_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 6189, GI_MAP, "MQ Map Chest", "Forest Temple MQ Map Chest", true), - RC_OBJECT(RC_FOREST_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 6159, GI_COMPASS, "MQ Compass Chest", "Forest Temple MQ Compass Chest", true), - RC_OBJECT(RC_FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, -30426, GI_ARROWS_SMALL, "MQ Falling Ceiling Room Chest", "Forest Temple MQ Falling Ceiling Room Chest", false), - RC_OBJECT(RC_FOREST_TEMPLE_MQ_BASEMENT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 22827, GI_ARROWS_SMALL, "MQ Basement Chest", "Forest Temple MQ Basement Chest", false), - RC_OBJECT(RC_FOREST_TEMPLE_MQ_REDEAD_CHEST, RCVORMQ_MQ, RCTYPE_SMALL_KEY, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 30786, GI_KEY_SMALL, "MQ Redead Chest", "Forest Temple MQ Redead Chest", true), - RC_OBJECT(RC_FOREST_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_BOSS_KEY, RCAREA_FOREST_TEMPLE, ACTOR_EN_BOX, SCENE_FOREST_TEMPLE, 10222, GI_KEY_BOSS, "MQ Boss Key Chest", "Forest Temple MQ Boss Key Chest", true), - RC_OBJECT(RC_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, ACTOR_EN_SI, SCENE_FOREST_TEMPLE, 8961, GI_SKULL_TOKEN, "GS Raised Island Courtyard", "Forest Temple GS Raised Island Courtyard", true), - RC_OBJECT(RC_FOREST_TEMPLE_GS_FIRST_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, ACTOR_EN_SI, SCENE_FOREST_TEMPLE, 8962, GI_SKULL_TOKEN, "GS First Room", "Forest Temple GS First Room", true), - RC_OBJECT(RC_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, ACTOR_EN_SI, SCENE_FOREST_TEMPLE, 8964, GI_SKULL_TOKEN, "GS Level Island Courtyard", "Forest Temple GS Level Island Courtyard", true), - RC_OBJECT(RC_FOREST_TEMPLE_GS_LOBBY, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, ACTOR_EN_SI, SCENE_FOREST_TEMPLE, 8968, GI_SKULL_TOKEN, "GS Lobby", "Forest Temple GS Lobby", true), - RC_OBJECT(RC_FOREST_TEMPLE_GS_BASEMENT, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, ACTOR_EN_SI, SCENE_FOREST_TEMPLE, 8976, GI_SKULL_TOKEN, "GS Basement", "Forest Temple GS Basement", true), - RC_OBJECT(RC_FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, ACTOR_EN_SI, SCENE_FOREST_TEMPLE, 8962, GI_SKULL_TOKEN, "MQ GS First Hallway", "Forest Temple MQ GS First Hallway", true), - RC_OBJECT(RC_FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, ACTOR_EN_SI, SCENE_FOREST_TEMPLE, 8976, GI_SKULL_TOKEN, "MQ GS Block Push Room", "Forest Temple MQ GS Block Push Room", true), - RC_OBJECT(RC_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, ACTOR_EN_SI, SCENE_FOREST_TEMPLE, 8961, GI_SKULL_TOKEN, "MQ GS Raised Island Courtyard", "Forest Temple MQ GS Raised Island Courtyard", true), - RC_OBJECT(RC_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, ACTOR_EN_SI, SCENE_FOREST_TEMPLE, 8964, GI_SKULL_TOKEN, "MQ GS Level Island Courtyard", "Forest Temple MQ GS Level Island Courtyard", true), - RC_OBJECT(RC_FOREST_TEMPLE_MQ_GS_WELL, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, ACTOR_EN_SI, SCENE_FOREST_TEMPLE, 8968, GI_SKULL_TOKEN, "MQ GS Well", "Forest Temple MQ GS Well", true), - RC_OBJECT(RC_PHANTOM_GANON, RCVORMQ_BOTH, RCTYPE_DUNGEON_REWARD, RCAREA_FOREST_TEMPLE, ACTOR_DOOR_WARP1, SCENE_FOREST_TEMPLE_BOSS, 0x00, GI_NONE, "Phantom Ganon", "Phantom Ganon", true), - RC_OBJECT(RC_FOREST_TEMPLE_PHANTOM_GANON_HEART, RCVORMQ_BOTH, RCTYPE_BOSS_HEART_OR_OTHER_REWARD, RCAREA_FOREST_TEMPLE, ACTOR_ITEM_B_HEART, SCENE_FOREST_TEMPLE_BOSS, 0x00, GI_HEART_CONTAINER, "Phantom Ganon Heart Container", "Forest Temple Phantom Ganon Heart Container", true), - - - RC_OBJECT(RC_FIRE_TEMPLE_NEAR_BOSS_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 22593, GI_KEY_SMALL, "Near Boss Chest", "Fire Temple Near Boss Chest", true), - RC_OBJECT(RC_FIRE_TEMPLE_FLARE_DANCER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 31936, GI_BOMBS_10, "Flare Dancer Chest", "Fire Temple Flare Dancer Chest", false), - RC_OBJECT(RC_FIRE_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_BOSS_KEY, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 10220, GI_KEY_BOSS, "Boss Key Chest", "Fire Temple Boss Key Chest", true), - RC_OBJECT(RC_FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 22594, GI_KEY_SMALL, "Big Lava Room Blocked Door Chest", "Fire Temple Big Lava Room Blocked Door Chest", true), - RC_OBJECT(RC_FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 22596, GI_KEY_SMALL, "Big Lava Room Lower Open Door Chest", "Fire Temple Big Lava Room Lower Open Door Chest", true), - RC_OBJECT(RC_FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 22595, GI_KEY_SMALL, "Boulder Maze Lower Chest", "Fire Temple Boulder Maze Lower Chest", true), - RC_OBJECT(RC_FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 22598, GI_KEY_SMALL, "Boulder Maze Upper Chest", "Fire Temple Boulder Maze Upper Chest", true), - RC_OBJECT(RC_FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 22600, GI_KEY_SMALL, "Boulder Maze Side Room Chest", "Fire Temple Boulder Maze Side Room Chest", true), - RC_OBJECT(RC_FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 22603, GI_KEY_SMALL, "Boulder Maze Shortcut Chest", "Fire Temple Boulder Maze Shortcut Chest", true), - RC_OBJECT(RC_FIRE_TEMPLE_SCARECROW_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 23245, GI_RUPEE_GOLD, "Scarecrow Chest", "Fire Temple Scarecrow Chest", false), - RC_OBJECT(RC_FIRE_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 2090, GI_MAP, "Map Chest", "Fire Temple Map Chest", true), - RC_OBJECT(RC_FIRE_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 2055, GI_COMPASS, "Compass Chest", "Fire Temple Compass Chest", true), - RC_OBJECT(RC_FIRE_TEMPLE_HIGHEST_GORON_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 22601, GI_KEY_SMALL, "Highest Goron Chest", "Fire Temple Highest Goron Chest", true), - RC_OBJECT(RC_FIRE_TEMPLE_MEGATON_HAMMER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 421, GI_HAMMER, "Megaton Hammer Chest", "Fire Temple Megaton Hammer Chest", true), - RC_OBJECT(RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, RCVORMQ_MQ, RCTYPE_SMALL_KEY, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 22599, GI_KEY_SMALL, "MQ Near Boss Chest", "Fire Temple MQ Near Boss Chest", true), - RC_OBJECT(RC_FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 4512, GI_HAMMER, "MQ Megaton Hammer Chest", "Fire Temple MQ Megaton Hammer Chest", true), - RC_OBJECT(RC_FIRE_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 2059, GI_COMPASS, "MQ Compass Chest", "Fire Temple MQ Compass Chest", true), - RC_OBJECT(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 23747, GI_BOMBS_10, "MQ Lizalfos Maze Lower Chest", "Fire Temple MQ Lizalfos Maze Lower Chest", false), - RC_OBJECT(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 23782, GI_BOMBS_20, "MQ Lizalfos Maze Upper Chest", "Fire Temple MQ Lizalfos Maze Upper Chest", false), - RC_OBJECT(RC_FIRE_TEMPLE_MQ_CHEST_ON_FIRE, RCVORMQ_MQ, RCTYPE_SMALL_KEY, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 22597, GI_KEY_SMALL, "MQ Chest on Fire", "Fire Temple MQ Chest on Fire", true), - RC_OBJECT(RC_FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 30018, GI_SHIELD_HYLIAN, "MQ Map Room Side Chest", "Fire Temple MQ Map Room Side Chest", false), - RC_OBJECT(RC_FIRE_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 2092, GI_MAP, "MQ Map Chest", "Fire Temple MQ Map Chest", true), - RC_OBJECT(RC_FIRE_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_BOSS_KEY, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 10212, GI_KEY_BOSS, "MQ Boss Key Chest", "Fire Temple MQ Boss Key Chest", true), - RC_OBJECT(RC_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, RCVORMQ_MQ, RCTYPE_SMALL_KEY, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 22593, GI_KEY_SMALL, "MQ Big Lava Room Blocked Door Chest", "Fire Temple MQ Big Lava Room Blocked Door Chest", true), - RC_OBJECT(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_SMALL_KEY, RCAREA_FIRE_TEMPLE, ACTOR_EN_BOX, SCENE_FIRE_TEMPLE, 22600, GI_KEY_SMALL, "MQ Lizalfos Maze Side Room Chest", "Fire Temple MQ Lizalfos Maze Side Room Chest", true), - RC_OBJECT(RC_FIRE_TEMPLE_MQ_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_SMALL_KEY, RCAREA_FIRE_TEMPLE, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, 7185, GI_KEY_SMALL, "MQ Freestanding Key", "Fire Temple MQ Freestanding Key", true), - RC_OBJECT(RC_FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, ACTOR_EN_SI, SCENE_FIRE_TEMPLE, 9217, GI_SKULL_TOKEN, "GS Song of Time Room", "Fire Temple GS Song of Time Room", true), - RC_OBJECT(RC_FIRE_TEMPLE_GS_BOSS_KEY_LOOP, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, ACTOR_EN_SI, SCENE_FIRE_TEMPLE, 9218, GI_SKULL_TOKEN, "GS Boss Key Loop", "Fire Temple GS Boss Key Loop", true), - RC_OBJECT(RC_FIRE_TEMPLE_GS_BOULDER_MAZE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, ACTOR_EN_SI, SCENE_FIRE_TEMPLE, 9220, GI_SKULL_TOKEN, "GS Boulder Maze", "Fire Temple GS Boulder Maze", true), - RC_OBJECT(RC_FIRE_TEMPLE_GS_SCARECROW_TOP, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, ACTOR_EN_SI, SCENE_FIRE_TEMPLE, 9224, GI_SKULL_TOKEN, "GS Scarecrow Top", "Fire Temple GS Scarecrow Top", true), - RC_OBJECT(RC_FIRE_TEMPLE_GS_SCARECROW_CLIMB, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, ACTOR_EN_SI, SCENE_FIRE_TEMPLE, 9232, GI_SKULL_TOKEN, "GS Scarecrow Climb", "Fire Temple GS Scarecrow Climb", true), - RC_OBJECT(RC_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, ACTOR_EN_SI, SCENE_FIRE_TEMPLE, 9218, GI_SKULL_TOKEN, "MQ GS Above Fire Wall Maze", "Fire Temple MQ GS Above Fire Wall Maze", true), - RC_OBJECT(RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, ACTOR_EN_SI, SCENE_FIRE_TEMPLE, 9224, GI_SKULL_TOKEN, "MQ GS Fire Wall Maze Center", "Fire Temple MQ GS Fire Wall Maze Center", true), - RC_OBJECT(RC_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, ACTOR_EN_SI, SCENE_FIRE_TEMPLE, 9217, GI_SKULL_TOKEN, "MQ GS Big Lava Room Open Door", "Fire Temple MQ GS Big Lava Room Open Door", true), - RC_OBJECT(RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, ACTOR_EN_SI, SCENE_FIRE_TEMPLE, 9232, GI_SKULL_TOKEN, "MQ GS Fire Wall Maze Side Room", "Fire Temple MQ GS Fire Wall Maze Side Room", true), - RC_OBJECT(RC_FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, ACTOR_EN_SI, SCENE_FIRE_TEMPLE, 9220, GI_SKULL_TOKEN, "MQ GS Skull on Fire", "Fire Temple MQ GS Skull on Fire", true), - RC_OBJECT(RC_VOLVAGIA, RCVORMQ_BOTH, RCTYPE_DUNGEON_REWARD, RCAREA_FIRE_TEMPLE, ACTOR_DOOR_WARP1, SCENE_FIRE_TEMPLE_BOSS, 0x00, GI_NONE, "Volvagia", "Volvagia", true), - RC_OBJECT(RC_FIRE_TEMPLE_VOLVAGIA_HEART, RCVORMQ_BOTH, RCTYPE_BOSS_HEART_OR_OTHER_REWARD, RCAREA_FIRE_TEMPLE, ACTOR_ITEM_B_HEART, SCENE_FIRE_TEMPLE_BOSS, 0x00, GI_HEART_CONTAINER, "Volvagia Heart Container", "Fire Temple Volvagia Heart Container", true), - - - RC_OBJECT(RC_WATER_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_WATER_TEMPLE, ACTOR_EN_BOX, SCENE_WATER_TEMPLE, 6178, GI_MAP, "Map Chest", "Water Temple Map Chest", true), - RC_OBJECT(RC_WATER_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_WATER_TEMPLE, ACTOR_EN_BOX, SCENE_WATER_TEMPLE, 2057, GI_COMPASS, "Compass Chest", "Water Temple Compass Chest", true), - RC_OBJECT(RC_WATER_TEMPLE_TORCHES_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_WATER_TEMPLE, ACTOR_EN_BOX, SCENE_WATER_TEMPLE, 30785, GI_KEY_SMALL, "Torches Chest", "Water Temple Torches Chest", true), - RC_OBJECT(RC_WATER_TEMPLE_DRAGON_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_WATER_TEMPLE, ACTOR_EN_BOX, SCENE_WATER_TEMPLE, 22602, GI_KEY_SMALL, "Dragon Chest", "Water Temple Dragon Chest", true), - RC_OBJECT(RC_WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_WATER_TEMPLE, ACTOR_EN_BOX, SCENE_WATER_TEMPLE, 22600, GI_KEY_SMALL, "Central Bow Target Chest", "Water Temple Central Bow Target Chest", true), - RC_OBJECT(RC_WATER_TEMPLE_CENTRAL_PILLAR_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_WATER_TEMPLE, ACTOR_EN_BOX, SCENE_WATER_TEMPLE, 22598, GI_KEY_SMALL, "Central Pillar Chest", "Water Temple Central Pillar Chest", true), - RC_OBJECT(RC_WATER_TEMPLE_CRACKED_WALL_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_WATER_TEMPLE, ACTOR_EN_BOX, SCENE_WATER_TEMPLE, 22592, GI_KEY_SMALL, "Cracked Wall Chest", "Water Temple Cracked Wall Chest", true), - RC_OBJECT(RC_WATER_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_BOSS_KEY, RCAREA_WATER_TEMPLE, ACTOR_EN_BOX, SCENE_WATER_TEMPLE, 10213, GI_KEY_BOSS, "Boss Key Chest", "Water Temple Boss Key Chest", true), - RC_OBJECT(RC_WATER_TEMPLE_LONGSHOT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, ACTOR_EN_BOX, SCENE_WATER_TEMPLE, 295, GI_LONGSHOT, "Longshot Chest", "Water Temple Longshot Chest", true), - RC_OBJECT(RC_WATER_TEMPLE_RIVER_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_WATER_TEMPLE, ACTOR_EN_BOX, SCENE_WATER_TEMPLE, 22595, GI_KEY_SMALL, "River Chest", "Water Temple River Chest", true), - RC_OBJECT(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, RCVORMQ_MQ, RCTYPE_SMALL_KEY, RCAREA_WATER_TEMPLE, ACTOR_EN_BOX, SCENE_WATER_TEMPLE, -30650, GI_KEY_SMALL, "MQ Central Pillar Chest", "Water Temple MQ Central Pillar Chest", true), - RC_OBJECT(RC_WATER_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_BOSS_KEY, RCAREA_WATER_TEMPLE, ACTOR_EN_BOX, SCENE_WATER_TEMPLE, 10213, GI_KEY_BOSS, "MQ Boss Key Chest", "Water Temple MQ Boss Key Chest", true), - RC_OBJECT(RC_WATER_TEMPLE_MQ_LONGSHOT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, ACTOR_EN_BOX, SCENE_WATER_TEMPLE, -20192, GI_LONGSHOT, "MQ Longshot Chest", "Water Temple MQ Longshot Chest", true), - RC_OBJECT(RC_WATER_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_WATER_TEMPLE, ACTOR_EN_BOX, SCENE_WATER_TEMPLE, 6145, GI_COMPASS, "MQ Compass Chest", "Water Temple MQ Compass Chest", true), - RC_OBJECT(RC_WATER_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_WATER_TEMPLE, ACTOR_EN_BOX, SCENE_WATER_TEMPLE, -18398, GI_MAP, "MQ Map Chest", "Water Temple MQ Map Chest", true), - RC_OBJECT(RC_WATER_TEMPLE_MQ_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_SMALL_KEY, RCAREA_WATER_TEMPLE, ACTOR_EN_ITEM00, SCENE_WATER_TEMPLE, 273, GI_KEY_SMALL, "MQ Freestanding Key", "Water Temple MQ Freestanding Key", true), - RC_OBJECT(RC_WATER_TEMPLE_GS_BEHIND_GATE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, ACTOR_EN_SI, SCENE_WATER_TEMPLE, 9473, GI_SKULL_TOKEN, "GS Behind Gate", "Water Temple GS Behind Gate", true), - RC_OBJECT(RC_WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, ACTOR_EN_SI, SCENE_WATER_TEMPLE, 9474, GI_SKULL_TOKEN, "GS Falling Platform Room", "Water Temple GS Falling Platform Room", true), - RC_OBJECT(RC_WATER_TEMPLE_GS_CENTRAL_PILLAR, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, ACTOR_EN_SI, SCENE_WATER_TEMPLE, 9476, GI_SKULL_TOKEN, "GS Central Pillar", "Water Temple GS Central Pillar", true), - RC_OBJECT(RC_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, ACTOR_EN_SI, SCENE_WATER_TEMPLE, 9480, GI_SKULL_TOKEN, "GS Near Boss Key Chest", "Water Temple GS Near Boss Key Chest", true), - RC_OBJECT(RC_WATER_TEMPLE_GS_RIVER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, ACTOR_EN_SI, SCENE_WATER_TEMPLE, 9488, GI_SKULL_TOKEN, "GS River", "Water Temple GS River", true), - RC_OBJECT(RC_WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, ACTOR_EN_SI, SCENE_WATER_TEMPLE, 9476, GI_SKULL_TOKEN, "MQ GS Before Upper Water Switch", "Water Temple MQ GS Before Upper Water Switch", true), - RC_OBJECT(RC_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, ACTOR_EN_SI, SCENE_WATER_TEMPLE, 9480, GI_SKULL_TOKEN, "MQ GS Freestanding Key Area", "Water Temple MQ GS Freestanding Key Area", true), - RC_OBJECT(RC_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, ACTOR_EN_SI, SCENE_WATER_TEMPLE, 9473, GI_SKULL_TOKEN, "MQ GS Lizalfos Hallway", "Water Temple MQ GS Lizalfos Hallway", true), - RC_OBJECT(RC_WATER_TEMPLE_MQ_GS_RIVER, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, ACTOR_EN_SI, SCENE_WATER_TEMPLE, 9474, GI_SKULL_TOKEN, "MQ GS River", "Water Temple MQ GS River", true), - RC_OBJECT(RC_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, ACTOR_EN_SI, SCENE_WATER_TEMPLE, 9488, GI_SKULL_TOKEN, "MQ GS Triple Wall Torch", "Water Temple MQ GS Triple Wall Torch", true), - RC_OBJECT(RC_MORPHA, RCVORMQ_BOTH, RCTYPE_DUNGEON_REWARD, RCAREA_WATER_TEMPLE, ACTOR_DOOR_WARP1, SCENE_WATER_TEMPLE_BOSS, 0x00, GI_NONE, "Morpha", "Morpha", true), - RC_OBJECT(RC_WATER_TEMPLE_MORPHA_HEART, RCVORMQ_BOTH, RCTYPE_BOSS_HEART_OR_OTHER_REWARD, RCAREA_WATER_TEMPLE, ACTOR_ITEM_B_HEART, SCENE_WATER_TEMPLE_BOSS, 0x00, GI_HEART_CONTAINER, "Morpha Heart Container", "Water Temple Morpha Heart Container", true), - - - RC_OBJECT(RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_DESERT_COLOSSUS, 1707, GI_GAUNTLETS_SILVER, "Silver Gauntlets Chest", "Spirit Temple Silver Gauntlets Chest", true), - RC_OBJECT(RC_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_DESERT_COLOSSUS, 13673, GI_SHIELD_MIRROR, "Mirror Shield Chest", "Spirit Temple Mirror Shield Chest", true), - RC_OBJECT(RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, 21800, GI_SHIELD_DEKU, "Child Bridge Chest", "Spirit Temple Child Bridge Chest", false), - RC_OBJECT(RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -30656, GI_KEY_SMALL, "Child Early Torches Chest", "Spirit Temple Child Early Torches Chest", true), - RC_OBJECT(RC_SPIRIT_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, 14340, GI_COMPASS, "Compass Chest", "Spirit Temple Compass Chest", true), - RC_OBJECT(RC_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, 22599, GI_KEY_SMALL, "Early Adult Right Chest", "Spirit Temple Early Adult Right Chest", true), - RC_OBJECT(RC_SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -30451, GI_HEART, "First Mirror Left Chest", "Spirit Temple First Mirror Left Chest", false), - RC_OBJECT(RC_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -28786, GI_ICE_TRAP, "First Mirror Right Chest", "Spirit Temple First Mirror Right Chest", false), - RC_OBJECT(RC_SPIRIT_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -18397, GI_MAP, "Map Chest", "Spirit Temple Map Chest", true), - RC_OBJECT(RC_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -32666, GI_BOMBCHUS_10, "Child Climb North Chest", "Spirit Temple Child Climb North Chest", false), - RC_OBJECT(RC_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -31444, GI_SHIELD_DEKU, "Child Climb East Chest", "Spirit Temple Child Climb East Chest", false), - RC_OBJECT(RC_SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -30655, GI_KEY_SMALL, "Sun Block Room Chest", "Spirit Temple Sun Block Room Chest", true), - RC_OBJECT(RC_SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -30654, GI_KEY_SMALL, "Statue Room Hand Chest", "Spirit Temple Statue Room Hand Chest", true), - RC_OBJECT(RC_SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -30577, GI_MAGIC_LARGE, "Statue Room Northeast Chest", "Spirit Temple Statue Room Northeast Chest", false), - RC_OBJECT(RC_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, 22597, GI_KEY_SMALL, "Near Four Armos Chest", "Spirit Temple Near Four Armos Chest", true), - RC_OBJECT(RC_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, 26900, GI_HEART, "Hallway Right Invisible Chest", "Spirit Temple Hallway Right Invisible Chest", false), - RC_OBJECT(RC_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, 26901, GI_HEART, "Hallway Left Invisible Chest", "Spirit Temple Hallway Left Invisible Chest", false), - RC_OBJECT(RC_SPIRIT_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_BOSS_KEY, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, 10218, GI_KEY_BOSS, "Boss Key Chest", "Spirit Temple Boss Key Chest", true), - RC_OBJECT(RC_SPIRIT_TEMPLE_TOPMOST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -29454, GI_BOMBS_20, "Topmost Chest", "Spirit Temple Topmost Chest", true), - RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, 20602, GI_BOMBCHUS_10, "MQ Entrance Front Left Chest", "Spirit Temple MQ Entrance Front Left Chest", false), - RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -32641, GI_BOMBCHUS_10, "MQ Entrance Back Right Chest", "Spirit Temple MQ Entrance Back Right Chest", false), - RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST, RCVORMQ_MQ, RCTYPE_SMALL_KEY, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -30629, GI_KEY_SMALL, "MQ Entrance Front Right Chest", "Spirit Temple MQ Entrance Front Right Chest", true), - RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_SMALL_KEY, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -30626, GI_KEY_SMALL, "MQ Entrance Back Left Chest", "Spirit Temple MQ Entrance Back Left Chest", true), - RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_SMALL_KEY, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -30627, GI_KEY_SMALL, "MQ Child Hammer Switch Chest", "Spirit Temple MQ Child Hammer Switch Chest", true), - RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, 2080, GI_MAP, "MQ Map Chest", "Spirit Temple MQ Map Chest", true), - RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST, RCVORMQ_MQ, RCTYPE_SMALL_KEY, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, 30792, GI_KEY_SMALL, "MQ Map Room Enemy Chest", "Spirit Temple MQ Map Room Enemy Chest", true), - RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, 28774, GI_BOMBCHUS_10, "MQ Child Climb North Chest", "Spirit Temple MQ Child Climb North Chest", false), - RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST, RCVORMQ_MQ, RCTYPE_SMALL_KEY, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -30644, GI_KEY_SMALL, "MQ Child Climb South Chest", "Spirit Temple MQ Child Climb South Chest", true), - RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -18429, GI_COMPASS, "MQ Compass Chest", "Spirit Temple MQ Compass Chest", true), - RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -30577, GI_MAGIC_LARGE, "MQ Statue Room Lullaby Chest", "Spirit Temple MQ Statue Room Lullaby Chest", false), - RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, 26882, GI_HEART, "MQ Statue Room Invisible Chest", "Spirit Temple MQ Statue Room Invisible Chest", false), - RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, RCVORMQ_MQ, RCTYPE_SMALL_KEY, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -30628, GI_KEY_SMALL, "MQ Silver Block Hallway Chest", "Spirit Temple MQ Silver Block Hallway Chest", true), - RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, -30463, GI_HEART, "MQ Sun Block Room Chest", "Spirit Temple MQ Sun Block Room Chest", false), - RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, 23207, GI_RUPEE_PURPLE, "MQ Symphony Room Chest", "Spirit Temple MQ Symphony Room Chest", false), - RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, 31396, GI_RUPEE_PURPLE, "MQ Leever Room Chest", "Spirit Temple MQ Leever Room Chest", false), - RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, 24472, GI_ICE_TRAP, "MQ Beamos Room Chest", "Spirit Temple MQ Beamos Room Chest", false), - RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, 31097, GI_ARROWS_LARGE, "MQ Chest Switch Chest", "Spirit Temple MQ Chest Switch Chest", false), - RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_BOSS_KEY, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, 10213, GI_KEY_BOSS, "MQ Boss Key Chest", "Spirit Temple MQ Boss Key Chest", true), - RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_SMALL_KEY, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_BOX, SCENE_SPIRIT_TEMPLE, 26706, GI_KEY_SMALL, "MQ Mirror Puzzle Invisible Chest", "Spirit Temple MQ Mirror Puzzle Invisible Chest", true), - RC_OBJECT(RC_SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_SI, SCENE_SPIRIT_TEMPLE, 9729, GI_SKULL_TOKEN, "GS Hall After Sun Block Room", "Spirit Temple GS Hall After Sun Block Room", true), - RC_OBJECT(RC_SPIRIT_TEMPLE_GS_BOULDER_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_SI, SCENE_SPIRIT_TEMPLE, 9730, GI_SKULL_TOKEN, "GS Boulder Room", "Spirit Temple GS Boulder Room", true), - RC_OBJECT(RC_SPIRIT_TEMPLE_GS_LOBBY, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_SI, SCENE_SPIRIT_TEMPLE, 9732, GI_SKULL_TOKEN, "GS Lobby", "Spirit Temple GS Lobby", true), - RC_OBJECT(RC_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_SI, SCENE_SPIRIT_TEMPLE, 9736, GI_SKULL_TOKEN, "GS Sun on Floor Room", "Spirit Temple GS Sun on Floor Room", true), - RC_OBJECT(RC_SPIRIT_TEMPLE_GS_METAL_FENCE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_SI, SCENE_SPIRIT_TEMPLE, 9744, GI_SKULL_TOKEN, "GS Metal Fence", "Spirit Temple GS Metal Fence", true), - RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_SI, SCENE_SPIRIT_TEMPLE, 9736, GI_SKULL_TOKEN, "MQ GS Symphony Room", "Spirit Temple MQ GS Symphony Room", true), - RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_SI, SCENE_SPIRIT_TEMPLE, 9730, GI_SKULL_TOKEN, "MQ GS Leever Room", "Spirit Temple MQ GS Leever Room", true), - RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_SI, SCENE_SPIRIT_TEMPLE, 9732, GI_SKULL_TOKEN, "MQ GS Nine Thrones Room West", "Spirit Temple MQ GS Nine Thrones Room West", true), - RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_SI, SCENE_SPIRIT_TEMPLE, 9744, GI_SKULL_TOKEN, "MQ GS Nine Thrones Room North", "Spirit Temple MQ GS Nine Thrones Room North", true), - RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_SI, SCENE_SPIRIT_TEMPLE, 9729, GI_SKULL_TOKEN, "MQ GS Sun Block Room", "Spirit Temple MQ GS Sun Block Room", true), - RC_OBJECT(RC_TWINROVA, RCVORMQ_BOTH, RCTYPE_DUNGEON_REWARD, RCAREA_SPIRIT_TEMPLE, ACTOR_DOOR_WARP1, SCENE_SPIRIT_TEMPLE_BOSS, 0x00, GI_NONE, "Twinrova", "Twinrova", true), - RC_OBJECT(RC_SPIRIT_TEMPLE_TWINROVA_HEART, RCVORMQ_BOTH, RCTYPE_BOSS_HEART_OR_OTHER_REWARD, RCAREA_SPIRIT_TEMPLE, ACTOR_ITEM_B_HEART, SCENE_SPIRIT_TEMPLE_BOSS, 0x00, GI_HEART_CONTAINER, "Twinrova Heart Container", "Spirit Temple Twinrova Heart Container", true), - - - RC_OBJECT(RC_SHADOW_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 6177, GI_MAP, "Map Chest", "Shadow Temple Map Chest", true), - RC_OBJECT(RC_SHADOW_TEMPLE_HOVER_BOOTS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 5607, GI_BOOTS_HOVER, "Hover Boots Chest", "Shadow Temple Hover Boots Chest", true), - RC_OBJECT(RC_SHADOW_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 6147, GI_COMPASS, "Compass Chest", "Shadow Temple Compass Chest", true), - RC_OBJECT(RC_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 22594, GI_KEY_SMALL, "Early Silver Rupee Chest", "Shadow Temple Early Silver Rupee Chest", true), - RC_OBJECT(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 22668, GI_MAGIC_LARGE, "Invisible Blades Visible Chest", "Shadow Temple Invisible Blades Visible Chest", false), - RC_OBJECT(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 26998, GI_ARROWS_LARGE, "Invisible Blades Invisible Chest", "Shadow Temple Invisible Blades Invisible Chest", false), - RC_OBJECT(RC_SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 22853, GI_ARROWS_MEDIUM, "Falling Spikes Lower Chest", "Shadow Temple Falling Spikes Lower Chest", false), - RC_OBJECT(RC_SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 22662, GI_MAGIC_LARGE, "Falling Spikes Upper Chest", "Shadow Temple Falling Spikes Upper Chest", false), - RC_OBJECT(RC_SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, -30652, GI_KEY_SMALL, "Falling Spikes Switch Chest", "Shadow Temple Falling Spikes Switch Chest", true), - RC_OBJECT(RC_SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 30857, GI_MAGIC_LARGE, "Invisible Spikes Chest", "Shadow Temple Invisible Spikes Chest", false), - RC_OBJECT(RC_SHADOW_TEMPLE_WIND_HINT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 26965, GI_ARROWS_MEDIUM, "Wind Hint Chest", "Shadow Temple Wind Hint Chest", false), - RC_OBJECT(RC_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 30856, GI_MAGIC_LARGE, "After Wind Enemy Chest", "Shadow Temple After Wind Enemy Chest", false), - RC_OBJECT(RC_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 26708, GI_KEY_SMALL, "After Wind Hidden Chest", "Shadow Temple After Wind Hidden Chest", false), - RC_OBJECT(RC_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 22666, GI_MAGIC_LARGE, "Spike Walls Left Chest", "Shadow Temple Spike Walls Left Chest", false), - RC_OBJECT(RC_SHADOW_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_BOSS_KEY, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 10219, GI_KEY_BOSS, "Boss Key Chest", "Shadow Temple Boss Key Chest", true), - RC_OBJECT(RC_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 30797, GI_KEY_SMALL, "Invisible Floormaster Chest", "Shadow Temple Invisible Floormaster Chest", true), - RC_OBJECT(RC_SHADOW_TEMPLE_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 273, GI_KEY_SMALL, "Freestanding Key", "Shadow Temple Freestanding Key", true), - RC_OBJECT(RC_SHADOW_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 6145, GI_COMPASS, "MQ Compass Chest", "Shadow Temple MQ Compass Chest", true), - RC_OBJECT(RC_SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 5607, GI_BOOTS_HOVER, "MQ Hover Boots Chest", "Shadow Temple MQ Hover Boots Chest", true), - RC_OBJECT(RC_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, RCVORMQ_MQ, RCTYPE_SMALL_KEY, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 30787, GI_KEY_SMALL, "MQ Early Gibdos Chest", "Shadow Temple MQ Early Gibdos Chest", true), - RC_OBJECT(RC_SHADOW_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 2082, GI_MAP, "MQ Map Chest", "Shadow Temple MQ Map Chest", true), - RC_OBJECT(RC_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, -30417, GI_ARROWS_SMALL, "MQ Beamos Silver Rupees Chest", "Shadow Temple MQ Beamos Silver Rupees Chest", false), - RC_OBJECT(RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 22662, GI_MAGIC_LARGE, "MQ Falling Spikes Switch Chest", "Shadow Temple MQ Falling Spikes Switch Chest", false), - RC_OBJECT(RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 22853, GI_ARROWS_MEDIUM, "MQ Falling Spikes Lower Chest", "Shadow Temple MQ Falling Spikes Lower Chest", false), - RC_OBJECT(RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST, RCVORMQ_MQ, RCTYPE_SMALL_KEY, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, -30652, GI_KEY_SMALL, "MQ Falling Spikes Upper Chest", "Shadow Temple MQ Falling Spikes Upper Chest", false), - RC_OBJECT(RC_SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 30857, GI_MAGIC_LARGE, "MQ Invisible Spikes Chest", "Shadow Temple MQ Invisible Spikes Chest", false), - RC_OBJECT(RC_SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_BOSS_KEY, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 10219, GI_KEY_BOSS, "MQ Boss Key Chest", "Shadow Temple MQ Boss Key Chest", true), - RC_OBJECT(RC_SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_SMALL_KEY, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 22666, GI_KEY_SMALL, "MQ Spike Walls Left Chest", "Shadow Temple MQ Spike Walls Left Chest", true), - RC_OBJECT(RC_SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 31184, GI_RUPEE_RED, "MQ Stalfos Room Chest", "Shadow Temple MQ Stalfos Room Chest", false), - RC_OBJECT(RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_SMALL_KEY, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 26710, GI_KEY_SMALL, "MQ Invisible Blades Invisible Chest", "Shadow Temple MQ Invisible Blades Invisible Chest", true), - RC_OBJECT(RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 22668, GI_MAGIC_LARGE, "MQ Invisible Blades Visible Chest", "Shadow Temple MQ Invisible Blades Visible Chest", false), - RC_OBJECT(RC_SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 31053, GI_ARROWS_MEDIUM, "MQ Bomb Flower Chest", "Shadow Temple MQ Bomb Flower Chest", false), - RC_OBJECT(RC_SHADOW_TEMPLE_MQ_WIND_HINT_CHEST, RCVORMQ_MQ, RCTYPE_SMALL_KEY, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 26709, GI_KEY_SMALL, "MQ Wind Hint Chest", "Shadow Temple MQ Wind Hint Chest", true), - RC_OBJECT(RC_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 26932, GI_ARROWS_SMALL, "MQ After Wind Hidden Chest", "Shadow Temple MQ After Wind Hidden Chest", false), - RC_OBJECT(RC_SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 30856, GI_MAGIC_LARGE, "MQ After Wind Enemy Chest", "Shadow Temple MQ After Wind Enemy Chest", false), - RC_OBJECT(RC_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_SMALL_KEY, RCAREA_SHADOW_TEMPLE, ACTOR_EN_BOX, SCENE_SHADOW_TEMPLE, 26702, GI_KEY_SMALL, "MQ Near Ship Invisible Chest", "Shadow Temple MQ Near Ship Invisible Chest", true), - RC_OBJECT(RC_SHADOW_TEMPLE_MQ_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_SMALL_KEY, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 1553, GI_KEY_SMALL, "MQ Freestanding Key", "Shadow Temple MQ Freestanding Key", true), - RC_OBJECT(RC_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, ACTOR_EN_SI, SCENE_SHADOW_TEMPLE, 9985, GI_SKULL_TOKEN, "GS Single Giant Pot", "Shadow Temple GS Single Giant Pot", true), - RC_OBJECT(RC_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, ACTOR_EN_SI, SCENE_SHADOW_TEMPLE, 9986, GI_SKULL_TOKEN, "GS Falling Spikes Room", "Shadow Temple GS Falling Spikes Room", true), - RC_OBJECT(RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, ACTOR_EN_SI, SCENE_SHADOW_TEMPLE, 9988, GI_SKULL_TOKEN, "GS Triple Giant Pot", "Shadow Temple GS Triple Giant Pot", true), - RC_OBJECT(RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, ACTOR_EN_SI, SCENE_SHADOW_TEMPLE, 9992, GI_SKULL_TOKEN, "GS Like Like Room", "Shadow Temple GS Like Like Room", true), - RC_OBJECT(RC_SHADOW_TEMPLE_GS_NEAR_SHIP, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, ACTOR_EN_SI, SCENE_SHADOW_TEMPLE, 10000, GI_SKULL_TOKEN, "GS Near Ship", "Shadow Temple GS Near Ship", true), - RC_OBJECT(RC_SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, ACTOR_EN_SI, SCENE_SHADOW_TEMPLE, 9986, GI_SKULL_TOKEN, "MQ GS Falling Spikes Room", "Shadow Temple MQ GS Falling Spikes Room", true), - RC_OBJECT(RC_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, ACTOR_EN_SI, SCENE_SHADOW_TEMPLE, 9985, GI_SKULL_TOKEN, "MQ GS Wind Hint Room", "Shadow Temple MQ GS Wind Hint Room", true), - RC_OBJECT(RC_SHADOW_TEMPLE_MQ_GS_AFTER_WIND, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, ACTOR_EN_SI, SCENE_SHADOW_TEMPLE, 9992, GI_SKULL_TOKEN, "MQ GS After Wind", "Shadow Temple MQ GS After Wind", true), - RC_OBJECT(RC_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, ACTOR_EN_SI, SCENE_SHADOW_TEMPLE, 10000, GI_SKULL_TOKEN, "MQ GS After Ship", "Shadow Temple MQ GS After Ship", true), - RC_OBJECT(RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, ACTOR_EN_SI, SCENE_SHADOW_TEMPLE, 9988, GI_SKULL_TOKEN, "MQ GS Near Boss", "Shadow Temple MQ GS Near Boss", true), - RC_OBJECT(RC_BONGO_BONGO, RCVORMQ_BOTH, RCTYPE_DUNGEON_REWARD, RCAREA_SHADOW_TEMPLE, ACTOR_DOOR_WARP1, SCENE_SHADOW_TEMPLE_BOSS, 0x00, GI_NONE, "Bongo Bongo", "Bongo Bongo", true), - RC_OBJECT(RC_SHADOW_TEMPLE_BONGO_BONGO_HEART, RCVORMQ_BOTH, RCTYPE_BOSS_HEART_OR_OTHER_REWARD, RCAREA_SHADOW_TEMPLE, ACTOR_ITEM_B_HEART, SCENE_SHADOW_TEMPLE_BOSS, 0x00, GI_HEART_CONTAINER, "Bongo Bongo Heart Container", "Shadow Temple Bongo Bongo Heart Container", true), - - - RC_OBJECT(RC_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_BOX, SCENE_BOTTOM_OF_THE_WELL, 22600, GI_KEY_SMALL, "Front Left Fake Wall Chest", "Bottom of the Well Front Left Fake Wall Chest", true), - RC_OBJECT(RC_BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_BOX, SCENE_BOTTOM_OF_THE_WELL, 20578, GI_BOMBCHUS_10, "Front Center Bombable Chest", "Bottom of the Well Front Center Bombable Chest", false), - RC_OBJECT(RC_BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_BOX, SCENE_BOTTOM_OF_THE_WELL, 22597, GI_KEY_SMALL, "Right Bottom Fake Wall Chest", "Bottom of the Well Right Bottom Fake Wall Chest", true), - RC_OBJECT(RC_BOTTOM_OF_THE_WELL_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_BOX, SCENE_BOTTOM_OF_THE_WELL, 2049, GI_COMPASS, "Compass Chest", "Bottom of the Well Compass Chest", true), - RC_OBJECT(RC_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_BOX, SCENE_BOTTOM_OF_THE_WELL, 20558, GI_NUTS_5, "Center Skulltula Chest", "Bottom of the Well Center Skulltula Chest", false), - RC_OBJECT(RC_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_BOX, SCENE_BOTTOM_OF_THE_WELL, 23684, GI_NUTS_10, "Back Left Bombable Chest", "Bottom of the Well Back Left Bombable Chest", false), - RC_OBJECT(RC_BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST, RCVORMQ_VANILLA, RCTYPE_BOSS_HEART_OR_OTHER_REWARD, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_BOX, SCENE_BOTTOM_OF_THE_WELL, 4419, GI_LENS, "Lens of Truth Chest", "Bottom of the Well Lens of Truth Chest", true), - RC_OBJECT(RC_BOTTOM_OF_THE_WELL_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_BOX, SCENE_BOTTOM_OF_THE_WELL, 27348, GI_RUPEE_GOLD, "Invisible Chest", "Bottom of the Well Invisible Chest", false), - RC_OBJECT(RC_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_BOX, SCENE_BOTTOM_OF_THE_WELL, 23760, GI_BOMBS_10, "Underwater Front Chest", "Bottom of the Well Underwater Front Chest", false), - RC_OBJECT(RC_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_BOX, SCENE_BOTTOM_OF_THE_WELL, 22793, GI_HEART, "Underwater Left Chest", "Bottom of the Well Underwater Left Chest", false), - RC_OBJECT(RC_BOTTOM_OF_THE_WELL_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_BOX, SCENE_BOTTOM_OF_THE_WELL, 2087, GI_MAP, "Map Chest", "Bottom of the Well Map Chest", true), - RC_OBJECT(RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_BOX, SCENE_BOTTOM_OF_THE_WELL, 21802, GI_SHIELD_DEKU, "Fire Keese Chest", "Bottom of the Well Fire Keese Chest", false), - RC_OBJECT(RC_BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_BOX, SCENE_BOTTOM_OF_THE_WELL, 21836, GI_SHIELD_HYLIAN, "Like Like Chest", "Bottom of the Well Like Like Chest", false), - RC_OBJECT(RC_BOTTOM_OF_THE_WELL_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 273, GI_KEY_SMALL, "Freestanding Key", "Bottom of the Well Freestanding Key", true), - RC_OBJECT(RC_BOTTOM_OF_THE_WELL_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_BOX, SCENE_BOTTOM_OF_THE_WELL, 2083, GI_MAP, "MQ Map Chest", "Bottom of the Well MQ Map Chest", true), - RC_OBJECT(RC_BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST, RCVORMQ_MQ, RCTYPE_BOSS_HEART_OR_OTHER_REWARD, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_BOX, SCENE_BOTTOM_OF_THE_WELL, -20159, GI_LENS, "MQ Lens of Truth Chest", "Bottom of the Well MQ Lens of Truth Chest", true), - RC_OBJECT(RC_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_BOX, SCENE_BOTTOM_OF_THE_WELL, 6146, GI_COMPASS, "MQ Compass Chest", "Bottom of the Well MQ Compass Chest", true), - RC_OBJECT(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_SMALL_KEY, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 529, GI_KEY_SMALL, "MQ Dead Hand Freestanding Key", "Bottom of the Well MQ Dead Hand Freestanding Key", true), - RC_OBJECT(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_SMALL_KEY, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 273, GI_KEY_SMALL, "MQ East Inner Room Freestanding Key", "Bottom of the Well MQ East Inner Room Freestanding Key", true), - RC_OBJECT(RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_SI, SCENE_BOTTOM_OF_THE_WELL, 10241, GI_SKULL_TOKEN, "GS Like Like Cage", "Bottom of the Well GS Like Like Cage", true), - RC_OBJECT(RC_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_SI, SCENE_BOTTOM_OF_THE_WELL, 10242, GI_SKULL_TOKEN, "GS East Inner Room", "Bottom of the Well GS East Inner Room", true), - RC_OBJECT(RC_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_SI, SCENE_BOTTOM_OF_THE_WELL, 10244, GI_SKULL_TOKEN, "GS West Inner Room", "Bottom of the Well GS West Inner Room", true), - RC_OBJECT(RC_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_SI, SCENE_BOTTOM_OF_THE_WELL, 10241, GI_SKULL_TOKEN, "MQ GS Basement", "Bottom of the Well MQ GS Basement", true), - RC_OBJECT(RC_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_SI, SCENE_BOTTOM_OF_THE_WELL, 10244, GI_SKULL_TOKEN, "MQ GS Coffin Room", "Bottom of the Well MQ GS Coffin Room", true), - RC_OBJECT(RC_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_SI, SCENE_BOTTOM_OF_THE_WELL, 10242, GI_SKULL_TOKEN, "MQ GS West Inner Room", "Bottom of the Well MQ GS West Inner Room", true), - - - RC_OBJECT(RC_ICE_CAVERN_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_ICE_CAVERN, ACTOR_EN_BOX, SCENE_ICE_CAVERN, 2080, GI_MAP, "Map Chest", "Ice Cavern Map Chest", true), - RC_OBJECT(RC_ICE_CAVERN_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_ICE_CAVERN, ACTOR_EN_BOX, SCENE_ICE_CAVERN, 2049, GI_COMPASS, "Compass Chest", "Ice Cavern Compass Chest", true), - RC_OBJECT(RC_ICE_CAVERN_IRON_BOOTS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, ACTOR_EN_BOX, SCENE_ICE_CAVERN, 5570, GI_BOOTS_IRON, "Iron Boots Chest", "Ice Cavern Iron Boots Chest", true), - RC_OBJECT(RC_ICE_CAVERN_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, 262, GI_HEART_PIECE, "Freestanding PoH", "Ice Cavern Freestanding PoH", true), - RC_OBJECT(RC_ICE_CAVERN_MQ_IRON_BOOTS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, ACTOR_EN_BOX, SCENE_ICE_CAVERN, 5570, GI_BOOTS_IRON, "MQ Iron Boots Chest", "Ice Cavern MQ Iron Boots Chest", true), - RC_OBJECT(RC_ICE_CAVERN_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_ICE_CAVERN, ACTOR_EN_BOX, SCENE_ICE_CAVERN, 2048, GI_COMPASS, "MQ Compass Chest", "Ice Cavern MQ Compass Chest", true), - RC_OBJECT(RC_ICE_CAVERN_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_ICE_CAVERN, ACTOR_EN_BOX, SCENE_ICE_CAVERN, -18399, GI_MAP, "MQ Map Chest", "Ice Cavern MQ Map Chest", true), - RC_OBJECT(RC_ICE_CAVERN_MQ_FREESTANDING_POH, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, 262, GI_HEART_PIECE, "MQ Freestanding PoH", "Ice Cavern MQ Freestanding PoH", true), - RC_OBJECT(RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, ACTOR_EN_SI, SCENE_ICE_CAVERN, 10497, GI_SKULL_TOKEN, "GS Push Block Room", "Ice Cavern GS Push Block Room", true), - RC_OBJECT(RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, ACTOR_EN_SI, SCENE_ICE_CAVERN, 10498, GI_SKULL_TOKEN, "GS Spinning Scythe Room", "Ice Cavern GS Spinning Scythe Room", true), - RC_OBJECT(RC_ICE_CAVERN_GS_HEART_PIECE_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, ACTOR_EN_SI, SCENE_ICE_CAVERN, 10500, GI_SKULL_TOKEN, "GS Heart Piece Room", "Ice Cavern GS Heart Piece Room", true), - RC_OBJECT(RC_ICE_CAVERN_MQ_GS_SCARECROW, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, ACTOR_EN_SI, SCENE_ICE_CAVERN, 10497, GI_SKULL_TOKEN, "MQ GS Scarecrow", "Ice Cavern MQ GS Scarecrow", true), - RC_OBJECT(RC_ICE_CAVERN_MQ_GS_ICE_BLOCK, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, ACTOR_EN_SI, SCENE_ICE_CAVERN, 10500, GI_SKULL_TOKEN, "MQ GS Ice Block", "Ice Cavern MQ GS Ice Block", true), - RC_OBJECT(RC_ICE_CAVERN_MQ_GS_RED_ICE, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, ACTOR_EN_SI, SCENE_ICE_CAVERN, 10498, GI_SKULL_TOKEN, "MQ GS Red Ice", "Ice Cavern MQ GS Red Ice", true), - RC_OBJECT(RC_SHEIK_IN_ICE_CAVERN, RCVORMQ_BOTH, RCTYPE_SONG_LOCATION, RCAREA_ICE_CAVERN, ACTOR_ID_MAX, SCENE_ICE_CAVERN, 0x00, GI_NONE, "Sheik in Ice Cavern", "Sheik in Ice Cavern", true), - - - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, -30573, GI_MAGIC_LARGE, "Lobby Left Chest", "Gerudo Training Grounds Lobby Left Chest", false), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, -30393, GI_ARROWS_MEDIUM, "Lobby Right Chest", "Gerudo Training Grounds Lobby Right Chest", false), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_STALFOS_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, -30656, GI_KEY_SMALL, "Stalfos Chest", "Gerudo Training Grounds Stalfos Chest", true), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_BEAMOS_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, -30655, GI_KEY_SMALL, "Beamos Chest", "Gerudo Training Grounds Beamos Chest", true), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_HIDDEN_CEILING_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 22603, GI_KEY_SMALL, "Hidden Ceiling Chest", "Gerudo Training Grounds Hidden Ceiling Chest", true), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FIRST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 23206, GI_RUPEE_PURPLE, "Maze Path First Chest", "Gerudo Training Grounds Maze Path First Chest", false), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MAZE_PATH_SECOND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 22986, GI_RUPEE_RED, "Maze Path Second Chest", "Gerudo Training Grounds Maze Path Second Chest", false), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MAZE_PATH_THIRD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 22889, GI_ARROWS_LARGE, "Maze Path Third Chest", "Gerudo Training Grounds Maze Path Third Chest", false), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FINAL_CHEST, RCVORMQ_VANILLA, RCTYPE_BOSS_HEART_OR_OTHER_REWARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 2860, GI_ARROW_ICE, "Maze Path Final Chest", "Gerudo Training Grounds Maze Path Final Chest", true), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_CENTRAL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 23877, GI_BOMBCHUS_5, "Maze Right Central Chest", "Gerudo Training Grounds Maze Right Central Chest", false), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 22888, GI_ARROWS_LARGE, "Maze Right Side Chest", "Gerudo Training Grounds Maze Right Side Chest", false), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_UNDERWATER_SILVER_RUPEE_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, -30643, GI_KEY_SMALL, "Underwater Silver Rupee Chest", "Gerudo Training Grounds Underwater Silver Rupee Chest", true), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 31058, GI_ARROWS_MEDIUM, "Hammer Room Clear Chest", "Gerudo Training Grounds Hammer Room Clear Chest", false), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 22608, GI_KEY_SMALL, "Hammer Room Switch Chest", "Gerudo Training Grounds Hammer Room Switch Chest", true), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_EYE_STATUE_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, -30653, GI_KEY_SMALL, "Eye Statue Chest", "Gerudo Training Grounds Eye Statue Chest", true), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_NEAR_SCARECROW_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 22596, GI_KEY_SMALL, "Near Scarecrow Chest", "Gerudo Training Grounds Near Scarecrow Chest", true), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 31089, GI_ARROWS_LARGE, "Before Heavy Block Chest", "Gerudo Training Grounds Before Heavy Block Chest", false), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FIRST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 31439, GI_RUPEE_GOLD, "Heavy Block First Chest", "Gerudo Training Grounds Heavy Block First Chest", false), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_SECOND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 30862, GI_MAGIC_LARGE, "Heavy Block Second Chest", "Gerudo Training Grounds Heavy Block Second Chest", false), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 26708, GI_KEY_SMALL, "Heavy Block Third Chest", "Gerudo Training Grounds Heavy Block Third Chest", true), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 24450, GI_ICE_TRAP, "Heavy Block Fourth Chest", "Gerudo Training Grounds Heavy Block Fourth Chest", false), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, 273, GI_KEY_SMALL, "Freestanding Key", "Gerudo Training Grounds Freestanding Key", true), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 23879, GI_BOMBCHUS_5, "MQ Lobby Right Chest", "Gerudo Training Grounds MQ Lobby Right Chest", false), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 22867, GI_ARROWS_MEDIUM, "MQ Lobby Left Chest", "Gerudo Training Grounds MQ Lobby Left Chest", false), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, -30304, GI_RUPEE_BLUE, "MQ First Iron Knuckle Chest", "Gerudo Training Grounds MQ First Iron Knuckle Chest", false), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_BEFORE_HEAVY_BLOCK_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 31057, GI_ARROWS_MEDIUM, "MQ Before Heavy Block Chest", "Gerudo Training Grounds MQ Before Heavy Block Chest", false), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_EYE_STATUE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, -32669, GI_BOMBCHUS_10, "MQ Eye Statue Chest", "Gerudo Training Grounds MQ Eye Statue Chest", false), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_FLAME_CIRCLE_CHEST, RCVORMQ_MQ, RCTYPE_SMALL_KEY, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, -30642, GI_KEY_SMALL, "MQ Flame Circle Chest", "Gerudo Training Grounds MQ Flame Circle Chest", true), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_SECOND_IRON_KNUCKLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 31058, GI_ARROWS_MEDIUM, "MQ Second Iron Knuckle Chest", "Gerudo Training Grounds MQ Second Iron Knuckle Chest", false), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST, RCVORMQ_MQ, RCTYPE_SMALL_KEY, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, -30655, GI_KEY_SMALL, "MQ Dinolfos Chest", "Gerudo Training Grounds MQ Dinolfos Chest", true), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_ICE_ARROWS_CHEST, RCVORMQ_MQ, RCTYPE_BOSS_HEART_OR_OTHER_REWARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, -17628, GI_ARROW_ICE, "MQ Ice Arrows Chest", "Gerudo Training Grounds MQ Ice Arrows Chest", true), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_CENTRAL_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 22661, GI_MAGIC_LARGE, "MQ Maze Right Central Chest", "Gerudo Training Grounds MQ Maze Right Central Chest", false), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_FIRST_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 22918, GI_RUPEE_GREEN, "MQ Maze Path First Chest", "Gerudo Training Grounds MQ Maze Path First Chest", false), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_SIDE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 24136, GI_RUPEE_GREEN_LOSE, "MQ Maze Right Side Chest", "Gerudo Training Grounds MQ Maze Right Side Chest", false), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 24137, GI_RUPEE_GREEN_LOSE, "MQ Maze Path Third Chest", "Gerudo Training Grounds MQ Maze Path Third Chest", false), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_SECOND_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 22986, GI_RUPEE_RED, "MQ Maze Path Second Chest", "Gerudo Training Grounds MQ Maze Path Second Chest", false), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 23211, GI_RUPEE_PURPLE, "MQ Hidden Ceiling Chest", "Gerudo Training Grounds MQ Hidden Ceiling Chest", false), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, RCVORMQ_MQ, RCTYPE_SMALL_KEY, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, -30643, GI_KEY_SMALL, "MQ Underwater Silver Rupee Chest", "Gerudo Training Grounds MQ Underwater Silver Rupee Chest", true), - RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_BOX, SCENE_GERUDO_TRAINING_GROUND, 31394, GI_RUPEE_PURPLE, "MQ Heavy Block Chest", "Gerudo Training Grounds MQ Heavy Block Chest", false), - - - RC_OBJECT(RC_GANONS_TOWER_BOSS_KEY_CHEST, RCVORMQ_BOTH, RCTYPE_GANON_BOSS_KEY, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_GANONS_TOWER, 10219, GI_KEY_BOSS, "Boss Key Chest", "Ganon's Tower Boss Key Chest", true), - RC_OBJECT(RC_GANONS_CASTLE_FOREST_TRIAL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, 30857, GI_MAGIC_LARGE, "Forest Trial Chest", "Ganon's Castle Forest Trial Chest", false), - RC_OBJECT(RC_GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, 24455, GI_ICE_TRAP, "Water Trial Left Chest", "Ganon's Castle Water Trial Left Chest", false), - RC_OBJECT(RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, 22790, GI_HEART, "Water Trial Right Chest", "Ganon's Castle Water Trial Right Chest", false), - RC_OBJECT(RC_GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, 22664, GI_MAGIC_LARGE, "Shadow Trial Front Chest", "Ganon's Castle Shadow Trial Front Chest", false), - RC_OBJECT(RC_GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, 14021, GI_GAUNTLETS_GOLD, "Shadow Trial Golden Gauntlets Chest", "Ganon's Castle Shadow Trial Golden Gauntlets Chest", true), - RC_OBJECT(RC_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, -29326, GI_BOMBCHUS_20, "Spirit Trial Crystal Switch Chest", "Ganon's Castle Spirit Trial Crystal Switch Chest", false), - RC_OBJECT(RC_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, 26964, GI_ARROWS_MEDIUM, "Spirit Trial Invisible Chest", "Ganon's Castle Spirit Trial Invisible Chest", false), - RC_OBJECT(RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, 22668, GI_MAGIC_LARGE, "Light Trial First Left Chest", "Ganon's Castle Light Trial First Left Chest", false), - RC_OBJECT(RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, 24459, GI_ICE_TRAP, "Light Trial Second Left Chest", "Ganon's Castle Light Trial Second Left Chest", false), - RC_OBJECT(RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, 22797, GI_HEART, "Light Trial Third Left Chest", "Ganon's Castle Light Trial Third Left Chest", false), - RC_OBJECT(RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, 24462, GI_ICE_TRAP, "Light Trial First Right Chest", "Ganon's Castle Light Trial First Right Chest", false), - RC_OBJECT(RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, 22890, GI_ARROWS_LARGE, "Light Trial Second Right Chest", "Ganon's Castle Light Trial Second Right Chest", false), - RC_OBJECT(RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, 24463, GI_ICE_TRAP, "Light Trial Third Right Chest", "Ganon's Castle Light Trial Third Right Chest", false), - RC_OBJECT(RC_GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, 30800, GI_KEY_SMALL, "Light Trial Invisible Enemies Chest", "Ganon's Castle Light Trial Invisible Enemies Chest", true), - RC_OBJECT(RC_GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST, RCVORMQ_VANILLA, RCTYPE_SMALL_KEY, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, -30639, GI_KEY_SMALL, "Light Trial Lullaby Chest", "Ganon's Castle Light Trial Lullaby Chest", true), - RC_OBJECT(RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, RCVORMQ_VANILLA, RCTYPE_SCRUB, RCAREA_GANONS_CASTLE, ACTOR_EN_DNS, SCENE_INSIDE_GANONS_CASTLE, 0x05, GI_BOMBS_5, "Deku Scrub Center-Left", "Ganon's Castle Deku Scrub Center-Left", false), - RC_OBJECT(RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, RCVORMQ_VANILLA, RCTYPE_SCRUB, RCAREA_GANONS_CASTLE, ACTOR_EN_DNS, SCENE_INSIDE_GANONS_CASTLE, 0x03, GI_SEEDS_30, "Deku Scrub Center-Right", "Ganon's Castle Deku Scrub Center-Right", false), - RC_OBJECT(RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT, RCVORMQ_VANILLA, RCTYPE_SCRUB, RCAREA_GANONS_CASTLE, ACTOR_EN_DNS, SCENE_INSIDE_GANONS_CASTLE, 0x07, GI_POTION_RED, "Deku Scrub Right", "Ganon's Castle Deku Scrub Right", false), - RC_OBJECT(RC_GANONS_CASTLE_DEKU_SCRUB_LEFT, RCVORMQ_VANILLA, RCTYPE_SCRUB, RCAREA_GANONS_CASTLE, ACTOR_EN_DNS, SCENE_INSIDE_GANONS_CASTLE, 0x08, GI_POTION_GREEN, "Deku Scrub Left", "Ganon's Castle Deku Scrub Left", false), - RC_OBJECT(RC_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, 22977, GI_RUPEE_RED, "MQ Water Trial Chest", "Ganon's Castle MQ Water Trial Chest", false), - RC_OBJECT(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, -30398, GI_ARROWS_MEDIUM, "MQ Forest Trial Eye Switch Chest", "Ganon's Castle MQ Forest Trial Eye Switch Chest", false), - RC_OBJECT(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, -32733, GI_BOMBS_5, "MQ Forest Trial Frozen Eye Switch Chest", "Ganon's Castle MQ Forest Trial Frozen Eye Switch Chest", false), - RC_OBJECT(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, -30460, GI_HEART, "MQ Light Trial Lullaby Chest", "Ganon's Castle MQ Light Trial Lullaby Chest", false), - RC_OBJECT(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, -30400, GI_ARROWS_MEDIUM, "MQ Shadow Trial Bomb Flower Chest", "Ganon's Castle MQ Shadow Trial Bomb Flower Chest", false), - RC_OBJECT(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_SMALL_KEY, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, -30651, GI_KEY_SMALL, "MQ Shadow Trial Eye Switch Chest", "Ganon's Castle MQ Shadow Trial Eye Switch Chest", true), - RC_OBJECT(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, -18746, GI_GAUNTLETS_GOLD, "MQ Spirit Trial Golden Gauntlets Chest", "Ganon's Castle MQ Spirit Trial Golden Gauntlets Chest", true), - RC_OBJECT(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, -30457, GI_HEART, "MQ Spirit Trial Sun Back Right Chest", "Ganon's Castle MQ Spirit Trial Sun Back Right Chest", false), - RC_OBJECT(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_SMALL_KEY, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, -30648, GI_KEY_SMALL, "MQ Spirit Trial Sun Back Left Chest", "Ganon's Castle MQ Spirit Trial Sun Back Left Chest", true), - RC_OBJECT(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, -30455, GI_HEART, "MQ Spirit Trial Sun Front Left Chest", "Ganon's Castle MQ Spirit Trial Sun Front Left Chest", false), - RC_OBJECT(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, 20586, GI_BOMBCHUS_10, "MQ Spirit Trial First Chest", "Ganon's Castle MQ Spirit Trial First Chest", false), - RC_OBJECT(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, ACTOR_EN_BOX, SCENE_INSIDE_GANONS_CASTLE, 26964, GI_ARROWS_MEDIUM, "MQ Spirit Trial Invisible Chest", "Ganon's Castle MQ Spirit Trial Invisible Chest", false), - RC_OBJECT(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_SMALL_KEY, RCAREA_GANONS_CASTLE, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, 273, GI_KEY_SMALL, "MQ Forest Trial Freestanding Key", "Ganon's Castle MQ Forest Trial Freestanding Key", true), - RC_OBJECT(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, RCVORMQ_MQ, RCTYPE_SCRUB, RCAREA_GANONS_CASTLE, ACTOR_EN_DNS, SCENE_INSIDE_GANONS_CASTLE, 0x00, GI_NUTS_5_2, "MQ Deku Scrub Right", "Ganon's Castle MQ Deku Scrub Right", false), - RC_OBJECT(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, RCVORMQ_MQ, RCTYPE_SCRUB, RCAREA_GANONS_CASTLE, ACTOR_EN_DNS, SCENE_INSIDE_GANONS_CASTLE, 0x05, GI_BOMBS_5, "MQ Deku Scrub Center-Left", "Ganon's Castle MQ Deku Scrub Center-Left", false), - RC_OBJECT(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, RCVORMQ_MQ, RCTYPE_SCRUB, RCAREA_GANONS_CASTLE, ACTOR_EN_DNS, SCENE_INSIDE_GANONS_CASTLE, 0x03, GI_SEEDS_30, "MQ Deku Scrub Center", "Ganon's Castle MQ Deku Scrub Center", false), - RC_OBJECT(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, RCVORMQ_MQ, RCTYPE_SCRUB, RCAREA_GANONS_CASTLE, ACTOR_EN_DNS, SCENE_INSIDE_GANONS_CASTLE, 0x07, GI_POTION_RED, "MQ Deku Scrub Center-Right", "Ganon's Castle MQ Deku Scrub Center-Right", false), - RC_OBJECT(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, RCVORMQ_MQ, RCTYPE_SCRUB, RCAREA_GANONS_CASTLE, ACTOR_EN_DNS, SCENE_INSIDE_GANONS_CASTLE, 0x08, GI_POTION_GREEN, "MQ Deku Scrub Left", "Ganon's Castle MQ Deku Scrub Left", false), - - - RC_OBJECT(RC_UNKNOWN_CHECK, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_INVALID, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, GI_NONE, "Invalid Check", "Invalid Check", false), +std::map rcAreaNames = { + { RCAREA_KOKIRI_FOREST, "Kokiri Forest" }, + { RCAREA_LOST_WOODS, "Lost Woods" }, + { RCAREA_SACRED_FOREST_MEADOW, "Sacred Forest Meadow" }, + { RCAREA_HYRULE_FIELD, "Hyrule Field" }, + { RCAREA_LAKE_HYLIA, "Lake Hylia" }, + { RCAREA_GERUDO_VALLEY, "Gerudo Valley" }, + { RCAREA_GERUDO_FORTRESS, "Gerudo Fortress" }, + { RCAREA_WASTELAND, "Desert Wasteland" }, + { RCAREA_DESERT_COLOSSUS, "Desert Colossus" }, + { RCAREA_MARKET, "Hyrule Market" }, + { RCAREA_HYRULE_CASTLE, "Hyrule Castle" }, + { RCAREA_KAKARIKO_VILLAGE, "Kakariko Village" }, + { RCAREA_GRAVEYARD, "Graveyard" }, + { RCAREA_DEATH_MOUNTAIN_TRAIL, "Death Mountain Trail" }, + { RCAREA_GORON_CITY, "Goron City" }, + { RCAREA_DEATH_MOUNTAIN_CRATER, "Death Mountain Crater" }, + { RCAREA_ZORAS_RIVER, "Zora's River" }, + { RCAREA_ZORAS_DOMAIN, "Zora's Domain" }, + { RCAREA_ZORAS_FOUNTAIN, "Zora's Fountain" }, + { RCAREA_LON_LON_RANCH, "Lon Lon Ranch" }, + { RCAREA_DEKU_TREE, "Deku Tree" }, + { RCAREA_DODONGOS_CAVERN, "Dodongo's Cavern" }, + { RCAREA_JABU_JABUS_BELLY, "Jabu Jabu's Belly" }, + { RCAREA_FOREST_TEMPLE, "Forest Temple" }, + { RCAREA_FIRE_TEMPLE, "Fire Temple" }, + { RCAREA_WATER_TEMPLE, "Water Temple" }, + { RCAREA_SPIRIT_TEMPLE, "Spirit Temple" }, + { RCAREA_SHADOW_TEMPLE, "Shadow Temple" }, + { RCAREA_BOTTOM_OF_THE_WELL, "Bottom of the Well" }, + { RCAREA_ICE_CAVERN, "Ice Cavern" }, + { RCAREA_GERUDO_TRAINING_GROUND, "Gerudo Training Grounds" }, + { RCAREA_GANONS_CASTLE, "Ganon's Castle" }, + { RCAREA_INVALID, "Invalid" }, }; -std::map rcAreaNames = { - { RCAREA_KOKIRI_FOREST, "Kokiri Forest"}, - { RCAREA_LOST_WOODS, "Lost Woods"}, - { RCAREA_SACRED_FOREST_MEADOW, "Sacred Forest Meadow"}, - { RCAREA_HYRULE_FIELD, "Hyrule Field"}, - { RCAREA_LAKE_HYLIA, "Lake Hylia"}, - { RCAREA_GERUDO_VALLEY, "Gerudo Valley"}, - { RCAREA_GERUDO_FORTRESS, "Gerudo Fortress"}, - { RCAREA_WASTELAND, "Desert Wasteland"}, - { RCAREA_DESERT_COLOSSUS, "Desert Colossus"}, - { RCAREA_MARKET, "Hyrule Market"}, - { RCAREA_HYRULE_CASTLE, "Hyrule Castle"}, - { RCAREA_KAKARIKO_VILLAGE, "Kakariko Village"}, - { RCAREA_GRAVEYARD, "Graveyard"}, - { RCAREA_DEATH_MOUNTAIN_TRAIL, "Death Mountain Trail"}, - { RCAREA_GORON_CITY, "Goron City"}, - { RCAREA_DEATH_MOUNTAIN_CRATER, "Death Mountain Crater"}, - { RCAREA_ZORAS_RIVER, "Zora's River"}, - { RCAREA_ZORAS_DOMAIN, "Zora's Domain"}, - { RCAREA_ZORAS_FOUNTAIN, "Zora's Fountain"}, - { RCAREA_LON_LON_RANCH, "Lon Lon Ranch"}, - { RCAREA_DEKU_TREE, "Deku Tree"}, - { RCAREA_DODONGOS_CAVERN, "Dodongo's Cavern"}, - { RCAREA_JABU_JABUS_BELLY, "Jabu Jabu's Belly"}, - { RCAREA_FOREST_TEMPLE, "Forest Temple"}, - { RCAREA_FIRE_TEMPLE, "Fire Temple"}, - { RCAREA_WATER_TEMPLE, "Water Temple"}, - { RCAREA_SPIRIT_TEMPLE, "Spirit Temple"}, - { RCAREA_SHADOW_TEMPLE, "Shadow Temple"}, - { RCAREA_BOTTOM_OF_THE_WELL, "Bottom of the Well"}, - { RCAREA_ICE_CAVERN, "Ice Cavern"}, - { RCAREA_GERUDO_TRAINING_GROUND, "Gerudo Training Grounds"}, - { RCAREA_GANONS_CASTLE, "Ganon's Castle"}, - { RCAREA_INVALID, "Invalid"}, - }; +std::map> rcObjectsByArea = {}; -std::map> rcObjectsByArea = {}; - -std::map> RandomizerCheckObjects::GetAllRCObjectsByArea() { +std::map> RandomizerCheckObjects::GetAllRCObjectsByArea() { if (rcObjectsByArea.size() == 0) { - for (auto& [randomizerCheck, rcObject] : rcObjects) { - rcObjectsByArea[rcObject.rcArea][randomizerCheck] = &rcObject; + for (auto& location : Rando::StaticData::GetLocationTable()) { + // There are some RCs that don't have checks implemented yet, prevent adding these to the map. + if (location.GetRandomizerCheck() != RC_UNKNOWN_CHECK) { + rcObjectsByArea[location.GetArea()].push_back(location.GetRandomizerCheck()); + } } } @@ -854,18 +58,10 @@ std::map> } bool RandomizerCheckObjects::AreaIsDungeon(RandomizerCheckArea area) { - return area == RCAREA_GANONS_CASTLE || - area == RCAREA_GERUDO_TRAINING_GROUND || - area == RCAREA_ICE_CAVERN || - area == RCAREA_BOTTOM_OF_THE_WELL || - area == RCAREA_SHADOW_TEMPLE || - area == RCAREA_SPIRIT_TEMPLE || - area == RCAREA_WATER_TEMPLE || - area == RCAREA_FIRE_TEMPLE || - area == RCAREA_FOREST_TEMPLE || - area == RCAREA_JABU_JABUS_BELLY || - area == RCAREA_DODONGOS_CAVERN || - area == RCAREA_DEKU_TREE; + return area == RCAREA_GANONS_CASTLE || area == RCAREA_GERUDO_TRAINING_GROUND || area == RCAREA_ICE_CAVERN || + area == RCAREA_BOTTOM_OF_THE_WELL || area == RCAREA_SHADOW_TEMPLE || area == RCAREA_SPIRIT_TEMPLE || + area == RCAREA_WATER_TEMPLE || area == RCAREA_FIRE_TEMPLE || area == RCAREA_FOREST_TEMPLE || + area == RCAREA_JABU_JABUS_BELLY || area == RCAREA_DODONGOS_CAVERN || area == RCAREA_DEKU_TREE; } bool RandomizerCheckObjects::AreaIsOverworld(RandomizerCheckArea area) { @@ -876,18 +72,17 @@ std::string RandomizerCheckObjects::GetRCAreaName(RandomizerCheckArea area) { return rcAreaNames[area]; } -std::map RandomizerCheckObjects::GetAllRCObjects() { - return rcObjects; -} - std::map rcAreaBySceneID = {}; std::map RandomizerCheckObjects::GetAllRCAreaBySceneID() { - //memoize on first request + // memoize on first request if (rcAreaBySceneID.size() == 0) { - for (auto& [randomizerCheck, rcObject] : rcObjects) { - rcAreaBySceneID[rcObject.sceneId] = rcObject.rcArea; + for (auto& location : Rando::StaticData::GetLocationTable()) { + // There are some RCs that don't have checks implemented yet, prevent adding these to the map. + if (location.GetRandomizerCheck() != RC_UNKNOWN_CHECK) { + rcAreaBySceneID[location.GetScene()] = location.GetArea(); + } } - //Add checkless Hyrule Market areas to the area return + // Add checkless Hyrule Market areas to the area return for (int id = (int)SCENE_MARKET_ENTRANCE_DAY; id <= (int)SCENE_MARKET_RUINS; id++) { rcAreaBySceneID[(SceneID)id] = RCAREA_MARKET; } @@ -908,65 +103,105 @@ RandomizerCheckArea RandomizerCheckObjects::GetRCAreaBySceneID(SceneID sceneId) } void RandomizerCheckObjects::UpdateImGuiVisibility() { - for (auto& [randomizerCheck, locationIt] : rcObjects) { - locationIt.visibleInImgui = ( - (locationIt.rc != RC_UNKNOWN_CHECK) && - (!RandomizerCheckObjects::AreaIsDungeon(locationIt.rcArea) || - locationIt.vOrMQ == RCVORMQ_BOTH || - locationIt.vOrMQ == RCVORMQ_MQ && - ((CVarGetInteger("gRandomizeMqDungeons", RO_MQ_DUNGEONS_NONE) == RO_MQ_DUNGEONS_SET_NUMBER && (CVarGetInteger("gRandomizeMqDungeonCount", 12) > 0) || // at least one MQ dungeon - CVarGetInteger("gRandomizeMqDungeons", RO_MQ_DUNGEONS_NONE) == RO_MQ_DUNGEONS_RANDOM_NUMBER)) || - locationIt.vOrMQ == RCVORMQ_VANILLA && - (CVarGetInteger("gRandomizeMqDungeons", RO_MQ_DUNGEONS_NONE) != RO_MQ_DUNGEONS_SET_NUMBER || CVarGetInteger("gRandomizeMqDungeonCount", 12) < 12) // at least one vanilla dungeon - ) && - (locationIt.rcType != RCTYPE_SHOP || CVarGetInteger("gRandomizeShopsanity", RO_SHOPSANITY_OFF) > RO_SHOPSANITY_ZERO_ITEMS) && - (locationIt.rcType != RCTYPE_SCRUB || CVarGetInteger("gRandomizeShuffleScrubs", RO_SCRUBS_OFF) != RO_SCRUBS_OFF || - locationIt.rc == RC_HF_DEKU_SCRUB_GROTTO || locationIt.rc == RC_LW_DEKU_SCRUB_GROTTO_FRONT || locationIt.rc == RC_LW_DEKU_SCRUB_NEAR_BRIDGE) && // The 3 scrubs that are always randomized - (locationIt.rcType != RCTYPE_MERCHANT || CVarGetInteger("gRandomizeShuffleMerchants", RO_SHUFFLE_MERCHANTS_OFF) != RO_SHUFFLE_MERCHANTS_OFF) && - (locationIt.rcType != RCTYPE_SONG_LOCATION || CVarGetInteger("gRandomizeShuffleSongs", RO_SONG_SHUFFLE_SONG_LOCATIONS) != RO_SONG_SHUFFLE_SONG_LOCATIONS) && // song locations - ((locationIt.rcType != RCTYPE_BOSS_HEART_OR_OTHER_REWARD && locationIt.rc != RC_SONG_FROM_IMPA && locationIt.rc != RC_SHEIK_IN_ICE_CAVERN) || - CVarGetInteger("gRandomizeShuffleSongs", RO_SONG_SHUFFLE_SONG_LOCATIONS) != RO_SONG_SHUFFLE_DUNGEON_REWARDS) && // song dungeon rewards - (locationIt.rcType != RCTYPE_DUNGEON_REWARD || CVarGetInteger("gRandomizeShuffleDungeonReward", RO_DUNGEON_REWARDS_END_OF_DUNGEON) != RO_DUNGEON_REWARDS_END_OF_DUNGEON) && // dungeon rewards end of dungeons - (locationIt.rcType != RCTYPE_OCARINA || CVarGetInteger("gRandomizeShuffleOcarinas", RO_GENERIC_NO)) && // ocarina locations - (locationIt.rc != RC_HC_ZELDAS_LETTER) && // don't show until we support shuffling letter - (locationIt.rcType != RCTYPE_GOSSIP_STONE) && // don't show gossip stones (maybe gossipsanity will be a thing eventually?) - (locationIt.rcType != RCTYPE_LINKS_POCKET) && // links pocket can be set to nothing if needed - (locationIt.rcType != RCTYPE_CHEST_GAME) && // don't show non final reward chest game checks until we support shuffling them - (locationIt.rcType != RCTYPE_SKULL_TOKEN || - (CVarGetInteger("gRandomizeShuffleTokens", RO_TOKENSANITY_OFF) == RO_TOKENSANITY_ALL) || - ((CVarGetInteger("gRandomizeShuffleTokens", RO_TOKENSANITY_OFF) == RO_TOKENSANITY_OVERWORLD) && RandomizerCheckObjects::AreaIsOverworld(locationIt.rcArea)) || - ((CVarGetInteger("gRandomizeShuffleTokens", RO_TOKENSANITY_OFF) == RO_TOKENSANITY_DUNGEONS) && RandomizerCheckObjects::AreaIsDungeon(locationIt.rcArea)) - ) && - (locationIt.rcType != RCTYPE_COW || CVarGetInteger("gRandomizeShuffleCows", RO_GENERIC_NO)) && - (locationIt.rcType != RCTYPE_ADULT_TRADE || CVarGetInteger("gRandomizeShuffleAdultTrade", RO_GENERIC_NO)) && - (locationIt.rc != RC_KF_KOKIRI_SWORD_CHEST || CVarGetInteger("gRandomizeShuffleKokiriSword", RO_GENERIC_NO)) && - (locationIt.rc != RC_ZR_MAGIC_BEAN_SALESMAN || CVarGetInteger("gRandomizeShuffleBeans", RO_GENERIC_NO)) && - (locationIt.rc != RC_HC_MALON_EGG || CVarGetInteger("gRandomizeShuffleWeirdEgg", RO_GENERIC_NO)) && - (locationIt.rcType != RCTYPE_FROG_SONG || CVarGetInteger("gRandomizeShuffleFrogSongRupees", RO_GENERIC_NO)) && - (locationIt.rcType != RCTYPE_MAP_COMPASS || CVarGetInteger("gRandomizeStartingMapsCompasses", RO_DUNGEON_ITEM_LOC_OWN_DUNGEON) != RO_DUNGEON_ITEM_LOC_VANILLA) && - (locationIt.rcType != RCTYPE_SMALL_KEY || CVarGetInteger("gRandomizeKeysanity", RO_DUNGEON_ITEM_LOC_OWN_DUNGEON) != RO_DUNGEON_ITEM_LOC_VANILLA) && - (locationIt.rcType != RCTYPE_BOSS_KEY || CVarGetInteger("gRandomizeBossKeysanity", RO_DUNGEON_ITEM_LOC_OWN_DUNGEON) != RO_DUNGEON_ITEM_LOC_VANILLA) && - (locationIt.rcType != RCTYPE_GANON_BOSS_KEY || CVarGetInteger("gRandomizeShuffleGanonBossKey", RO_GANON_BOSS_KEY_VANILLA) != RO_GANON_BOSS_KEY_VANILLA) && // vanilla ganon boss key - (locationIt.rc != RC_TOT_LIGHT_ARROWS_CUTSCENE || - (CVarGetInteger("gRandomizeShuffleGanonBossKey", RO_GANON_BOSS_KEY_VANILLA) != RO_GANON_BOSS_KEY_LACS_DUNGEONS && - CVarGetInteger("gRandomizeShuffleGanonBossKey", RO_GANON_BOSS_KEY_VANILLA) != RO_GANON_BOSS_KEY_LACS_MEDALLIONS && - CVarGetInteger("gRandomizeShuffleGanonBossKey", RO_GANON_BOSS_KEY_VANILLA) != RO_GANON_BOSS_KEY_LACS_REWARDS && - CVarGetInteger("gRandomizeShuffleGanonBossKey", RO_GANON_BOSS_KEY_VANILLA) != RO_GANON_BOSS_KEY_LACS_STONES && - CVarGetInteger("gRandomizeShuffleGanonBossKey", RO_GANON_BOSS_KEY_VANILLA) != RO_GANON_BOSS_KEY_LACS_TOKENS && - CVarGetInteger("gRandomizeShuffleGanonBossKey", RO_GANON_BOSS_KEY_VANILLA) != RO_GANON_BOSS_KEY_LACS_VANILLA) - ) && // LACS ganon boss key - (locationIt.rc != RC_KAK_100_GOLD_SKULLTULA_REWARD || CVarGetInteger("gRandomizeShuffleGanonBossKey", RO_GANON_BOSS_KEY_VANILLA) != RO_GANON_BOSS_KEY_KAK_TOKENS) && // 100 skull reward ganon boss key - (locationIt.rcType != RCTYPE_GF_KEY && locationIt.rc != RC_GF_GERUDO_MEMBERSHIP_CARD || - (CVarGetInteger("gRandomizeGerudoFortress", RO_GF_NORMAL) == RO_GF_OPEN && locationIt.rcType != RCTYPE_GF_KEY && locationIt.rc != RC_GF_GERUDO_MEMBERSHIP_CARD) || - (CVarGetInteger("gRandomizeGerudoFortress", RO_GF_NORMAL) == RO_GF_FAST && - ((locationIt.rc == RC_GF_GERUDO_MEMBERSHIP_CARD && CVarGetInteger("gRandomizeShuffleGerudoToken", RO_GENERIC_NO) == RO_GENERIC_YES) || - (locationIt.rc == RC_GF_NORTH_F1_CARPENTER && CVarGetInteger("gRandomizeGerudoKeys", RO_GERUDO_KEYS_VANILLA) != RO_GERUDO_KEYS_VANILLA)) - ) || - (CVarGetInteger("gRandomizeGerudoFortress", RO_GF_NORMAL) == RO_GF_NORMAL && - ((locationIt.rc == RC_GF_GERUDO_MEMBERSHIP_CARD && CVarGetInteger("gRandomizeShuffleGerudoToken", RO_GENERIC_NO) == RO_GENERIC_YES) || - (locationIt.rcType == RCTYPE_GF_KEY && CVarGetInteger("gRandomizeGerudoKeys", RO_GERUDO_KEYS_VANILLA) != RO_GERUDO_KEYS_VANILLA)) - ) - ) - ); + auto ctx = Rando::Context::GetInstance(); + for (auto& location : Rando::StaticData::GetLocationTable()) { + auto itemLoc = ctx->GetItemLocation(location.GetRandomizerCheck()); + itemLoc->SetVisible( + (location.GetRandomizerCheck() != RC_UNKNOWN_CHECK) && + (!RandomizerCheckObjects::AreaIsDungeon(location.GetArea()) || location.GetQuest() == RCQUEST_BOTH || + location.GetQuest() == RCQUEST_MQ && + ((CVarGetInteger("gRandomizeMqDungeons", RO_MQ_DUNGEONS_NONE) == RO_MQ_DUNGEONS_SET_NUMBER && + (CVarGetInteger("gRandomizeMqDungeonCount", 12) > 0) || // at least one MQ dungeon + CVarGetInteger("gRandomizeMqDungeons", RO_MQ_DUNGEONS_NONE) == RO_MQ_DUNGEONS_RANDOM_NUMBER)) || + location.GetQuest() == RCQUEST_VANILLA && + (CVarGetInteger("gRandomizeMqDungeons", RO_MQ_DUNGEONS_NONE) != RO_MQ_DUNGEONS_SET_NUMBER || + CVarGetInteger("gRandomizeMqDungeonCount", 12) < 12) // at least one vanilla dungeon + ) && + (location.GetRCType() != RCTYPE_SHOP || + CVarGetInteger("gRandomizeShopsanity", RO_SHOPSANITY_OFF) > RO_SHOPSANITY_ZERO_ITEMS) && + (location.GetRCType() != RCTYPE_SCRUB || + CVarGetInteger("gRandomizeShuffleScrubs", RO_SCRUBS_OFF) != RO_SCRUBS_OFF || + location.GetRandomizerCheck() == RC_HF_DEKU_SCRUB_GROTTO || + location.GetRandomizerCheck() == RC_LW_DEKU_SCRUB_GROTTO_FRONT || + location.GetRandomizerCheck() == + RC_LW_DEKU_SCRUB_NEAR_BRIDGE) && // The 3 scrubs that are always randomized + (location.GetRCType() != RCTYPE_MERCHANT || + CVarGetInteger("gRandomizeShuffleMerchants", RO_SHUFFLE_MERCHANTS_OFF) != RO_SHUFFLE_MERCHANTS_OFF) && + (location.GetRCType() != RCTYPE_SONG_LOCATION || + CVarGetInteger("gRandomizeShuffleSongs", RO_SONG_SHUFFLE_SONG_LOCATIONS) != + RO_SONG_SHUFFLE_SONG_LOCATIONS) && // song locations + ((location.GetRCType() != RCTYPE_BOSS_HEART_OR_OTHER_REWARD && + location.GetRandomizerCheck() != RC_SONG_FROM_IMPA && + location.GetRandomizerCheck() != RC_SHEIK_IN_ICE_CAVERN) || + CVarGetInteger("gRandomizeShuffleSongs", RO_SONG_SHUFFLE_SONG_LOCATIONS) != + RO_SONG_SHUFFLE_DUNGEON_REWARDS) && // song dungeon rewards + (location.GetRCType() != RCTYPE_DUNGEON_REWARD || + CVarGetInteger("gRandomizeShuffleDungeonReward", RO_DUNGEON_REWARDS_END_OF_DUNGEON) != + RO_DUNGEON_REWARDS_END_OF_DUNGEON) && // dungeon rewards end of dungeons + (location.GetRCType() != RCTYPE_OCARINA || + CVarGetInteger("gRandomizeShuffleOcarinas", RO_GENERIC_NO)) && // ocarina locations + (location.GetRandomizerCheck() != RC_HC_ZELDAS_LETTER) && // don't show until we support shuffling letter + (location.GetRCType() != + RCTYPE_GOSSIP_STONE) && // don't show gossip stones (maybe gossipsanity will be a thing eventually?) + (location.GetRCType() != RCTYPE_LINKS_POCKET) && // links pocket can be set to nothing if needed + (location.GetRCType() != + RCTYPE_CHEST_GAME) && // don't show non final reward chest game checks until we support shuffling them + (location.GetRCType() != RCTYPE_SKULL_TOKEN || + (CVarGetInteger("gRandomizeShuffleTokens", RO_TOKENSANITY_OFF) == RO_TOKENSANITY_ALL) || + ((CVarGetInteger("gRandomizeShuffleTokens", RO_TOKENSANITY_OFF) == RO_TOKENSANITY_OVERWORLD) && + RandomizerCheckObjects::AreaIsOverworld(location.GetArea())) || + ((CVarGetInteger("gRandomizeShuffleTokens", RO_TOKENSANITY_OFF) == RO_TOKENSANITY_DUNGEONS) && + RandomizerCheckObjects::AreaIsDungeon(location.GetArea()))) && + (location.GetRCType() != RCTYPE_COW || CVarGetInteger("gRandomizeShuffleCows", RO_GENERIC_NO)) && + (location.GetRCType() != RCTYPE_ADULT_TRADE || + CVarGetInteger("gRandomizeShuffleAdultTrade", RO_GENERIC_NO)) && + (location.GetRandomizerCheck() != RC_KF_KOKIRI_SWORD_CHEST || + CVarGetInteger("gRandomizeShuffleKokiriSword", RO_GENERIC_NO)) && + (location.GetRandomizerCheck() != RC_ZR_MAGIC_BEAN_SALESMAN || + CVarGetInteger("gRandomizeShuffleBeans", RO_GENERIC_NO)) && + (location.GetRandomizerCheck() != RC_HC_MALON_EGG || + CVarGetInteger("gRandomizeShuffleWeirdEgg", RO_GENERIC_NO)) && + (location.GetRCType() != RCTYPE_FROG_SONG || + CVarGetInteger("gRandomizeShuffleFrogSongRupees", RO_GENERIC_NO)) && + (location.GetRCType() != RCTYPE_MAP_COMPASS || + CVarGetInteger("gRandomizeStartingMapsCompasses", RO_DUNGEON_ITEM_LOC_OWN_DUNGEON) != + RO_DUNGEON_ITEM_LOC_VANILLA) && + (location.GetRCType() != RCTYPE_SMALL_KEY || + CVarGetInteger("gRandomizeKeysanity", RO_DUNGEON_ITEM_LOC_OWN_DUNGEON) != RO_DUNGEON_ITEM_LOC_VANILLA) && + (location.GetRCType() != RCTYPE_BOSS_KEY || + CVarGetInteger("gRandomizeBossKeysanity", RO_DUNGEON_ITEM_LOC_OWN_DUNGEON) != + RO_DUNGEON_ITEM_LOC_VANILLA) && + (location.GetRCType() != RCTYPE_GANON_BOSS_KEY || + CVarGetInteger("gRandomizeShuffleGanonBossKey", RO_GANON_BOSS_KEY_VANILLA) != + RO_GANON_BOSS_KEY_VANILLA) && // vanilla ganon boss key + (location.GetRandomizerCheck() != RC_TOT_LIGHT_ARROWS_CUTSCENE || + (CVarGetInteger("gRandomizeShuffleGanonBossKey", RO_GANON_BOSS_KEY_VANILLA) != + RO_GANON_BOSS_KEY_LACS_DUNGEONS && + CVarGetInteger("gRandomizeShuffleGanonBossKey", RO_GANON_BOSS_KEY_VANILLA) != + RO_GANON_BOSS_KEY_LACS_MEDALLIONS && + CVarGetInteger("gRandomizeShuffleGanonBossKey", RO_GANON_BOSS_KEY_VANILLA) != + RO_GANON_BOSS_KEY_LACS_REWARDS && + CVarGetInteger("gRandomizeShuffleGanonBossKey", RO_GANON_BOSS_KEY_VANILLA) != + RO_GANON_BOSS_KEY_LACS_STONES && + CVarGetInteger("gRandomizeShuffleGanonBossKey", RO_GANON_BOSS_KEY_VANILLA) != + RO_GANON_BOSS_KEY_LACS_TOKENS && + CVarGetInteger("gRandomizeShuffleGanonBossKey", RO_GANON_BOSS_KEY_VANILLA) != + RO_GANON_BOSS_KEY_LACS_VANILLA)) && // LACS ganon boss key + (location.GetRandomizerCheck() != RC_KAK_100_GOLD_SKULLTULA_REWARD || + CVarGetInteger("gRandomizeShuffleGanonBossKey", RO_GANON_BOSS_KEY_VANILLA) != + RO_GANON_BOSS_KEY_KAK_TOKENS) && // 100 skull reward ganon boss key + (location.GetRCType() != RCTYPE_GF_KEY && location.GetRandomizerCheck() != RC_GF_GERUDO_MEMBERSHIP_CARD || + (CVarGetInteger("gRandomizeGerudoFortress", RO_GF_NORMAL) == RO_GF_OPEN && + location.GetRCType() != RCTYPE_GF_KEY && location.GetRandomizerCheck() != RC_GF_GERUDO_MEMBERSHIP_CARD) || + (CVarGetInteger("gRandomizeGerudoFortress", RO_GF_NORMAL) == RO_GF_FAST && + ((location.GetRandomizerCheck() == RC_GF_GERUDO_MEMBERSHIP_CARD && + CVarGetInteger("gRandomizeShuffleGerudoToken", RO_GENERIC_NO) == RO_GENERIC_YES) || + (location.GetRandomizerCheck() == RC_GF_NORTH_F1_CARPENTER && + CVarGetInteger("gRandomizeGerudoKeys", RO_GERUDO_KEYS_VANILLA) != RO_GERUDO_KEYS_VANILLA))) || + (CVarGetInteger("gRandomizeGerudoFortress", RO_GF_NORMAL) == RO_GF_NORMAL && + ((location.GetRandomizerCheck() == RC_GF_GERUDO_MEMBERSHIP_CARD && + CVarGetInteger("gRandomizeShuffleGerudoToken", RO_GENERIC_NO) == RO_GENERIC_YES) || + (location.GetRCType() == RCTYPE_GF_KEY && + CVarGetInteger("gRandomizeGerudoKeys", RO_GERUDO_KEYS_VANILLA) != RO_GERUDO_KEYS_VANILLA))))); } } diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.h b/soh/soh/Enhancements/randomizer/randomizer_check_objects.h index dc9bd2010..ab7e5538a 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.h +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.h @@ -1,38 +1,18 @@ #pragma once #include "randomizerTypes.h" +#include "z64actor_enum.h" +#include "z64scene.h" #include +#include #include -// Forward Declarations to avoid duplicate definition issues -enum ActorID : int; -enum SceneID : int; - #define TWO_ACTOR_PARAMS(a, b) (abs(a) << 16) | abs(b) -#define RC_OBJECT(rc, rc_v_or_mq, rc_type, rc_area, actor_id, scene_id, actor_params, og_item_id, rc_shortname, rc_spoilername, vanillaCompletion) \ - { rc, {rc, rc_v_or_mq, rc_type, rc_area, actor_id, scene_id, actor_params, og_item_id, false, rc_shortname, rc_spoilername, vanillaCompletion} } - -typedef struct { - RandomizerCheck rc; - RandomizerCheckVanillaOrMQ vOrMQ; - RandomizerCheckType rcType; - RandomizerCheckArea rcArea; - ActorID actorId; - SceneID sceneId; - int32_t actorParams; - GetItemID ogItemId; - bool visibleInImgui; - std::string rcShortName; - std::string rcSpoilerName; - bool vanillaCompletion; -} RandomizerCheckObject; - namespace RandomizerCheckObjects { bool AreaIsDungeon(RandomizerCheckArea area); bool AreaIsOverworld(RandomizerCheckArea area); std::string GetRCAreaName(RandomizerCheckArea area); - std::map GetAllRCObjects(); - std::map> GetAllRCObjectsByArea(); + std::map> GetAllRCObjectsByArea(); std::map GetAllRCAreaBySceneID(); RandomizerCheckArea GetRCAreaBySceneID(SceneID sceneId); void UpdateImGuiVisibility(); diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index 0884a694f..5366e8905 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -9,9 +9,11 @@ #include #include #include -#include "3drando/item_location.hpp" +#include "location.h" +#include "item_location.h" #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "z64item.h" +#include "randomizerTypes.h" extern "C" { #include "variables.h" @@ -78,6 +80,7 @@ bool initialized; bool doAreaScroll; bool previousShowHidden = false; bool hideShopRightChecks = true; +bool hideTriforceCompleted = true; bool checkCollected = false; int checkLoops = 0; @@ -110,7 +113,7 @@ std::map RCAreaFromSceneID = { {SCENE_INSIDE_GANONS_CASTLE, RCAREA_GANONS_CASTLE}, }; -std::map> checksByArea; +std::map> checksByArea; bool areasFullyChecked[RCAREA_INVALID]; u32 areasSpoiled = 0; bool showVOrMQ; @@ -126,9 +129,9 @@ std::vector itemsReceived; OSContPad* trackerButtonsPressed; void BeginFloatWindows(std::string UniqueName, bool& open, ImGuiWindowFlags flags = 0); -bool CompareChecks(RandomizerCheckObject, RandomizerCheckObject); +bool CompareChecks(RandomizerCheck, RandomizerCheck); bool CheckByArea(RandomizerCheckArea); -void DrawLocation(RandomizerCheckObject); +void DrawLocation(RandomizerCheck); void EndFloatWindows(); bool HasItemBeenCollected(RandomizerCheck); void LoadSettings(); @@ -138,6 +141,7 @@ void UpdateInventoryChecks(); void UpdateOrdering(RandomizerCheckArea); int sectionId; + SceneID DungeonSceneLookupByArea(RandomizerCheckArea area) { switch (area) { case RCAREA_DEKU_TREE: return SCENE_DEKU_TREE; @@ -219,7 +223,7 @@ void GiftFromSages() { } } -std::vector checks; +std::vector checks; // Function for adding Link's Pocket check void LinksPocket() { if (IS_RANDO) { @@ -234,21 +238,16 @@ void LinksPocket() { void TrySetAreas() { if (checksByArea.empty()) { for (int i = RCAREA_KOKIRI_FOREST; i < RCAREA_INVALID; i++) { - checksByArea.emplace(static_cast(i), std::vector()); + checksByArea.emplace(static_cast(i), std::vector()); } } } void SetCheckCollected(RandomizerCheck rc) { gSaveContext.checkTrackerData[rc].status = RCSHOW_COLLECTED; - RandomizerCheckObject rcObj; - if (rc == RC_GIFT_FROM_SAGES && !IS_RANDO) { - rcObj = RCO_RAORU; - } else { - rcObj = RandomizerCheckObjects::GetAllRCObjects().find(rc)->second; - } + Rando::Location* loc = Rando::StaticData::GetLocation(rc); if (!gSaveContext.checkTrackerData[rc].skipped) { - areaChecksGotten[rcObj.rcArea]++; + areaChecksGotten[loc->GetArea()]++; } else { gSaveContext.checkTrackerData[rc].skipped = false; } @@ -258,7 +257,7 @@ void SetCheckCollected(RandomizerCheck rc) { SaveManager::Instance->SaveSection(gSaveContext.fileNum, sectionId, true); doAreaScroll = true; - UpdateOrdering(rcObj.rcArea); + UpdateOrdering(loc->GetArea()); UpdateInventoryChecks(); } @@ -359,10 +358,10 @@ bool vector_contains_scene(std::vector vec, const int16_t scene) { std::vector skipScenes = {SCENE_GANON_BOSS, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, SCENE_GANON_BOSS, SCENE_INSIDE_GANONS_CASTLE_COLLAPSE, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR}; -bool EvaluateCheck(RandomizerCheckObject rco) { - if (HasItemBeenCollected(rco.rc) && gSaveContext.checkTrackerData[rco.rc].status != RCSHOW_COLLECTED && - gSaveContext.checkTrackerData[rco.rc].status != RCSHOW_SAVED) { - SetCheckCollected(rco.rc); +bool EvaluateCheck(RandomizerCheck rc) { + if (HasItemBeenCollected(rc) && gSaveContext.checkTrackerData[rc].status != RCSHOW_COLLECTED && + gSaveContext.checkTrackerData[rc].status != RCSHOW_SAVED) { + SetCheckCollected(rc); return true; } return false; @@ -378,8 +377,8 @@ bool CheckByArea(RandomizerCheckArea area = RCAREA_INVALID) { checkCounter = 0; checkLoops++; } - auto rco = areaChecks.at(checkCounter); - return EvaluateCheck(rco); + auto rc = areaChecks.at(checkCounter); + return EvaluateCheck(rc); } } @@ -404,8 +403,8 @@ bool HasItemBeenCollected(RandomizerCheck rc) { if (gPlayState == nullptr) { return false; } - ItemLocation* x = Location(rc); - SpoilerCollectionCheck check = x->GetCollectionCheck(); + Rando::Location* x = Rando::StaticData::GetLocation(rc); + Rando::SpoilerCollectionCheck check = x->GetCollectionCheck(); auto flag = check.flag; auto scene = check.scene; auto type = check.type; @@ -640,9 +639,9 @@ void CheckTrackerItemReceive(GetItemEntry giEntry) { void InitTrackerData(bool isDebug) { TrySetAreas(); - for (auto& [rc, rco] : RandomizerCheckObjects::GetAllRCObjects()) { - if (rc != RC_UNKNOWN_CHECK && rc != RC_MAX) { - DefaultCheckData(rc); + for (auto& loc : Rando::StaticData::GetLocationTable()) { + if (loc.GetRandomizerCheck() != RC_UNKNOWN_CHECK && loc.GetRandomizerCheck() != RC_MAX) { + DefaultCheckData(loc.GetRandomizerCheck()); } } UpdateAllOrdering(); @@ -689,25 +688,27 @@ void LoadFile() { }); RandomizerCheckTrackerData entry = gSaveContext.checkTrackerData[i]; RandomizerCheck rc = static_cast(i); - if (rc == RC_UNKNOWN_CHECK || rc == RC_MAX || - !RandomizerCheckObjects::GetAllRCObjects().contains(rc)) + if (rc == RC_UNKNOWN_CHECK || rc == RC_MAX) return; - RandomizerCheckObject entry2; + Rando::Location* entry2; if (rc == RC_GIFT_FROM_SAGES && !IS_RANDO) { - entry2 = RCO_RAORU; + entry2 = Rando::StaticData::GetLocation(rc); } else { - entry2 = RandomizerCheckObjects::GetAllRCObjects().find(rc)->second; + entry2 = Rando::StaticData::GetLocation(rc); } - if (!IsVisibleInCheckTracker(entry2)) return; + if (!IsVisibleInCheckTracker(entry2->GetRandomizerCheck())) return; - checksByArea.find(entry2.rcArea)->second.push_back(entry2); + if (entry2->GetRandomizerCheck() != RC_LINKS_POCKET) { + // RC_LINKS_POCKET is a special case because it's RCAREA is different depending on starting age. + checksByArea.find(entry2->GetArea())->second.push_back(entry2->GetRandomizerCheck()); + } if (entry.status == RCSHOW_SAVED || entry.skipped) { - areaChecksGotten[entry2.rcArea]++; + areaChecksGotten[entry2->GetArea()]++; } - if (areaChecksGotten[entry2.rcArea] != 0 || RandomizerCheckObjects::AreaIsOverworld(entry2.rcArea)) { - areasSpoiled |= (1 << entry2.rcArea); + if (areaChecksGotten[entry2->GetArea()] != 0 || RandomizerCheckObjects::AreaIsOverworld(entry2->GetArea())) { + areasSpoiled |= (1 << entry2->GetArea()); } }); if (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LINKS_POCKET) != RO_LINKS_POCKET_NOTHING && IS_RANDO) { @@ -724,9 +725,8 @@ void LoadFile() { startingArea = RCAREA_KOKIRI_FOREST; break; } - RandomizerCheckObject linksPocket = { RC_LINKS_POCKET, RCVORMQ_BOTH, RCTYPE_LINKS_POCKET, startingArea, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, GI_NONE, false, "Link's Pocket", "Link's Pocket" }; - checksByArea.find(startingArea)->second.push_back(linksPocket); + checksByArea.find(startingArea)->second.push_back(RC_LINKS_POCKET); areaChecksGotten[startingArea]++; } @@ -756,7 +756,7 @@ void Teardown() { } void UpdateCheck(uint32_t check, RandomizerCheckTrackerData data) { - auto area = RandomizerCheckObjects::GetAllRCObjects().find(static_cast(check))->second.rcArea; + auto area = Rando::StaticData::GetLocation(static_cast(check))->GetArea(); if (!gSaveContext.checkTrackerData[check].skipped && data.skipped) { areaChecksGotten[area]++; } else if (gSaveContext.checkTrackerData[check].skipped && !data.skipped) { @@ -869,10 +869,10 @@ void CheckTrackerWindow::DrawElement() { std::string stemp; s32 areaMask = 1; - for (auto& [rcArea, objs] : checksByArea) { + for (auto& [rcArea, checks] : checksByArea) { RandomizerCheckArea thisArea = currentArea; - const int areaChecksTotal = static_cast(objs.size()); + const int areaChecksTotal = static_cast(checks.size()); thisAreaFullyChecked = (areaChecksGotten[rcArea] == areaChecksTotal); //Last Area needs to be cleaned up if (lastArea != RCAREA_INVALID && doDraw) { @@ -942,9 +942,9 @@ void CheckTrackerWindow::DrawElement() { ImGui::SetScrollHereY(0.0f); doAreaScroll = false; } - for (auto rco : objs) { - if (doDraw && isThisAreaSpoiled && IsVisibleInCheckTracker(rco)) - DrawLocation(rco); + for (auto rc : checks) { + if (doDraw && isThisAreaSpoiled && IsVisibleInCheckTracker(rc)) + DrawLocation(rc); } if (doDraw) ImGui::TreePop(); @@ -1052,6 +1052,8 @@ void LoadSettings() { OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LINKS_POCKET) != RO_LINKS_POCKET_NOTHING :false; hideShopRightChecks = IS_RANDO ? CVarGetInteger("gCheckTrackerOptionHideRightShopChecks", 1) : false; + hideTriforceCompleted = IS_RANDO ? + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT) != RO_GENERIC_ON : false; if (IS_RANDO) { switch (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_TOKENS)) { @@ -1093,58 +1095,62 @@ void LoadSettings() { } } -bool IsVisibleInCheckTracker(RandomizerCheckObject rcObj) { +bool IsVisibleInCheckTracker(RandomizerCheck rc) { + Rando::Location* loc = Rando::StaticData::GetLocation(rc); if (IS_RANDO) { return - (rcObj.rcArea != RCAREA_INVALID) && // don't show Invalid locations - (rcObj.rcType != RCTYPE_GOSSIP_STONE) && //TODO: Don't show hints until tracker supports them - (rcObj.rcType != RCTYPE_CHEST_GAME) && // don't show non final reward chest game checks until we support shuffling them - (rcObj.rc != RC_HC_ZELDAS_LETTER) && // don't show zeldas letter until we support shuffling it - (rcObj.rc != RC_LINKS_POCKET || showLinksPocket) && - (!RandomizerCheckObjects::AreaIsDungeon(rcObj.rcArea) || - rcObj.vOrMQ == RCVORMQ_BOTH || - rcObj.vOrMQ == RCVORMQ_MQ && OTRGlobals::Instance->gRandomizer->masterQuestDungeons.contains(rcObj.sceneId) || - rcObj.vOrMQ == RCVORMQ_VANILLA && !OTRGlobals::Instance->gRandomizer->masterQuestDungeons.contains(rcObj.sceneId) + (loc->GetArea() != RCAREA_INVALID) && // don't show Invalid locations + (loc->GetRCType() != RCTYPE_GOSSIP_STONE) && //TODO: Don't show hints until tracker supports them + (loc->GetRCType() != RCTYPE_CHEST_GAME) && // don't show non final reward chest game checks until we support shuffling them + (rc != RC_HC_ZELDAS_LETTER) && // don't show zeldas letter until we support shuffling it + (rc != RC_LINKS_POCKET || showLinksPocket) && + (!RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()) || + loc->GetQuest() == RCQUEST_BOTH || + loc->GetQuest() == RCQUEST_MQ && OTRGlobals::Instance->gRandomizer->masterQuestDungeons.contains(loc->GetScene()) || + loc->GetQuest() == RCQUEST_VANILLA && !OTRGlobals::Instance->gRandomizer->masterQuestDungeons.contains(loc->GetScene()) ) && - (rcObj.rcType != RCTYPE_SHOP || (showShops && (!hideShopRightChecks || hideShopRightChecks && rcObj.actorParams > 0x03))) && - (rcObj.rcType != RCTYPE_SCRUB || + (loc->GetRCType() != RCTYPE_SHOP || (showShops && (!hideShopRightChecks || hideShopRightChecks && loc->GetActorParams() > 0x03))) && + (loc->GetRandomizerCheck() != RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS) && + (rc != RC_TRIFORCE_COMPLETED || !hideTriforceCompleted) && + (rc != RC_GIFT_FROM_SAGES || !IS_RANDO) && + (loc->GetRCType() != RCTYPE_SCRUB || showScrubs || - rcObj.rc == RC_LW_DEKU_SCRUB_NEAR_BRIDGE || // The 3 scrubs that are always randomized - rcObj.rc == RC_HF_DEKU_SCRUB_GROTTO || - rcObj.rc == RC_LW_DEKU_SCRUB_GROTTO_FRONT + rc == RC_LW_DEKU_SCRUB_NEAR_BRIDGE || // The 3 scrubs that are always randomized + rc == RC_HF_DEKU_SCRUB_GROTTO || + rc == RC_LW_DEKU_SCRUB_GROTTO_FRONT ) && - (rcObj.rcType != RCTYPE_MERCHANT || showMerchants) && - (rcObj.rcType != RCTYPE_OCARINA || showOcarinas) && - (rcObj.rcType != RCTYPE_SKULL_TOKEN || - (showOverworldTokens && RandomizerCheckObjects::AreaIsOverworld(rcObj.rcArea)) || - (showDungeonTokens && RandomizerCheckObjects::AreaIsDungeon(rcObj.rcArea)) + (loc->GetRCType() != RCTYPE_MERCHANT || showMerchants) && + (loc->GetRCType() != RCTYPE_OCARINA || showOcarinas) && + (loc->GetRCType() != RCTYPE_SKULL_TOKEN || + (showOverworldTokens && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || + (showDungeonTokens && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea())) ) && - (rcObj.rcType != RCTYPE_COW || showCows) && - (rcObj.rcType != RCTYPE_ADULT_TRADE || + (loc->GetRCType() != RCTYPE_COW || showCows) && + (loc->GetRCType() != RCTYPE_ADULT_TRADE || showAdultTrade || - rcObj.rc == RC_KAK_ANJU_AS_ADULT || // adult trade checks that are always shuffled - rcObj.rc == RC_DMT_TRADE_CLAIM_CHECK // even when shuffle adult trade is off + rc == RC_KAK_ANJU_AS_ADULT || // adult trade checks that are always shuffled + rc == RC_DMT_TRADE_CLAIM_CHECK // even when shuffle adult trade is off ) && - (rcObj.rc != RC_KF_KOKIRI_SWORD_CHEST || showKokiriSword) && - (rcObj.rc != RC_ZR_MAGIC_BEAN_SALESMAN || showBeans) && - (rcObj.rc != RC_HC_MALON_EGG || showWeirdEgg) && - (rcObj.rcType != RCTYPE_FROG_SONG || showFrogSongRupees) && - (rcObj.rcType != RCTYPE_MAP_COMPASS || showStartingMapsCompasses) && - (rcObj.rcType != RCTYPE_SMALL_KEY || showKeysanity) && - (rcObj.rcType != RCTYPE_BOSS_KEY || showBossKeysanity) && - (rcObj.rcType != RCTYPE_GANON_BOSS_KEY || showGanonBossKey) && - (rcObj.rc != RC_KAK_100_GOLD_SKULLTULA_REWARD || show100SkullReward) && - (rcObj.rcType != RCTYPE_GF_KEY && rcObj.rc != RC_GF_GERUDO_MEMBERSHIP_CARD || - (showGerudoCard && rcObj.rc == RC_GF_GERUDO_MEMBERSHIP_CARD) || - (fortressNormal && showGerudoFortressKeys && rcObj.rcType == RCTYPE_GF_KEY) || - (fortressFast && showGerudoFortressKeys && rcObj.rc == RC_GF_NORTH_F1_CARPENTER) + (rc != RC_KF_KOKIRI_SWORD_CHEST || showKokiriSword) && + (rc != RC_ZR_MAGIC_BEAN_SALESMAN || showBeans) && + (rc != RC_HC_MALON_EGG || showWeirdEgg) && + (loc->GetRCType() != RCTYPE_FROG_SONG || showFrogSongRupees) && + (loc->GetRCType() != RCTYPE_MAP_COMPASS || showStartingMapsCompasses) && + (loc->GetRCType() != RCTYPE_SMALL_KEY || showKeysanity) && + (loc->GetRCType() != RCTYPE_BOSS_KEY || showBossKeysanity) && + (loc->GetRCType() != RCTYPE_GANON_BOSS_KEY || showGanonBossKey) && + (rc != RC_KAK_100_GOLD_SKULLTULA_REWARD || show100SkullReward) && + (loc->GetRCType() != RCTYPE_GF_KEY && rc != RC_GF_GERUDO_MEMBERSHIP_CARD || + (showGerudoCard && rc == RC_GF_GERUDO_MEMBERSHIP_CARD) || + (fortressNormal && showGerudoFortressKeys && loc->GetRCType() == RCTYPE_GF_KEY) || + (fortressFast && showGerudoFortressKeys && rc == RC_GF_NORTH_F1_CARPENTER) ); } - else if (rcObj.vanillaCompletion) { - return (rcObj.vOrMQ == RCVORMQ_BOTH || - rcObj.vOrMQ == RCVORMQ_MQ && OTRGlobals::Instance->gRandomizer->masterQuestDungeons.contains(rcObj.sceneId) || - rcObj.vOrMQ == RCVORMQ_VANILLA && !OTRGlobals::Instance->gRandomizer->masterQuestDungeons.contains(rcObj.sceneId) || - rcObj.rc == RC_GIFT_FROM_SAGES) && rcObj.rc != RC_LINKS_POCKET; + else if (loc->IsVanillaCompletion()) { + return (loc->GetQuest() == RCQUEST_BOTH || + loc->GetQuest() == RCQUEST_MQ && OTRGlobals::Instance->gRandomizer->masterQuestDungeons.contains(loc->GetScene()) || + loc->GetQuest() == RCQUEST_VANILLA && !OTRGlobals::Instance->gRandomizer->masterQuestDungeons.contains(loc->GetScene()) || + rc == RC_GIFT_FROM_SAGES) && rc != RC_LINKS_POCKET; } return false; } @@ -1183,9 +1189,11 @@ bool IsEoDCheck(RandomizerCheckType type) { return type == RCTYPE_BOSS_HEART_OR_OTHER_REWARD || type == RCTYPE_DUNGEON_REWARD; } -bool CompareChecks(RandomizerCheckObject i, RandomizerCheckObject j) { - RandomizerCheckTrackerData iShow = gSaveContext.checkTrackerData[i.rc]; - RandomizerCheckTrackerData jShow = gSaveContext.checkTrackerData[j.rc]; +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; @@ -1205,14 +1213,14 @@ bool CompareChecks(RandomizerCheckObject i, RandomizerCheckObject j) { else if (iShow.skipped && !jShow.skipped) return false; - if (!IsEoDCheck(i.rcType) && IsEoDCheck(j.rcType)) + if (!IsEoDCheck(x->GetRCType()) && IsEoDCheck(y->GetRCType())) return true; - else if (IsEoDCheck(i.rcType) && !IsEoDCheck(j.rcType)) + else if (IsEoDCheck(x->GetRCType()) && !IsEoDCheck(y->GetRCType())) return false; - if (i.rc < j.rc) + if (x->GetRandomizerCheck() < y->GetRandomizerCheck()) return true; - else if (i.rc > j.rc) + else if (x->GetRandomizerCheck() > y->GetRandomizerCheck()) return false; return false; @@ -1222,68 +1230,81 @@ bool IsHeartPiece(GetItemID giid) { return giid == GI_HEART_PIECE || giid == GI_HEART_PIECE_WIN; } -void DrawLocation(RandomizerCheckObject rcObj) { +void DrawLocation(RandomizerCheck rc) { Color_RGBA8 mainColor; Color_RGBA8 extraColor; std::string txt; bool showHidden = CVarGetInteger("gCheckTrackerOptionShowHidden", 0); - RandomizerCheckTrackerData checkData = gSaveContext.checkTrackerData[rcObj.rc]; + Rando::Location* loc = Rando::StaticData::GetLocation(rc); + RandomizerCheckTrackerData checkData = gSaveContext.checkTrackerData[rc]; RandomizerCheckStatus status = checkData.status; bool skipped = checkData.skipped; if (status == RCSHOW_COLLECTED) { if (!showHidden && CVarGetInteger("gCheckTrackerCollectedHide", 0)) return; - mainColor = !IsHeartPiece(rcObj.ogItemId) && !IS_RANDO ? CVarGetColor("gCheckTrackerCollectedExtraColor", Color_Collected_Extra_Default) : - CVarGetColor("gCheckTrackerCollectedMainColor", Color_Main_Default); + mainColor = + !IsHeartPiece((GetItemID)Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetItemID()) && !IS_RANDO + ? CVarGetColor("gCheckTrackerCollectedExtraColor", Color_Collected_Extra_Default) + : CVarGetColor("gCheckTrackerCollectedMainColor", Color_Main_Default); extraColor = CVarGetColor("gCheckTrackerCollectedExtraColor", Color_Collected_Extra_Default); } else if (status == RCSHOW_SAVED) { if (!showHidden && CVarGetInteger("gCheckTrackerSavedHide", 0)) return; - mainColor = !IsHeartPiece(rcObj.ogItemId) && !IS_RANDO ? CVarGetColor("gCheckTrackerSavedExtraColor", Color_Saved_Extra_Default) : - CVarGetColor("gCheckTrackerSavedMainColor", Color_Main_Default); + mainColor = + !IsHeartPiece((GetItemID)Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetItemID()) && !IS_RANDO + ? CVarGetColor("gCheckTrackerSavedExtraColor", Color_Saved_Extra_Default) + : CVarGetColor("gCheckTrackerSavedMainColor", Color_Main_Default); extraColor = CVarGetColor("gCheckTrackerSavedExtraColor", Color_Saved_Extra_Default); } else if (skipped) { if (!showHidden && CVarGetInteger("gCheckTrackerSkippedHide", 0)) return; - mainColor = !IsHeartPiece(rcObj.ogItemId) && !IS_RANDO ? CVarGetColor("gCheckTrackerSkippedExtraColor", Color_Skipped_Extra_Default) : - CVarGetColor("gCheckTrackerSkippedMainColor", Color_Main_Default); + mainColor = + !IsHeartPiece((GetItemID)Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetItemID()) && !IS_RANDO + ? CVarGetColor("gCheckTrackerSkippedExtraColor", Color_Skipped_Extra_Default) + : CVarGetColor("gCheckTrackerSkippedMainColor", Color_Main_Default); extraColor = CVarGetColor("gCheckTrackerSkippedExtraColor", Color_Skipped_Extra_Default); } else if (status == RCSHOW_SEEN || status == RCSHOW_IDENTIFIED) { if (!showHidden && CVarGetInteger("gCheckTrackerSeenHide", 0)) return; - mainColor = !IsHeartPiece(rcObj.ogItemId) && !IS_RANDO ? CVarGetColor("gCheckTrackerSeenExtraColor", Color_Seen_Extra_Default) : - CVarGetColor("gCheckTrackerSeenMainColor", Color_Main_Default); + mainColor = + !IsHeartPiece((GetItemID)Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetItemID()) && !IS_RANDO + ? CVarGetColor("gCheckTrackerSeenExtraColor", Color_Seen_Extra_Default) + : CVarGetColor("gCheckTrackerSeenMainColor", Color_Main_Default); extraColor = CVarGetColor("gCheckTrackerSeenExtraColor", Color_Seen_Extra_Default); } else if (status == RCSHOW_SCUMMED) { if (!showHidden && CVarGetInteger("gCheckTrackerKnownHide", 0)) return; - mainColor = !IsHeartPiece(rcObj.ogItemId) && !IS_RANDO ? CVarGetColor("gCheckTrackerScummedExtraColor", Color_Scummed_Extra_Default) : - CVarGetColor("gCheckTrackerScummedMainColor", Color_Main_Default); + mainColor = + !IsHeartPiece((GetItemID)Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetItemID()) && !IS_RANDO + ? CVarGetColor("gCheckTrackerScummedExtraColor", Color_Scummed_Extra_Default) + : CVarGetColor("gCheckTrackerScummedMainColor", Color_Main_Default); extraColor = CVarGetColor("gCheckTrackerScummedExtraColor", Color_Scummed_Extra_Default); } else if (status == RCSHOW_UNCHECKED) { if (!showHidden && CVarGetInteger("gCheckTrackerUncheckedHide", 0)) return; - mainColor = !IsHeartPiece(rcObj.ogItemId) && !IS_RANDO ? CVarGetColor("gCheckTrackerUncheckedExtraColor", Color_Unchecked_Extra_Default) : - CVarGetColor("gCheckTrackerUncheckedMainColor", Color_Main_Default); + mainColor = + !IsHeartPiece((GetItemID)Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetItemID()) && !IS_RANDO + ? CVarGetColor("gCheckTrackerUncheckedExtraColor", Color_Unchecked_Extra_Default) + : CVarGetColor("gCheckTrackerUncheckedMainColor", Color_Main_Default); extraColor = CVarGetColor("gCheckTrackerUncheckedExtraColor", Color_Unchecked_Extra_Default); } //Main Text - txt = rcObj.rcShortName; - if (lastLocationChecked == rcObj.rc) + txt = loc->GetShortName(); + if (lastLocationChecked == loc->GetRandomizerCheck()) txt = "* " + txt; // Draw button - for Skipped/Seen/Scummed/Unchecked only if (status == RCSHOW_UNCHECKED || status == RCSHOW_SEEN || status == RCSHOW_IDENTIFIED || status == RCSHOW_SCUMMED || skipped) { - if (UIWidgets::StateButton(std::to_string(rcObj.rc).c_str(), skipped ? ICON_FA_PLUS : ICON_FA_TIMES)) { + if (UIWidgets::StateButton(std::to_string(rc).c_str(), skipped ? ICON_FA_PLUS : ICON_FA_TIMES)) { if (skipped) { - gSaveContext.checkTrackerData[rcObj.rc].skipped = false; - areaChecksGotten[rcObj.rcArea]--; + gSaveContext.checkTrackerData[rc].skipped = false; + areaChecksGotten[loc->GetArea()]--; } else { - gSaveContext.checkTrackerData[rcObj.rc].skipped = true; - areaChecksGotten[rcObj.rcArea]++; + gSaveContext.checkTrackerData[rc].skipped = true; + areaChecksGotten[loc->GetArea()]++; } - UpdateOrdering(rcObj.rcArea); + UpdateOrdering(loc->GetArea()); UpdateInventoryChecks(); SaveManager::Instance->SaveSection(gSaveContext.fileNum, sectionId, true); } @@ -1308,13 +1329,13 @@ void DrawLocation(RandomizerCheckObject rcObj) { case RCSHOW_COLLECTED: case RCSHOW_SCUMMED: if (IS_RANDO) { - txt = OTRGlobals::Instance->gRandomizer->EnumToSpoilerfileGetName[gSaveContext.itemLocations[rcObj.rc].get.rgID][gSaveContext.language]; + txt = OTRGlobals::Instance->gRandomizer->EnumToSpoilerfileGetName[gSaveContext.itemLocations[rc].get.rgID][gSaveContext.language]; } else { - if (IsHeartPiece(rcObj.ogItemId)) { + if (IsHeartPiece((GetItemID)Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetItemID())) { if (gSaveContext.language == LANGUAGE_ENG || gSaveContext.language == LANGUAGE_GER) { - txt = ItemFromGIID(rcObj.ogItemId).GetName().english; + txt = Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetName().english; } else if (gSaveContext.language == LANGUAGE_FRA) { - txt = ItemFromGIID(rcObj.ogItemId).GetName().french; + txt = Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetName().french; } } } @@ -1322,24 +1343,24 @@ void DrawLocation(RandomizerCheckObject rcObj) { case RCSHOW_IDENTIFIED: case RCSHOW_SEEN: if (IS_RANDO) { - if (gSaveContext.itemLocations[rcObj.rc].get.rgID == RG_ICE_TRAP) { + if (gSaveContext.itemLocations[rc].get.rgID == RG_ICE_TRAP) { if (status == RCSHOW_IDENTIFIED) { - txt = gSaveContext.itemLocations[rcObj.rc].get.trickName; + txt = gSaveContext.itemLocations[rc].get.trickName; } else { - txt = OTRGlobals::Instance->gRandomizer->EnumToSpoilerfileGetName[gSaveContext.itemLocations[rcObj.rc].get.fakeRgID][gSaveContext.language]; + txt = OTRGlobals::Instance->gRandomizer->EnumToSpoilerfileGetName[gSaveContext.itemLocations[rc].get.fakeRgID][gSaveContext.language]; } } else { - txt = OTRGlobals::Instance->gRandomizer->EnumToSpoilerfileGetName[gSaveContext.itemLocations[rcObj.rc].get.rgID][gSaveContext.language]; + txt = OTRGlobals::Instance->gRandomizer->EnumToSpoilerfileGetName[gSaveContext.itemLocations[rc].get.rgID][gSaveContext.language]; } if (status == RCSHOW_IDENTIFIED) { - txt += fmt::format(" - {}", gSaveContext.checkTrackerData[rcObj.rc].price); + txt += fmt::format(" - {}", gSaveContext.checkTrackerData[rc].price); } } else { - if (IsHeartPiece(rcObj.ogItemId)) { + if (IsHeartPiece((GetItemID)Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetItemID())) { if (gSaveContext.language == LANGUAGE_ENG || gSaveContext.language == LANGUAGE_GER) { - txt = ItemFromGIID(rcObj.ogItemId).GetName().english; + txt = Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetName().english; } else if (gSaveContext.language == LANGUAGE_FRA) { - txt = ItemFromGIID(rcObj.ogItemId).GetName().french; + txt = Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetName().french; } } } @@ -1534,7 +1555,7 @@ void CheckTrackerWindow::InitElement() { GameInteractor::Instance->RegisterGameHook(CheckTrackerTransition); GameInteractor::Instance->RegisterGameHook(CheckTrackerShopSlotChange); - LocationTable_Init(); + //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 b2193f696..9c52df388 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h @@ -46,7 +46,7 @@ class CheckTrackerWindow : public LUS::GuiWindow { void DefaultCheckData(RandomizerCheck rc); void Teardown(); void UpdateAllOrdering(); -bool IsVisibleInCheckTracker(RandomizerCheckObject rcObj); +bool IsVisibleInCheckTracker(RandomizerCheck rc); void InitTrackerData(bool isDebug); void SetLastItemGetRC(RandomizerCheck rc); RandomizerCheckArea GetCheckArea(); diff --git a/soh/soh/Enhancements/randomizer/static_data.h b/soh/soh/Enhancements/randomizer/static_data.h new file mode 100644 index 000000000..3c8328590 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/static_data.h @@ -0,0 +1,37 @@ +#pragma once + +#include +#include "randomizerTypes.h" +#include "item.h" +#include "location.h" + +namespace Rando { +/** + * @brief Singleton for storing and accessing static Randomizer-related data + * + * The StaticData class is a class for storing and accessing static Randomizer-related data. + * Static Data, in this context, refers to data that is the same for every single randomizer seed, + * i.e. the item and location tables. This class is intended to be used as a Singleton. + */ +class StaticData { + private: + static std::array itemTable; + static std::array locationTable; + + public: + static void InitItemTable(); + static Item& RetrieveItem(const RandomizerGet rgid); + static Item& ItemFromGIID(const int giid); + static std::array& GetItemTable(); + static void InitLocationTable(); + static Location* GetLocation(RandomizerCheck locKey); + static std::array& GetLocationTable(); + static std::vector overworldLocations; + static std::vector dungeonRewardLocations; + static std::vector> shopLocationLists; + static std::vector scrubLocations; + static std::vector gossipStoneLocations; + StaticData(); + ~StaticData(); +}; +} \ No newline at end of file diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 8b56d352c..d32322d58 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -40,6 +40,7 @@ #include "Enhancements/randomizer/randomizer_item_tracker.h" #include "Enhancements/randomizer/randomizer_check_tracker.h" #include "Enhancements/randomizer/3drando/random.hpp" +#include "Enhancements/randomizer/static_data.h" #include "Enhancements/gameplaystats.h" #include "Enhancements/n64_weird_frame_data.inc" #include "frame_interpolation.h" @@ -265,6 +266,7 @@ OTRGlobals::OTRGlobals() { context->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory(LUS::ResourceType::SOH_Background, "Background", std::make_shared()); gSaveStateMgr = std::make_shared(); + gRandoContext = Rando::Context::CreateInstance(); gRandomizer = std::make_shared(); hasMasterQuest = hasOriginal = false; diff --git a/soh/soh/OTRGlobals.h b/soh/soh/OTRGlobals.h index b24f59d8b..5bb88c11e 100644 --- a/soh/soh/OTRGlobals.h +++ b/soh/soh/OTRGlobals.h @@ -17,6 +17,7 @@ #include "Enhancements/savestates.h" #include "Enhancements/randomizer/randomizer.h" #include +#include "Enhancements/randomizer/context.h" const std::string customMessageTableID = "BaseGameOverrides"; const std::string appShortName = "soh"; @@ -29,6 +30,7 @@ public: std::shared_ptr context; std::shared_ptr gSaveStateMgr; std::shared_ptr gRandomizer; + std::shared_ptr gRandoContext; OTRGlobals(); ~OTRGlobals();