diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index 4c5581da5..9842c54ed 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -2419,6 +2419,42 @@ typedef enum { // - None VB_WIN_GORON_POT, + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnWonderItem` + VB_WONDER_DROP_ITEM, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - 'Vec3f' pos + // - 'f32' rotY + VB_WONDER_HEISHI_ITEM, + + // #### `result` + // ```c + // (gSaveContext.dayTime < 0xB888 || IS_DAY) && ((!IS_RANDO && + // !Flags_GetEventChkInf(EVENTCHKINF_ZELDA_FLED_HYRULE_CASTLE)) || (IS_RANDO && !metZelda)) + // (gSaveContext.dayTime >= 0xB889) || !IS_DAY || (!IS_RANDO && + // Flags_GetEventChkInf(EVENTCHKINF_ZELDA_FLED_HYRULE_CASTLE)) || (IS_RANDO && metZelda) + // ``` + // #### `args` + // - EnHeishi1* + VB_WONDER_HEISHI_PATROLLING, + + // #### `result` + // ```c + // (this->switchFlag >= 0) && Flags_GetSwitch(play, this->switchFlag) + // ``` + // #### `args` + // - `None` + VB_WONDER_SPAWN, + // #### `result` // ```c // true 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 03bf883de..2a44e9786 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 @@ -131,6 +131,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "Man erzählt sich, daß eine #Kiste im Deku-Baum# #[[1]]# enthielte.", /*french*/ "Selon moi, une #caisse dans l'Arbre Mojo# contient #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_WONDER_ITEM_DEKU_TREE] = HintText(CustomMessage("They say that a #wonder item in the Deku Tree# hides #[[1]]#.", + /*german*/ "Man erzählt sich, daß sich ein #Wunder-Gegenstand im Deku-Baum# #[[1]]# verstecke.", + /*french*/ "Selon moi, un #objet merveilleux dans l'Arbre Mojo# cache #[[1]]#.", {QM_RED, QM_GREEN})); + /*-------------------------- | DODONGOS CAVERN | ---------------------------*/ @@ -484,6 +488,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "Man erzählt sich, daß eine #Kiste in Jabu-Jabus Bauch# #[[1]]# enthielte.", /*french*/ "Selon moi, une #caisse dans le Ventre de Jabu-Jabu# contient #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_WONDER_ITEM_JABU_JABU] = HintText(CustomMessage("They say that a #wonder item in Jabu Jabu's Belly# hides #[[1]]#.", + /*german*/ "Man erzählt sich, daß sich ein #Wunder-Gegenstand in Jabu-Jabus Bauch# #[[1]]# verstecke.", + /*french*/ "Selon moi, un #objet merveilleux dans le Ventre de Jabu-Jabu# cache #[[1]]#.", {QM_RED, QM_GREEN})); + /*-------------------------- | FOREST TEMPLE | ---------------------------*/ @@ -926,6 +934,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "Man erzählt sich, daß eine #Kiste im Feuertempel# #[[1]]# enthielte.", /*french*/ "Selon moi, une #caisse dans le Temple du Feu# contient #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_WONDER_ITEM_FIRE_TEMPLE] = HintText(CustomMessage("They say that a #wonder item in Fire Temple# hides #[[1]]#.", + /*german*/ "Man erzählt sich, daß sich ein #Wunder-Gegenstand im Feuertempel# #[[1]]# verstecke.", + /*french*/ "Selon moi, un #objet merveilleux dans le Temple du Feu# cache #[[1]]#.", {QM_RED, QM_GREEN})); + /*-------------------------- | WATER TEMPLE | ---------------------------*/ @@ -1077,6 +1089,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "Man erzählt sich, daß eine #Kiste im Wassertempel# #[[1]]# enthielte.", /*french*/ "Selon moi, une #caisse dans le Temple de l'Eau# contient #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_WONDER_ITEM_WATER_TEMPLE] = HintText(CustomMessage("They say that a #wonder item in Water Temple# hides #[[1]]#.", + /*german*/ "Man erzählt sich, daß sich ein #Wunder-Gegenstand im Wassertempel# #[[1]]# verstecke.", + /*french*/ "Selon moi, un #objet merveilleux dans le Temple de l'Eau# cache #[[1]]#.", {QM_RED, QM_GREEN})); + /*-------------------------- | SPIRIT TEMPLE | ---------------------------*/ @@ -1326,6 +1342,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "Man erzählt sich, daß eine #Kiste im Geistertempel# #[[1]]# enthielte.", /*french*/ "Selon moi, une #caisse dans le Temple de l'Esprit# contient #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_WONDER_ITEM_SPIRIT_TEMPLE] = HintText(CustomMessage("They say that a #wonder item in Spirit Temple# hides #[[1]]#.", + /*german*/ "Man erzählt sich, daß sich ein #Wunder-Gegenstand im Geistertempel# #[[1]]# verstecke.", + /*french*/ "Selon moi, un #objet merveilleux dans le Temple de l'Esprit# cache #[[1]]#.", {QM_RED, QM_GREEN})); + /*-------------------------- | SHADOW TEMPLE | ---------------------------*/ @@ -1597,6 +1617,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "Man erzählt sich, daß das #Lesen eines Schildes im Schattentempel# #[[1]]# enthülle.", /*french*/ "Selon moi, #lire un panneau dans le Temple de l'Ombre# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_WONDER_ITEM_SHADOW_TEMPLE] = HintText(CustomMessage("They say that a #wonder item in Shadow Temple# hides #[[1]]#.", + /*german*/ "Man erzählt sich, daß sich ein #Wunder-Gegenstand im Schattentempel# #[[1]]# verstecke.", + /*french*/ "Selon moi, un #objet merveilleux dans le Temple de l'Ombre# cache #[[1]]#.", {QM_RED, QM_GREEN})); + /*-------------------------- | BOTTOM OF THE WELL | ---------------------------*/ @@ -1743,6 +1767,9 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "Man erzählt sich, daß etwas #Gras auf dem Grund des Brunnens# #[[1]]# verstecke.", /*french*/ "Selon moi, de l'#herbe dans le Puits# cache #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_BOTTOM_OF_THE_WELL_WONDER_ITEM] = HintText(CustomMessage("They say that a #wonder item in the Bottom of the Well# hides #[[1]]#.", + /*german*/ "Man erzählt sich, daß sich ein #Wunder-Gegenstand auf dem Grund des Brunnens# #[[1]]# verstecke.", + /*french*/ "Selon moi, un #objet merveilleux dans le Puits# cache #[[1]]#.", {QM_RED, QM_GREEN})); /*-------------------------- | ICE CAVERN | @@ -2024,6 +2051,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "Man erzählt sich, daß eine #Kiste in der Gerudo-Trainingsarena# #[[1]]# enthielte.", /*french*/ "Selon moi, une #caisse dans le Gymnase Gerudo# contient #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_WONDER_ITEM_GERUDO_TRAINING_GROUND] = HintText(CustomMessage("They say that a #wonder item in Gerudo Training Ground# hides #[[1]]#.", + /*german*/ "Man erzählt sich, daß sich ein #Wunder-Gegenstand in der Gerudo-Trainingsarena# #[[1]]# verstecke.", + /*french*/ "Selon moi, un #objet merveilleux dans le Gymnase Gerudo# cache #[[1]]#.", {QM_RED, QM_GREEN})); + /*-------------------------- | GANONS CASTLE | ---------------------------*/ @@ -2233,6 +2264,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "Man erzählt sich, daß ein #Herz in Ganons Schloß# #[[1]]# verstecke.", /*french*/ "Selon moi, un #coeur dans le Château de Ganon# cache #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_GANONS_CASTLE_WONDER_ITEM] = HintText(CustomMessage("They say that a #wonder item in Ganon's Castle# hides #[[1]]#.", + /*german*/ "Man erzählt sich, daß sich ein #Wunder-Gegenstand in Ganons Schloß# #[[1]]# verstecke.", + /*french*/ "Selon moi, un #objet merveilleux dans le Château de Ganon# cache #[[1]]#.", {QM_RED, QM_GREEN})); + // clang-format on } } // namespace Rando 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 abdc0f2bb..1299bafbd 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 @@ -2247,6 +2247,74 @@ void StaticData::HintTable_Init_Exclude_Overworld() { hintTextTable[RHT_SIGN_HAUNTED_WASTELAND] = HintText(CustomMessage("They say that #reading a sign in Haunted Wasteland# reveals #[[1]]#.", /*german*/ "Man erzählt sich, daß das #Lesen eines Schildes in der Gespensterwüste# #[[1]]# enthülle.", /*french*/ "Selon moi, #lire un panneau dans le Désert Hanté# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_WONDER_ITEM_KOKIRI_FOREST] = HintText(CustomMessage("They say that a #wonder item in Kokiri Forest# hides #[[1]]#.", + /*german*/ "Man erzählt sich, daß sich ein #Wunder-Gegenstand im Kokiri-Wald# #[[1]]# verstecke.", + /*french*/ "Selon moi, un #objet merveilleux dans la Fôret Kokiri# cache #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_WONDER_ITEM_HYRULE_FIELD] = HintText(CustomMessage("They say that a #wonder item in Hyrule Field# hides #[[1]]#.", + /*german*/ "Man erzählt sich, daß sich ein #Wunder-Gegenstand in der Ebene von Hyrule# #[[1]]# verstecke.", + /*french*/ "Selon moi, un #objet merveilleux dans la Plaine d'Hyrule# cache #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_WONDER_ITEM_MARKET] = HintText(CustomMessage("They say that a #wonder item in the Market# hides #[[1]]#.", + /*german*/ "Man erzählt sich, daß sich ein #Wunder-Gegenstand auf dem Markt# #[[1]]# verstecke.", + /*french*/ "Selon moi, un #objet merveilleux dans la Place du Marché# cache #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_WONDER_ITEM_LON_LON_RANCH] = HintText(CustomMessage("They say that a #wonder item in Lon Lon Ranch# hides #[[1]]#.", + /*german*/ "Man erzählt sich, daß sich ein #Wunder-Gegenstand auf der Lon Lon-Farm# #[[1]]# verstecke.", + /*french*/ "Selon moi, un #objet merveilleux dans le Ranch Lon Lon# cache #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_WONDER_ITEM_HYRULE_CASTLE] = HintText(CustomMessage("They say that a #wonder item in Hyrule Castle# hides #[[1]]#.", + /*german*/ "Man erzählt sich, daß sich ein #Wunder-Gegenstand im Schloss von Hyrule# #[[1]]# verstecke.", + /*french*/ "Selon moi, un #objet merveilleux au Château d'Hyrule# cache #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_WONDER_ITEM_CASTLE_COURTYARD_ZELDA] = HintText(CustomMessage("They say that #shooting a window in a castle# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Schießen auf ein Fenster in einem Schloss# #[[1]]# enthülle.", + /*french*/ "Selon moi, #tirer sur une fenêtre dans un château# donne #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_WONDER_ITEM_LOST_WOODS] = HintText(CustomMessage("They say that a #wonder item in the woods# hides #[[1]]#.", + /*german*/ "Man erzählt sich, daß sich ein #Wunder-Gegenstand in den Wäldern# #[[1]]# verstecke.", + /*french*/ "Selon moi, un #objet merveilleux dans des bois# cache #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_WONDER_ITEM_SACRED_FOREST_MEADOW] = HintText(CustomMessage("They say that a #wonder item in a forest meadow# hides #[[1]]#.", + /*german*/ "Man erzählt sich, daß sich ein #Wunder-Gegenstand auf einer Waldlichtung# #[[1]]# verstecke.", + /*french*/ "Selon moi, un #objet merveilleux dans le sanctuaire des bois# cache #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_WONDER_ITEM_KAKARIKO_VILLAGE] = HintText(CustomMessage("They say that a #wonder item in Kakariko Village# hides #[[1]]#.", + /*german*/ "Man erzählt sich, daß sich ein #Wunder-Gegenstand in Kakariko# #[[1]]# verstecke.", + /*french*/ "Selon moi, un #objet merveilleux dans le Village de Cocorico# cache #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_WONDER_ITEM_DAMPES_GRAVE] = HintText(CustomMessage("They say that a #wonder item in a gravekeeper's tomb# hides #[[1]]#.", + /*german*/ "Man erzählt sich, daß sich ein #Wunder-Gegenstand im Grab des Totengräbers# #[[1]]# verstecke.", + /*french*/ "Selon moi, un #objet merveilleux dans la tombe du fossoyeur# cache #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_WONDER_ITEM_DEATH_MOUNTAIN_CRATER] = HintText(CustomMessage("They say that a #wonder item in Death Mountain's Crater# hides #[[1]]#.", + /*german*/ "Man erzählt sich, daß sich ein #Wunder-Gegenstand im Todeskrater# #[[1]]# verstecke.", + /*french*/ "Selon moi, un #objet merveilleux sur le Mont du Péril# cache #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_WONDER_ITEM_ZORAS_RIVER] = HintText(CustomMessage("They say that a #wonder item in a river# hides #[[1]]#.", + /*german*/ "Man erzählt sich, daß sich ein #Wunder-Gegenstand in einem Fluss# #[[1]]# verstecke.", + /*french*/ "Selon moi, un #objet merveilleux dans une rivière# cache #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_WONDER_ITEM_ZORAS_RIVER] = HintText(CustomMessage("They say that a #wonder item in Zora's Fountain# hides #[[1]]#.", + /*german*/ "Man erzählt sich, daß sich ein #Wunder-Gegenstand in Zoras Quelle# #[[1]]# verstecke.", + /*french*/ "Selon moi, un #objet merveilleux dans la Fontaine Zora# cache #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_WONDER_ITEM_GERUDO_VALLEY] = HintText(CustomMessage("They say that a #wonder item in Gerudo Valley# hides #[[1]]#.", + /*german*/ "Man erzählt sich, daß sich ein #Wunder-Gegenstand im Gerudotal# #[[1]]# verstecke.", + /*french*/ "Selon moi, un #objet merveilleux dans une vallée# cache #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_WONDER_ITEM_GERUDOS_FORTRESS] = HintText(CustomMessage("They say that a #wonder item in Gerudo Fortress# hides #[[1]]#.", + /*german*/ "Man erzählt sich, daß sich ein #Wunder-Gegenstand in der Gerudo-Festung# #[[1]]# verstecke.", + /*french*/ "Selon moi, un #objet merveilleux dans la Forteresse Gerudo# cache #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_WONDER_ITEM_THIEVES_HIDEOUT] = HintText(CustomMessage("They say that a #wonder item in Thieve's Hideout# hides #[[1]]#.", + /*german*/ "Man erzählt sich, daß sich ein #Wunder-Gegenstand im Versteck der Diebe# #[[1]]# verstecke.", + /*french*/ "Selon moi, un #objet merveilleux dans a Cachette des Voleurs# cache #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_WONDER_ITEM_DESERT_COLOSSUS] = HintText(CustomMessage("They say that a #wonder item near the temple of the sand# hides #[[1]]#.", + /*german*/ "Man erzählt sich, daß sich ein #Wunder-Gegenstand nahe des Tempels des Sandes# #[[1]]# verstecke.", + /*french*/ "Selon moi, un #objet merveilleux près du temple du sable# cache #[[1]]#.", {QM_RED, QM_GREEN})); // clang-format on } } // namespace Rando diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index 4e6101301..5a5e85cd5 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -447,6 +447,13 @@ void GenerateItemPool() { bool bushesActive = (bool)ctx->GetOption(RSK_SHUFFLE_BUSHES); PlaceItemsForType(RCTYPE_BUSH, bushesActive, false); + // Shuffle Wonder Items + bool overworldWonderItemsActive = ctx->GetOption(RSK_SHUFFLE_WONDER_ITEMS).Is(RO_SHUFFLE_WONDER_ITEMS_OVERWORLD) || + ctx->GetOption(RSK_SHUFFLE_WONDER_ITEMS).Is(RO_SHUFFLE_WONDER_ITEMS_ALL); + bool dungeonWonderItemsActive = ctx->GetOption(RSK_SHUFFLE_WONDER_ITEMS).Is(RO_SHUFFLE_WONDER_ITEMS_DUNGEONS) || + ctx->GetOption(RSK_SHUFFLE_WONDER_ITEMS).Is(RO_SHUFFLE_WONDER_ITEMS_ALL); + PlaceItemsForType(RCTYPE_WONDER_ITEM, overworldWonderItemsActive, dungeonWonderItemsActive); + // Shuffle Crates bool overworldCratesActive = ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_OVERWORLD) || ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_ALL); diff --git a/soh/soh/Enhancements/randomizer/SeedContext.cpp b/soh/soh/Enhancements/randomizer/SeedContext.cpp index 3855546a0..62ff1f9cc 100644 --- a/soh/soh/Enhancements/randomizer/SeedContext.cpp +++ b/soh/soh/Enhancements/randomizer/SeedContext.cpp @@ -217,6 +217,8 @@ void Context::GenerateLocationPool() { (!mOptions[RSK_SHUFFLE_TREES] || mOptions[RSK_LOGIC_RULES].IsNot(RO_LOGIC_NO_LOGIC))) || (location.GetRCType() == RCTYPE_BUSH && !mOptions[RSK_SHUFFLE_BUSHES]) || (location.GetRCType() == RCTYPE_SIGN && mOptions[RSK_SHUFFLE_SIGNS].Is(RO_SHUFFLE_SIGNS_OFF)) || + (location.GetRCType() == RCTYPE_WONDER_ITEM && + mOptions[RSK_SHUFFLE_WONDER_ITEMS].Is(RO_SHUFFLE_WONDER_ITEMS_OFF)) || (location.GetRCType() == RCTYPE_FREESTANDING && mOptions[RSK_SHUFFLE_FREESTANDING].Is(RO_SHUFFLE_FREESTANDING_OFF)) || (location.GetRCType() == RCTYPE_BEEHIVE && !mOptions[RSK_SHUFFLE_BEEHIVES])) { @@ -229,6 +231,8 @@ void Context::GenerateLocationPool() { mOptions[RSK_SHUFFLE_FREESTANDING].Is(RO_SHUFFLE_FREESTANDING_DUNGEONS)) || (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_DUNGEONS)) || (location.GetRCType() == RCTYPE_GRASS && mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_DUNGEONS)) || + (location.GetRCType() == RCTYPE_WONDER_ITEM && + mOptions[RSK_SHUFFLE_WONDER_ITEMS].Is(RO_SHUFFLE_WONDER_ITEMS_DUNGEONS)) || (location.GetRCType() == RCTYPE_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_DUNGEONS)) || (location.GetRCType() == RCTYPE_NLCRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_DUNGEONS) && @@ -250,6 +254,8 @@ void Context::GenerateLocationPool() { (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_OVERWORLD)) || (location.GetRCType() == RCTYPE_GRASS && mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_OVERWORLD)) || + (location.GetRCType() == RCTYPE_WONDER_ITEM && + mOptions[RSK_SHUFFLE_WONDER_ITEMS].Is(RO_SHUFFLE_WONDER_ITEMS_OVERWORLD)) || (location.GetRCType() == RCTYPE_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OVERWORLD)) || (location.GetRCType() == RCTYPE_NLCRATE && diff --git a/soh/soh/Enhancements/randomizer/ShuffleSigns.cpp b/soh/soh/Enhancements/randomizer/ShuffleSigns.cpp index 84d1b1b78..de0181ad7 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleSigns.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleSigns.cpp @@ -1,6 +1,7 @@ #include #include "soh/ObjectExtension/ObjectExtension.h" #include "item_category_adj.h" +#include "particle_cmc.h" extern "C" { extern PlayState* gPlayState; #include "overlays/actors/ovl_En_Kanban/z_en_kanban.h" @@ -9,16 +10,6 @@ extern PlayState* gPlayState; #include "overlays/actors/ovl_En_Wonder_Talk2/z_en_wonder_talk2.h" } -typedef enum { - PARTICLE_MAJOR, - PARTICLE_SKULLTULA_TOKEN, - PARTICLE_SMALL_KEY, - PARTICLE_BOSS_KEY, - PARTICLE_HEALTH, - PARTICLE_LESSER, - PARTICLE_JUNK, -} SignCMCColors; - uint8_t Sign_RandomizerHoldsItem(Actor* actor, PlayState* play) { const auto signIdentity = ObjectExtension::GetInstance().Get(actor); if (signIdentity == nullptr) { @@ -69,40 +60,6 @@ void Sign_RandomizerDrawSetup(void* actor) { int isNotCMC = !cmc || (requiresStoneAgony && !CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)); - // Color of the circle for the particles - static Color_RGBA8 mainColors[7][3] = { - { 250, 185, 40 }, // Major - { 0, 0, 0 }, // Skulltula Token - { 180, 180, 180 }, // Small Key - { 255, 255, 0 }, // Boss Key - { 250, 0, 0 }, // Health - { 170, 50, 0 }, // Lesser - { 255, 255, 255 } // Junk - }; - - // Secondary color of the circle for the particles - static Color_RGBA8 secColors[7][3] = { - { 255, 220, 135 }, // Major - { 255, 250, 190 }, // Skulltula Token - { 130, 130, 130 }, // Small Key - { 0, 200, 255 }, // Boss Key - { 0, 0, 255 }, // Health - { 250, 75, 0 }, // Lesser - { 255, 255, 255 } // Junk - }; - - // Color of the faded flares stretching off the particles - static Color_RGBA8 flareColors[7][3] = { - { 250, 220, 180 }, // Major - { 255, 255, 255 }, // Skulltula Token - { 100, 100, 100 }, // Small Key - { 0, 200, 255 }, // Boss Key - { 255, 125, 125 }, // Health - { 255, 160, 100 }, // Lesser - { 135, 135, 135 } // Junk - }; - - s16 colorIndex; Color_RGBA8 primColor; Color_RGBA8 secColor; Color_RGBA8 envColor; @@ -117,42 +74,11 @@ void Sign_RandomizerDrawSetup(void* actor) { getItemCategory = Randomizer_AdjustItemCategory(signItem); if (isNotCMC) { - colorIndex = PARTICLE_MAJOR; - Color_RGBA8_Copy(&primColor, mainColors[colorIndex]); - Color_RGBA8_Copy(&secColor, secColors[colorIndex]); - Color_RGBA8_Copy(&envColor, flareColors[colorIndex]); - Sign_RandomizerDraw(signActor, &primColor, &secColor, &envColor); - return; + getItemCategory = ITEM_CATEGORY_MAJOR; } - - // Change particle color for CMC - switch (getItemCategory) { - case ITEM_CATEGORY_MAJOR: - colorIndex = PARTICLE_MAJOR; - break; - case ITEM_CATEGORY_SKULLTULA_TOKEN: - colorIndex = PARTICLE_SKULLTULA_TOKEN; - break; - case ITEM_CATEGORY_SMALL_KEY: - colorIndex = PARTICLE_SMALL_KEY; - break; - case ITEM_CATEGORY_BOSS_KEY: - colorIndex = PARTICLE_BOSS_KEY; - break; - case ITEM_CATEGORY_HEALTH: - colorIndex = PARTICLE_HEALTH; - break; - case ITEM_CATEGORY_LESSER: - colorIndex = PARTICLE_LESSER; - break; - case ITEM_CATEGORY_JUNK: - default: - colorIndex = PARTICLE_JUNK; - break; - } - Color_RGBA8_Copy(&primColor, mainColors[colorIndex]); - Color_RGBA8_Copy(&secColor, secColors[colorIndex]); - Color_RGBA8_Copy(&envColor, flareColors[colorIndex]); + primColor = Randomizer_GetParticleCMCColor(getItemCategory, COLOR_PRIMARY); + secColor = Randomizer_GetParticleCMCColor(getItemCategory, COLOR_SECONDARY); + envColor = Randomizer_GetParticleCMCColor(getItemCategory, COLOR_FLARE); Sign_RandomizerDraw(signActor, &primColor, &secColor, &envColor); } diff --git a/soh/soh/Enhancements/randomizer/ShuffleWonderItems.cpp b/soh/soh/Enhancements/randomizer/ShuffleWonderItems.cpp new file mode 100644 index 000000000..b0fddc502 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/ShuffleWonderItems.cpp @@ -0,0 +1,524 @@ +#include +#include +#include "soh/ResourceManagerHelpers.h" +#include "soh/ObjectExtension/ObjectExtension.h" +#include "soh/ObjectExtension/ActorListIndex.h" +#include "item_category_adj.h" +#include "particle_cmc.h" + +extern "C" { +#include "overlays/actors/ovl_En_Wonder_Item/z_en_wonder_item.h" +#include "overlays/actors/ovl_En_Heishi1/z_en_heishi1.h" +extern PlayState* gPlayState; +extern Vec3f sTagPointsFree[9]; +extern Vec3f sTagPointsOrdered[9]; +} + +extern void EnItem00_DrawRandomizedItem(EnItem00* enItem00, PlayState* play); + +// Many wonder items spawn on top of each other, offset position to make them all distinct +static std::unordered_map sStackedWonderOffsets = { + { RC_COLOSSUS_WONDER_OASIS_TREE_1, { 8.0f, 0.0f, -8.0f } }, + { RC_COLOSSUS_WONDER_OASIS_TREE_2, { 5.0f, 0.0f, -8.0f } }, + + { RC_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_RIGHT_COW_1, { 6.0f, 15.0f, 6.0f } }, + { RC_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_RIGHT_COW_2, { 12.0f, 0.0f, 0.0f } }, + { RC_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_RIGHT_COW_3, { -4.0f, -2.0f, 25.0f } }, + + { RC_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_LEFT_COW_1, { -6.0f, -14.0f, 2.0f } }, + { RC_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_LEFT_COW_2, { 5.0f, 0.0f, -10.0f } }, + { RC_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_LEFT_COW_3, { 4.0f, -2.0f, 5.0f } }, + + { RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_RIGHT_1, { 5.0f, 6.0f, 0.0f } }, + { RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_RIGHT_2, { 0.0f, 0.0f, 0.0f } }, + { RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_RIGHT_3, { 0.0f, 0.0f, 0.0f } }, + + { RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_LEFT_1, { -2.0f, 0.0f, 15.0f } }, + { RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_LEFT_2, { 1.0f, -11.0f, -5.0f } }, + { RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_LEFT_3, { 0.0f, -12.0f, 0.0f } }, + + { RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_EXPLOSION_1, { -7.5f, 0.0f, -7.5f } }, + { RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_EXPLOSION_2, { -7.5f, 0.0f, 7.5f } }, + { RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_EXPLOSION_3, { 7.5f, 0.0f, 7.5f } }, + + { RC_FIRE_TEMPLE_MQ_WONDER_SHORTCUT_ROOM_1, { -7.5f, 0.0f, -7.5f } }, + { RC_FIRE_TEMPLE_MQ_WONDER_SHORTCUT_ROOM_2, { -7.5f, 0.0f, 7.5f } }, + { RC_FIRE_TEMPLE_MQ_WONDER_SHORTCUT_ROOM_3, { 7.5f, 0.0f, 7.5f } }, + + { RC_FIRE_TEMPLE_MQ_WONDER_BOSS_KEY_ROOM_HOOKSHOT, { 0.0f, 0.0f, -8.0f } }, + { RC_FIRE_TEMPLE_MQ_WONDER_BOSS_KEY_ROOM_BOW, { 0.0f, 0.0f, 8.0f } }, + + { RC_FIRE_TEMPLE_MQ_WONDER_EAST_TOWER_LARGE_FACE_1, { -8.0f, 0.0f, 0.0f } }, + { RC_FIRE_TEMPLE_MQ_WONDER_EAST_TOWER_LARGE_FACE_2, { 8.0f, 0.0f, 0.0f } }, + + { RC_FIRE_TEMPLE_MQ_WONDER_EAST_TOWER_SMALL_FACE_1, { 0.0f, 0.0f, -8.0f } }, + { RC_FIRE_TEMPLE_MQ_WONDER_EAST_TOWER_SMALL_FACE_2, { 0.0f, 0.0f, 8.0f } }, + + { RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_RIGHT_1, { -5.0f, 1.0f, -5.0f } }, + { RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_RIGHT_2, { 0.0f, -3.0f, -11.0f } }, + { RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_RIGHT_3, { 0.0f, -14.0f, -15.0f } }, + + { RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_LEFT_1, { 0.0f, 9.0f, 10.0f } }, + { RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_LEFT_2, { 0.0f, -7.0f, 10.0f } }, + { RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_LEFT_3, { 0.0f, 0.0f, 10.0f } }, + + { RC_SPIRIT_TEMPLE_MQ_WONDER_CHEST_HAMMER, { 0.0f, 0.0f, -8.0f } }, + { RC_SPIRIT_TEMPLE_MQ_WONDER_CHEST_SLASH, { 0.0f, 0.0f, 8.0f } }, + + { RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_LEFT_1, { -22.5f, 0.0f, 0.0f } }, + { RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_LEFT_2, { -7.5f, 0.0f, 0.0f } }, + { RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_LEFT_3, { 7.5f, 0.0f, 0.0f } }, + { RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_LEFT_4, { 22.5f, 0.0f, 0.0f } }, + + { RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_RIGHT_1, { -22.5f, 0.0f, 0.0f } }, + { RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_RIGHT_2, { -7.5f, 0.0f, 0.0f } }, + { RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_RIGHT_3, { 7.5f, 0.0f, 0.0f } }, + { RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_RIGHT_4, { 22.5f, 0.0f, 0.0f } }, + + { RC_BOTTOM_OF_THE_WELL_MQ_WONDER_SIDE_ROOM_1, { -22.5f, 0.0f, 0.0f } }, + { RC_BOTTOM_OF_THE_WELL_MQ_WONDER_SIDE_ROOM_2, { -7.5f, 0.0f, 0.0f } }, + { RC_BOTTOM_OF_THE_WELL_MQ_WONDER_SIDE_ROOM_3, { 7.5f, 0.0f, 0.0f } }, + { RC_BOTTOM_OF_THE_WELL_MQ_WONDER_SIDE_ROOM_4, { 22.5f, 0.0f, 0.0f } }, +}; + +static Vec3f GetStackOffset(RandomizerCheck rc) { + auto it = sStackedWonderOffsets.find(rc); + return it != sStackedWonderOffsets.end() ? it->second : Vec3f{ 0.0f, 0.0f, 0.0f }; +} + +void SpawnNTSC10WonderItem() { + if (LINK_IS_ADULT && gPlayState->sceneNum == SCENE_ZORAS_FOUNTAIN) { + Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_WONDER_ITEM, -667, 320, 1053, 0, 0, 1, 4799); + } else if (LINK_IS_ADULT && gPlayState->sceneNum == SCENE_DEATH_MOUNTAIN_CRATER) { + Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_WONDER_ITEM, 6, 311, -640, 0, 0, 1, 4799); + } +} + +uint8_t EnWonderItem_RandomizerHoldsItem(EnWonderItem* wonderActor, PlayState* play) { + const CheckIdentity* wonderIdentity = ObjectExtension::GetInstance().Get(&wonderActor->actor); + if (wonderIdentity == nullptr) { + Actor* actor = &wonderActor->actor; + s16 actorIndex = GetActorListIndex(actor); + bool isDungeonScene = (play->sceneNum >= SCENE_DEKU_TREE && play->sceneNum <= SCENE_GERUDO_TRAINING_GROUND) || + play->sceneNum == SCENE_INSIDE_GANONS_CASTLE; + // For dungeons, use room Id and actor index. For overworld, use xz coordinates. + auto newIdentity = isDungeonScene ? OTRGlobals::Instance->gRandomizer->IdentifyWonderItem( + play->sceneNum, (s16)play->roomCtx.curRoom.num, actorIndex) + : OTRGlobals::Instance->gRandomizer->IdentifyWonderItem( + play->sceneNum, (s16)actor->world.pos.x, (s16)actor->world.pos.z); + + ObjectExtension::GetInstance().Set(actor, std::move(newIdentity)); + wonderIdentity = ObjectExtension::GetInstance().Get(actor); + if (wonderIdentity == nullptr) { + return false; + } + } + RandomizerCheck rc = wonderIdentity->randomizerCheck; + uint8_t isDungeon = Rando::StaticData::GetLocation(rc)->IsDungeon(); + auto wonderSetting = RAND_GET_OPTION(RSK_SHUFFLE_WONDER_ITEMS); + if (!IS_RANDO || (wonderSetting.Is(RO_SHUFFLE_WONDER_ITEMS_OVERWORLD) && isDungeon) || + (wonderSetting.Is(RO_SHUFFLE_WONDER_ITEMS_DUNGEONS) && !isDungeon) || + Flags_GetRandomizerInf(wonderIdentity->randomizerInf) || wonderIdentity->randomizerCheck == RC_UNKNOWN_CHECK) { + return false; + } else { + return true; + } +} + +static void EnWonderItem_RandomizerDraw(EnWonderItem* wonderActor, Color_RGBA8* primColor, Color_RGBA8* secColor, + Color_RGBA8* envColor, CheckIdentity* wonderIdentity) { + Vec3f pos; + static Vec3f velocity = { 0.0f, 0.0f, 0.0f }; + static Vec3f accel = { 0.0f, 0.0f, 0.0f }; + + velocity.y = -0.05f; + accel.y = -0.025f; + + // Draw particles at tag spots if applicable, otherwise at wonder item actor location + if (wonderActor->wonderMode == WONDERITEM_MULTITAG_ORDERED) { + for (s32 i = 0, mask = 1; i < wonderActor->numTagPoints; i++, mask <<= 1) { + if (!(wonderActor->tagFlags & mask)) { + pos.x = Rand_CenteredFloat(1.0f) + sTagPointsOrdered[i].x; + pos.y = (Rand_ZeroOne() * 25.0f) + sTagPointsOrdered[i].y + 10; + pos.z = Rand_CenteredFloat(1.0f) + sTagPointsOrdered[i].z; + EffectSsKiraKira_SpawnFocused(gPlayState, &pos, &velocity, &accel, secColor, envColor, 2000, 100); + EffectSsKiraKira_SpawnFocused(gPlayState, &pos, &velocity, &accel, primColor, envColor, 2000, 100); + } + } + } else if (wonderActor->wonderMode == WONDERITEM_MULTITAG_FREE) { + for (s32 i = 0, mask = 1; i < wonderActor->numTagPoints; i++, mask <<= 1) { + if (!(wonderActor->tagFlags & mask)) { + pos.x = Rand_CenteredFloat(1.0f) + sTagPointsFree[i].x; + pos.y = (Rand_ZeroOne() * 25.0f) + sTagPointsFree[i].y + 10; + pos.z = Rand_CenteredFloat(1.0f) + sTagPointsFree[i].z; + EffectSsKiraKira_SpawnFocused(gPlayState, &pos, &velocity, &accel, secColor, envColor, 2000, 100); + EffectSsKiraKira_SpawnFocused(gPlayState, &pos, &velocity, &accel, primColor, envColor, 2000, 100); + } + } + } else { + Vec3f offset = GetStackOffset(wonderIdentity->randomizerCheck); + pos.x = Rand_CenteredFloat(1.0f) + wonderActor->actor.world.pos.x + offset.x; + pos.y = (Rand_ZeroOne() * 25.0f) + wonderActor->actor.world.pos.y + 10 + offset.y; + pos.z = Rand_CenteredFloat(1.0f) + wonderActor->actor.world.pos.z + offset.z; + EffectSsKiraKira_SpawnFocused(gPlayState, &pos, &velocity, &accel, secColor, envColor, 2000, 100); + EffectSsKiraKira_SpawnFocused(gPlayState, &pos, &velocity, &accel, primColor, envColor, 2000, 100); + } +} + +void EnWonderItem_RandomizerDrawSetup(void* refActor) { + GetItemCategory getItemCategory; + EnWonderItem* wonderActor = static_cast(refActor); + + // If not a randomized item or too far, don't draw. + // If item is unshuffled or collected, kill wonder actor if switch flag is set. + if (!EnWonderItem_RandomizerHoldsItem(wonderActor, gPlayState)) { + if ((wonderActor->switchFlag >= 0) && Flags_GetSwitch(gPlayState, wonderActor->switchFlag)) { + Actor_Kill(&wonderActor->actor); + } + return; + } else if (wonderActor->actor.xzDistToPlayer > 1000.0f) { + return; + } + + bool cmc = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), 0); + int requiresStoneAgony = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony"), 0); + + int isNotCMC = !cmc || (requiresStoneAgony && !CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)); + + Color_RGBA8 primColor; + Color_RGBA8 secColor; + Color_RGBA8 envColor; + + const auto wonderIdentity = ObjectExtension::GetInstance().Get(refActor); + if (wonderIdentity == nullptr) { + return; + } + + GetItemEntry wonderItem = + Rando::Context::GetInstance()->GetFinalGIEntry(wonderIdentity->randomizerCheck, true, GI_NONE); + getItemCategory = Randomizer_AdjustItemCategory(wonderItem); + + if (isNotCMC) { + getItemCategory = ITEM_CATEGORY_MAJOR; + } + primColor = Randomizer_GetParticleCMCColor(getItemCategory, COLOR_PRIMARY); + secColor = Randomizer_GetParticleCMCColor(getItemCategory, COLOR_SECONDARY); + envColor = Randomizer_GetParticleCMCColor(getItemCategory, COLOR_FLARE); + EnWonderItem_RandomizerDraw(wonderActor, &primColor, &secColor, &envColor, wonderIdentity); +} + +void EnWonderItem_RandomizerSpawnCollectible(EnWonderItem* wonderActor, PlayState* play) { + const auto wonderIdentity = ObjectExtension::GetInstance().Get(&wonderActor->actor); + EnItem00* item00; + Player* player = GET_PLAYER(gPlayState); + + // Hyrule courtyard left window handled separately to replace the bomb the guard throws + if (wonderIdentity == nullptr || wonderIdentity->randomizerCheck == RC_HC_WONDER_COURTYARD_LEFT_WINDOW) { + return; + } + // if activated via tag points, autocollect the check, otherwise spawn the item toward the player + // Water Temple MQ hookshot staircase can easily spawn unreachable items, autocollect + // Jabu MQ holes cow always spawns the item OOB (vanilla bug), autocollect + if (wonderActor->wonderMode == WONDERITEM_MULTITAG_FREE || wonderActor->wonderMode == WONDERITEM_PROXIMITY_DROP || + wonderActor->wonderMode == WONDERITEM_MULTITAG_ORDERED || + (wonderIdentity->randomizerCheck >= RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_RIGHT_1 && + wonderIdentity->randomizerCheck <= RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_LEFT_3) || + wonderIdentity->randomizerCheck == RC_JABU_JABUS_BELLY_MQ_HOLES_COW) { + Flags_SetRandomizerInf(wonderIdentity->randomizerInf); + } else { + item00 = (EnItem00*)Item_DropCollectible(play, &wonderActor->actor.world.pos, ITEM00_SOH_DUMMY); + item00->randoInf = wonderIdentity->randomizerInf; + item00->itemEntry = + Rando::Context::GetInstance()->GetFinalGIEntry(wonderIdentity->randomizerCheck, true, GI_NONE); + item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem; + if (gPlayState->sceneNum != SCENE_INSIDE_GANONS_CASTLE) { + item00->actor.velocity.y = 3.0f; + item00->actor.speedXZ = 3.0f; + item00->actor.world.rot.y = + Math_Vec3f_Yaw(&item00->actor.world.pos, &player->actor.world.pos) + (s16)Rand_CenteredFloat(16384.0f); + } + } +} + +void WonderHeishi_RandomizerSpawnCollectible(PlayState* play, Vec3f pos, f32 rotY) { + EnItem00* item00; + Player* player = GET_PLAYER(gPlayState); + + item00 = (EnItem00*)Item_DropCollectible(play, &pos, ITEM00_SOH_DUMMY); + item00->randoInf = RAND_INF_HC_WONDER_COURTYARD_LEFT_WINDOW; + item00->itemEntry = + Rando::Context::GetInstance()->GetFinalGIEntry(RC_HC_WONDER_COURTYARD_LEFT_WINDOW, true, GI_NONE); + item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem; + item00->actor.velocity.y = Rand_CenteredFloat(5.0f) + 10.0f; + item00->actor.speedXZ = Rand_CenteredFloat(5.0f) + 10.0f; + item00->actor.world.rot.y = rotY; +} + +void RegisterShuffleWonderItems() { + bool shouldRegister = IS_RANDO && RAND_GET_OPTION(RSK_SHUFFLE_WONDER_ITEMS); + bool isNtscUs10 = false; + for (uint32_t i = 0; i < ResourceMgr_GetNumGameVersions(); i++) { + if (ResourceMgr_GetGameVersion(i) == OOT_NTSC_US_10) { + isNtscUs10 = true; + } + } + bool shouldRegisterOverworld = RAND_GET_OPTION(RSK_SHUFFLE_WONDER_ITEMS).Is(RO_SHUFFLE_WONDER_ITEMS_ALL) || + RAND_GET_OPTION(RSK_SHUFFLE_WONDER_ITEMS).Is(RO_SHUFFLE_WONDER_ITEMS_OVERWORLD); + bool shouldRegisterNTSC10 = shouldRegister && isNtscUs10 && shouldRegisterOverworld; + + // Draw particle effect in wonder item spot to indicate a randomized item + COND_ID_HOOK(OnActorUpdate, ACTOR_EN_WONDER_ITEM, shouldRegister, EnWonderItem_RandomizerDrawSetup); + + // Spawn missing wonder items for NTSC 1.0 + COND_HOOK(OnSceneSpawnActors, shouldRegisterNTSC10, SpawnNTSC10WonderItem); + + // Prevent or delay actor kill until EnWonderItem_RandomizerDrawSetup in case item isn't yet collected + COND_VB_SHOULD(VB_WONDER_SPAWN, shouldRegister, { *should = false; }); + + // Do not spawn vanilla wonder item, instead spawn the randomized item + COND_VB_SHOULD(VB_WONDER_DROP_ITEM, shouldRegister, { + EnWonderItem* wonderActor = va_arg(args, EnWonderItem*); + if (EnWonderItem_RandomizerHoldsItem(wonderActor, gPlayState)) { + EnWonderItem_RandomizerSpawnCollectible(wonderActor, gPlayState); + *should = false; + } + }); + + // Do not spawn castle courtyard guard bomb, instead spawn the randomized item + COND_VB_SHOULD(VB_WONDER_HEISHI_ITEM, shouldRegisterOverworld, { + if (!Flags_GetRandomizerInf(RAND_INF_HC_WONDER_COURTYARD_LEFT_WINDOW)) { + Vec3f* pos = va_arg(args, Vec3f*); + f32 rotY = (f32)va_arg(args, double); + + WonderHeishi_RandomizerSpawnCollectible(gPlayState, *pos, rotY); + *should = false; + } + }); + + // If courtyard items are uncollected, keep guards patrolling + COND_VB_SHOULD(VB_WONDER_HEISHI_PATROLLING, shouldRegisterOverworld, { + EnHeishi1* guardActor = va_arg(args, EnHeishi1*); + if (!Flags_GetRandomizerInf(RAND_INF_HC_WONDER_COURTYARD_LEFT_WINDOW) || + !Flags_GetRandomizerInf(RAND_INF_HC_WONDER_COURTYARD_RIGHT_WINDOW)) { + *should = guardActor->type != 5; + } + }); +} + +void Rando::StaticData::RegisterWonderItemLocations() { + static bool registered = false; + if (registered) + return; + registered = true; + // clang-format off + // Overworld Wonder Items + // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Vanilla Spoiler Collection Check + locationTable[RC_KF_WONDER_TRAINING_1] = Location::WonderItem(RC_KF_WONDER_TRAINING_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-747, 951), "Wonder Training 1", RHT_WONDER_ITEM_KOKIRI_FOREST, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_WONDER_TRAINING_1)); + locationTable[RC_KF_WONDER_TRAINING_2] = Location::WonderItem(RC_KF_WONDER_TRAINING_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-677, 899), "Wonder Training 2", RHT_WONDER_ITEM_KOKIRI_FOREST, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_WONDER_TRAINING_2)); + locationTable[RC_KF_WONDER_TRAINING_3] = Location::WonderItem(RC_KF_WONDER_TRAINING_3, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-698, 830), "Wonder Training 3", RHT_WONDER_ITEM_KOKIRI_FOREST, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_WONDER_TRAINING_3)); + locationTable[RC_KF_WONDER_SHOP] = Location::WonderItem(RC_KF_WONDER_SHOP, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_SHOP, TWO_ACTOR_PARAMS(146, -97), "Wonder Shop", RHT_WONDER_ITEM_KOKIRI_FOREST, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_WONDER_SHOP)); + locationTable[RC_KF_WONDER_SIGN] = Location::WonderItem(RC_KF_WONDER_SIGN, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-488, 600), "Wonder Sign", RHT_WONDER_ITEM_KOKIRI_FOREST, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_WONDER_SIGN)); + locationTable[RC_KF_WONDER_PLATFORMS_1] = Location::WonderItem(RC_KF_WONDER_PLATFORMS_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(364, 28), "Wonder Platforms 1", RHT_WONDER_ITEM_KOKIRI_FOREST, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_WONDER_PLATFORMS_1)); + locationTable[RC_KF_WONDER_PLATFORMS_2] = Location::WonderItem(RC_KF_WONDER_PLATFORMS_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(1074, 178), "Wonder Platforms 2", RHT_WONDER_ITEM_KOKIRI_FOREST, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_WONDER_PLATFORMS_2)); + locationTable[RC_KF_WONDER_CRAWL_GRASS_1] = Location::WonderItem(RC_KF_WONDER_CRAWL_GRASS_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-590, 1635), "Wonder Crawl Grass 1", RHT_WONDER_ITEM_KOKIRI_FOREST, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_WONDER_CRAWL_GRASS_1)); + locationTable[RC_KF_WONDER_CRAWL_GRASS_2] = Location::WonderItem(RC_KF_WONDER_CRAWL_GRASS_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-584, 1762), "Wonder Crawl Grass 2", RHT_WONDER_ITEM_KOKIRI_FOREST, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_WONDER_CRAWL_GRASS_2)); + locationTable[RC_HF_WONDER_BRIDGE_1] = Location::WonderItem(RC_HF_WONDER_BRIDGE_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-99, 662), "Wonder Bridge Left", RHT_WONDER_ITEM_HYRULE_FIELD, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_WONDER_BRIDGE_1)); + locationTable[RC_HF_WONDER_BRIDGE_2] = Location::WonderItem(RC_HF_WONDER_BRIDGE_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1, 665), "Wonder Bridge Center", RHT_WONDER_ITEM_HYRULE_FIELD, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_WONDER_BRIDGE_2)); + locationTable[RC_HF_WONDER_BRIDGE_3] = Location::WonderItem(RC_HF_WONDER_BRIDGE_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(93, 659), "Wonder Bridge Right", RHT_WONDER_ITEM_HYRULE_FIELD, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_WONDER_BRIDGE_3)); + locationTable[RC_MKT_WONDER_DAY_1] = Location::WonderItem(RC_MKT_WONDER_DAY_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(-523, -340), "Wonder Day Balcony 1", RHT_WONDER_ITEM_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MKT_WONDER_DAY_1)); + locationTable[RC_MKT_WONDER_DAY_2] = Location::WonderItem(RC_MKT_WONDER_DAY_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(-523, -224), "Wonder Day Balcony 2", RHT_WONDER_ITEM_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MKT_WONDER_DAY_2)); + locationTable[RC_MKT_WONDER_DAY_3] = Location::WonderItem(RC_MKT_WONDER_DAY_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(-521, -113), "Wonder Day Balcony 3", RHT_WONDER_ITEM_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MKT_WONDER_DAY_3)); + locationTable[RC_MKT_WONDER_DAY_4] = Location::WonderItem(RC_MKT_WONDER_DAY_4, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(-521, -2), "Wonder Day Balcony 4", RHT_WONDER_ITEM_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MKT_WONDER_DAY_4)); + locationTable[RC_MKT_WONDER_DAY_5] = Location::WonderItem(RC_MKT_WONDER_DAY_5, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(-516, 117), "Wonder Day Balcony 5", RHT_WONDER_ITEM_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MKT_WONDER_DAY_5)); + locationTable[RC_MKT_WONDER_NIGHT_1] = Location::WonderItem(RC_MKT_WONDER_NIGHT_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_NIGHT, TWO_ACTOR_PARAMS(-524, -246), "Wonder Night Balcony 1", RHT_WONDER_ITEM_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MKT_WONDER_NIGHT_1)); + locationTable[RC_MKT_WONDER_NIGHT_2] = Location::WonderItem(RC_MKT_WONDER_NIGHT_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_NIGHT, TWO_ACTOR_PARAMS(-521, 27), "Wonder Night Balcony 2", RHT_WONDER_ITEM_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MKT_WONDER_NIGHT_2)); + locationTable[RC_LLR_WONDER_BIG_FENCE] = Location::WonderItem(RC_LLR_WONDER_BIG_FENCE, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(-443, -311), "Wonder Big Fence", RHT_WONDER_ITEM_LON_LON_RANCH, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_WONDER_BIG_FENCE)); + locationTable[RC_LLR_WONDER_SMALL_FENCE] = Location::WonderItem(RC_LLR_WONDER_SMALL_FENCE, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(295, -979), "Wonder Small Fence", RHT_WONDER_ITEM_LON_LON_RANCH, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_WONDER_SMALL_FENCE)); + locationTable[RC_HC_WONDER_LEFT_TORCH] = Location::WonderItem(RC_HC_WONDER_LEFT_TORCH, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(-502, 468), "Wonder Left Torch", RHT_WONDER_ITEM_HYRULE_CASTLE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_WONDER_LEFT_TORCH)); + locationTable[RC_HC_WONDER_RIGHT_TORCH] = Location::WonderItem(RC_HC_WONDER_RIGHT_TORCH, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(-72, 468), "Wonder Right Torch", RHT_WONDER_ITEM_HYRULE_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_WONDER_RIGHT_TORCH)); + locationTable[RC_HC_WONDER_MOAT_1] = Location::WonderItem(RC_HC_WONDER_MOAT_1, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(706, -663), "Wonder Moat Past Boxes", RHT_WONDER_ITEM_HYRULE_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_WONDER_MOAT_1)); + locationTable[RC_HC_WONDER_MOAT_2] = Location::WonderItem(RC_HC_WONDER_MOAT_2, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(755, -118), "Wonder Moat Past Gate 1", RHT_WONDER_ITEM_HYRULE_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_WONDER_MOAT_2)); + locationTable[RC_HC_WONDER_MOAT_3] = Location::WonderItem(RC_HC_WONDER_MOAT_3, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(725, 112), "Wonder Moat Past Gate 2", RHT_WONDER_ITEM_HYRULE_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_WONDER_MOAT_3)); + locationTable[RC_HC_WONDER_MOAT_4] = Location::WonderItem(RC_HC_WONDER_MOAT_4, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(754, 395), "Wonder Moat Before Gate 1", RHT_WONDER_ITEM_HYRULE_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_WONDER_MOAT_4)); + locationTable[RC_HC_WONDER_MOAT_5] = Location::WonderItem(RC_HC_WONDER_MOAT_5, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(403, 587), "Wonder Moat Before Gate 2", RHT_WONDER_ITEM_HYRULE_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_WONDER_MOAT_5)); + locationTable[RC_HC_WONDER_MOAT_6] = Location::WonderItem(RC_HC_WONDER_MOAT_6, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(62, 555), "Wonder Moat Before Gate 3", RHT_WONDER_ITEM_HYRULE_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_WONDER_MOAT_6)); + locationTable[RC_HC_WONDER_MOAT_7] = Location::WonderItem(RC_HC_WONDER_MOAT_7, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(-256, 598), "Wonder Moat Before Gate 4", RHT_WONDER_ITEM_HYRULE_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_WONDER_MOAT_7)); + locationTable[RC_HC_WONDER_MOAT_8] = Location::WonderItem(RC_HC_WONDER_MOAT_8, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(-557, 568), "Wonder Moat Before Gate 5", RHT_WONDER_ITEM_HYRULE_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_WONDER_MOAT_8)); + locationTable[RC_HC_WONDER_MOAT_9] = Location::WonderItem(RC_HC_WONDER_MOAT_9, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(-819, 613), "Wonder Moat Before Gate 6", RHT_WONDER_ITEM_HYRULE_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_WONDER_MOAT_9)); + locationTable[RC_HC_WONDER_MOAT_10] = Location::WonderItem(RC_HC_WONDER_MOAT_10, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(-1190, 561), "Wonder Moat Before Gate 7", RHT_WONDER_ITEM_HYRULE_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_WONDER_MOAT_10)); + locationTable[RC_HC_WONDER_COURTYARD_RIGHT_WINDOW] = Location::WonderItem(RC_HC_WONDER_COURTYARD_RIGHT_WINDOW, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_CASTLE_COURTYARD_ZELDA, TWO_ACTOR_PARAMS(0, -481), "Wonder Courtyard Right Window", RHT_WONDER_ITEM_CASTLE_COURTYARD_ZELDA, RG_PURPLE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_WONDER_COURTYARD_RIGHT_WINDOW)); + locationTable[RC_HC_WONDER_COURTYARD_LEFT_WINDOW] = Location::WonderItem(RC_HC_WONDER_COURTYARD_LEFT_WINDOW, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_CASTLE_COURTYARD_ZELDA, TWO_ACTOR_PARAMS(0, 476), "Wonder Courtyard Left Window", RHT_WONDER_ITEM_CASTLE_COURTYARD_ZELDA, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_WONDER_COURTYARD_LEFT_WINDOW)); + locationTable[RC_LW_WONDER_BACK_SKULL_KIDS_GRASS_1] = Location::WonderItem(RC_LW_WONDER_BACK_SKULL_KIDS_GRASS_1, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(1371, 497), "Wonder Back Skull Kids Grass 1", RHT_WONDER_ITEM_LOST_WOODS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_WONDER_BACK_SKULL_KIDS_GRASS_1)); + locationTable[RC_LW_WONDER_BACK_SKULL_KIDS_GRASS_2] = Location::WonderItem(RC_LW_WONDER_BACK_SKULL_KIDS_GRASS_2, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(1038, 557), "Wonder Back Skull Kids Grass 2", RHT_WONDER_ITEM_LOST_WOODS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_WONDER_BACK_SKULL_KIDS_GRASS_2)); + locationTable[RC_LW_WONDER_FRONT_SKULL_KIDS_GRASS] = Location::WonderItem(RC_LW_WONDER_FRONT_SKULL_KIDS_GRASS, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(1256, 194), "Wonder Front Skull Kids Grass", RHT_WONDER_ITEM_LOST_WOODS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_WONDER_FRONT_SKULL_KIDS_GRASS)); + locationTable[RC_SFM_WONDER_ENTRANCE] = Location::WonderItem(RC_SFM_WONDER_ENTRANCE, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS(-351, 2121), "Wonder Entrance Grass", RHT_WONDER_ITEM_SACRED_FOREST_MEADOW, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_WONDER_ENTRANCE)); + locationTable[RC_SFM_WONDER_MAZE_1] = Location::WonderItem(RC_SFM_WONDER_MAZE_1, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS(100, 1375), "Wonder First Row Grass", RHT_WONDER_ITEM_SACRED_FOREST_MEADOW, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_WONDER_MAZE_1)); + locationTable[RC_SFM_WONDER_MAZE_2] = Location::WonderItem(RC_SFM_WONDER_MAZE_2, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS(100, 1084), "Wonder Second Row Grass 1", RHT_WONDER_ITEM_SACRED_FOREST_MEADOW, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_WONDER_MAZE_2)); + locationTable[RC_SFM_WONDER_MAZE_3] = Location::WonderItem(RC_SFM_WONDER_MAZE_3, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS(-204, 1283), "Wonder Second Row Grass 2", RHT_WONDER_ITEM_SACRED_FOREST_MEADOW, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_WONDER_MAZE_3)); + locationTable[RC_SFM_WONDER_MAZE_4] = Location::WonderItem(RC_SFM_WONDER_MAZE_4, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS(-199, 177), "Wonder End of Maze Grass 1", RHT_WONDER_ITEM_SACRED_FOREST_MEADOW, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_WONDER_MAZE_4)); + locationTable[RC_SFM_WONDER_MAZE_5] = Location::WonderItem(RC_SFM_WONDER_MAZE_5, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS(299, 285), "Wonder End of Maze Grass 2", RHT_WONDER_ITEM_SACRED_FOREST_MEADOW, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_WONDER_MAZE_5)); + locationTable[RC_KAK_WONDER_UNDER_CONSTRUCTION] = Location::WonderItem(RC_KAK_WONDER_UNDER_CONSTRUCTION, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(148, 1165), "Wonder Under Construction", RHT_WONDER_ITEM_KAKARIKO_VILLAGE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_WONDER_UNDER_CONSTRUCTION)); + locationTable[RC_KAK_WONDER_ABOVE_COW] = Location::WonderItem(RC_KAK_WONDER_ABOVE_COW, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_IMPAS_HOUSE, TWO_ACTOR_PARAMS(153, -266), "Wonder Above Impa's Cow", RHT_WONDER_ITEM_KAKARIKO_VILLAGE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_WONDER_ABOVE_COW)); + locationTable[RC_GY_WONDER_DAMPE_RACE_1] = Location::WonderItem(RC_GY_WONDER_DAMPE_RACE_1, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(391, -2681), "Wonder Dampe's Grave 1", RHT_WONDER_ITEM_DAMPES_GRAVE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_WONDER_DAMPE_RACE_1)); + locationTable[RC_GY_WONDER_DAMPE_RACE_2] = Location::WonderItem(RC_GY_WONDER_DAMPE_RACE_2, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(394, -2588), "Wonder Dampe's Grave 2", RHT_WONDER_ITEM_DAMPES_GRAVE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_WONDER_DAMPE_RACE_2)); + locationTable[RC_GY_WONDER_DAMPE_RACE_3] = Location::WonderItem(RC_GY_WONDER_DAMPE_RACE_3, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(475, -2591), "Wonder Dampe's Grave 3", RHT_WONDER_ITEM_DAMPES_GRAVE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_WONDER_DAMPE_RACE_3)); + locationTable[RC_GY_WONDER_DAMPE_RACE_4] = Location::WonderItem(RC_GY_WONDER_DAMPE_RACE_4, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(562, -2588), "Wonder Dampe's Grave 4", RHT_WONDER_ITEM_DAMPES_GRAVE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_WONDER_DAMPE_RACE_4)); + locationTable[RC_GY_WONDER_DAMPE_RACE_5] = Location::WonderItem(RC_GY_WONDER_DAMPE_RACE_5, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(621, -3219), "Wonder Dampe's Grave 5", RHT_WONDER_ITEM_DAMPES_GRAVE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_WONDER_DAMPE_RACE_5)); + locationTable[RC_GY_WONDER_DAMPE_RACE_6] = Location::WonderItem(RC_GY_WONDER_DAMPE_RACE_6, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(570, -5778), "Wonder Dampe's Grave 6", RHT_WONDER_ITEM_DAMPES_GRAVE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_WONDER_DAMPE_RACE_6)); + locationTable[RC_GY_WONDER_DAMPE_RACE_7] = Location::WonderItem(RC_GY_WONDER_DAMPE_RACE_7, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(353, -5825), "Wonder Dampe's Grave 7", RHT_WONDER_ITEM_DAMPES_GRAVE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_WONDER_DAMPE_RACE_7)); + locationTable[RC_GY_WONDER_DAMPE_RACE_8] = Location::WonderItem(RC_GY_WONDER_DAMPE_RACE_8, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(1666, -5736), "Wonder Dampe's Grave 8", RHT_WONDER_ITEM_DAMPES_GRAVE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_WONDER_DAMPE_RACE_8)); + locationTable[RC_GY_WONDER_DAMPE_RACE_9] = Location::WonderItem(RC_GY_WONDER_DAMPE_RACE_9, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(2549, -4598), "Wonder Dampe's Grave 9", RHT_WONDER_ITEM_DAMPES_GRAVE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_WONDER_DAMPE_RACE_9)); + locationTable[RC_GY_WONDER_DAMPE_RACE_10] = Location::WonderItem(RC_GY_WONDER_DAMPE_RACE_10, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(2547, -4847), "Wonder Dampe's Grave 10", RHT_WONDER_ITEM_DAMPES_GRAVE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_WONDER_DAMPE_RACE_10)); + locationTable[RC_GY_WONDER_DAMPE_RACE_11] = Location::WonderItem(RC_GY_WONDER_DAMPE_RACE_11, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(2726, -3634), "Wonder Dampe's Grave 11", RHT_WONDER_ITEM_DAMPES_GRAVE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_WONDER_DAMPE_RACE_11)); + locationTable[RC_GY_WONDER_DAMPE_RACE_12] = Location::WonderItem(RC_GY_WONDER_DAMPE_RACE_12, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(2728, -3500), "Wonder Dampe's Grave 12", RHT_WONDER_ITEM_DAMPES_GRAVE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_WONDER_DAMPE_RACE_12)); + locationTable[RC_GY_WONDER_DAMPE_RACE_13] = Location::WonderItem(RC_GY_WONDER_DAMPE_RACE_13, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(2633, -3394), "Wonder Dampe's Grave 13", RHT_WONDER_ITEM_DAMPES_GRAVE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_WONDER_DAMPE_RACE_13)); + locationTable[RC_GY_WONDER_DAMPE_RACE_14] = Location::WonderItem(RC_GY_WONDER_DAMPE_RACE_14, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(2377, -3398), "Wonder Dampe's Grave 14", RHT_WONDER_ITEM_DAMPES_GRAVE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_WONDER_DAMPE_RACE_14)); + locationTable[RC_GY_WONDER_DAMPE_RACE_15] = Location::WonderItem(RC_GY_WONDER_DAMPE_RACE_15, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(1308, -3125), "Wonder Dampe's Grave 15", RHT_WONDER_ITEM_DAMPES_GRAVE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_WONDER_DAMPE_RACE_15)); + locationTable[RC_DMC_WONDER_BENEATH_BRIDGE_PLATFORM] = Location::WonderItem(RC_DMC_WONDER_BENEATH_BRIDGE_PLATFORM, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(6, -640), "Wonder Beneath Bridge Platform", RHT_WONDER_ITEM_DEATH_MOUNTAIN_CRATER, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_WONDER_BENEATH_BRIDGE_PLATFORM)); + locationTable[RC_ZR_WONDER_NEAR_DOMAIN_1] = Location::WonderItem(RC_ZR_WONDER_NEAR_DOMAIN_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(3329, -1499), "Wonder Near Domain 1", RHT_WONDER_ITEM_ZORAS_RIVER, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_WONDER_NEAR_DOMAIN_1)); + locationTable[RC_ZR_WONDER_NEAR_DOMAIN_2] = Location::WonderItem(RC_ZR_WONDER_NEAR_DOMAIN_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(3161, -1493), "Wonder Near Domain 2", RHT_WONDER_ITEM_ZORAS_RIVER, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_WONDER_NEAR_DOMAIN_2)); + locationTable[RC_ZR_WONDER_NEAR_DOMAIN_3] = Location::WonderItem(RC_ZR_WONDER_NEAR_DOMAIN_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(2987, -1499), "Wonder Near Domain 3", RHT_WONDER_ITEM_ZORAS_RIVER, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_WONDER_NEAR_DOMAIN_3)); + locationTable[RC_ZR_WONDER_NEAR_DOMAIN_4] = Location::WonderItem(RC_ZR_WONDER_NEAR_DOMAIN_4, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(2831, -1421), "Wonder Near Domain 4", RHT_WONDER_ITEM_ZORAS_RIVER, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_WONDER_NEAR_DOMAIN_4)); + locationTable[RC_ZR_WONDER_BEFORE_LADDER_1] = Location::WonderItem(RC_ZR_WONDER_BEFORE_LADDER_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(1287, -363), "Wonder Before Ladder 1", RHT_WONDER_ITEM_ZORAS_RIVER, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_WONDER_BEFORE_LADDER_1)); + locationTable[RC_ZR_WONDER_BEFORE_LADDER_2] = Location::WonderItem(RC_ZR_WONDER_BEFORE_LADDER_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(1144, -296), "Wonder Before Ladder 2", RHT_WONDER_ITEM_ZORAS_RIVER, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_WONDER_BEFORE_LADDER_2)); + locationTable[RC_ZR_WONDER_BEFORE_LADDER_3] = Location::WonderItem(RC_ZR_WONDER_BEFORE_LADDER_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(1021, -224), "Wonder Before Ladder 3", RHT_WONDER_ITEM_ZORAS_RIVER, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_WONDER_BEFORE_LADDER_3)); + locationTable[RC_ZR_WONDER_BEFORE_LADDER_4] = Location::WonderItem(RC_ZR_WONDER_BEFORE_LADDER_4, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(902, -150), "Wonder Before Ladder 4", RHT_WONDER_ITEM_ZORAS_RIVER, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_WONDER_BEFORE_LADDER_4)); + locationTable[RC_ZR_WONDER_BEFORE_LADDER_5] = Location::WonderItem(RC_ZR_WONDER_BEFORE_LADDER_5, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(786, -74), "Wonder Before Ladder 5", RHT_WONDER_ITEM_ZORAS_RIVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_WONDER_BEFORE_LADDER_5)); + locationTable[RC_ZR_WONDER_BEFORE_LADDER_6] = Location::WonderItem(RC_ZR_WONDER_BEFORE_LADDER_6, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(670, 3), "Wonder Before Ladder 6", RHT_WONDER_ITEM_ZORAS_RIVER, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_WONDER_BEFORE_LADDER_6)); + locationTable[RC_ZR_WONDER_AFTER_LADDER_1] = Location::WonderItem(RC_ZR_WONDER_AFTER_LADDER_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(520, 12), "Wonder After Ladder 1", RHT_WONDER_ITEM_ZORAS_RIVER, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_WONDER_AFTER_LADDER_1)); + locationTable[RC_ZR_WONDER_AFTER_LADDER_2] = Location::WonderItem(RC_ZR_WONDER_AFTER_LADDER_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(353, 9), "Wonder After Ladder 2", RHT_WONDER_ITEM_ZORAS_RIVER, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_WONDER_AFTER_LADDER_2)); + locationTable[RC_ZR_WONDER_AFTER_LADDER_3] = Location::WonderItem(RC_ZR_WONDER_AFTER_LADDER_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(158, 6), "Wonder After Ladder 3", RHT_WONDER_ITEM_ZORAS_RIVER, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_WONDER_AFTER_LADDER_3)); + locationTable[RC_ZR_WONDER_FROG_BRIDGE_1] = Location::WonderItem(RC_ZR_WONDER_FROG_BRIDGE_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(1204, -608), "Wonder Frog Bridge 1", RHT_WONDER_ITEM_ZORAS_RIVER, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_WONDER_FROG_BRIDGE_1)); + locationTable[RC_ZR_WONDER_FROG_BRIDGE_2] = Location::WonderItem(RC_ZR_WONDER_FROG_BRIDGE_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(1124, -803), "Wonder Frog Bridge 2", RHT_WONDER_ITEM_ZORAS_RIVER, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_WONDER_FROG_BRIDGE_2)); + locationTable[RC_ZR_WONDER_FROG_BRIDGE_3] = Location::WonderItem(RC_ZR_WONDER_FROG_BRIDGE_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(1020, -973), "Wonder Frog Bridge 3", RHT_WONDER_ITEM_ZORAS_RIVER, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_WONDER_FROG_BRIDGE_3)); + locationTable[RC_ZR_WONDER_PILLARS_1] = Location::WonderItem(RC_ZR_WONDER_PILLARS_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(509, -1223), "Wonder Pillars 1", RHT_WONDER_ITEM_ZORAS_RIVER, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_WONDER_PILLARS_1)); + locationTable[RC_ZR_WONDER_PILLARS_2] = Location::WonderItem(RC_ZR_WONDER_PILLARS_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(269, -1018), "Wonder Pillars 2", RHT_WONDER_ITEM_ZORAS_RIVER, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_WONDER_PILLARS_2)); + locationTable[RC_ZR_WONDER_PILLARS_3] = Location::WonderItem(RC_ZR_WONDER_PILLARS_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(9, -1158), "Wonder Pillars 3", RHT_WONDER_ITEM_ZORAS_RIVER, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_WONDER_PILLARS_3)); + locationTable[RC_ZR_WONDER_PILLARS_4] = Location::WonderItem(RC_ZR_WONDER_PILLARS_4, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-145, -938), "Wonder Pillars 4", RHT_WONDER_ITEM_ZORAS_RIVER, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_WONDER_PILLARS_4)); + locationTable[RC_ZR_WONDER_LOWER_LAND_BRIDGE_1] = Location::WonderItem(RC_ZR_WONDER_LOWER_LAND_BRIDGE_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-147, -736), "Wonder Lower Land Bridge 1", RHT_WONDER_ITEM_ZORAS_RIVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_WONDER_LOWER_LAND_BRIDGE_1)); + locationTable[RC_ZR_WONDER_LOWER_LAND_BRIDGE_2] = Location::WonderItem(RC_ZR_WONDER_LOWER_LAND_BRIDGE_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-141, -588), "Wonder Lower Land Bridge 2", RHT_WONDER_ITEM_ZORAS_RIVER, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_WONDER_LOWER_LAND_BRIDGE_2)); + locationTable[RC_ZR_WONDER_LOWER_LAND_BRIDGE_3] = Location::WonderItem(RC_ZR_WONDER_LOWER_LAND_BRIDGE_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-142, -383), "Wonder Lower Land Bridge 3", RHT_WONDER_ITEM_ZORAS_RIVER, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_WONDER_LOWER_LAND_BRIDGE_3)); + locationTable[RC_ZR_WONDER_LOWER_LAND_BRIDGE_4] = Location::WonderItem(RC_ZR_WONDER_LOWER_LAND_BRIDGE_4, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-141, -218), "Wonder Lower Land Bridge 4", RHT_WONDER_ITEM_ZORAS_RIVER, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_WONDER_LOWER_LAND_BRIDGE_4)); + locationTable[RC_ZR_WONDER_NEAR_CUCCO_1] = Location::WonderItem(RC_ZR_WONDER_NEAR_CUCCO_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-860, -38), "Wonder Near Cucco 1", RHT_WONDER_ITEM_ZORAS_RIVER, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_WONDER_NEAR_CUCCO_1)); + locationTable[RC_ZR_WONDER_NEAR_CUCCO_2] = Location::WonderItem(RC_ZR_WONDER_NEAR_CUCCO_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1063, -4), "Wonder Near Cucco 2", RHT_WONDER_ITEM_ZORAS_RIVER, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_WONDER_NEAR_CUCCO_2)); + locationTable[RC_ZR_WONDER_NEAR_CUCCO_3] = Location::WonderItem(RC_ZR_WONDER_NEAR_CUCCO_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1296, 242), "Wonder Near Cucco 3", RHT_WONDER_ITEM_ZORAS_RIVER, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_WONDER_NEAR_CUCCO_3)); + locationTable[RC_ZR_WONDER_LOWER_RIVER_1] = Location::WonderItem(RC_ZR_WONDER_LOWER_RIVER_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1287, 457), "Wonder Lower River 1", RHT_WONDER_ITEM_ZORAS_RIVER, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_WONDER_LOWER_RIVER_1)); + locationTable[RC_ZR_WONDER_LOWER_RIVER_2] = Location::WonderItem(RC_ZR_WONDER_LOWER_RIVER_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1288, 668), "Wonder Lower River 2", RHT_WONDER_ITEM_ZORAS_RIVER, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_WONDER_LOWER_RIVER_2)); + locationTable[RC_ZR_WONDER_LOWER_RIVER_3] = Location::WonderItem(RC_ZR_WONDER_LOWER_RIVER_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1290, 862), "Wonder Lower River 3", RHT_WONDER_ITEM_ZORAS_RIVER, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_WONDER_LOWER_RIVER_3)); + locationTable[RC_ZR_WONDER_LOWER_RIVER_4] = Location::WonderItem(RC_ZR_WONDER_LOWER_RIVER_4, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1288, 1052), "Wonder Lower River 4", RHT_WONDER_ITEM_ZORAS_RIVER, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_WONDER_LOWER_RIVER_4)); + locationTable[RC_ZF_WONDER_ROCK] = Location::WonderItem(RC_ZF_WONDER_ROCK, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-667, 1053), "Wonder Scarecrow Rock", RHT_WONDER_ITEM_ZORAS_FOUNTAIN, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_WONDER_ROCK)); + locationTable[RC_GV_WONDER_LOWER_WATERFALL] = Location::WonderItem(RC_GV_WONDER_LOWER_WATERFALL, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-45, -298), "Wonder Lower Waterfall", RHT_WONDER_ITEM_GERUDO_VALLEY, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_WONDER_LOWER_WATERFALL)); + locationTable[RC_GV_WONDER_UPPER_WATERFALL] = Location::WonderItem(RC_GV_WONDER_UPPER_WATERFALL, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(47, -2620), "Wonder Upper Waterfall", RHT_WONDER_ITEM_GERUDO_VALLEY, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_WONDER_UPPER_WATERFALL)); + locationTable[RC_GF_WONDER_ENTRANCE_SIGN] = Location::WonderItem(RC_GF_WONDER_ENTRANCE_SIGN, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(-814, -810), "Wonder Entrance Sign", RHT_WONDER_ITEM_GERUDOS_FORTRESS, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_WONDER_ENTRANCE_SIGN)); + locationTable[RC_GF_WONDER_ARCHERY_SIGN] = Location::WonderItem(RC_GF_WONDER_ARCHERY_SIGN, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(1094, -412), "Wonder Archery Sign", RHT_WONDER_ITEM_GERUDOS_FORTRESS, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_WONDER_ARCHERY_SIGN)); + locationTable[RC_TH_WONDER_1_TORCH_1] = Location::WonderItem(RC_TH_WONDER_1_TORCH_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-305, -2633), "Wonder 1 Torch Outer Exit Skull", RHT_WONDER_ITEM_THIEVES_HIDEOUT, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_WONDER_1_TORCH_1)); + locationTable[RC_TH_WONDER_1_TORCH_2] = Location::WonderItem(RC_TH_WONDER_1_TORCH_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-307, -2200), "Wonder 1 Torch Inner Exit Skull", RHT_WONDER_ITEM_THIEVES_HIDEOUT, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_WONDER_1_TORCH_2)); + locationTable[RC_TH_WONDER_STEEP_SLOPE_LOWER_EXIT] = Location::WonderItem(RC_TH_WONDER_STEEP_SLOPE_LOWER_EXIT, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(71, -928), "Wonder Steep Slope Lower Exit Skull", RHT_WONDER_ITEM_THIEVES_HIDEOUT, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_WONDER_STEEP_SLOPE_LOWER_EXIT)); + locationTable[RC_TH_WONDER_STEEP_SLOPE_UPPER_EXIT] = Location::WonderItem(RC_TH_WONDER_STEEP_SLOPE_UPPER_EXIT, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(77, -1345), "Wonder Steep Slope Upper Exit Skull", RHT_WONDER_ITEM_THIEVES_HIDEOUT, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_WONDER_STEEP_SLOPE_UPPER_EXIT)); + locationTable[RC_TH_WONDER_DOUBLE_JAIL_LOWER_EXIT] = Location::WonderItem(RC_TH_WONDER_DOUBLE_JAIL_LOWER_EXIT, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-65, 173), "Wonder Double Jail Lower Exit Skull", RHT_WONDER_ITEM_THIEVES_HIDEOUT, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_WONDER_DOUBLE_JAIL_LOWER_EXIT)); + locationTable[RC_TH_WONDER_DOUBLE_JAIL_UPPER_EXIT] = Location::WonderItem(RC_TH_WONDER_DOUBLE_JAIL_UPPER_EXIT, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(709, 180), "Wonder Double Jail Upper Exit Skull", RHT_WONDER_ITEM_THIEVES_HIDEOUT, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_WONDER_DOUBLE_JAIL_UPPER_EXIT)); + locationTable[RC_TH_WONDER_KITCHEN_SKULL] = Location::WonderItem(RC_TH_WONDER_KITCHEN_SKULL, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1204, -610), "Wonder Kitchen Skull", RHT_WONDER_ITEM_THIEVES_HIDEOUT, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_WONDER_KITCHEN_SKULL)); + locationTable[RC_TH_WONDER_KITCHEN_SOUP] = Location::WonderItem(RC_TH_WONDER_KITCHEN_SOUP, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1940, -585), "Wonder Kitchen Soup", RHT_WONDER_ITEM_THIEVES_HIDEOUT, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_WONDER_KITCHEN_SOUP)); + locationTable[RC_TH_WONDER_DEAD_END_SKULL_ENTRANCE] = Location::WonderItem(RC_TH_WONDER_DEAD_END_SKULL_ENTRANCE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1666, -2323), "Wonder Dead End Entrance Skull", RHT_WONDER_ITEM_THIEVES_HIDEOUT, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_WONDER_DEAD_END_SKULL_ENTRANCE)); + locationTable[RC_TH_WONDER_DEAD_END_SKULL_NEAR_JAIL] = Location::WonderItem(RC_TH_WONDER_DEAD_END_SKULL_NEAR_JAIL, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1378, -2829), "Wonder Dead End Near Jail Skull", RHT_WONDER_ITEM_THIEVES_HIDEOUT, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_WONDER_DEAD_END_SKULL_NEAR_JAIL)); + locationTable[RC_TH_WONDER_BREAK_ROOM_BOTTOM_SKULL] = Location::WonderItem(RC_TH_WONDER_BREAK_ROOM_BOTTOM_SKULL, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(820, -3511), "Wonder Break Room Bottom Skull", RHT_WONDER_ITEM_THIEVES_HIDEOUT, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_WONDER_BREAK_ROOM_BOTTOM_SKULL)); + locationTable[RC_TH_WONDER_BREAK_ROOM_TOP_SKULL] = Location::WonderItem(RC_TH_WONDER_BREAK_ROOM_TOP_SKULL, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(38, -3509), "Wonder Break Room Top Skull", RHT_WONDER_ITEM_THIEVES_HIDEOUT, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_WONDER_BREAK_ROOM_TOP_SKULL)); + locationTable[RC_COLOSSUS_WONDER_OASIS_TREE_1] = Location::WonderItem(RC_COLOSSUS_WONDER_OASIS_TREE_1, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS(1161, 2383), "Wonder Oasis Tree 1", RHT_WONDER_ITEM_DESERT_COLOSSUS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_WONDER_OASIS_TREE_1)); + locationTable[RC_COLOSSUS_WONDER_OASIS_TREE_2] = Location::WonderItem(RC_COLOSSUS_WONDER_OASIS_TREE_2, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS(1113, 2581), "Wonder Oasis Tree 2", RHT_WONDER_ITEM_DESERT_COLOSSUS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_WONDER_OASIS_TREE_2)); + locationTable[RC_COLOSSUS_WONDER_OASIS_CHILD_TREE] = Location::WonderItem(RC_COLOSSUS_WONDER_OASIS_CHILD_TREE, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS(456, 2325), "Wonder Oasis Child Tree", RHT_WONDER_ITEM_DESERT_COLOSSUS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_WONDER_OASIS_CHILD_TREE)); + locationTable[RC_COLOSSUS_WONDER_GF_TREE_1] = Location::WonderItem(RC_COLOSSUS_WONDER_GF_TREE_1, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS(2406, -1407), "Wonder Great Fairy Tree 1", RHT_WONDER_ITEM_DESERT_COLOSSUS, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_WONDER_GF_TREE_1)); + locationTable[RC_COLOSSUS_WONDER_GF_TREE_2] = Location::WonderItem(RC_COLOSSUS_WONDER_GF_TREE_2, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS(2098, -1402), "Wonder Great Fairy Tree 2", RHT_WONDER_ITEM_DESERT_COLOSSUS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_WONDER_GF_TREE_2)); + // Dungeon Wonder Items + locationTable[RC_SHADOW_TEMPLE_WONDER_THREE_POTS] = Location::WonderItem(RC_SHADOW_TEMPLE_WONDER_THREE_POTS, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(12, 1), "Wonder Three Pots Sign", RHT_WONDER_ITEM_SHADOW_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WONDER_THREE_POTS)); + locationTable[RC_GERUDO_TRAINING_GROUND_WONDER_BEAMOS_ROOM] = Location::WonderItem(RC_GERUDO_TRAINING_GROUND_WONDER_BEAMOS_ROOM, RCQUEST_VANILLA, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(7, 12), "Wonder Beamos Sign", RHT_WONDER_ITEM_GERUDO_TRAINING_GROUND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_WONDER_BEAMOS_ROOM)); + locationTable[RC_GERUDO_TRAINING_GROUND_WONDER_EYE_STATUE_ROOM] = Location::WonderItem(RC_GERUDO_TRAINING_GROUND_WONDER_EYE_STATUE_ROOM, RCQUEST_VANILLA, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(4, 2), "Wonder Top of Eye Statue", RHT_WONDER_ITEM_GERUDO_TRAINING_GROUND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_WONDER_EYE_STATUE_ROOM)); + locationTable[RC_GERUDO_TRAINING_GROUND_WONDER_TORCH_SLUGS_ROOM] = Location::WonderItem(RC_GERUDO_TRAINING_GROUND_WONDER_TORCH_SLUGS_ROOM, RCQUEST_VANILLA, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(5, 16), "Wonder Torch Slug Sign", RHT_WONDER_ITEM_GERUDO_TRAINING_GROUND, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_WONDER_TORCH_SLUGS_ROOM)); + // MQ Dungeon Wonder Items + locationTable[RC_DEKU_TREE_MQ_WONDER_BASEMENT_GRAVE_1] = Location::WonderItem(RC_DEKU_TREE_MQ_WONDER_BASEMENT_GRAVE_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(7, 12), "MQ Wonder Basement Grave 1", RHT_WONDER_ITEM_DEKU_TREE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_WONDER_BASEMENT_GRAVE_1)); + locationTable[RC_DEKU_TREE_MQ_WONDER_BASEMENT_GRAVE_2] = Location::WonderItem(RC_DEKU_TREE_MQ_WONDER_BASEMENT_GRAVE_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(7, 11), "MQ Wonder Basement Grave 2", RHT_WONDER_ITEM_DEKU_TREE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_WONDER_BASEMENT_GRAVE_2)); + locationTable[RC_DEKU_TREE_MQ_WONDER_BASEMENT_GRAVE_3] = Location::WonderItem(RC_DEKU_TREE_MQ_WONDER_BASEMENT_GRAVE_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(7, 10), "MQ Wonder Basement Grave 3", RHT_WONDER_ITEM_DEKU_TREE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_WONDER_BASEMENT_GRAVE_3)); + locationTable[RC_DEKU_TREE_MQ_WONDER_BASEMENT_GRAVE_4] = Location::WonderItem(RC_DEKU_TREE_MQ_WONDER_BASEMENT_GRAVE_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(7, 9), "MQ Wonder Basement Grave 4", RHT_WONDER_ITEM_DEKU_TREE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_WONDER_BASEMENT_GRAVE_4)); + locationTable[RC_JABU_JABUS_BELLY_MQ_WONDER_ENTRANCE_LEFT_COW] = Location::WonderItem(RC_JABU_JABUS_BELLY_MQ_WONDER_ENTRANCE_LEFT_COW, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(0, 13), "MQ Wonder Entrance Cow Left", RHT_WONDER_ITEM_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_ENTRANCE_LEFT_COW)); + locationTable[RC_JABU_JABUS_BELLY_MQ_WONDER_ENTRANCE_RIGHT_COW] = Location::WonderItem(RC_JABU_JABUS_BELLY_MQ_WONDER_ENTRANCE_RIGHT_COW, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(0, 14), "MQ Wonder Entrance Cow Right", RHT_WONDER_ITEM_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_ENTRANCE_RIGHT_COW)); + locationTable[RC_JABU_JABUS_BELLY_MQ_WONDER_ELEVATOR_COW] = Location::WonderItem(RC_JABU_JABUS_BELLY_MQ_WONDER_ELEVATOR_COW, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(1, 19), "MQ Wonder Elevator Cow", RHT_WONDER_ITEM_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_ELEVATOR_COW)); + locationTable[RC_JABU_JABUS_BELLY_MQ_HOLES_COW] = Location::WonderItem(RC_JABU_JABUS_BELLY_MQ_HOLES_COW, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(2, 13), "MQ Wonder Holes Cow", RHT_WONDER_ITEM_JABU_JABU, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_HOLES_COW)); + locationTable[RC_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_RIGHT_COW_1] = Location::WonderItem(RC_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_RIGHT_COW_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(3, 15), "MQ Wonder Basement Right Cow 1", RHT_WONDER_ITEM_JABU_JABU, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_RIGHT_COW_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_RIGHT_COW_2] = Location::WonderItem(RC_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_RIGHT_COW_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(3, 13), "MQ Wonder Basement Right Cow 2", RHT_WONDER_ITEM_JABU_JABU, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_RIGHT_COW_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_RIGHT_COW_3] = Location::WonderItem(RC_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_RIGHT_COW_3, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(3, 14), "MQ Wonder Basement Right Cow 3", RHT_WONDER_ITEM_JABU_JABU, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_RIGHT_COW_3)); + locationTable[RC_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_LEFT_COW_1] = Location::WonderItem(RC_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_LEFT_COW_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(3, 18), "MQ Wonder Basement Left Cow 1", RHT_WONDER_ITEM_JABU_JABU, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_LEFT_COW_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_LEFT_COW_2] = Location::WonderItem(RC_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_LEFT_COW_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(3, 16), "MQ Wonder Basement Left Cow 2", RHT_WONDER_ITEM_JABU_JABU, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_LEFT_COW_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_LEFT_COW_3] = Location::WonderItem(RC_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_LEFT_COW_3, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(3, 17), "MQ Wonder Basement Left Cow 3", RHT_WONDER_ITEM_JABU_JABU, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_LEFT_COW_3)); + locationTable[RC_JABU_JABUS_BELLY_MQ_WONDER_AFTER_BIG_OCTO] = Location::WonderItem(RC_JABU_JABUS_BELLY_MQ_WONDER_AFTER_BIG_OCTO, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(6, 7), "MQ Wonder After Big Octo Cow", RHT_WONDER_ITEM_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_AFTER_BIG_OCTO)); + locationTable[RC_JABU_JABUS_BELLY_MQ_WONDER_JIGGLIES_COW] = Location::WonderItem(RC_JABU_JABUS_BELLY_MQ_WONDER_JIGGLIES_COW, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(4, 13), "MQ Wonder Jigglies Cow", RHT_WONDER_ITEM_JABU_JABU, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_JIGGLIES_COW)); + locationTable[RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_RIGHT_1] = Location::WonderItem(RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_RIGHT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(11, 21), "MQ Wonder Like Like Right Cow 1", RHT_WONDER_ITEM_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_RIGHT_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_RIGHT_2] = Location::WonderItem(RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_RIGHT_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(11, 20), "MQ Wonder Like Like Right Cow 2", RHT_WONDER_ITEM_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_RIGHT_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_RIGHT_3] = Location::WonderItem(RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_RIGHT_3, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(11, 19), "MQ Wonder Like Like Right Cow 3", RHT_WONDER_ITEM_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_RIGHT_3)); + locationTable[RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_LEFT_1] = Location::WonderItem(RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_LEFT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(11, 24), "MQ Wonder Like Like Left Cow 1", RHT_WONDER_ITEM_JABU_JABU, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_LEFT_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_LEFT_2] = Location::WonderItem(RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_LEFT_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(11, 23), "MQ Wonder Like Like Left Cow 2", RHT_WONDER_ITEM_JABU_JABU, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_LEFT_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_LEFT_3] = Location::WonderItem(RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_LEFT_3, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(11, 22), "MQ Wonder Like Like Left Cow 3", RHT_WONDER_ITEM_JABU_JABU, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_LEFT_3)); + locationTable[RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_EXPLOSION_1] = Location::WonderItem(RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_EXPLOSION_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(11, 29), "MQ Wonder Like Like Grass 1", RHT_WONDER_ITEM_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_EXPLOSION_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_EXPLOSION_2] = Location::WonderItem(RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_EXPLOSION_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(11, 28), "MQ Wonder Like Like Grass 2", RHT_WONDER_ITEM_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_EXPLOSION_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_EXPLOSION_3] = Location::WonderItem(RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_EXPLOSION_3, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(11, 27), "MQ Wonder Like Like Grass 3", RHT_WONDER_ITEM_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_EXPLOSION_3)); + locationTable[RC_JABU_JABUS_BELLY_MQ_WONDER_BEFORE_BOSS_LEFT_COW] = Location::WonderItem(RC_JABU_JABUS_BELLY_MQ_WONDER_BEFORE_BOSS_LEFT_COW, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(5, 10), "MQ Wonder Before Boss Left Cow", RHT_WONDER_ITEM_JABU_JABU, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_BEFORE_BOSS_LEFT_COW)); + locationTable[RC_JABU_JABUS_BELLY_MQ_WONDER_BEFORE_BOSS_RIGHT_COW_1] = Location::WonderItem(RC_JABU_JABUS_BELLY_MQ_WONDER_BEFORE_BOSS_RIGHT_COW_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(5, 9), "MQ Wonder Before Boss Right Cow 1", RHT_WONDER_ITEM_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_BEFORE_BOSS_RIGHT_COW_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_WONDER_BEFORE_BOSS_RIGHT_COW_2] = Location::WonderItem(RC_JABU_JABUS_BELLY_MQ_WONDER_BEFORE_BOSS_RIGHT_COW_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(5, 11), "MQ Wonder Before Boss Right Cow 2", RHT_WONDER_ITEM_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_BEFORE_BOSS_RIGHT_COW_2)); + locationTable[RC_FIRE_TEMPLE_MQ_WONDER_SHORTCUT_ROOM_1] = Location::WonderItem(RC_FIRE_TEMPLE_MQ_WONDER_SHORTCUT_ROOM_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(4, 6), "MQ Wonder Shortcut Room 1", RHT_WONDER_ITEM_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_WONDER_SHORTCUT_ROOM_1)); + locationTable[RC_FIRE_TEMPLE_MQ_WONDER_SHORTCUT_ROOM_2] = Location::WonderItem(RC_FIRE_TEMPLE_MQ_WONDER_SHORTCUT_ROOM_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(4, 7), "MQ Wonder Shortcut Room 2", RHT_WONDER_ITEM_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_WONDER_SHORTCUT_ROOM_2)); + locationTable[RC_FIRE_TEMPLE_MQ_WONDER_SHORTCUT_ROOM_3] = Location::WonderItem(RC_FIRE_TEMPLE_MQ_WONDER_SHORTCUT_ROOM_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(4, 8), "MQ Wonder Shortcut Room 3", RHT_WONDER_ITEM_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_WONDER_SHORTCUT_ROOM_3)); + locationTable[RC_FIRE_TEMPLE_MQ_WONDER_BOSS_KEY_ROOM_HOOKSHOT] = Location::WonderItem(RC_FIRE_TEMPLE_MQ_WONDER_BOSS_KEY_ROOM_HOOKSHOT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(19, 9), "MQ Wonder Boss Key Room Hookshot", RHT_WONDER_ITEM_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_WONDER_BOSS_KEY_ROOM_HOOKSHOT)); + locationTable[RC_FIRE_TEMPLE_MQ_WONDER_BOSS_KEY_ROOM_BOW] = Location::WonderItem(RC_FIRE_TEMPLE_MQ_WONDER_BOSS_KEY_ROOM_BOW, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(19, 10), "MQ Wonder Boss Key Room Bow", RHT_WONDER_ITEM_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_WONDER_BOSS_KEY_ROOM_BOW)); + locationTable[RC_FIRE_TEMPLE_MQ_WONDER_LIZALFOS_MAZE] = Location::WonderItem(RC_FIRE_TEMPLE_MQ_WONDER_LIZALFOS_MAZE, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(5, 19), "MQ Wonder Lizalfos Maze", RHT_WONDER_ITEM_FIRE_TEMPLE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_WONDER_LIZALFOS_MAZE)); + locationTable[RC_FIRE_TEMPLE_MQ_WONDER_EAST_TOWER_LARGE_FACE_1] = Location::WonderItem(RC_FIRE_TEMPLE_MQ_WONDER_EAST_TOWER_LARGE_FACE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(7, 6), "MQ Wonder East Tower Large Face 1", RHT_WONDER_ITEM_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_WONDER_EAST_TOWER_LARGE_FACE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_WONDER_EAST_TOWER_LARGE_FACE_2] = Location::WonderItem(RC_FIRE_TEMPLE_MQ_WONDER_EAST_TOWER_LARGE_FACE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(7, 7), "MQ Wonder East Tower Large Face 2", RHT_WONDER_ITEM_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_WONDER_EAST_TOWER_LARGE_FACE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_WONDER_EAST_TOWER_SMALL_FACE_1] = Location::WonderItem(RC_FIRE_TEMPLE_MQ_WONDER_EAST_TOWER_SMALL_FACE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(7, 4), "MQ Wonder East Tower Small Face 1", RHT_WONDER_ITEM_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_WONDER_EAST_TOWER_SMALL_FACE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_WONDER_EAST_TOWER_SMALL_FACE_2] = Location::WonderItem(RC_FIRE_TEMPLE_MQ_WONDER_EAST_TOWER_SMALL_FACE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(7, 5), "MQ Wonder East Tower Small Face 2", RHT_WONDER_ITEM_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_WONDER_EAST_TOWER_SMALL_FACE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_WONDER_TORCH_ROOM] = Location::WonderItem(RC_FIRE_TEMPLE_MQ_WONDER_TORCH_ROOM, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(16, 0), "MQ Wonder Torch Room", RHT_WONDER_ITEM_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_WONDER_TORCH_ROOM)); + locationTable[RC_FIRE_TEMPLE_MQ_WONDER_FIRE_MAZE] = Location::WonderItem(RC_FIRE_TEMPLE_MQ_WONDER_FIRE_MAZE, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(10, 42), "MQ Wonder Fire Maze", RHT_WONDER_ITEM_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_WONDER_FIRE_MAZE)); + locationTable[RC_FIRE_TEMPLE_MQ_WONDER_AFTER_FLARE_DANCER] = Location::WonderItem(RC_FIRE_TEMPLE_MQ_WONDER_AFTER_FLARE_DANCER, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(12, 0), "MQ Wonder After Flare Dancer", RHT_WONDER_ITEM_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_WONDER_AFTER_FLARE_DANCER)); + locationTable[RC_FIRE_TEMPLE_MQ_WONDER_STAIRCASE] = Location::WonderItem(RC_FIRE_TEMPLE_MQ_WONDER_STAIRCASE, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(14, 1), "MQ Wonder Hammer Staircase", RHT_WONDER_ITEM_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_WONDER_STAIRCASE)); + locationTable[RC_WATER_TEMPLE_MQ_WONDER_LIZALFOS_ROOM] = Location::WonderItem(RC_WATER_TEMPLE_MQ_WONDER_LIZALFOS_ROOM, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(19, 5), "MQ Wonder Lizalfos Room", RHT_WONDER_ITEM_WATER_TEMPLE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WONDER_LIZALFOS_ROOM)); + locationTable[RC_WATER_TEMPLE_MQ_WONDER_LONGSHOT_ROOM] = Location::WonderItem(RC_WATER_TEMPLE_MQ_WONDER_LONGSHOT_ROOM, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(17, 7), "MQ Wonder Longshot Room", RHT_WONDER_ITEM_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WONDER_LONGSHOT_ROOM)); + locationTable[RC_WATER_TEMPLE_MQ_WONDER_STALFOS_ROOM] = Location::WonderItem(RC_WATER_TEMPLE_MQ_WONDER_STALFOS_ROOM, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(18, 3), "MQ Wonder Stalfos Room", RHT_WONDER_ITEM_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WONDER_STALFOS_ROOM)); + locationTable[RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_RIGHT_1] = Location::WonderItem(RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_RIGHT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(5, 4), "MQ Wonder Hookshot Staircase Right 1", RHT_WONDER_ITEM_WATER_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_RIGHT_1)); + locationTable[RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_RIGHT_2] = Location::WonderItem(RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_RIGHT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(5, 3), "MQ Wonder Hookshot Staircase Right 2", RHT_WONDER_ITEM_WATER_TEMPLE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_RIGHT_2)); + locationTable[RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_RIGHT_3] = Location::WonderItem(RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_RIGHT_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(5, 2), "MQ Wonder Hookshot Staircase Right 3", RHT_WONDER_ITEM_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_RIGHT_3)); + locationTable[RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_LEFT_1] = Location::WonderItem(RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_LEFT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(5, 11), "MQ Wonder Hookshot Staircase Left 1", RHT_WONDER_ITEM_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_LEFT_1)); + locationTable[RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_LEFT_2] = Location::WonderItem(RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_LEFT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(5, 10), "MQ Wonder Hookshot Staircase Left 2", RHT_WONDER_ITEM_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_LEFT_2)); + locationTable[RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_LEFT_3] = Location::WonderItem(RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_LEFT_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(5, 9), "MQ Wonder Hookshot Staircase Left 3", RHT_WONDER_ITEM_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_LEFT_3)); + locationTable[RC_WATER_TEMPLE_MQ_WONDER_AFTER_DARK_LINK] = Location::WonderItem(RC_WATER_TEMPLE_MQ_WONDER_AFTER_DARK_LINK, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(7, 0), "MQ Wonder After Dark Link", RHT_WONDER_ITEM_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WONDER_AFTER_DARK_LINK)); + locationTable[RC_WATER_TEMPLE_MQ_WONDER_DRAGON_ROOM_LEFT_EYE] = Location::WonderItem(RC_WATER_TEMPLE_MQ_WONDER_DRAGON_ROOM_LEFT_EYE, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(8, 4), "MQ Wonder Dragon Room Left Eye", RHT_WONDER_ITEM_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WONDER_DRAGON_ROOM_LEFT_EYE)); + locationTable[RC_WATER_TEMPLE_MQ_WONDER_DRAGON_ROOM_RIGHT_EYE] = Location::WonderItem(RC_WATER_TEMPLE_MQ_WONDER_DRAGON_ROOM_RIGHT_EYE, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(8, 6), "MQ Wonder Dragon Room Right Eye", RHT_WONDER_ITEM_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WONDER_DRAGON_ROOM_RIGHT_EYE)); + locationTable[RC_WATER_TEMPLE_MQ_WONDER_DRAGON_ROOM_PORTRAIT] = Location::WonderItem(RC_WATER_TEMPLE_MQ_WONDER_DRAGON_ROOM_PORTRAIT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(8, 5), "MQ Wonder Dragon Room Portrait", RHT_WONDER_ITEM_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WONDER_DRAGON_ROOM_PORTRAIT)); + locationTable[RC_WATER_TEMPLE_MQ_WONDER_TRIPLE_TORCHES] = Location::WonderItem(RC_WATER_TEMPLE_MQ_WONDER_TRIPLE_TORCHES, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(3, 3), "MQ Wonder Triple Torches Room", RHT_WONDER_ITEM_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WONDER_TRIPLE_TORCHES)); + locationTable[RC_WATER_TEMPLE_MQ_WONDER_WATER_SPROUTS_1] = Location::WonderItem(RC_WATER_TEMPLE_MQ_WONDER_WATER_SPROUTS_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(15, 0), "MQ Wonder Water Sprouts 1", RHT_WONDER_ITEM_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WONDER_WATER_SPROUTS_1)); + locationTable[RC_WATER_TEMPLE_MQ_WONDER_WATER_SPROUTS_2] = Location::WonderItem(RC_WATER_TEMPLE_MQ_WONDER_WATER_SPROUTS_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(15, 1), "MQ Wonder Water Sprouts 2", RHT_WONDER_ITEM_WATER_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WONDER_WATER_SPROUTS_2)); + locationTable[RC_WATER_TEMPLE_MQ_WONDER_FREESTANDING_ROOM] = Location::WonderItem(RC_WATER_TEMPLE_MQ_WONDER_FREESTANDING_ROOM, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(16, 0), "MQ Wonder Freestanding Room", RHT_WONDER_ITEM_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WONDER_FREESTANDING_ROOM)); + locationTable[RC_WATER_TEMPLE_MQ_WONDER_BEFORE_BOSS_1] = Location::WonderItem(RC_WATER_TEMPLE_MQ_WONDER_BEFORE_BOSS_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(11, 1), "MQ Wonder Before Boss 1", RHT_WONDER_ITEM_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WONDER_BEFORE_BOSS_1)); + locationTable[RC_WATER_TEMPLE_MQ_WONDER_BEFORE_BOSS_2] = Location::WonderItem(RC_WATER_TEMPLE_MQ_WONDER_BEFORE_BOSS_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(11, 0), "MQ Wonder Before Boss 2", RHT_WONDER_ITEM_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WONDER_BEFORE_BOSS_2)); + locationTable[RC_WATER_TEMPLE_MQ_WONDER_UNDER_PILLAR_ROOM] = Location::WonderItem(RC_WATER_TEMPLE_MQ_WONDER_UNDER_PILLAR_ROOM, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(2, 24), "MQ Wonder Under Pillar Room", RHT_WONDER_ITEM_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WONDER_UNDER_PILLAR_ROOM)); + locationTable[RC_WATER_TEMPLE_MQ_WONDER_LIZALFOS_HALLWAY] = Location::WonderItem(RC_WATER_TEMPLE_MQ_WONDER_LIZALFOS_HALLWAY, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(20, 2), "MQ Wonder Lizalfos Hallway", RHT_WONDER_ITEM_WATER_TEMPLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WONDER_LIZALFOS_HALLWAY)); + locationTable[RC_WATER_TEMPLE_MQ_WONDER_GS_STORAGE_ROOM] = Location::WonderItem(RC_WATER_TEMPLE_MQ_WONDER_GS_STORAGE_ROOM, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(10, 1), "MQ Wonder GS Storage Room", RHT_WONDER_ITEM_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WONDER_GS_STORAGE_ROOM)); + locationTable[RC_SPIRIT_TEMPLE_MQ_WONDER_CHEST_HAMMER] = Location::WonderItem(RC_SPIRIT_TEMPLE_MQ_WONDER_CHEST_HAMMER, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(18, 8), "MQ Wonder Chest Hammer", RHT_WONDER_ITEM_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_WONDER_CHEST_HAMMER)); + locationTable[RC_SPIRIT_TEMPLE_MQ_WONDER_CHEST_SLASH] = Location::WonderItem(RC_SPIRIT_TEMPLE_MQ_WONDER_CHEST_SLASH, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(18, 9), "MQ Wonder Chest Sword", RHT_WONDER_ITEM_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_WONDER_CHEST_SLASH)); + locationTable[RC_SHADOW_TEMPLE_MQ_WONDER_THREE_POTS] = Location::WonderItem(RC_SHADOW_TEMPLE_MQ_WONDER_THREE_POTS, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(12, 1), "MQ Wonder Three Pots Sign", RHT_WONDER_ITEM_SHADOW_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_WONDER_THREE_POTS)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_LEFT_1] = Location::WonderItem(RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_LEFT_1, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0, 5), "MQ Wonder Main Room West Sign 1", RHT_BOTTOM_OF_THE_WELL_WONDER_ITEM, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_LEFT_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_LEFT_2] = Location::WonderItem(RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_LEFT_2, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0, 6), "MQ Wonder Main Room West Sign 2", RHT_BOTTOM_OF_THE_WELL_WONDER_ITEM, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_LEFT_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_LEFT_3] = Location::WonderItem(RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_LEFT_3, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0, 8), "MQ Wonder Main Room West Sign 3", RHT_BOTTOM_OF_THE_WELL_WONDER_ITEM, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_LEFT_3)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_LEFT_4] = Location::WonderItem(RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_LEFT_4, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0, 10), "MQ Wonder Main Room West Sign 4", RHT_BOTTOM_OF_THE_WELL_WONDER_ITEM, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_LEFT_4)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_RIGHT_1] = Location::WonderItem(RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_RIGHT_1, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0, 12), "MQ Wonder Main Room East Sign 1", RHT_BOTTOM_OF_THE_WELL_WONDER_ITEM, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_RIGHT_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_RIGHT_2] = Location::WonderItem(RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_RIGHT_2, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0, 11), "MQ Wonder Main Room East Sign 2", RHT_BOTTOM_OF_THE_WELL_WONDER_ITEM, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_RIGHT_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_RIGHT_3] = Location::WonderItem(RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_RIGHT_3, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0, 9), "MQ Wonder Main Room East Sign 3", RHT_BOTTOM_OF_THE_WELL_WONDER_ITEM, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_RIGHT_3)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_RIGHT_4] = Location::WonderItem(RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_RIGHT_4, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0, 7), "MQ Wonder Main Room East Sign 4", RHT_BOTTOM_OF_THE_WELL_WONDER_ITEM, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_RIGHT_4)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_WONDER_SIDE_ROOM_1] = Location::WonderItem(RC_BOTTOM_OF_THE_WELL_MQ_WONDER_SIDE_ROOM_1, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(5, 0), "MQ Wonder East Room Sign 1", RHT_BOTTOM_OF_THE_WELL_WONDER_ITEM, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_WONDER_SIDE_ROOM_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_WONDER_SIDE_ROOM_2] = Location::WonderItem(RC_BOTTOM_OF_THE_WELL_MQ_WONDER_SIDE_ROOM_2, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(5, 1), "MQ Wonder East Room Sign 2", RHT_BOTTOM_OF_THE_WELL_WONDER_ITEM, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_WONDER_SIDE_ROOM_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_WONDER_SIDE_ROOM_3] = Location::WonderItem(RC_BOTTOM_OF_THE_WELL_MQ_WONDER_SIDE_ROOM_3, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(5, 2), "MQ Wonder East Room Sign 3", RHT_BOTTOM_OF_THE_WELL_WONDER_ITEM, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_WONDER_SIDE_ROOM_3)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_WONDER_SIDE_ROOM_4] = Location::WonderItem(RC_BOTTOM_OF_THE_WELL_MQ_WONDER_SIDE_ROOM_4, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(5, 3), "MQ Wonder East Room Sign 4", RHT_BOTTOM_OF_THE_WELL_WONDER_ITEM, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_WONDER_SIDE_ROOM_4)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_WONDER_DINOLFOS_ROOM] = Location::WonderItem(RC_GERUDO_TRAINING_GROUND_MQ_WONDER_DINOLFOS_ROOM, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(7, 9), "MQ Wonder Dinolfos Sign", RHT_WONDER_ITEM_GERUDO_TRAINING_GROUND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_WONDER_DINOLFOS_ROOM)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_WONDER_EYE_STATUE] = Location::WonderItem(RC_GERUDO_TRAINING_GROUND_MQ_WONDER_EYE_STATUE, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(4, 4), "MQ Wonder Top of Eye Statue", RHT_WONDER_ITEM_GERUDO_TRAINING_GROUND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_WONDER_EYE_STATUE)); + locationTable[RC_GANONS_CASTLE_MQ_WONDER_SHADOW_TRIAL] = Location::WonderItem(RC_GANONS_CASTLE_MQ_WONDER_SHADOW_TRIAL, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(12, 12), "MQ Wonder Shadow Trial Bombflower", RHT_GANONS_CASTLE_WONDER_ITEM, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WONDER_SHADOW_TRIAL)); + + // clang-format on +} + +static RegisterShipInitFunc registerShuffleWonderItems(RegisterShuffleWonderItems, { "IS_RANDO" }); +static RegisterShipInitFunc registerWonderItemLocations(Rando::StaticData::RegisterWonderItemLocations); \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/entrance.cpp b/soh/soh/Enhancements/randomizer/entrance.cpp index 9af7ddba7..06a720256 100644 --- a/soh/soh/Enhancements/randomizer/entrance.cpp +++ b/soh/soh/Enhancements/randomizer/entrance.cpp @@ -397,8 +397,8 @@ void SetAllEntrancesData() { { EntranceType::ThievesHideout, RR_TH_KITCHEN_OPPOSITE_CORRIDOR, RR_GF_NEAR_GS, ENTR_GERUDOS_FORTRESS_10 } }, { { EntranceType::ThievesHideout, RR_GF_BELOW_CHEST, RR_TH_BREAK_ROOM, ENTR_THIEVES_HIDEOUT_10 }, { EntranceType::ThievesHideout, RR_TH_BREAK_ROOM, RR_GF_BELOW_CHEST, ENTR_GERUDOS_FORTRESS_11 } }, - { { EntranceType::ThievesHideout, RR_GF_ABOVE_JAIL, RR_TH_BREAK_ROOM_CORRIDOR, ENTR_THIEVES_HIDEOUT_11 }, - { EntranceType::ThievesHideout, RR_TH_BREAK_ROOM_CORRIDOR, RR_GF_ABOVE_JAIL, ENTR_GERUDOS_FORTRESS_12 } }, + { { EntranceType::ThievesHideout, RR_GF_ABOVE_JAIL, RR_TH_BREAK_ROOM_UPPER_CORRIDOR, ENTR_THIEVES_HIDEOUT_11 }, + { EntranceType::ThievesHideout, RR_TH_BREAK_ROOM_UPPER_CORRIDOR, RR_GF_ABOVE_JAIL, ENTR_GERUDOS_FORTRESS_12 } }, { { EntranceType::ThievesHideout, RR_GF_BELOW_GS, RR_TH_DEAD_END_CELL, ENTR_THIEVES_HIDEOUT_12 }, { EntranceType::ThievesHideout, RR_TH_DEAD_END_CELL, RR_GF_BELOW_GS, ENTR_GERUDOS_FORTRESS_13 } }, diff --git a/soh/soh/Enhancements/randomizer/location.cpp b/soh/soh/Enhancements/randomizer/location.cpp index fc99508b4..59c001495 100644 --- a/soh/soh/Enhancements/randomizer/location.cpp +++ b/soh/soh/Enhancements/randomizer/location.cpp @@ -590,6 +590,15 @@ Rando::Location Rando::Location::Bush(RandomizerCheck rc, RandomizerCheckQuest q false, collectionCheck }; } +Rando::Location Rando::Location::WonderItem(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + SceneID scene_, int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck) { + return { rc, quest_, RCTYPE_WONDER_ITEM, area_, ACTOR_EN_WONDER_ITEM, + scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, + false, collectionCheck }; +} + Rando::Location Rando::Location::HintStone(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, int32_t actorParams_, std::string&& shortName_) { return { rc, quest_, RCTYPE_GOSSIP_STONE, area_, ACTOR_EN_GS, diff --git a/soh/soh/Enhancements/randomizer/location.h b/soh/soh/Enhancements/randomizer/location.h index 7e731a283..15bf0ce53 100644 --- a/soh/soh/Enhancements/randomizer/location.h +++ b/soh/soh/Enhancements/randomizer/location.h @@ -261,6 +261,11 @@ class Location { int32_t actorParams_, std::string&& shortName_, RandomizerHintTextKey hintKey, ActorID actorId_, SpoilerCollectionCheck collectionCheck); + static Location WonderItem(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + SceneID scene_, int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck); + static Location OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, std::string&& shortName_, std::string&& spoilerName_); diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp index 212ac4abf..7fe50d232 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp @@ -280,10 +280,18 @@ void RegionTable_Init_BottomOfTheWell() { //Instead of blowing up the boulder, you can aim through the lower left side with sling(either age) or as child with bow //Not even bow extension seems to get adult's bow to work //this would be a trick - LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT, (AnyAgeTime([]{return logic->BlastOrSmash();}) && logic->CanHitEyeTargets()) || - (ctx->GetTrickOption(RT_BOULDER_COLLISION) && logic->IsChild ? logic->CanHitEyeTargets() : logic->CanUse(RG_FAIRY_SLINGSHOT))), - LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, logic->HasExplosives()), - LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, logic->HasExplosives()), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT, (AnyAgeTime([]{return logic->BlastOrSmash();}) && logic->CanHitEyeTargets()) || + (ctx->GetTrickOption(RT_BOULDER_COLLISION) && logic->IsChild ? logic->CanHitEyeTargets() : logic->CanUse(RG_FAIRY_SLINGSHOT))), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, logic->HasExplosives()), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, logic->HasExplosives()), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_LEFT_1, logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_LEFT_2, logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_LEFT_3, logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_LEFT_4, logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_RIGHT_1, logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_RIGHT_2, logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_RIGHT_3, logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_RIGHT_4, logic->CanUse(RG_FAIRY_SLINGSHOT)), }, { //Exits ENTRANCE(RR_BOTW_ENTRYWAY, logic->CanUse(RG_CRAWL) && (logic->HasItem(RG_CLIMB) || logic->CanUse(RG_HOOKSHOT))), @@ -321,6 +329,10 @@ void RegionTable_Init_BottomOfTheWell() { LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_1, logic->CanBreakPots()), LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_2, logic->CanBreakPots()), LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_3, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_WONDER_SIDE_ROOM_1, logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_WONDER_SIDE_ROOM_2, logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_WONDER_SIDE_ROOM_3, logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_WONDER_SIDE_ROOM_4, logic->CanUse(RG_FAIRY_SLINGSHOT)), }, { //Exits ENTRANCE(RR_BOTW_MQ_MIDDLE, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp index dfda23719..d27ac631b 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp @@ -421,6 +421,10 @@ void RegionTable_Init_DekuTree() { LOCATION(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3, logic->CanCutShrubs()), LOCATION(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4, logic->CanCutShrubs()), LOCATION(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_WONDER_BASEMENT_GRAVE_1, logic->CanJumpslashExceptHammer()), + LOCATION(RC_DEKU_TREE_MQ_WONDER_BASEMENT_GRAVE_2, logic->CanJumpslashExceptHammer()), + LOCATION(RC_DEKU_TREE_MQ_WONDER_BASEMENT_GRAVE_3, logic->CanJumpslashExceptHammer()), + LOCATION(RC_DEKU_TREE_MQ_WONDER_BASEMENT_GRAVE_4, logic->CanJumpslashExceptHammer()), }, { //Exits ENTRANCE(RR_DEKU_TREE_MQ_BASEMENT_LEDGE, logic->CanUse(RG_CRAWL) && AnyAgeTime([]{return logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW);})), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp index 60f51f75d..4f2a05ba5 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp @@ -626,9 +626,11 @@ void RegionTable_Init_FireTemple() { EVENT_ACCESS(LOGIC_FAIRY_ACCESS, logic->CanUse(RG_HOOKSHOT)), }, { //Locations - LOCATION(RC_FIRE_TEMPLE_MQ_BOSS_KEY_CHEST, logic->CanUse(RG_HOOKSHOT) && logic->HasItem(RG_OPEN_CHEST)), - LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1, logic->HookshotOrBoomerang()), - LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2, logic->HookshotOrBoomerang()), + LOCATION(RC_FIRE_TEMPLE_MQ_BOSS_KEY_CHEST, logic->CanUse(RG_HOOKSHOT) && logic->HasItem(RG_OPEN_CHEST)), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1, logic->HookshotOrBoomerang()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2, logic->HookshotOrBoomerang()), + LOCATION(RC_FIRE_TEMPLE_MQ_WONDER_BOSS_KEY_ROOM_HOOKSHOT, logic->CanUse(RG_HOOKSHOT)), + LOCATION(RC_FIRE_TEMPLE_MQ_WONDER_BOSS_KEY_ROOM_BOW, logic->HookshotOrBoomerang() && logic->CanUse(RG_FAIRY_BOW)), }, { //Exits ENTRANCE(RR_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM, true), @@ -676,7 +678,12 @@ void RegionTable_Init_FireTemple() { ENTRANCE(RR_FIRE_TEMPLE_MQ_SHORTCUT_ROOM_LOWER, true), }); - areaTable[RR_FIRE_TEMPLE_MQ_SHORTCUT_ROOM_LOWER] = Region("Fire Temple MQ Shortcut Room Lower", SCENE_FIRE_TEMPLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_SHORTCUT_ROOM_LOWER] = Region("Fire Temple MQ Shortcut Room Lower", SCENE_FIRE_TEMPLE, {}, { + //Locations + LOCATION(RC_FIRE_TEMPLE_MQ_WONDER_SHORTCUT_ROOM_1, logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_FIRE_TEMPLE_MQ_WONDER_SHORTCUT_ROOM_2, logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_FIRE_TEMPLE_MQ_WONDER_SHORTCUT_ROOM_3, logic->CanUse(RG_MEGATON_HAMMER)), + }, { //Exits ENTRANCE(RR_FIRE_TEMPLE_MQ_SHORTCUT_ROOM_MID, (logic->HasFireSource() && (logic->IsAdult || (logic->CanUse(RG_HOOKSHOT) && logic->HasItem(RG_CLIMB)))) || (ctx->GetTrickOption(RT_FIRE_MQ_CLIMB) && logic->CanUse(RG_HOVER_BOOTS) && logic->HasItem(RG_CLIMB))), @@ -697,7 +704,10 @@ void RegionTable_Init_FireTemple() { ENTRANCE(RR_FIRE_TEMPLE_MQ_LOWER_LIZALFOS_MAZE, true), }); - areaTable[RR_FIRE_TEMPLE_MQ_LOWER_LIZALFOS_MAZE] = Region("Fire Temple MQ Lower Lizalfos Maze", SCENE_FIRE_TEMPLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_LOWER_LIZALFOS_MAZE] = Region("Fire Temple MQ Lower Lizalfos Maze", SCENE_FIRE_TEMPLE, {}, { + //Locations + LOCATION(RC_FIRE_TEMPLE_MQ_WONDER_LIZALFOS_MAZE, logic->CanUse(RG_HOOKSHOT)), + }, { //Exits ENTRANCE(RR_FIRE_TEMPLE_MQ_SHORTCUT_ROOM_LOWER, true), //Explosives can also reach this room. Chus is relatively simple, they need to detonate on the first horizontal bar up from the floor while horizontally near the switch, but bombs are much harder @@ -797,7 +807,13 @@ void RegionTable_Init_FireTemple() { areaTable[RR_FIRE_TEMPLE_MQ_TORCH_SLUG_CLIMB] = Region("Fire Temple MQ Torch Slug Climb", SCENE_FIRE_TEMPLE, { //Events EVENT_ACCESS(LOGIC_FAIRY_ACCESS, logic->CanUse(RG_HOOKSHOT)), - }, {}, { + }, { + //Locations + LOCATION(RC_FIRE_TEMPLE_MQ_WONDER_EAST_TOWER_LARGE_FACE_1, logic->CanUse(RG_HOOKSHOT)), + LOCATION(RC_FIRE_TEMPLE_MQ_WONDER_EAST_TOWER_LARGE_FACE_2, logic->CanUse(RG_HOOKSHOT)), + LOCATION(RC_FIRE_TEMPLE_MQ_WONDER_EAST_TOWER_SMALL_FACE_1, logic->CanUse(RG_HOOKSHOT)), + LOCATION(RC_FIRE_TEMPLE_MQ_WONDER_EAST_TOWER_SMALL_FACE_2, logic->CanUse(RG_HOOKSHOT)), + }, { //Exits ENTRANCE(RR_FIRE_TEMPLE_MQ_ABOVE_MAZE, true), ENTRANCE(RR_FIRE_TEMPLE_MQ_BURNING_BLOCK, logic->CanUse(RG_HOOKSHOT) && logic->HasItem(RG_CLIMB)), @@ -842,6 +858,7 @@ void RegionTable_Init_FireTemple() { LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4, logic->CanBreakCrates() && logic->FireTimer() >= 16), LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2, logic->CanBreakSmallCrates() && logic->FireTimer() >= 24), LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3, logic->CanBreakSmallCrates() && logic->FireTimer() >= 16), + LOCATION(RC_FIRE_TEMPLE_MQ_WONDER_TORCH_ROOM, logic->CanUse(RG_HOOKSHOT) && logic->FireTimer() >= 16), }, { //Exits ENTRANCE(RR_FIRE_TEMPLE_MQ_HIGH_TORCH_ROOM_ABOVE_CAGE, (logic->IsAdult || logic->CanUse(RG_HOOKSHOT)) && logic->FireTimer() >= 24), @@ -945,6 +962,7 @@ void RegionTable_Init_FireTemple() { LOCATION(RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_SOUTH_POT, logic->CanUse(RG_BOOMERANG)), LOCATION(RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHMOST_POT, logic->CanBreakPots()), LOCATION(RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHWEST_POT, logic->CanBreakPots()), + LOCATION(RC_FIRE_TEMPLE_MQ_WONDER_FIRE_MAZE, logic->CanUse(RG_LONGSHOT) && logic->CanUse(RG_BOOMERANG)), }, { //Exits ENTRANCE(RR_FIRE_TEMPLE_MQ_GS_LIZALFOS_ROOM, true), @@ -972,6 +990,7 @@ void RegionTable_Init_FireTemple() { LOCATION(RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_SOUTH_POT, logic->CanBreakPots()), LOCATION(RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_NORTH_POT, logic->CanBreakPots()), LOCATION(RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHWEST_POT, logic->CanUse(RG_BOOMERANG)), + LOCATION(RC_FIRE_TEMPLE_MQ_WONDER_FIRE_MAZE, logic->CanUse(RG_HOOKSHOT)), }, { //Exits ENTRANCE(RR_FIRE_TEMPLE_MQ_3F_FLARE_DANCER, true), @@ -992,7 +1011,10 @@ void RegionTable_Init_FireTemple() { ENTRANCE(RR_FIRE_TEMPLE_MQ_LOCKED_CLIMB, true), }); - areaTable[RR_FIRE_TEMPLE_MQ_LOCKED_CLIMB] = Region("Fire Temple MQ Locked Climb", SCENE_FIRE_TEMPLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_LOCKED_CLIMB] = Region("Fire Temple MQ Locked Climb", SCENE_FIRE_TEMPLE, {}, { + //Locations + LOCATION(RC_FIRE_TEMPLE_MQ_WONDER_AFTER_FLARE_DANCER, logic->CanUse(RG_HOOKSHOT)), + }, { //Exits ENTRANCE(RR_FIRE_TEMPLE_MQ_3F_FLARE_DANCER, true), ENTRANCE(RR_FIRE_TEMPLE_MQ_NARROW_STAIRS_ROOM, logic->SmallKeys(SCENE_FIRE_TEMPLE, 4) && logic->HasItem(RG_CLIMB)), @@ -1032,7 +1054,10 @@ void RegionTable_Init_FireTemple() { ENTRANCE(RR_FIRE_TEMPLE_MQ_NARROW_STAIRS_4F, logic->SmallKeys(SCENE_FIRE_TEMPLE, 5)), }); - areaTable[RR_FIRE_TEMPLE_MQ_BASE_OF_COLLAPSING_STAIRS] = Region("Fire Temple MQ Base of Collapsing Stairs", SCENE_FIRE_TEMPLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_BASE_OF_COLLAPSING_STAIRS] = Region("Fire Temple MQ Base of Collapsing Stairs", SCENE_FIRE_TEMPLE, {}, { + //Locations + LOCATION(RC_FIRE_TEMPLE_MQ_WONDER_STAIRCASE, logic->Get(LOGIC_FIRE_HIT_STAIRS) && logic->CanUse(RG_HOOKSHOT)), + }, { //Exits ENTRANCE(RR_FIRE_TEMPLE_MQ_TOP_OF_COLLAPSING_STAIRS, logic->Get(LOGIC_FIRE_HIT_STAIRS) && logic->IsAdult), ENTRANCE(RR_FIRE_TEMPLE_MQ_ABOVE_FIRE_MAZE, logic->CanUse(RG_HOOKSHOT)), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp index b34e060d0..48348de44 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp @@ -564,7 +564,10 @@ void RegionTable_Init_GanonsCastle() { //Events //A torch run from RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_STARTING_LEDGE is possible but tight, so would be a trick EVENT_ACCESS(LOGIC_SHADOW_TRIAL_FIRST_CHEST, logic->CanDetonateUprightBombFlower()), - }, {}, { + }, { + //Locations + LOCATION(RC_GANONS_CASTLE_MQ_WONDER_SHADOW_TRIAL, (logic->CanDetonateBombFlowers() || (ctx->GetTrickOption(RT_BLUE_FIRE_MUD_WALLS) && logic->CanUse(RG_BOTTLE_WITH_BLUE_FIRE))) && (logic->TakeDamage() || logic->CanUse(RG_NAYRUS_LOVE))), + }, { //Exits ENTRANCE(RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_CHEST_PLATFORM, logic->IsAdult || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS)), ENTRANCE(RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_BEAMOS_TORCH, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp index dd8b6c85a..b4322f64b 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp @@ -107,7 +107,10 @@ void RegionTable_Init_GerudoTrainingGround() { ENTRANCE(RR_GERUDO_TRAINING_GROUND_BEHIND_HEAVY_BLOCK, true), }); - areaTable[RR_GERUDO_TRAINING_GROUND_EYE_STATUE_UPPER] = Region("Gerudo Training Ground Eye Statue Upper", SCENE_GERUDO_TRAINING_GROUND, {}, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_EYE_STATUE_UPPER] = Region("Gerudo Training Ground Eye Statue Upper", SCENE_GERUDO_TRAINING_GROUND, {}, { + //Locations + LOCATION(RC_GERUDO_TRAINING_GROUND_WONDER_EYE_STATUE_ROOM, logic->CanUse(RG_HOVER_BOOTS)), //RANDOTODO: add trick for jump+jumpslash and jump only to pillar + }, { //Exits ENTRANCE(RR_GERUDO_TRAINING_GROUND_EYE_STATUE_LOWER, true), ENTRANCE(RR_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_ROOM_UPPER, true), @@ -137,6 +140,7 @@ void RegionTable_Init_GerudoTrainingGround() { //Locations LOCATION(RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST, logic->CanAttack() && logic->HasItem(RG_OPEN_CHEST)), LOCATION(RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_SWITCH_CHEST, (logic->CanUse(RG_MEGATON_HAMMER) || (logic->TakeDamage() && ctx->GetTrickOption(RT_FIRE_RINGS))) && logic->HasItem(RG_OPEN_CHEST)), + LOCATION(RC_GERUDO_TRAINING_GROUND_WONDER_TORCH_SLUGS_ROOM, logic->CanUse(RG_FAIRY_BOW)), }, { //Exits ENTRANCE(RR_GERUDO_TRAINING_GROUND_EYE_STATUE_LOWER, logic->CanUse(RG_MEGATON_HAMMER) && logic->CanUse(RG_FAIRY_BOW)), @@ -172,6 +176,7 @@ void RegionTable_Init_GerudoTrainingGround() { LOCATION(RC_GERUDO_TRAINING_GROUND_BEAMOS_CHEST, logic->CanKillEnemy(RE_BEAMOS) && logic->CanKillEnemy(RE_DINOLFOS, ED_CLOSE, true, 2, true) && logic->HasItem(RG_OPEN_CHEST)), LOCATION(RC_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART, true), LOCATION(RC_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART, true), + LOCATION(RC_GERUDO_TRAINING_GROUND_WONDER_BEAMOS_ROOM, logic->CanUse(RG_FAIRY_BOW)), }, { //Exits ENTRANCE(RR_GERUDO_TRAINING_GROUND_LOBBY, true), @@ -275,7 +280,10 @@ void RegionTable_Init_GerudoTrainingGround() { ENTRANCE(RR_GERUDO_TRAINING_GROUND_MQ_BEHIND_BLOCK, true), }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_STATUE_ROOM_LEDGE] = Region("Gerudo Training Ground MQ Statue Room Ledge", SCENE_GERUDO_TRAINING_GROUND, {}, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_STATUE_ROOM_LEDGE] = Region("Gerudo Training Ground MQ Statue Room Ledge", SCENE_GERUDO_TRAINING_GROUND, {}, { + //Locations + LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_WONDER_EYE_STATUE, logic->CanUse(RG_LONGSHOT) || logic->CanUse(RG_HOVER_BOOTS)), + }, { //Exits ENTRANCE(RR_GERUDO_TRAINING_GROUND_MQ_STALFOS_ROOM, true), //implies dropping down to hit the switch. Using swords, especially master, is a bit awkward, may be trick worthy, but is only relevant with other tricks @@ -400,7 +408,8 @@ void RegionTable_Init_GerudoTrainingGround() { //is logic->CanKillEnemy(RE_DINOLFOS, ED_CLOSE, true, 2, true) && logic->CanKillEnemy(RE_ARMOS, ED_CLOSE, true, 1, true) broken down to exclude sticks, as it takes too many to clear the room //Proper enemy kill room ammo logic is needed to handle this room //some combinations may be impossible without taking damage, keep an eye out for issues here - LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST, (logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_MEGATON_HAMMER) || logic->CanUse(RG_FAIRY_BOW) || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT)))) && logic->HasItem(RG_OPEN_CHEST)), + LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST, (logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_MEGATON_HAMMER) || logic->CanUse(RG_FAIRY_BOW) || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT)))) && logic->HasItem(RG_OPEN_CHEST)), + LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_WONDER_DINOLFOS_ROOM, logic->CanUse(RG_FAIRY_BOW)), }, { //Exits ENTRANCE(RR_GERUDO_TRAINING_GROUND_MQ_LOBBY, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp index 389bfae95..9c8d9872c 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp @@ -266,12 +266,14 @@ void RegionTable_Init_JabuJabusBelly() { EVENT_ACCESS(LOGIC_NUT_ACCESS, logic->CanBreakPots()), }, { //Locations - LOCATION(RC_JABU_JABUS_BELLY_MQ_MAP_CHEST, logic->BlastOrSmash() && logic->HasItem(RG_OPEN_CHEST)), - LOCATION(RC_JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, logic->CanUse(RG_FAIRY_SLINGSHOT) && logic->HasItem(RG_OPEN_CHEST)), - LOCATION(RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1, logic->CanBreakPots()), - LOCATION(RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2, logic->CanBreakPots()), - LOCATION(RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1, logic->CanCutShrubs()), - LOCATION(RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_MAP_CHEST, logic->BlastOrSmash() && logic->HasItem(RG_OPEN_CHEST)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, logic->CanUse(RG_FAIRY_SLINGSHOT) && logic->HasItem(RG_OPEN_CHEST)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1, logic->CanBreakPots()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2, logic->CanBreakPots()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_WONDER_ENTRANCE_LEFT_COW, logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_WONDER_ENTRANCE_RIGHT_COW, logic->CanUse(RG_FAIRY_SLINGSHOT)), }, { //Exits ENTRANCE(RR_JABU_JABUS_BELLY_ENTRYWAY, true), @@ -283,12 +285,13 @@ void RegionTable_Init_JabuJabusBelly() { EVENT_ACCESS(LOGIC_JABU_MQ_LIFT_ROOM_COW, logic->CanUse(RG_FAIRY_SLINGSHOT)), }, { //Locations - LOCATION(RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST, logic->HasItem(RG_OPEN_CHEST)), - LOCATION(RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_1, true), - LOCATION(RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_2, true), - LOCATION(RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_1, logic->CanUse(RG_IRON_BOOTS)), - LOCATION(RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_2, logic->CanUse(RG_IRON_BOOTS)), - LOCATION(RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_3, logic->CanUse(RG_IRON_BOOTS)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST, logic->HasItem(RG_OPEN_CHEST)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_1, true), + LOCATION(RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_2, true), + LOCATION(RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_1, logic->CanUse(RG_IRON_BOOTS)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_2, logic->CanUse(RG_IRON_BOOTS)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_3, logic->CanUse(RG_IRON_BOOTS)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_WONDER_ELEVATOR_COW, logic->CanUse(RG_FAIRY_SLINGSHOT) && (logic->HasItem(RG_SILVER_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG))), }, { //Exits ENTRANCE(RR_JABU_JABUS_BELLY_MQ_BEGINNING, true), @@ -322,6 +325,7 @@ void RegionTable_Init_JabuJabusBelly() { //Locations LOCATION(RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_1, logic->CanCutShrubs() && logic->HasExplosives()), LOCATION(RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_2, logic->CanCutShrubs() && logic->HasExplosives()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_HOLES_COW, (logic->HasExplosives() || ctx->GetTrickOption(RT_BOULDER_COLLISION)) && logic->CanUse(RG_FAIRY_SLINGSHOT)), }, { //Exits ENTRANCE(RR_JABU_JABUS_BELLY_MQ_LIFT_ROOM, true), @@ -345,6 +349,12 @@ void RegionTable_Init_JabuJabusBelly() { LOCATION(RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1, logic->CanCutShrubs()), LOCATION(RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2, logic->CanCutShrubs()), LOCATION(RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_RIGHT_COW_1, logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_RIGHT_COW_2, logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_RIGHT_COW_3, logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_LEFT_COW_1, logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_LEFT_COW_2, logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_LEFT_COW_3, logic->CanUse(RG_FAIRY_SLINGSHOT)), }, { //Exits ENTRANCE(RR_JABU_JABUS_BELLY_MQ_HOLES_ROOM, logic->HasItem(RG_CLIMB)), @@ -435,12 +445,21 @@ void RegionTable_Init_JabuJabusBelly() { areaTable[RR_JABU_JABUS_BELLY_MQ_FORK_NORTH_EAST] = Region("Jabu Jabus Belly MQ Fork North East", SCENE_JABU_JABU, {}, { //Locations //Implies CanKillEnemy(RE_LIKE_LIKE) - LOCATION(RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, logic->CanUse(RG_FAIRY_SLINGSHOT) && logic->HasItem(RG_OPEN_CHEST)), - LOCATION(RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1, logic->CanBreakPots()), - LOCATION(RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2, logic->CanBreakPots()), - LOCATION(RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS, logic->CanCutShrubs()), - LOCATION(RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1, logic->CanBreakSmallCrates()), - LOCATION(RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2, logic->CanBreakSmallCrates()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, logic->CanUse(RG_FAIRY_SLINGSHOT) && logic->HasItem(RG_OPEN_CHEST)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1, logic->CanBreakPots()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2, logic->CanBreakPots()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS, logic->CanCutShrubs()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2, logic->CanBreakSmallCrates()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_RIGHT_1, logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_RIGHT_2, logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_RIGHT_3, logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_LEFT_1, logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_LEFT_2, logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_LEFT_3, logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_EXPLOSION_1, logic->HasExplosives()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_EXPLOSION_2, logic->HasExplosives()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_EXPLOSION_3, logic->HasExplosives()), }, { //Exits ENTRANCE(RR_JABU_JABUS_BELLY_MQ_FORKED_CORRIDOR, true), @@ -492,6 +511,7 @@ void RegionTable_Init_JabuJabusBelly() { //Locations LOCATION(RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1, logic->CanCutShrubs()), LOCATION(RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_WONDER_AFTER_BIG_OCTO, logic->CanUse(RG_FAIRY_SLINGSHOT)), }, { //Exits ENTRANCE(RR_JABU_JABUS_BELLY_MQ_JIGGLIES_ROOM, true), @@ -504,6 +524,7 @@ void RegionTable_Init_JabuJabusBelly() { LOCATION(RC_JABU_JABUS_BELLY_MQ_JIGGLIES_GRASS, logic->CanCutShrubs()), LOCATION(RC_JABU_JABUS_BELLY_MQ_JIGGLIES_SMALL_CRATE_1, logic->CanUse(RG_FAIRY_SLINGSHOT) && logic->CanBreakSmallCrates()), LOCATION(RC_JABU_JABUS_BELLY_MQ_JIGGLIES_SMALL_CRATE_2, logic->CanUse(RG_FAIRY_SLINGSHOT) && logic->CanBreakSmallCrates()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_WONDER_JIGGLIES_COW, logic->CanUse(RG_FAIRY_SLINGSHOT)), }, { //Exits ENTRANCE(RR_JABU_JABUS_BELLY_MQ_ABOVE_BIGOCTO, true), @@ -541,11 +562,14 @@ void RegionTable_Init_JabuJabusBelly() { EVENT_ACCESS(LOGIC_FAIRY_ACCESS, logic->CanBreakPots()), }, { //Locations - LOCATION(RC_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, logic->CanUse(RG_FAIRY_SLINGSHOT)), - LOCATION(RC_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, (logic->HasItem(RG_CLIMB) && (logic->CanUse(RG_BOOMERANG) || (ctx->GetTrickOption(RT_JABU_NEAR_BOSS_RANGED) && logic->CanUse(RG_HOOKSHOT)))) || (ctx->GetTrickOption(RT_JABU_NEAR_BOSS_RANGED) && logic->CanUse(RG_LONGSHOT))), - LOCATION(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1, logic->CanBreakPots()), - LOCATION(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1, logic->CanCutShrubs()), - LOCATION(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, (logic->HasItem(RG_CLIMB) && (logic->CanUse(RG_BOOMERANG) || (ctx->GetTrickOption(RT_JABU_NEAR_BOSS_RANGED) && logic->CanUse(RG_HOOKSHOT)))) || (ctx->GetTrickOption(RT_JABU_NEAR_BOSS_RANGED) && logic->CanUse(RG_LONGSHOT))), + LOCATION(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1, logic->CanBreakPots()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_WONDER_BEFORE_BOSS_LEFT_COW, logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_WONDER_BEFORE_BOSS_RIGHT_COW_1, logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_WONDER_BEFORE_BOSS_RIGHT_COW_2, logic->CanUse(RG_FAIRY_SLINGSHOT)), }, { //Exits ENTRANCE(RR_JABU_JABUS_BELLY_MQ_TO_NEAR_BOSS_ROOM, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp index f146a9415..97b65a2c1 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp @@ -344,6 +344,7 @@ void RegionTable_Init_ShadowTemple() { areaTable[RR_SHADOW_TEMPLE_THREE_SKULL_JARS] = Region("Shadow Temple Three Skull Jars", SCENE_SHADOW_TEMPLE, {}, { //Locations LOCATION(RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, logic->HasItem(RG_GORONS_BRACELET) || logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_SHORT_JUMPSLASH)), + LOCATION(RC_SHADOW_TEMPLE_WONDER_THREE_POTS, logic->CanUse(RG_FAIRY_BOW)), }, { //Exits ENTRANCE(RR_SHADOW_TEMPLE_MAZE, true), @@ -740,7 +741,8 @@ void RegionTable_Init_ShadowTemple() { areaTable[RR_SHADOW_TEMPLE_MQ_THREE_SKULL_JARS] = Region("Shadow Temple MQ Three Skull Jars", SCENE_SHADOW_TEMPLE, {}, { //Locations - LOCATION(RC_SHADOW_TEMPLE_MQ_FREESTANDING_KEY, true), + LOCATION(RC_SHADOW_TEMPLE_MQ_FREESTANDING_KEY, true), + LOCATION(RC_SHADOW_TEMPLE_MQ_WONDER_THREE_POTS, logic->CanUse(RG_FAIRY_BOW)), }, { //Exits ENTRANCE(RR_SHADOW_TEMPLE_MQ_INVISIBLE_MAZE, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp index 9f2b6d46c..fcbdce9a7 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp @@ -984,6 +984,8 @@ void RegionTable_Init_SpiritTemple() { //Locations LOCATION(RC_SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST, logic->HasItem(RG_OPEN_CHEST)), LOCATION(RC_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), + LOCATION(RC_SPIRIT_TEMPLE_MQ_WONDER_CHEST_HAMMER, logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_SPIRIT_TEMPLE_MQ_WONDER_CHEST_SLASH, logic->CanJumpslashExceptHammer()), }, { //Exits ENTRANCE(RR_SPIRIT_TEMPLE_MQ_BEAMOS_PITS, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp index cfd2b3925..d18e787b7 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp @@ -760,7 +760,11 @@ void RegionTable_Init_WaterTemple() { ENTRANCE(RR_WATER_TEMPLE_MQ_BOSS_DOOR_RAMP, true), }); - areaTable[RR_WATER_TEMPLE_MQ_BOSS_DOOR_RAMP] = Region("Water Temple MQ Boss Door Ramp", SCENE_WATER_TEMPLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_BOSS_DOOR_RAMP] = Region("Water Temple MQ Boss Door Ramp", SCENE_WATER_TEMPLE, {}, { + //Locations + LOCATION(RC_WATER_TEMPLE_MQ_WONDER_BEFORE_BOSS_1, logic->CanUse(RG_HOOKSHOT)), + LOCATION(RC_WATER_TEMPLE_MQ_WONDER_BEFORE_BOSS_2, logic->CanUse(RG_HOOKSHOT)), + }, { //Exits ENTRANCE(RR_WATER_TEMPLE_MQ_RISING_TARGET_LEDGE, true), ENTRANCE(RR_WATER_TEMPLE_MQ_BOSS_DOOR, logic->CanUse(RG_LONGSHOT) || logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_ICE_ARROWS) || logic->CanUse(RG_NAYRUS_LOVE)), @@ -789,7 +793,8 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_SIDE_TOWER_2F] = Region("Water Temple MQ Side Tower 2F", SCENE_WATER_TEMPLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_LONGSHOT_CHEST, logic->CanUse(RG_HOOKSHOT) && ((logic->WaterLevel(WL_MID) && logic->HasItem(RG_OPEN_CHEST)) || logic->CanOpenUnderwaterChest())), + LOCATION(RC_WATER_TEMPLE_MQ_LONGSHOT_CHEST, logic->CanUse(RG_HOOKSHOT) && ((logic->WaterLevel(WL_MID) && logic->HasItem(RG_OPEN_CHEST)) || logic->CanOpenUnderwaterChest())), + LOCATION(RC_WATER_TEMPLE_MQ_WONDER_LONGSHOT_ROOM, logic->CanUse(RG_HOOKSHOT) && (logic->WaterLevel(WL_MID) || logic->CanUse(RG_IRON_BOOTS))), }, { //Exits ENTRANCE(RR_WATER_TEMPLE_MQ_SIDE_TOWER_1F, logic->WaterLevel(WL_LOW) || logic->CanUse(RG_IRON_BOOTS)), @@ -810,7 +815,8 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_3_STALFOS_ROOM] = Region("Water Temple MQ 3 Stalfos Room", SCENE_WATER_TEMPLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_MAP_CHEST, logic->CanUse(RG_HOOKSHOT) && logic->HasItem(RG_OPEN_CHEST)), + LOCATION(RC_WATER_TEMPLE_MQ_MAP_CHEST, logic->CanUse(RG_HOOKSHOT) && logic->HasItem(RG_OPEN_CHEST)), + LOCATION(RC_WATER_TEMPLE_MQ_WONDER_STALFOS_ROOM, logic->CanUse(RG_HOOKSHOT)), }, { //Exits ENTRANCE(RR_WATER_TEMPLE_MQ_LOW_EMBLEM, logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 4)), @@ -821,7 +827,8 @@ void RegionTable_Init_WaterTemple() { EVENT_ACCESS(LOGIC_WATER_MQ_SIDE_TOWER_TARGETS, logic->CanKillEnemy(RE_LIZALFOS) && logic->CanKillEnemy(RE_SPIKE)), }, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_COMPASS_CHEST, logic->Get(LOGIC_WATER_MQ_SIDE_TOWER_TARGETS) && logic->HasItem(RG_OPEN_CHEST)), + LOCATION(RC_WATER_TEMPLE_MQ_COMPASS_CHEST, logic->Get(LOGIC_WATER_MQ_SIDE_TOWER_TARGETS) && logic->HasItem(RG_OPEN_CHEST)), + LOCATION(RC_WATER_TEMPLE_MQ_WONDER_LIZALFOS_ROOM, logic->CanUse(RG_HOOKSHOT)), }, { //Exits ENTRANCE(RR_WATER_TEMPLE_MQ_SIDE_TOWER_1F, true), @@ -901,7 +908,8 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_PILLAR_B1_FINAL] = Region("Water Temple MQ Central Pillar B1 Final", SCENE_WATER_TEMPLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, logic->CanUse(RG_HOOKSHOT) && logic->HasItem(RG_OPEN_CHEST)), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, logic->CanUse(RG_HOOKSHOT) && logic->HasItem(RG_OPEN_CHEST)), + LOCATION(RC_WATER_TEMPLE_MQ_WONDER_UNDER_PILLAR_ROOM, logic->CanUse(RG_HOOKSHOT)), }, {}); areaTable[RR_WATER_TEMPLE_MQ_STORAGE_ROOM] = Region("Water Temple MQ Storage Room", SCENE_WATER_TEMPLE, {}, { @@ -944,6 +952,7 @@ void RegionTable_Init_WaterTemple() { LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5, logic->CanBreakCrates()), LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6, logic->CanBreakCrates()), LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE, logic->CanBreakSmallCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WONDER_GS_STORAGE_ROOM, logic->CanUse(RG_HOOKSHOT)), }, { //Exits ENTRANCE(RR_WATER_TEMPLE_MQ_MAIN, true), @@ -978,6 +987,7 @@ void RegionTable_Init_WaterTemple() { LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3, logic->CanBreakCrates()), LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4, logic->CanBreakCrates()), LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WONDER_LIZALFOS_HALLWAY, logic->CanUse(RG_HOOKSHOT)), }, { //Exits ENTRANCE(RR_WATER_TEMPLE_MQ_3F_CENTRAL_A, logic->CanUse(RG_HOOKSHOT)), @@ -1024,13 +1034,29 @@ void RegionTable_Init_WaterTemple() { ENTRANCE(RR_WATER_TEMPLE_MQ_2F_CENTRAL_H, logic->WaterLevel(WL_HIGH) && logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_IRON_BOOTS)), }); - areaTable[RR_WATER_TEMPLE_MQ_WATERFALL] = Region("Water Temple Waterfall", SCENE_WATER_TEMPLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_WATERFALL] = Region("Water Temple Waterfall", SCENE_WATER_TEMPLE, {}, { + //Locations + LOCATION(RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_RIGHT_1, logic->CanUse(RG_LONGSHOT)), + LOCATION(RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_RIGHT_2, logic->CanUse(RG_LONGSHOT)), + LOCATION(RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_RIGHT_3, logic->CanUse(RG_LONGSHOT)), + LOCATION(RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_LEFT_1, logic->CanUse(RG_LONGSHOT)), + LOCATION(RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_LEFT_2, logic->CanUse(RG_LONGSHOT)), + LOCATION(RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_LEFT_3, logic->CanUse(RG_LONGSHOT)), + }, { //Exits ENTRANCE(RR_WATER_TEMPLE_MQ_OUTSIDE_WATERFALL, logic->SmallKeys(SCENE_WATER_TEMPLE, 1)), ENTRANCE(RR_WATER_TEMPLE_MQ_WATERFALL_TOP, logic->CanUse(RG_LONGSHOT)), }); - areaTable[RR_WATER_TEMPLE_MQ_WATERFALL_TOP] = Region("Water Temple Waterfall Top", SCENE_WATER_TEMPLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_WATERFALL_TOP] = Region("Water Temple Waterfall Top", SCENE_WATER_TEMPLE, {}, { + //Locations + LOCATION(RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_RIGHT_1, logic->CanUse(RG_HOOKSHOT)), + LOCATION(RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_RIGHT_2, logic->CanUse(RG_HOOKSHOT)), + LOCATION(RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_RIGHT_3, logic->CanUse(RG_HOOKSHOT)), + LOCATION(RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_LEFT_1, logic->CanUse(RG_HOOKSHOT)), + LOCATION(RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_LEFT_2, logic->CanUse(RG_HOOKSHOT)), + LOCATION(RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_LEFT_3, logic->CanUse(RG_HOOKSHOT)), + }, { //Exits ENTRANCE(RR_WATER_TEMPLE_MQ_WATERFALL, logic->CanUse(RG_LONGSHOT) && logic->CanHitSwitch(ED_FAR)), ENTRANCE(RR_WATER_TEMPLE_MQ_STALFOS_PIT, true), @@ -1097,8 +1123,9 @@ void RegionTable_Init_WaterTemple() { EVENT_ACCESS(LOGIC_FAIRY_ACCESS, logic->CanBreakPots()), }, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_WONDER_AFTER_DARK_LINK, logic->CanUse(RG_HOOKSHOT)), }, { //Exits ENTRANCE(RR_WATER_TEMPLE_MQ_DARK_LINK_ROOM, true), @@ -1138,6 +1165,8 @@ void RegionTable_Init_WaterTemple() { LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2, logic->CanBreakCrates()), LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3, logic->CanBreakCrates()), LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WONDER_DRAGON_ROOM_LEFT_EYE, logic->CanUse(RG_HOOKSHOT)), + LOCATION(RC_WATER_TEMPLE_MQ_WONDER_DRAGON_ROOM_RIGHT_EYE, logic->CanUse(RG_HOOKSHOT)), }, { //Exits ENTRANCE(RR_WATER_TEMPLE_MQ_RIVER_POTS, logic->CanUse(RG_LONGSHOT)), @@ -1155,6 +1184,7 @@ void RegionTable_Init_WaterTemple() { LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1, logic->CanBreakSmallCrates()), LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2, logic->CanBreakSmallCrates()), LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3, logic->CanBreakSmallCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WONDER_DRAGON_ROOM_PORTRAIT, logic->CanUse(RG_HOOKSHOT)), }, { //Exits ENTRANCE(RR_WATER_TEMPLE_MQ_DRAGON_ROOM_TUNNEL, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16), @@ -1164,8 +1194,10 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR] = Region("Water Temple MQ Dragon Room Door", SCENE_WATER_TEMPLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1, logic->CanBreakCrates()), - LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WONDER_DRAGON_ROOM_LEFT_EYE, logic->CanUse(RG_HOOKSHOT) && logic->WaterTimer() >= 8), + LOCATION(RC_WATER_TEMPLE_MQ_WONDER_DRAGON_ROOM_RIGHT_EYE, logic->CanUse(RG_HOOKSHOT) && logic->WaterTimer() >= 8), }, { //Exits ENTRANCE(RR_WATER_TEMPLE_MQ_RIVER_POTS, logic->CanUse(RG_LONGSHOT)), @@ -1261,6 +1293,8 @@ void RegionTable_Init_WaterTemple() { LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3, logic->CanBreakCrates()), LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1, logic->CanBreakCrates()), LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2, logic->CanBreakCrates()), + // A vanilla bug causes a glitched damage value on hardware and undefined behavior in SOH. Matching the resulting damage triggers with an additional array entry. + LOCATION(RC_WATER_TEMPLE_MQ_WONDER_TRIPLE_TORCHES, logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_FAIRY_BOW)), }, {}); areaTable[RR_WATER_TEMPLE_MQ_SPIKE_MOAT] = Region("Water Temple MQ Spike Moat", SCENE_WATER_TEMPLE, {}, {}, { @@ -1309,9 +1343,9 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_CANAL_ALCOVE] = Region("Water Temple MQ Canal Alcove", SCENE_WATER_TEMPLE, {}, {}, { //Exits - ENTRANCE(RR_WATER_TEMPLE_MQ_3_JETS_ROOM, logic->SmallKeys(SCENE_WATER_TEMPLE, 2)), - ENTRANCE(RR_WATER_TEMPLE_MQ_SCARECROW_CANAL, logic->IsAdult || logic->HasItem(RG_BRONZE_SCALE) || (logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 8)), - ENTRANCE(RR_WATER_TEMPLE_MQ_BEHIND_CANAL, logic->IsAdult && ctx->GetTrickOption(RT_UNINTUITIVE_JUMPS) && logic->HasItem(RG_BRONZE_SCALE)), + ENTRANCE(RR_WATER_TEMPLE_MQ_3_JETS_ROOM_SWITCH_SIDE, logic->SmallKeys(SCENE_WATER_TEMPLE, 2)), + ENTRANCE(RR_WATER_TEMPLE_MQ_SCARECROW_CANAL, logic->IsAdult || logic->HasItem(RG_BRONZE_SCALE) || (logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 8)), + ENTRANCE(RR_WATER_TEMPLE_MQ_BEHIND_CANAL, logic->IsAdult && ctx->GetTrickOption(RT_UNINTUITIVE_JUMPS) && logic->HasItem(RG_BRONZE_SCALE)), }); areaTable[RR_WATER_TEMPLE_MQ_BEHIND_CANAL] = Region("Water Temple MQ Behind Canal", SCENE_WATER_TEMPLE, {}, {}, { @@ -1322,23 +1356,38 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_FREESTANDING_ROOM] = Region("Water Temple MQ Freestanding Room", SCENE_WATER_TEMPLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_FREESTANDING_KEY, logic->CanBreakCrates()), - LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1, logic->CanBreakCrates()), - LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2, logic->CanBreakCrates()), - LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3, logic->CanBreakCrates()), - LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4, logic->CanBreakCrates()), - LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_FREESTANDING_KEY, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WONDER_FREESTANDING_ROOM, logic->CanUse(RG_HOOKSHOT)), }, { //Exits ENTRANCE(RR_WATER_TEMPLE_MQ_BEHIND_CANAL, AnyAgeTime([]{return logic->CanKillEnemy(RE_STALFOS);})), }); - areaTable[RR_WATER_TEMPLE_MQ_3_JETS_ROOM] = Region("Water Temple MQ 3 Jets Room", SCENE_WATER_TEMPLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_3_JETS_ROOM_SWITCH_SIDE] = Region("Water Temple MQ 3 Jets Room Switch Side", SCENE_WATER_TEMPLE, {}, { + //Locations + LOCATION(RC_WATER_TEMPLE_MQ_WONDER_WATER_SPROUTS_1, true), + LOCATION(RC_WATER_TEMPLE_MQ_WONDER_WATER_SPROUTS_2, logic->CanHitSwitch()), + }, { //Exits - ENTRANCE(RR_WATER_TEMPLE_MQ_CANAL_ALCOVE, logic->SmallKeys(SCENE_WATER_TEMPLE, 2) && logic->CanHitSwitch(ED_BOOMERANG)), - ENTRANCE(RR_WATER_TEMPLE_MQ_DODONGO_ROOM, logic->CanHitSwitch() && logic->HasFireSource()), + ENTRANCE(RR_WATER_TEMPLE_MQ_CANAL_ALCOVE, logic->SmallKeys(SCENE_WATER_TEMPLE, 2)), + ENTRANCE(RR_WATER_TEMPLE_MQ_3_JETS_ROOM_NO_SWITCH_SIDE, logic->CanHitSwitch()), + // No Switch Side requires CanHitSwitch(ED_BOOMERANG) to get to this entrance. This is covered by No Switch -> Switch entrance. + ENTRANCE(RR_WATER_TEMPLE_MQ_DODONGO_ROOM, logic->CanHitSwitch(ED_BOOMERANG) && logic->HasFireSource()), + }); + + areaTable[RR_WATER_TEMPLE_MQ_3_JETS_ROOM_NO_SWITCH_SIDE] = Region("Water Temple MQ 3 Jets Room No Switch Side", SCENE_WATER_TEMPLE, {}, { + //Locations + LOCATION(RC_WATER_TEMPLE_MQ_WONDER_WATER_SPROUTS_2, logic->IsAdult), + }, { + //Exits + ENTRANCE(RR_WATER_TEMPLE_MQ_3_JETS_ROOM_SWITCH_SIDE, logic->CanHitSwitch(ED_BOOMERANG) || (ctx->GetTrickOption(RT_HOVER_BOOST_SIMPLE) && logic->CanHammerRecoilHover())), }); areaTable[RR_WATER_TEMPLE_MQ_DODONGO_ROOM] = Region("Water Temple MQ Dodongo Room", SCENE_WATER_TEMPLE, {}, { @@ -1352,8 +1401,8 @@ void RegionTable_Init_WaterTemple() { LOCATION(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3, logic->CanBreakCrates()), }, { //Exits - ENTRANCE(RR_WATER_TEMPLE_MQ_3_JETS_ROOM, (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS)) && AnyAgeTime([]{return logic->CanKillEnemy(RE_DODONGO, ED_CLOSE, true, 5);})), - ENTRANCE(RR_WATER_TEMPLE_MQ_CRATE_VORTEX_CAGE, (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS)) && AnyAgeTime([]{return logic->CanKillEnemy(RE_DODONGO, ED_CLOSE, true, 5);})), + ENTRANCE(RR_WATER_TEMPLE_MQ_3_JETS_ROOM_NO_SWITCH_SIDE, (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS)) && AnyAgeTime([]{return logic->CanKillEnemy(RE_DODONGO, ED_CLOSE, true, 5);})), + ENTRANCE(RR_WATER_TEMPLE_MQ_CRATE_VORTEX_CAGE, (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS)) && AnyAgeTime([]{return logic->CanKillEnemy(RE_DODONGO, ED_CLOSE, true, 5);})), }); areaTable[RR_WATER_TEMPLE_MQ_CRATE_VORTEX_CAGE] = Region("Water Temple MQ Crate Vortex Cage", SCENE_WATER_TEMPLE, {}, { diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp index 7e113d406..f6029bbf2 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp @@ -93,9 +93,21 @@ void RegionTable_Init_CastleGrounds() { areaTable[RR_HC_MOAT] = Region("Hyrule Castle Grounds", SCENE_HYRULE_CASTLE, {}, { //Locations - LOCATION(RC_HC_GRASS_1, logic->CanCutShrubs()), - LOCATION(RC_HC_GRASS_2, logic->CanCutShrubs()), - LOCATION(RC_HC_GROTTO_TREE, logic->CanBonkTrees()), + LOCATION(RC_HC_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_HC_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_HC_GROTTO_TREE, logic->CanBonkTrees()), + LOCATION(RC_HC_WONDER_LEFT_TORCH, logic->CanUse(RG_FAIRY_SLINGSHOT) && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_HC_WONDER_RIGHT_TORCH, logic->CanUse(RG_FAIRY_SLINGSHOT) && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_HC_WONDER_MOAT_1, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS)), // RANDOTODO: Add trick for swimless + LOCATION(RC_HC_WONDER_MOAT_2, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS)), // Requires backflip with Iron Boots + LOCATION(RC_HC_WONDER_MOAT_3, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS)), // Requires backflip with Iron Boots + LOCATION(RC_HC_WONDER_MOAT_4, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS)), + LOCATION(RC_HC_WONDER_MOAT_5, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS)), // Requires backflip with Iron Boots + LOCATION(RC_HC_WONDER_MOAT_6, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS)), // Requires backflip with Iron Boots + LOCATION(RC_HC_WONDER_MOAT_7, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS)), // Requires backflip with Iron Boots + LOCATION(RC_HC_WONDER_MOAT_8, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS)), // Requires backflip with Iron Boots + LOCATION(RC_HC_WONDER_MOAT_9, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS)), // Requires backflip with Iron Boots + LOCATION(RC_HC_WONDER_MOAT_10, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS)), // Requires backflip with Iron Boots }, { //Exits ENTRANCE(RR_HC_GATE, true), @@ -112,8 +124,10 @@ void RegionTable_Init_CastleGrounds() { areaTable[RR_HC_GARDEN] = Region("HC Garden", SCENE_CASTLE_COURTYARD_ZELDA, {}, { //Locations - LOCATION(RC_HC_ZELDAS_LETTER, logic->HasItem(RG_SPEAK_HYLIAN)), - LOCATION(RC_SONG_FROM_IMPA, logic->HasItem(RG_SPEAK_HYLIAN)), + LOCATION(RC_HC_ZELDAS_LETTER, logic->HasItem(RG_SPEAK_HYLIAN)), + LOCATION(RC_SONG_FROM_IMPA, logic->HasItem(RG_SPEAK_HYLIAN)), + LOCATION(RC_HC_WONDER_COURTYARD_RIGHT_WINDOW, logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_HC_WONDER_COURTYARD_LEFT_WINDOW, logic->CanUse(RG_FAIRY_SLINGSHOT)), }, { //Exits ENTRANCE(RR_HC_DRAIN_LEDGE, true), // if this ever gets shuffled leaving garden area should come out crawlspace diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp index bb0a9cd27..e3880e3e9 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp @@ -303,19 +303,22 @@ void RegionTable_Init_DeathMountainCrater() { EVENT_ACCESS(LOGIC_FAIRY_ACCESS, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->HasItem(RG_DEATH_MOUNTAIN_CRATER_BEAN_SOUL) && logic->CanUse(RG_SONG_OF_STORMS)), }, { //Locations - LOCATION(RC_SHEIK_IN_CRATER, logic->IsAdult), - LOCATION(RC_DMC_GS_BEAN_PATCH, logic->CanSpawnSoilSkull(RG_DEATH_MOUNTAIN_CRATER_BEAN_SOUL) && logic->CanKillEnemy(RE_GOLD_SKULLTULA)), - LOCATION(RC_DMC_NEAR_PLATFORM_RED_RUPEE, logic->IsChild), - LOCATION(RC_DMC_MIDDLE_PLATFORM_RED_RUPEE, logic->IsChild), - LOCATION(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_1, logic->IsChild), - LOCATION(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_2, logic->IsChild), - LOCATION(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_3, logic->IsChild), - LOCATION(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_4, logic->IsChild), - LOCATION(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_5, logic->IsChild), - LOCATION(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_6, logic->IsChild), - LOCATION(RC_DMC_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->HasItem(RG_DEATH_MOUNTAIN_CRATER_BEAN_SOUL) && logic->CanUse(RG_SONG_OF_STORMS)), - LOCATION(RC_DMC_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->HasItem(RG_DEATH_MOUNTAIN_CRATER_BEAN_SOUL) && logic->CanUse(RG_SONG_OF_STORMS)), - LOCATION(RC_DMC_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->HasItem(RG_DEATH_MOUNTAIN_CRATER_BEAN_SOUL) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_SHEIK_IN_CRATER, logic->IsAdult), + LOCATION(RC_DMC_GS_BEAN_PATCH, logic->CanSpawnSoilSkull(RG_DEATH_MOUNTAIN_CRATER_BEAN_SOUL) && logic->CanKillEnemy(RE_GOLD_SKULLTULA)), + LOCATION(RC_DMC_NEAR_PLATFORM_RED_RUPEE, logic->IsChild), + LOCATION(RC_DMC_MIDDLE_PLATFORM_RED_RUPEE, logic->IsChild), + LOCATION(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_1, logic->IsChild), + LOCATION(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_2, logic->IsChild), + LOCATION(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_3, logic->IsChild), + LOCATION(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_4, logic->IsChild), + LOCATION(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_5, logic->IsChild), + LOCATION(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_6, logic->IsChild), + LOCATION(RC_DMC_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->HasItem(RG_DEATH_MOUNTAIN_CRATER_BEAN_SOUL) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_DMC_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->HasItem(RG_DEATH_MOUNTAIN_CRATER_BEAN_SOUL) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_DMC_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->HasItem(RG_DEATH_MOUNTAIN_CRATER_BEAN_SOUL) && logic->CanUse(RG_SONG_OF_STORMS)), + // RANDOTODO: A number of tricks to reach this: sidehop jumpslash or hookshot + jumpslash from bridge platform, chu+shield damage boost + LOCATION(RC_DMC_WONDER_BENEATH_BRIDGE_PLATFORM, logic->IsAdult && (logic->CanUse(RG_LONGSHOT) || logic->CanUse(RG_HOVER_BOOTS))), + }, {}); diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/desert_colossus.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/desert_colossus.cpp index a60194dd1..0434ba515 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/desert_colossus.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/desert_colossus.cpp @@ -10,16 +10,21 @@ void RegionTable_Init_DesertColossus() { EVENT_ACCESS(LOGIC_BUG_ACCESS, logic->HasItem(RG_POWER_BRACELET)), }, { //Locations - LOCATION(RC_COLOSSUS_FREESTANDING_POH, logic->IsAdult && CanPlantBean(RR_DESERT_COLOSSUS, RG_DESERT_COLOSSUS_BEAN_SOUL)), - LOCATION(RC_COLOSSUS_GS_BEAN_PATCH, logic->CanSpawnSoilSkull(RG_DESERT_COLOSSUS_BEAN_SOUL) && logic->CanAttack()), - LOCATION(RC_COLOSSUS_GS_TREE, logic->IsAdult && logic->HookshotOrBoomerang() && logic->CanGetNightTimeGS()), - LOCATION(RC_COLOSSUS_GS_HILL, logic->IsAdult && ((CanPlantBean(RR_DESERT_COLOSSUS, RG_DESERT_COLOSSUS_BEAN_SOUL) && logic->CanAttack()) || logic->CanUse(RG_LONGSHOT) || (ctx->GetTrickOption(RT_COLOSSUS_GS) && logic->CanUse(RG_HOOKSHOT))) && logic->CanGetNightTimeGS()), - LOCATION(RC_COLOSSUS_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->HasItem(RG_DESERT_COLOSSUS_BEAN_SOUL) && logic->CanUse(RG_SONG_OF_STORMS)), - LOCATION(RC_COLOSSUS_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->HasItem(RG_DESERT_COLOSSUS_BEAN_SOUL) && logic->CanUse(RG_SONG_OF_STORMS)), - LOCATION(RC_COLOSSUS_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->HasItem(RG_DESERT_COLOSSUS_BEAN_SOUL) && logic->CanUse(RG_SONG_OF_STORMS)), - LOCATION(RC_COLOSSUS_GOSSIP_STONE_FAIRY, logic->CallGossipFairy()), - LOCATION(RC_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), - LOCATION(RC_COLOSSUS_GOSSIP_STONE, true), + LOCATION(RC_COLOSSUS_FREESTANDING_POH, logic->IsAdult && CanPlantBean(RR_DESERT_COLOSSUS, RG_DESERT_COLOSSUS_BEAN_SOUL)), + LOCATION(RC_COLOSSUS_GS_BEAN_PATCH, logic->CanSpawnSoilSkull(RG_DESERT_COLOSSUS_BEAN_SOUL) && logic->CanAttack()), + LOCATION(RC_COLOSSUS_GS_TREE, logic->IsAdult && logic->HookshotOrBoomerang() && logic->CanGetNightTimeGS()), + LOCATION(RC_COLOSSUS_GS_HILL, logic->IsAdult && ((CanPlantBean(RR_DESERT_COLOSSUS, RG_DESERT_COLOSSUS_BEAN_SOUL) && logic->CanAttack()) || logic->CanUse(RG_LONGSHOT) || (ctx->GetTrickOption(RT_COLOSSUS_GS) && logic->CanUse(RG_HOOKSHOT))) && logic->CanGetNightTimeGS()), + LOCATION(RC_COLOSSUS_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->HasItem(RG_DESERT_COLOSSUS_BEAN_SOUL) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_COLOSSUS_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->HasItem(RG_DESERT_COLOSSUS_BEAN_SOUL) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_COLOSSUS_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->HasItem(RG_DESERT_COLOSSUS_BEAN_SOUL) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_COLOSSUS_GOSSIP_STONE_FAIRY, logic->CallGossipFairy()), + LOCATION(RC_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_COLOSSUS_GOSSIP_STONE, true), + LOCATION(RC_COLOSSUS_WONDER_OASIS_TREE_1, (logic->IsAdult && logic->CanUse(RG_FAIRY_BOW)) || (logic->IsChild && logic->CanUse(RG_FAIRY_SLINGSHOT))), + LOCATION(RC_COLOSSUS_WONDER_OASIS_TREE_2, (logic->IsAdult && logic->CanUse(RG_FAIRY_BOW)) || (logic->IsChild && logic->CanUse(RG_FAIRY_SLINGSHOT))), + LOCATION(RC_COLOSSUS_WONDER_OASIS_CHILD_TREE, logic->IsChild && logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_COLOSSUS_WONDER_GF_TREE_1, (logic->IsAdult && logic->CanUse(RG_FAIRY_BOW)) || (logic->IsChild && logic->CanUse(RG_FAIRY_SLINGSHOT))), + LOCATION(RC_COLOSSUS_WONDER_GF_TREE_2, (logic->IsAdult && logic->CanUse(RG_FAIRY_BOW)) || (logic->IsChild && logic->CanUse(RG_FAIRY_SLINGSHOT))), }, { //Exits //You can kinda get the fairies without entering the water, but it relies on them cooperating and leevers are jerks. should be a trick diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_fortress.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_fortress.cpp index e9115890b..bc2016ef5 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_fortress.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_fortress.cpp @@ -12,6 +12,7 @@ void RegionTable_Init_GerudoFortress() { LOCATION(RC_GF_OUTSKIRTS_NE_CRATE, (logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD)) && logic->CanBreakCrates()), LOCATION(RC_GF_OUTSKIRTS_NW_CRATE, (logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD)) && logic->CanBreakCrates()), LOCATION(RC_GF_EAST_EXIT_ARROW_SIGN, logic->CanRead()), + LOCATION(RC_GF_WONDER_ENTRANCE_SIGN, logic->CanUse(RG_HOOKSHOT)), }, { //Exits ENTRANCE(RR_GV_FORTRESS_SIDE, true), @@ -207,13 +208,13 @@ void RegionTable_Init_GerudoFortress() { //there's a trick to reach RR_GF_LONG_ROOF //For some reason, you take fall damage if you backflip onto the fortress but not onto the sand //It's unintuitive to avoid being caught on landing, but that sends you to the same place anyway... - ENTRANCE(RR_GF_OUTSKIRTS, true), - ENTRANCE(RR_GF_NEAR_CHEST, logic->CanUse(RG_LONGSHOT)), - ENTRANCE(RR_GF_BELOW_CHEST, logic->TakeDamage()), - ENTRANCE(RR_GF_JAIL_WINDOW, logic->CanUse(RG_HOOKSHOT)), - ENTRANCE(RR_TH_BREAK_ROOM_CORRIDOR, true), - ENTRANCE(RR_GF_TOWER, ctx->GetTrickOption(RT_GF_ADULT_SKIP_WASTELAND_GATE) && logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS) && logic->CanJumpslash() && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)), - ENTRANCE(RR_GF_OUTSIDE_GATE, ctx->GetTrickOption(RT_GF_ADULT_SKIP_WASTELAND_GATE) && logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS) && logic->CanJumpslash()), + ENTRANCE(RR_GF_OUTSKIRTS, ctx->GetTrickOption(RT_UNINTUITIVE_JUMPS) || logic->TakeDamage()), + ENTRANCE(RR_GF_NEAR_CHEST, logic->CanUse(RG_LONGSHOT)), + ENTRANCE(RR_GF_BELOW_CHEST, logic->TakeDamage()), + ENTRANCE(RR_GF_JAIL_WINDOW, logic->CanUse(RG_HOOKSHOT)), + ENTRANCE(RR_TH_BREAK_ROOM_UPPER_CORRIDOR, true), + ENTRANCE(RR_GF_TOWER, ctx->GetTrickOption(RT_GF_ADULT_SKIP_WASTELAND_GATE) && logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS) && logic->CanJumpslash() && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)), + ENTRANCE(RR_GF_OUTSIDE_GATE, ctx->GetTrickOption(RT_GF_ADULT_SKIP_WASTELAND_GATE) && logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS) && logic->CanJumpslash()), }); areaTable[RR_GF_JAIL_WINDOW] = Region("GF Jail Window", SCENE_GERUDOS_FORTRESS, {}, {}, { @@ -245,6 +246,7 @@ void RegionTable_Init_GerudoFortress() { LOCATION(RC_GF_SOUTH_TARGET_EAST_CRATE, logic->CanBreakCrates()), LOCATION(RC_GF_SOUTH_TARGET_WEST_CRATE, logic->CanBreakCrates()), LOCATION(RC_GF_HBA_RECTANGLE_SIGN, logic->IsAdult && logic->CanRead()), + LOCATION(RC_GF_WONDER_ARCHERY_SIGN, logic->CanUse(RG_HOOKSHOT)), }, { //Exits ENTRANCE(RR_GF_OUTSIDE_GTG, logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp index 7c1fd800d..7f7f6fe57 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp @@ -40,6 +40,8 @@ void RegionTable_Init_GerudoValley() { LOCATION(RC_GV_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_GV_GOSSIP_STONE, true), LOCATION(RC_GV_NEAR_COW_CRATE, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_GV_WONDER_LOWER_WATERFALL, logic->IsAdult), + LOCATION(RC_GV_WONDER_UPPER_WATERFALL, logic->IsAdult && CanPlantBean(RR_GV_UPPER_STREAM, RG_GERUDO_VALLEY_BEAN_SOUL)), }, { //Exits ENTRANCE(RR_GV_UPPER_STREAM_WATER, true), @@ -62,6 +64,7 @@ void RegionTable_Init_GerudoValley() { areaTable[RR_GV_WATERFALL_ALCOVE] = Region("GV Waterfall Alcove", SCENE_GERUDO_VALLEY, {}, { //Locations LOCATION(RC_GV_WATERFALL_FREESTANDING_POH, true), + LOCATION(RC_GV_WONDER_UPPER_WATERFALL, logic->IsAdult), }, { //Exits ENTRANCE(RR_GV_UPPER_STREAM, logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS)), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp index 41e1904c2..a168841b0 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp @@ -112,6 +112,21 @@ void RegionTable_Init_Graveyard() { LOCATION(RC_GRAVEYARD_DAMPE_RACE_RUPEE_6, true), LOCATION(RC_GRAVEYARD_DAMPE_RACE_RUPEE_7, true), LOCATION(RC_GRAVEYARD_DAMPE_RACE_RUPEE_8, true), + LOCATION(RC_GY_WONDER_DAMPE_RACE_1, true), + LOCATION(RC_GY_WONDER_DAMPE_RACE_2, true), + LOCATION(RC_GY_WONDER_DAMPE_RACE_3, true), + LOCATION(RC_GY_WONDER_DAMPE_RACE_4, true), + LOCATION(RC_GY_WONDER_DAMPE_RACE_5, true), + LOCATION(RC_GY_WONDER_DAMPE_RACE_6, true), + LOCATION(RC_GY_WONDER_DAMPE_RACE_7, true), + LOCATION(RC_GY_WONDER_DAMPE_RACE_8, true), + LOCATION(RC_GY_WONDER_DAMPE_RACE_9, true), + LOCATION(RC_GY_WONDER_DAMPE_RACE_10, true), + LOCATION(RC_GY_WONDER_DAMPE_RACE_11, true), + LOCATION(RC_GY_WONDER_DAMPE_RACE_12, true), + LOCATION(RC_GY_WONDER_DAMPE_RACE_13, true), + LOCATION(RC_GY_WONDER_DAMPE_RACE_14, true), + LOCATION(RC_GY_WONDER_DAMPE_RACE_15, true), }, { //Exits ENTRANCE(RR_THE_GRAVEYARD, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp index c11d02741..9445f7bf6 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp @@ -175,6 +175,9 @@ void RegionTable_Init_HyruleField() { LOCATION(RC_HF_CENTER_EXIT_ARROW_SIGN, logic->CanRead()), LOCATION(RC_HF_RIVER_EXIT_ARROW_SIGN, logic->CanRead()), LOCATION(RC_HF_STAIRS_EXIT_ARROW_SIGN, logic->CanRead()), + LOCATION(RC_HF_WONDER_BRIDGE_1, logic->IsChild), + LOCATION(RC_HF_WONDER_BRIDGE_2, logic->IsChild), + LOCATION(RC_HF_WONDER_BRIDGE_3, logic->IsChild), }, { //Exits ENTRANCE(RR_LW_BRIDGE, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp index 77eced01d..5cf4718c7 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp @@ -64,6 +64,7 @@ void RegionTable_Init_Kakariko() { LOCATION(RC_KAK_WELL_RECTANGLE_SIGN, logic->IsChild && logic->CanRead()), LOCATION(RC_KAK_SOUTHEAST_EXIT_ARROW_SIGN, logic->CanRead()), LOCATION(RC_KAK_FRONT_GATE_ARROW_SIGN, logic->CanRead()), + LOCATION(RC_KAK_WONDER_UNDER_CONSTRUCTION, logic->IsChild), }, { //Exits ENTRANCE(RR_HYRULE_FIELD, true), @@ -166,7 +167,8 @@ void RegionTable_Init_Kakariko() { areaTable[RR_KAK_IMPAS_HOUSE] = Region("Kak Impas House", SCENE_IMPAS_HOUSE, {}, { //Locations - LOCATION(RC_KAK_IMPAS_HOUSE_COW, logic->CanUse(RG_EPONAS_SONG)), + LOCATION(RC_KAK_IMPAS_HOUSE_COW, logic->CanUse(RG_EPONAS_SONG)), + LOCATION(RC_KAK_WONDER_ABOVE_COW, true), }, { //Exits ENTRANCE(RR_KAKARIKO_VILLAGE, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/kokiri_forest.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/kokiri_forest.cpp index 70ce57bf5..123b451bb 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/kokiri_forest.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/kokiri_forest.cpp @@ -82,6 +82,12 @@ void RegionTable_Init_KokiriForest() { LOCATION(RC_KF_TRAINING_CENTER_ENTRANCE_ARROW_SIGN, logic->IsChild && logic->CanRead()), LOCATION(RC_KF_INNER_TRAINING_CENTER_ARROW_SIGN, logic->IsChild && logic->CanRead()), LOCATION(RC_KF_KNOW_IT_ALL_BROTHERS_HOUSE_ARROW_SIGN, logic->CanRead()), + LOCATION(RC_KF_WONDER_TRAINING_1, logic->IsChild), + LOCATION(RC_KF_WONDER_TRAINING_2, logic->IsChild), + LOCATION(RC_KF_WONDER_TRAINING_3, logic->IsChild), + LOCATION(RC_KF_WONDER_SIGN, logic->IsChild && logic->CanJumpslashExceptHammer()), + LOCATION(RC_KF_WONDER_PLATFORMS_1, logic->IsChild), + LOCATION(RC_KF_WONDER_PLATFORMS_2, logic->IsChild), }, { //Exits ENTRANCE(RR_KF_BOULDER_LOOP, logic->CanUse(RG_CRAWL)), @@ -108,6 +114,8 @@ void RegionTable_Init_KokiriForest() { LOCATION(RC_KF_CHILD_GRASS_MAZE_2, logic->IsChild && logic->CanCutShrubs()), LOCATION(RC_KF_CHILD_GRASS_MAZE_3, logic->IsChild && logic->CanCutShrubs()), LOCATION(RC_KF_AFTER_CRAWLSPACE_RECTANGLE_SIGN, logic->IsChild && logic->CanRead()), + LOCATION(RC_KF_WONDER_CRAWL_GRASS_1, logic->IsChild), + LOCATION(RC_KF_WONDER_CRAWL_GRASS_2, logic->IsChild), }, { //Exits ENTRANCE(RR_KOKIRI_FOREST, logic->CanUse(RG_CRAWL)), @@ -198,6 +206,7 @@ void RegionTable_Init_KokiriForest() { LOCATION(RC_KF_SHOP_ITEM_6, logic->HasItem(RG_SPEAK_KOKIRI) && GetCheckPrice() <= GetWalletCapacity()), LOCATION(RC_KF_SHOP_ITEM_7, logic->HasItem(RG_SPEAK_KOKIRI) && GetCheckPrice() <= GetWalletCapacity()), LOCATION(RC_KF_SHOP_ITEM_8, logic->HasItem(RG_SPEAK_KOKIRI) && GetCheckPrice() <= GetWalletCapacity()), + LOCATION(RC_KF_WONDER_SHOP, true), }, { //Exits ENTRANCE(RR_KOKIRI_FOREST, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/lon_lon_ranch.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/lon_lon_ranch.cpp index c71745f10..400b3d98f 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/lon_lon_ranch.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/lon_lon_ranch.cpp @@ -11,20 +11,22 @@ void RegionTable_Init_LonLonRanch() { EVENT_ACCESS(LOGIC_LINKS_COW, logic->HasItem(RG_CHILD_WALLET) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->CanUse(RG_EPONAS_SONG) && logic->IsAdult && logic->AtDay), }, { //Locations - LOCATION(RC_SONG_FROM_MALON, logic->IsChild && logic->HasItem(RG_ZELDAS_LETTER) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->HasItem(RG_FAIRY_OCARINA) && logic->AtDay), - LOCATION(RC_LLR_GS_TREE, logic->IsChild && logic->CanBonkTrees() && (logic->HasItem(RG_POWER_BRACELET) || logic->CanKillEnemy(RE_GOLD_SKULLTULA))), - LOCATION(RC_LLR_GS_RAIN_SHED, logic->IsChild && logic->CanGetNightTimeGS() && (logic->HasItem(RG_POWER_BRACELET) || logic->CanKillEnemy(RE_GOLD_SKULLTULA))), - LOCATION(RC_LLR_GS_HOUSE_WINDOW, logic->IsChild && logic->HookshotOrBoomerang() && logic->CanGetNightTimeGS()), - LOCATION(RC_LLR_GS_BACK_WALL, logic->IsChild && logic->HookshotOrBoomerang() && logic->CanGetNightTimeGS()), - LOCATION(RC_LLR_FRONT_POT_1, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_LLR_FRONT_POT_2, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_LLR_FRONT_POT_3, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_LLR_FRONT_POT_4, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_LLR_RAIN_SHED_POT_1, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_LLR_RAIN_SHED_POT_2, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_LLR_RAIN_SHED_POT_3, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_LLR_NEAR_TREE_CRATE, logic->IsChild && logic->CanBreakCrates()), - LOCATION(RC_LLR_TREE, logic->IsChild && logic->CanBonkTrees()), + LOCATION(RC_SONG_FROM_MALON, logic->IsChild && logic->HasItem(RG_ZELDAS_LETTER) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->HasItem(RG_FAIRY_OCARINA) && logic->AtDay), + LOCATION(RC_LLR_GS_TREE, logic->IsChild && logic->CanBonkTrees() && (logic->HasItem(RG_POWER_BRACELET) || logic->CanKillEnemy(RE_GOLD_SKULLTULA))), + LOCATION(RC_LLR_GS_RAIN_SHED, logic->IsChild && logic->CanGetNightTimeGS() && (logic->HasItem(RG_POWER_BRACELET) || logic->CanKillEnemy(RE_GOLD_SKULLTULA))), + LOCATION(RC_LLR_GS_HOUSE_WINDOW, logic->IsChild && logic->HookshotOrBoomerang() && logic->CanGetNightTimeGS()), + LOCATION(RC_LLR_GS_BACK_WALL, logic->IsChild && logic->HookshotOrBoomerang() && logic->CanGetNightTimeGS()), + LOCATION(RC_LLR_FRONT_POT_1, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_LLR_FRONT_POT_2, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_LLR_FRONT_POT_3, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_LLR_FRONT_POT_4, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_LLR_RAIN_SHED_POT_1, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_LLR_RAIN_SHED_POT_2, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_LLR_RAIN_SHED_POT_3, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_LLR_NEAR_TREE_CRATE, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_LLR_TREE, logic->IsChild && logic->CanBonkTrees()), + LOCATION(RC_LLR_WONDER_BIG_FENCE, logic->IsAdult && logic->CanUse(RG_EPONAS_SONG) && (logic->HasItem(RG_CHILD_WALLET) || logic->Get(LOGIC_FREED_EPONA))), + LOCATION(RC_LLR_WONDER_SMALL_FENCE, logic->IsAdult && logic->CanUse(RG_EPONAS_SONG) && (logic->HasItem(RG_CHILD_WALLET) || logic->Get(LOGIC_FREED_EPONA))), }, { //Exits ENTRANCE(RR_HYRULE_FIELD, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/lost_woods.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/lost_woods.cpp index d6b1d5429..4b9e3278f 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/lost_woods.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/lost_woods.cpp @@ -48,6 +48,9 @@ void RegionTable_Init_LostWoods() { LOCATION(RC_LW_GRASS_1, logic->CanCutShrubs()), LOCATION(RC_LW_GRASS_2, logic->CanCutShrubs()), LOCATION(RC_LW_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_LW_WONDER_BACK_SKULL_KIDS_GRASS_1, logic->IsChild), + LOCATION(RC_LW_WONDER_BACK_SKULL_KIDS_GRASS_2, logic->IsChild), + LOCATION(RC_LW_WONDER_FRONT_SKULL_KIDS_GRASS, logic->IsChild), }, { //Exits ENTRANCE(RR_LW_FOREST_EXIT, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp index 352c35f12..6a4648527 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp @@ -28,6 +28,13 @@ void RegionTable_Init_Market() { LOCATION(RC_MK_SHOOTING_GALLERY_CRATE_1, logic->IsChild /*&& logic->CanRoll()*/), LOCATION(RC_MK_SHOOTING_GALLERY_CRATE_2, logic->IsChild /*&& logic->CanRoll()*/), LOCATION(RC_MARKET_TREE, logic->IsChild && logic->CanBonkTrees()), + LOCATION(RC_MKT_WONDER_DAY_1, logic->IsChild && logic->AtDay), + LOCATION(RC_MKT_WONDER_DAY_2, logic->IsChild && logic->AtDay), + LOCATION(RC_MKT_WONDER_DAY_3, logic->IsChild && logic->AtDay), + LOCATION(RC_MKT_WONDER_DAY_4, logic->IsChild && logic->AtDay), + LOCATION(RC_MKT_WONDER_DAY_5, logic->IsChild && logic->AtDay), + LOCATION(RC_MKT_WONDER_NIGHT_1, logic->IsChild && logic->AtNight), + LOCATION(RC_MKT_WONDER_NIGHT_2, logic->IsChild && logic->AtNight), }, { //Exits ENTRANCE(RR_MARKET_ENTRANCE, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/sacred_forest_meadow.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/sacred_forest_meadow.cpp index 8d6c7700e..bececec7e 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/sacred_forest_meadow.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/sacred_forest_meadow.cpp @@ -5,7 +5,10 @@ using namespace Rando; void RegionTable_Init_SacredForestMeadow() { // clang-format off - areaTable[RR_SFM_ENTRYWAY] = Region("SFM Entryway", SCENE_SACRED_FOREST_MEADOW, {}, {}, { + areaTable[RR_SFM_ENTRYWAY] = Region("SFM Entryway", SCENE_SACRED_FOREST_MEADOW, {}, { + //Locations + LOCATION(RC_SFM_WONDER_ENTRANCE, true), + }, { //Exits ENTRANCE(RR_LW_BEYOND_MIDO, true), ENTRANCE(RR_SACRED_FOREST_MEADOW, logic->IsAdult || logic->CanKillEnemy(RE_WOLFOS)), @@ -41,6 +44,11 @@ void RegionTable_Init_SacredForestMeadow() { LOCATION(RC_SFM_SARIA_GOSSIP_STONE_FAIRY, logic->CallGossipFairyExceptSuns()), LOCATION(RC_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_SFM_SARIA_GOSSIP_STONE, true), + LOCATION(RC_SFM_WONDER_MAZE_1, true), + LOCATION(RC_SFM_WONDER_MAZE_2, true), + LOCATION(RC_SFM_WONDER_MAZE_3, true), + LOCATION(RC_SFM_WONDER_MAZE_4, true), + LOCATION(RC_SFM_WONDER_MAZE_5, true), }, { //Exits ENTRANCE(RR_FOREST_TEMPLE_ENTRYWAY, logic->CanUse(RG_HOOKSHOT)), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/thieves_hideout.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/thieves_hideout.cpp index 747354103..e9a448c96 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/thieves_hideout.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/thieves_hideout.cpp @@ -17,6 +17,8 @@ void RegionTable_Init_ThievesHideout() { LOCATION(RC_TH_1_TORCH_CELL_MID_POT, logic->CanBreakPots()), LOCATION(RC_TH_1_TORCH_CELL_LEFT_POT, logic->CanBreakPots()), LOCATION(RC_TH_1_TORCH_CELL_CRATE, logic->CanBreakCrates()), + LOCATION(RC_TH_WONDER_1_TORCH_1, logic->CanUse(RG_FAIRY_BOW)), + LOCATION(RC_TH_WONDER_1_TORCH_2, logic->CanUse(RG_FAIRY_BOW)), LOCATION(RC_TH_FREED_CARPENTERS, logic->Get(LOGIC_TH_RESCUED_ALL_CARPENTERS)), }, { //Exits @@ -30,17 +32,19 @@ void RegionTable_Init_ThievesHideout() { EVENT_ACCESS(LOGIC_TH_RESCUED_ALL_CARPENTERS, logic->SmallKeys(SCENE_THIEVES_HIDEOUT, ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_NORMAL) ? 4 : 1) && logic->Get(LOGIC_TH_COULD_FREE_1_TORCH_CARPENTER) && logic->Get(LOGIC_TH_COULD_FREE_DOUBLE_CELL_CARPENTER) && logic->Get(LOGIC_TH_COULD_FREE_DEAD_END_CARPENTER) && logic->Get(LOGIC_TH_COULD_FREE_SLOPE_CARPENTER)), }, { //Locations - LOCATION(RC_TH_DOUBLE_CELL_CARPENTER, logic->CanKillEnemy(RE_GERUDO_WARRIOR)), - LOCATION(RC_TH_NEAR_DOUBLE_CELL_RIGHT_POT, logic->CanBreakPots()), - LOCATION(RC_TH_NEAR_DOUBLE_CELL_MID_POT, logic->CanBreakPots()), - LOCATION(RC_TH_NEAR_DOUBLE_CELL_LEFT_POT, logic->CanBreakPots()), - LOCATION(RC_TH_RIGHTMOST_JAILED_POT, logic->CanBreakPots()), - LOCATION(RC_TH_RIGHT_MIDDLE_JAILED_POT, logic->CanBreakPots()), - LOCATION(RC_TH_LEFT_MIDDLE_JAILED_POT, logic->CanBreakPots()), - LOCATION(RC_TH_LEFTMOST_JAILED_POT, logic->CanBreakPots()), - LOCATION(RC_TH_DOUBLE_CELL_LEFT_CRATE, logic->CanBreakCrates()), - LOCATION(RC_TH_DOUBLE_CELL_RIGHT_CRATE, logic->CanBreakCrates()), - LOCATION(RC_TH_FREED_CARPENTERS, logic->Get(LOGIC_TH_RESCUED_ALL_CARPENTERS)), + LOCATION(RC_TH_DOUBLE_CELL_CARPENTER, logic->CanKillEnemy(RE_GERUDO_WARRIOR)), + LOCATION(RC_TH_NEAR_DOUBLE_CELL_RIGHT_POT, logic->CanBreakPots()), + LOCATION(RC_TH_NEAR_DOUBLE_CELL_MID_POT, logic->CanBreakPots()), + LOCATION(RC_TH_NEAR_DOUBLE_CELL_LEFT_POT, logic->CanBreakPots()), + LOCATION(RC_TH_RIGHTMOST_JAILED_POT, logic->CanBreakPots()), + LOCATION(RC_TH_RIGHT_MIDDLE_JAILED_POT, logic->CanBreakPots()), + LOCATION(RC_TH_LEFT_MIDDLE_JAILED_POT, logic->CanBreakPots()), + LOCATION(RC_TH_LEFTMOST_JAILED_POT, logic->CanBreakPots()), + LOCATION(RC_TH_DOUBLE_CELL_LEFT_CRATE, logic->CanBreakCrates()), + LOCATION(RC_TH_DOUBLE_CELL_RIGHT_CRATE, logic->CanBreakCrates()), + LOCATION(RC_TH_WONDER_DOUBLE_JAIL_LOWER_EXIT, logic->CanUse(RG_FAIRY_BOW)), + LOCATION(RC_TH_WONDER_DOUBLE_JAIL_UPPER_EXIT, logic->CanUse(RG_FAIRY_BOW)), + LOCATION(RC_TH_FREED_CARPENTERS, logic->Get(LOGIC_TH_RESCUED_ALL_CARPENTERS)), }, { //Exits ENTRANCE(RR_GF_OUTSKIRTS, true), @@ -54,9 +58,11 @@ void RegionTable_Init_ThievesHideout() { EVENT_ACCESS(LOGIC_TH_RESCUED_ALL_CARPENTERS, logic->SmallKeys(SCENE_THIEVES_HIDEOUT, ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_NORMAL) ? 4 : 1) && logic->Get(LOGIC_TH_COULD_FREE_1_TORCH_CARPENTER) && logic->Get(LOGIC_TH_COULD_FREE_DOUBLE_CELL_CARPENTER) && logic->Get(LOGIC_TH_COULD_FREE_DEAD_END_CARPENTER) && logic->Get(LOGIC_TH_COULD_FREE_SLOPE_CARPENTER)), }, { //Locations - LOCATION(RC_TH_DEAD_END_CARPENTER, logic->CanKillEnemy(RE_GERUDO_WARRIOR)), - LOCATION(RC_TH_DEAD_END_CELL_CRATE, logic->CanBreakCrates()), - LOCATION(RC_TH_FREED_CARPENTERS, logic->Get(LOGIC_TH_RESCUED_ALL_CARPENTERS)), + LOCATION(RC_TH_DEAD_END_CARPENTER, logic->CanKillEnemy(RE_GERUDO_WARRIOR)), + LOCATION(RC_TH_DEAD_END_CELL_CRATE, logic->CanBreakCrates()), + LOCATION(RC_TH_WONDER_DEAD_END_SKULL_ENTRANCE, logic->CanUse(RG_FAIRY_BOW)), + LOCATION(RC_TH_WONDER_DEAD_END_SKULL_NEAR_JAIL, logic->CanUse(RG_FAIRY_BOW)), + LOCATION(RC_TH_FREED_CARPENTERS, logic->Get(LOGIC_TH_RESCUED_ALL_CARPENTERS)), }, { //Exits ENTRANCE(RR_GF_BELOW_GS, true), @@ -68,10 +74,12 @@ void RegionTable_Init_ThievesHideout() { EVENT_ACCESS(LOGIC_TH_RESCUED_ALL_CARPENTERS, logic->SmallKeys(SCENE_THIEVES_HIDEOUT, ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_NORMAL) ? 4 : 1) && logic->Get(LOGIC_TH_COULD_FREE_1_TORCH_CARPENTER) && logic->Get(LOGIC_TH_COULD_FREE_DOUBLE_CELL_CARPENTER) && logic->Get(LOGIC_TH_COULD_FREE_DEAD_END_CARPENTER) && logic->Get(LOGIC_TH_COULD_FREE_SLOPE_CARPENTER)), }, { //Locations - LOCATION(RC_TH_STEEP_SLOPE_CARPENTER, logic->CanKillEnemy(RE_GERUDO_WARRIOR)), - LOCATION(RC_TH_STEEP_SLOPE_RIGHT_POT, logic->CanBreakPots()), - LOCATION(RC_TH_STEEP_SLOPE_LEFT_POT, logic->CanBreakPots()), - LOCATION(RC_TH_FREED_CARPENTERS, logic->Get(LOGIC_TH_RESCUED_ALL_CARPENTERS)), + LOCATION(RC_TH_STEEP_SLOPE_CARPENTER, logic->CanKillEnemy(RE_GERUDO_WARRIOR)), + LOCATION(RC_TH_STEEP_SLOPE_RIGHT_POT, logic->CanBreakPots()), + LOCATION(RC_TH_STEEP_SLOPE_LEFT_POT, logic->CanBreakPots()), + LOCATION(RC_TH_WONDER_STEEP_SLOPE_LOWER_EXIT, logic->CanUse(RG_FAIRY_BOW)), + LOCATION(RC_TH_WONDER_STEEP_SLOPE_UPPER_EXIT, logic->CanUse(RG_FAIRY_BOW)), + LOCATION(RC_TH_FREED_CARPENTERS, logic->Get(LOGIC_TH_RESCUED_ALL_CARPENTERS)), }, { //Exits ENTRANCE(RR_GF_BOTTOM_OF_LOWER_VINES, true), @@ -93,10 +101,12 @@ void RegionTable_Init_ThievesHideout() { areaTable[RR_TH_KITCHEN_MAIN] = Region("Thieves Hideout Kitchen Bottom", SCENE_THIEVES_HIDEOUT, {}, { //Locations - LOCATION(RC_TH_KITCHEN_POT_1, logic->CanBreakPots() && logic->CanPassEnemy(RE_GERUDO_GUARD)), - LOCATION(RC_TH_KITCHEN_POT_2, logic->CanBreakPots() && logic->CanPassEnemy(RE_GERUDO_GUARD)), - LOCATION(RC_TH_KITCHEN_CRATE, logic->CanBreakCrates() && logic->CanPassEnemy(RE_GERUDO_GUARD)), - LOCATION(RC_TH_KITCHEN_SUN_FAIRY, logic->CanPassEnemy(RE_GERUDO_GUARD) && logic->CanUse(RG_SUNS_SONG)), + LOCATION(RC_TH_KITCHEN_POT_1, logic->CanBreakPots() && logic->CanPassEnemy(RE_GERUDO_GUARD)), + LOCATION(RC_TH_KITCHEN_POT_2, logic->CanBreakPots() && logic->CanPassEnemy(RE_GERUDO_GUARD)), + LOCATION(RC_TH_KITCHEN_CRATE, logic->CanBreakCrates() && logic->CanPassEnemy(RE_GERUDO_GUARD)), + LOCATION(RC_TH_KITCHEN_SUN_FAIRY, logic->CanPassEnemy(RE_GERUDO_GUARD) && logic->CanUse(RG_SUNS_SONG)), + LOCATION(RC_TH_WONDER_KITCHEN_SKULL, logic->CanUse(RG_FAIRY_BOW)), + LOCATION(RC_TH_WONDER_KITCHEN_SOUP, (logic->TakeDamage() || logic->IsAdult || logic->CanUse(RG_GORON_TUNIC)) && logic->CanPassEnemy(RE_GERUDO_GUARD)), }, { //Exits ENTRANCE(RR_TH_KITCHEN_CORRIDOR, logic->CanPassEnemy(RE_GERUDO_GUARD)), @@ -142,14 +152,25 @@ void RegionTable_Init_ThievesHideout() { (logic->CanPassEnemy(RE_GERUDO_GUARD) && logic->HasExplosives() && logic->CanUse(RG_BOOMERANG))), }, { //Exits - ENTRANCE(RR_GF_BELOW_CHEST, logic->CanPassEnemy(RE_GERUDO_GUARD)), - //Implies logic->CanPassEnemy(RE_GERUDO_GUARD) - ENTRANCE(RR_TH_BREAK_ROOM_CORRIDOR, logic->CanUse(RG_HOOKSHOT)), + ENTRANCE(RR_GF_BELOW_CHEST, logic->CanPassEnemy(RE_GERUDO_GUARD)), + ENTRANCE(RR_TH_BREAK_ROOM_LOWER_CORRIDOR, logic->CanPassEnemy(RE_GERUDO_GUARD)), }); - areaTable[RR_TH_BREAK_ROOM_CORRIDOR] = Region("Thieves Hideout Break Room", SCENE_THIEVES_HIDEOUT, {}, {}, { + areaTable[RR_TH_BREAK_ROOM_LOWER_CORRIDOR] = Region("Thieves Hideout Break Room", SCENE_THIEVES_HIDEOUT, {}, { + //Locations + LOCATION(RC_TH_WONDER_BREAK_ROOM_BOTTOM_SKULL, logic->CanUse(RG_FAIRY_BOW)), + }, { + //Exits + ENTRANCE(RR_TH_BREAK_ROOM, logic->CanPassEnemy(RE_GERUDO_GUARD)), + ENTRANCE(RR_TH_BREAK_ROOM_UPPER_CORRIDOR, logic->CanUse(RG_HOOKSHOT)), + }); + + areaTable[RR_TH_BREAK_ROOM_UPPER_CORRIDOR] = Region("Thieves Hideout Break Room", SCENE_THIEVES_HIDEOUT, {}, { + //Locations + LOCATION(RC_TH_WONDER_BREAK_ROOM_TOP_SKULL, logic->CanUse(RG_FAIRY_BOW)), + }, { //Exits - ENTRANCE(RR_TH_BREAK_ROOM, logic->CanUse(RG_HOOKSHOT)), + ENTRANCE(RR_TH_BREAK_ROOM_LOWER_CORRIDOR, logic->CanUse(RG_HOOKSHOT)), ENTRANCE(RR_GF_ABOVE_JAIL, true), }); } diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_fountain.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_fountain.cpp index da6a5f714..7c827315c 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_fountain.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_fountain.cpp @@ -32,6 +32,7 @@ void RegionTable_Init_ZorasFountain() { LOCATION(RC_ZF_LOG_BUTTERFLY_FAIRY, logic->IsChild && logic->AtDay && logic->CanUse(RG_STICKS)), LOCATION(RC_ZF_JABU_JABU_PLATFORM_RECTANGLE_SIGN, logic->IsChild && logic->CanRead()), LOCATION(RC_ZF_ENTRANCE_ARROW_SIGN, logic->CanRead()), + LOCATION(RC_ZF_WONDER_ROCK, logic->IsAdult && logic->ReachScarecrow()), }, { //Exits ENTRANCE(RR_ZD_BEHIND_KING_ZORA, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp index a4dff23b3..defbf6f79 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp @@ -7,20 +7,25 @@ void RegionTable_Init_ZoraRiver() { // clang-format off areaTable[RR_ZR_FRONT] = Region("ZR Front", SCENE_ZORAS_RIVER, {}, { //Locations - LOCATION(RC_ZR_GS_TREE, logic->IsChild && logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_CLOSE) && logic->CanBonkTrees()), - LOCATION(RC_ZR_GRASS_1, logic->CanCutShrubs()), - LOCATION(RC_ZR_GRASS_2, logic->CanCutShrubs()), - LOCATION(RC_ZR_GRASS_3, logic->CanCutShrubs()), - LOCATION(RC_ZR_GRASS_4, logic->CanCutShrubs()), - LOCATION(RC_ZR_GRASS_5, logic->CanCutShrubs()), - LOCATION(RC_ZR_GRASS_6, logic->CanCutShrubs()), - LOCATION(RC_ZR_GRASS_7, logic->CanCutShrubs()), - LOCATION(RC_ZR_GRASS_8, logic->CanCutShrubs()), - LOCATION(RC_ZR_GRASS_9, logic->CanCutShrubs()), - LOCATION(RC_ZR_GRASS_10, logic->CanCutShrubs()), - LOCATION(RC_ZR_GRASS_11, logic->CanCutShrubs()), - LOCATION(RC_ZR_GRASS_12, logic->CanCutShrubs()), - LOCATION(RC_ZR_TREE, logic->IsChild && logic->CanBonkTrees()), + LOCATION(RC_ZR_GS_TREE, logic->IsChild && logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_CLOSE) && logic->CanBonkTrees()), + LOCATION(RC_ZR_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_9, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_10, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_11, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_12, logic->CanCutShrubs()), + LOCATION(RC_ZR_TREE, logic->IsChild && logic->CanBonkTrees()), + // Require backflip with Iron Boots + LOCATION(RC_ZR_WONDER_LOWER_RIVER_1, logic->IsChild && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS))), + LOCATION(RC_ZR_WONDER_LOWER_RIVER_2, logic->IsChild && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS))), + LOCATION(RC_ZR_WONDER_LOWER_RIVER_3, logic->IsChild && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS))), + LOCATION(RC_ZR_WONDER_LOWER_RIVER_4, logic->IsChild && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS))), }, { //Exits ENTRANCE(RR_ZORAS_RIVER, logic->IsAdult || logic->BlastOrSmash() || logic->CanUse(RG_HOVER_BOOTS)), @@ -59,6 +64,33 @@ void RegionTable_Init_ZoraRiver() { LOCATION(RC_ZR_NEAR_ROCK_CIRCLE_BUTTERFLY_FAIRY, logic->IsChild && logic->CanUse(RG_STICKS)), LOCATION(RC_ZR_WATERFALL_BUTTERFLY_FAIRY, logic->IsChild && logic->CanUse(RG_STICKS)), LOCATION(RC_ZR_SLEEPLESS_WATERFALL_PLAQUE, logic->CanRead()), + LOCATION(RC_ZR_WONDER_NEAR_DOMAIN_1, logic->IsChild && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS))), // RANDOTODO: Add trick for swimless + LOCATION(RC_ZR_WONDER_NEAR_DOMAIN_2, logic->IsChild && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS))), + LOCATION(RC_ZR_WONDER_NEAR_DOMAIN_3, logic->IsChild && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS))), + LOCATION(RC_ZR_WONDER_NEAR_DOMAIN_4, logic->IsChild && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS))), + LOCATION(RC_ZR_WONDER_BEFORE_LADDER_1, logic->IsChild && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS))), + LOCATION(RC_ZR_WONDER_BEFORE_LADDER_2, logic->IsChild && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS))), + LOCATION(RC_ZR_WONDER_BEFORE_LADDER_3, logic->IsChild && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS))), + LOCATION(RC_ZR_WONDER_BEFORE_LADDER_4, logic->IsChild && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS))), + LOCATION(RC_ZR_WONDER_BEFORE_LADDER_5, logic->IsChild && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS))), + LOCATION(RC_ZR_WONDER_BEFORE_LADDER_6, logic->IsChild && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS))), + LOCATION(RC_ZR_WONDER_AFTER_LADDER_1, logic->IsChild && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS))), + LOCATION(RC_ZR_WONDER_AFTER_LADDER_2, logic->IsChild && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS))), + LOCATION(RC_ZR_WONDER_AFTER_LADDER_3, logic->IsChild && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS))), + LOCATION(RC_ZR_WONDER_FROG_BRIDGE_1, logic->IsChild && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS))), + LOCATION(RC_ZR_WONDER_FROG_BRIDGE_2, logic->IsChild && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS))), + LOCATION(RC_ZR_WONDER_FROG_BRIDGE_3, logic->IsChild && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS))), + LOCATION(RC_ZR_WONDER_PILLARS_1, logic->IsChild && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS))), + LOCATION(RC_ZR_WONDER_PILLARS_2, logic->IsChild && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS))), + LOCATION(RC_ZR_WONDER_PILLARS_3, logic->IsChild && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS))), + LOCATION(RC_ZR_WONDER_PILLARS_4, logic->IsChild && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS))), + LOCATION(RC_ZR_WONDER_LOWER_LAND_BRIDGE_1, logic->IsChild && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS))), // Requires backflip with Iron Boots + LOCATION(RC_ZR_WONDER_LOWER_LAND_BRIDGE_2, logic->IsChild && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS))), + LOCATION(RC_ZR_WONDER_LOWER_LAND_BRIDGE_3, logic->IsChild && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS))), + LOCATION(RC_ZR_WONDER_LOWER_LAND_BRIDGE_4, logic->IsChild && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS))), + LOCATION(RC_ZR_WONDER_NEAR_CUCCO_1, logic->IsChild && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS))), // Requires backflip with Iron Boots + LOCATION(RC_ZR_WONDER_NEAR_CUCCO_2, logic->IsChild && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS))), // Requires backflip with Iron Boots + LOCATION(RC_ZR_WONDER_NEAR_CUCCO_3, logic->IsChild && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS))), }, { //Exits ENTRANCE(RR_ZR_FRONT, logic->IsAdult || logic->HasItem(RG_BRONZE_SCALE) || logic->HasItem(RG_POWER_BRACELET) || logic->BlastOrSmash() || logic->HasItem(RG_HOVER_BOOTS)), diff --git a/soh/soh/Enhancements/randomizer/option_descriptions.cpp b/soh/soh/Enhancements/randomizer/option_descriptions.cpp index a837b2ed2..017ed13ca 100644 --- a/soh/soh/Enhancements/randomizer/option_descriptions.cpp +++ b/soh/soh/Enhancements/randomizer/option_descriptions.cpp @@ -323,6 +323,17 @@ void Settings::CreateOptionDescriptions() { "Overworld - Only shuffle signs that are outside of dungeons.\n" "\n" "All Signs - Shuffle all signs."; + mOptionDescriptions[RSK_SHUFFLE_WONDER_ITEMS] = + "Wonder items will drop a randomized item the first time they're collected. " + "Wonder items will be marked with swirling particles.\n" + "\n" + "Off - Wonder items will not be shuffled.\n" + "\n" + "Dungeons - Only shuffle wonder items that are within dungeons.\n" + "\n" + "Overworld - Only shuffle wonder items that are outside of dungeons.\n" + "\n" + "All Wonder Items - Shuffle all wonder items."; mOptionDescriptions[RSK_SHUFFLE_FISHING_POLE] = "Shuffles the fishing pole into the item pool.\n" "\n" "The fishing pole is required to play the fishing pond minigame."; diff --git a/soh/soh/Enhancements/randomizer/particle_cmc.cpp b/soh/soh/Enhancements/randomizer/particle_cmc.cpp new file mode 100644 index 000000000..3aec408bc --- /dev/null +++ b/soh/soh/Enhancements/randomizer/particle_cmc.cpp @@ -0,0 +1,47 @@ +#include "particle_cmc.h" + +// Color of the circle for the particles +static Color_RGBA8 mainColors[7] = { + { 255, 255, 255, 255 }, // Junk + { 170, 50, 0, 255 }, // Lesser + { 250, 0, 0, 255 }, // Health + { 255, 255, 0, 255 }, // Boss Key + { 180, 180, 180, 255 }, // Small Key + { 0, 0, 0, 255 }, // Skulltula Token + { 250, 185, 40, 255 }, // Major +}; + +// Secondary color of the circle for the particles +static Color_RGBA8 secColors[7] = { + { 255, 255, 255, 255 }, // Junk + { 250, 75, 0, 255 }, // Lesser + { 0, 0, 255, 255 }, // Health + { 0, 200, 255, 255 }, // Boss Key + { 130, 130, 130, 255 }, // Small Key + { 255, 250, 190, 255 }, // Skulltula Token + { 255, 220, 135, 255 }, // Major +}; + +// Color of the faded flares stretching off the particles +static Color_RGBA8 flareColors[7] = { + { 135, 135, 135, 255 }, // Junk + { 255, 160, 100, 255 }, // Lesser + { 255, 125, 125, 255 }, // Health + { 0, 200, 255, 255 }, // Boss Key + { 100, 100, 100, 255 }, // Small Key + { 255, 255, 255, 255 }, // Skulltula Token + { 250, 220, 180, 255 }, // Major +}; + +Color_RGBA8 Randomizer_GetParticleCMCColor(GetItemCategory colorIndex, ParticleCMCColorType colorType) { + switch (colorType) { + case COLOR_PRIMARY: + return mainColors[colorIndex]; + case COLOR_SECONDARY: + return secColors[colorIndex]; + case COLOR_FLARE: + return flareColors[colorIndex]; + default: + return mainColors[colorIndex]; + } +} \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/particle_cmc.h b/soh/soh/Enhancements/randomizer/particle_cmc.h new file mode 100644 index 000000000..554adcf2e --- /dev/null +++ b/soh/soh/Enhancements/randomizer/particle_cmc.h @@ -0,0 +1,24 @@ +#pragma once + +#include "soh/OTRGlobals.h" + +#ifndef PARTICLE_CMC_H +#define PARTICLE_CMC_H + +typedef enum { + COLOR_PRIMARY, + COLOR_SECONDARY, + COLOR_FLARE, +} ParticleCMCColorType; + +#ifdef __cplusplus +extern "C" { +#endif + +Color_RGBA8 Randomizer_GetParticleCMCColor(GetItemCategory colorIndex, ParticleCMCColorType colorType); + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 23acc4c5a..c28a5425c 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -3054,6 +3054,222 @@ std::map rcToRandomizerInf = { { RC_DODONGOS_CAVERN_TOP_FLOOR_PEDESTAL, RAND_INF_DODONGOS_CAVERN_TOP_FLOOR_PEDESTAL }, { RC_SHADOW_TEMPLE_TRUTHSPINNER_RECTANGLE_SIGN, RAND_INF_SHADOW_TEMPLE_TRUTHSPINNER_RECTANGLE_SIGN }, { RC_SHADOW_TEMPLE_MQ_LOWER_PIT_RECTANGLE_SIGN, RAND_INF_SHADOW_TEMPLE_MQ_LOWER_PIT_RECTANGLE_SIGN }, + // Wonder Items + { RC_KF_WONDER_TRAINING_1, RAND_INF_KF_WONDER_TRAINING_1 }, + { RC_KF_WONDER_TRAINING_2, RAND_INF_KF_WONDER_TRAINING_2 }, + { RC_KF_WONDER_TRAINING_3, RAND_INF_KF_WONDER_TRAINING_3 }, + { RC_KF_WONDER_SHOP, RAND_INF_KF_WONDER_SHOP }, + { RC_KF_WONDER_SIGN, RAND_INF_KF_WONDER_SIGN }, + { RC_KF_WONDER_PLATFORMS_1, RAND_INF_KF_WONDER_PLATFORMS_1 }, + { RC_KF_WONDER_PLATFORMS_2, RAND_INF_KF_WONDER_PLATFORMS_2 }, + { RC_KF_WONDER_CRAWL_GRASS_1, RAND_INF_KF_WONDER_CRAWL_GRASS_1 }, + { RC_KF_WONDER_CRAWL_GRASS_2, RAND_INF_KF_WONDER_CRAWL_GRASS_2 }, + { RC_HF_WONDER_BRIDGE_1, RAND_INF_HF_WONDER_BRIDGE_1 }, + { RC_HF_WONDER_BRIDGE_2, RAND_INF_HF_WONDER_BRIDGE_2 }, + { RC_HF_WONDER_BRIDGE_3, RAND_INF_HF_WONDER_BRIDGE_3 }, + { RC_MKT_WONDER_DAY_1, RAND_INF_MKT_WONDER_DAY_1 }, + { RC_MKT_WONDER_DAY_2, RAND_INF_MKT_WONDER_DAY_2 }, + { RC_MKT_WONDER_DAY_3, RAND_INF_MKT_WONDER_DAY_3 }, + { RC_MKT_WONDER_DAY_4, RAND_INF_MKT_WONDER_DAY_4 }, + { RC_MKT_WONDER_DAY_5, RAND_INF_MKT_WONDER_DAY_5 }, + { RC_MKT_WONDER_NIGHT_1, RAND_INF_MKT_WONDER_NIGHT_1 }, + { RC_MKT_WONDER_NIGHT_2, RAND_INF_MKT_WONDER_NIGHT_2 }, + { RC_LLR_WONDER_BIG_FENCE, RAND_INF_LLR_WONDER_BIG_FENCE }, + { RC_LLR_WONDER_SMALL_FENCE, RAND_INF_LLR_WONDER_SMALL_FENCE }, + { RC_HC_WONDER_LEFT_TORCH, RAND_INF_HC_WONDER_LEFT_TORCH }, + { RC_HC_WONDER_RIGHT_TORCH, RAND_INF_HC_WONDER_RIGHT_TORCH }, + { RC_HC_WONDER_MOAT_1, RAND_INF_HC_WONDER_MOAT_1 }, + { RC_HC_WONDER_MOAT_2, RAND_INF_HC_WONDER_MOAT_2 }, + { RC_HC_WONDER_MOAT_3, RAND_INF_HC_WONDER_MOAT_3 }, + { RC_HC_WONDER_MOAT_4, RAND_INF_HC_WONDER_MOAT_4 }, + { RC_HC_WONDER_MOAT_5, RAND_INF_HC_WONDER_MOAT_5 }, + { RC_HC_WONDER_MOAT_6, RAND_INF_HC_WONDER_MOAT_6 }, + { RC_HC_WONDER_MOAT_7, RAND_INF_HC_WONDER_MOAT_7 }, + { RC_HC_WONDER_MOAT_8, RAND_INF_HC_WONDER_MOAT_8 }, + { RC_HC_WONDER_MOAT_9, RAND_INF_HC_WONDER_MOAT_9 }, + { RC_HC_WONDER_MOAT_10, RAND_INF_HC_WONDER_MOAT_10 }, + { RC_HC_WONDER_COURTYARD_RIGHT_WINDOW, RAND_INF_HC_WONDER_COURTYARD_RIGHT_WINDOW }, + { RC_HC_WONDER_COURTYARD_LEFT_WINDOW, RAND_INF_HC_WONDER_COURTYARD_LEFT_WINDOW }, + { RC_LW_WONDER_BACK_SKULL_KIDS_GRASS_1, RAND_INF_LW_WONDER_BACK_SKULL_KIDS_GRASS_1 }, + { RC_LW_WONDER_BACK_SKULL_KIDS_GRASS_2, RAND_INF_LW_WONDER_BACK_SKULL_KIDS_GRASS_2 }, + { RC_LW_WONDER_FRONT_SKULL_KIDS_GRASS, RAND_INF_LW_WONDER_FRONT_SKULL_KIDS_GRASS }, + { RC_SFM_WONDER_ENTRANCE, RAND_INF_SFM_WONDER_ENTRANCE }, + { RC_SFM_WONDER_MAZE_1, RAND_INF_SFM_WONDER_MAZE_1 }, + { RC_SFM_WONDER_MAZE_2, RAND_INF_SFM_WONDER_MAZE_2 }, + { RC_SFM_WONDER_MAZE_3, RAND_INF_SFM_WONDER_MAZE_3 }, + { RC_SFM_WONDER_MAZE_4, RAND_INF_SFM_WONDER_MAZE_4 }, + { RC_SFM_WONDER_MAZE_5, RAND_INF_SFM_WONDER_MAZE_5 }, + { RC_KAK_WONDER_UNDER_CONSTRUCTION, RAND_INF_KAK_WONDER_UNDER_CONSTRUCTION }, + { RC_KAK_WONDER_ABOVE_COW, RAND_INF_KAK_WONDER_ABOVE_COW }, + { RC_GY_WONDER_DAMPE_RACE_1, RAND_INF_GY_WONDER_DAMPE_RACE_1 }, + { RC_GY_WONDER_DAMPE_RACE_2, RAND_INF_GY_WONDER_DAMPE_RACE_2 }, + { RC_GY_WONDER_DAMPE_RACE_3, RAND_INF_GY_WONDER_DAMPE_RACE_3 }, + { RC_GY_WONDER_DAMPE_RACE_4, RAND_INF_GY_WONDER_DAMPE_RACE_4 }, + { RC_GY_WONDER_DAMPE_RACE_5, RAND_INF_GY_WONDER_DAMPE_RACE_5 }, + { RC_GY_WONDER_DAMPE_RACE_6, RAND_INF_GY_WONDER_DAMPE_RACE_6 }, + { RC_GY_WONDER_DAMPE_RACE_7, RAND_INF_GY_WONDER_DAMPE_RACE_7 }, + { RC_GY_WONDER_DAMPE_RACE_8, RAND_INF_GY_WONDER_DAMPE_RACE_8 }, + { RC_GY_WONDER_DAMPE_RACE_9, RAND_INF_GY_WONDER_DAMPE_RACE_9 }, + { RC_GY_WONDER_DAMPE_RACE_10, RAND_INF_GY_WONDER_DAMPE_RACE_10 }, + { RC_GY_WONDER_DAMPE_RACE_11, RAND_INF_GY_WONDER_DAMPE_RACE_11 }, + { RC_GY_WONDER_DAMPE_RACE_12, RAND_INF_GY_WONDER_DAMPE_RACE_12 }, + { RC_GY_WONDER_DAMPE_RACE_13, RAND_INF_GY_WONDER_DAMPE_RACE_13 }, + { RC_GY_WONDER_DAMPE_RACE_14, RAND_INF_GY_WONDER_DAMPE_RACE_14 }, + { RC_GY_WONDER_DAMPE_RACE_15, RAND_INF_GY_WONDER_DAMPE_RACE_15 }, + { RC_DMC_WONDER_BENEATH_BRIDGE_PLATFORM, RAND_INF_DMC_WONDER_BENEATH_BRIDGE_PLATFORM }, + { RC_ZR_WONDER_NEAR_DOMAIN_1, RAND_INF_ZR_WONDER_NEAR_DOMAIN_1 }, + { RC_ZR_WONDER_NEAR_DOMAIN_2, RAND_INF_ZR_WONDER_NEAR_DOMAIN_2 }, + { RC_ZR_WONDER_NEAR_DOMAIN_3, RAND_INF_ZR_WONDER_NEAR_DOMAIN_3 }, + { RC_ZR_WONDER_NEAR_DOMAIN_4, RAND_INF_ZR_WONDER_NEAR_DOMAIN_4 }, + { RC_ZR_WONDER_BEFORE_LADDER_1, RAND_INF_ZR_WONDER_BEFORE_LADDER_1 }, + { RC_ZR_WONDER_BEFORE_LADDER_2, RAND_INF_ZR_WONDER_BEFORE_LADDER_2 }, + { RC_ZR_WONDER_BEFORE_LADDER_3, RAND_INF_ZR_WONDER_BEFORE_LADDER_3 }, + { RC_ZR_WONDER_BEFORE_LADDER_4, RAND_INF_ZR_WONDER_BEFORE_LADDER_4 }, + { RC_ZR_WONDER_BEFORE_LADDER_5, RAND_INF_ZR_WONDER_BEFORE_LADDER_5 }, + { RC_ZR_WONDER_BEFORE_LADDER_6, RAND_INF_ZR_WONDER_BEFORE_LADDER_6 }, + { RC_ZR_WONDER_AFTER_LADDER_1, RAND_INF_ZR_WONDER_AFTER_LADDER_1 }, + { RC_ZR_WONDER_AFTER_LADDER_2, RAND_INF_ZR_WONDER_AFTER_LADDER_2 }, + { RC_ZR_WONDER_AFTER_LADDER_3, RAND_INF_ZR_WONDER_AFTER_LADDER_3 }, + { RC_ZR_WONDER_FROG_BRIDGE_1, RAND_INF_ZR_WONDER_FROG_BRIDGE_1 }, + { RC_ZR_WONDER_FROG_BRIDGE_2, RAND_INF_ZR_WONDER_FROG_BRIDGE_2 }, + { RC_ZR_WONDER_FROG_BRIDGE_3, RAND_INF_ZR_WONDER_FROG_BRIDGE_3 }, + { RC_ZR_WONDER_PILLARS_1, RAND_INF_ZR_WONDER_PILLARS_1 }, + { RC_ZR_WONDER_PILLARS_2, RAND_INF_ZR_WONDER_PILLARS_2 }, + { RC_ZR_WONDER_PILLARS_3, RAND_INF_ZR_WONDER_PILLARS_3 }, + { RC_ZR_WONDER_PILLARS_4, RAND_INF_ZR_WONDER_PILLARS_4 }, + { RC_ZR_WONDER_LOWER_LAND_BRIDGE_1, RAND_INF_ZR_WONDER_LOWER_LAND_BRIDGE_1 }, + { RC_ZR_WONDER_LOWER_LAND_BRIDGE_2, RAND_INF_ZR_WONDER_LOWER_LAND_BRIDGE_2 }, + { RC_ZR_WONDER_LOWER_LAND_BRIDGE_3, RAND_INF_ZR_WONDER_LOWER_LAND_BRIDGE_3 }, + { RC_ZR_WONDER_LOWER_LAND_BRIDGE_4, RAND_INF_ZR_WONDER_LOWER_LAND_BRIDGE_4 }, + { RC_ZR_WONDER_NEAR_CUCCO_1, RAND_INF_ZR_WONDER_NEAR_CUCCO_1 }, + { RC_ZR_WONDER_NEAR_CUCCO_2, RAND_INF_ZR_WONDER_NEAR_CUCCO_2 }, + { RC_ZR_WONDER_NEAR_CUCCO_3, RAND_INF_ZR_WONDER_NEAR_CUCCO_3 }, + { RC_ZR_WONDER_LOWER_RIVER_1, RAND_INF_ZR_WONDER_LOWER_RIVER_1 }, + { RC_ZR_WONDER_LOWER_RIVER_2, RAND_INF_ZR_WONDER_LOWER_RIVER_2 }, + { RC_ZR_WONDER_LOWER_RIVER_3, RAND_INF_ZR_WONDER_LOWER_RIVER_3 }, + { RC_ZR_WONDER_LOWER_RIVER_4, RAND_INF_ZR_WONDER_LOWER_RIVER_4 }, + { RC_ZF_WONDER_ROCK, RAND_INF_ZF_WONDER_ROCK }, + { RC_GV_WONDER_LOWER_WATERFALL, RAND_INF_GV_WONDER_LOWER_WATERFALL }, + { RC_GV_WONDER_UPPER_WATERFALL, RAND_INF_GV_WONDER_UPPER_WATERFALL }, + { RC_GF_WONDER_ENTRANCE_SIGN, RAND_INF_GF_WONDER_ENTRANCE_SIGN }, + { RC_GF_WONDER_ARCHERY_SIGN, RAND_INF_GF_WONDER_ARCHERY_SIGN }, + { RC_TH_WONDER_1_TORCH_1, RAND_INF_TH_WONDER_1_TORCH_1 }, + { RC_TH_WONDER_1_TORCH_2, RAND_INF_TH_WONDER_1_TORCH_2 }, + { RC_TH_WONDER_STEEP_SLOPE_LOWER_EXIT, RAND_INF_TH_WONDER_STEEP_SLOPE_LOWER_EXIT }, + { RC_TH_WONDER_STEEP_SLOPE_UPPER_EXIT, RAND_INF_TH_WONDER_STEEP_SLOPE_UPPER_EXIT }, + { RC_TH_WONDER_DOUBLE_JAIL_LOWER_EXIT, RAND_INF_TH_WONDER_DOUBLE_JAIL_LOWER_EXIT }, + { RC_TH_WONDER_DOUBLE_JAIL_UPPER_EXIT, RAND_INF_TH_WONDER_DOUBLE_JAIL_UPPER_EXIT }, + { RC_TH_WONDER_KITCHEN_SKULL, RAND_INF_TH_WONDER_KITCHEN_SKULL }, + { RC_TH_WONDER_KITCHEN_SOUP, RAND_INF_TH_WONDER_KITCHEN_SOUP }, + { RC_TH_WONDER_DEAD_END_SKULL_ENTRANCE, RAND_INF_TH_WONDER_DEAD_END_SKULL_ENTRANCE }, + { RC_TH_WONDER_DEAD_END_SKULL_NEAR_JAIL, RAND_INF_TH_WONDER_DEAD_END_SKULL_NEAR_JAIL }, + { RC_TH_WONDER_BREAK_ROOM_BOTTOM_SKULL, RAND_INF_TH_WONDER_BREAK_ROOM_BOTTOM_SKULL }, + { RC_TH_WONDER_BREAK_ROOM_TOP_SKULL, RAND_INF_TH_WONDER_BREAK_ROOM_TOP_SKULL }, + { RC_COLOSSUS_WONDER_OASIS_TREE_1, RAND_INF_COLOSSUS_WONDER_OASIS_TREE_1 }, + { RC_COLOSSUS_WONDER_OASIS_TREE_2, RAND_INF_COLOSSUS_WONDER_OASIS_TREE_2 }, + { RC_COLOSSUS_WONDER_OASIS_CHILD_TREE, RAND_INF_COLOSSUS_WONDER_OASIS_CHILD_TREE }, + { RC_COLOSSUS_WONDER_GF_TREE_1, RAND_INF_COLOSSUS_WONDER_GF_TREE_1 }, + { RC_COLOSSUS_WONDER_GF_TREE_2, RAND_INF_COLOSSUS_WONDER_GF_TREE_2 }, + { RC_SHADOW_TEMPLE_WONDER_THREE_POTS, RAND_INF_SHADOW_TEMPLE_WONDER_THREE_POTS }, + { RC_GERUDO_TRAINING_GROUND_WONDER_BEAMOS_ROOM, RAND_INF_GERUDO_TRAINING_GROUND_WONDER_BEAMOS_ROOM }, + { RC_GERUDO_TRAINING_GROUND_WONDER_EYE_STATUE_ROOM, RAND_INF_GERUDO_TRAINING_GROUND_WONDER_EYE_STATUE_ROOM }, + { RC_GERUDO_TRAINING_GROUND_WONDER_TORCH_SLUGS_ROOM, RAND_INF_GERUDO_TRAINING_GROUND_WONDER_TORCH_SLUGS_ROOM }, + { RC_DEKU_TREE_MQ_WONDER_BASEMENT_GRAVE_1, RAND_INF_DEKU_TREE_MQ_WONDER_BASEMENT_GRAVE_1 }, + { RC_DEKU_TREE_MQ_WONDER_BASEMENT_GRAVE_2, RAND_INF_DEKU_TREE_MQ_WONDER_BASEMENT_GRAVE_2 }, + { RC_DEKU_TREE_MQ_WONDER_BASEMENT_GRAVE_3, RAND_INF_DEKU_TREE_MQ_WONDER_BASEMENT_GRAVE_3 }, + { RC_DEKU_TREE_MQ_WONDER_BASEMENT_GRAVE_4, RAND_INF_DEKU_TREE_MQ_WONDER_BASEMENT_GRAVE_4 }, + { RC_JABU_JABUS_BELLY_MQ_WONDER_ENTRANCE_LEFT_COW, RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_ENTRANCE_LEFT_COW }, + { RC_JABU_JABUS_BELLY_MQ_WONDER_ENTRANCE_RIGHT_COW, RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_ENTRANCE_RIGHT_COW }, + { RC_JABU_JABUS_BELLY_MQ_WONDER_ELEVATOR_COW, RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_ELEVATOR_COW }, + { RC_JABU_JABUS_BELLY_MQ_HOLES_COW, RAND_INF_JABU_JABUS_BELLY_MQ_HOLES_COW }, + { RC_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_RIGHT_COW_1, RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_RIGHT_COW_1 }, + { RC_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_RIGHT_COW_2, RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_RIGHT_COW_2 }, + { RC_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_RIGHT_COW_3, RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_RIGHT_COW_3 }, + { RC_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_LEFT_COW_1, RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_LEFT_COW_1 }, + { RC_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_LEFT_COW_2, RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_LEFT_COW_2 }, + { RC_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_LEFT_COW_3, RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_LEFT_COW_3 }, + { RC_JABU_JABUS_BELLY_MQ_WONDER_AFTER_BIG_OCTO, RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_AFTER_BIG_OCTO }, + { RC_JABU_JABUS_BELLY_MQ_WONDER_JIGGLIES_COW, RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_JIGGLIES_COW }, + { RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_RIGHT_1, + RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_RIGHT_1 }, + { RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_RIGHT_2, + RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_RIGHT_2 }, + { RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_RIGHT_3, + RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_RIGHT_3 }, + { RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_LEFT_1, + RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_LEFT_1 }, + { RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_LEFT_2, + RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_LEFT_2 }, + { RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_LEFT_3, + RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_LEFT_3 }, + { RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_EXPLOSION_1, + RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_EXPLOSION_1 }, + { RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_EXPLOSION_2, + RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_EXPLOSION_2 }, + { RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_EXPLOSION_3, + RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_EXPLOSION_3 }, + { RC_JABU_JABUS_BELLY_MQ_WONDER_BEFORE_BOSS_LEFT_COW, RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_BEFORE_BOSS_LEFT_COW }, + { RC_JABU_JABUS_BELLY_MQ_WONDER_BEFORE_BOSS_RIGHT_COW_1, + RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_BEFORE_BOSS_RIGHT_COW_1 }, + { RC_JABU_JABUS_BELLY_MQ_WONDER_BEFORE_BOSS_RIGHT_COW_2, + RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_BEFORE_BOSS_RIGHT_COW_2 }, + { RC_FIRE_TEMPLE_MQ_WONDER_SHORTCUT_ROOM_1, RAND_INF_FIRE_TEMPLE_MQ_WONDER_SHORTCUT_ROOM_1 }, + { RC_FIRE_TEMPLE_MQ_WONDER_SHORTCUT_ROOM_2, RAND_INF_FIRE_TEMPLE_MQ_WONDER_SHORTCUT_ROOM_2 }, + { RC_FIRE_TEMPLE_MQ_WONDER_SHORTCUT_ROOM_3, RAND_INF_FIRE_TEMPLE_MQ_WONDER_SHORTCUT_ROOM_3 }, + { RC_FIRE_TEMPLE_MQ_WONDER_BOSS_KEY_ROOM_HOOKSHOT, RAND_INF_FIRE_TEMPLE_MQ_WONDER_BOSS_KEY_ROOM_HOOKSHOT }, + { RC_FIRE_TEMPLE_MQ_WONDER_BOSS_KEY_ROOM_BOW, RAND_INF_FIRE_TEMPLE_MQ_WONDER_BOSS_KEY_ROOM_BOW }, + { RC_FIRE_TEMPLE_MQ_WONDER_LIZALFOS_MAZE, RAND_INF_FIRE_TEMPLE_MQ_WONDER_LIZALFOS_MAZE }, + { RC_FIRE_TEMPLE_MQ_WONDER_EAST_TOWER_LARGE_FACE_1, RAND_INF_FIRE_TEMPLE_MQ_WONDER_EAST_TOWER_LARGE_FACE_1 }, + { RC_FIRE_TEMPLE_MQ_WONDER_EAST_TOWER_LARGE_FACE_2, RAND_INF_FIRE_TEMPLE_MQ_WONDER_EAST_TOWER_LARGE_FACE_2 }, + { RC_FIRE_TEMPLE_MQ_WONDER_EAST_TOWER_SMALL_FACE_1, RAND_INF_FIRE_TEMPLE_MQ_WONDER_EAST_TOWER_SMALL_FACE_1 }, + { RC_FIRE_TEMPLE_MQ_WONDER_EAST_TOWER_SMALL_FACE_2, RAND_INF_FIRE_TEMPLE_MQ_WONDER_EAST_TOWER_SMALL_FACE_2 }, + { RC_FIRE_TEMPLE_MQ_WONDER_TORCH_ROOM, RAND_INF_FIRE_TEMPLE_MQ_WONDER_TORCH_ROOM }, + { RC_FIRE_TEMPLE_MQ_WONDER_FIRE_MAZE, RAND_INF_FIRE_TEMPLE_MQ_WONDER_FIRE_MAZE }, + { RC_FIRE_TEMPLE_MQ_WONDER_AFTER_FLARE_DANCER, RAND_INF_FIRE_TEMPLE_MQ_WONDER_AFTER_FLARE_DANCER }, + { RC_FIRE_TEMPLE_MQ_WONDER_STAIRCASE, RAND_INF_FIRE_TEMPLE_MQ_WONDER_STAIRCASE }, + { RC_WATER_TEMPLE_MQ_WONDER_LIZALFOS_ROOM, RAND_INF_WATER_TEMPLE_MQ_WONDER_LIZALFOS_ROOM }, + { RC_WATER_TEMPLE_MQ_WONDER_LONGSHOT_ROOM, RAND_INF_WATER_TEMPLE_MQ_WONDER_LONGSHOT_ROOM }, + { RC_WATER_TEMPLE_MQ_WONDER_STALFOS_ROOM, RAND_INF_WATER_TEMPLE_MQ_WONDER_STALFOS_ROOM }, + { RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_RIGHT_1, + RAND_INF_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_RIGHT_1 }, + { RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_RIGHT_2, + RAND_INF_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_RIGHT_2 }, + { RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_RIGHT_3, + RAND_INF_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_RIGHT_3 }, + { RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_LEFT_1, RAND_INF_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_LEFT_1 }, + { RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_LEFT_2, RAND_INF_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_LEFT_2 }, + { RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_LEFT_3, RAND_INF_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_LEFT_3 }, + { RC_WATER_TEMPLE_MQ_WONDER_AFTER_DARK_LINK, RAND_INF_WATER_TEMPLE_MQ_WONDER_AFTER_DARK_LINK }, + { RC_WATER_TEMPLE_MQ_WONDER_DRAGON_ROOM_LEFT_EYE, RAND_INF_WATER_TEMPLE_MQ_WONDER_DRAGON_ROOM_LEFT_EYE }, + { RC_WATER_TEMPLE_MQ_WONDER_DRAGON_ROOM_RIGHT_EYE, RAND_INF_WATER_TEMPLE_MQ_WONDER_DRAGON_ROOM_RIGHT_EYE }, + { RC_WATER_TEMPLE_MQ_WONDER_DRAGON_ROOM_PORTRAIT, RAND_INF_WATER_TEMPLE_MQ_WONDER_DRAGON_ROOM_PORTRAIT }, + { RC_WATER_TEMPLE_MQ_WONDER_TRIPLE_TORCHES, RAND_INF_WATER_TEMPLE_MQ_WONDER_TRIPLE_TORCHES }, + { RC_WATER_TEMPLE_MQ_WONDER_WATER_SPROUTS_1, RAND_INF_WATER_TEMPLE_MQ_WONDER_WATER_SPROUTS_1 }, + { RC_WATER_TEMPLE_MQ_WONDER_WATER_SPROUTS_2, RAND_INF_WATER_TEMPLE_MQ_WONDER_WATER_SPROUTS_2 }, + { RC_WATER_TEMPLE_MQ_WONDER_FREESTANDING_ROOM, RAND_INF_WATER_TEMPLE_MQ_WONDER_FREESTANDING_ROOM }, + { RC_WATER_TEMPLE_MQ_WONDER_BEFORE_BOSS_1, RAND_INF_WATER_TEMPLE_MQ_WONDER_BEFORE_BOSS_1 }, + { RC_WATER_TEMPLE_MQ_WONDER_BEFORE_BOSS_2, RAND_INF_WATER_TEMPLE_MQ_WONDER_BEFORE_BOSS_2 }, + { RC_WATER_TEMPLE_MQ_WONDER_UNDER_PILLAR_ROOM, RAND_INF_WATER_TEMPLE_MQ_WONDER_UNDER_PILLAR_ROOM }, + { RC_WATER_TEMPLE_MQ_WONDER_LIZALFOS_HALLWAY, RAND_INF_WATER_TEMPLE_MQ_WONDER_LIZALFOS_HALLWAY }, + { RC_WATER_TEMPLE_MQ_WONDER_GS_STORAGE_ROOM, RAND_INF_WATER_TEMPLE_MQ_WONDER_GS_STORAGE_ROOM }, + { RC_SPIRIT_TEMPLE_MQ_WONDER_CHEST_HAMMER, RAND_INF_SPIRIT_TEMPLE_MQ_WONDER_CHEST_HAMMER }, + { RC_SPIRIT_TEMPLE_MQ_WONDER_CHEST_SLASH, RAND_INF_SPIRIT_TEMPLE_MQ_WONDER_CHEST_SLASH }, + { RC_SHADOW_TEMPLE_MQ_WONDER_THREE_POTS, RAND_INF_SHADOW_TEMPLE_MQ_WONDER_THREE_POTS }, + { RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_LEFT_1, RAND_INF_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_LEFT_1 }, + { RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_LEFT_2, RAND_INF_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_LEFT_2 }, + { RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_LEFT_3, RAND_INF_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_LEFT_3 }, + { RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_LEFT_4, RAND_INF_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_LEFT_4 }, + { RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_RIGHT_1, RAND_INF_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_RIGHT_1 }, + { RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_RIGHT_2, RAND_INF_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_RIGHT_2 }, + { RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_RIGHT_3, RAND_INF_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_RIGHT_3 }, + { RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_RIGHT_4, RAND_INF_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_RIGHT_4 }, + { RC_BOTTOM_OF_THE_WELL_MQ_WONDER_SIDE_ROOM_1, RAND_INF_BOTTOM_OF_THE_WELL_MQ_WONDER_SIDE_ROOM_1 }, + { RC_BOTTOM_OF_THE_WELL_MQ_WONDER_SIDE_ROOM_2, RAND_INF_BOTTOM_OF_THE_WELL_MQ_WONDER_SIDE_ROOM_2 }, + { RC_BOTTOM_OF_THE_WELL_MQ_WONDER_SIDE_ROOM_3, RAND_INF_BOTTOM_OF_THE_WELL_MQ_WONDER_SIDE_ROOM_3 }, + { RC_BOTTOM_OF_THE_WELL_MQ_WONDER_SIDE_ROOM_4, RAND_INF_BOTTOM_OF_THE_WELL_MQ_WONDER_SIDE_ROOM_4 }, + { RC_GERUDO_TRAINING_GROUND_MQ_WONDER_DINOLFOS_ROOM, RAND_INF_GERUDO_TRAINING_GROUND_MQ_WONDER_DINOLFOS_ROOM }, + { RC_GERUDO_TRAINING_GROUND_MQ_WONDER_EYE_STATUE, RAND_INF_GERUDO_TRAINING_GROUND_MQ_WONDER_EYE_STATUE }, + { RC_GANONS_CASTLE_MQ_WONDER_SHADOW_TRIAL, RAND_INF_GANONS_CASTLE_MQ_WONDER_SHADOW_TRIAL }, }; CheckIdentity Randomizer::IdentifyBeehive(s32 sceneNum, s16 xPosition, s32 respawnData) { @@ -3567,6 +3783,38 @@ CheckIdentity Randomizer::IdentifySign(s32 sceneNum, s32 posX, s32 posZ, s32 id) return signIdentity; } +CheckIdentity Randomizer::IdentifyWonderItem(s32 sceneNum, s32 par1, s32 par2) { + struct CheckIdentity wonderIdentity; + uint32_t wonderSceneNum = sceneNum; + + // align oasis trees in colossus between child/adult + if (sceneNum == SCENE_DESERT_COLOSSUS && LINK_IS_ADULT) { + if (par1 == 1157 && par2 == 2388) { + par1 = 1161; + par2 = 2383; + } else if (par1 == 1114 && par2 == 2580) { + par1 = 1113; + par2 = 2581; + } + } + + wonderIdentity.randomizerInf = RAND_INF_MAX; + wonderIdentity.randomizerCheck = RC_UNKNOWN_CHECK; + + s32 actorParams = TWO_ACTOR_PARAMS(par1, par2); + + Rando::Location* location = GetCheckObjectFromActor(ACTOR_EN_WONDER_ITEM, wonderSceneNum, actorParams); + + if (location->GetRandomizerCheck() == RC_UNKNOWN_CHECK) { + LUSLOG_WARN("IdentifyWonderItem did not receive a valid RC value (%d).", location->GetRandomizerCheck()); + } else { + wonderIdentity.randomizerInf = rcToRandomizerInf[location->GetRandomizerCheck()]; + wonderIdentity.randomizerCheck = location->GetRandomizerCheck(); + } + + return wonderIdentity; +} + u8 Randomizer::GetRandoSettingValue(RandomizerSettingKey randoSettingKey) { return Rando::Context::GetInstance()->GetOption(randoSettingKey).Get(); } diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h index babb1c5dc..7b1fcdba4 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.h +++ b/soh/soh/Enhancements/randomizer/randomizer.h @@ -44,6 +44,7 @@ class Randomizer { CheckIdentity IdentifySmallCrate(s32 sceneNum, s32 posX, s32 posZ); CheckIdentity IdentifyTree(s32 sceneNum, s32 posX, s32 posZ); CheckIdentity IdentifySign(s32 sceneNum, s32 posX, s32 posZ, s32 id); + CheckIdentity IdentifyWonderItem(s32 sceneNum, s32 par1, s32 par2); GetItemEntry GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogItemId, bool checkObtainability = true); GetItemEntry GetItemFromActor(s16 actorId, s16 sceneNum, s16 actorParams, GetItemID ogItemId, diff --git a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerCheck.h b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerCheck.h index 0ba94e8fb..095a6b009 100644 --- a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerCheck.h +++ b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerCheck.h @@ -1998,6 +1998,213 @@ RANDO_ENUM_ITEM(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART) RANDO_ENUM_ITEM(RC_GANONS_CASTLE_MQ_WATER_TRIAL_HEART) RANDO_ENUM_ITEM(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART) RANDO_ENUM_ITEM(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART) + +// Overworld Wonder Items +RANDO_ENUM_ITEM(RC_KF_WONDER_TRAINING_1) +RANDO_ENUM_ITEM(RC_KF_WONDER_TRAINING_2) +RANDO_ENUM_ITEM(RC_KF_WONDER_TRAINING_3) +RANDO_ENUM_ITEM(RC_KF_WONDER_SHOP) +RANDO_ENUM_ITEM(RC_KF_WONDER_SIGN) +RANDO_ENUM_ITEM(RC_KF_WONDER_PLATFORMS_1) +RANDO_ENUM_ITEM(RC_KF_WONDER_PLATFORMS_2) +RANDO_ENUM_ITEM(RC_KF_WONDER_CRAWL_GRASS_1) +RANDO_ENUM_ITEM(RC_KF_WONDER_CRAWL_GRASS_2) +RANDO_ENUM_ITEM(RC_HF_WONDER_BRIDGE_1) +RANDO_ENUM_ITEM(RC_HF_WONDER_BRIDGE_2) +RANDO_ENUM_ITEM(RC_HF_WONDER_BRIDGE_3) +RANDO_ENUM_ITEM(RC_MKT_WONDER_DAY_1) +RANDO_ENUM_ITEM(RC_MKT_WONDER_DAY_2) +RANDO_ENUM_ITEM(RC_MKT_WONDER_DAY_3) +RANDO_ENUM_ITEM(RC_MKT_WONDER_DAY_4) +RANDO_ENUM_ITEM(RC_MKT_WONDER_DAY_5) +RANDO_ENUM_ITEM(RC_MKT_WONDER_NIGHT_1) +RANDO_ENUM_ITEM(RC_MKT_WONDER_NIGHT_2) +RANDO_ENUM_ITEM(RC_LLR_WONDER_BIG_FENCE) +RANDO_ENUM_ITEM(RC_LLR_WONDER_SMALL_FENCE) +RANDO_ENUM_ITEM(RC_HC_WONDER_LEFT_TORCH) +RANDO_ENUM_ITEM(RC_HC_WONDER_RIGHT_TORCH) +RANDO_ENUM_ITEM(RC_HC_WONDER_MOAT_1) +RANDO_ENUM_ITEM(RC_HC_WONDER_MOAT_2) +RANDO_ENUM_ITEM(RC_HC_WONDER_MOAT_3) +RANDO_ENUM_ITEM(RC_HC_WONDER_MOAT_4) +RANDO_ENUM_ITEM(RC_HC_WONDER_MOAT_5) +RANDO_ENUM_ITEM(RC_HC_WONDER_MOAT_6) +RANDO_ENUM_ITEM(RC_HC_WONDER_MOAT_7) +RANDO_ENUM_ITEM(RC_HC_WONDER_MOAT_8) +RANDO_ENUM_ITEM(RC_HC_WONDER_MOAT_9) +RANDO_ENUM_ITEM(RC_HC_WONDER_MOAT_10) +RANDO_ENUM_ITEM(RC_HC_WONDER_COURTYARD_RIGHT_WINDOW) +RANDO_ENUM_ITEM(RC_HC_WONDER_COURTYARD_LEFT_WINDOW) +RANDO_ENUM_ITEM(RC_LW_WONDER_BACK_SKULL_KIDS_GRASS_1) +RANDO_ENUM_ITEM(RC_LW_WONDER_BACK_SKULL_KIDS_GRASS_2) +RANDO_ENUM_ITEM(RC_LW_WONDER_FRONT_SKULL_KIDS_GRASS) +RANDO_ENUM_ITEM(RC_SFM_WONDER_ENTRANCE) +RANDO_ENUM_ITEM(RC_SFM_WONDER_MAZE_1) +RANDO_ENUM_ITEM(RC_SFM_WONDER_MAZE_2) +RANDO_ENUM_ITEM(RC_SFM_WONDER_MAZE_3) +RANDO_ENUM_ITEM(RC_SFM_WONDER_MAZE_4) +RANDO_ENUM_ITEM(RC_SFM_WONDER_MAZE_5) +RANDO_ENUM_ITEM(RC_KAK_WONDER_UNDER_CONSTRUCTION) +RANDO_ENUM_ITEM(RC_KAK_WONDER_ABOVE_COW) +RANDO_ENUM_ITEM(RC_GY_WONDER_DAMPE_RACE_1) +RANDO_ENUM_ITEM(RC_GY_WONDER_DAMPE_RACE_2) +RANDO_ENUM_ITEM(RC_GY_WONDER_DAMPE_RACE_3) +RANDO_ENUM_ITEM(RC_GY_WONDER_DAMPE_RACE_4) +RANDO_ENUM_ITEM(RC_GY_WONDER_DAMPE_RACE_5) +RANDO_ENUM_ITEM(RC_GY_WONDER_DAMPE_RACE_6) +RANDO_ENUM_ITEM(RC_GY_WONDER_DAMPE_RACE_7) +RANDO_ENUM_ITEM(RC_GY_WONDER_DAMPE_RACE_8) +RANDO_ENUM_ITEM(RC_GY_WONDER_DAMPE_RACE_9) +RANDO_ENUM_ITEM(RC_GY_WONDER_DAMPE_RACE_10) +RANDO_ENUM_ITEM(RC_GY_WONDER_DAMPE_RACE_11) +RANDO_ENUM_ITEM(RC_GY_WONDER_DAMPE_RACE_12) +RANDO_ENUM_ITEM(RC_GY_WONDER_DAMPE_RACE_13) +RANDO_ENUM_ITEM(RC_GY_WONDER_DAMPE_RACE_14) +RANDO_ENUM_ITEM(RC_GY_WONDER_DAMPE_RACE_15) +RANDO_ENUM_ITEM(RC_DMC_WONDER_BENEATH_BRIDGE_PLATFORM) +RANDO_ENUM_ITEM(RC_ZR_WONDER_NEAR_DOMAIN_1) +RANDO_ENUM_ITEM(RC_ZR_WONDER_NEAR_DOMAIN_2) +RANDO_ENUM_ITEM(RC_ZR_WONDER_NEAR_DOMAIN_3) +RANDO_ENUM_ITEM(RC_ZR_WONDER_NEAR_DOMAIN_4) +RANDO_ENUM_ITEM(RC_ZR_WONDER_BEFORE_LADDER_1) +RANDO_ENUM_ITEM(RC_ZR_WONDER_BEFORE_LADDER_2) +RANDO_ENUM_ITEM(RC_ZR_WONDER_BEFORE_LADDER_3) +RANDO_ENUM_ITEM(RC_ZR_WONDER_BEFORE_LADDER_4) +RANDO_ENUM_ITEM(RC_ZR_WONDER_BEFORE_LADDER_5) +RANDO_ENUM_ITEM(RC_ZR_WONDER_BEFORE_LADDER_6) +RANDO_ENUM_ITEM(RC_ZR_WONDER_AFTER_LADDER_1) +RANDO_ENUM_ITEM(RC_ZR_WONDER_AFTER_LADDER_2) +RANDO_ENUM_ITEM(RC_ZR_WONDER_AFTER_LADDER_3) +RANDO_ENUM_ITEM(RC_ZR_WONDER_FROG_BRIDGE_1) +RANDO_ENUM_ITEM(RC_ZR_WONDER_FROG_BRIDGE_2) +RANDO_ENUM_ITEM(RC_ZR_WONDER_FROG_BRIDGE_3) +RANDO_ENUM_ITEM(RC_ZR_WONDER_PILLARS_1) +RANDO_ENUM_ITEM(RC_ZR_WONDER_PILLARS_2) +RANDO_ENUM_ITEM(RC_ZR_WONDER_PILLARS_3) +RANDO_ENUM_ITEM(RC_ZR_WONDER_PILLARS_4) +RANDO_ENUM_ITEM(RC_ZR_WONDER_LOWER_LAND_BRIDGE_1) +RANDO_ENUM_ITEM(RC_ZR_WONDER_LOWER_LAND_BRIDGE_2) +RANDO_ENUM_ITEM(RC_ZR_WONDER_LOWER_LAND_BRIDGE_3) +RANDO_ENUM_ITEM(RC_ZR_WONDER_LOWER_LAND_BRIDGE_4) +RANDO_ENUM_ITEM(RC_ZR_WONDER_NEAR_CUCCO_1) +RANDO_ENUM_ITEM(RC_ZR_WONDER_NEAR_CUCCO_2) +RANDO_ENUM_ITEM(RC_ZR_WONDER_NEAR_CUCCO_3) +RANDO_ENUM_ITEM(RC_ZR_WONDER_LOWER_RIVER_1) +RANDO_ENUM_ITEM(RC_ZR_WONDER_LOWER_RIVER_2) +RANDO_ENUM_ITEM(RC_ZR_WONDER_LOWER_RIVER_3) +RANDO_ENUM_ITEM(RC_ZR_WONDER_LOWER_RIVER_4) +RANDO_ENUM_ITEM(RC_ZF_WONDER_ROCK) +RANDO_ENUM_ITEM(RC_GV_WONDER_LOWER_WATERFALL) +RANDO_ENUM_ITEM(RC_GV_WONDER_UPPER_WATERFALL) +RANDO_ENUM_ITEM(RC_GF_WONDER_ENTRANCE_SIGN) +RANDO_ENUM_ITEM(RC_GF_WONDER_ARCHERY_SIGN) +RANDO_ENUM_ITEM(RC_TH_WONDER_1_TORCH_1) +RANDO_ENUM_ITEM(RC_TH_WONDER_1_TORCH_2) +RANDO_ENUM_ITEM(RC_TH_WONDER_STEEP_SLOPE_LOWER_EXIT) +RANDO_ENUM_ITEM(RC_TH_WONDER_STEEP_SLOPE_UPPER_EXIT) +RANDO_ENUM_ITEM(RC_TH_WONDER_DOUBLE_JAIL_LOWER_EXIT) +RANDO_ENUM_ITEM(RC_TH_WONDER_DOUBLE_JAIL_UPPER_EXIT) +RANDO_ENUM_ITEM(RC_TH_WONDER_KITCHEN_SKULL) +RANDO_ENUM_ITEM(RC_TH_WONDER_KITCHEN_SOUP) +RANDO_ENUM_ITEM(RC_TH_WONDER_DEAD_END_SKULL_ENTRANCE) +RANDO_ENUM_ITEM(RC_TH_WONDER_DEAD_END_SKULL_NEAR_JAIL) +RANDO_ENUM_ITEM(RC_TH_WONDER_BREAK_ROOM_BOTTOM_SKULL) +RANDO_ENUM_ITEM(RC_TH_WONDER_BREAK_ROOM_TOP_SKULL) +RANDO_ENUM_ITEM(RC_COLOSSUS_WONDER_OASIS_TREE_1) +RANDO_ENUM_ITEM(RC_COLOSSUS_WONDER_OASIS_TREE_2) +RANDO_ENUM_ITEM(RC_COLOSSUS_WONDER_OASIS_CHILD_TREE) +RANDO_ENUM_ITEM(RC_COLOSSUS_WONDER_GF_TREE_1) +RANDO_ENUM_ITEM(RC_COLOSSUS_WONDER_GF_TREE_2) +// Dungeon Wonder Items +RANDO_ENUM_ITEM(RC_SHADOW_TEMPLE_WONDER_THREE_POTS) +RANDO_ENUM_ITEM(RC_GERUDO_TRAINING_GROUND_WONDER_BEAMOS_ROOM) +RANDO_ENUM_ITEM(RC_GERUDO_TRAINING_GROUND_WONDER_EYE_STATUE_ROOM) +RANDO_ENUM_ITEM(RC_GERUDO_TRAINING_GROUND_WONDER_TORCH_SLUGS_ROOM) +// MQ Dungeon Wonder Items +RANDO_ENUM_ITEM(RC_DEKU_TREE_MQ_WONDER_BASEMENT_GRAVE_1) +RANDO_ENUM_ITEM(RC_DEKU_TREE_MQ_WONDER_BASEMENT_GRAVE_2) +RANDO_ENUM_ITEM(RC_DEKU_TREE_MQ_WONDER_BASEMENT_GRAVE_3) +RANDO_ENUM_ITEM(RC_DEKU_TREE_MQ_WONDER_BASEMENT_GRAVE_4) +RANDO_ENUM_ITEM(RC_JABU_JABUS_BELLY_MQ_WONDER_ENTRANCE_LEFT_COW) +RANDO_ENUM_ITEM(RC_JABU_JABUS_BELLY_MQ_WONDER_ENTRANCE_RIGHT_COW) +RANDO_ENUM_ITEM(RC_JABU_JABUS_BELLY_MQ_WONDER_ELEVATOR_COW) +RANDO_ENUM_ITEM(RC_JABU_JABUS_BELLY_MQ_HOLES_COW) +RANDO_ENUM_ITEM(RC_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_RIGHT_COW_1) +RANDO_ENUM_ITEM(RC_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_RIGHT_COW_2) +RANDO_ENUM_ITEM(RC_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_RIGHT_COW_3) +RANDO_ENUM_ITEM(RC_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_LEFT_COW_1) +RANDO_ENUM_ITEM(RC_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_LEFT_COW_2) +RANDO_ENUM_ITEM(RC_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_LEFT_COW_3) +RANDO_ENUM_ITEM(RC_JABU_JABUS_BELLY_MQ_WONDER_AFTER_BIG_OCTO) +RANDO_ENUM_ITEM(RC_JABU_JABUS_BELLY_MQ_WONDER_JIGGLIES_COW) +RANDO_ENUM_ITEM(RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_RIGHT_1) +RANDO_ENUM_ITEM(RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_RIGHT_2) +RANDO_ENUM_ITEM(RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_RIGHT_3) +RANDO_ENUM_ITEM(RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_LEFT_1) +RANDO_ENUM_ITEM(RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_LEFT_2) +RANDO_ENUM_ITEM(RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_LEFT_3) +RANDO_ENUM_ITEM(RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_EXPLOSION_1) +RANDO_ENUM_ITEM(RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_EXPLOSION_2) +RANDO_ENUM_ITEM(RC_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_EXPLOSION_3) +RANDO_ENUM_ITEM(RC_JABU_JABUS_BELLY_MQ_WONDER_BEFORE_BOSS_LEFT_COW) +RANDO_ENUM_ITEM(RC_JABU_JABUS_BELLY_MQ_WONDER_BEFORE_BOSS_RIGHT_COW_1) +RANDO_ENUM_ITEM(RC_JABU_JABUS_BELLY_MQ_WONDER_BEFORE_BOSS_RIGHT_COW_2) +RANDO_ENUM_ITEM(RC_FIRE_TEMPLE_MQ_WONDER_SHORTCUT_ROOM_1) +RANDO_ENUM_ITEM(RC_FIRE_TEMPLE_MQ_WONDER_SHORTCUT_ROOM_2) +RANDO_ENUM_ITEM(RC_FIRE_TEMPLE_MQ_WONDER_SHORTCUT_ROOM_3) +RANDO_ENUM_ITEM(RC_FIRE_TEMPLE_MQ_WONDER_BOSS_KEY_ROOM_HOOKSHOT) +RANDO_ENUM_ITEM(RC_FIRE_TEMPLE_MQ_WONDER_BOSS_KEY_ROOM_BOW) +RANDO_ENUM_ITEM(RC_FIRE_TEMPLE_MQ_WONDER_LIZALFOS_MAZE) +RANDO_ENUM_ITEM(RC_FIRE_TEMPLE_MQ_WONDER_EAST_TOWER_LARGE_FACE_1) +RANDO_ENUM_ITEM(RC_FIRE_TEMPLE_MQ_WONDER_EAST_TOWER_LARGE_FACE_2) +RANDO_ENUM_ITEM(RC_FIRE_TEMPLE_MQ_WONDER_EAST_TOWER_SMALL_FACE_1) +RANDO_ENUM_ITEM(RC_FIRE_TEMPLE_MQ_WONDER_EAST_TOWER_SMALL_FACE_2) +RANDO_ENUM_ITEM(RC_FIRE_TEMPLE_MQ_WONDER_TORCH_ROOM) +RANDO_ENUM_ITEM(RC_FIRE_TEMPLE_MQ_WONDER_FIRE_MAZE) +RANDO_ENUM_ITEM(RC_FIRE_TEMPLE_MQ_WONDER_AFTER_FLARE_DANCER) +RANDO_ENUM_ITEM(RC_FIRE_TEMPLE_MQ_WONDER_STAIRCASE) +RANDO_ENUM_ITEM(RC_WATER_TEMPLE_MQ_WONDER_LIZALFOS_ROOM) +RANDO_ENUM_ITEM(RC_WATER_TEMPLE_MQ_WONDER_LONGSHOT_ROOM) +RANDO_ENUM_ITEM(RC_WATER_TEMPLE_MQ_WONDER_STALFOS_ROOM) +RANDO_ENUM_ITEM(RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_RIGHT_1) +RANDO_ENUM_ITEM(RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_RIGHT_2) +RANDO_ENUM_ITEM(RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_RIGHT_3) +RANDO_ENUM_ITEM(RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_LEFT_1) +RANDO_ENUM_ITEM(RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_LEFT_2) +RANDO_ENUM_ITEM(RC_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_LEFT_3) +RANDO_ENUM_ITEM(RC_WATER_TEMPLE_MQ_WONDER_AFTER_DARK_LINK) +RANDO_ENUM_ITEM(RC_WATER_TEMPLE_MQ_WONDER_DRAGON_ROOM_LEFT_EYE) +RANDO_ENUM_ITEM(RC_WATER_TEMPLE_MQ_WONDER_DRAGON_ROOM_RIGHT_EYE) +RANDO_ENUM_ITEM(RC_WATER_TEMPLE_MQ_WONDER_DRAGON_ROOM_PORTRAIT) +RANDO_ENUM_ITEM(RC_WATER_TEMPLE_MQ_WONDER_TRIPLE_TORCHES) +RANDO_ENUM_ITEM(RC_WATER_TEMPLE_MQ_WONDER_WATER_SPROUTS_1) +RANDO_ENUM_ITEM(RC_WATER_TEMPLE_MQ_WONDER_WATER_SPROUTS_2) +RANDO_ENUM_ITEM(RC_WATER_TEMPLE_MQ_WONDER_FREESTANDING_ROOM) +RANDO_ENUM_ITEM(RC_WATER_TEMPLE_MQ_WONDER_BEFORE_BOSS_1) +RANDO_ENUM_ITEM(RC_WATER_TEMPLE_MQ_WONDER_BEFORE_BOSS_2) +RANDO_ENUM_ITEM(RC_WATER_TEMPLE_MQ_WONDER_UNDER_PILLAR_ROOM) +RANDO_ENUM_ITEM(RC_WATER_TEMPLE_MQ_WONDER_LIZALFOS_HALLWAY) +RANDO_ENUM_ITEM(RC_WATER_TEMPLE_MQ_WONDER_GS_STORAGE_ROOM) +RANDO_ENUM_ITEM(RC_SPIRIT_TEMPLE_MQ_WONDER_CHEST_HAMMER) +RANDO_ENUM_ITEM(RC_SPIRIT_TEMPLE_MQ_WONDER_CHEST_SLASH) +RANDO_ENUM_ITEM(RC_SHADOW_TEMPLE_MQ_WONDER_THREE_POTS) +RANDO_ENUM_ITEM(RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_LEFT_1) +RANDO_ENUM_ITEM(RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_LEFT_2) +RANDO_ENUM_ITEM(RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_LEFT_3) +RANDO_ENUM_ITEM(RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_LEFT_4) +RANDO_ENUM_ITEM(RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_RIGHT_1) +RANDO_ENUM_ITEM(RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_RIGHT_2) +RANDO_ENUM_ITEM(RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_RIGHT_3) +RANDO_ENUM_ITEM(RC_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_RIGHT_4) +RANDO_ENUM_ITEM(RC_BOTTOM_OF_THE_WELL_MQ_WONDER_SIDE_ROOM_1) +RANDO_ENUM_ITEM(RC_BOTTOM_OF_THE_WELL_MQ_WONDER_SIDE_ROOM_2) +RANDO_ENUM_ITEM(RC_BOTTOM_OF_THE_WELL_MQ_WONDER_SIDE_ROOM_3) +RANDO_ENUM_ITEM(RC_BOTTOM_OF_THE_WELL_MQ_WONDER_SIDE_ROOM_4) +RANDO_ENUM_ITEM(RC_GERUDO_TRAINING_GROUND_MQ_WONDER_DINOLFOS_ROOM) +RANDO_ENUM_ITEM(RC_GERUDO_TRAINING_GROUND_MQ_WONDER_EYE_STATUE) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_MQ_WONDER_SHADOW_TRIAL) +// End Wonder Items + RANDO_ENUM_ITEM(RC_SFM_FAIRY_GROTTO_FAIRY_1) RANDO_ENUM_ITEM(RC_SFM_FAIRY_GROTTO_FAIRY_2) RANDO_ENUM_ITEM(RC_SFM_FAIRY_GROTTO_FAIRY_3) diff --git a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerHintTextKey.h b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerHintTextKey.h index 18fa5e72b..cb69dca98 100644 --- a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerHintTextKey.h +++ b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerHintTextKey.h @@ -1368,6 +1368,33 @@ RANDO_ENUM_ITEM(RHT_TREE_LON_LON_RANCH) RANDO_ENUM_ITEM(RHT_TREE_KAKARIKO) RANDO_ENUM_ITEM(RHT_BUSH_HYRULE_FIELD) RANDO_ENUM_ITEM(RHT_BUSH_ZORAS_FOUNTAIN) +// Shuffle Wonder Items +RANDO_ENUM_ITEM(RHT_WONDER_ITEM_KOKIRI_FOREST) +RANDO_ENUM_ITEM(RHT_WONDER_ITEM_HYRULE_FIELD) +RANDO_ENUM_ITEM(RHT_WONDER_ITEM_MARKET) +RANDO_ENUM_ITEM(RHT_WONDER_ITEM_LON_LON_RANCH) +RANDO_ENUM_ITEM(RHT_WONDER_ITEM_HYRULE_CASTLE) +RANDO_ENUM_ITEM(RHT_WONDER_ITEM_CASTLE_COURTYARD_ZELDA) +RANDO_ENUM_ITEM(RHT_WONDER_ITEM_LOST_WOODS) +RANDO_ENUM_ITEM(RHT_WONDER_ITEM_SACRED_FOREST_MEADOW) +RANDO_ENUM_ITEM(RHT_WONDER_ITEM_KAKARIKO_VILLAGE) +RANDO_ENUM_ITEM(RHT_WONDER_ITEM_DAMPES_GRAVE) +RANDO_ENUM_ITEM(RHT_WONDER_ITEM_DEATH_MOUNTAIN_CRATER) +RANDO_ENUM_ITEM(RHT_WONDER_ITEM_ZORAS_RIVER) +RANDO_ENUM_ITEM(RHT_WONDER_ITEM_ZORAS_FOUNTAIN) +RANDO_ENUM_ITEM(RHT_WONDER_ITEM_GERUDO_VALLEY) +RANDO_ENUM_ITEM(RHT_WONDER_ITEM_GERUDOS_FORTRESS) +RANDO_ENUM_ITEM(RHT_WONDER_ITEM_THIEVES_HIDEOUT) +RANDO_ENUM_ITEM(RHT_WONDER_ITEM_DESERT_COLOSSUS) +RANDO_ENUM_ITEM(RHT_WONDER_ITEM_DEKU_TREE) +RANDO_ENUM_ITEM(RHT_WONDER_ITEM_JABU_JABU) +RANDO_ENUM_ITEM(RHT_WONDER_ITEM_FIRE_TEMPLE) +RANDO_ENUM_ITEM(RHT_WONDER_ITEM_WATER_TEMPLE) +RANDO_ENUM_ITEM(RHT_WONDER_ITEM_SPIRIT_TEMPLE) +RANDO_ENUM_ITEM(RHT_WONDER_ITEM_SHADOW_TEMPLE) +RANDO_ENUM_ITEM(RHT_BOTTOM_OF_THE_WELL_WONDER_ITEM) +RANDO_ENUM_ITEM(RHT_WONDER_ITEM_GERUDO_TRAINING_GROUND) +RANDO_ENUM_ITEM(RHT_GANONS_CASTLE_WONDER_ITEM) // Ganon Line RANDO_ENUM_ITEM(RHT_GANON_JOKE01) RANDO_ENUM_ITEM(RHT_GANON_JOKE02) diff --git a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerInf.h b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerInf.h index 483927a71..7ff5d9a5c 100644 --- a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerInf.h +++ b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerInf.h @@ -1484,6 +1484,212 @@ RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_HEART) RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART) RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART) +// Overworld Wonder Items +RANDO_ENUM_ITEM(RAND_INF_KF_WONDER_TRAINING_1) +RANDO_ENUM_ITEM(RAND_INF_KF_WONDER_TRAINING_2) +RANDO_ENUM_ITEM(RAND_INF_KF_WONDER_TRAINING_3) +RANDO_ENUM_ITEM(RAND_INF_KF_WONDER_SHOP) +RANDO_ENUM_ITEM(RAND_INF_KF_WONDER_SIGN) +RANDO_ENUM_ITEM(RAND_INF_KF_WONDER_PLATFORMS_1) +RANDO_ENUM_ITEM(RAND_INF_KF_WONDER_PLATFORMS_2) +RANDO_ENUM_ITEM(RAND_INF_KF_WONDER_CRAWL_GRASS_1) +RANDO_ENUM_ITEM(RAND_INF_KF_WONDER_CRAWL_GRASS_2) +RANDO_ENUM_ITEM(RAND_INF_HF_WONDER_BRIDGE_1) +RANDO_ENUM_ITEM(RAND_INF_HF_WONDER_BRIDGE_2) +RANDO_ENUM_ITEM(RAND_INF_HF_WONDER_BRIDGE_3) +RANDO_ENUM_ITEM(RAND_INF_MKT_WONDER_DAY_1) +RANDO_ENUM_ITEM(RAND_INF_MKT_WONDER_DAY_2) +RANDO_ENUM_ITEM(RAND_INF_MKT_WONDER_DAY_3) +RANDO_ENUM_ITEM(RAND_INF_MKT_WONDER_DAY_4) +RANDO_ENUM_ITEM(RAND_INF_MKT_WONDER_DAY_5) +RANDO_ENUM_ITEM(RAND_INF_MKT_WONDER_NIGHT_1) +RANDO_ENUM_ITEM(RAND_INF_MKT_WONDER_NIGHT_2) +RANDO_ENUM_ITEM(RAND_INF_LLR_WONDER_BIG_FENCE) +RANDO_ENUM_ITEM(RAND_INF_LLR_WONDER_SMALL_FENCE) +RANDO_ENUM_ITEM(RAND_INF_HC_WONDER_LEFT_TORCH) +RANDO_ENUM_ITEM(RAND_INF_HC_WONDER_RIGHT_TORCH) +RANDO_ENUM_ITEM(RAND_INF_HC_WONDER_MOAT_1) +RANDO_ENUM_ITEM(RAND_INF_HC_WONDER_MOAT_2) +RANDO_ENUM_ITEM(RAND_INF_HC_WONDER_MOAT_3) +RANDO_ENUM_ITEM(RAND_INF_HC_WONDER_MOAT_4) +RANDO_ENUM_ITEM(RAND_INF_HC_WONDER_MOAT_5) +RANDO_ENUM_ITEM(RAND_INF_HC_WONDER_MOAT_6) +RANDO_ENUM_ITEM(RAND_INF_HC_WONDER_MOAT_7) +RANDO_ENUM_ITEM(RAND_INF_HC_WONDER_MOAT_8) +RANDO_ENUM_ITEM(RAND_INF_HC_WONDER_MOAT_9) +RANDO_ENUM_ITEM(RAND_INF_HC_WONDER_MOAT_10) +RANDO_ENUM_ITEM(RAND_INF_HC_WONDER_COURTYARD_RIGHT_WINDOW) +RANDO_ENUM_ITEM(RAND_INF_HC_WONDER_COURTYARD_LEFT_WINDOW) +RANDO_ENUM_ITEM(RAND_INF_LW_WONDER_BACK_SKULL_KIDS_GRASS_1) +RANDO_ENUM_ITEM(RAND_INF_LW_WONDER_BACK_SKULL_KIDS_GRASS_2) +RANDO_ENUM_ITEM(RAND_INF_LW_WONDER_FRONT_SKULL_KIDS_GRASS) +RANDO_ENUM_ITEM(RAND_INF_SFM_WONDER_ENTRANCE) +RANDO_ENUM_ITEM(RAND_INF_SFM_WONDER_MAZE_1) +RANDO_ENUM_ITEM(RAND_INF_SFM_WONDER_MAZE_2) +RANDO_ENUM_ITEM(RAND_INF_SFM_WONDER_MAZE_3) +RANDO_ENUM_ITEM(RAND_INF_SFM_WONDER_MAZE_4) +RANDO_ENUM_ITEM(RAND_INF_SFM_WONDER_MAZE_5) +RANDO_ENUM_ITEM(RAND_INF_KAK_WONDER_UNDER_CONSTRUCTION) +RANDO_ENUM_ITEM(RAND_INF_KAK_WONDER_ABOVE_COW) +RANDO_ENUM_ITEM(RAND_INF_GY_WONDER_DAMPE_RACE_1) +RANDO_ENUM_ITEM(RAND_INF_GY_WONDER_DAMPE_RACE_2) +RANDO_ENUM_ITEM(RAND_INF_GY_WONDER_DAMPE_RACE_3) +RANDO_ENUM_ITEM(RAND_INF_GY_WONDER_DAMPE_RACE_4) +RANDO_ENUM_ITEM(RAND_INF_GY_WONDER_DAMPE_RACE_5) +RANDO_ENUM_ITEM(RAND_INF_GY_WONDER_DAMPE_RACE_6) +RANDO_ENUM_ITEM(RAND_INF_GY_WONDER_DAMPE_RACE_7) +RANDO_ENUM_ITEM(RAND_INF_GY_WONDER_DAMPE_RACE_8) +RANDO_ENUM_ITEM(RAND_INF_GY_WONDER_DAMPE_RACE_9) +RANDO_ENUM_ITEM(RAND_INF_GY_WONDER_DAMPE_RACE_10) +RANDO_ENUM_ITEM(RAND_INF_GY_WONDER_DAMPE_RACE_11) +RANDO_ENUM_ITEM(RAND_INF_GY_WONDER_DAMPE_RACE_12) +RANDO_ENUM_ITEM(RAND_INF_GY_WONDER_DAMPE_RACE_13) +RANDO_ENUM_ITEM(RAND_INF_GY_WONDER_DAMPE_RACE_14) +RANDO_ENUM_ITEM(RAND_INF_GY_WONDER_DAMPE_RACE_15) +RANDO_ENUM_ITEM(RAND_INF_DMC_WONDER_BENEATH_BRIDGE_PLATFORM) +RANDO_ENUM_ITEM(RAND_INF_ZR_WONDER_NEAR_DOMAIN_1) +RANDO_ENUM_ITEM(RAND_INF_ZR_WONDER_NEAR_DOMAIN_2) +RANDO_ENUM_ITEM(RAND_INF_ZR_WONDER_NEAR_DOMAIN_3) +RANDO_ENUM_ITEM(RAND_INF_ZR_WONDER_NEAR_DOMAIN_4) +RANDO_ENUM_ITEM(RAND_INF_ZR_WONDER_BEFORE_LADDER_1) +RANDO_ENUM_ITEM(RAND_INF_ZR_WONDER_BEFORE_LADDER_2) +RANDO_ENUM_ITEM(RAND_INF_ZR_WONDER_BEFORE_LADDER_3) +RANDO_ENUM_ITEM(RAND_INF_ZR_WONDER_BEFORE_LADDER_4) +RANDO_ENUM_ITEM(RAND_INF_ZR_WONDER_BEFORE_LADDER_5) +RANDO_ENUM_ITEM(RAND_INF_ZR_WONDER_BEFORE_LADDER_6) +RANDO_ENUM_ITEM(RAND_INF_ZR_WONDER_AFTER_LADDER_1) +RANDO_ENUM_ITEM(RAND_INF_ZR_WONDER_AFTER_LADDER_2) +RANDO_ENUM_ITEM(RAND_INF_ZR_WONDER_AFTER_LADDER_3) +RANDO_ENUM_ITEM(RAND_INF_ZR_WONDER_FROG_BRIDGE_1) +RANDO_ENUM_ITEM(RAND_INF_ZR_WONDER_FROG_BRIDGE_2) +RANDO_ENUM_ITEM(RAND_INF_ZR_WONDER_FROG_BRIDGE_3) +RANDO_ENUM_ITEM(RAND_INF_ZR_WONDER_PILLARS_1) +RANDO_ENUM_ITEM(RAND_INF_ZR_WONDER_PILLARS_2) +RANDO_ENUM_ITEM(RAND_INF_ZR_WONDER_PILLARS_3) +RANDO_ENUM_ITEM(RAND_INF_ZR_WONDER_PILLARS_4) +RANDO_ENUM_ITEM(RAND_INF_ZR_WONDER_LOWER_LAND_BRIDGE_1) +RANDO_ENUM_ITEM(RAND_INF_ZR_WONDER_LOWER_LAND_BRIDGE_2) +RANDO_ENUM_ITEM(RAND_INF_ZR_WONDER_LOWER_LAND_BRIDGE_3) +RANDO_ENUM_ITEM(RAND_INF_ZR_WONDER_LOWER_LAND_BRIDGE_4) +RANDO_ENUM_ITEM(RAND_INF_ZR_WONDER_NEAR_CUCCO_1) +RANDO_ENUM_ITEM(RAND_INF_ZR_WONDER_NEAR_CUCCO_2) +RANDO_ENUM_ITEM(RAND_INF_ZR_WONDER_NEAR_CUCCO_3) +RANDO_ENUM_ITEM(RAND_INF_ZR_WONDER_LOWER_RIVER_1) +RANDO_ENUM_ITEM(RAND_INF_ZR_WONDER_LOWER_RIVER_2) +RANDO_ENUM_ITEM(RAND_INF_ZR_WONDER_LOWER_RIVER_3) +RANDO_ENUM_ITEM(RAND_INF_ZR_WONDER_LOWER_RIVER_4) +RANDO_ENUM_ITEM(RAND_INF_ZF_WONDER_ROCK) +RANDO_ENUM_ITEM(RAND_INF_GV_WONDER_LOWER_WATERFALL) +RANDO_ENUM_ITEM(RAND_INF_GV_WONDER_UPPER_WATERFALL) +RANDO_ENUM_ITEM(RAND_INF_GF_WONDER_ENTRANCE_SIGN) +RANDO_ENUM_ITEM(RAND_INF_GF_WONDER_ARCHERY_SIGN) +RANDO_ENUM_ITEM(RAND_INF_TH_WONDER_1_TORCH_1) +RANDO_ENUM_ITEM(RAND_INF_TH_WONDER_1_TORCH_2) +RANDO_ENUM_ITEM(RAND_INF_TH_WONDER_STEEP_SLOPE_LOWER_EXIT) +RANDO_ENUM_ITEM(RAND_INF_TH_WONDER_STEEP_SLOPE_UPPER_EXIT) +RANDO_ENUM_ITEM(RAND_INF_TH_WONDER_DOUBLE_JAIL_LOWER_EXIT) +RANDO_ENUM_ITEM(RAND_INF_TH_WONDER_DOUBLE_JAIL_UPPER_EXIT) +RANDO_ENUM_ITEM(RAND_INF_TH_WONDER_KITCHEN_SKULL) +RANDO_ENUM_ITEM(RAND_INF_TH_WONDER_KITCHEN_SOUP) +RANDO_ENUM_ITEM(RAND_INF_TH_WONDER_DEAD_END_SKULL_ENTRANCE) +RANDO_ENUM_ITEM(RAND_INF_TH_WONDER_DEAD_END_SKULL_NEAR_JAIL) +RANDO_ENUM_ITEM(RAND_INF_TH_WONDER_BREAK_ROOM_BOTTOM_SKULL) +RANDO_ENUM_ITEM(RAND_INF_TH_WONDER_BREAK_ROOM_TOP_SKULL) +RANDO_ENUM_ITEM(RAND_INF_COLOSSUS_WONDER_OASIS_TREE_1) +RANDO_ENUM_ITEM(RAND_INF_COLOSSUS_WONDER_OASIS_TREE_2) +RANDO_ENUM_ITEM(RAND_INF_COLOSSUS_WONDER_OASIS_CHILD_TREE) +RANDO_ENUM_ITEM(RAND_INF_COLOSSUS_WONDER_GF_TREE_1) +RANDO_ENUM_ITEM(RAND_INF_COLOSSUS_WONDER_GF_TREE_2) +// Dungeon Wonder Items +RANDO_ENUM_ITEM(RAND_INF_SHADOW_TEMPLE_WONDER_THREE_POTS) +RANDO_ENUM_ITEM(RAND_INF_GERUDO_TRAINING_GROUND_WONDER_BEAMOS_ROOM) +RANDO_ENUM_ITEM(RAND_INF_GERUDO_TRAINING_GROUND_WONDER_EYE_STATUE_ROOM) +RANDO_ENUM_ITEM(RAND_INF_GERUDO_TRAINING_GROUND_WONDER_TORCH_SLUGS_ROOM) +// MQ Dungeon Wonder Items +RANDO_ENUM_ITEM(RAND_INF_DEKU_TREE_MQ_WONDER_BASEMENT_GRAVE_1) +RANDO_ENUM_ITEM(RAND_INF_DEKU_TREE_MQ_WONDER_BASEMENT_GRAVE_2) +RANDO_ENUM_ITEM(RAND_INF_DEKU_TREE_MQ_WONDER_BASEMENT_GRAVE_3) +RANDO_ENUM_ITEM(RAND_INF_DEKU_TREE_MQ_WONDER_BASEMENT_GRAVE_4) +RANDO_ENUM_ITEM(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_ENTRANCE_LEFT_COW) +RANDO_ENUM_ITEM(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_ENTRANCE_RIGHT_COW) +RANDO_ENUM_ITEM(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_ELEVATOR_COW) +RANDO_ENUM_ITEM(RAND_INF_JABU_JABUS_BELLY_MQ_HOLES_COW) +RANDO_ENUM_ITEM(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_RIGHT_COW_1) +RANDO_ENUM_ITEM(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_RIGHT_COW_2) +RANDO_ENUM_ITEM(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_RIGHT_COW_3) +RANDO_ENUM_ITEM(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_LEFT_COW_1) +RANDO_ENUM_ITEM(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_LEFT_COW_2) +RANDO_ENUM_ITEM(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_BASEMENT_LEFT_COW_3) +RANDO_ENUM_ITEM(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_AFTER_BIG_OCTO) +RANDO_ENUM_ITEM(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_JIGGLIES_COW) +RANDO_ENUM_ITEM(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_RIGHT_1) +RANDO_ENUM_ITEM(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_RIGHT_2) +RANDO_ENUM_ITEM(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_RIGHT_3) +RANDO_ENUM_ITEM(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_LEFT_1) +RANDO_ENUM_ITEM(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_LEFT_2) +RANDO_ENUM_ITEM(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_COW_LEFT_3) +RANDO_ENUM_ITEM(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_EXPLOSION_1) +RANDO_ENUM_ITEM(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_EXPLOSION_2) +RANDO_ENUM_ITEM(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_FALLING_LIKE_LIKES_EXPLOSION_3) +RANDO_ENUM_ITEM(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_BEFORE_BOSS_LEFT_COW) +RANDO_ENUM_ITEM(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_BEFORE_BOSS_RIGHT_COW_1) +RANDO_ENUM_ITEM(RAND_INF_JABU_JABUS_BELLY_MQ_WONDER_BEFORE_BOSS_RIGHT_COW_2) +RANDO_ENUM_ITEM(RAND_INF_FIRE_TEMPLE_MQ_WONDER_SHORTCUT_ROOM_1) +RANDO_ENUM_ITEM(RAND_INF_FIRE_TEMPLE_MQ_WONDER_SHORTCUT_ROOM_2) +RANDO_ENUM_ITEM(RAND_INF_FIRE_TEMPLE_MQ_WONDER_SHORTCUT_ROOM_3) +RANDO_ENUM_ITEM(RAND_INF_FIRE_TEMPLE_MQ_WONDER_BOSS_KEY_ROOM_HOOKSHOT) +RANDO_ENUM_ITEM(RAND_INF_FIRE_TEMPLE_MQ_WONDER_BOSS_KEY_ROOM_BOW) +RANDO_ENUM_ITEM(RAND_INF_FIRE_TEMPLE_MQ_WONDER_LIZALFOS_MAZE) +RANDO_ENUM_ITEM(RAND_INF_FIRE_TEMPLE_MQ_WONDER_EAST_TOWER_LARGE_FACE_1) +RANDO_ENUM_ITEM(RAND_INF_FIRE_TEMPLE_MQ_WONDER_EAST_TOWER_LARGE_FACE_2) +RANDO_ENUM_ITEM(RAND_INF_FIRE_TEMPLE_MQ_WONDER_EAST_TOWER_SMALL_FACE_1) +RANDO_ENUM_ITEM(RAND_INF_FIRE_TEMPLE_MQ_WONDER_EAST_TOWER_SMALL_FACE_2) +RANDO_ENUM_ITEM(RAND_INF_FIRE_TEMPLE_MQ_WONDER_TORCH_ROOM) +RANDO_ENUM_ITEM(RAND_INF_FIRE_TEMPLE_MQ_WONDER_FIRE_MAZE) +RANDO_ENUM_ITEM(RAND_INF_FIRE_TEMPLE_MQ_WONDER_AFTER_FLARE_DANCER) +RANDO_ENUM_ITEM(RAND_INF_FIRE_TEMPLE_MQ_WONDER_STAIRCASE) +RANDO_ENUM_ITEM(RAND_INF_WATER_TEMPLE_MQ_WONDER_LIZALFOS_ROOM) +RANDO_ENUM_ITEM(RAND_INF_WATER_TEMPLE_MQ_WONDER_LONGSHOT_ROOM) +RANDO_ENUM_ITEM(RAND_INF_WATER_TEMPLE_MQ_WONDER_STALFOS_ROOM) +RANDO_ENUM_ITEM(RAND_INF_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_RIGHT_1) +RANDO_ENUM_ITEM(RAND_INF_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_RIGHT_2) +RANDO_ENUM_ITEM(RAND_INF_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_RIGHT_3) +RANDO_ENUM_ITEM(RAND_INF_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_LEFT_1) +RANDO_ENUM_ITEM(RAND_INF_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_LEFT_2) +RANDO_ENUM_ITEM(RAND_INF_WATER_TEMPLE_MQ_WONDER_HOOKSHOT_STAIRCASE_LEFT_3) +RANDO_ENUM_ITEM(RAND_INF_WATER_TEMPLE_MQ_WONDER_AFTER_DARK_LINK) +RANDO_ENUM_ITEM(RAND_INF_WATER_TEMPLE_MQ_WONDER_DRAGON_ROOM_LEFT_EYE) +RANDO_ENUM_ITEM(RAND_INF_WATER_TEMPLE_MQ_WONDER_DRAGON_ROOM_RIGHT_EYE) +RANDO_ENUM_ITEM(RAND_INF_WATER_TEMPLE_MQ_WONDER_DRAGON_ROOM_PORTRAIT) +RANDO_ENUM_ITEM(RAND_INF_WATER_TEMPLE_MQ_WONDER_TRIPLE_TORCHES) +RANDO_ENUM_ITEM(RAND_INF_WATER_TEMPLE_MQ_WONDER_WATER_SPROUTS_1) +RANDO_ENUM_ITEM(RAND_INF_WATER_TEMPLE_MQ_WONDER_WATER_SPROUTS_2) +RANDO_ENUM_ITEM(RAND_INF_WATER_TEMPLE_MQ_WONDER_FREESTANDING_ROOM) +RANDO_ENUM_ITEM(RAND_INF_WATER_TEMPLE_MQ_WONDER_BEFORE_BOSS_1) +RANDO_ENUM_ITEM(RAND_INF_WATER_TEMPLE_MQ_WONDER_BEFORE_BOSS_2) +RANDO_ENUM_ITEM(RAND_INF_WATER_TEMPLE_MQ_WONDER_UNDER_PILLAR_ROOM) +RANDO_ENUM_ITEM(RAND_INF_WATER_TEMPLE_MQ_WONDER_LIZALFOS_HALLWAY) +RANDO_ENUM_ITEM(RAND_INF_WATER_TEMPLE_MQ_WONDER_GS_STORAGE_ROOM) +RANDO_ENUM_ITEM(RAND_INF_SPIRIT_TEMPLE_MQ_WONDER_CHEST_HAMMER) +RANDO_ENUM_ITEM(RAND_INF_SPIRIT_TEMPLE_MQ_WONDER_CHEST_SLASH) +RANDO_ENUM_ITEM(RAND_INF_SHADOW_TEMPLE_MQ_WONDER_THREE_POTS) +RANDO_ENUM_ITEM(RAND_INF_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_LEFT_1) +RANDO_ENUM_ITEM(RAND_INF_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_LEFT_2) +RANDO_ENUM_ITEM(RAND_INF_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_LEFT_3) +RANDO_ENUM_ITEM(RAND_INF_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_LEFT_4) +RANDO_ENUM_ITEM(RAND_INF_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_RIGHT_1) +RANDO_ENUM_ITEM(RAND_INF_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_RIGHT_2) +RANDO_ENUM_ITEM(RAND_INF_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_RIGHT_3) +RANDO_ENUM_ITEM(RAND_INF_BOTTOM_OF_THE_WELL_MQ_WONDER_MAIN_ROOM_RIGHT_4) +RANDO_ENUM_ITEM(RAND_INF_BOTTOM_OF_THE_WELL_MQ_WONDER_SIDE_ROOM_1) +RANDO_ENUM_ITEM(RAND_INF_BOTTOM_OF_THE_WELL_MQ_WONDER_SIDE_ROOM_2) +RANDO_ENUM_ITEM(RAND_INF_BOTTOM_OF_THE_WELL_MQ_WONDER_SIDE_ROOM_3) +RANDO_ENUM_ITEM(RAND_INF_BOTTOM_OF_THE_WELL_MQ_WONDER_SIDE_ROOM_4) +RANDO_ENUM_ITEM(RAND_INF_GERUDO_TRAINING_GROUND_MQ_WONDER_DINOLFOS_ROOM) +RANDO_ENUM_ITEM(RAND_INF_GERUDO_TRAINING_GROUND_MQ_WONDER_EYE_STATUE) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_MQ_WONDER_SHADOW_TRIAL) +// End Wonder Items + RANDO_ENUM_ITEM(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_1) RANDO_ENUM_ITEM(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_2) RANDO_ENUM_ITEM(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_3) diff --git a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerMiscEnums.h b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerMiscEnums.h index a7305b382..9581e44e1 100644 --- a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerMiscEnums.h +++ b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerMiscEnums.h @@ -119,6 +119,7 @@ RANDO_ENUM_ITEM(RCTYPE_SMALL_CRATE) // Small crates RANDO_ENUM_ITEM(RCTYPE_TREE) // Trees RANDO_ENUM_ITEM(RCTYPE_NLTREE) // NL Trees RANDO_ENUM_ITEM(RCTYPE_BUSH) // Bushes +RANDO_ENUM_ITEM(RCTYPE_WONDER_ITEM) // Wonder Items RANDO_ENUM_ITEM(RCTYPE_DUNGEON_REWARD) // Dungeon rewards (blue warps) RANDO_ENUM_ITEM(RCTYPE_OCARINA) // Ocarina locations RANDO_ENUM_ITEM(RCTYPE_BEEHIVE) // Beehives diff --git a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerOptions.h b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerOptions.h index c141f6e9c..b81225cb2 100644 --- a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerOptions.h +++ b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerOptions.h @@ -365,6 +365,14 @@ RANDO_ENUM_ITEM(RO_SHUFFLE_FREESTANDING_OVERWORLD) RANDO_ENUM_ITEM(RO_SHUFFLE_FREESTANDING_ALL) RANDO_ENUM_END(RandoOptionFreestanding) +// Wonder Items settings (off, dungeons, overworld, all) +RANDO_ENUM_BEGIN(RandoOptionWonderItems) +RANDO_ENUM_ITEM(RO_SHUFFLE_WONDER_ITEMS_OFF) +RANDO_ENUM_ITEM(RO_SHUFFLE_WONDER_ITEMS_DUNGEONS) +RANDO_ENUM_ITEM(RO_SHUFFLE_WONDER_ITEMS_OVERWORLD) +RANDO_ENUM_ITEM(RO_SHUFFLE_WONDER_ITEMS_ALL) +RANDO_ENUM_END(RandoOptionWonderItems) + // Shuffle Pots settings (off, dungeons, overworld, all) RANDO_ENUM_BEGIN(RandoOptionShufflePots) RANDO_ENUM_ITEM(RO_SHUFFLE_POTS_OFF) diff --git a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerRegion.h b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerRegion.h index 6a60f3512..0697bd82e 100644 --- a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerRegion.h +++ b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerRegion.h @@ -114,7 +114,8 @@ RANDO_ENUM_ITEM(RR_TH_KITCHEN_MAIN) RANDO_ENUM_ITEM(RR_TH_KITCHEN_BY_CORRIDOR) RANDO_ENUM_ITEM(RR_TH_KITCHEN_OPPOSITE_CORRIDOR) RANDO_ENUM_ITEM(RR_TH_BREAK_ROOM) -RANDO_ENUM_ITEM(RR_TH_BREAK_ROOM_CORRIDOR) +RANDO_ENUM_ITEM(RR_TH_BREAK_ROOM_LOWER_CORRIDOR) +RANDO_ENUM_ITEM(RR_TH_BREAK_ROOM_UPPER_CORRIDOR) RANDO_ENUM_ITEM(RR_WASTELAND_NEAR_FORTRESS) RANDO_ENUM_ITEM(RR_HAUNTED_WASTELAND) RANDO_ENUM_ITEM(RR_WASTELAND_NEAR_COLOSSUS) @@ -710,7 +711,8 @@ RANDO_ENUM_ITEM(RR_WATER_TEMPLE_MQ_SCARECROW_CANAL) RANDO_ENUM_ITEM(RR_WATER_TEMPLE_MQ_CANAL_ALCOVE) RANDO_ENUM_ITEM(RR_WATER_TEMPLE_MQ_BEHIND_CANAL) RANDO_ENUM_ITEM(RR_WATER_TEMPLE_MQ_FREESTANDING_ROOM) -RANDO_ENUM_ITEM(RR_WATER_TEMPLE_MQ_3_JETS_ROOM) +RANDO_ENUM_ITEM(RR_WATER_TEMPLE_MQ_3_JETS_ROOM_SWITCH_SIDE) +RANDO_ENUM_ITEM(RR_WATER_TEMPLE_MQ_3_JETS_ROOM_NO_SWITCH_SIDE) RANDO_ENUM_ITEM(RR_WATER_TEMPLE_MQ_DODONGO_ROOM) RANDO_ENUM_ITEM(RR_WATER_TEMPLE_MQ_CRATE_VORTEX_CAGE) diff --git a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerSettingKey.h b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerSettingKey.h index 55327a67d..762f747c7 100644 --- a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerSettingKey.h +++ b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerSettingKey.h @@ -237,6 +237,7 @@ RANDO_ENUM_ITEM(RSK_SKELETON_KEY) RANDO_ENUM_ITEM(RSK_SHUFFLE_DEKU_STICK_BAG) RANDO_ENUM_ITEM(RSK_SHUFFLE_DEKU_NUT_BAG) RANDO_ENUM_ITEM(RSK_SHUFFLE_FREESTANDING) +RANDO_ENUM_ITEM(RSK_SHUFFLE_WONDER_ITEMS) RANDO_ENUM_ITEM(RSK_SHUFFLE_FOUNTAIN_FAIRIES) RANDO_ENUM_ITEM(RSK_SHUFFLE_STONE_FAIRIES) RANDO_ENUM_ITEM(RSK_SHUFFLE_BEAN_FAIRIES) diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp index 1f80d639b..23b7f505e 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp @@ -199,6 +199,8 @@ void RandomizerCheckObjects::UpdateImGuiVisibility() { CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleTrees"), RO_GENERIC_NO)) && (location.GetRCType() != RCTYPE_SIGN || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleSigns"), RO_GENERIC_NO)) && + (location.GetRCType() != RCTYPE_WONDER_ITEM || + CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleWonderItems"), RO_GENERIC_NO)) && (location.GetRCType() != RCTYPE_FISH || ctx->GetFishsanity()->GetFishLocationIncluded(&location, FSO_SOURCE_CVARS)) && (location.GetRCType() != RCTYPE_ADULT_TRADE || diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index c8c7511bf..e52f6bd0a 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -81,6 +81,8 @@ bool showTrees; bool showBushes; bool showOverworldSigns; bool showDungeonSigns; +bool showOverworldWonderItems; +bool showDungeonWonderItems; bool showFrogSongRupees; bool showFountainFairies; bool showStoneFairies; @@ -1491,6 +1493,25 @@ void LoadSettings() { } showTrees = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_TREES); showBushes = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_BUSHES); + + switch (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_WONDER_ITEMS)) { + case RO_SHUFFLE_WONDER_ITEMS_ALL: + showOverworldWonderItems = true; + showDungeonWonderItems = true; + break; + case RO_SHUFFLE_WONDER_ITEMS_OVERWORLD: + showOverworldWonderItems = true; + showDungeonWonderItems = false; + break; + case RO_SHUFFLE_WONDER_ITEMS_DUNGEONS: + showOverworldWonderItems = false; + showDungeonWonderItems = true; + break; + default: + showOverworldWonderItems = false; + showDungeonWonderItems = false; + break; + } } else { // Vanilla showOverworldTokens = true; showDungeonTokens = true; @@ -1504,6 +1525,8 @@ void LoadSettings() { showDungeonSigns = false; showTrees = false; showBushes = false; + showOverworldWonderItems = false; + showDungeonWonderItems = false; } fortressFast = false; @@ -1624,6 +1647,9 @@ bool IsCheckShuffled(RandomizerCheck rc) { (loc->GetRCType() != RCTYPE_SIGN || (showOverworldSigns && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || (showDungeonSigns && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && + (loc->GetRCType() != RCTYPE_WONDER_ITEM || + (showOverworldWonderItems && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || + (showDungeonWonderItems && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && (loc->GetRCType() != RCTYPE_FISH || OTRGlobals::Instance->gRandoContext->GetFishsanity()->GetFishLocationIncluded(loc)) && (loc->GetRCType() != RCTYPE_FREESTANDING || diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index f0da76ac8..581ce39bf 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -1039,6 +1039,7 @@ void Settings::CreateOptions() { } }); OPT_U8(RSK_SHUFFLE_FREESTANDING, "Shuffle Freestanding Items", {"Off", "Dungeons", "Overworld", "All Items"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleFreestanding"), mOptionDescriptions[RSK_SHUFFLE_FREESTANDING], WIDGET_CVAR_COMBOBOX, RO_SHUFFLE_FREESTANDING_OFF); + OPT_U8(RSK_SHUFFLE_WONDER_ITEMS, "Shuffle Wonder Items", {"Off", "Dungeons", "Overworld", "All Items"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleWonderItems"), mOptionDescriptions[RSK_SHUFFLE_WONDER_ITEMS], WIDGET_CVAR_COMBOBOX, RO_SHUFFLE_WONDER_ITEMS_OFF); OPT_U8(RSK_FISHSANITY, "Fishsanity", {"Off", "Shuffle only Hyrule Loach", "Shuffle Fishing Pond", "Shuffle Overworld Fish", "Shuffle Both"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("Fishsanity"), mOptionDescriptions[RSK_FISHSANITY], WIDGET_CVAR_COMBOBOX, RO_FISHSANITY_OFF); OPT_CALLBACK(RSK_FISHSANITY, { // Hide fishing pond settings if we aren't shuffling the fishing pond @@ -1850,6 +1851,7 @@ void Settings::CreateOptions() { &mOptions[RSK_FISHSANITY_POND_COUNT], &mOptions[RSK_FISHSANITY_AGE_SPLIT], &mOptions[RSK_SHUFFLE_FREESTANDING], + &mOptions[RSK_SHUFFLE_WONDER_ITEMS], &mOptions[RSK_SHUFFLE_BEEHIVES], &mOptions[RSK_SHUFFLE_COWS], &mOptions[RSK_SHUFFLE_POTS], @@ -2172,6 +2174,7 @@ void Settings::CreateOptions() { &mOptions[RSK_SHUFFLE_DEKU_STICK_BAG], &mOptions[RSK_SHUFFLE_DEKU_NUT_BAG], &mOptions[RSK_SHUFFLE_FREESTANDING], + &mOptions[RSK_SHUFFLE_WONDER_ITEMS], &mOptions[RSK_SHUFFLE_FOUNTAIN_FAIRIES], &mOptions[RSK_SHUFFLE_STONE_FAIRIES], &mOptions[RSK_SHUFFLE_BEAN_FAIRIES], diff --git a/soh/soh/Enhancements/randomizer/static_data.h b/soh/soh/Enhancements/randomizer/static_data.h index 149a1b707..8d91f9b70 100644 --- a/soh/soh/Enhancements/randomizer/static_data.h +++ b/soh/soh/Enhancements/randomizer/static_data.h @@ -63,6 +63,7 @@ class StaticData { static void RegisterCrateLocations(); static void RegisterTreeLocations(); static void RegisterSignLocations(); + static void RegisterWonderItemLocations(); static void InitHashMaps(); static std::array, 17> randomizerFishingPondFish; static std::unordered_map randomizerGrottoFishMap; diff --git a/soh/src/overlays/actors/ovl_En_Heishi1/z_en_heishi1.c b/soh/src/overlays/actors/ovl_En_Heishi1/z_en_heishi1.c index 3ca583033..9107ed6b4 100644 --- a/soh/src/overlays/actors/ovl_En_Heishi1/z_en_heishi1.c +++ b/soh/src/overlays/actors/ovl_En_Heishi1/z_en_heishi1.c @@ -8,6 +8,7 @@ #include "objects/object_sd/object_sd.h" #include "vt.h" #include "soh/ResourceManagerHelpers.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED @@ -124,15 +125,21 @@ void EnHeishi1_Init(Actor* thisx, PlayState* play) { (Flags_GetEventChkInf(EVENTCHKINF_LEARNED_ZELDAS_LULLABY)); if (this->type != 5) { - if ((gSaveContext.dayTime < 0xB888 || IS_DAY) && - ((!IS_RANDO && !Flags_GetEventChkInf(EVENTCHKINF_ZELDA_FLED_HYRULE_CASTLE)) || (IS_RANDO && !metZelda))) { + if (GameInteractor_Should(VB_WONDER_HEISHI_PATROLLING, + (gSaveContext.dayTime < 0xB888 || IS_DAY) && + ((!IS_RANDO && !Flags_GetEventChkInf(EVENTCHKINF_ZELDA_FLED_HYRULE_CASTLE)) || + (IS_RANDO && !metZelda)), + this)) { this->actionFunc = EnHeishi1_SetupWalk; } else { Actor_Kill(&this->actor); } } else { - if ((gSaveContext.dayTime >= 0xB889) || !IS_DAY || - (!IS_RANDO && Flags_GetEventChkInf(EVENTCHKINF_ZELDA_FLED_HYRULE_CASTLE)) || (IS_RANDO && metZelda)) { + if (GameInteractor_Should(VB_WONDER_HEISHI_PATROLLING, + (gSaveContext.dayTime >= 0xB889) || !IS_DAY || + (!IS_RANDO && Flags_GetEventChkInf(EVENTCHKINF_ZELDA_FLED_HYRULE_CASTLE)) || + (IS_RANDO && metZelda), + this)) { this->actionFunc = EnHeishi1_SetupWaitNight; } else { Actor_Kill(&this->actor); diff --git a/soh/src/overlays/actors/ovl_En_Heishi2/z_en_heishi2.c b/soh/src/overlays/actors/ovl_En_Heishi2/z_en_heishi2.c index b6c1b866b..e1662198a 100644 --- a/soh/src/overlays/actors/ovl_En_Heishi2/z_en_heishi2.c +++ b/soh/src/overlays/actors/ovl_En_Heishi2/z_en_heishi2.c @@ -679,10 +679,12 @@ void func_80A5455C(EnHeishi2* this, PlayState* play) { pos.y = Rand_CenteredFloat(20.0f) + (this->unk_274.y - 40.0f); pos.z = Rand_CenteredFloat(20.0f) + (this->unk_274.z - 20.0f); rotY = Rand_CenteredFloat(7000.0f) + this->actor.yawTowardsPlayer; - bomb = (EnBom*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, pos.x, pos.y, pos.z, 0, rotY, 0, 0); - if (bomb != NULL) { - bomb->actor.speedXZ = Rand_CenteredFloat(5.0f) + 10.0f; - bomb->actor.velocity.y = Rand_CenteredFloat(5.0f) + 10.0f; + if (GameInteractor_Should(VB_WONDER_HEISHI_ITEM, true, &pos, rotY)) { + bomb = (EnBom*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, pos.x, pos.y, pos.z, 0, rotY, 0, 0); + if (bomb != NULL) { + bomb->actor.speedXZ = Rand_CenteredFloat(5.0f) + 10.0f; + bomb->actor.velocity.y = Rand_CenteredFloat(5.0f) + 10.0f; + } } // "This is down!" diff --git a/soh/src/overlays/actors/ovl_En_Wonder_Item/z_en_wonder_item.c b/soh/src/overlays/actors/ovl_En_Wonder_Item/z_en_wonder_item.c index d7c0ddf70..4003ab624 100644 --- a/soh/src/overlays/actors/ovl_En_Wonder_Item/z_en_wonder_item.c +++ b/soh/src/overlays/actors/ovl_En_Wonder_Item/z_en_wonder_item.c @@ -6,6 +6,7 @@ #include "z_en_wonder_item.h" #include "vt.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS 0 @@ -54,8 +55,8 @@ const ActorInit En_Wonder_Item_InitVars = { NULL, }; -static Vec3f sTagPointsFree[9]; -static Vec3f sTagPointsOrdered[9]; +Vec3f sTagPointsFree[9]; // SOH [Randomizer] remove static to use in ShuffleWonderItems +Vec3f sTagPointsOrdered[9]; // SOH [Randomizer] remove static to use in ShuffleWonderItems void EnWonderItem_Destroy(Actor* thisx, PlayState* play) { s32 pad; @@ -75,24 +76,26 @@ void EnWonderItem_DropCollectible(EnWonderItem* this, PlayState* play, s32 autoC s32 i; s32 randomDrop; - Sfx_PlaySfxCentered(NA_SE_SY_GET_ITEM); + if (GameInteractor_Should(VB_WONDER_DROP_ITEM, true, this)) { + Sfx_PlaySfxCentered(NA_SE_SY_GET_ITEM); - if (this->dropCount == 0) { - this->dropCount++; - } - for (i = this->dropCount; i > 0; i--) { - if (this->itemDrop < WONDERITEM_DROP_RANDOM) { - if ((this->itemDrop == WONDERITEM_DROP_FLEXIBLE) || !autoCollect) { - Item_DropCollectible(play, &this->actor.world.pos, dropTable[this->itemDrop]); + if (this->dropCount == 0) { + this->dropCount++; + } + for (i = this->dropCount; i > 0; i--) { + if (this->itemDrop < WONDERITEM_DROP_RANDOM) { + if ((this->itemDrop == WONDERITEM_DROP_FLEXIBLE) || !autoCollect) { + Item_DropCollectible(play, &this->actor.world.pos, dropTable[this->itemDrop]); + } else { + Item_DropCollectible(play, &this->actor.world.pos, dropTable[this->itemDrop] | 0x8000); + } } else { - Item_DropCollectible(play, &this->actor.world.pos, dropTable[this->itemDrop] | 0x8000); - } - } else { - randomDrop = this->itemDrop - WONDERITEM_DROP_RANDOM; - if (!autoCollect) { - Item_DropCollectibleRandom(play, NULL, &this->actor.world.pos, randomDrop); - } else { - Item_DropCollectibleRandom(play, NULL, &this->actor.world.pos, randomDrop | 0x8000); + randomDrop = this->itemDrop - WONDERITEM_DROP_RANDOM; + if (!autoCollect) { + Item_DropCollectibleRandom(play, NULL, &this->actor.world.pos, randomDrop); + } else { + Item_DropCollectibleRandom(play, NULL, &this->actor.world.pos, randomDrop | 0x8000); + } } } } @@ -104,9 +107,10 @@ void EnWonderItem_DropCollectible(EnWonderItem* this, PlayState* play, s32 autoC void EnWonderItem_Init(Actor* thisx, PlayState* play) { static u32 collisionTypes[] = { - 0x00000702 /* sword slash */, 0x0001F820 /* arrow */, 0x00000040 /* hammer */, 0x00000008 /* bomb */, - 0x00000004 /* slingshot */, 0x00000010 /* boomerang */, 0x00000080 /* hookshot */, - }; + 0x00000702 /* sword slash */, 0x0001F820 /* arrow */, 0x00000040 /* hammer */, + 0x00000008 /* bomb */, 0x00000004 /* slingshot */, 0x00000010 /* boomerang */, + 0x00000080 /* hookshot */, 0x0001F820 | 0x00000080 /* arrow or hookshot */ + }; // SOH [Port] add final array entry to avoid OOB behavior on Water MQ Torches room wonder item s32 pad; s16 colTypeIndex; EnWonderItem* this = (EnWonderItem*)thisx; @@ -125,7 +129,7 @@ void EnWonderItem_Init(Actor* thisx, PlayState* play) { this->switchFlag = -1; } this->actor.targetMode = 1; - if ((this->switchFlag >= 0) && Flags_GetSwitch(play, this->switchFlag)) { + if (GameInteractor_Should(VB_WONDER_SPAWN, (this->switchFlag >= 0) && Flags_GetSwitch(play, this->switchFlag))) { osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ You are Shock! ☆☆☆☆☆ %d\n" VT_RST, this->switchFlag); Actor_Kill(&this->actor); return; @@ -312,7 +316,7 @@ void EnWonderItem_BombSoldier(EnWonderItem* this, PlayState* play) { // "Careless soldier spawned" osSyncPrintf(VT_FGCOL(YELLOW) "☆☆☆☆☆ うっかり兵セット完了 ☆☆☆☆☆ \n" VT_RST); } - if (this->switchFlag >= 0) { + if (GameInteractor_Should(VB_WONDER_DROP_ITEM, this->switchFlag >= 0, this)) { Flags_SetSwitch(play, this->switchFlag); } Actor_Kill(&this->actor);