From eeca7626d801991a516e805469a3f4629117121b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= <159546+serprex@users.noreply.github.com> Date: Wed, 22 Apr 2026 14:50:14 +0000 Subject: [PATCH] rocksanity (#5015) Co-authored-by: Pepper0ni <93387759+Pepper0ni@users.noreply.github.com> --- soh/assets/custom/lang/en_US.json | 12 +- .../vanilla-behavior/GIVanillaBehavior.h | 17 + .../hint_list/hint_list_exclude_dungeon.cpp | 20 + .../hint_list/hint_list_exclude_overworld.cpp | 137 +++- .../randomizer/3drando/item_pool.cpp | 31 +- .../Enhancements/randomizer/SeedContext.cpp | 8 + .../randomizer/ShuffleIcicles.cpp | 3 +- .../Enhancements/randomizer/ShuffleRocks.cpp | 612 ++++++++++++++++++ .../Enhancements/randomizer/ShuffleRocks.h | 15 + .../Enhancements/randomizer/ShuffleSigns.cpp | 23 +- .../randomizer/ShuffleWonderItems.cpp | 23 +- soh/soh/Enhancements/randomizer/location.cpp | 17 + soh/soh/Enhancements/randomizer/location.h | 28 +- .../dungeons/bottom_of_the_well.cpp | 34 +- .../location_access/dungeons/deku_tree.cpp | 12 +- .../dungeons/dodongos_cavern.cpp | 32 +- .../dungeons/forest_temple.cpp | 4 +- .../dungeons/jabujabus_belly.cpp | 22 +- .../dungeons/spirit_temple.cpp | 19 +- .../overworld/castle_grounds.cpp | 23 +- .../overworld/death_mountain_crater.cpp | 41 +- .../overworld/death_mountain_trail.cpp | 57 +- .../overworld/desert_colossus.cpp | 20 +- .../overworld/gerudo_valley.cpp | 46 +- .../location_access/overworld/goron_city.cpp | 51 ++ .../location_access/overworld/graveyard.cpp | 1 + .../overworld/hyrule_field.cpp | 16 + .../location_access/overworld/kakariko.cpp | 6 +- .../overworld/kokiri_forest.cpp | 12 + .../location_access/overworld/lake_hylia.cpp | 1 + .../location_access/overworld/lost_woods.cpp | 3 + .../overworld/zoras_domain.cpp | 10 +- .../overworld/zoras_fountain.cpp | 3 + .../location_access/overworld/zoras_river.cpp | 32 +- soh/soh/Enhancements/randomizer/logic.cpp | 4 + soh/soh/Enhancements/randomizer/logic.h | 1 + .../randomizer/option_descriptions.cpp | 2 + .../Enhancements/randomizer/randomizer.cpp | 320 ++++++++- soh/soh/Enhancements/randomizer/randomizer.h | 1 + .../randomizerEnums/RandomizerCheck.h | 288 +++++++++ .../randomizerEnums/RandomizerHintTextKey.h | 42 ++ .../randomizerEnums/RandomizerInf.h | 285 ++++++++ .../randomizerEnums/RandomizerMiscEnums.h | 2 + .../randomizerEnums/RandomizerOptions.h | 8 + .../randomizerEnums/RandomizerSettingKey.h | 2 + .../randomizerEnums/RandomizerTrick.h | 1 + .../randomizer/randomizer_check_tracker.cpp | 35 +- soh/soh/Enhancements/randomizer/settings.cpp | 7 + soh/soh/Enhancements/randomizer/static_data.h | 1 + .../overlays/actors/ovl_En_Ishi/z_en_ishi.c | 3 +- .../actors/ovl_Obj_Bombiwa/z_obj_bombiwa.c | 4 +- .../actors/ovl_Obj_Hamishi/z_obj_hamishi.c | 4 +- 52 files changed, 2250 insertions(+), 151 deletions(-) create mode 100644 soh/soh/Enhancements/randomizer/ShuffleRocks.cpp create mode 100644 soh/soh/Enhancements/randomizer/ShuffleRocks.h diff --git a/soh/assets/custom/lang/en_US.json b/soh/assets/custom/lang/en_US.json index 60a53aadf3..ca7396d8a3 100644 --- a/soh/assets/custom/lang/en_US.json +++ b/soh/assets/custom/lang/en_US.json @@ -198,6 +198,14 @@ "- Water Temple near boss key chest Gold Skulltula\n", "- Shadow MQ after boat and before boss Gold Skulltulas" ] + }, + "bomb_detonation": { + "name": "Precise Bomb Detonation", + "description": [ + "This trick enables methods that rely on precisely timing the detonation of bombs, ", + "such as detonating bombs on the surface of the water to destroy underwater rocks ", + "or getting the Gold Skulltula in the first room of forest temple as Child." + ] }, "kf_adult_gs": { "name": "Adult Kokiri Forest GS with Hover Boots", @@ -596,8 +604,8 @@ "description": "Boomerang can fish the item out of the rubble without needing explosives to blow it up." }, "forest_first_gs": { - "name": "Forest Temple First Room GS with Difficult-to-Use Weapons", - "description": "Allows killing this Skulltula with Sword or Sticks by jumpslashing it as you let go from the vines. You can avoid taking fall damage by recoiling onto the tree. Also allows killing it as Child with a Bomb throw. It's much more difficult to use a Bomb as child due to Child Link's shorter height." + "name": "Forest Temple First Room GS with Melee Weapons", + "description": "Allows killing this Skulltula with Sword or Sticks by jumpslashing it as you let go from the vines." }, "forest_courtyard_east_gs": { "name": "Forest Temple East Courtyard GS with Boomerang", diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index e87a3ff552..d1ed453410 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -268,6 +268,15 @@ typedef enum { // - `*Actor` (interactRangeActor) VB_BOTTLE_ACTOR, + // #### `result` + // Actor is ACTOR_OBJ_BOMBIWA, or ACTOR_OBJ_HAMISHI + // ```c + // Flags_GetSwitch(play, this->actor.params & 0x3F) + // ``` + // #### `args` + // - `*Actor` (interactRangeActor) + VB_BOULDER_BREAK_FLAG, + // #### `result` // ```c // true @@ -2049,6 +2058,14 @@ typedef enum { // - None VB_REVERT_SPOILING_ITEMS, + // #### `result` + // ```c + // varies + // ``` + // #### `args` + // - `*EnIshi`, `*ObjBombiwa`, or `*ObjHamishi` + VB_ROCK_DROP_ITEM, + // #### `result` // ```c // !Flags_GetInfTable(INFTABLE_145) 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 550d77b9a6..2413003cd2 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_DEKU_BOULDER] = HintText(CustomMessage("They say that a #boulder in the Deku Tree# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {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})); @@ -317,6 +321,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "Man erzählt sich, daß eine #Kiste in Dodongos Höhle# #[[1]]# enthielte.", /*french*/ "Selon moi, une #caisse dans la Caverne Dodongo# contient #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_DODONGOS_BOULDER] = HintText(CustomMessage("They say that a #boulder in Dodongo's Cavern# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {QM_RED, QM_GREEN})); + hintTextTable[RHT_SIGN_DODONGOS_CAVERN] = HintText(CustomMessage("They say that #reading a pedestal in Dodongo's Cavern# reveals #[[1]]#.", /*german*/ "Man erzählt sich, daß das #Lesen eines Podests in Dodongos Höhle# #[[1]]# enthülle.", /*french*/ "Selon moi, #lire un piédestal dans la Caverne Dodongo# révèle #[[1]]#.", {QM_RED, QM_GREEN})); @@ -488,6 +496,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_JABU_BOULDER] = HintText(CustomMessage("They say that a #boulder in Jabu Jabu's Belly# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {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})); @@ -1342,6 +1354,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_SPIRIT_TEMPLE_BOULDER] = HintText(CustomMessage("They say that a #boulder in the Spirit Temple# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {QM_RED, QM_GREEN})); + hintTextTable[RHT_SIGN_SPIRIT_TEMPLE] = HintText(CustomMessage("They say that #reading a statue in Spirit Temple# reveals #[[1]]#.", /*german*/ "Man erzählt sich, daß das #Lesen einer Statue im Geistertempel# #[[1]]# enthülle.", /*french*/ "Selon moi, #lire une statue dans le Temple de l'Esprit# révèle #[[1]]#.", {QM_RED, QM_GREEN})); @@ -1771,6 +1787,10 @@ 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_BOTW_BOULDER] = HintText(CustomMessage("They say that a #boulder in Bottom of the Well# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {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})); 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 175f8be7c3..0dc68bd104 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 @@ -2102,38 +2102,159 @@ void StaticData::HintTable_Init_Exclude_Overworld() { /*german*/ "Man erzählt sich, daß eine #Kiste im Labor am See# #[[1]]# enthielte.", /*french*/ "Selon moi, une #caisse dans un laboratoire# contient #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_KF_ROCK] = HintText(CustomMessage("They say that a #rock in Kokiri Forest# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ "Selon moi, une #roche dans la Fôret Kokiri# contient #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_LW_BOULDER] = HintText(CustomMessage("They say that a #boulder in the Lost Woods# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {QM_RED, QM_GREEN})); + + hintTextTable[RHT_HC_ROCK] = HintText(CustomMessage("They say that a #rock at Hyrule Castle# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {QM_RED, QM_GREEN})); + hintTextTable[RHT_HC_BOULDER] = HintText(CustomMessage("They say that a #boulder at Hyrule Castle# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {QM_RED, QM_GREEN})); + + hintTextTable[RHT_OGC_BRONZE_BOULDER] = HintText(CustomMessage("They say that a #bronze boulder outside Ganon's Castle# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {QM_RED, QM_GREEN})); + hintTextTable[RHT_OGC_SILVER_BOULDER] = HintText(CustomMessage("They say that a #silver boulder outside Ganon's Castle# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {QM_RED, QM_GREEN})); + + hintTextTable[RHT_DMC_ROCK] = HintText(CustomMessage("They say that a #rock in Death Mountain Crater# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {QM_RED, QM_GREEN})); + hintTextTable[RHT_DMC_BOULDER] = HintText(CustomMessage("They say that a #boulder in Death Mountain Crater# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {QM_RED, QM_GREEN})); + hintTextTable[RHT_DMC_BRONZE_BOULDER] = HintText(CustomMessage("They say that a #bronze boulder in Death Mountain Crater# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {QM_RED, QM_GREEN})); + + hintTextTable[RHT_GV_SILVER_BOULDER] = HintText(CustomMessage("They say that a #silver boulder in Gerudo Valley# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {QM_RED, QM_GREEN})); + hintTextTable[RHT_GV_ROCK] = HintText(CustomMessage("They say that a #rock in Gerudo Valley# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {QM_RED, QM_GREEN})); + hintTextTable[RHT_GV_BOULDER] = HintText(CustomMessage("They say that a #boulder in Gerudo Valley# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {QM_RED, QM_GREEN})); + hintTextTable[RHT_GV_BRONZE_BOULDER] = HintText(CustomMessage("They say that a #bronze boulder in Gerudo Valley# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {QM_RED, QM_GREEN})); + + hintTextTable[RHT_HF_SILVER_BOULDER] = HintText(CustomMessage("They say that a #silver boulder on Hyrule Field# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {QM_RED, QM_GREEN})); + hintTextTable[RHT_HF_ROCK] = HintText(CustomMessage("They say that a #rock on Hyrule Field# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {QM_RED, QM_GREEN})); + hintTextTable[RHT_HF_BOULDER] = HintText(CustomMessage("They say that a #boulder on Hyrule Field# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {QM_RED, QM_GREEN})); + hintTextTable[RHT_HF_BRONZE_BOULDER] = HintText(CustomMessage("They say that a #bronze boulder on Hyrule Field# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {QM_RED, QM_GREEN})); + + hintTextTable[RHT_KAK_SILVER_BOULDER] = HintText(CustomMessage("They say that a #silver boulder at Kakariko Village# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {QM_RED, QM_GREEN})); + hintTextTable[RHT_KAK_ROCK] = HintText(CustomMessage("They say that a #rock at Kakariko Village# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {QM_RED, QM_GREEN})); + + hintTextTable[RHT_GY_ROCK] = HintText(CustomMessage("They say that a #rock in a graveyard# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {QM_RED, QM_GREEN})); + + hintTextTable[RHT_LH_ROCK] = HintText(CustomMessage("They say that a #rock at Lake Hylia# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {QM_RED, QM_GREEN})); + + hintTextTable[RHT_ZD_ROCK] = HintText(CustomMessage("They say that a #rock in Zora's Domain# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {QM_RED, QM_GREEN})); + + hintTextTable[RHT_ZF_BOULDER] = HintText(CustomMessage("They say that a #boulder in Zora's Fountain# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {QM_RED, QM_GREEN})); + + hintTextTable[RHT_ZF_SILVER_BOULDER] = HintText(CustomMessage("They say that a #silver boulder in Zora's Fountain# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {QM_RED, QM_GREEN})); + + hintTextTable[RHT_ZR_ROCK] = HintText(CustomMessage("They say that a #rock along a river# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {QM_RED, QM_GREEN})); + hintTextTable[RHT_ZR_BOULDER] = HintText(CustomMessage("They say that a #boulder along a river# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {QM_RED, QM_GREEN})); + + hintTextTable[RHT_DMT_ROCK] = HintText(CustomMessage("They say that a #rock on Death Mountain Trail# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {QM_RED, QM_GREEN})); + hintTextTable[RHT_DMT_BOULDER] = HintText(CustomMessage("They say that a #boulder on Death Mountain Trail# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {QM_RED, QM_GREEN})); + hintTextTable[RHT_DMT_BRONZE_BOULDER] = HintText(CustomMessage("They say that a #bronze boulder on Death Mountain Trail# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {QM_RED, QM_GREEN})); + hintTextTable[RHT_GC_ROCK] = HintText(CustomMessage("They say that a #rock in Goron City# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {QM_RED, QM_GREEN})); + hintTextTable[RHT_GC_BOULDER] = HintText(CustomMessage("They say that a #boulder in Goron City# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {QM_RED, QM_GREEN})); + hintTextTable[RHT_GC_BRONZE_BOULDER] = HintText(CustomMessage("They say that a #bronze boulder in Goron City# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {QM_RED, QM_GREEN})); + hintTextTable[RHT_GC_SILVER_BOULDER] = HintText(CustomMessage("They say that a #silver boulder in Goron City# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {QM_RED, QM_GREEN})); + + hintTextTable[RHT_COLOSSUS_SILVER_BOULDER] = HintText(CustomMessage("They say that a #silver boulder in a desert# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {QM_RED, QM_GREEN})); + hintTextTable[RHT_COLOSSUS_ROCK] = HintText(CustomMessage("They say that a #rock in a desert# contains #[[1]]#.", + /*german*/ TODO_TRANSLATE, + /*french*/ TODO_TRANSLATE, {QM_RED, QM_GREEN})); + hintTextTable[RHT_TREE_HYRULE_FIELD] = HintText(CustomMessage("They say that a #tree in Hyrule Field# contains #[[1]]#.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, un #arbre dans la Plaine d'Hyrule# cache #[[1]]#.", { QM_RED, QM_GREEN })); hintTextTable[RHT_TREE_MARKET] = HintText(CustomMessage("They say that a #tree in Hyrule Market# contains #[[1]]#.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, un #arbre sur la Place du Marché# cache #[[1]]#.", { QM_RED, QM_GREEN })); hintTextTable[RHT_TREE_HYRULE_CASTLE] = HintText(CustomMessage("They say that a #tree in Hyrule Castle# contains #[[1]]#.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, un #arbre au Château d'Hyrule# cache #[[1]]#.", { QM_RED, QM_GREEN })); hintTextTable[RHT_TREE_ZORAS_RIVER] = HintText(CustomMessage("They say that a #tree in Zora's River# contains #[[1]]#.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, un #arbre à la Rivière Zora# cache #[[1]]#.", { QM_RED, QM_GREEN })); hintTextTable[RHT_TREE_ZORAS_FOUNTAIN] = HintText(CustomMessage("They say that a #tree in Zora's Fountain# contains #[[1]]#.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, un #arbre à la Fontaine Zora# cache #[[1]]#.", { QM_RED, QM_GREEN })); hintTextTable[RHT_TREE_LON_LON_RANCH] = HintText(CustomMessage("They say that a #tree in Lon Lon Ranch# contains #[[1]]#.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, un #arbre au Ranch Lon Lon# cache #[[1]]#.", { QM_RED, QM_GREEN })); hintTextTable[RHT_BUSH_HYRULE_FIELD] = HintText(CustomMessage("They say that a #bush in Hyrle Field# contains #[[1]]#.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, un #buisson dans la Plaine d'Hyrule# cache #[[1]]#.", { QM_RED, QM_GREEN })); hintTextTable[RHT_BUSH_ZORAS_FOUNTAIN] = HintText(CustomMessage("They say that a #bush in Zora's Fountain# contains #[[1]]#.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, un #buisson à la Fontaine Zora# cache #[[1]]#.", { QM_RED, QM_GREEN })); hintTextTable[RHT_BUTTERFLY_FAIRY_HYRULE_CASTLE] = HintText(CustomMessage("They say that a #butterfly near the castle# reveals #[[1]]#.", diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index db73b966e0..0e5adf7643 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -436,6 +436,27 @@ void GenerateItemPool() { ctx->GetOption(RSK_SHUFFLE_POTS).Is(RO_SHUFFLE_POTS_ALL); PlaceItemsForType(RCTYPE_POT, overworldPotsActive, dungeonPotsActive); + // Shuffle Crates + bool overworldCratesActive = ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_OVERWORLD) || + ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_ALL); + bool dungeonCratesActive = ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_DUNGEONS) || + ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_ALL); + PlaceItemsForType(RCTYPE_CRATE, overworldCratesActive, dungeonCratesActive); + PlaceItemsForType(RCTYPE_NLCRATE, ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_NO_LOGIC) && overworldCratesActive, + ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_NO_LOGIC) && dungeonCratesActive); + PlaceItemsForType(RCTYPE_SMALL_CRATE, overworldCratesActive, dungeonCratesActive); + + // Shuffle Rocks + bool rocksActive = ctx->GetOption(RSK_SHUFFLE_ROCKS).Get(); + PlaceItemsForType(RCTYPE_ROCK, rocksActive, rocksActive); + + // Shuffle Boulders + bool overworldBouldersActive = ctx->GetOption(RSK_SHUFFLE_BOULDERS).Is(RO_SHUFFLE_BOULDERS_OVERWORLD) || + ctx->GetOption(RSK_SHUFFLE_BOULDERS).Is(RO_SHUFFLE_BOULDERS_ALL); + bool dungeonBouldersActive = ctx->GetOption(RSK_SHUFFLE_BOULDERS).Is(RO_SHUFFLE_BOULDERS_DUNGEONS) || + ctx->GetOption(RSK_SHUFFLE_BOULDERS).Is(RO_SHUFFLE_BOULDERS_ALL); + PlaceItemsForType(RCTYPE_BOULDER, overworldBouldersActive, dungeonBouldersActive); + // Shuffle Trees bool treesActive = (bool)ctx->GetOption(RSK_SHUFFLE_TREES); PlaceItemsForType(RCTYPE_TREE, treesActive, false); @@ -454,16 +475,6 @@ void GenerateItemPool() { 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); - bool dungeonCratesActive = ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_DUNGEONS) || - ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_ALL); - PlaceItemsForType(RCTYPE_CRATE, overworldCratesActive, dungeonCratesActive); - PlaceItemsForType(RCTYPE_NLCRATE, ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_NO_LOGIC) && overworldCratesActive, - ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_NO_LOGIC) && dungeonCratesActive); - PlaceItemsForType(RCTYPE_SMALL_CRATE, overworldCratesActive, dungeonCratesActive); - if (ctx->GetOption(RSK_FISHSANITY).Is(RO_FISHSANITY_HYRULE_LOACH)) { AddFixedItemToPool(RG_PURPLE_RUPEE, 1); } else { diff --git a/soh/soh/Enhancements/randomizer/SeedContext.cpp b/soh/soh/Enhancements/randomizer/SeedContext.cpp index 512984117d..0cd00b768e 100644 --- a/soh/soh/Enhancements/randomizer/SeedContext.cpp +++ b/soh/soh/Enhancements/randomizer/SeedContext.cpp @@ -50,6 +50,8 @@ Context::Context() { &mOptions[RSK_SHUFFLE_COWS], &mOptions[RSK_SHUFFLE_POTS], &mOptions[RSK_SHUFFLE_CRATES], + &mOptions[RSK_SHUFFLE_ROCKS], + &mOptions[RSK_SHUFFLE_BOULDERS], &mOptions[RSK_SHUFFLE_FREESTANDING], &mOptions[RSK_SHUFFLE_MERCHANTS], &mOptions[RSK_SHUFFLE_FROG_SONG_RUPEES], @@ -208,6 +210,8 @@ void Context::GenerateLocationPool() { (location.GetRCType() == RCTYPE_NLCRATE && (mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OFF) || mOptions[RSK_LOGIC_RULES].IsNot(RO_LOGIC_NO_LOGIC))) || (location.GetRCType() == RCTYPE_SMALL_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OFF)) || + (location.GetRCType() == RCTYPE_ROCK && !mOptions[RSK_SHUFFLE_ROCKS]) || + (location.GetRCType() == RCTYPE_BOULDER && mOptions[RSK_SHUFFLE_BOULDERS].Is(RO_SHUFFLE_BOULDERS_OFF)) || (location.GetRCType() == RCTYPE_FOUNTAIN_FAIRY && !mOptions[RSK_SHUFFLE_FOUNTAIN_FAIRIES]) || (location.GetRCType() == RCTYPE_STONE_FAIRY && !mOptions[RSK_SHUFFLE_STONE_FAIRIES]) || (location.GetRCType() == RCTYPE_BEAN_FAIRY && !mOptions[RSK_SHUFFLE_BEAN_FAIRIES]) || @@ -242,6 +246,8 @@ void Context::GenerateLocationPool() { mOptions[RSK_LOGIC_RULES].Is(RO_LOGIC_NO_LOGIC)) || (location.GetRCType() == RCTYPE_SMALL_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_DUNGEONS)) || + (location.GetRCType() == RCTYPE_BOULDER && + mOptions[RSK_SHUFFLE_BOULDERS].Is(RO_SHUFFLE_BOULDERS_DUNGEONS)) || (location.GetRCType() == RCTYPE_SIGN && mOptions[RSK_SHUFFLE_SIGNS].Is(RO_SHUFFLE_SIGNS_DUNGEONS))) { continue; } @@ -266,6 +272,8 @@ void Context::GenerateLocationPool() { mOptions[RSK_LOGIC_RULES].Is(RO_LOGIC_NO_LOGIC)) || (location.GetRCType() == RCTYPE_SMALL_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OVERWORLD)) || + (location.GetRCType() == RCTYPE_BOULDER && + mOptions[RSK_SHUFFLE_BOULDERS].Is(RO_SHUFFLE_BOULDERS_OVERWORLD)) || (location.GetRCType() == RCTYPE_SIGN && mOptions[RSK_SHUFFLE_SIGNS].Is(RO_SHUFFLE_SIGNS_OVERWORLD))) { continue; diff --git a/soh/soh/Enhancements/randomizer/ShuffleIcicles.cpp b/soh/soh/Enhancements/randomizer/ShuffleIcicles.cpp index ff16fab11c..4382a79239 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleIcicles.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleIcicles.cpp @@ -1,12 +1,11 @@ -#include "soh/OTRGlobals.h" #include "soh/ObjectExtension/ObjectExtension.h" #include "item_category_adj.h" #include "particle_cmc.h" +#include "soh/frame_interpolation.h" extern "C" { #include "functions.h" #include "overlays/actors/ovl_Bg_Ice_Turara/z_bg_ice_turara.h" -#include "objects/object_ice_objects/object_ice_objects.h" #include "objects/object_tk/object_tk.h" extern PlayState* gPlayState; } diff --git a/soh/soh/Enhancements/randomizer/ShuffleRocks.cpp b/soh/soh/Enhancements/randomizer/ShuffleRocks.cpp new file mode 100644 index 0000000000..c4e852841e --- /dev/null +++ b/soh/soh/Enhancements/randomizer/ShuffleRocks.cpp @@ -0,0 +1,612 @@ +#include "ShuffleRocks.h" +#include "static_data.h" +#include "soh/ObjectExtension/ObjectExtension.h" +#include "item_category_adj.h" +#include "particle_cmc.h" +#include "soh/frame_interpolation.h" + +extern "C" { +#include "variables.h" +#include "macros.h" +#include "functions.h" +#include "overlays/actors/ovl_En_Ishi/z_en_ishi.h" +#include "overlays/actors/ovl_Obj_Bombiwa/z_obj_bombiwa.h" +#include "overlays/actors/ovl_Obj_Hamishi/z_obj_hamishi.h" +#include "objects/gameplay_field_keep/gameplay_field_keep.h" +#include "objects/object_bombiwa/object_bombiwa.h" +#include "objects/object_tk/object_tk.h" +extern PlayState* gPlayState; +} + +extern void EnItem00_DrawRandomizedItem(EnItem00* enItem00, PlayState* play); + +static void Sparkles(PlayState* play, Actor* actor, bool boulder, CheckIdentity rockIdentity) { + GraphicsContext* __gfxCtx = play->state.gfxCtx; + int csmc = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), 0); + int requiresStoneAgony = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony"), 0); + + GetItemCategory getItemCategory; + if (csmc && (!requiresStoneAgony || (requiresStoneAgony && CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)))) { + auto itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(rockIdentity.randomizerCheck, true, GI_NONE); + getItemCategory = Randomizer_AdjustItemCategory(itemEntry); + } else { + getItemCategory = ITEM_CATEGORY_MAJOR; + } + + Color_RGBA8 primColor = Randomizer_GetParticleCMCColor(getItemCategory, COLOR_PRIMARY); + + f32 yOffset = !boulder ? 40.0f : actor->id == ACTOR_OBJ_BOMBIWA ? 160.0f : 180.0f; + f32 xOffset = !boulder ? -24.0f : actor->id == ACTOR_OBJ_BOMBIWA ? -90.0f : -90.0f; + f32 zOffset = !boulder ? 4.0f : actor->id == ACTOR_OBJ_BOMBIWA ? 14.5f : 14.5f; + + // Rotate and draw halo with CMC colors + if (rockIdentity.randomizerCheck == RC_SPIRIT_TEMPLE_MQ_ENTRANCE_CEILING_BOULDER || + rockIdentity.randomizerCheck == RC_ZF_UNDERGROUND_BOULDER) { + yOffset = -114.0f; + xOffset = -165.0f; + zOffset = 19.0f; + Matrix_Translate(actor->world.pos.x + xOffset, actor->world.pos.y + yOffset, actor->world.pos.z + zOffset, + MTXMODE_NEW); + Matrix_Scale(0.055f, 0.055f, 0.055f, MTXMODE_APPLY); + } else { + Matrix_Translate(actor->world.pos.x + xOffset, actor->world.pos.y + yOffset, actor->world.pos.z + zOffset, + MTXMODE_NEW); + Matrix_RotateZ(-M_PI / 2, MTXMODE_APPLY); + if (boulder) { + Matrix_Scale(0.04f, 0.04f, 0.04f, MTXMODE_APPLY); + } else { + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + } + } + + OPEN_DISPS(gPlayState->state.gfxCtx); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(gPlayState->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gDPSetGrayscaleColor(POLY_OPA_DISP++, primColor.r, primColor.g, primColor.b, 175); + gSPGrayscale(POLY_OPA_DISP++, true); + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gDampeHaloDL); + gSPGrayscale(POLY_OPA_DISP++, false); + CLOSE_DISPS(gPlayState->state.gfxCtx); +} + +extern "C" void EnIshi_RandomizerDraw(Actor* thisx, PlayState* play) { + auto rockActor = ((EnIshi*)thisx); + const auto rockIdentity = ObjectExtension::GetInstance().Get(thisx); + + OPEN_DISPS(play->state.gfxCtx); + Gfx_SetupDL_25Opa(play->state.gfxCtx); + if (rockActor->actor.params & 1) { + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255); + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gSilverRockDL); + } else { + Gfx_DrawDListOpa(play, (Gfx*)gFieldKakeraDL); + } + CLOSE_DISPS(play->state.gfxCtx); + + if (rockIdentity != nullptr && rockIdentity->randomizerCheck != RC_MAX && + Flags_GetRandomizerInf(rockIdentity->randomizerInf) == 0) { + Sparkles(play, &rockActor->actor, !!(rockActor->actor.params & 1), *rockIdentity); + } +} + +extern "C" void ObjBombiwa_RandomizerDraw(Actor* thisx, PlayState* play) { + auto rockActor = ((ObjBombiwa*)thisx); + const auto rockIdentity = ObjectExtension::GetInstance().Get(thisx); + + OPEN_DISPS(play->state.gfxCtx); + Gfx_SetupDL_25Opa(play->state.gfxCtx); + + Gfx_DrawDListOpa(play, (Gfx*)object_bombiwa_DL_0009E0); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_MODELVIEW | G_MTX_LOAD); + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)object_bombiwa_DL_0009E0); + CLOSE_DISPS(play->state.gfxCtx); + + if (rockIdentity != nullptr && rockIdentity->randomizerCheck != RC_MAX && + Flags_GetRandomizerInf(rockIdentity->randomizerInf) == 0) { + Sparkles(play, &rockActor->actor, true, *rockIdentity); + } +} + +extern "C" void ObjHamishi_RandomizerDraw(Actor* thisx, PlayState* play) { + auto rockActor = ((ObjHamishi*)thisx); + const auto rockIdentity = ObjectExtension::GetInstance().Get(thisx); + + OPEN_DISPS(play->state.gfxCtx); + Gfx_SetupDL_25Opa(play->state.gfxCtx); + + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 170, 130, 255); + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gSilverRockDL); + CLOSE_DISPS(play->state.gfxCtx); + + if (rockIdentity != nullptr && rockIdentity->randomizerCheck != RC_MAX && + Flags_GetRandomizerInf(rockIdentity->randomizerInf) == 0) { + Sparkles(play, &rockActor->actor, true, *rockIdentity); + } +} + +uint8_t Rock_RandomizerHoldsItem(CheckIdentity rockIdentity, PlayState* play, bool isBoulder) { + RandomizerCheck rc = rockIdentity.randomizerCheck; + if (rc == RC_MAX || rc == RC_UNKNOWN_CHECK) + return false; + + uint8_t isDungeon = Rando::StaticData::GetLocation(rc)->IsDungeon(); + uint8_t setting = + Rando::Context::GetInstance()->GetOption(isBoulder ? RSK_SHUFFLE_BOULDERS : RSK_SHUFFLE_ROCKS).Get(); + + // Don't pull randomized item if rock isn't randomized or is already checked + return IS_RANDO && + ((!isBoulder && setting) || (isBoulder && (setting == RO_SHUFFLE_BOULDERS_ALL || + (isDungeon && setting == RO_SHUFFLE_BOULDERS_DUNGEONS) || + (!isDungeon && setting == RO_SHUFFLE_BOULDERS_OVERWORLD)))) && + !Flags_GetRandomizerInf(rockIdentity.randomizerInf); +} + +void Rock_RandomizerSpawnCollectible(Actor* actor, CheckIdentity rockIdentity, PlayState* play) { + LUSLOG_INFO("ROCKdrop %d\t:\t%d, %d", rockIdentity.randomizerCheck, (s16)actor->world.pos.x, + (s16)actor->world.pos.z); + EnItem00* item00 = (EnItem00*)Item_DropCollectible2(play, &actor->world.pos, ITEM00_SOH_DUMMY); + item00->randoInf = rockIdentity.randomizerInf; + item00->itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(rockIdentity.randomizerCheck, true, GI_NONE); + item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem; + item00->actor.velocity.y = 9.0f; + item00->actor.speedXZ = 2.0f; + item00->actor.world.rot.y = Rand_CenteredFloat(65536.0f); + switch (rockIdentity.randomizerCheck) { + case RC_SPIRIT_TEMPLE_MQ_ENTRANCE_EYE_BOULDER: + item00->actor.world.rot.y = 0x8000; + break; + case RC_SPIRIT_TEMPLE_MQ_GIBDO_BOULDER_LOW: + item00->actor.velocity.y = 15.0f; + [[fallthrough]]; + case RC_SPIRIT_TEMPLE_MQ_GIBDO_BOULDER_HIGH: + item00->actor.world.rot.y = 0x0; + item00->actor.speedXZ = 8.0f; + break; + case RC_GC_MAZE_BOULDER_1: + case RC_GC_MAZE_BOULDER_2: + case RC_GC_MAZE_BOULDER_3: + case RC_GC_MAZE_BOULDER_4: + case RC_GC_MAZE_BOULDER_5: + case RC_GC_MAZE_BOULDER_6: + case RC_GC_MAZE_BOULDER_7: + case RC_GC_MAZE_BOULDER_8: + case RC_GC_MAZE_BOULDER_9: + case RC_GC_MAZE_BOULDER_10: + case RC_GC_MAZE_BRONZE_BOULDER_1: + case RC_GC_MAZE_BRONZE_BOULDER_2: + case RC_GC_MAZE_BRONZE_BOULDER_3: + case RC_GC_MAZE_BRONZE_BOULDER_4: + case RC_GC_MAZE_BRONZE_BOULDER_5: + case RC_DMC_BRONZE_BOULDER_SHORTCUT: + case RC_ZF_UNDERGROUND_BOULDER: + case RC_DEKU_TREE_MQ_BOULDER_1: + case RC_DEKU_TREE_MQ_BOULDER_2: + case RC_DEKU_TREE_MQ_BOULDER_3: + case RC_ZR_BOULDER_4: + case RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_1: + case RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_2: + case RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_3: + case RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_4: + case RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_5: + case RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_6: + case RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_7: + case RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_8: + case RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_9: + case RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_10: + case RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_11: + case RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_12: + case RC_SPIRIT_TEMPLE_MQ_ENTRANCE_CEILING_BOULDER: + case RC_SPIRIT_TEMPLE_MQ_CRAWLSPACE_BOULDER: + item00->actor.speedXZ = 0.0f; + break; + default:; + } +} + +void EnIshi_RandomizerInit(void* actorRef) { + Actor* actor = static_cast(actorRef); + EnIshi* rockActor = static_cast(actorRef); + auto rockIdentity = OTRGlobals::Instance->gRandomizer->IdentifyRock(gPlayState->sceneNum, (s16)actor->world.pos.x, + (s16)actor->world.pos.z); + if (rockIdentity.randomizerCheck == RC_MAX) { + LUSLOG_WARN("ROCK ishi %d\t:\t%d, %d", rockIdentity.randomizerCheck, actor->params & 1, + (s16)actor->world.pos.x, (s16)actor->world.pos.z); + } else { + LUSLOG_INFO("ROCK ishi%d %d\t:\t%d, %d", rockIdentity.randomizerCheck, actor->params & 1, + (s16)actor->world.pos.x, (s16)actor->world.pos.z); + } + + if (Rock_RandomizerHoldsItem(rockIdentity, gPlayState, actor->params & 1) && rockActor->actor.draw != nullptr) { + ObjectExtension::GetInstance().Set(actor, std::move(rockIdentity)); + rockActor->actor.draw = EnIshi_RandomizerDraw; + } +} + +void ObjBombiwa_RandomizerInit(void* actorRef) { + Actor* actor = static_cast(actorRef); + ObjBombiwa* rockActor = static_cast(actorRef); + auto rockIdentity = OTRGlobals::Instance->gRandomizer->IdentifyRock(gPlayState->sceneNum, (s16)actor->world.pos.x, + (s16)actor->world.pos.z); + if (rockIdentity.randomizerCheck == RC_MAX) { + LUSLOG_INFO("ROCK bombiwa\t:\t%d, %d", rockIdentity.randomizerCheck, (s16)actor->world.pos.x, + (s16)actor->world.pos.z); + } else { + LUSLOG_INFO("ROCK bombiwa%d\t:\t%d, %d", rockIdentity.randomizerCheck, (s16)actor->world.pos.x, + (s16)actor->world.pos.z); + } + if (Rock_RandomizerHoldsItem(rockIdentity, gPlayState, true) && rockActor->actor.draw != nullptr) { + ObjectExtension::GetInstance().Set(actor, std::move(rockIdentity)); + rockActor->actor.draw = ObjBombiwa_RandomizerDraw; + } +} + +void ObjHamishi_RandomizerInit(void* actorRef) { + Actor* actor = static_cast(actorRef); + ObjHamishi* rockActor = static_cast(actorRef); + auto rockIdentity = OTRGlobals::Instance->gRandomizer->IdentifyRock(gPlayState->sceneNum, (s16)actor->world.pos.x, + (s16)actor->world.pos.z); + if (rockIdentity.randomizerCheck == RC_MAX) { + LUSLOG_WARN("ROCK hamishi\t:\t%d, %d", rockIdentity.randomizerCheck, (s16)actor->world.pos.x, + (s16)actor->world.pos.z); + } else { + LUSLOG_INFO("ROCK hamishi%d\t:\t%d, %d", rockIdentity.randomizerCheck, (s16)actor->world.pos.x, + (s16)actor->world.pos.z); + } + if (Rock_RandomizerHoldsItem(rockIdentity, gPlayState, true) && rockActor->actor.draw != nullptr) { + ObjectExtension::GetInstance().Set(actor, std::move(rockIdentity)); + rockActor->actor.draw = ObjHamishi_RandomizerDraw; + } +} + +void RegisterShuffleRock() { + bool shouldRegister = IS_RANDO && (RAND_GET_OPTION(RSK_SHUFFLE_ROCKS) || RAND_GET_OPTION(RSK_SHUFFLE_BOULDERS)); + bool shouldRegisterBoulder = IS_RANDO && RAND_GET_OPTION(RSK_SHUFFLE_BOULDERS); + + COND_ID_HOOK(OnActorInit, ACTOR_EN_ISHI, shouldRegister, EnIshi_RandomizerInit); + COND_ID_HOOK(OnActorInit, ACTOR_OBJ_BOMBIWA, shouldRegisterBoulder, ObjBombiwa_RandomizerInit); + COND_ID_HOOK(OnActorInit, ACTOR_OBJ_HAMISHI, shouldRegisterBoulder, ObjHamishi_RandomizerInit); + + COND_VB_SHOULD(VB_ROCK_DROP_ITEM, shouldRegister, { + Actor* rockActor = va_arg(args, Actor*); + const auto rockIdentity = ObjectExtension::GetInstance().Get(rockActor); + if (rockIdentity != nullptr && + Rock_RandomizerHoldsItem(*rockIdentity, gPlayState, + rockActor->id == ACTOR_OBJ_BOMBIWA || rockActor->id == ACTOR_OBJ_HAMISHI || + rockActor->params & 1)) { + Rock_RandomizerSpawnCollectible(rockActor, *rockIdentity, gPlayState); + rockIdentity->randomizerCheck = RC_MAX; + rockIdentity->randomizerInf = RAND_INF_MAX; + *should = false; + } + }); + + COND_VB_SHOULD(VB_BOULDER_BREAK_FLAG, shouldRegisterBoulder, { + if (*should) { + Actor* rockActor = va_arg(args, Actor*); + // hook called before OnActorInit sets up object extension + auto rockIdentity = OTRGlobals::Instance->gRandomizer->IdentifyRock( + gPlayState->sceneNum, (s16)rockActor->world.pos.x, (s16)rockActor->world.pos.z); + if (Rock_RandomizerHoldsItem(rockIdentity, gPlayState, true)) { + Rock_RandomizerSpawnCollectible(rockActor, rockIdentity, gPlayState); + } + } + }); +} + +void Rando::StaticData::RegisterRockLocations() { + static bool registered = false; + if (registered) + return; + registered = true; + // clang-format off + locationTable[RC_KF_CIRCLE_ROCK_1] = Location::Rock(RC_KF_CIRCLE_ROCK_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-292, -350), "KF Circle Rock 1", RHT_KF_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CIRCLE_ROCK_1)); + locationTable[RC_KF_CIRCLE_ROCK_2] = Location::Rock(RC_KF_CIRCLE_ROCK_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-235, -373), "KF Circle Rock 2", RHT_KF_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CIRCLE_ROCK_2)); + locationTable[RC_KF_CIRCLE_ROCK_3] = Location::Rock(RC_KF_CIRCLE_ROCK_3, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-212, -430), "KF Circle Rock 3", RHT_KF_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CIRCLE_ROCK_3)); + locationTable[RC_KF_CIRCLE_ROCK_4] = Location::Rock(RC_KF_CIRCLE_ROCK_4, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-235, -486), "KF Circle Rock 4", RHT_KF_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CIRCLE_ROCK_4)); + locationTable[RC_KF_CIRCLE_ROCK_5] = Location::Rock(RC_KF_CIRCLE_ROCK_5, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-292, -510), "KF Circle Rock 5", RHT_KF_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CIRCLE_ROCK_5)); + locationTable[RC_KF_CIRCLE_ROCK_6] = Location::Rock(RC_KF_CIRCLE_ROCK_6, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-348, -486), "KF Circle Rock 6", RHT_KF_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CIRCLE_ROCK_6)); + locationTable[RC_KF_CIRCLE_ROCK_7] = Location::Rock(RC_KF_CIRCLE_ROCK_7, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-372, -430), "KF Circle Rock 7", RHT_KF_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CIRCLE_ROCK_7)); + locationTable[RC_KF_CIRCLE_ROCK_8] = Location::Rock(RC_KF_CIRCLE_ROCK_8, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-348, -373), "KF Circle Rock 8", RHT_KF_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CIRCLE_ROCK_8)); + locationTable[RC_KF_ROCK_BY_SARIAS_HOUSE] = Location::Rock(RC_KF_ROCK_BY_SARIAS_HOUSE, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(248, 601), "Sarias House Rock KF", RHT_KF_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ROCK_BY_SARIAS_HOUSE)); + locationTable[RC_KF_ROCK_BEHIND_SARIAS_HOUSE] = Location::Rock(RC_KF_ROCK_BEHIND_SARIAS_HOUSE, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(726, 961), "Behind Sarias House Rock KF", RHT_KF_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ROCK_BEHIND_SARIAS_HOUSE)); + locationTable[RC_KF_ROCK_BY_MIDOS_HOUSE] = Location::Rock(RC_KF_ROCK_BY_MIDOS_HOUSE, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-672, -623), "Midos House Rock KF", RHT_KF_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ROCK_BY_MIDOS_HOUSE)); + locationTable[RC_KF_ROCK_BY_KNOW_IT_ALLS_HOUSE] = Location::Rock(RC_KF_ROCK_BY_KNOW_IT_ALLS_HOUSE, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-1361, 145), "Know It Alls House Rock KF", RHT_KF_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ROCK_BY_KNOW_IT_ALLS_HOUSE)); + + locationTable[RC_LW_BOULDER_BY_GORON_CITY] = Location::Boulder(RC_LW_BOULDER_BY_GORON_CITY, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(915, -925), "Goron City Boulder LW", RHT_LW_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BOULDER_BY_GORON_CITY)); + locationTable[RC_LW_BOULDER_BY_SACRED_FOREST_MEADOW] = Location::Boulder(RC_LW_BOULDER_BY_SACRED_FOREST_MEADOW, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(670, -2520), "Sacred Forest Meadow Boulder LW", RHT_LW_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BOULDER_BY_SACRED_FOREST_MEADOW)); + locationTable[RC_LW_RUPEE_BOULDER] = Location::Boulder(RC_LW_RUPEE_BOULDER, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(1720, -2510), "Rupee Boulder LW", RHT_LW_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_RUPEE_BOULDER)); + + locationTable[RC_HC_ROCK_1] = Location::Rock(RC_HC_ROCK_1, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(-216, 2977), "HC Rock 1", RHT_HC_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_ROCK_1)); + locationTable[RC_HC_ROCK_2] = Location::Rock(RC_HC_ROCK_2, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(-110, 3006), "HC Rock 2", RHT_HC_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_ROCK_2)); + locationTable[RC_HC_ROCK_3] = Location::Rock(RC_HC_ROCK_3, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(-129, 2897), "HC Rock 3", RHT_HC_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_ROCK_3)); + locationTable[RC_HC_BOULDER] = Location::Boulder(RC_HC_BOULDER, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(2730, 2540), "HC Boulder", RHT_HC_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_BOULDER)); + locationTable[RC_OGC_BRONZE_BOULDER_1] = Location::Boulder(RC_OGC_BRONZE_BOULDER_1, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_OUTSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2324, 533), "OGC Bronze Boulder 1", RHT_OGC_BRONZE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_OGC_BRONZE_BOULDER_1)); + locationTable[RC_OGC_BRONZE_BOULDER_2] = Location::Boulder(RC_OGC_BRONZE_BOULDER_2, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_OUTSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1590, 787), "OGC Bronze Boulder 2", RHT_OGC_BRONZE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_OGC_BRONZE_BOULDER_2)); + locationTable[RC_OGC_BRONZE_BOULDER_3] = Location::Boulder(RC_OGC_BRONZE_BOULDER_3, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_OUTSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1661, 748), "OGC Bronze Boulder 3", RHT_OGC_BRONZE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_OGC_BRONZE_BOULDER_3)); + locationTable[RC_OGC_SILVER_BOULDER_1] = Location::Boulder(RC_OGC_SILVER_BOULDER_1, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_OUTSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1606, 685), "OGC Silver Boulder 1", RHT_OGC_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_OGC_SILVER_BOULDER_1)); + locationTable[RC_OGC_SILVER_BOULDER_2] = Location::Boulder(RC_OGC_SILVER_BOULDER_2, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_OUTSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1766, 726), "OGC Silver Boulder 2", RHT_OGC_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_OGC_SILVER_BOULDER_2)); + locationTable[RC_OGC_SILVER_BOULDER_3] = Location::Boulder(RC_OGC_SILVER_BOULDER_3, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_OUTSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1701, 661), "OGC Silver Boulder 3", RHT_OGC_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_OGC_SILVER_BOULDER_3)); + locationTable[RC_OGC_SILVER_BOULDER_4] = Location::Boulder(RC_OGC_SILVER_BOULDER_4, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_OUTSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2260, 560), "OGC Silver Boulder 4", RHT_OGC_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_OGC_SILVER_BOULDER_4)); + + locationTable[RC_DMC_ROCK_BY_FIRE_TEMPLE_1] = Location::Rock(RC_DMC_ROCK_BY_FIRE_TEMPLE_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-50, -714), "DMC Fire Temple Rock 1", RHT_DMC_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_ROCK_BY_FIRE_TEMPLE_1)); + locationTable[RC_DMC_ROCK_BY_FIRE_TEMPLE_2] = Location::Rock(RC_DMC_ROCK_BY_FIRE_TEMPLE_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-26, -807), "DMC Fire Temple Rock 2", RHT_DMC_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_ROCK_BY_FIRE_TEMPLE_2)); + locationTable[RC_DMC_ROCK_BY_FIRE_TEMPLE_3] = Location::Rock(RC_DMC_ROCK_BY_FIRE_TEMPLE_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(61, -763), "DMC Fire Temple Rock 3", RHT_DMC_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_ROCK_BY_FIRE_TEMPLE_3)); + locationTable[RC_DMC_ROCK_BY_FIRE_TEMPLE_4] = Location::Rock(RC_DMC_ROCK_BY_FIRE_TEMPLE_4, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(71, -610), "DMC Fire Temple Rock 4", RHT_DMC_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_ROCK_BY_FIRE_TEMPLE_4)); + locationTable[RC_DMC_ROCK_BY_FIRE_TEMPLE_5] = Location::Rock(RC_DMC_ROCK_BY_FIRE_TEMPLE_5, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(79, -700), "DMC Fire Temple Rock 5", RHT_DMC_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_ROCK_BY_FIRE_TEMPLE_5)); + locationTable[RC_DMC_CIRCLE_ROCK_1] = Location::Rock(RC_DMC_CIRCLE_ROCK_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(40, 1850), "DMC Circle Rock 1", RHT_DMC_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_CIRCLE_ROCK_1)); + locationTable[RC_DMC_CIRCLE_ROCK_2] = Location::Rock(RC_DMC_CIRCLE_ROCK_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(96, 1826), "DMC Circle Rock 2", RHT_DMC_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_CIRCLE_ROCK_2)); + locationTable[RC_DMC_CIRCLE_ROCK_3] = Location::Rock(RC_DMC_CIRCLE_ROCK_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(120, 1770), "DMC Circle Rock 3", RHT_DMC_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_CIRCLE_ROCK_3)); + locationTable[RC_DMC_CIRCLE_ROCK_4] = Location::Rock(RC_DMC_CIRCLE_ROCK_4, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(96, 1713), "DMC Circle Rock 4", RHT_DMC_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_CIRCLE_ROCK_4)); + locationTable[RC_DMC_CIRCLE_ROCK_5] = Location::Rock(RC_DMC_CIRCLE_ROCK_5, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(40, 1690), "DMC Circle Rock 5", RHT_DMC_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_CIRCLE_ROCK_5)); + locationTable[RC_DMC_CIRCLE_ROCK_6] = Location::Rock(RC_DMC_CIRCLE_ROCK_6, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-16, 1713), "DMC Circle Rock 6", RHT_DMC_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_CIRCLE_ROCK_6)); + locationTable[RC_DMC_CIRCLE_ROCK_7] = Location::Rock(RC_DMC_CIRCLE_ROCK_7, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-40, 1770), "DMC Circle Rock 7", RHT_DMC_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_CIRCLE_ROCK_7)); + locationTable[RC_DMC_CIRCLE_ROCK_8] = Location::Rock(RC_DMC_CIRCLE_ROCK_8, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-16, 1826), "DMC Circle Rock 8", RHT_DMC_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_CIRCLE_ROCK_8)); + locationTable[RC_DMC_GOSSIP_ROCK_1] = Location::Rock(RC_DMC_GOSSIP_ROCK_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1261, 1533), "DMC Gossip Rock 1", RHT_DMC_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_GOSSIP_ROCK_1)); + locationTable[RC_DMC_GOSSIP_ROCK_2] = Location::Rock(RC_DMC_GOSSIP_ROCK_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1356, 1541), "DMC Gossip Rock 2", RHT_DMC_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_GOSSIP_ROCK_2)); + locationTable[RC_DMC_BOULDER_1] = Location::Boulder(RC_DMC_BOULDER_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-504, 1070), "DMC Boulder 1", RHT_DMC_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_BOULDER_1)); + locationTable[RC_DMC_BOULDER_2] = Location::Boulder(RC_DMC_BOULDER_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(236, 1199), "DMC Boulder 2", RHT_DMC_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_BOULDER_2)); + locationTable[RC_DMC_BOULDER_3] = Location::Boulder(RC_DMC_BOULDER_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(40, 1770), "DMC Boulder 3", RHT_DMC_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_BOULDER_3)); + locationTable[RC_DMC_BRONZE_BOULDER_1] = Location::Boulder(RC_DMC_BRONZE_BOULDER_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1699, -472), "DMC Bronze Boulder 1", RHT_DMC_BRONZE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_BRONZE_BOULDER_1)); + locationTable[RC_DMC_BRONZE_BOULDER_2] = Location::Boulder(RC_DMC_BRONZE_BOULDER_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1332, 921), "DMC Bronze Boulder 2", RHT_DMC_BRONZE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_BRONZE_BOULDER_2)); + locationTable[RC_DMC_BRONZE_BOULDER_3] = Location::Boulder(RC_DMC_BRONZE_BOULDER_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1303, 975), "DMC Bronze Boulder 3", RHT_DMC_BRONZE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_BRONZE_BOULDER_3)); + locationTable[RC_DMC_BRONZE_BOULDER_SHORTCUT] = Location::Boulder(RC_DMC_BRONZE_BOULDER_SHORTCUT, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1060, 944), "DMC Bronze Shortcut Boulder", RHT_DMC_BRONZE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_BRONZE_BOULDER_SHORTCUT)); + + locationTable[RC_GV_SILVER_BOULDER] = Location::Boulder(RC_GV_SILVER_BOULDER, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(280, 1470), "GV Silver Boulder", RHT_GV_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_SILVER_BOULDER)); + locationTable[RC_GV_ROCK_1] = Location::Rock(RC_GV_ROCK_1, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(2738, 297), "GV Rock 1", RHT_GV_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_ROCK_1)); + locationTable[RC_GV_ROCK_2] = Location::Rock(RC_GV_ROCK_2, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(2715, 316), "GV Rock 2", RHT_GV_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_ROCK_2)); + locationTable[RC_GV_ROCK_3] = Location::Rock(RC_GV_ROCK_3, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(2699, 275), "GV Rock 3", RHT_GV_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_ROCK_3)); + locationTable[RC_GV_UNDERWATER_ROCK_1] = Location::Rock(RC_GV_UNDERWATER_ROCK_1, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(1559, -63), "GV Underwater Rock 1", RHT_GV_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_UNDERWATER_ROCK_1)); + locationTable[RC_GV_UNDERWATER_ROCK_2] = Location::Rock(RC_GV_UNDERWATER_ROCK_2, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(1605, 26), "GV Underwater Rock 2", RHT_GV_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_UNDERWATER_ROCK_2)); + locationTable[RC_GV_UNDERWATER_ROCK_3] = Location::Rock(RC_GV_UNDERWATER_ROCK_3, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(1686, -33), "GV Underwater Rock 3", RHT_GV_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_UNDERWATER_ROCK_3)); + locationTable[RC_GV_ROCK_ACROSS_BRIDGE_1] = Location::Rock(RC_GV_ROCK_ACROSS_BRIDGE_1, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-666, -899), "GV Rock Across Bridge 1", RHT_GV_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_ROCK_ACROSS_BRIDGE_1)); + locationTable[RC_GV_ROCK_ACROSS_BRIDGE_2] = Location::Rock(RC_GV_ROCK_ACROSS_BRIDGE_2, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-526, -890), "GV Rock Across Bridge 2", RHT_GV_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_ROCK_ACROSS_BRIDGE_2)); + locationTable[RC_GV_ROCK_ACROSS_BRIDGE_3] = Location::Rock(RC_GV_ROCK_ACROSS_BRIDGE_3, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-607, -791), "GV Rock Across Bridge 3", RHT_GV_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_ROCK_ACROSS_BRIDGE_3)); + locationTable[RC_GV_ROCK_ACROSS_BRIDGE_4] = Location::Rock(RC_GV_ROCK_ACROSS_BRIDGE_4, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-458, -782), "GV Rock Across Bridge 4", RHT_GV_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_ROCK_ACROSS_BRIDGE_4)); + locationTable[RC_GV_BOULDER_1] = Location::Boulder(RC_GV_BOULDER_1, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(751, 569), "GV Boulder 1", RHT_GV_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_BOULDER_1)); + locationTable[RC_GV_BOULDER_2] = Location::Boulder(RC_GV_BOULDER_2, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(545, -510), "GV Boulder 2", RHT_GV_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_BOULDER_2)); + locationTable[RC_GV_BOULDER_ACROSS_BRIDGE] = Location::Boulder(RC_GV_BOULDER_ACROSS_BRIDGE, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-954, 577), "GV Boulder Across Bridge", RHT_GV_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_BOULDER_ACROSS_BRIDGE)); + locationTable[RC_GV_BRONZE_BOULDER_1] = Location::Boulder(RC_GV_BRONZE_BOULDER_1, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(861, -778), "GV Bronze Boulder 1", RHT_GV_BRONZE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_BRONZE_BOULDER_1)); + locationTable[RC_GV_BRONZE_BOULDER_2] = Location::Boulder(RC_GV_BRONZE_BOULDER_2, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(735, 375), "GV Bronze Boulder 2", RHT_GV_BRONZE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_BRONZE_BOULDER_2)); + locationTable[RC_GV_BRONZE_BOULDER_ACROSS_BRIDGE_1] = Location::Boulder(RC_GV_BRONZE_BOULDER_ACROSS_BRIDGE_1, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-1352, 767), "GV Bronze Boulder Across Bridge 1", RHT_GV_BRONZE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_BRONZE_BOULDER_ACROSS_BRIDGE_1)); + locationTable[RC_GV_BRONZE_BOULDER_ACROSS_BRIDGE_2] = Location::Boulder(RC_GV_BRONZE_BOULDER_ACROSS_BRIDGE_2, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-1695, -350), "GV Bronze Boulder Across Bridge 2", RHT_GV_BRONZE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_BRONZE_BOULDER_ACROSS_BRIDGE_2)); + locationTable[RC_GV_BRONZE_BOULDER_ACROSS_BRIDGE_3] = Location::Boulder(RC_GV_BRONZE_BOULDER_ACROSS_BRIDGE_3, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-1001, 637), "GV Bronze Boulder Across Bridge 3", RHT_GV_BRONZE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_BRONZE_BOULDER_ACROSS_BRIDGE_3)); + locationTable[RC_GV_BRONZE_BOULDER_ACROSS_BRIDGE_4] = Location::Boulder(RC_GV_BRONZE_BOULDER_ACROSS_BRIDGE_4, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-1291, 787), "GV Bronze Boulder Across Bridge 4", RHT_GV_BRONZE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_BRONZE_BOULDER_ACROSS_BRIDGE_4)); + locationTable[RC_GV_BRONZE_BOULDER_ACROSS_BRIDGE_5] = Location::Boulder(RC_GV_BRONZE_BOULDER_ACROSS_BRIDGE_5, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-1416, 778), "GV Bronze Boulder Across Bridge 5", RHT_GV_BRONZE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_BRONZE_BOULDER_ACROSS_BRIDGE_5)); + locationTable[RC_GV_BRONZE_BOULDER_ACROSS_BRIDGE_6] = Location::Boulder(RC_GV_BRONZE_BOULDER_ACROSS_BRIDGE_6, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-1256, 856), "GV Bronze Boulder Across Bridge 6", RHT_GV_BRONZE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_BRONZE_BOULDER_ACROSS_BRIDGE_6)); + + locationTable[RC_HF_SILVER_BOULDER] = Location::Boulder(RC_HF_SILVER_BOULDER, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(674, 8256), "HF Silver Boulder", RHT_HF_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SILVER_BOULDER)); + locationTable[RC_HF_ROCK_1] = Location::Rock(RC_HF_ROCK_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-7875, 6995), "HF Circle Rock 1", RHT_HF_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_ROCK_1)); + locationTable[RC_HF_ROCK_2] = Location::Rock(RC_HF_ROCK_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-7818, 6971), "HF Circle Rock 2", RHT_HF_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_ROCK_2)); + locationTable[RC_HF_ROCK_3] = Location::Rock(RC_HF_ROCK_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-7795, 6915), "HF Circle Rock 3", RHT_HF_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_ROCK_3)); + locationTable[RC_HF_ROCK_4] = Location::Rock(RC_HF_ROCK_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-7818, 6858), "HF Circle Rock 4", RHT_HF_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_ROCK_4)); + locationTable[RC_HF_ROCK_5] = Location::Rock(RC_HF_ROCK_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-7875, 6835), "HF Circle Rock 5", RHT_HF_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_ROCK_5)); + locationTable[RC_HF_ROCK_6] = Location::Rock(RC_HF_ROCK_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-7931, 6858), "HF Circle Rock 6", RHT_HF_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_ROCK_6)); + locationTable[RC_HF_ROCK_7] = Location::Rock(RC_HF_ROCK_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-7955, 6915), "HF Circle Rock 7", RHT_HF_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_ROCK_7)); + locationTable[RC_HF_ROCK_8] = Location::Rock(RC_HF_ROCK_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-7931, 6971), "HF Circle Rock 8", RHT_HF_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_ROCK_8)); + locationTable[RC_HF_BOULDER_NORTH] = Location::Boulder(RC_HF_BOULDER_NORTH, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-4450, -425), "HF Boulder North", RHT_HF_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_BOULDER_NORTH)); + locationTable[RC_HF_BOULDER_BY_MARKET] = Location::Boulder(RC_HF_BOULDER_BY_MARKET, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1425, 810), "Market Boulder HF", RHT_HF_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_BOULDER_BY_MARKET)); + locationTable[RC_HF_BOULDER_SOUTH] = Location::Boulder(RC_HF_BOULDER_SOUTH, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-270, 12350), "HF Boulder South", RHT_HF_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_BOULDER_SOUTH)); + locationTable[RC_HF_BRONZE_BOULDER_1] = Location::Boulder(RC_HF_BRONZE_BOULDER_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-7870, 6920), "HF Bronze Boulder 1", RHT_HF_BRONZE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_BRONZE_BOULDER_1)); + locationTable[RC_HF_BRONZE_BOULDER_2] = Location::Boulder(RC_HF_BRONZE_BOULDER_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-7804, 7983), "HF Bronze Boulder 2", RHT_HF_BRONZE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_BRONZE_BOULDER_2)); + locationTable[RC_HF_BRONZE_BOULDER_3] = Location::Boulder(RC_HF_BRONZE_BOULDER_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-8397, 7947), "HF Bronze Boulder 3", RHT_HF_BRONZE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_BRONZE_BOULDER_3)); + locationTable[RC_HF_BRONZE_BOULDER_4] = Location::Boulder(RC_HF_BRONZE_BOULDER_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-6461, 8220), "HF Bronze Boulder 4", RHT_HF_BRONZE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_BRONZE_BOULDER_4)); + + locationTable[RC_KAK_SILVER_BOULDER] = Location::Boulder(RC_KAK_SILVER_BOULDER, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1436, 1361), "Kak Silver Boulder", RHT_KAK_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_SILVER_BOULDER)); + locationTable[RC_KAK_ROCK_1] = Location::Rock(RC_KAK_ROCK_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(220, -1236), "Kak Rock 1", RHT_KAK_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_ROCK_1)); + locationTable[RC_KAK_ROCK_2] = Location::Rock(RC_KAK_ROCK_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-664, 1288), "Kak Rock 2", RHT_KAK_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_ROCK_2)); + locationTable[RC_GY_ROCK] = Location::Rock(RC_GY_ROCK, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1193, 693), "GY Rock", RHT_GY_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_ROCK)); + + locationTable[RC_LH_ROCK] = Location::Rock(RC_LH_ROCK, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(1222, 3953), "LA Rock", RHT_LH_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_ROCK)); + + locationTable[RC_ZD_CIRCLE_ROCK_1] = Location::Rock(RC_ZD_CIRCLE_ROCK_1, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(462, -696), "ZD Circle Rock 1", RHT_ZD_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_CIRCLE_ROCK_1)); + locationTable[RC_ZD_CIRCLE_ROCK_2] = Location::Rock(RC_ZD_CIRCLE_ROCK_2, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(518, -719), "ZD Circle Rock 2", RHT_ZD_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_CIRCLE_ROCK_2)); + locationTable[RC_ZD_CIRCLE_ROCK_3] = Location::Rock(RC_ZD_CIRCLE_ROCK_3, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(542, -776), "ZD Circle Rock 3", RHT_ZD_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_CIRCLE_ROCK_3)); + locationTable[RC_ZD_CIRCLE_ROCK_4] = Location::Rock(RC_ZD_CIRCLE_ROCK_4, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(518, -832), "ZD Circle Rock 4", RHT_ZD_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_CIRCLE_ROCK_4)); + locationTable[RC_ZD_CIRCLE_ROCK_5] = Location::Rock(RC_ZD_CIRCLE_ROCK_5, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(462, -856), "ZD Circle Rock 5", RHT_ZD_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_CIRCLE_ROCK_5)); + locationTable[RC_ZD_CIRCLE_ROCK_6] = Location::Rock(RC_ZD_CIRCLE_ROCK_6, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(405, -832), "ZD Circle Rock 6", RHT_ZD_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_CIRCLE_ROCK_6)); + locationTable[RC_ZD_CIRCLE_ROCK_7] = Location::Rock(RC_ZD_CIRCLE_ROCK_7, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(382, -776), "ZD Circle Rock 7", RHT_ZD_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_CIRCLE_ROCK_7)); + locationTable[RC_ZD_CIRCLE_ROCK_8] = Location::Rock(RC_ZD_CIRCLE_ROCK_8, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(405, -719), "ZD Circle Rock 8", RHT_ZD_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_CIRCLE_ROCK_8)); + locationTable[RC_ZF_BOULDER] = Location::Boulder(RC_ZF_BOULDER, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(189, 2586), "ZF Boulder", RHT_ZF_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOULDER)); + locationTable[RC_ZF_SILVER_BOULDER] = Location::Boulder(RC_ZF_SILVER_BOULDER, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(316, 2634), "ZF Silver Boulder", RHT_ZF_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_SILVER_BOULDER)); + locationTable[RC_ZF_UNDERGROUND_BOULDER] = Location::Boulder(RC_ZF_UNDERGROUND_BOULDER, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(317, 2631), "ZF Underground Boulder", RHT_ZF_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_UNDERGROUND_BOULDER)); + locationTable[RC_ZR_BOULDER_1] = Location::Boulder(RC_ZR_BOULDER_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1456, 434), "ZR Boulder 1", RHT_ZR_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BOULDER_1)); + locationTable[RC_ZR_BOULDER_2] = Location::Boulder(RC_ZR_BOULDER_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1518, 435), "ZR Boulder 2", RHT_ZR_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BOULDER_2)); + locationTable[RC_ZR_BOULDER_3] = Location::Boulder(RC_ZR_BOULDER_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1576, 430), "ZR Boulder 3", RHT_ZR_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BOULDER_3)); + locationTable[RC_ZR_BOULDER_4] = Location::Boulder(RC_ZR_BOULDER_4, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1400, 482), "ZR Boulder 4", RHT_ZR_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BOULDER_4)); + locationTable[RC_ZR_CIRCLE_ROCK_1] = Location::Rock(RC_ZR_CIRCLE_ROCK_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1635, -53), "ZR Circle Rock 1", RHT_ZR_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_CIRCLE_ROCK_1)); + locationTable[RC_ZR_CIRCLE_ROCK_2] = Location::Rock(RC_ZR_CIRCLE_ROCK_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1578, -76), "ZR Circle Rock 2", RHT_ZR_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_CIRCLE_ROCK_2)); + locationTable[RC_ZR_CIRCLE_ROCK_3] = Location::Rock(RC_ZR_CIRCLE_ROCK_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1555, -133), "ZR Circle Rock 3", RHT_ZR_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_CIRCLE_ROCK_3)); + locationTable[RC_ZR_CIRCLE_ROCK_4] = Location::Rock(RC_ZR_CIRCLE_ROCK_4, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1578, -189), "ZR Circle Rock 4", RHT_ZR_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_CIRCLE_ROCK_4)); + locationTable[RC_ZR_CIRCLE_ROCK_5] = Location::Rock(RC_ZR_CIRCLE_ROCK_5, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1635, -213), "ZR Circle Rock 5", RHT_ZR_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_CIRCLE_ROCK_5)); + locationTable[RC_ZR_CIRCLE_ROCK_6] = Location::Rock(RC_ZR_CIRCLE_ROCK_6, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1691, -189), "ZR Circle Rock 6", RHT_ZR_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_CIRCLE_ROCK_6)); + locationTable[RC_ZR_CIRCLE_ROCK_7] = Location::Rock(RC_ZR_CIRCLE_ROCK_7, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1715, -133), "ZR Circle Rock 7", RHT_ZR_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_CIRCLE_ROCK_7)); + locationTable[RC_ZR_CIRCLE_ROCK_8] = Location::Rock(RC_ZR_CIRCLE_ROCK_8, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1691, -76), "ZR Circle Rock 8", RHT_ZR_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_CIRCLE_ROCK_8)); + locationTable[RC_ZR_UPPER_CIRCLE_BOULDER] = Location::Boulder(RC_ZR_UPPER_CIRCLE_BOULDER, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(672, -366), "ZR Upper Circle Boulder", RHT_ZR_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_UPPER_CIRCLE_BOULDER)); + locationTable[RC_ZR_UPPER_CIRCLE_ROCK_1] = Location::Rock(RC_ZR_UPPER_CIRCLE_ROCK_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(668, -290), "ZR Upper Circle Rock 1", RHT_ZR_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_UPPER_CIRCLE_ROCK_1)); + locationTable[RC_ZR_UPPER_CIRCLE_ROCK_2] = Location::Rock(RC_ZR_UPPER_CIRCLE_ROCK_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(724, -313), "ZR Upper Circle Rock 2", RHT_ZR_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_UPPER_CIRCLE_ROCK_2)); + locationTable[RC_ZR_UPPER_CIRCLE_ROCK_3] = Location::Rock(RC_ZR_UPPER_CIRCLE_ROCK_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(748, -370), "ZR Upper Circle Rock 3", RHT_ZR_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_UPPER_CIRCLE_ROCK_3)); + locationTable[RC_ZR_UPPER_CIRCLE_ROCK_4] = Location::Rock(RC_ZR_UPPER_CIRCLE_ROCK_4, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(724, -426), "ZR Upper Circle Rock 4", RHT_ZR_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_UPPER_CIRCLE_ROCK_4)); + locationTable[RC_ZR_UPPER_CIRCLE_ROCK_5] = Location::Rock(RC_ZR_UPPER_CIRCLE_ROCK_5, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(668, -450), "ZR Upper Circle Rock 5", RHT_ZR_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_UPPER_CIRCLE_ROCK_5)); + locationTable[RC_ZR_UPPER_CIRCLE_ROCK_6] = Location::Rock(RC_ZR_UPPER_CIRCLE_ROCK_6, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(611, -426), "ZR Upper Circle Rock 6", RHT_ZR_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_UPPER_CIRCLE_ROCK_6)); + locationTable[RC_ZR_UPPER_CIRCLE_ROCK_7] = Location::Rock(RC_ZR_UPPER_CIRCLE_ROCK_7, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(588, -370), "ZR Upper Circle Rock 7", RHT_ZR_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_UPPER_CIRCLE_ROCK_7)); + locationTable[RC_ZR_UPPER_CIRCLE_ROCK_8] = Location::Rock(RC_ZR_UPPER_CIRCLE_ROCK_8, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(611, -313), "ZR Upper Circle Rock 8", RHT_ZR_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_UPPER_CIRCLE_ROCK_8)); + locationTable[RC_ZR_ROCK] = Location::Rock(RC_ZR_ROCK, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(2044, -786), "ZR Rock", RHT_ZR_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_ROCK)); + locationTable[RC_ZR_UNDERWATER_ROCK_1] = Location::Rock(RC_ZR_UNDERWATER_ROCK_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(2425, -446), "ZR Underwater Rock 1", RHT_ZR_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_UNDERWATER_ROCK_1)); + locationTable[RC_ZR_UNDERWATER_ROCK_2] = Location::Rock(RC_ZR_UNDERWATER_ROCK_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(2425, -524), "ZR Underwater Rock 2", RHT_ZR_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_UNDERWATER_ROCK_2)); + locationTable[RC_ZR_UNDERWATER_ROCK_3] = Location::Rock(RC_ZR_UNDERWATER_ROCK_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(2503, -571), "ZR Underwater Rock 3", RHT_ZR_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_UNDERWATER_ROCK_3)); + locationTable[RC_ZR_UNDERWATER_ROCK_4] = Location::Rock(RC_ZR_UNDERWATER_ROCK_4, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(2550, -415), "ZR Underwater Rock 4", RHT_ZR_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_UNDERWATER_ROCK_4)); + + // 5 rocks by dc + locationTable[RC_DMT_ROCK_1] = Location::Rock(RC_DMT_ROCK_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-1816, -513), "DMT Rock 1", RHT_DMT_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_ROCK_1)); + locationTable[RC_DMT_ROCK_2] = Location::Rock(RC_DMT_ROCK_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-1831, -614), "DMT Rock 2", RHT_DMT_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_ROCK_2)); + locationTable[RC_DMT_ROCK_3] = Location::Rock(RC_DMT_ROCK_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-1857, -536), "DMT Rock 3", RHT_DMT_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_ROCK_3)); + locationTable[RC_DMT_ROCK_4] = Location::Rock(RC_DMT_ROCK_4, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-1878, -465), "DMT Rock 4", RHT_DMT_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_ROCK_4)); + locationTable[RC_DMT_ROCK_5] = Location::Rock(RC_DMT_ROCK_5, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-1787, -550), "DMT Rock 5", RHT_DMT_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_ROCK_5)); + locationTable[RC_DMT_SUMMIT_ROCK] = Location::Rock(RC_DMT_SUMMIT_ROCK, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-327, -4286), "DMT Summit Rock", RHT_DMT_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_SUMMIT_ROCK)); + locationTable[RC_DMT_CIRCLE_ROCK_1] = Location::Rock(RC_DMT_CIRCLE_ROCK_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-383, -1126), "DMT Circle Rock 1", RHT_DMT_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_CIRCLE_ROCK_1)); + locationTable[RC_DMT_CIRCLE_ROCK_2] = Location::Rock(RC_DMT_CIRCLE_ROCK_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-326, -1149), "DMT Circle Rock 2", RHT_DMT_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_CIRCLE_ROCK_2)); + locationTable[RC_DMT_CIRCLE_ROCK_3] = Location::Rock(RC_DMT_CIRCLE_ROCK_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-303, -1206), "DMT Circle Rock 3", RHT_DMT_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_CIRCLE_ROCK_3)); + locationTable[RC_DMT_CIRCLE_ROCK_4] = Location::Rock(RC_DMT_CIRCLE_ROCK_4, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-326, -1262), "DMT Circle Rock 4", RHT_DMT_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_CIRCLE_ROCK_4)); + locationTable[RC_DMT_CIRCLE_ROCK_5] = Location::Rock(RC_DMT_CIRCLE_ROCK_5, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-383, -1286), "DMT Circle Rock 5", RHT_DMT_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_CIRCLE_ROCK_5)); + locationTable[RC_DMT_CIRCLE_ROCK_6] = Location::Rock(RC_DMT_CIRCLE_ROCK_6, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-439, -1262), "DMT Circle Rock 6", RHT_DMT_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_CIRCLE_ROCK_6)); + locationTable[RC_DMT_CIRCLE_ROCK_7] = Location::Rock(RC_DMT_CIRCLE_ROCK_7, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-463, -1206), "DMT Circle Rock 7", RHT_DMT_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_CIRCLE_ROCK_7)); + locationTable[RC_DMT_CIRCLE_ROCK_8] = Location::Rock(RC_DMT_CIRCLE_ROCK_8, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-439, -1149), "DMT Circle Rock 8", RHT_DMT_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_CIRCLE_ROCK_8)); + locationTable[RC_DMT_CHILD_BOULDER] = Location::Boulder(RC_DMT_CHILD_BOULDER, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-1060, -51), "DMT Child Boulder", RHT_DMT_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_CHILD_BOULDER)); + locationTable[RC_DMT_BOULDER_1] = Location::Boulder(RC_DMT_BOULDER_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-625, -55), "DMT Boulder 1", RHT_DMT_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_BOULDER_1)); + locationTable[RC_DMT_BOULDER_2] = Location::Boulder(RC_DMT_BOULDER_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-808, -59), "DMT Boulder 2", RHT_DMT_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_BOULDER_2)); + locationTable[RC_DMT_COW_BOULDER] = Location::Boulder(RC_DMT_COW_BOULDER, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-688, -285), "Cow Boulder", RHT_DMT_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_BOULDER)); + locationTable[RC_DMT_BRONZE_BOULDER_1] = Location::Boulder(RC_DMT_BRONZE_BOULDER_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-1175, -803), "DMT Bronze Boulder 1", RHT_DMT_BRONZE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_BRONZE_BOULDER_1)); + locationTable[RC_DMT_BRONZE_BOULDER_2] = Location::Boulder(RC_DMT_BRONZE_BOULDER_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-1948, 1706), "DMT Bronze Boulder 2", RHT_DMT_BRONZE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_BRONZE_BOULDER_2)); + locationTable[RC_DMT_BRONZE_BOULDER_3] = Location::Boulder(RC_DMT_BRONZE_BOULDER_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-2019, 1101), "DMT Bronze Boulder 3", RHT_DMT_BRONZE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_BRONZE_BOULDER_3)); + locationTable[RC_DMT_BRONZE_BOULDER_4] = Location::Boulder(RC_DMT_BRONZE_BOULDER_4, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-1658, -88), "DMT Bronze Boulder 4", RHT_DMT_BRONZE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_BRONZE_BOULDER_4)); + locationTable[RC_DMT_BRONZE_BOULDER_5] = Location::Boulder(RC_DMT_BRONZE_BOULDER_5, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-1753, 445), "DMT Bronze Boulder 5", RHT_DMT_BRONZE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_BRONZE_BOULDER_5)); + locationTable[RC_DMT_BRONZE_BOULDER_6] = Location::Boulder(RC_DMT_BRONZE_BOULDER_6, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-1018, 1283), "DMT Bronze Boulder 6", RHT_DMT_BRONZE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_BRONZE_BOULDER_6)); + locationTable[RC_DMT_BRONZE_BOULDER_7] = Location::Boulder(RC_DMT_BRONZE_BOULDER_7, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-1986, 727), "DMT Bronze Boulder 7", RHT_DMT_BRONZE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_BRONZE_BOULDER_7)); + locationTable[RC_DMT_BRONZE_BOULDER_8] = Location::Boulder(RC_DMT_BRONZE_BOULDER_8, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-23, -3196), "DMT Bronze Boulder 8", RHT_DMT_BRONZE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_BRONZE_BOULDER_8)); + locationTable[RC_DMT_BRONZE_BOULDER_9] = Location::Boulder(RC_DMT_BRONZE_BOULDER_9, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-343, -2794), "DMT Bronze Boulder 9", RHT_DMT_BRONZE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_BRONZE_BOULDER_9)); + locationTable[RC_DMT_BRONZE_BOULDER_10] = Location::Boulder(RC_DMT_BRONZE_BOULDER_10, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-154, -2484), "DMT Bronze Boulder 10", RHT_DMT_BRONZE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_BRONZE_BOULDER_10)); + locationTable[RC_DMT_BRONZE_BOULDER_11] = Location::Boulder(RC_DMT_BRONZE_BOULDER_11, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-1590, -402), "DMT Bronze Boulder 11", RHT_DMT_BRONZE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_BRONZE_BOULDER_11)); + + locationTable[RC_GC_LW_BOULDER_1] = Location::Boulder(RC_GC_LW_BOULDER_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(416, 1049), "GC Goron City Boulder 1", RHT_GC_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_LW_BOULDER_1)); + locationTable[RC_GC_LW_BOULDER_2] = Location::Boulder(RC_GC_LW_BOULDER_2, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(470, 1031), "GC Goron City Boulder 2", RHT_GC_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_LW_BOULDER_2)); + locationTable[RC_GC_LW_BOULDER_3] = Location::Boulder(RC_GC_LW_BOULDER_3, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(367, 1078), "GC Goron City Boulder 3", RHT_GC_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_LW_BOULDER_3)); + locationTable[RC_GC_ENTRANCE_BOULDER_1] = Location::Boulder(RC_GC_ENTRANCE_BOULDER_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-670, 470), "GC Entrance Boulder 1", RHT_GC_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_ENTRANCE_BOULDER_1)); + locationTable[RC_GC_ENTRANCE_BOULDER_2] = Location::Boulder(RC_GC_ENTRANCE_BOULDER_2, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-607, 419), "GC Entrance Boulder 2", RHT_GC_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_ENTRANCE_BOULDER_2)); + locationTable[RC_GC_ENTRANCE_BOULDER_3] = Location::Boulder(RC_GC_ENTRANCE_BOULDER_3, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-756, 474), "GC Entrance Boulder 3", RHT_GC_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_ENTRANCE_BOULDER_3)); + locationTable[RC_GC_MAZE_SILVER_BOULDER_1] = Location::Boulder(RC_GC_MAZE_SILVER_BOULDER_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1479, -794), "GC Maze Silver Boulder 1", RHT_GC_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_SILVER_BOULDER_1)); + locationTable[RC_GC_MAZE_SILVER_BOULDER_2] = Location::Boulder(RC_GC_MAZE_SILVER_BOULDER_2, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1478, -855), "GC Maze Silver Boulder 2", RHT_GC_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_SILVER_BOULDER_2)); + locationTable[RC_GC_MAZE_SILVER_BOULDER_3] = Location::Boulder(RC_GC_MAZE_SILVER_BOULDER_3, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1474, -624), "GC Maze Silver Boulder 3", RHT_GC_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_SILVER_BOULDER_3)); + locationTable[RC_GC_MAZE_SILVER_BOULDER_4] = Location::Boulder(RC_GC_MAZE_SILVER_BOULDER_4, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1471, -993), "GC Maze Silver Boulder 4", RHT_GC_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_SILVER_BOULDER_4)); + locationTable[RC_GC_MAZE_SILVER_BOULDER_5] = Location::Boulder(RC_GC_MAZE_SILVER_BOULDER_5, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1467, -1064), "GC Maze Silver Boulder 5", RHT_GC_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_SILVER_BOULDER_5)); + locationTable[RC_GC_MAZE_SILVER_BOULDER_6] = Location::Boulder(RC_GC_MAZE_SILVER_BOULDER_6, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1460, -1121), "GC Maze Silver Boulder 6", RHT_GC_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_SILVER_BOULDER_6)); + locationTable[RC_GC_MAZE_SILVER_BOULDER_7] = Location::Boulder(RC_GC_MAZE_SILVER_BOULDER_7, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1451, -567), "GC Maze Silver Boulder 7", RHT_GC_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_SILVER_BOULDER_7)); + locationTable[RC_GC_MAZE_SILVER_BOULDER_8] = Location::Boulder(RC_GC_MAZE_SILVER_BOULDER_8, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1448, -672), "GC Maze Silver Boulder 8", RHT_GC_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_SILVER_BOULDER_8)); + locationTable[RC_GC_MAZE_SILVER_BOULDER_9] = Location::Boulder(RC_GC_MAZE_SILVER_BOULDER_9, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1440, -1174), "GC Maze Silver Boulder 9", RHT_GC_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_SILVER_BOULDER_9)); + locationTable[RC_GC_MAZE_SILVER_BOULDER_10] = Location::Boulder(RC_GC_MAZE_SILVER_BOULDER_10, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1437, -1342), "GC Maze Silver Boulder 10", RHT_GC_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_SILVER_BOULDER_10)); + locationTable[RC_GC_MAZE_SILVER_BOULDER_11] = Location::Boulder(RC_GC_MAZE_SILVER_BOULDER_11, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1424, -1245), "GC Maze Silver Boulder 11", RHT_GC_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_SILVER_BOULDER_11)); + locationTable[RC_GC_MAZE_SILVER_BOULDER_12] = Location::Boulder(RC_GC_MAZE_SILVER_BOULDER_12, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1424, -609), "GC Maze Silver Boulder 12", RHT_GC_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_SILVER_BOULDER_12)); + locationTable[RC_GC_MAZE_SILVER_BOULDER_13] = Location::Boulder(RC_GC_MAZE_SILVER_BOULDER_13, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1399, -1300), "GC Maze Silver Boulder 13", RHT_GC_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_SILVER_BOULDER_13)); + locationTable[RC_GC_MAZE_SILVER_BOULDER_14] = Location::Boulder(RC_GC_MAZE_SILVER_BOULDER_14, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1394, -654), "GC Maze Silver Boulder 14", RHT_GC_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_SILVER_BOULDER_14)); + locationTable[RC_GC_MAZE_SILVER_BOULDER_15] = Location::Boulder(RC_GC_MAZE_SILVER_BOULDER_15, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1343, -698), "GC Maze Silver Boulder 15", RHT_GC_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_SILVER_BOULDER_15)); + locationTable[RC_GC_MAZE_SILVER_BOULDER_16] = Location::Boulder(RC_GC_MAZE_SILVER_BOULDER_16, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1319, -1086), "GC Maze Silver Boulder 16", RHT_GC_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_SILVER_BOULDER_16)); + locationTable[RC_GC_MAZE_SILVER_BOULDER_17] = Location::Boulder(RC_GC_MAZE_SILVER_BOULDER_17, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1312, -1039), "GC Maze Silver Boulder 17", RHT_GC_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_SILVER_BOULDER_17)); + locationTable[RC_GC_MAZE_SILVER_BOULDER_18] = Location::Boulder(RC_GC_MAZE_SILVER_BOULDER_18, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1306, -837), "GC Maze Silver Boulder 18", RHT_GC_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_SILVER_BOULDER_18)); + locationTable[RC_GC_MAZE_SILVER_BOULDER_19] = Location::Boulder(RC_GC_MAZE_SILVER_BOULDER_19, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1279, -656), "GC Maze Silver Boulder 19", RHT_GC_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_SILVER_BOULDER_19)); + locationTable[RC_GC_MAZE_SILVER_BOULDER_20] = Location::Boulder(RC_GC_MAZE_SILVER_BOULDER_20, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1255, -840), "GC Maze Silver Boulder 20", RHT_GC_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_SILVER_BOULDER_20)); + locationTable[RC_GC_MAZE_SILVER_BOULDER_21] = Location::Boulder(RC_GC_MAZE_SILVER_BOULDER_21, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1246, -1075), "GC Maze Silver Boulder 21", RHT_GC_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_SILVER_BOULDER_21)); + locationTable[RC_GC_MAZE_SILVER_BOULDER_22] = Location::Boulder(RC_GC_MAZE_SILVER_BOULDER_22, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1244, -589), "GC Maze Silver Boulder 22", RHT_GC_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_SILVER_BOULDER_22)); + locationTable[RC_GC_MAZE_SILVER_BOULDER_23] = Location::Boulder(RC_GC_MAZE_SILVER_BOULDER_23, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1210, -852), "GC Maze Silver Boulder 23", RHT_GC_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_SILVER_BOULDER_23)); + locationTable[RC_GC_MAZE_SILVER_BOULDER_24] = Location::Boulder(RC_GC_MAZE_SILVER_BOULDER_24, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1206, -627), "GC Maze Silver Boulder 24", RHT_GC_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_SILVER_BOULDER_24)); + locationTable[RC_GC_MAZE_SILVER_BOULDER_25] = Location::Boulder(RC_GC_MAZE_SILVER_BOULDER_25, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1187, -896), "GC Maze Silver Boulder 25", RHT_GC_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_SILVER_BOULDER_25)); + locationTable[RC_GC_MAZE_SILVER_BOULDER_26] = Location::Boulder(RC_GC_MAZE_SILVER_BOULDER_26, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1157, -954), "GC Maze Silver Boulder 26", RHT_GC_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_SILVER_BOULDER_26)); + locationTable[RC_GC_MAZE_SILVER_BOULDER_27] = Location::Boulder(RC_GC_MAZE_SILVER_BOULDER_27, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1130, -1137), "GC Maze Silver Boulder 27", RHT_GC_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_SILVER_BOULDER_27)); + locationTable[RC_GC_MAZE_SILVER_BOULDER_28] = Location::Boulder(RC_GC_MAZE_SILVER_BOULDER_28, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1120, -1001), "GC Maze Silver Boulder 28", RHT_GC_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_SILVER_BOULDER_28)); + locationTable[RC_GC_MAZE_SILVER_BOULDER_29] = Location::Boulder(RC_GC_MAZE_SILVER_BOULDER_29, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1179, -1098), "GC Maze Silver Boulder 29", RHT_GC_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_SILVER_BOULDER_29)); + locationTable[RC_GC_MAZE_BOULDER_1] = Location::Boulder(RC_GC_MAZE_BOULDER_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1342, -628), "GC Maze Boulder 1", RHT_GC_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_BOULDER_1)); + locationTable[RC_GC_MAZE_BOULDER_2] = Location::Boulder(RC_GC_MAZE_BOULDER_2, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1456, -501), "GC Maze Boulder 2", RHT_GC_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_BOULDER_2)); + locationTable[RC_GC_MAZE_BOULDER_3] = Location::Boulder(RC_GC_MAZE_BOULDER_3, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1233, -511), "GC Maze Boulder 3", RHT_GC_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_BOULDER_3)); + locationTable[RC_GC_MAZE_BOULDER_4] = Location::Boulder(RC_GC_MAZE_BOULDER_4, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1137, -657), "GC Maze Boulder 4", RHT_GC_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_BOULDER_4)); + locationTable[RC_GC_MAZE_BOULDER_5] = Location::Boulder(RC_GC_MAZE_BOULDER_5, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1124, -913), "GC Maze Boulder 5", RHT_GC_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_BOULDER_5)); + locationTable[RC_GC_MAZE_BOULDER_6] = Location::Boulder(RC_GC_MAZE_BOULDER_6, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1326, -771), "GC Maze Boulder 6", RHT_GC_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_BOULDER_6)); + locationTable[RC_GC_MAZE_BOULDER_7] = Location::Boulder(RC_GC_MAZE_BOULDER_7, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1469, -737), "GC Maze Boulder 7", RHT_GC_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_BOULDER_7)); + locationTable[RC_GC_MAZE_BOULDER_8] = Location::Boulder(RC_GC_MAZE_BOULDER_8, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1476, -921), "GC Maze Boulder 8", RHT_GC_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_BOULDER_8)); + locationTable[RC_GC_MAZE_BOULDER_9] = Location::Boulder(RC_GC_MAZE_BOULDER_9, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1391, -1087), "GC Maze Boulder 9", RHT_GC_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_BOULDER_9)); + locationTable[RC_GC_MAZE_BOULDER_10] = Location::Boulder(RC_GC_MAZE_BOULDER_10, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1222, -997), "GC Maze Boulder 10", RHT_GC_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_BOULDER_10)); + locationTable[RC_GC_MAZE_BRONZE_BOULDER_1] = Location::Boulder(RC_GC_MAZE_BRONZE_BOULDER_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1541, -631), "GC Maze Bronze Boulder 1", RHT_GC_BRONZE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_BRONZE_BOULDER_1)); + locationTable[RC_GC_MAZE_BRONZE_BOULDER_2] = Location::Boulder(RC_GC_MAZE_BRONZE_BOULDER_2, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1536, -861), "GC Maze Bronze Boulder 2", RHT_GC_BRONZE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_BRONZE_BOULDER_2)); + locationTable[RC_GC_MAZE_BRONZE_BOULDER_3] = Location::Boulder(RC_GC_MAZE_BRONZE_BOULDER_3, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1536, -1102), "GC Maze Bronze Boulder 3", RHT_GC_BRONZE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_BRONZE_BOULDER_3)); + locationTable[RC_GC_MAZE_BRONZE_BOULDER_4] = Location::Boulder(RC_GC_MAZE_BRONZE_BOULDER_4, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1534, -752), "GC Maze Bronze Boulder 4", RHT_GC_BRONZE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_BRONZE_BOULDER_4)); + locationTable[RC_GC_MAZE_BRONZE_BOULDER_5] = Location::Boulder(RC_GC_MAZE_BRONZE_BOULDER_5, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1536, -991), "GC Maze Bronze Boulder 5", RHT_GC_BRONZE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_BRONZE_BOULDER_5)); + locationTable[RC_GC_MAZE_ROCK] = Location::Rock(RC_GC_MAZE_ROCK, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1197, -1329), "GC Maze Rock", RHT_GC_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_ROCK)); + + locationTable[RC_COLOSSUS_SILVER_BOULDER] = Location::Boulder(RC_COLOSSUS_SILVER_BOULDER, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS(61, -1301), "Colossus Silver Boulder", RHT_COLOSSUS_SILVER_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_SILVER_BOULDER)); + locationTable[RC_COLOSSUS_ROCK] = Location::Rock(RC_COLOSSUS_ROCK, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS(1537, 667), "Colossus Rock", RHT_COLOSSUS_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_ROCK)); + locationTable[RC_COLOSSUS_CIRCLE_1_ROCK_1] = Location::Rock(RC_COLOSSUS_CIRCLE_1_ROCK_1, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS(-250, -1272), "Colossus Circle 1 Rock 1", RHT_COLOSSUS_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_CIRCLE_1_ROCK_1)); + locationTable[RC_COLOSSUS_CIRCLE_1_ROCK_2] = Location::Rock(RC_COLOSSUS_CIRCLE_1_ROCK_2, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS(-193, -1295), "Colossus Circle 1 Rock 2", RHT_COLOSSUS_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_CIRCLE_1_ROCK_2)); + locationTable[RC_COLOSSUS_CIRCLE_1_ROCK_3] = Location::Rock(RC_COLOSSUS_CIRCLE_1_ROCK_3, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS(-170, -1352), "Colossus Circle 1 Rock 3", RHT_COLOSSUS_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_CIRCLE_1_ROCK_3)); + locationTable[RC_COLOSSUS_CIRCLE_1_ROCK_4] = Location::Rock(RC_COLOSSUS_CIRCLE_1_ROCK_4, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS(-193, -1408), "Colossus Circle 1 Rock 4", RHT_COLOSSUS_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_CIRCLE_1_ROCK_4)); + locationTable[RC_COLOSSUS_CIRCLE_1_ROCK_5] = Location::Rock(RC_COLOSSUS_CIRCLE_1_ROCK_5, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS(-250, -1432), "Colossus Circle 1 Rock 5", RHT_COLOSSUS_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_CIRCLE_1_ROCK_5)); + locationTable[RC_COLOSSUS_CIRCLE_1_ROCK_6] = Location::Rock(RC_COLOSSUS_CIRCLE_1_ROCK_6, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS(-306, -1408), "Colossus Circle 1 Rock 6", RHT_COLOSSUS_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_CIRCLE_1_ROCK_6)); + locationTable[RC_COLOSSUS_CIRCLE_1_ROCK_7] = Location::Rock(RC_COLOSSUS_CIRCLE_1_ROCK_7, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS(-330, -1352), "Colossus Circle 1 Rock 7", RHT_COLOSSUS_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_CIRCLE_1_ROCK_7)); + locationTable[RC_COLOSSUS_CIRCLE_1_ROCK_8] = Location::Rock(RC_COLOSSUS_CIRCLE_1_ROCK_8, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS(-306, -1295), "Colossus Circle 1 Rock 8", RHT_COLOSSUS_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_CIRCLE_1_ROCK_8)); + locationTable[RC_COLOSSUS_CIRCLE_2_ROCK_1] = Location::Rock(RC_COLOSSUS_CIRCLE_2_ROCK_1, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS(-834, -766), "Colossus Circle 2 Rock 1", RHT_COLOSSUS_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_CIRCLE_2_ROCK_1)); + locationTable[RC_COLOSSUS_CIRCLE_2_ROCK_2] = Location::Rock(RC_COLOSSUS_CIRCLE_2_ROCK_2, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS(-777, -789), "Colossus Circle 2 Rock 2", RHT_COLOSSUS_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_CIRCLE_2_ROCK_2)); + locationTable[RC_COLOSSUS_CIRCLE_2_ROCK_3] = Location::Rock(RC_COLOSSUS_CIRCLE_2_ROCK_3, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS(-754, -846), "Colossus Circle 2 Rock 3", RHT_COLOSSUS_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_CIRCLE_2_ROCK_3)); + locationTable[RC_COLOSSUS_CIRCLE_2_ROCK_4] = Location::Rock(RC_COLOSSUS_CIRCLE_2_ROCK_4, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS(-777, -902), "Colossus Circle 2 Rock 4", RHT_COLOSSUS_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_CIRCLE_2_ROCK_4)); + locationTable[RC_COLOSSUS_CIRCLE_2_ROCK_5] = Location::Rock(RC_COLOSSUS_CIRCLE_2_ROCK_5, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS(-834, -926), "Colossus Circle 2 Rock 5", RHT_COLOSSUS_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_CIRCLE_2_ROCK_5)); + locationTable[RC_COLOSSUS_CIRCLE_2_ROCK_6] = Location::Rock(RC_COLOSSUS_CIRCLE_2_ROCK_6, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS(-890, -902), "Colossus Circle 2 Rock 6", RHT_COLOSSUS_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_CIRCLE_2_ROCK_6)); + locationTable[RC_COLOSSUS_CIRCLE_2_ROCK_7] = Location::Rock(RC_COLOSSUS_CIRCLE_2_ROCK_7, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS(-914, -846), "Colossus Circle 2 Rock 7", RHT_COLOSSUS_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_CIRCLE_2_ROCK_7)); + locationTable[RC_COLOSSUS_CIRCLE_2_ROCK_8] = Location::Rock(RC_COLOSSUS_CIRCLE_2_ROCK_8, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS(-890, -789), "Colossus Circle 2 Rock 8", RHT_COLOSSUS_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_CIRCLE_2_ROCK_8)); + + locationTable[RC_HC_STORMS_GROTTO_ROCK_1] = Location::Rock(RC_HC_STORMS_GROTTO_ROCK_1, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1811, 813), "HC Storms Grotto Rock 1", RHT_HC_STORMS_GROTTO_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_ROCK_1)); + locationTable[RC_HC_STORMS_GROTTO_ROCK_2] = Location::Rock(RC_HC_STORMS_GROTTO_ROCK_2, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1867, 789), "HC Storms Grotto Rock 2", RHT_HC_STORMS_GROTTO_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_ROCK_2)); + locationTable[RC_HC_STORMS_GROTTO_ROCK_3] = Location::Rock(RC_HC_STORMS_GROTTO_ROCK_3, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1891, 733), "HC Storms Grotto Rock 3", RHT_HC_STORMS_GROTTO_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_ROCK_3)); + locationTable[RC_HC_STORMS_GROTTO_ROCK_4] = Location::Rock(RC_HC_STORMS_GROTTO_ROCK_4, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1867, 676), "HC Storms Grotto Rock 4", RHT_HC_STORMS_GROTTO_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_ROCK_4)); + locationTable[RC_HC_STORMS_GROTTO_ROCK_5] = Location::Rock(RC_HC_STORMS_GROTTO_ROCK_5, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1811, 653), "HC Storms Grotto Rock 5", RHT_HC_STORMS_GROTTO_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_ROCK_5)); + locationTable[RC_HC_STORMS_GROTTO_ROCK_6] = Location::Rock(RC_HC_STORMS_GROTTO_ROCK_6, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1754, 676), "HC Storms Grotto Rock 6", RHT_HC_STORMS_GROTTO_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_ROCK_6)); + locationTable[RC_HC_STORMS_GROTTO_ROCK_7] = Location::Rock(RC_HC_STORMS_GROTTO_ROCK_7, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1731, 733), "HC Storms Grotto Rock 7", RHT_HC_STORMS_GROTTO_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_ROCK_7)); + locationTable[RC_HC_STORMS_GROTTO_ROCK_8] = Location::Rock(RC_HC_STORMS_GROTTO_ROCK_8, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1754, 789), "HC Storms Grotto Rock 8", RHT_HC_STORMS_GROTTO_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_ROCK_8)); + + locationTable[RC_BOTW_BOULDER_1] = Location::Boulder(RC_BOTW_BOULDER_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-684, -734), "BOTW Boulder 1", RHT_BOTW_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTW_BOULDER_1)); + locationTable[RC_BOTW_BOULDER_2] = Location::Boulder(RC_BOTW_BOULDER_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-632, -805), "BOTW Boulder 2", RHT_BOTW_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTW_BOULDER_2)); + locationTable[RC_BOTW_BOULDER_3] = Location::Boulder(RC_BOTW_BOULDER_3, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(333, -681), "BOTW Boulder 3", RHT_BOTW_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTW_BOULDER_3)); + locationTable[RC_BOTW_BOULDER_4] = Location::Boulder(RC_BOTW_BOULDER_4, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(409, -637), "BOTW Boulder 4", RHT_BOTW_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTW_BOULDER_4)); + locationTable[RC_BOTW_BOULDER_5] = Location::Boulder(RC_BOTW_BOULDER_5, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(334, -8), "BOTW Boulder 5", RHT_BOTW_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTW_BOULDER_5)); + locationTable[RC_BOTW_BOULDER_6] = Location::Boulder(RC_BOTW_BOULDER_6, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(312, 64), "BOTW Boulder 6", RHT_BOTW_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTW_BOULDER_6)); + + locationTable[RC_DEKU_TREE_MQ_BOULDER_1] = Location::Boulder(RC_DEKU_TREE_MQ_BOULDER_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1237, 1558), "Deku Tree MQ Boulder 1", RHT_DEKU_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BOULDER_1)); + locationTable[RC_DEKU_TREE_MQ_BOULDER_2] = Location::Boulder(RC_DEKU_TREE_MQ_BOULDER_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1183, 1522), "Deku Tree MQ Boulder 2", RHT_DEKU_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BOULDER_2)); + locationTable[RC_DEKU_TREE_MQ_BOULDER_3] = Location::Boulder(RC_DEKU_TREE_MQ_BOULDER_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1129, 1469), "Deku Tree MQ Boulder 3", RHT_DEKU_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BOULDER_3)); + + locationTable[RC_DODONGOS_CAVERN_MQ_LOBBY_BOULDER_1] = Location::Boulder(RC_DODONGOS_CAVERN_MQ_LOBBY_BOULDER_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-435, -1720), "Dodongo's MQ Lobby Boulder 1", RHT_DODONGOS_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LOBBY_BOULDER_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_LOBBY_BOULDER_2] = Location::Boulder(RC_DODONGOS_CAVERN_MQ_LOBBY_BOULDER_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(432, -1719), "Dodongo's MQ Lobby Boulder 2", RHT_DODONGOS_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LOBBY_BOULDER_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_MOUTH_SIDE_BRIDGE_BOULDER_1] = Location::Boulder(RC_DODONGOS_CAVERN_MQ_MOUTH_SIDE_BRIDGE_BOULDER_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(807, -874), "Dodongo's MQ Mouth Bridge Boulder 1", RHT_DODONGOS_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_MOUTH_SIDE_BRIDGE_BOULDER_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_MOUTH_SIDE_BRIDGE_BOULDER_2] = Location::Boulder(RC_DODONGOS_CAVERN_MQ_MOUTH_SIDE_BRIDGE_BOULDER_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(802, -972), "Dodongo's MQ Mouth Bridge Boulder 2", RHT_DODONGOS_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_MOUTH_SIDE_BRIDGE_BOULDER_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_MOUTH_SIDE_BRIDGE_BOULDER_3] = Location::Boulder(RC_DODONGOS_CAVERN_MQ_MOUTH_SIDE_BRIDGE_BOULDER_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(783, -923), "Dodongo's MQ Mouth Bridge Boulder 3", RHT_DODONGOS_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_MOUTH_SIDE_BRIDGE_BOULDER_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_BOULDER_1] = Location::Boulder(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_BOULDER_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2464, -402), "Dodongo's MQ Right Side Boulder 1", RHT_DODONGOS_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_BOULDER_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_BOULDER_2] = Location::Boulder(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_BOULDER_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2942, -495), "Dodongo's MQ Right Side Boulder 2", RHT_DODONGOS_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_BOULDER_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_1] = Location::Boulder(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(4219, -1651), "Dodongo's MQ Lizalfos Room Boulder 1", RHT_DODONGOS_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_2] = Location::Boulder(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(4178, -1602), "Dodongo's MQ Lizalfos Room Boulder 2", RHT_DODONGOS_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_3] = Location::Boulder(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(4162, -1581), "Dodongo's MQ Lizalfos Room Boulder 3", RHT_DODONGOS_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_4] = Location::Boulder(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(4133, -1561), "Dodongo's MQ Lizalfos Room Boulder 4", RHT_DODONGOS_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_5] = Location::Boulder(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_5, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(4091, -1510), "Dodongo's MQ Lizalfos Room Boulder 5", RHT_DODONGOS_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_5)); + locationTable[RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_6] = Location::Boulder(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_6, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(4067, -1487), "Dodongo's MQ Lizalfos Room Boulder 6", RHT_DODONGOS_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_6)); + locationTable[RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_7] = Location::Boulder(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_7, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(4028, -1472), "Dodongo's MQ Lizalfos Room Boulder 7", RHT_DODONGOS_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_7)); + locationTable[RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_8] = Location::Boulder(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_8, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3965, -1473), "Dodongo's MQ Lizalfos Room Boulder 8", RHT_DODONGOS_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_8)); + locationTable[RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_9] = Location::Boulder(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_9, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3898, -1467), "Dodongo's MQ Lizalfos Room Boulder 9", RHT_DODONGOS_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_9)); + locationTable[RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_10] = Location::Boulder(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_10, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3832, -1437), "Dodongo's MQ Lizalfos Room Boulder 10", RHT_DODONGOS_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_10)); + locationTable[RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_11] = Location::Boulder(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_11, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3799, -1383), "Dodongo's MQ Lizalfos Room Boulder 11", RHT_DODONGOS_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_11)); + locationTable[RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_12] = Location::Boulder(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_12, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3760, -1318), "Dodongo's MQ Lizalfos Room Boulder 12", RHT_DODONGOS_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_12)); + locationTable[RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_BOULDER] = Location::Boulder(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_BOULDER, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2737, -1058), "Dodongo's MQ Two Flames Boulder", RHT_DODONGOS_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_BOULDER)); + + locationTable[RC_JABU_JABUS_BELLY_MQ_ENTRANCE_BOULDER] = Location::Boulder(RC_JABU_JABUS_BELLY_MQ_ENTRANCE_BOULDER, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1, -296), "Jabu MQ Entrance Boulder", RHT_JABU_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_BOULDER)); + locationTable[RC_JABU_JABUS_BELLY_MQ_HOLES_ROOM_BOULDER_1] = Location::Boulder(RC_JABU_JABUS_BELLY_MQ_HOLES_ROOM_BOULDER_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(350, -3533), "Jabu MQ Holes Room Boulder 1", RHT_JABU_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_HOLES_ROOM_BOULDER_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_HOLES_ROOM_BOULDER_2] = Location::Boulder(RC_JABU_JABUS_BELLY_MQ_HOLES_ROOM_BOULDER_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-192, -3211), "Jabu MQ Holes Room Boulder 2", RHT_JABU_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_HOLES_ROOM_BOULDER_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_HOLES_ROOM_WALL_BOULDER_1] = Location::Boulder(RC_JABU_JABUS_BELLY_MQ_HOLES_ROOM_WALL_BOULDER_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(245, -2792), "Jabu MQ Holes Wall Boulder 1", RHT_JABU_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_HOLES_ROOM_WALL_BOULDER_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_HOLES_ROOM_WALL_BOULDER_2] = Location::Boulder(RC_JABU_JABUS_BELLY_MQ_HOLES_ROOM_WALL_BOULDER_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(220, -2790), "Jabu MQ Holes Wall Boulder 2", RHT_JABU_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_HOLES_ROOM_WALL_BOULDER_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_HOLES_ROOM_WALL_BOULDER_3] = Location::Boulder(RC_JABU_JABUS_BELLY_MQ_HOLES_ROOM_WALL_BOULDER_3, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(274, -2790), "Jabu MQ Holes Wall Boulder 3", RHT_JABU_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_HOLES_ROOM_WALL_BOULDER_3)); + locationTable[RC_JABU_JABUS_BELLY_MQ_FORKED_CORRIDOR_BOULDER_1] = Location::Boulder(RC_JABU_JABUS_BELLY_MQ_FORKED_CORRIDOR_BOULDER_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(31, -5177), "Jabu MQ Forked Corridor Boulder 1", RHT_JABU_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_FORKED_CORRIDOR_BOULDER_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_FORKED_CORRIDOR_BOULDER_2] = Location::Boulder(RC_JABU_JABUS_BELLY_MQ_FORKED_CORRIDOR_BOULDER_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-37, -5173), "Jabu MQ Forked Corridor Boulder 2", RHT_JABU_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_FORKED_CORRIDOR_BOULDER_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_TAILPASARAN_BOULDER] = Location::Boulder(RC_JABU_JABUS_BELLY_MQ_TAILPASARAN_BOULDER, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-885, -5907), "Jabu MQ Tailpasaran Boulder", RHT_JABU_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_TAILPASARAN_BOULDER)); + locationTable[RC_JABU_JABUS_BELLY_MQ_TAILPASARAN_WALL_BOULDER] = Location::Boulder(RC_JABU_JABUS_BELLY_MQ_TAILPASARAN_WALL_BOULDER, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-411, -5682), "Jabu MQ Tailpasaran Wall Boulder", RHT_JABU_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_TAILPASARAN_WALL_BOULDER)); + + // skip spirit temple boulder, so adult can clear without collecting check for child to pass + locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BOULDER_1] = Location::Boulder(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BOULDER_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-160, 270), "Spirit MQ Entrance Boulder 1", RHT_SPIRIT_TEMPLE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_BOULDER_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BOULDER_2] = Location::Boulder(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BOULDER_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(160, 270), "Spirit MQ Entrance Boulder 2", RHT_SPIRIT_TEMPLE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_BOULDER_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_EYE_BOULDER] = Location::Boulder(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_EYE_BOULDER, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(350, 220), "Spirit MQ Entrance Eye Boulder", RHT_SPIRIT_TEMPLE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_EYE_BOULDER)); + locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_CEILING_BOULDER] = Location::Boulder(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_CEILING_BOULDER, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(0, -60), "Spirit MQ Entrance Ceiling Boulder", RHT_SPIRIT_TEMPLE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_CEILING_BOULDER)); + locationTable[RC_SPIRIT_TEMPLE_MQ_CRAWLSPACE_BOULDER] = Location::Boulder(RC_SPIRIT_TEMPLE_MQ_CRAWLSPACE_BOULDER, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1060, -680), "Spirit MQ Crawlspace Boulder", RHT_SPIRIT_TEMPLE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CRAWLSPACE_BOULDER)); + locationTable[RC_SPIRIT_TEMPLE_MQ_GIBDO_BOULDER] = Location::Boulder(RC_SPIRIT_TEMPLE_MQ_GIBDO_BOULDER, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-593, -1340), "Spirit MQ Gibdo Boulder", RHT_SPIRIT_TEMPLE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_GIBDO_BOULDER)); + locationTable[RC_SPIRIT_TEMPLE_MQ_GIBDO_BOULDER_LOW] = Location::Boulder(RC_SPIRIT_TEMPLE_MQ_GIBDO_BOULDER_LOW, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-421, -1036), "Spirit MQ Gibdo Low Boulder", RHT_SPIRIT_TEMPLE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_GIBDO_BOULDER_LOW)); + locationTable[RC_SPIRIT_TEMPLE_MQ_GIBDO_BOULDER_HIGH] = Location::Boulder(RC_SPIRIT_TEMPLE_MQ_GIBDO_BOULDER_HIGH, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-786, -930), "Spirit MQ Gibdo High Boulder", RHT_SPIRIT_TEMPLE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_GIBDO_BOULDER_HIGH)); + locationTable[RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_BOULDER] = Location::Boulder(RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_BOULDER, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(1070, -290), "Spirit MQ Early Adult Boulder", RHT_SPIRIT_TEMPLE_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_BOULDER)); + + locationTable[RC_BOTW_MQ_BOULDER_1] = Location::Boulder(RC_BOTW_MQ_BOULDER_1, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-370, -160), "BotW MQ Boulder 1", RHT_BOTW_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTW_MQ_BOULDER_1)); + locationTable[RC_BOTW_MQ_BOULDER_2] = Location::Boulder(RC_BOTW_MQ_BOULDER_2, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-521, -353), "BotW MQ Boulder 2", RHT_BOTW_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTW_MQ_BOULDER_2)); + locationTable[RC_BOTW_MQ_BOULDER_3] = Location::Boulder(RC_BOTW_MQ_BOULDER_3, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-541, -404), "BotW MQ Boulder 3", RHT_BOTW_BOULDER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTW_MQ_BOULDER_3)); + // clang-format-on +} + +static RegisterShipInitFunc initFunc(RegisterShuffleRock, { "IS_RANDO" }); +static RegisterShipInitFunc initFunc2(Rando::StaticData::RegisterRockLocations); \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/ShuffleRocks.h b/soh/soh/Enhancements/randomizer/ShuffleRocks.h new file mode 100644 index 0000000000..9784af34bb --- /dev/null +++ b/soh/soh/Enhancements/randomizer/ShuffleRocks.h @@ -0,0 +1,15 @@ +#ifndef SHUFFLEROCKS_H +#define SHUFFLEROCKS_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +void EnIshi_RandomizerInit(void* actorRef); +#ifdef __cplusplus +}; +#endif + +#endif // SHUFFLEROCKS_H diff --git a/soh/soh/Enhancements/randomizer/ShuffleSigns.cpp b/soh/soh/Enhancements/randomizer/ShuffleSigns.cpp index 6d883228a2..ad8895d76d 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleSigns.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleSigns.cpp @@ -32,13 +32,10 @@ uint8_t Sign_RandomizerHoldsItem(Actor* actor, PlayState* play) { static void Sign_RandomizerDraw(Actor* actor, Color_RGBA8* primColor, Color_RGBA8* secColor, Color_RGBA8* envColor) { Vec3f pos; - static Vec3f velocity = { 0.0f, 0.0f, 0.0f }; - static Vec3f accel = { 0.0f, 0.0f, 0.0f }; + Vec3f velocity = { 0.0f, -0.05f, 0.0f }; + Vec3f accel = { 0.0f, -0.025f, 0.0f }; float yKanbanOffset = LINK_IS_CHILD && actor->id == ACTOR_EN_KANBAN ? 15.0f : 0.0f; - velocity.y = -0.05f; - accel.y = -0.025f; - pos.x = Rand_CenteredFloat(10.0f) + actor->world.pos.x; pos.y = (Rand_ZeroOne() * 10.0f) + actor->world.pos.y + yKanbanOffset; pos.z = Rand_CenteredFloat(10.0f) + actor->world.pos.z; @@ -47,7 +44,6 @@ static void Sign_RandomizerDraw(Actor* actor, Color_RGBA8* primColor, Color_RGBA } void Sign_RandomizerDrawSetup(void* actor) { - GetItemCategory getItemCategory; Actor* signActor = (Actor*)actor; // If not a randomized item or too far, don't draw @@ -60,10 +56,6 @@ void Sign_RandomizerDrawSetup(void* actor) { int isNotCMC = !cmc || (requiresStoneAgony && !CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)); - Color_RGBA8 primColor; - Color_RGBA8 secColor; - Color_RGBA8 envColor; - const auto signIdentity = ObjectExtension::GetInstance().Get(signActor); if (signIdentity == nullptr) { return; @@ -71,14 +63,11 @@ void Sign_RandomizerDrawSetup(void* actor) { GetItemEntry signItem = Rando::Context::GetInstance()->GetFinalGIEntry(signIdentity->randomizerCheck, true, GI_NONE); - getItemCategory = Randomizer_AdjustItemCategory(signItem); + GetItemCategory getItemCategory = isNotCMC ? ITEM_CATEGORY_MAJOR : Randomizer_AdjustItemCategory(signItem); - if (isNotCMC) { - getItemCategory = ITEM_CATEGORY_MAJOR; - } - primColor = Randomizer_GetParticleCMCColor(getItemCategory, COLOR_PRIMARY); - secColor = Randomizer_GetParticleCMCColor(getItemCategory, COLOR_SECONDARY); - envColor = Randomizer_GetParticleCMCColor(getItemCategory, COLOR_FLARE); + Color_RGBA8 primColor = Randomizer_GetParticleCMCColor(getItemCategory, COLOR_PRIMARY); + Color_RGBA8 secColor = Randomizer_GetParticleCMCColor(getItemCategory, COLOR_SECONDARY); + Color_RGBA8 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 index b0fddc5026..bd5a75c0f9 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleWonderItems.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleWonderItems.cpp @@ -128,11 +128,8 @@ uint8_t EnWonderItem_RandomizerHoldsItem(EnWonderItem* wonderActor, PlayState* p 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; + Vec3f velocity = { 0.0f, -0.05f, 0.0f }; + Vec3f accel = { 0.0f, -0.025f, 0.0f }; // Draw particles at tag spots if applicable, otherwise at wonder item actor location if (wonderActor->wonderMode == WONDERITEM_MULTITAG_ORDERED) { @@ -166,7 +163,6 @@ static void EnWonderItem_RandomizerDraw(EnWonderItem* wonderActor, Color_RGBA8* } void EnWonderItem_RandomizerDrawSetup(void* refActor) { - GetItemCategory getItemCategory; EnWonderItem* wonderActor = static_cast(refActor); // If not a randomized item or too far, don't draw. @@ -185,10 +181,6 @@ void EnWonderItem_RandomizerDrawSetup(void* refActor) { 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; @@ -196,14 +188,11 @@ void EnWonderItem_RandomizerDrawSetup(void* refActor) { GetItemEntry wonderItem = Rando::Context::GetInstance()->GetFinalGIEntry(wonderIdentity->randomizerCheck, true, GI_NONE); - getItemCategory = Randomizer_AdjustItemCategory(wonderItem); + GetItemCategory getItemCategory = isNotCMC ? ITEM_CATEGORY_MAJOR : 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); + Color_RGBA8 primColor = Randomizer_GetParticleCMCColor(getItemCategory, COLOR_PRIMARY); + Color_RGBA8 secColor = Randomizer_GetParticleCMCColor(getItemCategory, COLOR_SECONDARY); + Color_RGBA8 envColor = Randomizer_GetParticleCMCColor(getItemCategory, COLOR_FLARE); EnWonderItem_RandomizerDraw(wonderActor, &primColor, &secColor, &envColor, wonderIdentity); } diff --git a/soh/soh/Enhancements/randomizer/location.cpp b/soh/soh/Enhancements/randomizer/location.cpp index 9f4365e0e0..2a805825c4 100644 --- a/soh/soh/Enhancements/randomizer/location.cpp +++ b/soh/soh/Enhancements/randomizer/location.cpp @@ -562,6 +562,23 @@ Rando::Location Rando::Location::SmallCrate(RandomizerCheck rc, RandomizerCheckQ false, collectionCheck }; } +Rando::Location Rando::Location::Rock(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + SceneID scene_, int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck) { + return { rc, quest_, RCTYPE_ROCK, area_, ACTOR_EN_ISHI, + scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, + false, collectionCheck }; +} + +Rando::Location Rando::Location::Boulder(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + SceneID scene_, int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, SpoilerCollectionCheck collectionCheck) { + return { rc, quest_, RCTYPE_BOULDER, area_, ACTOR_EN_ISHI, + scene_, actorParams_, std::move(shortName_), hintKey, RG_BOMBS_5, + false, collectionCheck }; +} + Rando::Location Rando::Location::Tree(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, int32_t actorParams_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, diff --git a/soh/soh/Enhancements/randomizer/location.h b/soh/soh/Enhancements/randomizer/location.h index c2337b0e3c..9426ebd36c 100644 --- a/soh/soh/Enhancements/randomizer/location.h +++ b/soh/soh/Enhancements/randomizer/location.h @@ -67,15 +67,7 @@ class Location { actorParams(actorParams_), shortName(std::move(shortName_)), spoilerName(std::move(spoilerName_)), hintKey(hintKey_), vanillaItem(vanillaItem_), isVanillaCompletion(isVanillaCompletion_), collectionCheck(collectionCheck_), vanillaPrice(vanillaPrice_) { - if (spoilerName.length() < 23) { - excludedOption = LocationOption(rc, spoilerName); - } else { - const size_t lastSpace = spoilerName.rfind(' ', 23); - std::string settingText = spoilerName; - settingText.replace(lastSpace, 1, "\n "); - - excludedOption = LocationOption(rc, spoilerName); - } + excludedOption = LocationOption(rc, spoilerName); } Location(const RandomizerCheck rc_, const RandomizerCheckQuest quest_, const RandomizerCheckType checkType_, @@ -87,15 +79,7 @@ class Location { actorParams(actorParams_), shortName(shortName_), spoilerName(SpoilerNameFromShortName(shortName_, area_)), hintKey(hintKey_), vanillaItem(vanillaItem_), isVanillaCompletion(isVanillaCompletion_), collectionCheck(collectionCheck_), vanillaPrice(vanillaPrice_) { - if (spoilerName.length() < 23) { - excludedOption = LocationOption(rc, spoilerName); - } else { - const size_t lastSpace = spoilerName.rfind(' ', 23); - std::string settingText = spoilerName; - settingText.replace(lastSpace, 1, "\n "); - - excludedOption = LocationOption(rc, spoilerName); - } + excludedOption = LocationOption(rc, spoilerName); } static std::string SpoilerNameFromShortName(std::string shortName, RandomizerCheckArea area) { @@ -245,6 +229,14 @@ class Location { RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck); + static Location Rock(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, + int32_t actorParams_, std::string&& shortName_, RandomizerHintTextKey hintKey, + RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck); + + static Location Boulder(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, + int32_t actorParams_, std::string&& shortName_, RandomizerHintTextKey hintKey, + SpoilerCollectionCheck collectionCheck); + static Location Tree(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, int32_t actorParams_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck); 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 5d99232280..a802598ea7 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 @@ -203,6 +203,13 @@ void RegionTable_Init_BottomOfTheWell() { LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1, logic->CanCutShrubs()), LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2, logic->CanCutShrubs()), LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_BOTW_BOULDER_1, logic->BlastOrSmash()), + LOCATION(RC_BOTW_BOULDER_2, logic->BlastOrSmash()), + LOCATION(RC_BOTW_BOULDER_3, logic->BlastOrSmash() || logic->CanUse(RG_DINS_FIRE) || (logic->CanUse(RG_STICKS) && ctx->GetTrickOption(RT_BOTW_BASEMENT)) || + (ctx->GetTrickOption(RT_BOULDER_COLLISION) && logic->CanUse(RG_FAIRY_BOW))), + LOCATION(RC_BOTW_BOULDER_4, logic->BlastOrSmash()), + LOCATION(RC_BOTW_BOULDER_5, logic->BlastOrSmash()), + LOCATION(RC_BOTW_BOULDER_6, logic->BlastOrSmash()), }, { //Exits ENTRANCE(RR_BOTW_HIDDEN_POTS, logic->CanClimbHighLadder()), @@ -213,7 +220,15 @@ void RegionTable_Init_BottomOfTheWell() { ENTRANCE(RR_BOTW_B3_CHEST_AREA, AnyAgeTime([]{return logic->BlastOrSmash();})), }); - areaTable[RR_BOTW_B3_BOMB_FLOWERS] = Region("Bottom of the Well B3 Bomb Flowers", SCENE_BOTTOM_OF_THE_WELL, {}, {}, { + areaTable[RR_BOTW_B3_BOMB_FLOWERS] = Region("Bottom of the Well B3 Bomb Flowers", SCENE_BOTTOM_OF_THE_WELL, {}, { + //Locations + LOCATION(RC_BOTW_BOULDER_1, logic->HasItem(RG_GORONS_BRACELET)), + LOCATION(RC_BOTW_BOULDER_2, logic->HasItem(RG_GORONS_BRACELET)), + LOCATION(RC_BOTW_BOULDER_3, logic->CanDetonateUprightBombFlower()), + LOCATION(RC_BOTW_BOULDER_4, logic->HasItem(RG_GORONS_BRACELET)), + LOCATION(RC_BOTW_BOULDER_5, logic->HasItem(RG_GORONS_BRACELET)), + LOCATION(RC_BOTW_BOULDER_6, logic->HasItem(RG_GORONS_BRACELET)), + }, { //Exits ENTRANCE(RR_BOTW_B3_OOZE, logic->CanDetonateUprightBombFlower()), ENTRANCE(RR_BOTW_B3_BLOCKED_GRASS, logic->HasItem(RG_GORONS_BRACELET)), @@ -284,7 +299,10 @@ void RegionTable_Init_BottomOfTheWell() { (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_BOTW_MQ_BOULDER_1, logic->BlastOrSmash()), + LOCATION(RC_BOTW_MQ_BOULDER_2, logic->BlastOrSmash()), + LOCATION(RC_BOTW_MQ_BOULDER_3, logic->BlastOrSmash()), + 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)), @@ -362,7 +380,11 @@ void RegionTable_Init_BottomOfTheWell() { areaTable[RR_BOTW_MQ_PIT_CAGE] = Region("Bottom of the Well MQ Pit Cage", SCENE_BOTTOM_OF_THE_WELL, { //Events EVENT_ACCESS(LOGIC_BOTW_MQ_OPENED_WEST_ROOM, true), - }, {}, { + }, { + //Locations + LOCATION(RC_BOTW_MQ_BOULDER_2, logic->BlastOrSmash()), + LOCATION(RC_BOTW_MQ_BOULDER_3, logic->BlastOrSmash()), + }, { //Exits ENTRANCE(RR_BOTW_MQ_PERIMETER, logic->BlastOrSmash() && (logic->CanPassEnemy(RE_BIG_SKULLTULA) || ctx->GetTrickOption(RT_BOTW_PITS))), ENTRANCE(RR_BOTW_MQ_MIDDLE, (bool)ctx->GetTrickOption(RT_BOTW_PITS)), @@ -379,9 +401,9 @@ void RegionTable_Init_BottomOfTheWell() { areaTable[RR_BOTW_MQ_CRYPT] = Region("Bottom of the Well MQ Crypt", SCENE_BOTTOM_OF_THE_WELL, {}, { //Locations - LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)), - LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW)), - LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_MIDDLE_LEFT_HEART, logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW)), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW)), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_MIDDLE_LEFT_HEART, logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW)), }, { //Exits ENTRANCE(RR_BOTW_MQ_BEHIND_MOAT, logic->SmallKeys(SCENE_BOTTOM_OF_THE_WELL, 2)), 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 0bbeeeb90a..7e7cb56e43 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp @@ -318,16 +318,26 @@ void RegionTable_Init_DekuTree() { LOCATION(RC_DEKU_TREE_MQ_COMPASS_GRASS_2, logic->CanCutShrubs()), LOCATION(RC_DEKU_TREE_MQ_COMPASS_GRASS_3, logic->CanCutShrubs()), LOCATION(RC_DEKU_TREE_MQ_COMPASS_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BOULDER_1, logic->CanUse(RG_BOOMERANG) && + AnyAgeTime([]{return logic->CanUse(RG_BOMBCHU_5) || (logic->CanUse(RG_BOMB_BAG) && (logic->CanUse(RG_SONG_OF_TIME) || logic->IsAdult || logic->CanUse(RG_HOVER_BOOTS)));})), + LOCATION(RC_DEKU_TREE_MQ_BOULDER_2, logic->CanUse(RG_BOOMERANG) && + AnyAgeTime([]{return logic->CanUse(RG_BOMBCHU_5) || (logic->CanUse(RG_BOMB_BAG) && (logic->CanUse(RG_SONG_OF_TIME) || logic->IsAdult || logic->CanUse(RG_HOVER_BOOTS)));})), + LOCATION(RC_DEKU_TREE_MQ_BOULDER_3, logic->CanUse(RG_BOOMERANG) && + AnyAgeTime([]{return logic->CanUse(RG_BOMBCHU_5) || (logic->CanUse(RG_BOMB_BAG) && (logic->CanUse(RG_SONG_OF_TIME) || logic->IsAdult || logic->CanUse(RG_HOVER_BOOTS)));})), }, { //Exits ENTRANCE(RR_DEKU_TREE_MQ_EYE_TARGET_ROOM, true), - ENTRANCE(RR_DEKU_TREE_MQ_PAST_BOULDER_VINES, (logic->HasItem(RG_CLIMB) || logic->CanUse(RG_HOOKSHOT) || (logic->IsAdult && logic->CanUse(RG_SONG_OF_TIME))) && AnyAgeTime([]{return logic->CanUse(RG_BOMBCHU_5) || (logic->CanUse(RG_BOMB_BAG) && (logic->CanUse(RG_SONG_OF_TIME) || logic->IsAdult || logic->CanUse(RG_HOVER_BOOTS))) || (logic->CanUse(RG_MEGATON_HAMMER) && ((logic->IsAdult && logic->CanUse(RG_SONG_OF_TIME)) || (ctx->GetTrickOption(RT_DEKU_MQ_COMPASS_GS) && logic->HasItem(RG_CLIMB))));})), + ENTRANCE(RR_DEKU_TREE_MQ_PAST_BOULDER_VINES, (logic->HasItem(RG_CLIMB) || logic->CanUse(RG_HOOKSHOT) || (logic->IsAdult && logic->CanUse(RG_SONG_OF_TIME))) && + AnyAgeTime([]{return logic->CanUse(RG_BOMBCHU_5) || (logic->CanUse(RG_BOMB_BAG) && (logic->CanUse(RG_SONG_OF_TIME) || logic->IsAdult || logic->CanUse(RG_HOVER_BOOTS))) || (logic->CanUse(RG_MEGATON_HAMMER) && ((logic->IsAdult && logic->CanUse(RG_SONG_OF_TIME)) || (ctx->GetTrickOption(RT_DEKU_MQ_COMPASS_GS) && logic->HasItem(RG_CLIMB))));})), }); areaTable[RR_DEKU_TREE_MQ_PAST_BOULDER_VINES] = Region("Deku Tree MQ Past Boulder Vines", SCENE_DEKU_TREE, {}, { //Locations LOCATION(RC_DEKU_TREE_MQ_GS_PAST_BOULDER_VINES, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG)), LOCATION(RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART, true), + LOCATION(RC_DEKU_TREE_MQ_BOULDER_1, logic->BlastOrSmash()), + LOCATION(RC_DEKU_TREE_MQ_BOULDER_2, logic->BlastOrSmash()), + LOCATION(RC_DEKU_TREE_MQ_BOULDER_3, logic->BlastOrSmash()), }, { //Exits ENTRANCE(RR_DEKU_TREE_MQ_COMPASS_ROOM, logic->BlastOrSmash()), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp index 6410e26278..357a2f9868 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp @@ -292,6 +292,8 @@ void RegionTable_Init_DodongosCavern() { LOCATION(RC_DODONGOS_CAVERN_MQ_MAP_CHEST, (logic->CanBreakMudWalls() || logic->HasItem(RG_GORONS_BRACELET)) && logic->HasItem(RG_OPEN_CHEST)), LOCATION(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, logic->CanStunDeku() && logic->HasItem(RG_SPEAK_DEKU) && GetCheckPrice() <= GetWalletCapacity()), LOCATION(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, logic->CanStunDeku() && logic->HasItem(RG_SPEAK_DEKU) && GetCheckPrice() <= GetWalletCapacity()), + LOCATION(RC_DODONGOS_CAVERN_MQ_LOBBY_BOULDER_1, logic->BlastOrSmash() || logic->HasItem(RG_GORONS_BRACELET)), + LOCATION(RC_DODONGOS_CAVERN_MQ_LOBBY_BOULDER_2, logic->BlastOrSmash() || logic->HasItem(RG_GORONS_BRACELET)), }, { //Exits ENTRANCE(RR_DODONGOS_CAVERN_MQ_BEGINNING, true), @@ -331,7 +333,10 @@ void RegionTable_Init_DodongosCavern() { EVENT_ACCESS(LOGIC_DC_EYES_LIT, logic->HasExplosives() || (logic->Get(LOGIC_DC_MQ_CLEAR_UPPER_LOBBY_ROCKS) && logic->HasItem(RG_GORONS_BRACELET) && ((logic->IsAdult && ctx->GetTrickOption(RT_DC_MQ_ADULT_EYES)) || (logic->IsChild && ctx->GetTrickOption(RT_DC_MQ_CHILD_EYES))))), }, { //Locations - LOCATION(RC_DODONGOS_CAVERN_TOP_FLOOR_PEDESTAL, logic->CanRead()), + LOCATION(RC_DODONGOS_CAVERN_MQ_MOUTH_SIDE_BRIDGE_BOULDER_1, logic->Get(LOGIC_DC_MQ_CLEAR_UPPER_LOBBY_ROCKS)), + LOCATION(RC_DODONGOS_CAVERN_MQ_MOUTH_SIDE_BRIDGE_BOULDER_2, logic->Get(LOGIC_DC_MQ_CLEAR_UPPER_LOBBY_ROCKS)), + LOCATION(RC_DODONGOS_CAVERN_MQ_MOUTH_SIDE_BRIDGE_BOULDER_3, logic->Get(LOGIC_DC_MQ_CLEAR_UPPER_LOBBY_ROCKS)), + LOCATION(RC_DODONGOS_CAVERN_TOP_FLOOR_PEDESTAL, logic->CanRead()), }, { //Exits ENTRANCE(RR_DODONGOS_CAVERN_MQ_LOBBY, true), @@ -456,6 +461,18 @@ void RegionTable_Init_DodongosCavern() { LOCATION(RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3, logic->CanBreakPots()), LOCATION(RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4, logic->CanBreakPots()), LOCATION(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_HEART, logic->BlastOrSmash()), + LOCATION(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_1, logic->BlastOrSmash() && (logic->TakeDamage() || logic->CanUse(RG_GORON_TUNIC) || logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_2, logic->BlastOrSmash() && (logic->TakeDamage() || logic->CanUse(RG_GORON_TUNIC) || logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_3, logic->BlastOrSmash() && (logic->TakeDamage() || logic->CanUse(RG_GORON_TUNIC) || logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_4, logic->BlastOrSmash()), + LOCATION(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_5, logic->BlastOrSmash()), + LOCATION(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_6, logic->BlastOrSmash() && (logic->TakeDamage() || logic->CanUse(RG_GORON_TUNIC) || logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_7, logic->BlastOrSmash() && (logic->TakeDamage() || logic->CanUse(RG_GORON_TUNIC) || logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_8, logic->BlastOrSmash() && (logic->TakeDamage() || logic->CanUse(RG_GORON_TUNIC) || logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_9, logic->BlastOrSmash() && (logic->TakeDamage() || logic->CanUse(RG_GORON_TUNIC) || logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_10, logic->BlastOrSmash() && (logic->TakeDamage() || logic->CanUse(RG_GORON_TUNIC) || logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_11, logic->BlastOrSmash() && (logic->TakeDamage() || logic->CanUse(RG_GORON_TUNIC) || logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_12, logic->BlastOrSmash() && (logic->TakeDamage() || logic->CanUse(RG_GORON_TUNIC) || logic->CanUse(RG_BOOMERANG))), }, { //Exits //Falling down gets you stuck with nothing there, not a useful exit for logic @@ -469,11 +486,12 @@ void RegionTable_Init_DodongosCavern() { LOCATION(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2, logic->CanBreakPots()), LOCATION(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1, logic->CanBreakCrates()), LOCATION(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_BOULDER, logic->BlastOrSmash() || (logic->HasItem(RG_GORONS_BRACELET) && (logic->CanHitSwitch() || ctx->GetTrickOption(RT_DC_SLINGSHOT_SKIP)))), }, { //Exits ENTRANCE(RR_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS, true), //crate platforming skips the puzzle - ENTRANCE(RR_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_UPPER, logic->IsAdult || (AnyAgeTime([]{return logic->BlastOrSmash() || (logic->CanAttack() && logic->HasItem(RG_GORONS_BRACELET));}))), + ENTRANCE(RR_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_UPPER, logic->IsAdult || (AnyAgeTime([]{return logic->BlastOrSmash() || (logic->CanAttack() && logic->HasItem(RG_GORONS_BRACELET));})) || ctx->GetTrickOption(RT_DC_SLINGSHOT_SKIP)), }); areaTable[RR_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_UPPER] = Region("Dodongos Cavern MQ Torch Puzzle Upper", SCENE_DODONGOS_CAVERN, { @@ -495,10 +513,12 @@ void RegionTable_Init_DodongosCavern() { areaTable[RR_DODONGOS_CAVERN_MQ_LOWER_RIGHT_SIDE] = Region("Dodongos Cavern MQ Lower Right Side", SCENE_DODONGOS_CAVERN, {}, { //Locations - LOCATION(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1, logic->CanBreakPots()), - LOCATION(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2, logic->CanBreakPots()), - LOCATION(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3, logic->CanBreakPots()), - LOCATION(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_BOULDER_1, logic->BlastOrSmash() || logic->HasItem(RG_GORONS_BRACELET) || logic->CanUse(RG_DINS_FIRE) || (ctx->GetTrickOption(RT_BOULDER_COLLISION) && logic->CanUse(RG_FAIRY_BOW))), + LOCATION(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_BOULDER_2, logic->CanDetonateBombFlowers() || logic->HasItem(RG_GORONS_BRACELET) || (ctx->GetTrickOption(RT_BLUE_FIRE_MUD_WALLS) && logic->CanUse(RG_BOTTLE_WITH_BLUE_FIRE) && (logic->EffectiveHealth() != 1 || logic->CanUse(RG_NAYRUS_LOVE)))), }, { //Exits ENTRANCE(RR_DODONGOS_CAVERN_MQ_LOBBY, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp index 0cb90d89bf..e3e9005b21 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp @@ -21,7 +21,9 @@ void RegionTable_Init_ForestTemple() { areaTable[RR_FOREST_TEMPLE_TREES] = Region("Forest Temple Trees", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_FIRST_ROOM_CHEST, (logic->HasItem(RG_CLIMB) || logic->CanUse(RG_LONGSHOT)) && logic->HasItem(RG_OPEN_CHEST)), - LOCATION(RC_FOREST_TEMPLE_GS_FIRST_ROOM, (logic->HasItem(RG_CLIMB) || logic->CanUse(RG_LONGSHOT)) && ((logic->IsAdult && logic->CanUse(RG_BOMB_BAG)) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_BOMBCHU_5) || logic->CanUse(RG_DINS_FIRE) || (ctx->GetTrickOption(RT_FOREST_FIRST_GS) && (logic->CanJumpslashExceptHammer() || (logic->IsChild && logic->CanUse(RG_BOMB_BAG)))))), + LOCATION(RC_FOREST_TEMPLE_GS_FIRST_ROOM, (logic->HasItem(RG_CLIMB) || logic->CanUse(RG_LONGSHOT)) && + (logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_BOOMERANG) || ((logic->IsAdult || ctx->GetTrickOption(RT_BOMB_DETONATION)) && logic->CanUse(RG_BOMB_BAG)) || + (ctx->GetTrickOption(RT_FOREST_FIRST_GS) && logic->CanJumpslashExceptHammer()))), }, { //Exits ENTRANCE(RR_FOREST_TEMPLE_ENTRYWAY, 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 ab8a9c4bb1..e9a4abae18 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp @@ -274,6 +274,7 @@ void RegionTable_Init_JabuJabusBelly() { 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)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_ENTRANCE_BOULDER, logic->BlastOrSmash()), }, { //Exits ENTRANCE(RR_JABU_JABUS_BELLY_ENTRYWAY, true), @@ -323,9 +324,14 @@ void RegionTable_Init_JabuJabusBelly() { EVENT_ACCESS(LOGIC_JABU_MQ_FORKED_ROOM_DOOR, (logic->HasExplosives() || ctx->GetTrickOption(RT_BOULDER_COLLISION)) && logic->CanUse(RG_FAIRY_SLINGSHOT)), }, { //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)), + 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)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_HOLES_ROOM_BOULDER_1, logic->BlastOrSmash()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_HOLES_ROOM_BOULDER_2, logic->BlastOrSmash()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_HOLES_ROOM_WALL_BOULDER_1, logic->HasExplosives()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_HOLES_ROOM_WALL_BOULDER_2, logic->HasExplosives()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_HOLES_ROOM_WALL_BOULDER_3, logic->HasExplosives()), }, { //Exits ENTRANCE(RR_JABU_JABUS_BELLY_MQ_LIFT_ROOM, true), @@ -387,7 +393,11 @@ void RegionTable_Init_JabuJabusBelly() { ENTRANCE(RR_JABU_JABUS_BELLY_MQ_LIFT_ROOM, true), }); - areaTable[RR_JABU_JABUS_BELLY_MQ_FORKED_CORRIDOR] = Region("Jabu Jabus Belly MQ Forked Corridor", SCENE_JABU_JABU, {}, {}, { + areaTable[RR_JABU_JABUS_BELLY_MQ_FORKED_CORRIDOR] = Region("Jabu Jabus Belly MQ Forked Corridor", SCENE_JABU_JABU, {}, { + //Locations + LOCATION(RC_JABU_JABUS_BELLY_MQ_FORKED_CORRIDOR_BOULDER_1, logic->BlastOrSmash()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_FORKED_CORRIDOR_BOULDER_2, logic->BlastOrSmash()), + }, { //Exits ENTRANCE(RR_JABU_JABUS_BELLY_MQ_HOLES_ROOM, logic->CanUse(RG_BOOMERANG)), //If some mode lets an age use sticks and not sling, and other use sling and not sticks, this needs changing @@ -422,7 +432,9 @@ void RegionTable_Init_JabuJabusBelly() { areaTable[RR_JABU_JABUS_BELLY_MQ_FORK_NORTH_WEST] = Region("Jabu Jabus Belly MQ Fork North West", SCENE_JABU_JABU, {}, { //Locations - LOCATION(RC_JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, logic->HasExplosives() && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, logic->BlastOrSmash() && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_TAILPASARAN_BOULDER, logic->BlastOrSmash()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_TAILPASARAN_WALL_BOULDER, logic->BlastOrSmash()), }, { //Exits ENTRANCE(RR_JABU_JABUS_BELLY_MQ_TO_FORK_NORTH_WEST, 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 13a5cd4df8..74a2f2173d 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp @@ -567,6 +567,10 @@ void RegionTable_Init_SpiritTemple() { LOCATION(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2, logic->CanBreakPots()), LOCATION(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3, logic->CanBreakPots()), LOCATION(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4, logic->CanBreakPots()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BOULDER_1, logic->BlastOrSmash()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BOULDER_2, logic->BlastOrSmash()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_EYE_BOULDER, logic->BlastOrSmash()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_CEILING_BOULDER, logic->CanUse(RG_BOMBCHU_5)), LOCATION(RC_SPIRIT_TEMPLE_LEFT_SNAKE_STATUE, logic->CanRead()), LOCATION(RC_SPIRIT_TEMPLE_RIGHT_SNAKE_STATUE, logic->CanRead()), }, { @@ -579,7 +583,6 @@ void RegionTable_Init_SpiritTemple() { areaTable[RR_SPIRIT_TEMPLE_MQ_CHILD_SIDE_HUB] = Region("Spirit Temple MQ Child Side Hub", SCENE_SPIRIT_TEMPLE, { //Events - //not technically a rusted switch, but a boulder through a wall, but is part of the same trick on N64 EVENT_ACCESS(LOGIC_SPIRIT_MQ_CRAWL_BOULDER, logic->CanUse(RG_BOMBCHU_5) || (ctx->GetTrickOption(RT_VISIBLE_COLLISION) && logic->CanUse(RG_MEGATON_HAMMER))), }, { //Locations @@ -589,9 +592,9 @@ void RegionTable_Init_SpiritTemple() { (ctx->GetTrickOption(RT_FIRE_RINGS) && ctx->GetTrickOption(RT_VISIBLE_COLLISION) && logic->TakeDamage() && logic->CanJumpslash())), LOCATION(RC_SPIRIT_TEMPLE_MQ_CHILD_RIGHT_HEART, logic->CanHitEyeTargets() || logic->CanUse(RG_BOOMERANG) || (ctx->GetTrickOption(RT_FIRE_RINGS) && ctx->GetTrickOption(RT_VISIBLE_COLLISION) && logic->TakeDamage() && logic->CanJumpslash())), + LOCATION(RC_SPIRIT_TEMPLE_MQ_CRAWLSPACE_BOULDER, logic->Get(LOGIC_SPIRIT_MQ_CRAWL_BOULDER) && logic->CanUse(RG_CRAWL)), }, { //Exits - //Nabooru's legs are technically visible one way collision here, but I'm not sure if this counts ENTRANCE(RR_SPIRIT_TEMPLE_MQ_FOYER, logic->CanUse(RG_CRAWL)), ENTRANCE(RR_SPIRIT_TEMPLE_MQ_GIBDO_GRAVES, AnyAgeTime([]{return logic->CanKillEnemy(RE_TORCH_SLUG);})), ENTRANCE(RR_SPIRIT_TEMPLE_MQ_ANUBIS_BRIDGE_CHEST, AnyAgeTime([]{return logic->CanKillEnemy(RE_TORCH_SLUG);})), @@ -603,7 +606,11 @@ void RegionTable_Init_SpiritTemple() { EVENT_ACCESS(LOGIC_SPIRIT_MQ_GIBDOS_CLEARED, logic->HasItem(RG_POWER_BRACELET) && ((logic->CanUse(RG_BOMBCHU_5) && logic->CanHitEyeTargets()) || logic->CanUse(RG_HOVER_BOOTS)/* || (IsAdult && CanBunnyJump())*/) && logic->CanKillEnemy(RE_GIBDO, ED_CLOSE, true, 3)), - }, {}, { + }, { + //Location + LOCATION(RC_SPIRIT_TEMPLE_MQ_GIBDO_BOULDER_HIGH, logic->BlastOrSmash()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_GIBDO_BOULDER_LOW, logic->BlastOrSmash()), + }, { //Exits ENTRANCE(RR_SPIRIT_TEMPLE_MQ_CHILD_SIDE_HUB, true), ENTRANCE(RR_SPIRIT_TEMPLE_MQ_GIBDO_POTS, logic->HasItem(RG_POWER_BRACELET) && @@ -615,6 +622,7 @@ void RegionTable_Init_SpiritTemple() { //Locations LOCATION(RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1, logic->CanBreakPots()), LOCATION(RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2, logic->CanBreakPots()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_GIBDO_BOULDER, logic->BlastOrSmash()), }, { //Exits ENTRANCE(RR_SPIRIT_TEMPLE_MQ_TURNTABLE, logic->Get(LOGIC_SPIRIT_MQ_GIBDOS_CLEARED)), @@ -916,8 +924,9 @@ void RegionTable_Init_SpiritTemple() { EVENT_ACCESS(LOGIC_SPIRIT_1F_SILVER_RUPEES, logic->CanUse(RG_MEGATON_HAMMER)), }, { //Locations - LOCATION(RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1, logic->CanBreakPots()), - LOCATION(RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2, logic->CanBreakPots()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1, logic->CanBreakPots()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2, logic->CanBreakPots()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_BOULDER, logic->BlastOrSmash()), }, { //Exits ENTRANCE(RR_SPIRIT_TEMPLE_MQ_FOYER, logic->CanUse(RG_MEGATON_HAMMER) || (ctx->GetTrickOption(RT_HOVER_BOOST_SIMPLE) && logic->CanUse(RG_HOVER_BOOTS) && logic->CanStandingShield() && (logic->CanUseSword() || logic->CanUse(RG_STICKS)))), 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 79d8907199..d1c293b79b 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp @@ -28,6 +28,9 @@ void RegionTable_Init_CastleGrounds() { }, { //Locations LOCATION(RC_HC_MALON_EGG, logic->HasItem(RG_SPEAK_HYLIAN)), + LOCATION(RC_HC_ROCK_1, logic->CanBreakRocks()), + LOCATION(RC_HC_ROCK_2, logic->CanBreakRocks()), + LOCATION(RC_HC_ROCK_3, logic->CanBreakRocks()), LOCATION(RC_HC_GS_TREE, logic->CanBonkTrees() && logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_CLOSE)), LOCATION(RC_HC_SKULLTULA_TREE, logic->CanBonkTrees()), }, { @@ -56,6 +59,7 @@ void RegionTable_Init_CastleGrounds() { EVENT_ACCESS(LOGIC_FAIRY_ACCESS, logic->CanUse(RG_STICKS)), }, { //Locations + LOCATION(RC_HC_BOULDER, logic->BlastOrSmash()), LOCATION(RC_HC_NEAR_GUARDS_TREE_1, logic->CanBonkTrees()), LOCATION(RC_HC_NEAR_GUARDS_TREE_2, logic->CanBonkTrees()), LOCATION(RC_HC_NEAR_GUARDS_TREE_3, logic->CanBonkTrees()), @@ -68,7 +72,7 @@ void RegionTable_Init_CastleGrounds() { LOCATION(RC_HC_NEAR_STAIRS_BUTTERFLY_FAIRY, logic->CanUse(RG_STICKS)), LOCATION(RC_HC_NEAR_BOULDER_PATH_BUTTERFLY_FAIRY, logic->CanUse(RG_STICKS)), LOCATION(RC_HC_NEAR_ARCHWAY_BUTTERFLY_FAIRY, logic->CanUse(RG_STICKS)), - LOCATION(RC_HC_DEAD_END_RECTANGLE_SIGN, logic->CanRead()), + LOCATION(RC_HC_DEAD_END_RECTANGLE_SIGN, logic->CanRead()), }, { //Exits ENTRANCE(RR_HC_GATE, true), @@ -165,6 +169,14 @@ void RegionTable_Init_CastleGrounds() { LOCATION(RC_HC_STORMS_GROTTO_POT_2, logic->CanBreakPots()), LOCATION(RC_HC_STORMS_GROTTO_POT_3, logic->CanBreakPots()), LOCATION(RC_HC_STORMS_GROTTO_POT_4, logic->CanBreakPots()), + LOCATION(RC_HC_STORMS_GROTTO_ROCK_1, logic->CanBreakRocks()), + LOCATION(RC_HC_STORMS_GROTTO_ROCK_2, logic->CanBreakRocks()), + LOCATION(RC_HC_STORMS_GROTTO_ROCK_3, logic->CanBreakRocks()), + LOCATION(RC_HC_STORMS_GROTTO_ROCK_4, logic->CanBreakRocks()), + LOCATION(RC_HC_STORMS_GROTTO_ROCK_5, logic->CanBreakRocks()), + LOCATION(RC_HC_STORMS_GROTTO_ROCK_6, logic->CanBreakRocks()), + LOCATION(RC_HC_STORMS_GROTTO_ROCK_7, logic->CanBreakRocks()), + LOCATION(RC_HC_STORMS_GROTTO_ROCK_8, logic->CanBreakRocks()), }, { //Exits ENTRANCE(RR_HC_STORMS_GROTTO, true), @@ -180,7 +192,14 @@ void RegionTable_Init_CastleGrounds() { EVENT_ACCESS(LOGIC_BUILD_RAINBOW_BRIDGE, logic->CanBuildRainbowBridge()), }, { //Locations - LOCATION(RC_OGC_GS, logic->HookshotOrBoomerang() || ((logic->CanJumpslashExceptHammer() || logic->CanUseProjectile() || (logic->CanShield() && logic->CanUse(RG_MEGATON_HAMMER)) || logic->CanUse(RG_DINS_FIRE)) && ctx->GetTrickOption(RT_VOIDOUT_COLLECTION))) , + LOCATION(RC_OGC_GS, logic->HookshotOrBoomerang() || ((logic->CanJumpslashExceptHammer() || logic->CanUseProjectile() || (logic->CanShield() && logic->CanUse(RG_MEGATON_HAMMER)) || logic->CanUse(RG_DINS_FIRE)) && ctx->GetTrickOption(RT_VOIDOUT_COLLECTION))) , + LOCATION(RC_OGC_BRONZE_BOULDER_1, logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_OGC_BRONZE_BOULDER_2, logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_OGC_BRONZE_BOULDER_3, logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_OGC_SILVER_BOULDER_1, logic->CanUse(RG_SILVER_GAUNTLETS)), + LOCATION(RC_OGC_SILVER_BOULDER_2, logic->CanUse(RG_SILVER_GAUNTLETS)), + LOCATION(RC_OGC_SILVER_BOULDER_3, logic->CanUse(RG_SILVER_GAUNTLETS)), + LOCATION(RC_OGC_SILVER_BOULDER_4, logic->CanUse(RG_SILVER_GAUNTLETS)), }, { //Exits ENTRANCE(RR_CASTLE_GROUNDS, logic->AtNight), 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 cce98c921f..5d97da1d97 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 @@ -248,7 +248,22 @@ void RegionTable_Init_DeathMountainCrater() { ENTRANCE(RR_DEATH_MOUNTAIN_SUMMIT, true), }); - areaTable[RR_DMC_ROCK_GROTTO] = Region("DMC Rock Grotto", SCENE_DEATH_MOUNTAIN_CRATER, {}, {}, { + areaTable[RR_DMC_ROCK_GROTTO] = Region("DMC Rock Grotto", SCENE_DEATH_MOUNTAIN_CRATER, {}, { + //Locations + LOCATION(RC_DMC_CIRCLE_ROCK_1, logic->FireTimer() >= 8 && logic->CanBreakRocks()), + LOCATION(RC_DMC_CIRCLE_ROCK_2, logic->FireTimer() >= 8 && logic->CanBreakRocks()), + LOCATION(RC_DMC_CIRCLE_ROCK_3, logic->FireTimer() >= 8 && logic->CanBreakRocks()), + LOCATION(RC_DMC_CIRCLE_ROCK_4, logic->FireTimer() >= 8 && logic->CanBreakRocks()), + LOCATION(RC_DMC_CIRCLE_ROCK_5, logic->FireTimer() >= 8 && logic->CanBreakRocks()), + LOCATION(RC_DMC_CIRCLE_ROCK_6, logic->FireTimer() >= 8 && logic->CanBreakRocks()), + LOCATION(RC_DMC_CIRCLE_ROCK_7, logic->FireTimer() >= 8 && logic->CanBreakRocks()), + LOCATION(RC_DMC_CIRCLE_ROCK_8, logic->FireTimer() >= 8 && logic->CanBreakRocks()), + //Boulders 1 and 2 are a bit separate, but are in 8 seconds from upper entry and closeer or the same distance + //from all ways to reach upper grotto otherwise, so it works + LOCATION(RC_DMC_BOULDER_1, logic->FireTimer() >= 8 && logic->BlastOrSmash()), + LOCATION(RC_DMC_BOULDER_2, logic->FireTimer() >= 8 && logic->BlastOrSmash()), + LOCATION(RC_DMC_BOULDER_3, logic->FireTimer() >= 8 && logic->BlastOrSmash()), + }, { //Exits ENTRANCE(RR_DMC_UPPER_GROTTO, AnyAgeTime([]{return logic->BlastOrSmash();})), }); @@ -260,7 +275,9 @@ void RegionTable_Init_DeathMountainCrater() { //Locations LOCATION(RC_DMC_GOSSIP_STONE_FAIRY, logic->CallGossipFairyExceptSuns() && logic->HasExplosives()), LOCATION(RC_DMC_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS) && logic->HasExplosives()), - LOCATION(RC_DMC_GOSSIP_STONE, true && logic->HasExplosives()), + LOCATION(RC_DMC_GOSSIP_ROCK_1, logic->IsChild), + LOCATION(RC_DMC_GOSSIP_ROCK_2, logic->IsChild), + LOCATION(RC_DMC_GOSSIP_STONE, logic->HasExplosives()), }, {}); areaTable[RR_DMC_SCRUB] = Region("DMC Scrub", SCENE_DEATH_MOUNTAIN_CRATER, { @@ -282,11 +299,15 @@ void RegionTable_Init_DeathMountainCrater() { areaTable[RR_DMC_POTS] = Region("DMC Pots", SCENE_DEATH_MOUNTAIN_CRATER, {}, { // Locations - LOCATION(RC_DMC_NEAR_GC_POT_1, logic->CanBreakPots()), - LOCATION(RC_DMC_NEAR_GC_POT_2, logic->CanBreakPots()), - LOCATION(RC_DMC_NEAR_GC_POT_3, logic->CanBreakPots()), - LOCATION(RC_DMC_NEAR_GC_POT_4, logic->CanBreakPots()), - LOCATION(RC_DMC_BRIDGE_EXIT_ARROW_SIGN, logic->CanRead()), + LOCATION(RC_DMC_NEAR_GC_POT_1, logic->CanBreakPots()), + LOCATION(RC_DMC_NEAR_GC_POT_2, logic->CanBreakPots()), + LOCATION(RC_DMC_NEAR_GC_POT_3, logic->CanBreakPots()), + LOCATION(RC_DMC_NEAR_GC_POT_4, logic->CanBreakPots()), + LOCATION(RC_DMC_BRONZE_BOULDER_1, logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_DMC_BRONZE_BOULDER_2, logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_DMC_BRONZE_BOULDER_3, logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_DMC_BRONZE_BOULDER_SHORTCUT, logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_DMC_BRIDGE_EXIT_ARROW_SIGN, logic->CanRead()), }, { //Exits ENTRANCE(RR_GC_DARUNIAS_CHAMBER, true), @@ -316,9 +337,13 @@ void RegionTable_Init_DeathMountainCrater() { 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_DMC_ROCK_BY_FIRE_TEMPLE_1, logic->IsAdult), + LOCATION(RC_DMC_ROCK_BY_FIRE_TEMPLE_2, logic->IsAdult), + LOCATION(RC_DMC_ROCK_BY_FIRE_TEMPLE_3, logic->IsAdult), + LOCATION(RC_DMC_ROCK_BY_FIRE_TEMPLE_4, logic->IsAdult), + LOCATION(RC_DMC_ROCK_BY_FIRE_TEMPLE_5, logic->IsAdult), // 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/death_mountain_trail.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_trail.cpp index 7e5200f12a..a3492535d8 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_trail.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_trail.cpp @@ -10,20 +10,44 @@ void RegionTable_Init_DeathMountainTrail() { EVENT_ACCESS(LOGIC_FAIRY_ACCESS, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->HasItem(RG_DEATH_MOUNTAIN_TRAIL_BEAN_SOUL) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->HasExplosives() || logic->HasItem(RG_GORONS_BRACELET))), }, { //Locations - LOCATION(RC_DMT_CHEST, (logic->BlastOrSmash() || (ctx->GetTrickOption(RT_DMT_BOMBABLE) && logic->IsChild && logic->HasItem(RG_GORONS_BRACELET))) && logic->HasItem(RG_OPEN_CHEST)), - LOCATION(RC_DMT_FREESTANDING_POH, logic->TakeDamage() || logic->CanUse(RG_HOVER_BOOTS) || (logic->IsAdult && CanPlantBean(RR_DEATH_MOUNTAIN_TRAIL, RG_DEATH_MOUNTAIN_TRAIL_BEAN_SOUL) && (logic->HasExplosives() || logic->HasItem(RG_GORONS_BRACELET)))), - LOCATION(RC_DMT_GS_BEAN_PATCH, logic->CanSpawnSoilSkull(RG_DEATH_MOUNTAIN_TRAIL_BEAN_SOUL) && (logic->HasExplosives() || logic->HasItem(RG_GORONS_BRACELET) || (ctx->GetTrickOption(RT_DMT_SOIL_GS) && (logic->TakeDamage() || logic->CanUse(RG_HOVER_BOOTS)) && logic->CanUse(RG_BOOMERANG)))), - LOCATION(RC_DMT_GS_NEAR_KAK, logic->BlastOrSmash() && (logic->HasItem(RG_CLIMB) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_BOOMERANG))), - LOCATION(RC_DMT_GS_ABOVE_DODONGOS_CAVERN, logic->IsAdult && logic->CanGetNightTimeGS() && - ((logic->CanUse(RG_MEGATON_HAMMER) || (ctx->GetTrickOption(RT_ITEM_EXTENSION) && logic->CanUse(RG_HOOKSHOT)) || (ctx->GetTrickOption(RT_BOULDER_COLLISION) && logic->CanUse(RG_LONGSHOT)) || (ctx->GetTrickOption(RT_DMT_JS_LOWER_GS) && logic->CanJumpslash())) || - ((ctx->GetTrickOption(RT_DMT_BEAN_LOWER_GS) && CanPlantBean(RR_DEATH_MOUNTAIN_TRAIL, RG_DEATH_MOUNTAIN_TRAIL_BEAN_SOUL)) || (ctx->GetTrickOption(RT_DMT_HOVERS_LOWER_GS) && logic->CanUse(RG_HOVER_BOOTS)) && - (logic->HasExplosives() || logic->CanUse(RG_DINS_FIRE) || ((ctx->GetTrickOption(RT_BOULDER_COLLISION) || ctx->GetTrickOption(RT_ITEM_EXTENSION)) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT))) || logic->CanJumpslash())))), - LOCATION(RC_DMT_BLUE_RUPEE, logic->IsChild && logic->BlastOrSmash()), - LOCATION(RC_DMT_RED_RUPEE, logic->IsChild && logic->BlastOrSmash()), - LOCATION(RC_DMT_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->HasItem(RG_DEATH_MOUNTAIN_TRAIL_BEAN_SOUL) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->HasExplosives() || logic->HasItem(RG_GORONS_BRACELET))), - LOCATION(RC_DMT_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->HasItem(RG_DEATH_MOUNTAIN_TRAIL_BEAN_SOUL) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->HasExplosives() || logic->HasItem(RG_GORONS_BRACELET))), - LOCATION(RC_DMT_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->HasItem(RG_DEATH_MOUNTAIN_TRAIL_BEAN_SOUL) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->HasExplosives() || logic->HasItem(RG_GORONS_BRACELET))), - LOCATION(RC_DMT_FLAG_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), + LOCATION(RC_DMT_CHEST, (logic->BlastOrSmash() || (ctx->GetTrickOption(RT_DMT_BOMBABLE) && logic->IsChild && logic->HasItem(RG_GORONS_BRACELET))) && logic->HasItem(RG_OPEN_CHEST)), + LOCATION(RC_DMT_FREESTANDING_POH, logic->TakeDamage() || logic->CanUse(RG_HOVER_BOOTS) || (logic->IsAdult && CanPlantBean(RR_DEATH_MOUNTAIN_TRAIL, RG_DEATH_MOUNTAIN_TRAIL_BEAN_SOUL) && (logic->HasExplosives() || logic->HasItem(RG_GORONS_BRACELET)))), + LOCATION(RC_DMT_GS_BEAN_PATCH, logic->CanSpawnSoilSkull(RG_DEATH_MOUNTAIN_TRAIL_BEAN_SOUL) && (logic->HasExplosives() || logic->HasItem(RG_GORONS_BRACELET) || (ctx->GetTrickOption(RT_DMT_SOIL_GS) && (logic->TakeDamage() || logic->CanUse(RG_HOVER_BOOTS)) && logic->CanUse(RG_BOOMERANG)))), + LOCATION(RC_DMT_GS_NEAR_KAK, logic->BlastOrSmash() && (logic->HasItem(RG_CLIMB) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_DMT_GS_ABOVE_DODONGOS_CAVERN, logic->IsAdult && logic->CanGetNightTimeGS() && + ((logic->CanUse(RG_MEGATON_HAMMER) || (ctx->GetTrickOption(RT_ITEM_EXTENSION) && logic->CanUse(RG_HOOKSHOT)) || (ctx->GetTrickOption(RT_BOULDER_COLLISION) && logic->CanUse(RG_LONGSHOT)) || (ctx->GetTrickOption(RT_DMT_JS_LOWER_GS) && logic->CanJumpslash())) || + ((ctx->GetTrickOption(RT_DMT_BEAN_LOWER_GS) && CanPlantBean(RR_DEATH_MOUNTAIN_TRAIL, RG_DEATH_MOUNTAIN_TRAIL_BEAN_SOUL)) || (ctx->GetTrickOption(RT_DMT_HOVERS_LOWER_GS) && logic->CanUse(RG_HOVER_BOOTS)) && + (logic->HasExplosives() || logic->CanUse(RG_DINS_FIRE) || ((ctx->GetTrickOption(RT_BOULDER_COLLISION) || ctx->GetTrickOption(RT_ITEM_EXTENSION)) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT))) || logic->CanJumpslash())))), + LOCATION(RC_DMT_BLUE_RUPEE, logic->IsChild && logic->BlastOrSmash()), + LOCATION(RC_DMT_RED_RUPEE, logic->IsChild && logic->BlastOrSmash()), + LOCATION(RC_DMT_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->HasItem(RG_DEATH_MOUNTAIN_TRAIL_BEAN_SOUL) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->HasExplosives() || logic->HasItem(RG_GORONS_BRACELET))), + LOCATION(RC_DMT_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->HasItem(RG_DEATH_MOUNTAIN_TRAIL_BEAN_SOUL) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->HasExplosives() || logic->HasItem(RG_GORONS_BRACELET))), + LOCATION(RC_DMT_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->HasItem(RG_DEATH_MOUNTAIN_TRAIL_BEAN_SOUL) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->HasExplosives() || logic->HasItem(RG_GORONS_BRACELET))), + LOCATION(RC_DMT_FLAG_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), + LOCATION(RC_DMT_ROCK_1, logic->CanBreakRocks()), + LOCATION(RC_DMT_ROCK_2, logic->CanBreakRocks()), + LOCATION(RC_DMT_ROCK_3, logic->CanBreakRocks()), + LOCATION(RC_DMT_ROCK_4, logic->CanBreakRocks()), + LOCATION(RC_DMT_ROCK_5, logic->CanBreakRocks()), + LOCATION(RC_DMT_CIRCLE_ROCK_1, logic->CanBreakRocks()), + LOCATION(RC_DMT_CIRCLE_ROCK_2, logic->CanBreakRocks()), + LOCATION(RC_DMT_CIRCLE_ROCK_3, logic->CanBreakRocks()), + LOCATION(RC_DMT_CIRCLE_ROCK_4, logic->CanBreakRocks()), + LOCATION(RC_DMT_CIRCLE_ROCK_5, logic->CanBreakRocks()), + LOCATION(RC_DMT_CIRCLE_ROCK_6, logic->CanBreakRocks()), + LOCATION(RC_DMT_CIRCLE_ROCK_7, logic->CanBreakRocks()), + LOCATION(RC_DMT_CIRCLE_ROCK_8, logic->CanBreakRocks()), + LOCATION(RC_DMT_CHILD_BOULDER, logic->IsChild && logic->BlastOrSmash()), + LOCATION(RC_DMT_BOULDER_1, logic->BlastOrSmash()), + LOCATION(RC_DMT_BOULDER_2, logic->BlastOrSmash()), + LOCATION(RC_DMT_BRONZE_BOULDER_1, logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_DMT_BRONZE_BOULDER_2, logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_DMT_BRONZE_BOULDER_3, logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_DMT_BRONZE_BOULDER_4, logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_DMT_BRONZE_BOULDER_5, logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_DMT_BRONZE_BOULDER_6, logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_DMT_BRONZE_BOULDER_7, logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_DMT_BRONZE_BOULDER_11, logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER)), LOCATION(RC_DMT_ABOVE_DODONGO_RECTANGLE_SIGN, logic->IsChild && logic->CanRead()), LOCATION(RC_DMT_ADULT_CENTER_EXIT_ARROW_SIGN, logic->IsAdult && logic->CanRead()), LOCATION(RC_DMT_CHILD_CENTER_EXIT_RECTANGLE_SIGN, logic->IsChild && logic->CanRead()), @@ -47,6 +71,10 @@ void RegionTable_Init_DeathMountainTrail() { (logic->CanUse(RG_MEGATON_HAMMER) || (ctx->GetTrickOption(RT_BOULDER_COLLISION) && logic->CanUse(RG_LONGSHOT)) || (ctx->GetTrickOption(RT_ITEM_EXTENSION) && logic->CanUse(RG_HOOKSHOT)) || (ctx->GetTrickOption(RT_DMT_UPPER_GS) && (logic->CanJumpslash() || logic->CanUse(RG_DINS_FIRE) || logic->HasExplosives() || (ctx->GetTrickOption(RT_ITEM_EXTENSION) && logic->CanUse(RG_FAIRY_SLINGSHOT)) || (ctx->GetTrickOption(RT_BOULDER_COLLISION) && logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_LONGSHOT)))))), + LOCATION(RC_DMT_BRONZE_BOULDER_8, logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_DMT_BRONZE_BOULDER_9, logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_DMT_BRONZE_BOULDER_10, logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_DMT_COW_BOULDER, logic->BlastOrSmash()), }, { //Exits ENTRANCE(RR_DEATH_MOUNTAIN_TRAIL, true), @@ -66,6 +94,7 @@ void RegionTable_Init_DeathMountainTrail() { LOCATION(RC_DMT_TRADE_CLAIM_CHECK, logic->IsAdult && logic->CanUse(RG_CLAIM_CHECK)), LOCATION(RC_DMT_GOSSIP_STONE_FAIRY, logic->CallGossipFairy()), LOCATION(RC_DMT_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_DMT_SUMMIT_ROCK, logic->IsChild && logic->CanBreakRocks()), LOCATION(RC_DMT_GOSSIP_STONE, true), LOCATION(RC_BIGGORON_HINT, logic->IsAdult && logic->HasItem(RG_SPEAK_GORON)), LOCATION(RC_DMT_UPPER_EXIT_ARROW_SIGN, logic->CanRead()), 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 e53312b5a6..e21da0a1d4 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/desert_colossus.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/desert_colossus.cpp @@ -19,12 +19,30 @@ void RegionTable_Init_DesertColossus() { 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_SILVER_BOULDER, logic->CanUse(RG_SILVER_GAUNTLETS)), + LOCATION(RC_COLOSSUS_ROCK, logic->CanBreakRocks()), + LOCATION(RC_COLOSSUS_CIRCLE_1_ROCK_1, logic->CanBreakRocks()), + LOCATION(RC_COLOSSUS_CIRCLE_1_ROCK_2, logic->CanBreakRocks()), + LOCATION(RC_COLOSSUS_CIRCLE_1_ROCK_3, logic->CanBreakRocks()), + LOCATION(RC_COLOSSUS_CIRCLE_1_ROCK_4, logic->CanBreakRocks()), + LOCATION(RC_COLOSSUS_CIRCLE_1_ROCK_5, logic->CanBreakRocks()), + LOCATION(RC_COLOSSUS_CIRCLE_1_ROCK_6, logic->CanBreakRocks()), + LOCATION(RC_COLOSSUS_CIRCLE_1_ROCK_7, logic->CanBreakRocks()), + LOCATION(RC_COLOSSUS_CIRCLE_1_ROCK_8, logic->CanBreakRocks()), + LOCATION(RC_COLOSSUS_CIRCLE_2_ROCK_1, logic->CanBreakRocks()), + LOCATION(RC_COLOSSUS_CIRCLE_2_ROCK_2, logic->CanBreakRocks()), + LOCATION(RC_COLOSSUS_CIRCLE_2_ROCK_3, logic->CanBreakRocks()), + LOCATION(RC_COLOSSUS_CIRCLE_2_ROCK_4, logic->CanBreakRocks()), + LOCATION(RC_COLOSSUS_CIRCLE_2_ROCK_5, logic->CanBreakRocks()), + LOCATION(RC_COLOSSUS_CIRCLE_2_ROCK_6, logic->CanBreakRocks()), + LOCATION(RC_COLOSSUS_CIRCLE_2_ROCK_7, logic->CanBreakRocks()), + LOCATION(RC_COLOSSUS_CIRCLE_2_ROCK_8, logic->CanBreakRocks()), 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))), + LOCATION(RC_COLOSSUS_GOSSIP_STONE, true), }, { //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_valley.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp index 7d3b1ae704..d1bca0e740 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp @@ -11,6 +11,20 @@ void RegionTable_Init_GerudoValley() { }, { //Locations LOCATION(RC_GV_GS_SMALL_BRIDGE, logic->IsChild && logic->HookshotOrBoomerang() && logic->CanGetNightTimeGS()), + LOCATION(RC_GV_GS_SMALL_BRIDGE, logic->IsChild && logic->HookshotOrBoomerang() && logic->CanGetNightTimeGS()), + LOCATION(RC_GV_ROCK_1, logic->CanBreakRocks()), + LOCATION(RC_GV_ROCK_2, logic->CanBreakRocks()), + LOCATION(RC_GV_ROCK_3, logic->CanBreakRocks()), + LOCATION(RC_GV_UNDERWATER_ROCK_1, (logic->CanUse(RG_BOMBCHU_5) || (logic->CanUse(RG_BOMB_BAG) && ctx->GetTrickOption(RT_BOMB_DETONATION)) || (logic->IsAdult && logic->HasItem(RG_POWER_BRACELET))) && + (logic->IsAdult || logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_BOOMERANG) || (ctx->GetTrickOption(RT_VOIDOUT_COLLECTION) && logic->HasItem(RG_POWER_BRACELET)))), + LOCATION(RC_GV_UNDERWATER_ROCK_2, (logic->CanUse(RG_BOMBCHU_5) || (logic->CanUse(RG_BOMB_BAG) && ctx->GetTrickOption(RT_BOMB_DETONATION)) || (logic->IsAdult && logic->HasItem(RG_POWER_BRACELET))) && + (logic->IsAdult || logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_BOOMERANG) || (ctx->GetTrickOption(RT_VOIDOUT_COLLECTION) && logic->HasItem(RG_POWER_BRACELET)))), + LOCATION(RC_GV_UNDERWATER_ROCK_3, (logic->CanUse(RG_BOMBCHU_5) || (logic->CanUse(RG_BOMB_BAG) && ctx->GetTrickOption(RT_BOMB_DETONATION)) || (logic->IsAdult && logic->HasItem(RG_POWER_BRACELET))) && + (logic->IsAdult || logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_BOOMERANG) || (ctx->GetTrickOption(RT_VOIDOUT_COLLECTION) && logic->HasItem(RG_POWER_BRACELET)))), + LOCATION(RC_GV_BOULDER_1, logic->IsAdult && logic->BlastOrSmash()), + LOCATION(RC_GV_BOULDER_2, logic->IsAdult && logic->BlastOrSmash()), + LOCATION(RC_GV_BRONZE_BOULDER_1, logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_GV_BRONZE_BOULDER_2, logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER)), LOCATION(RC_GV_BRIDGE_RECTANGLE_SIGN, logic->CanRead()), LOCATION(RC_GV_EAST_EXIT_ARROW_SIGN, logic->CanRead()), }, { @@ -71,7 +85,10 @@ void RegionTable_Init_GerudoValley() { ENTRANCE(RR_GV_UPPER_STREAM_WATER, true), }); - areaTable[RR_GV_GROTTO_LEDGE] = Region("GV Grotto Ledge", SCENE_GERUDO_VALLEY, {}, {}, { + areaTable[RR_GV_GROTTO_LEDGE] = Region("GV Grotto Ledge", SCENE_GERUDO_VALLEY, {}, { + //Locations + LOCATION(RC_GV_SILVER_BOULDER, logic->CanUse(RG_SILVER_GAUNTLETS)), + }, { //Exits ENTRANCE(RR_GV_UPPER_STREAM, ctx->GetTrickOption(RT_DAMAGE_BOOST_SIMPLE) && logic->HasExplosives() && logic->TakeDamage()), ENTRANCE(RR_GV_LOWER_STREAM, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS)), @@ -91,14 +108,25 @@ void RegionTable_Init_GerudoValley() { areaTable[RR_GV_FORTRESS_SIDE] = Region("GV Fortress Side", SCENE_GERUDO_VALLEY, {}, { //Locations - LOCATION(RC_GV_CHEST, logic->IsAdult && (logic->CanUse(RG_MEGATON_HAMMER) || (ctx->GetTrickOption(RT_BOULDER_COLLISION) && logic->CanUse(RG_LONGSHOT))) && logic->HasItem(RG_OPEN_CHEST)), - LOCATION(RC_GV_TRADE_SAW, logic->IsAdult && logic->CanUse(RG_POACHERS_SAW)), - LOCATION(RC_GV_GS_BEHIND_TENT, logic->IsAdult && logic->HookshotOrBoomerang() && logic->CanGetNightTimeGS()), - LOCATION(RC_GV_GS_PILLAR, logic->IsAdult && logic->HookshotOrBoomerang() && logic->CanGetNightTimeGS()), - LOCATION(RC_GV_CRATE_BRIDGE_1, logic->IsChild && logic->CanBreakCrates()), - LOCATION(RC_GV_CRATE_BRIDGE_2, logic->IsChild && logic->CanBreakCrates()), - LOCATION(RC_GV_CRATE_BRIDGE_3, logic->IsChild && logic->CanBreakCrates()), - LOCATION(RC_GV_CRATE_BRIDGE_4, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_GV_CHEST, logic->IsAdult && (logic->CanUse(RG_MEGATON_HAMMER) || (ctx->GetTrickOption(RT_BOULDER_COLLISION) && logic->CanUse(RG_LONGSHOT))) && logic->HasItem(RG_OPEN_CHEST)), + LOCATION(RC_GV_TRADE_SAW, logic->IsAdult && logic->CanUse(RG_POACHERS_SAW)), + LOCATION(RC_GV_GS_BEHIND_TENT, logic->IsAdult && logic->HookshotOrBoomerang() && logic->CanGetNightTimeGS()), + LOCATION(RC_GV_GS_PILLAR, logic->IsAdult && logic->HookshotOrBoomerang() && logic->CanGetNightTimeGS()), + LOCATION(RC_GV_CRATE_BRIDGE_1, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_GV_CRATE_BRIDGE_2, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_GV_CRATE_BRIDGE_3, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_GV_CRATE_BRIDGE_4, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_GV_ROCK_ACROSS_BRIDGE_1, logic->IsAdult), + LOCATION(RC_GV_ROCK_ACROSS_BRIDGE_2, logic->IsAdult), + LOCATION(RC_GV_ROCK_ACROSS_BRIDGE_3, logic->IsAdult), + LOCATION(RC_GV_ROCK_ACROSS_BRIDGE_4, logic->IsAdult), + LOCATION(RC_GV_BOULDER_ACROSS_BRIDGE, logic->IsAdult && logic->BlastOrSmash()), + LOCATION(RC_GV_BRONZE_BOULDER_ACROSS_BRIDGE_1, logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_GV_BRONZE_BOULDER_ACROSS_BRIDGE_2, logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_GV_BRONZE_BOULDER_ACROSS_BRIDGE_3, logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_GV_BRONZE_BOULDER_ACROSS_BRIDGE_4, logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_GV_BRONZE_BOULDER_ACROSS_BRIDGE_5, logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_GV_BRONZE_BOULDER_ACROSS_BRIDGE_6, logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER)), }, { //Exits ENTRANCE(RR_GF_OUTSKIRTS, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp index 8ca66bd5f5..293964ef9c 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp @@ -35,6 +35,57 @@ void RegionTable_Init_GoronCity() { LOCATION(RC_GC_UPPER_STAIRCASE_POT_2, logic->CanBreakPots()), LOCATION(RC_GC_UPPER_STAIRCASE_POT_3, logic->CanBreakPots()), LOCATION(RC_GC_MAZE_CRATE, logic->BlastOrSmash() || (logic->CanUse(RG_SILVER_GAUNTLETS) && logic->CanBreakCrates())), + LOCATION(RC_GC_ENTRANCE_BOULDER_1, logic->BlastOrSmash()), + LOCATION(RC_GC_ENTRANCE_BOULDER_2, logic->BlastOrSmash()), + LOCATION(RC_GC_ENTRANCE_BOULDER_3, logic->BlastOrSmash()), + LOCATION(RC_GC_LW_BOULDER_1, logic->Get(LOGIC_GORON_CITY_WOODS_WARP_OPEN)), + LOCATION(RC_GC_LW_BOULDER_2, logic->Get(LOGIC_GORON_CITY_WOODS_WARP_OPEN)), + LOCATION(RC_GC_LW_BOULDER_3, logic->Get(LOGIC_GORON_CITY_WOODS_WARP_OPEN)), + LOCATION(RC_GC_MAZE_SILVER_BOULDER_1, logic->CanUse(RG_SILVER_GAUNTLETS)), + LOCATION(RC_GC_MAZE_SILVER_BOULDER_2, logic->CanUse(RG_SILVER_GAUNTLETS)), + LOCATION(RC_GC_MAZE_SILVER_BOULDER_3, logic->CanUse(RG_SILVER_GAUNTLETS)), + LOCATION(RC_GC_MAZE_SILVER_BOULDER_4, logic->CanUse(RG_SILVER_GAUNTLETS)), + LOCATION(RC_GC_MAZE_SILVER_BOULDER_5, logic->CanUse(RG_SILVER_GAUNTLETS)), + LOCATION(RC_GC_MAZE_SILVER_BOULDER_6, logic->CanUse(RG_SILVER_GAUNTLETS)), + LOCATION(RC_GC_MAZE_SILVER_BOULDER_7, logic->CanUse(RG_SILVER_GAUNTLETS)), + LOCATION(RC_GC_MAZE_SILVER_BOULDER_8, logic->CanUse(RG_SILVER_GAUNTLETS)), + LOCATION(RC_GC_MAZE_SILVER_BOULDER_9, logic->CanUse(RG_SILVER_GAUNTLETS)), + LOCATION(RC_GC_MAZE_SILVER_BOULDER_10, logic->CanUse(RG_SILVER_GAUNTLETS)), + LOCATION(RC_GC_MAZE_SILVER_BOULDER_11, logic->CanUse(RG_SILVER_GAUNTLETS)), + LOCATION(RC_GC_MAZE_SILVER_BOULDER_12, logic->CanUse(RG_SILVER_GAUNTLETS)), + LOCATION(RC_GC_MAZE_SILVER_BOULDER_13, logic->CanUse(RG_SILVER_GAUNTLETS)), + LOCATION(RC_GC_MAZE_SILVER_BOULDER_14, logic->CanUse(RG_SILVER_GAUNTLETS)), + LOCATION(RC_GC_MAZE_SILVER_BOULDER_15, logic->CanUse(RG_SILVER_GAUNTLETS)), + LOCATION(RC_GC_MAZE_SILVER_BOULDER_16, logic->CanUse(RG_SILVER_GAUNTLETS)), + LOCATION(RC_GC_MAZE_SILVER_BOULDER_17, logic->CanUse(RG_SILVER_GAUNTLETS)), + LOCATION(RC_GC_MAZE_SILVER_BOULDER_18, logic->CanUse(RG_SILVER_GAUNTLETS)), + LOCATION(RC_GC_MAZE_SILVER_BOULDER_19, logic->CanUse(RG_SILVER_GAUNTLETS)), + LOCATION(RC_GC_MAZE_SILVER_BOULDER_20, logic->CanUse(RG_SILVER_GAUNTLETS)), + LOCATION(RC_GC_MAZE_SILVER_BOULDER_21, logic->CanUse(RG_SILVER_GAUNTLETS)), + LOCATION(RC_GC_MAZE_SILVER_BOULDER_22, logic->CanUse(RG_SILVER_GAUNTLETS)), + LOCATION(RC_GC_MAZE_SILVER_BOULDER_23, logic->CanUse(RG_SILVER_GAUNTLETS)), + LOCATION(RC_GC_MAZE_SILVER_BOULDER_24, logic->CanUse(RG_SILVER_GAUNTLETS)), + LOCATION(RC_GC_MAZE_SILVER_BOULDER_25, logic->CanUse(RG_SILVER_GAUNTLETS)), + LOCATION(RC_GC_MAZE_SILVER_BOULDER_26, logic->CanUse(RG_SILVER_GAUNTLETS)), + LOCATION(RC_GC_MAZE_SILVER_BOULDER_27, logic->CanUse(RG_SILVER_GAUNTLETS)), + LOCATION(RC_GC_MAZE_SILVER_BOULDER_28, logic->CanUse(RG_SILVER_GAUNTLETS)), + LOCATION(RC_GC_MAZE_SILVER_BOULDER_29, logic->CanUse(RG_SILVER_GAUNTLETS)), + LOCATION(RC_GC_MAZE_BOULDER_1, logic->BlastOrSmash()), + LOCATION(RC_GC_MAZE_BOULDER_2, logic->BlastOrSmash()), + LOCATION(RC_GC_MAZE_BOULDER_3, logic->BlastOrSmash()), + LOCATION(RC_GC_MAZE_BOULDER_4, logic->BlastOrSmash()), + LOCATION(RC_GC_MAZE_BOULDER_5, logic->BlastOrSmash()), + LOCATION(RC_GC_MAZE_BOULDER_6, logic->BlastOrSmash()), + LOCATION(RC_GC_MAZE_BOULDER_7, logic->BlastOrSmash()), + LOCATION(RC_GC_MAZE_BOULDER_8, logic->BlastOrSmash()), + LOCATION(RC_GC_MAZE_BOULDER_9, logic->BlastOrSmash()), + LOCATION(RC_GC_MAZE_BOULDER_10, logic->BlastOrSmash()), + LOCATION(RC_GC_MAZE_BRONZE_BOULDER_1, logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_GC_MAZE_BRONZE_BOULDER_2, logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_GC_MAZE_BRONZE_BOULDER_3, logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_GC_MAZE_BRONZE_BOULDER_4, logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_GC_MAZE_BRONZE_BOULDER_5, logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_GC_MAZE_ROCK, logic->BlastOrSmash() || logic->CanUse(RG_SILVER_GAUNTLETS)), LOCATION(RC_GC_CHILD_ROLLING_GORON_RECTANGLE_SIGN, logic->IsChild && logic->CanRead()), }, { //Exits diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp index a168841b0c..2ea38908fa 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp @@ -32,6 +32,7 @@ void RegionTable_Init_Graveyard() { LOCATION(RC_GY_GRASS_11, logic->CanCutShrubs()), LOCATION(RC_GY_GRASS_12, logic->CanCutShrubs()), LOCATION(RC_GRAVEYARD_CRATE, ((logic->IsAdult && CanPlantBean(RR_THE_GRAVEYARD, RG_GRAVEYARD_BEAN_SOUL)) || logic->CanUse(RG_LONGSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GY_ROCK, logic->CanBreakRocks()), LOCATION(RC_GY_NEAR_HUT_GRAVE_BUTTERFLY_FAIRY, logic->IsChild && logic->AtDay && logic->CanUse(RG_STICKS)), LOCATION(RC_GY_ENTRANCE_RECTANGLE_SIGN, logic->CanRead()), LOCATION(RC_GY_ENTRANCE_PLINTH, logic->CanRead()), 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 9445f7bf64..0aa7035099 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp @@ -62,6 +62,22 @@ void RegionTable_Init_HyruleField() { LOCATION(RC_HF_NEAR_KF_GRASS_10, logic->CanCutShrubs()), LOCATION(RC_HF_NEAR_KF_GRASS_11, logic->CanCutShrubs()), LOCATION(RC_HF_NEAR_KF_GRASS_12, logic->CanCutShrubs()), + LOCATION(RC_HF_SILVER_BOULDER, logic->CanUse(RG_SILVER_GAUNTLETS)), + LOCATION(RC_HF_ROCK_1, logic->CanBreakRocks()), + LOCATION(RC_HF_ROCK_2, logic->CanBreakRocks()), + LOCATION(RC_HF_ROCK_3, logic->CanBreakRocks()), + LOCATION(RC_HF_ROCK_4, logic->CanBreakRocks()), + LOCATION(RC_HF_ROCK_5, logic->CanBreakRocks()), + LOCATION(RC_HF_ROCK_6, logic->CanBreakRocks()), + LOCATION(RC_HF_ROCK_7, logic->CanBreakRocks()), + LOCATION(RC_HF_ROCK_8, logic->CanBreakRocks()), + LOCATION(RC_HF_BOULDER_NORTH, logic->BlastOrSmash()), + LOCATION(RC_HF_BOULDER_BY_MARKET, logic->BlastOrSmash()), + LOCATION(RC_HF_BOULDER_SOUTH, logic->BlastOrSmash()), + LOCATION(RC_HF_BRONZE_BOULDER_1, logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_HF_BRONZE_BOULDER_2, logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_HF_BRONZE_BOULDER_3, logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_HF_BRONZE_BOULDER_4, logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER)), LOCATION(RC_HF_NEAR_LLR_TREE, logic->CanBonkTrees()), LOCATION(RC_HF_NEAR_LH_TREE, logic->CanBonkTrees()), LOCATION(RC_HF_CHILD_NEAR_GV_TREE, logic->IsChild && logic->CanBonkTrees()), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp index 98105f5ed8..5d236c7e72 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp @@ -23,7 +23,7 @@ void RegionTable_Init_Kakariko() { LOCATION(RC_KAK_GS_SKULLTULA_HOUSE, logic->IsChild && logic->CanGetNightTimeGS() && (logic->HasItem(RG_POWER_BRACELET) || logic->CanKillEnemy(RE_GOLD_SKULLTULA))), LOCATION(RC_KAK_GS_GUARDS_HOUSE, logic->IsChild && logic->CanGetNightTimeGS() && (logic->HasItem(RG_POWER_BRACELET) || logic->CanKillEnemy(RE_GOLD_SKULLTULA))), LOCATION(RC_KAK_GS_TREE, logic->IsChild && logic->CanGetNightTimeGS() && logic->CanBonkTrees() && (logic->HasItem(RG_POWER_BRACELET) || logic->CanKillEnemy(RE_GOLD_SKULLTULA))), - LOCATION(RC_KAK_GS_WATCHTOWER, logic->IsChild && logic->HasItem(RG_CLIMB) && (logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_LONGSHOT) || (ctx->GetTrickOption(RT_KAK_TOWER_GS) && logic->CanJumpslashExceptHammer())) && logic->CanGetNightTimeGS()), + LOCATION(RC_KAK_GS_WATCHTOWER, logic->IsChild && logic->HasItem(RG_CLIMB) && (logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_LONGSHOT) || (ctx->GetTrickOption(RT_KAK_TOWER_GS) && logic->CanJumpslashExceptHammer())) && logic->CanGetNightTimeGS()), LOCATION(RC_KAK_NEAR_POTION_SHOP_POT_1, logic->IsChild && logic->CanBreakPots()), LOCATION(RC_KAK_NEAR_POTION_SHOP_POT_2, logic->IsChild && logic->CanBreakPots()), LOCATION(RC_KAK_NEAR_POTION_SHOP_POT_3, logic->IsChild && logic->CanBreakPots()), @@ -59,6 +59,10 @@ void RegionTable_Init_Kakariko() { LOCATION(RC_KAK_NEAR_FENCE_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()), LOCATION(RC_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()), LOCATION(RC_KAK_NEAR_BAZAAR_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_KAK_SILVER_BOULDER, logic->IsAdult && logic->CanUse(RG_SILVER_GAUNTLETS) && + (logic->HasItem(RG_CLIMB) || logic->CanUse(RG_HOVER_BOOTS) || (logic->HasItem(RG_LONGSHOT) && ((logic->AtDay && logic->HasItem(RG_POWER_BRACELET)) || (ctx->GetTrickOption(RT_UNINTUITIVE_JUMPS) && logic->CanJumpslash() && logic->TakeDamage()))))), + LOCATION(RC_KAK_ROCK_1, logic->CanBreakRocks()), + LOCATION(RC_KAK_ROCK_2, logic->CanBreakRocks()), LOCATION(RC_KAK_TREE, logic->CanBonkTrees()), LOCATION(RC_KAK_GUARD_GATE_RECTANGLE_SIGN, logic->IsChild && logic->CanRead()), LOCATION(RC_KAK_WELL_RECTANGLE_SIGN, logic->IsChild && logic->CanRead()), 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 62b31803f2..04882b95c7 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/kokiri_forest.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/kokiri_forest.cpp @@ -67,6 +67,18 @@ void RegionTable_Init_KokiriForest() { LOCATION(RC_KF_ADULT_GRASS_18, logic->IsAdult && logic->CanCutShrubs()), LOCATION(RC_KF_ADULT_GRASS_19, logic->IsAdult && logic->CanCutShrubs()), LOCATION(RC_KF_ADULT_GRASS_20, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_CIRCLE_ROCK_1, logic->CanBreakRocks()), + LOCATION(RC_KF_CIRCLE_ROCK_2, logic->CanBreakRocks()), + LOCATION(RC_KF_CIRCLE_ROCK_3, logic->CanBreakRocks()), + LOCATION(RC_KF_CIRCLE_ROCK_4, logic->CanBreakRocks()), + LOCATION(RC_KF_CIRCLE_ROCK_5, logic->CanBreakRocks()), + LOCATION(RC_KF_CIRCLE_ROCK_6, logic->CanBreakRocks()), + LOCATION(RC_KF_CIRCLE_ROCK_7, logic->CanBreakRocks()), + LOCATION(RC_KF_CIRCLE_ROCK_8, logic->CanBreakRocks()), + LOCATION(RC_KF_ROCK_BY_SARIAS_HOUSE, logic->IsChild && logic->CanBreakRocks()), + LOCATION(RC_KF_ROCK_BEHIND_SARIAS_HOUSE, logic->IsChild && logic->CanBreakRocks()), + LOCATION(RC_KF_ROCK_BY_MIDOS_HOUSE, logic->IsChild && logic->CanBreakRocks()), + LOCATION(RC_KF_ROCK_BY_KNOW_IT_ALLS_HOUSE, logic->IsChild && logic->CanBreakRocks()), LOCATION(RC_KF_DEKU_TREE_RECTANGLE_SIGN, logic->CanRead()), LOCATION(RC_KF_STEPPING_STONES_RECTANGLE_SIGN, logic->CanRead()), LOCATION(RC_KF_LINKS_HOUSE_RECTANGLE_SIGN, logic->CanRead()), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp index 9619fc5697..4a8d80619b 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp @@ -108,6 +108,7 @@ void RegionTable_Init_LakeHylia() { areaTable[RR_LH_FISHING_ISLAND] = Region("LH Fishing Island", SCENE_LAKE_HYLIA, {}, { //Locations + LOCATION(RC_LH_ROCK, logic->CanBreakRocks()), LOCATION(RC_LH_FISHING_SIGN, logic->CanRead()), }, { //Exits 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 4b9e3278fb..3ff805c0a9 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,7 @@ 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_BOULDER_BY_GORON_CITY, logic->BlastOrSmash()), 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), @@ -96,6 +97,8 @@ void RegionTable_Init_LostWoods() { LOCATION(RC_LW_GRASS_7, logic->CanCutShrubs()), LOCATION(RC_LW_GRASS_8, logic->CanCutShrubs()), LOCATION(RC_LW_GRASS_9, logic->CanCutShrubs()), + LOCATION(RC_LW_BOULDER_BY_SACRED_FOREST_MEADOW, logic->BlastOrSmash()), + LOCATION(RC_LW_RUPEE_BOULDER, logic->BlastOrSmash()), LOCATION(RC_LW_MEADOW_BUTTERFLY_FAIRY, logic->IsChild && logic->CanUse(RG_STICKS)), }, { //Exits diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_domain.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_domain.cpp index c565a6f89e..0649f5f3d4 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_domain.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_domain.cpp @@ -27,7 +27,6 @@ void RegionTable_Init_ZorasDomain() { LOCATION(RC_ZD_FISH_5, logic->IsChild && logic->HasBottle()), LOCATION(RC_ZD_GOSSIP_STONE_FAIRY, logic->CallGossipFairyExceptSuns()), LOCATION(RC_ZD_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), - LOCATION(RC_ZD_GOSSIP_STONE, true), LOCATION(RC_ZD_IN_FRONT_OF_KING_ZORA_BEEHIVE_LEFT, logic->IsChild && logic->CanBreakUpperBeehives()), LOCATION(RC_ZD_IN_FRONT_OF_KING_ZORA_BEEHIVE_RIGHT, logic->IsChild && logic->CanBreakUpperBeehives()), LOCATION(RC_ZD_NEAR_SHOP_POT_1, logic->CanBreakPots()), @@ -35,6 +34,14 @@ void RegionTable_Init_ZorasDomain() { LOCATION(RC_ZD_NEAR_SHOP_POT_3, logic->CanBreakPots()), LOCATION(RC_ZD_NEAR_SHOP_POT_4, logic->CanBreakPots()), LOCATION(RC_ZD_NEAR_SHOP_POT_5, logic->CanBreakPots()), + LOCATION(RC_ZD_CIRCLE_ROCK_1, logic->CanBreakRocks()), + LOCATION(RC_ZD_CIRCLE_ROCK_2, logic->CanBreakRocks()), + LOCATION(RC_ZD_CIRCLE_ROCK_3, logic->CanBreakRocks()), + LOCATION(RC_ZD_CIRCLE_ROCK_4, logic->CanBreakRocks()), + LOCATION(RC_ZD_CIRCLE_ROCK_5, logic->CanBreakRocks()), + LOCATION(RC_ZD_CIRCLE_ROCK_6, logic->CanBreakRocks()), + LOCATION(RC_ZD_CIRCLE_ROCK_7, logic->CanBreakRocks()), + LOCATION(RC_ZD_CIRCLE_ROCK_8, logic->CanBreakRocks()), LOCATION(RC_ZD_SHOP_RECTANGLE_SIGN, logic->CanRead()), LOCATION(RC_ZD_ENTRANCE_RECTANGLE_SIGN, logic->CanRead()), LOCATION(RC_ZD_KING_ZORA_PATH_ARROW_SIGN, logic->CanRead()), @@ -42,6 +49,7 @@ void RegionTable_Init_ZorasDomain() { LOCATION(RC_ZD_NEAR_KING_ZORA_ARROW_SIGN, logic->CanRead()), LOCATION(RC_ZD_KING_ZORA_RED_ICE, logic->IsAdult && logic->Get(LOGIC_KING_ZORA_THAWED)), LOCATION(RC_ZD_ZORA_SHOP_RED_ICE, logic->IsAdult && logic->BlueFire()), + LOCATION(RC_ZD_GOSSIP_STONE, true), }, { //Exits ENTRANCE(RR_ZR_BEHIND_WATERFALL, 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 7c827315c3..562f8978e8 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_fountain.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_fountain.cpp @@ -22,6 +22,9 @@ void RegionTable_Init_ZorasFountain() { LOCATION(RC_ZF_NEAR_JABU_POT_2, logic->IsChild && logic->CanBreakPots()), LOCATION(RC_ZF_NEAR_JABU_POT_3, logic->IsChild && logic->CanBreakPots()), LOCATION(RC_ZF_NEAR_JABU_POT_4, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_ZF_BOULDER, logic->BlastOrSmash()), + LOCATION(RC_ZF_SILVER_BOULDER, logic->CanUse(RG_SILVER_GAUNTLETS)), + LOCATION(RC_ZF_UNDERGROUND_BOULDER, logic->CanUse(RG_SILVER_GAUNTLETS) && logic->BlastOrSmash()), LOCATION(RC_ZF_TREE, logic->IsChild && logic->CanBonkTrees()), LOCATION(RC_ZF_BUSH_1, logic->IsChild), LOCATION(RC_ZF_BUSH_2, logic->IsChild), 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 5fbd38a35d..7c44d02fd2 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp @@ -20,6 +20,10 @@ void RegionTable_Init_ZoraRiver() { LOCATION(RC_ZR_GRASS_10, logic->CanCutShrubs()), LOCATION(RC_ZR_GRASS_11, logic->CanCutShrubs()), LOCATION(RC_ZR_GRASS_12, logic->CanCutShrubs()), + LOCATION(RC_ZR_BOULDER_1, logic->IsChild && logic->BlastOrSmash()), + LOCATION(RC_ZR_BOULDER_2, logic->IsChild && logic->BlastOrSmash()), + LOCATION(RC_ZR_BOULDER_3, logic->IsChild && logic->BlastOrSmash()), + LOCATION(RC_ZR_BOULDER_4, logic->IsChild && logic->BlastOrSmash()), 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) || ctx->GetTrickOption(RT_VOIDOUT_COLLECTION))), @@ -59,7 +63,23 @@ void RegionTable_Init_ZoraRiver() { LOCATION(RC_ZR_BENEATH_WATERFALL_MIDDLE_LEFT_RUPEE, logic->IsAdult && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG) || ctx->GetTrickOption(RT_VOIDOUT_COLLECTION))), LOCATION(RC_ZR_BENEATH_WATERFALL_MIDDLE_RIGHT_RUPEE, logic->IsAdult && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG) || ctx->GetTrickOption(RT_VOIDOUT_COLLECTION))), LOCATION(RC_ZR_BENEATH_WATERFALL_RIGHT_RUPEE, logic->IsAdult && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG) || ctx->GetTrickOption(RT_VOIDOUT_COLLECTION))), - LOCATION(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, true), + LOCATION(RC_ZR_CIRCLE_ROCK_1, logic->CanBreakRocks()), + LOCATION(RC_ZR_CIRCLE_ROCK_2, logic->CanBreakRocks()), + LOCATION(RC_ZR_CIRCLE_ROCK_3, logic->CanBreakRocks()), + LOCATION(RC_ZR_CIRCLE_ROCK_4, logic->CanBreakRocks()), + LOCATION(RC_ZR_CIRCLE_ROCK_5, logic->CanBreakRocks()), + LOCATION(RC_ZR_CIRCLE_ROCK_6, logic->CanBreakRocks()), + LOCATION(RC_ZR_CIRCLE_ROCK_7, logic->CanBreakRocks()), + LOCATION(RC_ZR_CIRCLE_ROCK_8, logic->CanBreakRocks()), + LOCATION(RC_ZR_ROCK, logic->CanBreakRocks()), + LOCATION(RC_ZR_UNDERWATER_ROCK_1, (logic->CanUse(RG_BOMBCHU_5) || (logic->CanUse(RG_BOMB_BAG) && ctx->GetTrickOption(RT_BOMB_DETONATION)) || (logic->IsAdult && logic->HasItem(RG_POWER_BRACELET))) && + (logic->IsAdult || logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_BOOMERANG) || ctx->GetTrickOption(RT_VOIDOUT_COLLECTION))), + LOCATION(RC_ZR_UNDERWATER_ROCK_2, (logic->CanUse(RG_BOMBCHU_5) || (logic->CanUse(RG_BOMB_BAG) && ctx->GetTrickOption(RT_BOMB_DETONATION)) || (logic->IsAdult && logic->HasItem(RG_POWER_BRACELET))) && + (logic->IsAdult || logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_BOOMERANG) || ctx->GetTrickOption(RT_VOIDOUT_COLLECTION))), + LOCATION(RC_ZR_UNDERWATER_ROCK_3, (logic->CanUse(RG_BOMBCHU_5) || (logic->CanUse(RG_BOMB_BAG) && ctx->GetTrickOption(RT_BOMB_DETONATION)) || (logic->IsAdult && logic->HasItem(RG_POWER_BRACELET))) && + (logic->IsAdult || logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_BOOMERANG) || ctx->GetTrickOption(RT_VOIDOUT_COLLECTION))), + LOCATION(RC_ZR_UNDERWATER_ROCK_4, (logic->CanUse(RG_BOMBCHU_5) || (logic->CanUse(RG_BOMB_BAG) && ctx->GetTrickOption(RT_BOMB_DETONATION)) || (logic->IsAdult && logic->HasItem(RG_POWER_BRACELET))) && + (logic->IsAdult || logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_BOOMERANG) || ctx->GetTrickOption(RT_VOIDOUT_COLLECTION))), LOCATION(RC_ZR_NEAR_FREESTANDING_POH_GRASS, logic->CanUse(RG_BOOMERANG)), 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)), @@ -91,6 +111,7 @@ void RegionTable_Init_ZoraRiver() { LOCATION(RC_ZR_WONDER_NEAR_CUCCO_1, logic->IsChild && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || ctx->GetTrickOption(RT_VOIDOUT_COLLECTION))), // Requires backflip with Iron Boots LOCATION(RC_ZR_WONDER_NEAR_CUCCO_2, logic->IsChild && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || ctx->GetTrickOption(RT_VOIDOUT_COLLECTION))), // Requires backflip with Iron Boots LOCATION(RC_ZR_WONDER_NEAR_CUCCO_3, logic->IsChild && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || ctx->GetTrickOption(RT_VOIDOUT_COLLECTION))), + LOCATION(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, true), }, { //Exits ENTRANCE(RR_ZR_FRONT, logic->IsAdult || logic->HasItem(RG_BRONZE_SCALE) || logic->HasItem(RG_POWER_BRACELET) || logic->BlastOrSmash() || logic->HasItem(RG_HOVER_BOOTS)), @@ -109,6 +130,15 @@ void RegionTable_Init_ZoraRiver() { LOCATION(RC_ZR_GS_NEAR_RAISED_GROTTOS, logic->IsAdult && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG) && logic->CanGetNightTimeGS()), LOCATION(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, logic->CallGossipFairy()), LOCATION(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_ZR_UPPER_CIRCLE_BOULDER, logic->BlastOrSmash()), + LOCATION(RC_ZR_UPPER_CIRCLE_ROCK_1, logic->CanBreakRocks()), + LOCATION(RC_ZR_UPPER_CIRCLE_ROCK_2, logic->CanBreakRocks()), + LOCATION(RC_ZR_UPPER_CIRCLE_ROCK_3, logic->CanBreakRocks()), + LOCATION(RC_ZR_UPPER_CIRCLE_ROCK_4, logic->CanBreakRocks()), + LOCATION(RC_ZR_UPPER_CIRCLE_ROCK_5, logic->CanBreakRocks()), + LOCATION(RC_ZR_UPPER_CIRCLE_ROCK_6, logic->CanBreakRocks()), + LOCATION(RC_ZR_UPPER_CIRCLE_ROCK_7, logic->CanBreakRocks()), + LOCATION(RC_ZR_UPPER_CIRCLE_ROCK_8, logic->CanBreakRocks()), LOCATION(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, true), }, { //Exits diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp index 075296105e..8b714759e6 100644 --- a/soh/soh/Enhancements/randomizer/logic.cpp +++ b/soh/soh/Enhancements/randomizer/logic.cpp @@ -1330,6 +1330,10 @@ bool Logic::CanBreakSmallCrates() { return CanJumpslash() || HasExplosives() || HasItem(RG_POWER_BRACELET); } +bool Logic::CanBreakRocks() { + return BlastOrSmash() || HasItem(RG_POWER_BRACELET); +} + bool Logic::CanBonkTrees() { return true; } diff --git a/soh/soh/Enhancements/randomizer/logic.h b/soh/soh/Enhancements/randomizer/logic.h index 496a6190c3..3f4b4a206c 100644 --- a/soh/soh/Enhancements/randomizer/logic.h +++ b/soh/soh/Enhancements/randomizer/logic.h @@ -104,6 +104,7 @@ class Logic { bool CanBreakPots(EnemyDistance distance = ED_CLOSE, bool wallOrFloor = true, bool inWater = false); bool CanBreakCrates(); bool CanBreakSmallCrates(); + bool CanBreakRocks(); bool CanBonkTrees(); bool CanRead(); bool HasFireSource(); diff --git a/soh/soh/Enhancements/randomizer/option_descriptions.cpp b/soh/soh/Enhancements/randomizer/option_descriptions.cpp index 95481e9f63..d4b9d41f17 100644 --- a/soh/soh/Enhancements/randomizer/option_descriptions.cpp +++ b/soh/soh/Enhancements/randomizer/option_descriptions.cpp @@ -550,6 +550,8 @@ void Settings::CreateOptionDescriptions() { "Overworld - Only shuffle grass that are outside of dungeons.\n" "\n" "All Grass - Shuffle all grass."; + mOptionDescriptions[RSK_SHUFFLE_ROCKS] = "Shuffle rock locations."; + mOptionDescriptions[RSK_SHUFFLE_BOULDERS] = "Shuffle boulder locations."; mOptionDescriptions[RSK_SHUFFLE_DUNGEON_REWARDS] = "Shuffles the location of Spiritual Stones and medallions.\n" "Vanilla - Spiritual Stones and medallions will be given from their respective boss.\n" diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index e0740e16c4..8fad3d16fa 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -2852,6 +2852,287 @@ std::map rcToRandomizerInf = { RC_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE, RAND_INF_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE, }, + { RC_KF_CIRCLE_ROCK_1, RAND_INF_KF_CIRCLE_ROCK_1 }, + { RC_KF_CIRCLE_ROCK_2, RAND_INF_KF_CIRCLE_ROCK_2 }, + { RC_KF_CIRCLE_ROCK_3, RAND_INF_KF_CIRCLE_ROCK_3 }, + { RC_KF_CIRCLE_ROCK_4, RAND_INF_KF_CIRCLE_ROCK_4 }, + { RC_KF_CIRCLE_ROCK_5, RAND_INF_KF_CIRCLE_ROCK_5 }, + { RC_KF_CIRCLE_ROCK_6, RAND_INF_KF_CIRCLE_ROCK_6 }, + { RC_KF_CIRCLE_ROCK_7, RAND_INF_KF_CIRCLE_ROCK_7 }, + { RC_KF_CIRCLE_ROCK_8, RAND_INF_KF_CIRCLE_ROCK_8 }, + { RC_KF_ROCK_BY_SARIAS_HOUSE, RAND_INF_KF_ROCK_BY_SARIAS_HOUSE }, + { RC_KF_ROCK_BEHIND_SARIAS_HOUSE, RAND_INF_KF_ROCK_BEHIND_SARIAS_HOUSE }, + { RC_KF_ROCK_BY_MIDOS_HOUSE, RAND_INF_KF_ROCK_BY_MIDOS_HOUSE }, + { RC_KF_ROCK_BY_KNOW_IT_ALLS_HOUSE, RAND_INF_KF_ROCK_BY_KNOW_IT_ALLS_HOUSE }, + { RC_LW_BOULDER_BY_GORON_CITY, RAND_INF_LW_BOULDER_BY_GORON_CITY }, + { RC_LW_BOULDER_BY_SACRED_FOREST_MEADOW, RAND_INF_LW_BOULDER_BY_SACRED_FOREST_MEADOW }, + { RC_LW_RUPEE_BOULDER, RAND_INF_LW_RUPEE_BOULDER }, + { RC_HC_ROCK_1, RAND_INF_HC_ROCK_1 }, + { RC_HC_ROCK_2, RAND_INF_HC_ROCK_2 }, + { RC_HC_ROCK_3, RAND_INF_HC_ROCK_3 }, + { RC_HC_BOULDER, RAND_INF_HC_BOULDER }, + { RC_OGC_BRONZE_BOULDER_1, RAND_INF_OGC_BRONZE_BOULDER_1 }, + { RC_OGC_BRONZE_BOULDER_2, RAND_INF_OGC_BRONZE_BOULDER_2 }, + { RC_OGC_BRONZE_BOULDER_3, RAND_INF_OGC_BRONZE_BOULDER_3 }, + { RC_OGC_SILVER_BOULDER_1, RAND_INF_OGC_SILVER_BOULDER_1 }, + { RC_OGC_SILVER_BOULDER_2, RAND_INF_OGC_SILVER_BOULDER_2 }, + { RC_OGC_SILVER_BOULDER_3, RAND_INF_OGC_SILVER_BOULDER_3 }, + { RC_OGC_SILVER_BOULDER_4, RAND_INF_OGC_SILVER_BOULDER_4 }, + { RC_DMC_CIRCLE_ROCK_1, RAND_INF_DMC_CIRCLE_ROCK_1 }, + { RC_DMC_CIRCLE_ROCK_2, RAND_INF_DMC_CIRCLE_ROCK_2 }, + { RC_DMC_CIRCLE_ROCK_3, RAND_INF_DMC_CIRCLE_ROCK_3 }, + { RC_DMC_CIRCLE_ROCK_4, RAND_INF_DMC_CIRCLE_ROCK_4 }, + { RC_DMC_CIRCLE_ROCK_5, RAND_INF_DMC_CIRCLE_ROCK_5 }, + { RC_DMC_CIRCLE_ROCK_6, RAND_INF_DMC_CIRCLE_ROCK_6 }, + { RC_DMC_CIRCLE_ROCK_7, RAND_INF_DMC_CIRCLE_ROCK_7 }, + { RC_DMC_CIRCLE_ROCK_8, RAND_INF_DMC_CIRCLE_ROCK_8 }, + { RC_DMC_ROCK_BY_FIRE_TEMPLE_1, RAND_INF_DMC_ROCK_BY_FIRE_TEMPLE_1 }, + { RC_DMC_ROCK_BY_FIRE_TEMPLE_2, RAND_INF_DMC_ROCK_BY_FIRE_TEMPLE_2 }, + { RC_DMC_ROCK_BY_FIRE_TEMPLE_3, RAND_INF_DMC_ROCK_BY_FIRE_TEMPLE_3 }, + { RC_DMC_ROCK_BY_FIRE_TEMPLE_4, RAND_INF_DMC_ROCK_BY_FIRE_TEMPLE_4 }, + { RC_DMC_ROCK_BY_FIRE_TEMPLE_5, RAND_INF_DMC_ROCK_BY_FIRE_TEMPLE_5 }, + { RC_DMC_GOSSIP_ROCK_1, RAND_INF_DMC_GOSSIP_ROCK_1 }, + { RC_DMC_GOSSIP_ROCK_2, RAND_INF_DMC_GOSSIP_ROCK_2 }, + { RC_DMC_BOULDER_1, RAND_INF_DMC_BOULDER_1 }, + { RC_DMC_BOULDER_2, RAND_INF_DMC_BOULDER_2 }, + { RC_DMC_BOULDER_3, RAND_INF_DMC_BOULDER_3 }, + { RC_DMC_BRONZE_BOULDER_1, RAND_INF_DMC_BRONZE_BOULDER_1 }, + { RC_DMC_BRONZE_BOULDER_2, RAND_INF_DMC_BRONZE_BOULDER_2 }, + { RC_DMC_BRONZE_BOULDER_3, RAND_INF_DMC_BRONZE_BOULDER_3 }, + { RC_DMC_BRONZE_BOULDER_SHORTCUT, RAND_INF_DMC_BRONZE_BOULDER_SHORTCUT }, + { RC_GV_SILVER_BOULDER, RAND_INF_GV_SILVER_BOULDER }, + { RC_GV_ROCK_1, RAND_INF_GV_ROCK_1 }, + { RC_GV_ROCK_2, RAND_INF_GV_ROCK_2 }, + { RC_GV_ROCK_3, RAND_INF_GV_ROCK_3 }, + { RC_GV_UNDERWATER_ROCK_1, RAND_INF_GV_UNDERWATER_ROCK_1 }, + { RC_GV_UNDERWATER_ROCK_2, RAND_INF_GV_UNDERWATER_ROCK_2 }, + { RC_GV_UNDERWATER_ROCK_3, RAND_INF_GV_UNDERWATER_ROCK_3 }, + { RC_GV_ROCK_ACROSS_BRIDGE_1, RAND_INF_GV_ROCK_ACROSS_BRIDGE_1 }, + { RC_GV_ROCK_ACROSS_BRIDGE_2, RAND_INF_GV_ROCK_ACROSS_BRIDGE_2 }, + { RC_GV_ROCK_ACROSS_BRIDGE_3, RAND_INF_GV_ROCK_ACROSS_BRIDGE_3 }, + { RC_GV_ROCK_ACROSS_BRIDGE_4, RAND_INF_GV_ROCK_ACROSS_BRIDGE_4 }, + { RC_GV_BOULDER_1, RAND_INF_GV_BOULDER_1 }, + { RC_GV_BOULDER_2, RAND_INF_GV_BOULDER_2 }, + { RC_GV_BOULDER_ACROSS_BRIDGE, RAND_INF_GV_BOULDER_ACROSS_BRIDGE }, + { RC_GV_BRONZE_BOULDER_1, RAND_INF_GV_BRONZE_BOULDER_1 }, + { RC_GV_BRONZE_BOULDER_2, RAND_INF_GV_BRONZE_BOULDER_2 }, + { RC_GV_BRONZE_BOULDER_ACROSS_BRIDGE_1, RAND_INF_GV_BRONZE_BOULDER_ACROSS_BRIDGE_1 }, + { RC_GV_BRONZE_BOULDER_ACROSS_BRIDGE_2, RAND_INF_GV_BRONZE_BOULDER_ACROSS_BRIDGE_2 }, + { RC_GV_BRONZE_BOULDER_ACROSS_BRIDGE_3, RAND_INF_GV_BRONZE_BOULDER_ACROSS_BRIDGE_3 }, + { RC_GV_BRONZE_BOULDER_ACROSS_BRIDGE_4, RAND_INF_GV_BRONZE_BOULDER_ACROSS_BRIDGE_4 }, + { RC_GV_BRONZE_BOULDER_ACROSS_BRIDGE_5, RAND_INF_GV_BRONZE_BOULDER_ACROSS_BRIDGE_5 }, + { RC_GV_BRONZE_BOULDER_ACROSS_BRIDGE_6, RAND_INF_GV_BRONZE_BOULDER_ACROSS_BRIDGE_6 }, + { RC_HF_SILVER_BOULDER, RAND_INF_HF_SILVER_BOULDER }, + { RC_HF_ROCK_1, RAND_INF_HF_ROCK_1 }, + { RC_HF_ROCK_2, RAND_INF_HF_ROCK_2 }, + { RC_HF_ROCK_3, RAND_INF_HF_ROCK_3 }, + { RC_HF_ROCK_4, RAND_INF_HF_ROCK_4 }, + { RC_HF_ROCK_5, RAND_INF_HF_ROCK_5 }, + { RC_HF_ROCK_6, RAND_INF_HF_ROCK_6 }, + { RC_HF_ROCK_7, RAND_INF_HF_ROCK_7 }, + { RC_HF_ROCK_8, RAND_INF_HF_ROCK_8 }, + { RC_HF_BOULDER_NORTH, RAND_INF_HF_BOULDER_NORTH }, + { RC_HF_BOULDER_BY_MARKET, RAND_INF_HF_BOULDER_BY_MARKET }, + { RC_HF_BOULDER_SOUTH, RAND_INF_HF_BOULDER_SOUTH }, + { RC_HF_BRONZE_BOULDER_1, RAND_INF_HF_BRONZE_BOULDER_1 }, + { RC_HF_BRONZE_BOULDER_2, RAND_INF_HF_BRONZE_BOULDER_2 }, + { RC_HF_BRONZE_BOULDER_3, RAND_INF_HF_BRONZE_BOULDER_3 }, + { RC_HF_BRONZE_BOULDER_4, RAND_INF_HF_BRONZE_BOULDER_4 }, + { RC_KAK_SILVER_BOULDER, RAND_INF_KAK_SILVER_BOULDER }, + { RC_KAK_ROCK_1, RAND_INF_KAK_ROCK_1 }, + { RC_KAK_ROCK_2, RAND_INF_KAK_ROCK_2 }, + { RC_GY_ROCK, RAND_INF_GY_ROCK }, + { RC_LH_ROCK, RAND_INF_LH_ROCK }, + { RC_ZD_CIRCLE_ROCK_1, RAND_INF_ZD_CIRCLE_ROCK_1 }, + { RC_ZD_CIRCLE_ROCK_2, RAND_INF_ZD_CIRCLE_ROCK_2 }, + { RC_ZD_CIRCLE_ROCK_3, RAND_INF_ZD_CIRCLE_ROCK_3 }, + { RC_ZD_CIRCLE_ROCK_4, RAND_INF_ZD_CIRCLE_ROCK_4 }, + { RC_ZD_CIRCLE_ROCK_5, RAND_INF_ZD_CIRCLE_ROCK_5 }, + { RC_ZD_CIRCLE_ROCK_6, RAND_INF_ZD_CIRCLE_ROCK_6 }, + { RC_ZD_CIRCLE_ROCK_7, RAND_INF_ZD_CIRCLE_ROCK_7 }, + { RC_ZD_CIRCLE_ROCK_8, RAND_INF_ZD_CIRCLE_ROCK_8 }, + { RC_ZF_BOULDER, RAND_INF_ZF_BOULDER }, + { RC_ZF_SILVER_BOULDER, RAND_INF_ZF_SILVER_BOULDER }, + { RC_ZF_UNDERGROUND_BOULDER, RAND_INF_ZF_UNDERGROUND_BOULDER }, + { RC_ZR_BOULDER_1, RAND_INF_ZR_BOULDER_1 }, + { RC_ZR_BOULDER_2, RAND_INF_ZR_BOULDER_2 }, + { RC_ZR_BOULDER_3, RAND_INF_ZR_BOULDER_3 }, + { RC_ZR_BOULDER_4, RAND_INF_ZR_BOULDER_4 }, + { RC_ZR_CIRCLE_ROCK_1, RAND_INF_ZR_CIRCLE_ROCK_1 }, + { RC_ZR_CIRCLE_ROCK_2, RAND_INF_ZR_CIRCLE_ROCK_2 }, + { RC_ZR_CIRCLE_ROCK_3, RAND_INF_ZR_CIRCLE_ROCK_3 }, + { RC_ZR_CIRCLE_ROCK_4, RAND_INF_ZR_CIRCLE_ROCK_4 }, + { RC_ZR_CIRCLE_ROCK_5, RAND_INF_ZR_CIRCLE_ROCK_5 }, + { RC_ZR_CIRCLE_ROCK_6, RAND_INF_ZR_CIRCLE_ROCK_6 }, + { RC_ZR_CIRCLE_ROCK_7, RAND_INF_ZR_CIRCLE_ROCK_7 }, + { RC_ZR_CIRCLE_ROCK_8, RAND_INF_ZR_CIRCLE_ROCK_8 }, + { RC_ZR_UPPER_CIRCLE_BOULDER, RAND_INF_ZR_UPPER_CIRCLE_BOULDER }, + { RC_ZR_UPPER_CIRCLE_ROCK_1, RAND_INF_ZR_UPPER_CIRCLE_ROCK_1 }, + { RC_ZR_UPPER_CIRCLE_ROCK_2, RAND_INF_ZR_UPPER_CIRCLE_ROCK_2 }, + { RC_ZR_UPPER_CIRCLE_ROCK_3, RAND_INF_ZR_UPPER_CIRCLE_ROCK_3 }, + { RC_ZR_UPPER_CIRCLE_ROCK_4, RAND_INF_ZR_UPPER_CIRCLE_ROCK_4 }, + { RC_ZR_UPPER_CIRCLE_ROCK_5, RAND_INF_ZR_UPPER_CIRCLE_ROCK_5 }, + { RC_ZR_UPPER_CIRCLE_ROCK_6, RAND_INF_ZR_UPPER_CIRCLE_ROCK_6 }, + { RC_ZR_UPPER_CIRCLE_ROCK_7, RAND_INF_ZR_UPPER_CIRCLE_ROCK_7 }, + { RC_ZR_UPPER_CIRCLE_ROCK_8, RAND_INF_ZR_UPPER_CIRCLE_ROCK_8 }, + { RC_ZR_ROCK, RAND_INF_ZR_ROCK }, + { RC_ZR_UNDERWATER_ROCK_1, RAND_INF_ZR_UNDERWATER_ROCK_1 }, + { RC_ZR_UNDERWATER_ROCK_2, RAND_INF_ZR_UNDERWATER_ROCK_2 }, + { RC_ZR_UNDERWATER_ROCK_3, RAND_INF_ZR_UNDERWATER_ROCK_3 }, + { RC_ZR_UNDERWATER_ROCK_4, RAND_INF_ZR_UNDERWATER_ROCK_4 }, + { RC_DMT_ROCK_1, RAND_INF_DMT_ROCK_1 }, + { RC_DMT_ROCK_2, RAND_INF_DMT_ROCK_2 }, + { RC_DMT_ROCK_3, RAND_INF_DMT_ROCK_3 }, + { RC_DMT_ROCK_4, RAND_INF_DMT_ROCK_4 }, + { RC_DMT_ROCK_5, RAND_INF_DMT_ROCK_5 }, + { RC_DMT_SUMMIT_ROCK, RAND_INF_DMT_SUMMIT_ROCK }, + { RC_DMT_CIRCLE_ROCK_1, RAND_INF_DMT_CIRCLE_ROCK_1 }, + { RC_DMT_CIRCLE_ROCK_2, RAND_INF_DMT_CIRCLE_ROCK_2 }, + { RC_DMT_CIRCLE_ROCK_3, RAND_INF_DMT_CIRCLE_ROCK_3 }, + { RC_DMT_CIRCLE_ROCK_4, RAND_INF_DMT_CIRCLE_ROCK_4 }, + { RC_DMT_CIRCLE_ROCK_5, RAND_INF_DMT_CIRCLE_ROCK_5 }, + { RC_DMT_CIRCLE_ROCK_6, RAND_INF_DMT_CIRCLE_ROCK_6 }, + { RC_DMT_CIRCLE_ROCK_7, RAND_INF_DMT_CIRCLE_ROCK_7 }, + { RC_DMT_CIRCLE_ROCK_8, RAND_INF_DMT_CIRCLE_ROCK_8 }, + { RC_DMT_CHILD_BOULDER, RAND_INF_DMT_CHILD_BOULDER }, + { RC_DMT_BOULDER_1, RAND_INF_DMT_BOULDER_1 }, + { RC_DMT_BOULDER_2, RAND_INF_DMT_BOULDER_2 }, + { RC_DMT_COW_BOULDER, RAND_INF_DMT_COW_BOULDER }, + { RC_DMT_BRONZE_BOULDER_1, RAND_INF_DMT_BRONZE_BOULDER_1 }, + { RC_DMT_BRONZE_BOULDER_2, RAND_INF_DMT_BRONZE_BOULDER_2 }, + { RC_DMT_BRONZE_BOULDER_3, RAND_INF_DMT_BRONZE_BOULDER_3 }, + { RC_DMT_BRONZE_BOULDER_4, RAND_INF_DMT_BRONZE_BOULDER_4 }, + { RC_DMT_BRONZE_BOULDER_5, RAND_INF_DMT_BRONZE_BOULDER_5 }, + { RC_DMT_BRONZE_BOULDER_6, RAND_INF_DMT_BRONZE_BOULDER_6 }, + { RC_DMT_BRONZE_BOULDER_7, RAND_INF_DMT_BRONZE_BOULDER_7 }, + { RC_DMT_BRONZE_BOULDER_8, RAND_INF_DMT_BRONZE_BOULDER_8 }, + { RC_DMT_BRONZE_BOULDER_9, RAND_INF_DMT_BRONZE_BOULDER_9 }, + { RC_DMT_BRONZE_BOULDER_10, RAND_INF_DMT_BRONZE_BOULDER_10 }, + { RC_DMT_BRONZE_BOULDER_11, RAND_INF_DMT_BRONZE_BOULDER_11 }, + { RC_GC_LW_BOULDER_1, RAND_INF_GC_LW_BOULDER_1 }, + { RC_GC_LW_BOULDER_2, RAND_INF_GC_LW_BOULDER_2 }, + { RC_GC_LW_BOULDER_3, RAND_INF_GC_LW_BOULDER_3 }, + { RC_GC_ENTRANCE_BOULDER_1, RAND_INF_GC_ENTRANCE_BOULDER_1 }, + { RC_GC_ENTRANCE_BOULDER_2, RAND_INF_GC_ENTRANCE_BOULDER_2 }, + { RC_GC_ENTRANCE_BOULDER_3, RAND_INF_GC_ENTRANCE_BOULDER_3 }, + { RC_GC_MAZE_SILVER_BOULDER_1, RAND_INF_GC_MAZE_SILVER_BOULDER_1 }, + { RC_GC_MAZE_SILVER_BOULDER_2, RAND_INF_GC_MAZE_SILVER_BOULDER_2 }, + { RC_GC_MAZE_SILVER_BOULDER_3, RAND_INF_GC_MAZE_SILVER_BOULDER_3 }, + { RC_GC_MAZE_SILVER_BOULDER_4, RAND_INF_GC_MAZE_SILVER_BOULDER_4 }, + { RC_GC_MAZE_SILVER_BOULDER_5, RAND_INF_GC_MAZE_SILVER_BOULDER_5 }, + { RC_GC_MAZE_SILVER_BOULDER_6, RAND_INF_GC_MAZE_SILVER_BOULDER_6 }, + { RC_GC_MAZE_SILVER_BOULDER_7, RAND_INF_GC_MAZE_SILVER_BOULDER_7 }, + { RC_GC_MAZE_SILVER_BOULDER_8, RAND_INF_GC_MAZE_SILVER_BOULDER_8 }, + { RC_GC_MAZE_SILVER_BOULDER_9, RAND_INF_GC_MAZE_SILVER_BOULDER_9 }, + { RC_GC_MAZE_SILVER_BOULDER_10, RAND_INF_GC_MAZE_SILVER_BOULDER_10 }, + { RC_GC_MAZE_SILVER_BOULDER_11, RAND_INF_GC_MAZE_SILVER_BOULDER_11 }, + { RC_GC_MAZE_SILVER_BOULDER_12, RAND_INF_GC_MAZE_SILVER_BOULDER_12 }, + { RC_GC_MAZE_SILVER_BOULDER_13, RAND_INF_GC_MAZE_SILVER_BOULDER_13 }, + { RC_GC_MAZE_SILVER_BOULDER_14, RAND_INF_GC_MAZE_SILVER_BOULDER_14 }, + { RC_GC_MAZE_SILVER_BOULDER_15, RAND_INF_GC_MAZE_SILVER_BOULDER_15 }, + { RC_GC_MAZE_SILVER_BOULDER_16, RAND_INF_GC_MAZE_SILVER_BOULDER_16 }, + { RC_GC_MAZE_SILVER_BOULDER_17, RAND_INF_GC_MAZE_SILVER_BOULDER_17 }, + { RC_GC_MAZE_SILVER_BOULDER_18, RAND_INF_GC_MAZE_SILVER_BOULDER_18 }, + { RC_GC_MAZE_SILVER_BOULDER_19, RAND_INF_GC_MAZE_SILVER_BOULDER_19 }, + { RC_GC_MAZE_SILVER_BOULDER_20, RAND_INF_GC_MAZE_SILVER_BOULDER_20 }, + { RC_GC_MAZE_SILVER_BOULDER_21, RAND_INF_GC_MAZE_SILVER_BOULDER_21 }, + { RC_GC_MAZE_SILVER_BOULDER_22, RAND_INF_GC_MAZE_SILVER_BOULDER_22 }, + { RC_GC_MAZE_SILVER_BOULDER_23, RAND_INF_GC_MAZE_SILVER_BOULDER_23 }, + { RC_GC_MAZE_SILVER_BOULDER_24, RAND_INF_GC_MAZE_SILVER_BOULDER_24 }, + { RC_GC_MAZE_SILVER_BOULDER_25, RAND_INF_GC_MAZE_SILVER_BOULDER_25 }, + { RC_GC_MAZE_SILVER_BOULDER_26, RAND_INF_GC_MAZE_SILVER_BOULDER_26 }, + { RC_GC_MAZE_SILVER_BOULDER_27, RAND_INF_GC_MAZE_SILVER_BOULDER_27 }, + { RC_GC_MAZE_SILVER_BOULDER_28, RAND_INF_GC_MAZE_SILVER_BOULDER_28 }, + { RC_GC_MAZE_SILVER_BOULDER_29, RAND_INF_GC_MAZE_SILVER_BOULDER_29 }, + { RC_GC_MAZE_BOULDER_1, RAND_INF_GC_MAZE_BOULDER_1 }, + { RC_GC_MAZE_BOULDER_2, RAND_INF_GC_MAZE_BOULDER_2 }, + { RC_GC_MAZE_BOULDER_3, RAND_INF_GC_MAZE_BOULDER_3 }, + { RC_GC_MAZE_BOULDER_4, RAND_INF_GC_MAZE_BOULDER_4 }, + { RC_GC_MAZE_BOULDER_5, RAND_INF_GC_MAZE_BOULDER_5 }, + { RC_GC_MAZE_BOULDER_6, RAND_INF_GC_MAZE_BOULDER_6 }, + { RC_GC_MAZE_BOULDER_7, RAND_INF_GC_MAZE_BOULDER_7 }, + { RC_GC_MAZE_BOULDER_8, RAND_INF_GC_MAZE_BOULDER_8 }, + { RC_GC_MAZE_BOULDER_9, RAND_INF_GC_MAZE_BOULDER_9 }, + { RC_GC_MAZE_BOULDER_10, RAND_INF_GC_MAZE_BOULDER_10 }, + { RC_GC_MAZE_BRONZE_BOULDER_1, RAND_INF_GC_MAZE_BRONZE_BOULDER_1 }, + { RC_GC_MAZE_BRONZE_BOULDER_2, RAND_INF_GC_MAZE_BRONZE_BOULDER_2 }, + { RC_GC_MAZE_BRONZE_BOULDER_3, RAND_INF_GC_MAZE_BRONZE_BOULDER_3 }, + { RC_GC_MAZE_BRONZE_BOULDER_4, RAND_INF_GC_MAZE_BRONZE_BOULDER_4 }, + { RC_GC_MAZE_BRONZE_BOULDER_5, RAND_INF_GC_MAZE_BRONZE_BOULDER_5 }, + { RC_GC_MAZE_ROCK, RAND_INF_GC_MAZE_ROCK }, + { RC_COLOSSUS_SILVER_BOULDER, RAND_INF_COLOSSUS_SILVER_BOULDER }, + { RC_COLOSSUS_ROCK, RAND_INF_COLOSSUS_ROCK }, + { RC_COLOSSUS_CIRCLE_1_ROCK_1, RAND_INF_COLOSSUS_CIRCLE_1_ROCK_1 }, + { RC_COLOSSUS_CIRCLE_1_ROCK_2, RAND_INF_COLOSSUS_CIRCLE_1_ROCK_2 }, + { RC_COLOSSUS_CIRCLE_1_ROCK_3, RAND_INF_COLOSSUS_CIRCLE_1_ROCK_3 }, + { RC_COLOSSUS_CIRCLE_1_ROCK_4, RAND_INF_COLOSSUS_CIRCLE_1_ROCK_4 }, + { RC_COLOSSUS_CIRCLE_1_ROCK_5, RAND_INF_COLOSSUS_CIRCLE_1_ROCK_5 }, + { RC_COLOSSUS_CIRCLE_1_ROCK_6, RAND_INF_COLOSSUS_CIRCLE_1_ROCK_6 }, + { RC_COLOSSUS_CIRCLE_1_ROCK_7, RAND_INF_COLOSSUS_CIRCLE_1_ROCK_7 }, + { RC_COLOSSUS_CIRCLE_1_ROCK_8, RAND_INF_COLOSSUS_CIRCLE_1_ROCK_8 }, + { RC_COLOSSUS_CIRCLE_2_ROCK_1, RAND_INF_COLOSSUS_CIRCLE_2_ROCK_1 }, + { RC_COLOSSUS_CIRCLE_2_ROCK_2, RAND_INF_COLOSSUS_CIRCLE_2_ROCK_2 }, + { RC_COLOSSUS_CIRCLE_2_ROCK_3, RAND_INF_COLOSSUS_CIRCLE_2_ROCK_3 }, + { RC_COLOSSUS_CIRCLE_2_ROCK_4, RAND_INF_COLOSSUS_CIRCLE_2_ROCK_4 }, + { RC_COLOSSUS_CIRCLE_2_ROCK_5, RAND_INF_COLOSSUS_CIRCLE_2_ROCK_5 }, + { RC_COLOSSUS_CIRCLE_2_ROCK_6, RAND_INF_COLOSSUS_CIRCLE_2_ROCK_6 }, + { RC_COLOSSUS_CIRCLE_2_ROCK_7, RAND_INF_COLOSSUS_CIRCLE_2_ROCK_7 }, + { RC_COLOSSUS_CIRCLE_2_ROCK_8, RAND_INF_COLOSSUS_CIRCLE_2_ROCK_8 }, + { RC_HC_STORMS_GROTTO_ROCK_1, RAND_INF_HC_STORMS_GROTTO_ROCK_1 }, + { RC_HC_STORMS_GROTTO_ROCK_2, RAND_INF_HC_STORMS_GROTTO_ROCK_2 }, + { RC_HC_STORMS_GROTTO_ROCK_3, RAND_INF_HC_STORMS_GROTTO_ROCK_3 }, + { RC_HC_STORMS_GROTTO_ROCK_4, RAND_INF_HC_STORMS_GROTTO_ROCK_4 }, + { RC_HC_STORMS_GROTTO_ROCK_5, RAND_INF_HC_STORMS_GROTTO_ROCK_5 }, + { RC_HC_STORMS_GROTTO_ROCK_6, RAND_INF_HC_STORMS_GROTTO_ROCK_6 }, + { RC_HC_STORMS_GROTTO_ROCK_7, RAND_INF_HC_STORMS_GROTTO_ROCK_7 }, + { RC_HC_STORMS_GROTTO_ROCK_8, RAND_INF_HC_STORMS_GROTTO_ROCK_8 }, + { RC_BOTW_BOULDER_1, RAND_INF_BOTW_BOULDER_1 }, + { RC_BOTW_BOULDER_2, RAND_INF_BOTW_BOULDER_2 }, + { RC_BOTW_BOULDER_3, RAND_INF_BOTW_BOULDER_3 }, + { RC_BOTW_BOULDER_4, RAND_INF_BOTW_BOULDER_4 }, + { RC_BOTW_BOULDER_5, RAND_INF_BOTW_BOULDER_5 }, + { RC_BOTW_BOULDER_6, RAND_INF_BOTW_BOULDER_6 }, + { RC_DEKU_TREE_MQ_BOULDER_1, RAND_INF_DEKU_TREE_MQ_BOULDER_1 }, + { RC_DEKU_TREE_MQ_BOULDER_2, RAND_INF_DEKU_TREE_MQ_BOULDER_2 }, + { RC_DEKU_TREE_MQ_BOULDER_3, RAND_INF_DEKU_TREE_MQ_BOULDER_3 }, + { RC_DODONGOS_CAVERN_MQ_LOBBY_BOULDER_1, RAND_INF_DODONGOS_CAVERN_MQ_LOBBY_BOULDER_1 }, + { RC_DODONGOS_CAVERN_MQ_LOBBY_BOULDER_2, RAND_INF_DODONGOS_CAVERN_MQ_LOBBY_BOULDER_2 }, + { RC_DODONGOS_CAVERN_MQ_MOUTH_SIDE_BRIDGE_BOULDER_1, RAND_INF_DODONGOS_CAVERN_MQ_MOUTH_SIDE_BRIDGE_BOULDER_1 }, + { RC_DODONGOS_CAVERN_MQ_MOUTH_SIDE_BRIDGE_BOULDER_2, RAND_INF_DODONGOS_CAVERN_MQ_MOUTH_SIDE_BRIDGE_BOULDER_2 }, + { RC_DODONGOS_CAVERN_MQ_MOUTH_SIDE_BRIDGE_BOULDER_3, RAND_INF_DODONGOS_CAVERN_MQ_MOUTH_SIDE_BRIDGE_BOULDER_3 }, + { RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_BOULDER_1, RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_BOULDER_1 }, + { RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_BOULDER_2, RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_BOULDER_2 }, + { RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_1, RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_1 }, + { RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_2, RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_2 }, + { RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_3, RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_3 }, + { RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_4, RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_4 }, + { RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_5, RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_5 }, + { RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_6, RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_6 }, + { RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_7, RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_7 }, + { RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_8, RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_8 }, + { RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_9, RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_9 }, + { RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_10, RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_10 }, + { RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_11, RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_11 }, + { RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_12, RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_12 }, + { RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_BOULDER, RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_BOULDER }, + { RC_JABU_JABUS_BELLY_MQ_ENTRANCE_BOULDER, RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_BOULDER }, + { RC_JABU_JABUS_BELLY_MQ_HOLES_ROOM_BOULDER_1, RAND_INF_JABU_JABUS_BELLY_MQ_HOLES_ROOM_BOULDER_1 }, + { RC_JABU_JABUS_BELLY_MQ_HOLES_ROOM_BOULDER_2, RAND_INF_JABU_JABUS_BELLY_MQ_HOLES_ROOM_BOULDER_2 }, + { RC_JABU_JABUS_BELLY_MQ_HOLES_ROOM_WALL_BOULDER_1, RAND_INF_JABU_JABUS_BELLY_MQ_HOLES_ROOM_WALL_BOULDER_1 }, + { RC_JABU_JABUS_BELLY_MQ_HOLES_ROOM_WALL_BOULDER_2, RAND_INF_JABU_JABUS_BELLY_MQ_HOLES_ROOM_WALL_BOULDER_2 }, + { RC_JABU_JABUS_BELLY_MQ_HOLES_ROOM_WALL_BOULDER_3, RAND_INF_JABU_JABUS_BELLY_MQ_HOLES_ROOM_WALL_BOULDER_3 }, + { RC_JABU_JABUS_BELLY_MQ_FORKED_CORRIDOR_BOULDER_1, RAND_INF_JABU_JABUS_BELLY_MQ_FORKED_CORRIDOR_BOULDER_1 }, + { RC_JABU_JABUS_BELLY_MQ_FORKED_CORRIDOR_BOULDER_2, RAND_INF_JABU_JABUS_BELLY_MQ_FORKED_CORRIDOR_BOULDER_2 }, + { RC_JABU_JABUS_BELLY_MQ_TAILPASARAN_BOULDER, RAND_INF_JABU_JABUS_BELLY_MQ_TAILPASARAN_BOULDER }, + { RC_JABU_JABUS_BELLY_MQ_TAILPASARAN_WALL_BOULDER, RAND_INF_JABU_JABUS_BELLY_MQ_TAILPASARAN_WALL_BOULDER }, + { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BOULDER_1, RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_BOULDER_1 }, + { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BOULDER_2, RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_BOULDER_2 }, + { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_EYE_BOULDER, RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_EYE_BOULDER }, + { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_CEILING_BOULDER, RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_CEILING_BOULDER }, + { RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_BOULDER, RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_BOULDER }, + { RC_BOTW_MQ_BOULDER_1, RAND_INF_BOTW_MQ_BOULDER_1 }, + { RC_BOTW_MQ_BOULDER_2, RAND_INF_BOTW_MQ_BOULDER_2 }, + { RC_BOTW_MQ_BOULDER_3, RAND_INF_BOTW_MQ_BOULDER_3 }, { RC_MARKET_TREE, RAND_INF_MARKET_TREE }, { RC_HC_NEAR_GUARDS_TREE_1, RAND_INF_HC_NEAR_GUARDS_TREE_1 }, { RC_HC_NEAR_GUARDS_TREE_2, RAND_INF_HC_NEAR_GUARDS_TREE_2 }, @@ -3504,7 +3785,7 @@ std::map rcToRandomizerInf = { }; CheckIdentity Randomizer::IdentifyBeehive(s32 sceneNum, s16 xPosition, s32 respawnData) { - struct CheckIdentity beehiveIdentity; + CheckIdentity beehiveIdentity; beehiveIdentity.randomizerInf = RAND_INF_MAX; beehiveIdentity.randomizerCheck = RC_UNKNOWN_CHECK; @@ -3526,7 +3807,6 @@ CheckIdentity Randomizer::IdentifyBeehive(s32 sceneNum, s16 xPosition, s32 respa } Rando::Location* Randomizer::GetCheckObjectFromActor(s16 actorId, s16 sceneNum, s32 actorParams = 0x00) { - auto fs = OTRGlobals::Instance->gRandoContext->GetFishsanity(); RandomizerCheck specialRc = RC_UNKNOWN_CHECK; // TODO: Migrate these special cases into table, or at least document why they are special switch (sceneNum) { @@ -3750,7 +4030,7 @@ ShopItemIdentity Randomizer::IdentifyShopItem(s32 sceneNum, u8 slotIndex) { } CheckIdentity Randomizer::IdentifyCow(s32 sceneNum, s32 posX, s32 posZ) { - struct CheckIdentity cowIdentity; + CheckIdentity cowIdentity; cowIdentity.randomizerInf = RAND_INF_MAX; cowIdentity.randomizerCheck = RC_UNKNOWN_CHECK; @@ -3772,7 +4052,7 @@ CheckIdentity Randomizer::IdentifyCow(s32 sceneNum, s32 posX, s32 posZ) { } CheckIdentity Randomizer::IdentifyPot(s32 sceneNum, s32 posX, s32 posZ) { - struct CheckIdentity potIdentity; + CheckIdentity potIdentity; uint32_t potSceneNum = sceneNum; if (sceneNum == SCENE_GANONDORF_BOSS) { @@ -3797,7 +4077,7 @@ CheckIdentity Randomizer::IdentifyPot(s32 sceneNum, s32 posX, s32 posZ) { } CheckIdentity Randomizer::IdentifyFish(s32 sceneNum, s32 actorParams) { - struct CheckIdentity fishIdentity; + CheckIdentity fishIdentity; fishIdentity.randomizerInf = RAND_INF_MAX; fishIdentity.randomizerCheck = RC_UNKNOWN_CHECK; @@ -3818,7 +4098,7 @@ CheckIdentity Randomizer::IdentifyFish(s32 sceneNum, s32 actorParams) { } CheckIdentity Randomizer::IdentifyGrass(s32 sceneNum, s32 posX, s32 posZ, s32 respawnData, s32 linkAge) { - struct CheckIdentity grassIdentity; + CheckIdentity grassIdentity; grassIdentity.randomizerInf = RAND_INF_MAX; grassIdentity.randomizerCheck = RC_UNKNOWN_CHECK; @@ -3880,7 +4160,7 @@ CheckIdentity Randomizer::IdentifyGrass(s32 sceneNum, s32 posX, s32 posZ, s32 re } CheckIdentity Randomizer::IdentifyCrate(s32 sceneNum, s32 posX, s32 posZ) { - struct CheckIdentity crateIdentity; + CheckIdentity crateIdentity; uint32_t crateSceneNum = sceneNum; // pretend night is day to align crates in market and align GF child/adult crates @@ -3913,7 +4193,7 @@ CheckIdentity Randomizer::IdentifyCrate(s32 sceneNum, s32 posX, s32 posZ) { } CheckIdentity Randomizer::IdentifySmallCrate(s32 sceneNum, s32 posX, s32 posZ) { - struct CheckIdentity smallCrateIdentity; + CheckIdentity smallCrateIdentity; uint32_t smallCrateSceneNum = sceneNum; smallCrateIdentity.randomizerInf = RAND_INF_MAX; @@ -3934,8 +4214,26 @@ CheckIdentity Randomizer::IdentifySmallCrate(s32 sceneNum, s32 posX, s32 posZ) { return smallCrateIdentity; } +CheckIdentity Randomizer::IdentifyRock(s32 sceneNum, s32 posX, s32 posZ) { + CheckIdentity rockIdentity; + + rockIdentity.randomizerInf = RAND_INF_MAX; + rockIdentity.randomizerCheck = RC_UNKNOWN_CHECK; + + Rando::Location* location = GetCheckObjectFromActor(ACTOR_EN_ISHI, sceneNum, TWO_ACTOR_PARAMS(posX, posZ)); + + if (location->GetRandomizerCheck() != RC_UNKNOWN_CHECK) { + rockIdentity.randomizerInf = rcToRandomizerInf[location->GetRandomizerCheck()]; + rockIdentity.randomizerCheck = location->GetRandomizerCheck(); + } else { + LUSLOG_WARN("IdentifyRock did not receive a valid RC value %d,%d.", posX, posZ); + } + + return rockIdentity; +} + CheckIdentity Randomizer::IdentifyTree(s32 sceneNum, s32 posX, s32 posZ) { - struct CheckIdentity treeIdentity; + CheckIdentity treeIdentity; if (sceneNum == SCENE_MARKET_NIGHT) { sceneNum = SCENE_MARKET_DAY; @@ -3956,7 +4254,7 @@ CheckIdentity Randomizer::IdentifyTree(s32 sceneNum, s32 posX, s32 posZ) { } CheckIdentity Randomizer::IdentifySign(s32 sceneNum, s32 posX, s32 posZ, s32 id) { - struct CheckIdentity signIdentity; + CheckIdentity signIdentity; uint32_t signSceneNum = sceneNum; Rando::Location* location = nullptr; @@ -4015,7 +4313,7 @@ CheckIdentity Randomizer::IdentifySign(s32 sceneNum, s32 posX, s32 posZ, s32 id) } CheckIdentity Randomizer::IdentifyWonderItem(s32 sceneNum, s32 par1, s32 par2) { - struct CheckIdentity wonderIdentity; + CheckIdentity wonderIdentity; uint32_t wonderSceneNum = sceneNum; // align oasis trees in colossus between child/adult diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h index 0395caa4a8..1bc6dcadd1 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.h +++ b/soh/soh/Enhancements/randomizer/randomizer.h @@ -42,6 +42,7 @@ class Randomizer { CheckIdentity IdentifyGrass(s32 sceneNum, s32 posX, s32 posZ, s32 respawnData, s32 linkAge); CheckIdentity IdentifyCrate(s32 sceneNum, s32 posX, s32 posZ); CheckIdentity IdentifySmallCrate(s32 sceneNum, s32 posX, s32 posZ); + CheckIdentity IdentifyRock(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); diff --git a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerCheck.h b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerCheck.h index 535eba5f22..90d7d39451 100644 --- a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerCheck.h +++ b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerCheck.h @@ -1563,6 +1563,294 @@ RANDO_ENUM_ITEM(RC_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE) RANDO_ENUM_ITEM(RC_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE) // End Crates +// Start Rocks +RANDO_ENUM_ITEM(RC_KF_CIRCLE_ROCK_1) +RANDO_ENUM_ITEM(RC_KF_CIRCLE_ROCK_2) +RANDO_ENUM_ITEM(RC_KF_CIRCLE_ROCK_3) +RANDO_ENUM_ITEM(RC_KF_CIRCLE_ROCK_4) +RANDO_ENUM_ITEM(RC_KF_CIRCLE_ROCK_5) +RANDO_ENUM_ITEM(RC_KF_CIRCLE_ROCK_6) +RANDO_ENUM_ITEM(RC_KF_CIRCLE_ROCK_7) +RANDO_ENUM_ITEM(RC_KF_CIRCLE_ROCK_8) +RANDO_ENUM_ITEM(RC_KF_ROCK_BY_SARIAS_HOUSE) +RANDO_ENUM_ITEM(RC_KF_ROCK_BEHIND_SARIAS_HOUSE) +RANDO_ENUM_ITEM(RC_KF_ROCK_BY_MIDOS_HOUSE) +RANDO_ENUM_ITEM(RC_KF_ROCK_BY_KNOW_IT_ALLS_HOUSE) +RANDO_ENUM_ITEM(RC_LW_BOULDER_BY_GORON_CITY) +RANDO_ENUM_ITEM(RC_LW_BOULDER_BY_SACRED_FOREST_MEADOW) +RANDO_ENUM_ITEM(RC_LW_RUPEE_BOULDER) +RANDO_ENUM_ITEM(RC_HC_ROCK_1) +RANDO_ENUM_ITEM(RC_HC_ROCK_2) +RANDO_ENUM_ITEM(RC_HC_ROCK_3) +RANDO_ENUM_ITEM(RC_HC_BOULDER) +RANDO_ENUM_ITEM(RC_OGC_BRONZE_BOULDER_1) +RANDO_ENUM_ITEM(RC_OGC_BRONZE_BOULDER_2) +RANDO_ENUM_ITEM(RC_OGC_BRONZE_BOULDER_3) +RANDO_ENUM_ITEM(RC_OGC_SILVER_BOULDER_1) +RANDO_ENUM_ITEM(RC_OGC_SILVER_BOULDER_2) +RANDO_ENUM_ITEM(RC_OGC_SILVER_BOULDER_3) +RANDO_ENUM_ITEM(RC_OGC_SILVER_BOULDER_4) +RANDO_ENUM_ITEM(RC_DMC_CIRCLE_ROCK_1) +RANDO_ENUM_ITEM(RC_DMC_CIRCLE_ROCK_2) +RANDO_ENUM_ITEM(RC_DMC_CIRCLE_ROCK_3) +RANDO_ENUM_ITEM(RC_DMC_CIRCLE_ROCK_4) +RANDO_ENUM_ITEM(RC_DMC_CIRCLE_ROCK_5) +RANDO_ENUM_ITEM(RC_DMC_CIRCLE_ROCK_6) +RANDO_ENUM_ITEM(RC_DMC_CIRCLE_ROCK_7) +RANDO_ENUM_ITEM(RC_DMC_CIRCLE_ROCK_8) +RANDO_ENUM_ITEM(RC_DMC_ROCK_BY_FIRE_TEMPLE_1) +RANDO_ENUM_ITEM(RC_DMC_ROCK_BY_FIRE_TEMPLE_2) +RANDO_ENUM_ITEM(RC_DMC_ROCK_BY_FIRE_TEMPLE_3) +RANDO_ENUM_ITEM(RC_DMC_ROCK_BY_FIRE_TEMPLE_4) +RANDO_ENUM_ITEM(RC_DMC_ROCK_BY_FIRE_TEMPLE_5) +RANDO_ENUM_ITEM(RC_DMC_GOSSIP_ROCK_1) +RANDO_ENUM_ITEM(RC_DMC_GOSSIP_ROCK_2) +RANDO_ENUM_ITEM(RC_DMC_BOULDER_1) +RANDO_ENUM_ITEM(RC_DMC_BOULDER_2) +RANDO_ENUM_ITEM(RC_DMC_BOULDER_3) +RANDO_ENUM_ITEM(RC_DMC_BRONZE_BOULDER_1) +RANDO_ENUM_ITEM(RC_DMC_BRONZE_BOULDER_2) +RANDO_ENUM_ITEM(RC_DMC_BRONZE_BOULDER_3) +RANDO_ENUM_ITEM(RC_DMC_BRONZE_BOULDER_SHORTCUT) +RANDO_ENUM_ITEM(RC_GV_SILVER_BOULDER) +RANDO_ENUM_ITEM(RC_GV_ROCK_1) +RANDO_ENUM_ITEM(RC_GV_ROCK_2) +RANDO_ENUM_ITEM(RC_GV_ROCK_3) +RANDO_ENUM_ITEM(RC_GV_UNDERWATER_ROCK_1) +RANDO_ENUM_ITEM(RC_GV_UNDERWATER_ROCK_2) +RANDO_ENUM_ITEM(RC_GV_UNDERWATER_ROCK_3) +RANDO_ENUM_ITEM(RC_GV_ROCK_ACROSS_BRIDGE_1) +RANDO_ENUM_ITEM(RC_GV_ROCK_ACROSS_BRIDGE_2) +RANDO_ENUM_ITEM(RC_GV_ROCK_ACROSS_BRIDGE_3) +RANDO_ENUM_ITEM(RC_GV_ROCK_ACROSS_BRIDGE_4) +RANDO_ENUM_ITEM(RC_GV_BOULDER_1) +RANDO_ENUM_ITEM(RC_GV_BOULDER_2) +RANDO_ENUM_ITEM(RC_GV_BOULDER_ACROSS_BRIDGE) +RANDO_ENUM_ITEM(RC_GV_BRONZE_BOULDER_1) +RANDO_ENUM_ITEM(RC_GV_BRONZE_BOULDER_2) +RANDO_ENUM_ITEM(RC_GV_BRONZE_BOULDER_ACROSS_BRIDGE_1) +RANDO_ENUM_ITEM(RC_GV_BRONZE_BOULDER_ACROSS_BRIDGE_2) +RANDO_ENUM_ITEM(RC_GV_BRONZE_BOULDER_ACROSS_BRIDGE_3) +RANDO_ENUM_ITEM(RC_GV_BRONZE_BOULDER_ACROSS_BRIDGE_4) +RANDO_ENUM_ITEM(RC_GV_BRONZE_BOULDER_ACROSS_BRIDGE_5) +RANDO_ENUM_ITEM(RC_GV_BRONZE_BOULDER_ACROSS_BRIDGE_6) +RANDO_ENUM_ITEM(RC_HF_SILVER_BOULDER) +RANDO_ENUM_ITEM(RC_HF_ROCK_1) +RANDO_ENUM_ITEM(RC_HF_ROCK_2) +RANDO_ENUM_ITEM(RC_HF_ROCK_3) +RANDO_ENUM_ITEM(RC_HF_ROCK_4) +RANDO_ENUM_ITEM(RC_HF_ROCK_5) +RANDO_ENUM_ITEM(RC_HF_ROCK_6) +RANDO_ENUM_ITEM(RC_HF_ROCK_7) +RANDO_ENUM_ITEM(RC_HF_ROCK_8) +RANDO_ENUM_ITEM(RC_HF_BOULDER_NORTH) +RANDO_ENUM_ITEM(RC_HF_BOULDER_BY_MARKET) +RANDO_ENUM_ITEM(RC_HF_BOULDER_SOUTH) +RANDO_ENUM_ITEM(RC_HF_BRONZE_BOULDER_1) +RANDO_ENUM_ITEM(RC_HF_BRONZE_BOULDER_2) +RANDO_ENUM_ITEM(RC_HF_BRONZE_BOULDER_3) +RANDO_ENUM_ITEM(RC_HF_BRONZE_BOULDER_4) +RANDO_ENUM_ITEM(RC_KAK_SILVER_BOULDER) +RANDO_ENUM_ITEM(RC_KAK_ROCK_1) +RANDO_ENUM_ITEM(RC_KAK_ROCK_2) +RANDO_ENUM_ITEM(RC_GY_ROCK) +RANDO_ENUM_ITEM(RC_LH_ROCK) +RANDO_ENUM_ITEM(RC_ZD_CIRCLE_ROCK_1) +RANDO_ENUM_ITEM(RC_ZD_CIRCLE_ROCK_2) +RANDO_ENUM_ITEM(RC_ZD_CIRCLE_ROCK_3) +RANDO_ENUM_ITEM(RC_ZD_CIRCLE_ROCK_4) +RANDO_ENUM_ITEM(RC_ZD_CIRCLE_ROCK_5) +RANDO_ENUM_ITEM(RC_ZD_CIRCLE_ROCK_6) +RANDO_ENUM_ITEM(RC_ZD_CIRCLE_ROCK_7) +RANDO_ENUM_ITEM(RC_ZD_CIRCLE_ROCK_8) +RANDO_ENUM_ITEM(RC_ZF_BOULDER) +RANDO_ENUM_ITEM(RC_ZF_SILVER_BOULDER) +RANDO_ENUM_ITEM(RC_ZF_UNDERGROUND_BOULDER) +RANDO_ENUM_ITEM(RC_ZR_BOULDER_1) +RANDO_ENUM_ITEM(RC_ZR_BOULDER_2) +RANDO_ENUM_ITEM(RC_ZR_BOULDER_3) +RANDO_ENUM_ITEM(RC_ZR_BOULDER_4) +RANDO_ENUM_ITEM(RC_ZR_CIRCLE_ROCK_1) +RANDO_ENUM_ITEM(RC_ZR_CIRCLE_ROCK_2) +RANDO_ENUM_ITEM(RC_ZR_CIRCLE_ROCK_3) +RANDO_ENUM_ITEM(RC_ZR_CIRCLE_ROCK_4) +RANDO_ENUM_ITEM(RC_ZR_CIRCLE_ROCK_5) +RANDO_ENUM_ITEM(RC_ZR_CIRCLE_ROCK_6) +RANDO_ENUM_ITEM(RC_ZR_CIRCLE_ROCK_7) +RANDO_ENUM_ITEM(RC_ZR_CIRCLE_ROCK_8) +RANDO_ENUM_ITEM(RC_ZR_UPPER_CIRCLE_BOULDER) +RANDO_ENUM_ITEM(RC_ZR_UPPER_CIRCLE_ROCK_1) +RANDO_ENUM_ITEM(RC_ZR_UPPER_CIRCLE_ROCK_2) +RANDO_ENUM_ITEM(RC_ZR_UPPER_CIRCLE_ROCK_3) +RANDO_ENUM_ITEM(RC_ZR_UPPER_CIRCLE_ROCK_4) +RANDO_ENUM_ITEM(RC_ZR_UPPER_CIRCLE_ROCK_5) +RANDO_ENUM_ITEM(RC_ZR_UPPER_CIRCLE_ROCK_6) +RANDO_ENUM_ITEM(RC_ZR_UPPER_CIRCLE_ROCK_7) +RANDO_ENUM_ITEM(RC_ZR_UPPER_CIRCLE_ROCK_8) +RANDO_ENUM_ITEM(RC_ZR_ROCK) +RANDO_ENUM_ITEM(RC_ZR_UNDERWATER_ROCK_1) +RANDO_ENUM_ITEM(RC_ZR_UNDERWATER_ROCK_2) +RANDO_ENUM_ITEM(RC_ZR_UNDERWATER_ROCK_3) +RANDO_ENUM_ITEM(RC_ZR_UNDERWATER_ROCK_4) +RANDO_ENUM_ITEM(RC_DMT_ROCK_1) +RANDO_ENUM_ITEM(RC_DMT_ROCK_2) +RANDO_ENUM_ITEM(RC_DMT_ROCK_3) +RANDO_ENUM_ITEM(RC_DMT_ROCK_4) +RANDO_ENUM_ITEM(RC_DMT_ROCK_5) +RANDO_ENUM_ITEM(RC_DMT_SUMMIT_ROCK) +RANDO_ENUM_ITEM(RC_DMT_CIRCLE_ROCK_1) +RANDO_ENUM_ITEM(RC_DMT_CIRCLE_ROCK_2) +RANDO_ENUM_ITEM(RC_DMT_CIRCLE_ROCK_3) +RANDO_ENUM_ITEM(RC_DMT_CIRCLE_ROCK_4) +RANDO_ENUM_ITEM(RC_DMT_CIRCLE_ROCK_5) +RANDO_ENUM_ITEM(RC_DMT_CIRCLE_ROCK_6) +RANDO_ENUM_ITEM(RC_DMT_CIRCLE_ROCK_7) +RANDO_ENUM_ITEM(RC_DMT_CIRCLE_ROCK_8) +RANDO_ENUM_ITEM(RC_DMT_CHILD_BOULDER) +RANDO_ENUM_ITEM(RC_DMT_BOULDER_1) +RANDO_ENUM_ITEM(RC_DMT_BOULDER_2) +RANDO_ENUM_ITEM(RC_DMT_COW_BOULDER) +RANDO_ENUM_ITEM(RC_DMT_BRONZE_BOULDER_1) +RANDO_ENUM_ITEM(RC_DMT_BRONZE_BOULDER_2) +RANDO_ENUM_ITEM(RC_DMT_BRONZE_BOULDER_3) +RANDO_ENUM_ITEM(RC_DMT_BRONZE_BOULDER_4) +RANDO_ENUM_ITEM(RC_DMT_BRONZE_BOULDER_5) +RANDO_ENUM_ITEM(RC_DMT_BRONZE_BOULDER_6) +RANDO_ENUM_ITEM(RC_DMT_BRONZE_BOULDER_7) +RANDO_ENUM_ITEM(RC_DMT_BRONZE_BOULDER_8) +RANDO_ENUM_ITEM(RC_DMT_BRONZE_BOULDER_9) +RANDO_ENUM_ITEM(RC_DMT_BRONZE_BOULDER_10) +RANDO_ENUM_ITEM(RC_DMT_BRONZE_BOULDER_11) +RANDO_ENUM_ITEM(RC_GC_LW_BOULDER_1) +RANDO_ENUM_ITEM(RC_GC_LW_BOULDER_2) +RANDO_ENUM_ITEM(RC_GC_LW_BOULDER_3) +RANDO_ENUM_ITEM(RC_GC_ENTRANCE_BOULDER_1) +RANDO_ENUM_ITEM(RC_GC_ENTRANCE_BOULDER_2) +RANDO_ENUM_ITEM(RC_GC_ENTRANCE_BOULDER_3) +RANDO_ENUM_ITEM(RC_GC_MAZE_SILVER_BOULDER_1) +RANDO_ENUM_ITEM(RC_GC_MAZE_SILVER_BOULDER_2) +RANDO_ENUM_ITEM(RC_GC_MAZE_SILVER_BOULDER_3) +RANDO_ENUM_ITEM(RC_GC_MAZE_SILVER_BOULDER_4) +RANDO_ENUM_ITEM(RC_GC_MAZE_SILVER_BOULDER_5) +RANDO_ENUM_ITEM(RC_GC_MAZE_SILVER_BOULDER_6) +RANDO_ENUM_ITEM(RC_GC_MAZE_SILVER_BOULDER_7) +RANDO_ENUM_ITEM(RC_GC_MAZE_SILVER_BOULDER_8) +RANDO_ENUM_ITEM(RC_GC_MAZE_SILVER_BOULDER_9) +RANDO_ENUM_ITEM(RC_GC_MAZE_SILVER_BOULDER_10) +RANDO_ENUM_ITEM(RC_GC_MAZE_SILVER_BOULDER_11) +RANDO_ENUM_ITEM(RC_GC_MAZE_SILVER_BOULDER_12) +RANDO_ENUM_ITEM(RC_GC_MAZE_SILVER_BOULDER_13) +RANDO_ENUM_ITEM(RC_GC_MAZE_SILVER_BOULDER_14) +RANDO_ENUM_ITEM(RC_GC_MAZE_SILVER_BOULDER_15) +RANDO_ENUM_ITEM(RC_GC_MAZE_SILVER_BOULDER_16) +RANDO_ENUM_ITEM(RC_GC_MAZE_SILVER_BOULDER_17) +RANDO_ENUM_ITEM(RC_GC_MAZE_SILVER_BOULDER_18) +RANDO_ENUM_ITEM(RC_GC_MAZE_SILVER_BOULDER_19) +RANDO_ENUM_ITEM(RC_GC_MAZE_SILVER_BOULDER_20) +RANDO_ENUM_ITEM(RC_GC_MAZE_SILVER_BOULDER_21) +RANDO_ENUM_ITEM(RC_GC_MAZE_SILVER_BOULDER_22) +RANDO_ENUM_ITEM(RC_GC_MAZE_SILVER_BOULDER_23) +RANDO_ENUM_ITEM(RC_GC_MAZE_SILVER_BOULDER_24) +RANDO_ENUM_ITEM(RC_GC_MAZE_SILVER_BOULDER_25) +RANDO_ENUM_ITEM(RC_GC_MAZE_SILVER_BOULDER_26) +RANDO_ENUM_ITEM(RC_GC_MAZE_SILVER_BOULDER_27) +RANDO_ENUM_ITEM(RC_GC_MAZE_SILVER_BOULDER_28) +RANDO_ENUM_ITEM(RC_GC_MAZE_SILVER_BOULDER_29) +RANDO_ENUM_ITEM(RC_GC_MAZE_BOULDER_1) +RANDO_ENUM_ITEM(RC_GC_MAZE_BOULDER_2) +RANDO_ENUM_ITEM(RC_GC_MAZE_BOULDER_3) +RANDO_ENUM_ITEM(RC_GC_MAZE_BOULDER_4) +RANDO_ENUM_ITEM(RC_GC_MAZE_BOULDER_5) +RANDO_ENUM_ITEM(RC_GC_MAZE_BOULDER_6) +RANDO_ENUM_ITEM(RC_GC_MAZE_BOULDER_7) +RANDO_ENUM_ITEM(RC_GC_MAZE_BOULDER_8) +RANDO_ENUM_ITEM(RC_GC_MAZE_BOULDER_9) +RANDO_ENUM_ITEM(RC_GC_MAZE_BOULDER_10) +RANDO_ENUM_ITEM(RC_GC_MAZE_BRONZE_BOULDER_1) +RANDO_ENUM_ITEM(RC_GC_MAZE_BRONZE_BOULDER_2) +RANDO_ENUM_ITEM(RC_GC_MAZE_BRONZE_BOULDER_3) +RANDO_ENUM_ITEM(RC_GC_MAZE_BRONZE_BOULDER_4) +RANDO_ENUM_ITEM(RC_GC_MAZE_BRONZE_BOULDER_5) +RANDO_ENUM_ITEM(RC_GC_MAZE_ROCK) +RANDO_ENUM_ITEM(RC_COLOSSUS_SILVER_BOULDER) +RANDO_ENUM_ITEM(RC_COLOSSUS_ROCK) +RANDO_ENUM_ITEM(RC_COLOSSUS_CIRCLE_1_ROCK_1) +RANDO_ENUM_ITEM(RC_COLOSSUS_CIRCLE_1_ROCK_2) +RANDO_ENUM_ITEM(RC_COLOSSUS_CIRCLE_1_ROCK_3) +RANDO_ENUM_ITEM(RC_COLOSSUS_CIRCLE_1_ROCK_4) +RANDO_ENUM_ITEM(RC_COLOSSUS_CIRCLE_1_ROCK_5) +RANDO_ENUM_ITEM(RC_COLOSSUS_CIRCLE_1_ROCK_6) +RANDO_ENUM_ITEM(RC_COLOSSUS_CIRCLE_1_ROCK_7) +RANDO_ENUM_ITEM(RC_COLOSSUS_CIRCLE_1_ROCK_8) +RANDO_ENUM_ITEM(RC_COLOSSUS_CIRCLE_2_ROCK_1) +RANDO_ENUM_ITEM(RC_COLOSSUS_CIRCLE_2_ROCK_2) +RANDO_ENUM_ITEM(RC_COLOSSUS_CIRCLE_2_ROCK_3) +RANDO_ENUM_ITEM(RC_COLOSSUS_CIRCLE_2_ROCK_4) +RANDO_ENUM_ITEM(RC_COLOSSUS_CIRCLE_2_ROCK_5) +RANDO_ENUM_ITEM(RC_COLOSSUS_CIRCLE_2_ROCK_6) +RANDO_ENUM_ITEM(RC_COLOSSUS_CIRCLE_2_ROCK_7) +RANDO_ENUM_ITEM(RC_COLOSSUS_CIRCLE_2_ROCK_8) +RANDO_ENUM_ITEM(RC_HC_STORMS_GROTTO_ROCK_1) +RANDO_ENUM_ITEM(RC_HC_STORMS_GROTTO_ROCK_2) +RANDO_ENUM_ITEM(RC_HC_STORMS_GROTTO_ROCK_3) +RANDO_ENUM_ITEM(RC_HC_STORMS_GROTTO_ROCK_4) +RANDO_ENUM_ITEM(RC_HC_STORMS_GROTTO_ROCK_5) +RANDO_ENUM_ITEM(RC_HC_STORMS_GROTTO_ROCK_6) +RANDO_ENUM_ITEM(RC_HC_STORMS_GROTTO_ROCK_7) +RANDO_ENUM_ITEM(RC_HC_STORMS_GROTTO_ROCK_8) +RANDO_ENUM_ITEM(RC_BOTW_BOULDER_1) +RANDO_ENUM_ITEM(RC_BOTW_BOULDER_2) +RANDO_ENUM_ITEM(RC_BOTW_BOULDER_3) +RANDO_ENUM_ITEM(RC_BOTW_BOULDER_4) +RANDO_ENUM_ITEM(RC_BOTW_BOULDER_5) +RANDO_ENUM_ITEM(RC_BOTW_BOULDER_6) +RANDO_ENUM_ITEM(RC_DEKU_TREE_MQ_BOULDER_1) +RANDO_ENUM_ITEM(RC_DEKU_TREE_MQ_BOULDER_2) +RANDO_ENUM_ITEM(RC_DEKU_TREE_MQ_BOULDER_3) +RANDO_ENUM_ITEM(RC_DODONGOS_CAVERN_MQ_LOBBY_BOULDER_1) +RANDO_ENUM_ITEM(RC_DODONGOS_CAVERN_MQ_LOBBY_BOULDER_2) +RANDO_ENUM_ITEM(RC_DODONGOS_CAVERN_MQ_MOUTH_SIDE_BRIDGE_BOULDER_1) +RANDO_ENUM_ITEM(RC_DODONGOS_CAVERN_MQ_MOUTH_SIDE_BRIDGE_BOULDER_2) +RANDO_ENUM_ITEM(RC_DODONGOS_CAVERN_MQ_MOUTH_SIDE_BRIDGE_BOULDER_3) +RANDO_ENUM_ITEM(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_BOULDER_1) +RANDO_ENUM_ITEM(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_BOULDER_2) +RANDO_ENUM_ITEM(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_1) +RANDO_ENUM_ITEM(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_2) +RANDO_ENUM_ITEM(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_3) +RANDO_ENUM_ITEM(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_4) +RANDO_ENUM_ITEM(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_5) +RANDO_ENUM_ITEM(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_6) +RANDO_ENUM_ITEM(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_7) +RANDO_ENUM_ITEM(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_8) +RANDO_ENUM_ITEM(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_9) +RANDO_ENUM_ITEM(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_10) +RANDO_ENUM_ITEM(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_11) +RANDO_ENUM_ITEM(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_12) +RANDO_ENUM_ITEM(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_BOULDER) +RANDO_ENUM_ITEM(RC_JABU_JABUS_BELLY_MQ_ENTRANCE_BOULDER) +RANDO_ENUM_ITEM(RC_JABU_JABUS_BELLY_MQ_HOLES_ROOM_BOULDER_1) +RANDO_ENUM_ITEM(RC_JABU_JABUS_BELLY_MQ_HOLES_ROOM_BOULDER_2) +RANDO_ENUM_ITEM(RC_JABU_JABUS_BELLY_MQ_HOLES_ROOM_WALL_BOULDER_1) +RANDO_ENUM_ITEM(RC_JABU_JABUS_BELLY_MQ_HOLES_ROOM_WALL_BOULDER_2) +RANDO_ENUM_ITEM(RC_JABU_JABUS_BELLY_MQ_HOLES_ROOM_WALL_BOULDER_3) +RANDO_ENUM_ITEM(RC_JABU_JABUS_BELLY_MQ_FORKED_CORRIDOR_BOULDER_1) +RANDO_ENUM_ITEM(RC_JABU_JABUS_BELLY_MQ_FORKED_CORRIDOR_BOULDER_2) +RANDO_ENUM_ITEM(RC_JABU_JABUS_BELLY_MQ_TAILPASARAN_BOULDER) +RANDO_ENUM_ITEM(RC_JABU_JABUS_BELLY_MQ_TAILPASARAN_WALL_BOULDER) +RANDO_ENUM_ITEM(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BOULDER_1) +RANDO_ENUM_ITEM(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BOULDER_2) +RANDO_ENUM_ITEM(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_EYE_BOULDER) +RANDO_ENUM_ITEM(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_CEILING_BOULDER) +RANDO_ENUM_ITEM(RC_SPIRIT_TEMPLE_MQ_CRAWLSPACE_BOULDER) +RANDO_ENUM_ITEM(RC_SPIRIT_TEMPLE_MQ_GIBDO_BOULDER) +RANDO_ENUM_ITEM(RC_SPIRIT_TEMPLE_MQ_GIBDO_BOULDER_LOW) +RANDO_ENUM_ITEM(RC_SPIRIT_TEMPLE_MQ_GIBDO_BOULDER_HIGH) +RANDO_ENUM_ITEM(RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_BOULDER) +RANDO_ENUM_ITEM(RC_BOTW_MQ_BOULDER_1) +RANDO_ENUM_ITEM(RC_BOTW_MQ_BOULDER_2) +RANDO_ENUM_ITEM(RC_BOTW_MQ_BOULDER_3) +// End Rocks + // Start Trees RANDO_ENUM_ITEM(RC_MARKET_TREE) RANDO_ENUM_ITEM(RC_HC_NEAR_GUARDS_TREE_1) diff --git a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerHintTextKey.h b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerHintTextKey.h index 065b6d2f5b..75c70674bb 100644 --- a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerHintTextKey.h +++ b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerHintTextKey.h @@ -1580,6 +1580,48 @@ RANDO_ENUM_ITEM(RHT_DEKU_TREE_GRASS) RANDO_ENUM_ITEM(RHT_DODONGOS_CAVERN_GRASS) RANDO_ENUM_ITEM(RHT_BOTTOM_OF_THE_WELL_GRASS) RANDO_ENUM_ITEM(RHT_JABU_JABUS_BELLY_GRASS) +// ROCKS +RANDO_ENUM_ITEM(RHT_KF_ROCK) +RANDO_ENUM_ITEM(RHT_LW_BOULDER) +RANDO_ENUM_ITEM(RHT_HC_ROCK) +RANDO_ENUM_ITEM(RHT_HC_BOULDER) +RANDO_ENUM_ITEM(RHT_OGC_BRONZE_BOULDER) +RANDO_ENUM_ITEM(RHT_OGC_SILVER_BOULDER) +RANDO_ENUM_ITEM(RHT_DMC_ROCK) +RANDO_ENUM_ITEM(RHT_DMC_BOULDER) +RANDO_ENUM_ITEM(RHT_DMC_BRONZE_BOULDER) +RANDO_ENUM_ITEM(RHT_GV_SILVER_BOULDER) +RANDO_ENUM_ITEM(RHT_GV_ROCK) +RANDO_ENUM_ITEM(RHT_GV_BOULDER) +RANDO_ENUM_ITEM(RHT_GV_BRONZE_BOULDER) +RANDO_ENUM_ITEM(RHT_HF_SILVER_BOULDER) +RANDO_ENUM_ITEM(RHT_HF_ROCK) +RANDO_ENUM_ITEM(RHT_HF_BOULDER) +RANDO_ENUM_ITEM(RHT_HF_BRONZE_BOULDER) +RANDO_ENUM_ITEM(RHT_KAK_SILVER_BOULDER) +RANDO_ENUM_ITEM(RHT_KAK_ROCK) +RANDO_ENUM_ITEM(RHT_GY_ROCK) +RANDO_ENUM_ITEM(RHT_LH_ROCK) +RANDO_ENUM_ITEM(RHT_ZD_ROCK) +RANDO_ENUM_ITEM(RHT_ZF_BOULDER) +RANDO_ENUM_ITEM(RHT_ZF_SILVER_BOULDER) +RANDO_ENUM_ITEM(RHT_ZR_BOULDER) +RANDO_ENUM_ITEM(RHT_ZR_ROCK) +RANDO_ENUM_ITEM(RHT_DMT_ROCK) +RANDO_ENUM_ITEM(RHT_DMT_BOULDER) +RANDO_ENUM_ITEM(RHT_DMT_BRONZE_BOULDER) +RANDO_ENUM_ITEM(RHT_GC_BOULDER) +RANDO_ENUM_ITEM(RHT_GC_SILVER_BOULDER) +RANDO_ENUM_ITEM(RHT_GC_BRONZE_BOULDER) +RANDO_ENUM_ITEM(RHT_GC_ROCK) +RANDO_ENUM_ITEM(RHT_COLOSSUS_SILVER_BOULDER) +RANDO_ENUM_ITEM(RHT_COLOSSUS_ROCK) +RANDO_ENUM_ITEM(RHT_HC_STORMS_GROTTO_ROCK) +RANDO_ENUM_ITEM(RHT_BOTW_BOULDER) +RANDO_ENUM_ITEM(RHT_DEKU_BOULDER) +RANDO_ENUM_ITEM(RHT_DODONGOS_BOULDER) +RANDO_ENUM_ITEM(RHT_JABU_BOULDER) +RANDO_ENUM_ITEM(RHT_SPIRIT_TEMPLE_BOULDER) // SIGNS RANDO_ENUM_ITEM(RHT_SIGN_KOKIRI_FOREST) RANDO_ENUM_ITEM(RHT_SIGN_LINKS_HOUSE) diff --git a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerInf.h b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerInf.h index 803313f6a0..d2e461d7ea 100644 --- a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerInf.h +++ b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerInf.h @@ -1023,6 +1023,291 @@ RANDO_ENUM_ITEM(RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3) RANDO_ENUM_ITEM(RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4) RANDO_ENUM_ITEM(RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE) RANDO_ENUM_ITEM(RAND_INF_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE) +RANDO_ENUM_ITEM(RAND_INF_KF_CIRCLE_ROCK_1) +RANDO_ENUM_ITEM(RAND_INF_KF_CIRCLE_ROCK_2) +RANDO_ENUM_ITEM(RAND_INF_KF_CIRCLE_ROCK_3) +RANDO_ENUM_ITEM(RAND_INF_KF_CIRCLE_ROCK_4) +RANDO_ENUM_ITEM(RAND_INF_KF_CIRCLE_ROCK_5) +RANDO_ENUM_ITEM(RAND_INF_KF_CIRCLE_ROCK_6) +RANDO_ENUM_ITEM(RAND_INF_KF_CIRCLE_ROCK_7) +RANDO_ENUM_ITEM(RAND_INF_KF_CIRCLE_ROCK_8) +RANDO_ENUM_ITEM(RAND_INF_KF_ROCK_BY_SARIAS_HOUSE) +RANDO_ENUM_ITEM(RAND_INF_KF_ROCK_BEHIND_SARIAS_HOUSE) +RANDO_ENUM_ITEM(RAND_INF_KF_ROCK_BY_MIDOS_HOUSE) +RANDO_ENUM_ITEM(RAND_INF_KF_ROCK_BY_KNOW_IT_ALLS_HOUSE) +RANDO_ENUM_ITEM(RAND_INF_LW_BOULDER_BY_GORON_CITY) +RANDO_ENUM_ITEM(RAND_INF_LW_BOULDER_BY_SACRED_FOREST_MEADOW) +RANDO_ENUM_ITEM(RAND_INF_LW_RUPEE_BOULDER) +RANDO_ENUM_ITEM(RAND_INF_HC_ROCK_1) +RANDO_ENUM_ITEM(RAND_INF_HC_ROCK_2) +RANDO_ENUM_ITEM(RAND_INF_HC_ROCK_3) +RANDO_ENUM_ITEM(RAND_INF_HC_BOULDER) +RANDO_ENUM_ITEM(RAND_INF_OGC_BRONZE_BOULDER_1) +RANDO_ENUM_ITEM(RAND_INF_OGC_BRONZE_BOULDER_2) +RANDO_ENUM_ITEM(RAND_INF_OGC_BRONZE_BOULDER_3) +RANDO_ENUM_ITEM(RAND_INF_OGC_SILVER_BOULDER_1) +RANDO_ENUM_ITEM(RAND_INF_OGC_SILVER_BOULDER_2) +RANDO_ENUM_ITEM(RAND_INF_OGC_SILVER_BOULDER_3) +RANDO_ENUM_ITEM(RAND_INF_OGC_SILVER_BOULDER_4) +RANDO_ENUM_ITEM(RAND_INF_DMC_CIRCLE_ROCK_1) +RANDO_ENUM_ITEM(RAND_INF_DMC_CIRCLE_ROCK_2) +RANDO_ENUM_ITEM(RAND_INF_DMC_CIRCLE_ROCK_3) +RANDO_ENUM_ITEM(RAND_INF_DMC_CIRCLE_ROCK_4) +RANDO_ENUM_ITEM(RAND_INF_DMC_CIRCLE_ROCK_5) +RANDO_ENUM_ITEM(RAND_INF_DMC_CIRCLE_ROCK_6) +RANDO_ENUM_ITEM(RAND_INF_DMC_CIRCLE_ROCK_7) +RANDO_ENUM_ITEM(RAND_INF_DMC_CIRCLE_ROCK_8) +RANDO_ENUM_ITEM(RAND_INF_DMC_ROCK_BY_FIRE_TEMPLE_1) +RANDO_ENUM_ITEM(RAND_INF_DMC_ROCK_BY_FIRE_TEMPLE_2) +RANDO_ENUM_ITEM(RAND_INF_DMC_ROCK_BY_FIRE_TEMPLE_3) +RANDO_ENUM_ITEM(RAND_INF_DMC_ROCK_BY_FIRE_TEMPLE_4) +RANDO_ENUM_ITEM(RAND_INF_DMC_ROCK_BY_FIRE_TEMPLE_5) +RANDO_ENUM_ITEM(RAND_INF_DMC_GOSSIP_ROCK_1) +RANDO_ENUM_ITEM(RAND_INF_DMC_GOSSIP_ROCK_2) +RANDO_ENUM_ITEM(RAND_INF_DMC_BOULDER_1) +RANDO_ENUM_ITEM(RAND_INF_DMC_BOULDER_2) +RANDO_ENUM_ITEM(RAND_INF_DMC_BOULDER_3) +RANDO_ENUM_ITEM(RAND_INF_DMC_BRONZE_BOULDER_1) +RANDO_ENUM_ITEM(RAND_INF_DMC_BRONZE_BOULDER_2) +RANDO_ENUM_ITEM(RAND_INF_DMC_BRONZE_BOULDER_3) +RANDO_ENUM_ITEM(RAND_INF_DMC_BRONZE_BOULDER_SHORTCUT) +RANDO_ENUM_ITEM(RAND_INF_GV_SILVER_BOULDER) +RANDO_ENUM_ITEM(RAND_INF_GV_ROCK_1) +RANDO_ENUM_ITEM(RAND_INF_GV_ROCK_2) +RANDO_ENUM_ITEM(RAND_INF_GV_ROCK_3) +RANDO_ENUM_ITEM(RAND_INF_GV_UNDERWATER_ROCK_1) +RANDO_ENUM_ITEM(RAND_INF_GV_UNDERWATER_ROCK_2) +RANDO_ENUM_ITEM(RAND_INF_GV_UNDERWATER_ROCK_3) +RANDO_ENUM_ITEM(RAND_INF_GV_ROCK_ACROSS_BRIDGE_1) +RANDO_ENUM_ITEM(RAND_INF_GV_ROCK_ACROSS_BRIDGE_2) +RANDO_ENUM_ITEM(RAND_INF_GV_ROCK_ACROSS_BRIDGE_3) +RANDO_ENUM_ITEM(RAND_INF_GV_ROCK_ACROSS_BRIDGE_4) +RANDO_ENUM_ITEM(RAND_INF_GV_BOULDER_1) +RANDO_ENUM_ITEM(RAND_INF_GV_BOULDER_2) +RANDO_ENUM_ITEM(RAND_INF_GV_BOULDER_ACROSS_BRIDGE) +RANDO_ENUM_ITEM(RAND_INF_GV_BRONZE_BOULDER_1) +RANDO_ENUM_ITEM(RAND_INF_GV_BRONZE_BOULDER_2) +RANDO_ENUM_ITEM(RAND_INF_GV_BRONZE_BOULDER_ACROSS_BRIDGE_1) +RANDO_ENUM_ITEM(RAND_INF_GV_BRONZE_BOULDER_ACROSS_BRIDGE_2) +RANDO_ENUM_ITEM(RAND_INF_GV_BRONZE_BOULDER_ACROSS_BRIDGE_3) +RANDO_ENUM_ITEM(RAND_INF_GV_BRONZE_BOULDER_ACROSS_BRIDGE_4) +RANDO_ENUM_ITEM(RAND_INF_GV_BRONZE_BOULDER_ACROSS_BRIDGE_5) +RANDO_ENUM_ITEM(RAND_INF_GV_BRONZE_BOULDER_ACROSS_BRIDGE_6) +RANDO_ENUM_ITEM(RAND_INF_HF_SILVER_BOULDER) +RANDO_ENUM_ITEM(RAND_INF_HF_ROCK_1) +RANDO_ENUM_ITEM(RAND_INF_HF_ROCK_2) +RANDO_ENUM_ITEM(RAND_INF_HF_ROCK_3) +RANDO_ENUM_ITEM(RAND_INF_HF_ROCK_4) +RANDO_ENUM_ITEM(RAND_INF_HF_ROCK_5) +RANDO_ENUM_ITEM(RAND_INF_HF_ROCK_6) +RANDO_ENUM_ITEM(RAND_INF_HF_ROCK_7) +RANDO_ENUM_ITEM(RAND_INF_HF_ROCK_8) +RANDO_ENUM_ITEM(RAND_INF_HF_BOULDER_NORTH) +RANDO_ENUM_ITEM(RAND_INF_HF_BOULDER_BY_MARKET) +RANDO_ENUM_ITEM(RAND_INF_HF_BOULDER_SOUTH) +RANDO_ENUM_ITEM(RAND_INF_HF_BRONZE_BOULDER_1) +RANDO_ENUM_ITEM(RAND_INF_HF_BRONZE_BOULDER_2) +RANDO_ENUM_ITEM(RAND_INF_HF_BRONZE_BOULDER_3) +RANDO_ENUM_ITEM(RAND_INF_HF_BRONZE_BOULDER_4) +RANDO_ENUM_ITEM(RAND_INF_KAK_SILVER_BOULDER) +RANDO_ENUM_ITEM(RAND_INF_KAK_ROCK_1) +RANDO_ENUM_ITEM(RAND_INF_KAK_ROCK_2) +RANDO_ENUM_ITEM(RAND_INF_GY_ROCK) +RANDO_ENUM_ITEM(RAND_INF_LH_ROCK) +RANDO_ENUM_ITEM(RAND_INF_ZD_CIRCLE_ROCK_1) +RANDO_ENUM_ITEM(RAND_INF_ZD_CIRCLE_ROCK_2) +RANDO_ENUM_ITEM(RAND_INF_ZD_CIRCLE_ROCK_3) +RANDO_ENUM_ITEM(RAND_INF_ZD_CIRCLE_ROCK_4) +RANDO_ENUM_ITEM(RAND_INF_ZD_CIRCLE_ROCK_5) +RANDO_ENUM_ITEM(RAND_INF_ZD_CIRCLE_ROCK_6) +RANDO_ENUM_ITEM(RAND_INF_ZD_CIRCLE_ROCK_7) +RANDO_ENUM_ITEM(RAND_INF_ZD_CIRCLE_ROCK_8) +RANDO_ENUM_ITEM(RAND_INF_ZF_BOULDER) +RANDO_ENUM_ITEM(RAND_INF_ZF_SILVER_BOULDER) +RANDO_ENUM_ITEM(RAND_INF_ZF_UNDERGROUND_BOULDER) +RANDO_ENUM_ITEM(RAND_INF_ZR_BOULDER_1) +RANDO_ENUM_ITEM(RAND_INF_ZR_BOULDER_2) +RANDO_ENUM_ITEM(RAND_INF_ZR_BOULDER_3) +RANDO_ENUM_ITEM(RAND_INF_ZR_BOULDER_4) +RANDO_ENUM_ITEM(RAND_INF_ZR_CIRCLE_ROCK_1) +RANDO_ENUM_ITEM(RAND_INF_ZR_CIRCLE_ROCK_2) +RANDO_ENUM_ITEM(RAND_INF_ZR_CIRCLE_ROCK_3) +RANDO_ENUM_ITEM(RAND_INF_ZR_CIRCLE_ROCK_4) +RANDO_ENUM_ITEM(RAND_INF_ZR_CIRCLE_ROCK_5) +RANDO_ENUM_ITEM(RAND_INF_ZR_CIRCLE_ROCK_6) +RANDO_ENUM_ITEM(RAND_INF_ZR_CIRCLE_ROCK_7) +RANDO_ENUM_ITEM(RAND_INF_ZR_CIRCLE_ROCK_8) +RANDO_ENUM_ITEM(RAND_INF_ZR_UPPER_CIRCLE_BOULDER) +RANDO_ENUM_ITEM(RAND_INF_ZR_UPPER_CIRCLE_ROCK_1) +RANDO_ENUM_ITEM(RAND_INF_ZR_UPPER_CIRCLE_ROCK_2) +RANDO_ENUM_ITEM(RAND_INF_ZR_UPPER_CIRCLE_ROCK_3) +RANDO_ENUM_ITEM(RAND_INF_ZR_UPPER_CIRCLE_ROCK_4) +RANDO_ENUM_ITEM(RAND_INF_ZR_UPPER_CIRCLE_ROCK_5) +RANDO_ENUM_ITEM(RAND_INF_ZR_UPPER_CIRCLE_ROCK_6) +RANDO_ENUM_ITEM(RAND_INF_ZR_UPPER_CIRCLE_ROCK_7) +RANDO_ENUM_ITEM(RAND_INF_ZR_UPPER_CIRCLE_ROCK_8) +RANDO_ENUM_ITEM(RAND_INF_ZR_ROCK) +RANDO_ENUM_ITEM(RAND_INF_ZR_UNDERWATER_ROCK_1) +RANDO_ENUM_ITEM(RAND_INF_ZR_UNDERWATER_ROCK_2) +RANDO_ENUM_ITEM(RAND_INF_ZR_UNDERWATER_ROCK_3) +RANDO_ENUM_ITEM(RAND_INF_ZR_UNDERWATER_ROCK_4) +RANDO_ENUM_ITEM(RAND_INF_DMT_ROCK_1) +RANDO_ENUM_ITEM(RAND_INF_DMT_ROCK_2) +RANDO_ENUM_ITEM(RAND_INF_DMT_ROCK_3) +RANDO_ENUM_ITEM(RAND_INF_DMT_ROCK_4) +RANDO_ENUM_ITEM(RAND_INF_DMT_ROCK_5) +RANDO_ENUM_ITEM(RAND_INF_DMT_SUMMIT_ROCK) +RANDO_ENUM_ITEM(RAND_INF_DMT_CIRCLE_ROCK_1) +RANDO_ENUM_ITEM(RAND_INF_DMT_CIRCLE_ROCK_2) +RANDO_ENUM_ITEM(RAND_INF_DMT_CIRCLE_ROCK_3) +RANDO_ENUM_ITEM(RAND_INF_DMT_CIRCLE_ROCK_4) +RANDO_ENUM_ITEM(RAND_INF_DMT_CIRCLE_ROCK_5) +RANDO_ENUM_ITEM(RAND_INF_DMT_CIRCLE_ROCK_6) +RANDO_ENUM_ITEM(RAND_INF_DMT_CIRCLE_ROCK_7) +RANDO_ENUM_ITEM(RAND_INF_DMT_CIRCLE_ROCK_8) +RANDO_ENUM_ITEM(RAND_INF_DMT_CHILD_BOULDER) +RANDO_ENUM_ITEM(RAND_INF_DMT_BOULDER_1) +RANDO_ENUM_ITEM(RAND_INF_DMT_BOULDER_2) +RANDO_ENUM_ITEM(RAND_INF_DMT_COW_BOULDER) +RANDO_ENUM_ITEM(RAND_INF_DMT_BRONZE_BOULDER_1) +RANDO_ENUM_ITEM(RAND_INF_DMT_BRONZE_BOULDER_2) +RANDO_ENUM_ITEM(RAND_INF_DMT_BRONZE_BOULDER_3) +RANDO_ENUM_ITEM(RAND_INF_DMT_BRONZE_BOULDER_4) +RANDO_ENUM_ITEM(RAND_INF_DMT_BRONZE_BOULDER_5) +RANDO_ENUM_ITEM(RAND_INF_DMT_BRONZE_BOULDER_6) +RANDO_ENUM_ITEM(RAND_INF_DMT_BRONZE_BOULDER_7) +RANDO_ENUM_ITEM(RAND_INF_DMT_BRONZE_BOULDER_8) +RANDO_ENUM_ITEM(RAND_INF_DMT_BRONZE_BOULDER_9) +RANDO_ENUM_ITEM(RAND_INF_DMT_BRONZE_BOULDER_10) +RANDO_ENUM_ITEM(RAND_INF_DMT_BRONZE_BOULDER_11) +RANDO_ENUM_ITEM(RAND_INF_GC_LW_BOULDER_1) +RANDO_ENUM_ITEM(RAND_INF_GC_LW_BOULDER_2) +RANDO_ENUM_ITEM(RAND_INF_GC_LW_BOULDER_3) +RANDO_ENUM_ITEM(RAND_INF_GC_ENTRANCE_BOULDER_1) +RANDO_ENUM_ITEM(RAND_INF_GC_ENTRANCE_BOULDER_2) +RANDO_ENUM_ITEM(RAND_INF_GC_ENTRANCE_BOULDER_3) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_SILVER_BOULDER_1) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_SILVER_BOULDER_2) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_SILVER_BOULDER_3) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_SILVER_BOULDER_4) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_SILVER_BOULDER_5) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_SILVER_BOULDER_6) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_SILVER_BOULDER_7) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_SILVER_BOULDER_8) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_SILVER_BOULDER_9) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_SILVER_BOULDER_10) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_SILVER_BOULDER_11) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_SILVER_BOULDER_12) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_SILVER_BOULDER_13) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_SILVER_BOULDER_14) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_SILVER_BOULDER_15) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_SILVER_BOULDER_16) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_SILVER_BOULDER_17) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_SILVER_BOULDER_18) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_SILVER_BOULDER_19) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_SILVER_BOULDER_20) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_SILVER_BOULDER_21) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_SILVER_BOULDER_22) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_SILVER_BOULDER_23) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_SILVER_BOULDER_24) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_SILVER_BOULDER_25) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_SILVER_BOULDER_26) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_SILVER_BOULDER_27) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_SILVER_BOULDER_28) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_SILVER_BOULDER_29) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_BOULDER_1) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_BOULDER_2) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_BOULDER_3) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_BOULDER_4) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_BOULDER_5) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_BOULDER_6) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_BOULDER_7) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_BOULDER_8) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_BOULDER_9) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_BOULDER_10) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_BRONZE_BOULDER_1) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_BRONZE_BOULDER_2) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_BRONZE_BOULDER_3) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_BRONZE_BOULDER_4) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_BRONZE_BOULDER_5) +RANDO_ENUM_ITEM(RAND_INF_GC_MAZE_ROCK) +RANDO_ENUM_ITEM(RAND_INF_COLOSSUS_SILVER_BOULDER) +RANDO_ENUM_ITEM(RAND_INF_COLOSSUS_ROCK) +RANDO_ENUM_ITEM(RAND_INF_COLOSSUS_CIRCLE_1_ROCK_1) +RANDO_ENUM_ITEM(RAND_INF_COLOSSUS_CIRCLE_1_ROCK_2) +RANDO_ENUM_ITEM(RAND_INF_COLOSSUS_CIRCLE_1_ROCK_3) +RANDO_ENUM_ITEM(RAND_INF_COLOSSUS_CIRCLE_1_ROCK_4) +RANDO_ENUM_ITEM(RAND_INF_COLOSSUS_CIRCLE_1_ROCK_5) +RANDO_ENUM_ITEM(RAND_INF_COLOSSUS_CIRCLE_1_ROCK_6) +RANDO_ENUM_ITEM(RAND_INF_COLOSSUS_CIRCLE_1_ROCK_7) +RANDO_ENUM_ITEM(RAND_INF_COLOSSUS_CIRCLE_1_ROCK_8) +RANDO_ENUM_ITEM(RAND_INF_COLOSSUS_CIRCLE_2_ROCK_1) +RANDO_ENUM_ITEM(RAND_INF_COLOSSUS_CIRCLE_2_ROCK_2) +RANDO_ENUM_ITEM(RAND_INF_COLOSSUS_CIRCLE_2_ROCK_3) +RANDO_ENUM_ITEM(RAND_INF_COLOSSUS_CIRCLE_2_ROCK_4) +RANDO_ENUM_ITEM(RAND_INF_COLOSSUS_CIRCLE_2_ROCK_5) +RANDO_ENUM_ITEM(RAND_INF_COLOSSUS_CIRCLE_2_ROCK_6) +RANDO_ENUM_ITEM(RAND_INF_COLOSSUS_CIRCLE_2_ROCK_7) +RANDO_ENUM_ITEM(RAND_INF_COLOSSUS_CIRCLE_2_ROCK_8) +RANDO_ENUM_ITEM(RAND_INF_HC_STORMS_GROTTO_ROCK_1) +RANDO_ENUM_ITEM(RAND_INF_HC_STORMS_GROTTO_ROCK_2) +RANDO_ENUM_ITEM(RAND_INF_HC_STORMS_GROTTO_ROCK_3) +RANDO_ENUM_ITEM(RAND_INF_HC_STORMS_GROTTO_ROCK_4) +RANDO_ENUM_ITEM(RAND_INF_HC_STORMS_GROTTO_ROCK_5) +RANDO_ENUM_ITEM(RAND_INF_HC_STORMS_GROTTO_ROCK_6) +RANDO_ENUM_ITEM(RAND_INF_HC_STORMS_GROTTO_ROCK_7) +RANDO_ENUM_ITEM(RAND_INF_HC_STORMS_GROTTO_ROCK_8) +RANDO_ENUM_ITEM(RAND_INF_BOTW_BOULDER_1) +RANDO_ENUM_ITEM(RAND_INF_BOTW_BOULDER_2) +RANDO_ENUM_ITEM(RAND_INF_BOTW_BOULDER_3) +RANDO_ENUM_ITEM(RAND_INF_BOTW_BOULDER_4) +RANDO_ENUM_ITEM(RAND_INF_BOTW_BOULDER_5) +RANDO_ENUM_ITEM(RAND_INF_BOTW_BOULDER_6) +RANDO_ENUM_ITEM(RAND_INF_DEKU_TREE_MQ_BOULDER_1) +RANDO_ENUM_ITEM(RAND_INF_DEKU_TREE_MQ_BOULDER_2) +RANDO_ENUM_ITEM(RAND_INF_DEKU_TREE_MQ_BOULDER_3) +RANDO_ENUM_ITEM(RAND_INF_DODONGOS_CAVERN_MQ_LOBBY_BOULDER_1) +RANDO_ENUM_ITEM(RAND_INF_DODONGOS_CAVERN_MQ_LOBBY_BOULDER_2) +RANDO_ENUM_ITEM(RAND_INF_DODONGOS_CAVERN_MQ_MOUTH_SIDE_BRIDGE_BOULDER_1) +RANDO_ENUM_ITEM(RAND_INF_DODONGOS_CAVERN_MQ_MOUTH_SIDE_BRIDGE_BOULDER_2) +RANDO_ENUM_ITEM(RAND_INF_DODONGOS_CAVERN_MQ_MOUTH_SIDE_BRIDGE_BOULDER_3) +RANDO_ENUM_ITEM(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_BOULDER_1) +RANDO_ENUM_ITEM(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_BOULDER_2) +RANDO_ENUM_ITEM(RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_1) +RANDO_ENUM_ITEM(RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_2) +RANDO_ENUM_ITEM(RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_3) +RANDO_ENUM_ITEM(RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_4) +RANDO_ENUM_ITEM(RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_5) +RANDO_ENUM_ITEM(RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_6) +RANDO_ENUM_ITEM(RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_7) +RANDO_ENUM_ITEM(RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_8) +RANDO_ENUM_ITEM(RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_9) +RANDO_ENUM_ITEM(RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_10) +RANDO_ENUM_ITEM(RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_11) +RANDO_ENUM_ITEM(RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_BOULDER_12) +RANDO_ENUM_ITEM(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_BOULDER) +RANDO_ENUM_ITEM(RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_BOULDER) +RANDO_ENUM_ITEM(RAND_INF_JABU_JABUS_BELLY_MQ_HOLES_ROOM_BOULDER_1) +RANDO_ENUM_ITEM(RAND_INF_JABU_JABUS_BELLY_MQ_HOLES_ROOM_BOULDER_2) +RANDO_ENUM_ITEM(RAND_INF_JABU_JABUS_BELLY_MQ_HOLES_ROOM_WALL_BOULDER_1) +RANDO_ENUM_ITEM(RAND_INF_JABU_JABUS_BELLY_MQ_HOLES_ROOM_WALL_BOULDER_2) +RANDO_ENUM_ITEM(RAND_INF_JABU_JABUS_BELLY_MQ_HOLES_ROOM_WALL_BOULDER_3) +RANDO_ENUM_ITEM(RAND_INF_JABU_JABUS_BELLY_MQ_FORKED_CORRIDOR_BOULDER_1) +RANDO_ENUM_ITEM(RAND_INF_JABU_JABUS_BELLY_MQ_FORKED_CORRIDOR_BOULDER_2) +RANDO_ENUM_ITEM(RAND_INF_JABU_JABUS_BELLY_MQ_TAILPASARAN_BOULDER) +RANDO_ENUM_ITEM(RAND_INF_JABU_JABUS_BELLY_MQ_TAILPASARAN_WALL_BOULDER) +RANDO_ENUM_ITEM(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_BOULDER_1) +RANDO_ENUM_ITEM(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_BOULDER_2) +RANDO_ENUM_ITEM(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_EYE_BOULDER) +RANDO_ENUM_ITEM(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_CEILING_BOULDER) +RANDO_ENUM_ITEM(RAND_INF_SPIRIT_TEMPLE_MQ_CRAWLSPACE_BOULDER) +RANDO_ENUM_ITEM(RAND_INF_SPIRIT_TEMPLE_MQ_GIBDO_BOULDER) +RANDO_ENUM_ITEM(RAND_INF_SPIRIT_TEMPLE_MQ_GIBDO_BOULDER_LOW) +RANDO_ENUM_ITEM(RAND_INF_SPIRIT_TEMPLE_MQ_GIBDO_BOULDER_HIGH) +RANDO_ENUM_ITEM(RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_BOULDER) +RANDO_ENUM_ITEM(RAND_INF_BOTW_MQ_BOULDER_1) +RANDO_ENUM_ITEM(RAND_INF_BOTW_MQ_BOULDER_2) +RANDO_ENUM_ITEM(RAND_INF_BOTW_MQ_BOULDER_3) RANDO_ENUM_ITEM(RAND_INF_MARKET_TREE) RANDO_ENUM_ITEM(RAND_INF_HC_NEAR_GUARDS_TREE_1) RANDO_ENUM_ITEM(RAND_INF_HC_NEAR_GUARDS_TREE_2) diff --git a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerMiscEnums.h b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerMiscEnums.h index 3079132fc6..6eb2bb4e08 100644 --- a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerMiscEnums.h +++ b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerMiscEnums.h @@ -116,6 +116,8 @@ RANDO_ENUM_ITEM(RCTYPE_POT) // Pots RANDO_ENUM_ITEM(RCTYPE_CRATE) // Crates RANDO_ENUM_ITEM(RCTYPE_NLCRATE) // NL Crates RANDO_ENUM_ITEM(RCTYPE_SMALL_CRATE) // Small crates +RANDO_ENUM_ITEM(RCTYPE_ROCK) // Rocks +RANDO_ENUM_ITEM(RCTYPE_BOULDER) // Boulders RANDO_ENUM_ITEM(RCTYPE_TREE) // Trees RANDO_ENUM_ITEM(RCTYPE_NLTREE) // NL Trees RANDO_ENUM_ITEM(RCTYPE_BUSH) // Bushes diff --git a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerOptions.h b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerOptions.h index e38d32293a..8d8fe074c0 100644 --- a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerOptions.h +++ b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerOptions.h @@ -398,6 +398,14 @@ RANDO_ENUM_ITEM(RO_SHUFFLE_CRATES_OVERWORLD) RANDO_ENUM_ITEM(RO_SHUFFLE_CRATES_ALL) RANDO_ENUM_END(RandoOptionShuffleCrates) +// Shuffle Boulder settings (off, dungeons, overworld, all) +RANDO_ENUM_BEGIN(RandoOptionShuffleBoulders) +RANDO_ENUM_ITEM(RO_SHUFFLE_BOULDERS_OFF) +RANDO_ENUM_ITEM(RO_SHUFFLE_BOULDERS_DUNGEONS) +RANDO_ENUM_ITEM(RO_SHUFFLE_BOULDERS_OVERWORLD) +RANDO_ENUM_ITEM(RO_SHUFFLE_BOULDERS_ALL) +RANDO_ENUM_END(RandoOptionShuffleBoulders) + // Shuffle Signs settings (off, dungeons, overworld, all) RANDO_ENUM_BEGIN(RandoOptionShuffleSigns) RANDO_ENUM_ITEM(RO_SHUFFLE_SIGNS_OFF) diff --git a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerSettingKey.h b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerSettingKey.h index 5e1dc80f30..08d489e3db 100644 --- a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerSettingKey.h +++ b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerSettingKey.h @@ -93,6 +93,8 @@ RANDO_ENUM_ITEM(RSK_SHUFFLE_WEIRD_EGG) RANDO_ENUM_ITEM(RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD) RANDO_ENUM_ITEM(RSK_SHUFFLE_POTS) RANDO_ENUM_ITEM(RSK_SHUFFLE_CRATES) +RANDO_ENUM_ITEM(RSK_SHUFFLE_ROCKS) +RANDO_ENUM_ITEM(RSK_SHUFFLE_BOULDERS) RANDO_ENUM_ITEM(RSK_SHUFFLE_TREES) RANDO_ENUM_ITEM(RSK_SHUFFLE_BUSHES) RANDO_ENUM_ITEM(RSK_SHUFFLE_FROG_SONG_RUPEES) diff --git a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerTrick.h b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerTrick.h index 31026bec7c..a6e829989d 100644 --- a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerTrick.h +++ b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerTrick.h @@ -33,6 +33,7 @@ RANDO_ENUM_ITEM(RT_BOULDER_COLLISION) RANDO_ENUM_ITEM(RT_ITEM_EXTENSION) RANDO_ENUM_ITEM(RT_SLIDE_JUMP) RANDO_ENUM_ITEM(RT_VOIDOUT_COLLECTION) +RANDO_ENUM_ITEM(RT_BOMB_DETONATION) RANDO_ENUM_ITEM(RT_KF_ADULT_GS) // -- location tricks RANDO_ENUM_ITEM(RT_LW_BRIDGE) RANDO_ENUM_ITEM(RT_LW_MIDO_BACKFLIP) diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index 83a2a57f48..69008d3b68 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -76,6 +76,9 @@ bool showOverworldGrass; bool showDungeonGrass; bool showOverworldCrates; bool showDungeonCrates; +bool showRocks; +bool showOverworldBoulders; +bool showDungeonBoulders; bool showTrees; bool showBushes; bool showOverworldSigns; @@ -1471,6 +1474,26 @@ void LoadSettings() { break; } + showRocks = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_ROCKS); + switch (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_BOULDERS)) { + case RO_SHUFFLE_BOULDERS_ALL: + showOverworldBoulders = true; + showDungeonBoulders = true; + break; + case RO_SHUFFLE_BOULDERS_OVERWORLD: + showOverworldBoulders = true; + showDungeonBoulders = false; + break; + case RO_SHUFFLE_BOULDERS_DUNGEONS: + showOverworldBoulders = false; + showDungeonBoulders = true; + break; + default: + showOverworldBoulders = false; + showDungeonBoulders = false; + break; + } + switch (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_SIGNS)) { case RO_SHUFFLE_SIGNS_ALL: showOverworldSigns = true; @@ -1489,6 +1512,7 @@ void LoadSettings() { showDungeonSigns = false; break; } + showTrees = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_TREES); showBushes = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_BUSHES); @@ -1522,12 +1546,15 @@ void LoadSettings() { showDungeonGrass = false; showOverworldCrates = false; showDungeonCrates = false; - showOverworldSigns = false; - showDungeonSigns = false; + showRocks = false; + showOverworldBoulders = false; + showDungeonBoulders = false; showTrees = false; showBushes = false; showOverworldWonderItems = false; showDungeonWonderItems = false; + showOverworldSigns = false; + showDungeonSigns = false; showBeggar = false; showIcicles = false; showRedIce = false; @@ -1644,6 +1671,10 @@ bool IsCheckShuffled(RandomizerCheck rc) { (loc->GetRCType() != RCTYPE_SMALL_CRATE || (showOverworldCrates && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || (showDungeonCrates && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && + (loc->GetRCType() != RCTYPE_ROCK || showRocks) && + (loc->GetRCType() != RCTYPE_BOULDER || + (showOverworldBoulders && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || + (showDungeonBoulders && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && (loc->GetRCType() != RCTYPE_TREE || showTrees) && (loc->GetRCType() != RCTYPE_NLTREE || (showTrees && diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index 3a058db898..1acb4d78a8 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -846,6 +846,8 @@ void Settings::CreateOptions() { OPT_U8(RSK_SHUFFLE_POTS, "Shuffle Pots", {"Off", "Dungeons", "Overworld", "All Pots"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShufflePots"), mOptionDescriptions[RSK_SHUFFLE_POTS], WIDGET_CVAR_COMBOBOX, RO_SHUFFLE_POTS_OFF); OPT_U8(RSK_SHUFFLE_GRASS, "Shuffle Grass", {"Off", "Dungeons", "Overworld", "All Grass"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleGrass"), mOptionDescriptions[RSK_SHUFFLE_GRASS], WIDGET_CVAR_COMBOBOX, RO_SHUFFLE_GRASS_OFF); OPT_U8(RSK_SHUFFLE_CRATES, "Shuffle Crates", {"Off", "Dungeons", "Overworld", "All Crates"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleCrates"), mOptionDescriptions[RSK_SHUFFLE_CRATES], WIDGET_CVAR_COMBOBOX, RO_SHUFFLE_CRATES_OFF); + OPT_BOOL(RSK_SHUFFLE_ROCKS, "Shuffle Rocks", CVAR_RANDOMIZER_SETTING("ShuffleRocks"), mOptionDescriptions[RSK_SHUFFLE_ROCKS]); + OPT_U8(RSK_SHUFFLE_BOULDERS, "Shuffle Boulders", {"Off", "Dungeons", "Overworld", "All Boulders"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleBoulders"), mOptionDescriptions[RSK_SHUFFLE_BOULDERS], WIDGET_CVAR_COMBOBOX, RO_SHUFFLE_BOULDERS_OFF); OPT_BOOL(RSK_SHUFFLE_TREES, "Shuffle Trees", CVAR_RANDOMIZER_SETTING("ShuffleTrees"), mOptionDescriptions[RSK_SHUFFLE_TREES]); OPT_BOOL(RSK_SHUFFLE_BUSHES, "Shuffle Bushes", CVAR_RANDOMIZER_SETTING("ShuffleBushes"), mOptionDescriptions[RSK_SHUFFLE_BUSHES]); OPT_BOOL(RSK_SHUFFLE_ICICLES, "Shuffle Icicles", CVAR_RANDOMIZER_SETTING("ShuffleIcicles"), mOptionDescriptions[RSK_SHUFFLE_ICICLES]); @@ -1474,6 +1476,7 @@ void Settings::CreateOptions() { "HGrdJmp"); OPT_TRICK(RT_SLIDE_JUMP, RCQUEST_BOTH, RA_NONE, { Tricks::Tag::NOVICE }, "SldJmp"); OPT_TRICK(RT_VOIDOUT_COLLECTION, RCQUEST_BOTH, RA_NONE, { Tricks::Tag::NOVICE }, "VdCl"); + OPT_TRICK(RT_BOMB_DETONATION, RCQUEST_BOTH, RA_NONE, { Tricks::Tag::NOVICE }, "BmbDet"); OPT_TRICK(RT_KF_ADULT_GS, RCQUEST_BOTH, RA_KOKIRI_FOREST, { Tricks::Tag::NOVICE }, "KFGSHB"); OPT_TRICK(RT_LW_BRIDGE, RCQUEST_BOTH, RA_THE_LOST_WOODS, { Tricks::Tag::EXPERT }, "LWBrgJmp"); OPT_TRICK(RT_LW_MIDO_BACKFLIP, RCQUEST_BOTH, RA_THE_LOST_WOODS, { Tricks::Tag::NOVICE }, "MidoSkip"); @@ -1869,6 +1872,8 @@ void Settings::CreateOptions() { &mOptions[RSK_SHUFFLE_POTS], &mOptions[RSK_SHUFFLE_GRASS], &mOptions[RSK_SHUFFLE_CRATES], + &mOptions[RSK_SHUFFLE_BOULDERS], + &mOptions[RSK_SHUFFLE_ROCKS], &mOptions[RSK_SHUFFLE_TREES], &mOptions[RSK_SHUFFLE_BUSHES], &mOptions[RSK_SHUFFLE_ICICLES], @@ -2154,6 +2159,8 @@ void Settings::CreateOptions() { &mOptions[RSK_SHUFFLE_POTS], &mOptions[RSK_SHUFFLE_GRASS], &mOptions[RSK_SHUFFLE_CRATES], + &mOptions[RSK_SHUFFLE_BOULDERS], + &mOptions[RSK_SHUFFLE_ROCKS], &mOptions[RSK_SHUFFLE_TREES], &mOptions[RSK_SHUFFLE_BUSHES], &mOptions[RSK_SHUFFLE_ICICLES], diff --git a/soh/soh/Enhancements/randomizer/static_data.h b/soh/soh/Enhancements/randomizer/static_data.h index c210385d32..241f6794a0 100644 --- a/soh/soh/Enhancements/randomizer/static_data.h +++ b/soh/soh/Enhancements/randomizer/static_data.h @@ -61,6 +61,7 @@ class StaticData { static void RegisterFreestandingLocations(); static void RegisterGrassLocations(); static void RegisterCrateLocations(); + static void RegisterRockLocations(); static void RegisterTreeLocations(); static void RegisterSignLocations(); static void RegisterWonderItemLocations(); diff --git a/soh/src/overlays/actors/ovl_En_Ishi/z_en_ishi.c b/soh/src/overlays/actors/ovl_En_Ishi/z_en_ishi.c index c88e69fdde..1f4e9adfb1 100644 --- a/soh/src/overlays/actors/ovl_En_Ishi/z_en_ishi.c +++ b/soh/src/overlays/actors/ovl_En_Ishi/z_en_ishi.c @@ -8,6 +8,7 @@ #include "overlays/effects/ovl_Effect_Ss_Kakera/z_eff_ss_kakera.h" #include "objects/gameplay_field_keep/gameplay_field_keep.h" #include "soh/OTRGlobals.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "vt.h" @@ -251,7 +252,7 @@ void EnIshi_SpawnDustLarge(EnIshi* this, PlayState* play) { void EnIshi_DropCollectible(EnIshi* this, PlayState* play) { s16 dropParams; - if ((this->actor.params & 1) == ROCK_SMALL) { + if (GameInteractor_Should(VB_ROCK_DROP_ITEM, (this->actor.params & 1) == ROCK_SMALL, this)) { dropParams = (this->actor.params >> 8) & 0xF; if (dropParams >= 0xD) { diff --git a/soh/src/overlays/actors/ovl_Obj_Bombiwa/z_obj_bombiwa.c b/soh/src/overlays/actors/ovl_Obj_Bombiwa/z_obj_bombiwa.c index 602236816e..2854963750 100644 --- a/soh/src/overlays/actors/ovl_Obj_Bombiwa/z_obj_bombiwa.c +++ b/soh/src/overlays/actors/ovl_Obj_Bombiwa/z_obj_bombiwa.c @@ -7,6 +7,7 @@ #include "z_obj_bombiwa.h" #include "overlays/effects/ovl_Effect_Ss_Kakera/z_eff_ss_kakera.h" #include "objects/object_bombiwa/object_bombiwa.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS 0 @@ -75,7 +76,7 @@ void ObjBombiwa_InitCollision(Actor* thisx, PlayState* play) { void ObjBombiwa_Init(Actor* thisx, PlayState* play) { Actor_ProcessInitChain(thisx, sInitChain); ObjBombiwa_InitCollision(thisx, play); - if ((Flags_GetSwitch(play, thisx->params & 0x3F) != 0)) { + if (GameInteractor_Should(VB_BOULDER_BREAK_FLAG, Flags_GetSwitch(play, thisx->params & 0x3F), thisx)) { Actor_Kill(thisx); } else { CollisionCheck_SetInfo(&thisx->colChkInfo, NULL, &sColChkInfoInit); @@ -133,6 +134,7 @@ void ObjBombiwa_Update(Actor* thisx, PlayState* play) { if (((this->actor.params >> 0xF) & 1) != 0) { Sfx_PlaySfxCentered(NA_SE_SY_CORRECT_CHIME); } + GameInteractor_Should(VB_ROCK_DROP_ITEM, false, this); Actor_Kill(&this->actor); } else { this->collider.base.acFlags &= ~AC_HIT; diff --git a/soh/src/overlays/actors/ovl_Obj_Hamishi/z_obj_hamishi.c b/soh/src/overlays/actors/ovl_Obj_Hamishi/z_obj_hamishi.c index d4d952cc0b..26d6ce6eef 100644 --- a/soh/src/overlays/actors/ovl_Obj_Hamishi/z_obj_hamishi.c +++ b/soh/src/overlays/actors/ovl_Obj_Hamishi/z_obj_hamishi.c @@ -6,6 +6,7 @@ #include "z_obj_hamishi.h" #include "objects/gameplay_field_keep/gameplay_field_keep.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS 0 @@ -150,7 +151,7 @@ void ObjHamishi_Init(Actor* thisx, PlayState* play) { ObjHamishi_InitCollision(&this->actor, play); CollisionCheck_SetInfo(&this->actor.colChkInfo, NULL, &sColChkInfoInit); - if (Flags_GetSwitch(play, this->actor.params & 0x3F)) { + if (GameInteractor_Should(VB_BOULDER_BREAK_FLAG, Flags_GetSwitch(play, this->actor.params & 0x3F), this)) { Actor_Kill(&this->actor); return; } @@ -182,6 +183,7 @@ void ObjHamishi_Update(Actor* thisx, PlayState* play) { ObjHamishi_Break(this, play); SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 40, NA_SE_EV_WALL_BROKEN); Flags_SetSwitch(play, this->actor.params & 0x3F); + GameInteractor_Should(VB_ROCK_DROP_ITEM, false, this); Actor_Kill(&this->actor); } } else {