From a65f14121fd9e0bf35c06a60e7ee3eb4dc5edbdf Mon Sep 17 00:00:00 2001 From: Ralphie Morell Date: Sun, 11 Jun 2023 18:56:35 -0400 Subject: [PATCH 01/28] The mother of all commits --- soh/include/z64item.h | 1 + soh/include/z64save.h | 5 +- .../randomizer/3drando/hint_list.cpp | 14 ++++ .../hint_list/hint_list_exclude_overworld.cpp | 4 ++ .../Enhancements/randomizer/3drando/hints.cpp | 32 +++++++-- .../Enhancements/randomizer/3drando/hints.hpp | 8 ++- .../randomizer/3drando/item_list.cpp | 2 +- .../randomizer/3drando/item_location.cpp | 1 + .../randomizer/3drando/item_location.hpp | 4 ++ .../randomizer/3drando/item_pool.cpp | 17 ++++- .../Enhancements/randomizer/3drando/keys.hpp | 2 + .../location_access/locacc_castle_town.cpp | 1 + .../location_access/locacc_death_mountain.cpp | 2 +- .../location_access/locacc_deku_tree.cpp | 43 ++++++------ .../locacc_dodongos_cavern.cpp | 26 ++++--- .../location_access/locacc_fire_temple.cpp | 29 ++++---- .../location_access/locacc_forest_temple.cpp | 68 +++++++++---------- .../location_access/locacc_ganons_castle.cpp | 32 ++++----- .../locacc_gerudo_training_grounds.cpp | 40 +++++------ .../location_access/locacc_gerudo_valley.cpp | 14 ++-- .../location_access/locacc_hyrule_field.cpp | 2 +- .../location_access/locacc_ice_cavern.cpp | 18 ++--- .../locacc_jabujabus_belly.cpp | 4 +- .../location_access/locacc_kakariko.cpp | 4 +- .../location_access/locacc_lost_woods.cpp | 10 +-- .../location_access/locacc_shadow_temple.cpp | 39 +++++------ .../location_access/locacc_spirit_temple.cpp | 18 ++--- .../location_access/locacc_water_temple.cpp | 13 ++-- .../location_access/locacc_zoras_domain.cpp | 2 +- .../Enhancements/randomizer/3drando/logic.cpp | 14 ++-- .../Enhancements/randomizer/3drando/logic.hpp | 2 + .../randomizer/3drando/settings.cpp | 4 ++ .../randomizer/3drando/settings.hpp | 1 + .../Enhancements/randomizer/3drando/shops.cpp | 4 +- .../randomizer/3drando/spoiler_log.cpp | 3 +- .../randomizer/3drando/spoiler_log.hpp | 1 + .../Enhancements/randomizer/randomizer.cpp | 27 +++++++- .../Enhancements/randomizer/randomizerTypes.h | 3 + .../randomizer/randomizer_check_objects.cpp | 1 + soh/src/code/z_sram.c | 11 +-- .../actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c | 7 +- 41 files changed, 330 insertions(+), 203 deletions(-) diff --git a/soh/include/z64item.h b/soh/include/z64item.h index 65f6e93d90c..73ef0bef681 100644 --- a/soh/include/z64item.h +++ b/soh/include/z64item.h @@ -380,6 +380,7 @@ typedef enum { /* 0x7B */ GI_BULLET_BAG_50, /* 0x7C */ GI_ICE_TRAP, // freezes link when opened from a chest /* 0x7D */ GI_TEXT_0, // no model appears over Link, shows text id 0 (pocket egg) + /* 0x7E */ GI_SWORD_MASTER, /* 0x84 */ GI_MAX } GetItemID; diff --git a/soh/include/z64save.h b/soh/include/z64save.h index c4ab0a681c2..8002b660717 100644 --- a/soh/include/z64save.h +++ b/soh/include/z64save.h @@ -303,7 +303,7 @@ typedef struct { /* */ char childAltarText[250]; /* */ char adultAltarText[750]; /* */ RandomizerCheck rewardCheck[9]; - /* */ char ganonHintText[150]; + /* */ char ganonHintText[300]; /* */ char gregHintText[250]; /* */ char ganonText[250]; /* */ char dampeText[150]; @@ -313,7 +313,8 @@ typedef struct { /* */ char warpRequiemText[100]; /* */ char warpNocturneText[100]; /* */ char warpPreludeText[100]; - /* */ RandomizerCheck ganonHintCheck; + /* */ RandomizerCheck LAHintCheck; + /* */ RandomizerCheck MSHintCheck; /* */ RandomizerCheck gregCheck; /* */ RandomizerCheck dampeCheck; /* */ u8 seedIcons[5]; diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp index 358ae285d8c..9c09ec3c998 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp @@ -2958,6 +2958,20 @@ void HintTable_Init() { "Ja, ja, ja... Nunca me derrotarás reflejando mis esferas de energía y desplegando la flecha de luz de " }, }); + + /*-------------------------- + |MASTER SWORD LOCATION TEXT| + ---------------------------*/ + + hintTable[MASTER_SWORD_LOCATION_HINT] = HintText::MasterSword({ + // obscure text + Text{"And even if you do, you'll never find the legendary blade hidden in ", + /*french*/ + "Et même si tu les trouves, tu ne touveras jamais l'épée de légende cachée dans ", + /*spanish*/ + "E incluso si lo haces, nunca encontrarás la espada legendaria escondida en " }, + }); + hintTable[YOUR_POCKET] = HintText::Exclude({ // obscure text Text{ "your pocket", /*french*/ "tes poches", /*spanish*/ "tu bolsillo" }, 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 721776418ee..5d07f167867 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 @@ -131,6 +131,10 @@ void HintTable_Init_Exclude_Overworld() { Text{"a #hole in a volcano# holds", /*french*/"la #grotte dans le volcan# contient", /*spanish*/"bajo el #hoyo de un volcán# yace"}, }); + hintTable[TOT_MASTER_SWORD] = HintText::Exclude({ + //obscure text + Text{"a #pedestal in a temple# holds", /*french*/"un #piédestal dans un temple# contient", /*spanish*/"un #pedestal en un templo# sostiene"}, + }); hintTable[TOT_LIGHT_ARROWS_CUTSCENE] = HintText::Exclude({ //obscure text diff --git a/soh/soh/Enhancements/randomizer/3drando/hints.cpp b/soh/soh/Enhancements/randomizer/3drando/hints.cpp index 8d6af55563c..68254200060 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hints.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hints.cpp @@ -6,6 +6,7 @@ #include "item_pool.hpp" #include "logic.hpp" #include "random.hpp" +#include "settings.hpp" #include "spoiler_log.hpp" #include "fill.hpp" #include "hint_list.hpp" @@ -141,7 +142,8 @@ Text warpRequiemText; Text warpNocturneText; Text warpPreludeText; -std::string ganonHintLoc; +std::string LAHintLoc; +std::string MSHintLoc; std::string dampeHintLoc; Text& GetChildAltarText() { @@ -192,8 +194,12 @@ Text& GetWarpPreludeText() { return warpPreludeText; } -std::string GetGanonHintLoc() { - return ganonHintLoc; +std::string GetLAHintLoc() { + return LAHintLoc; +} + +std::string GetMSHintLoc() { + return MSHintLoc; } std::string GetDampeHintLoc() { @@ -589,13 +595,29 @@ void CreateGanonText() { auto hint = Hint(LIGHT_ARROW_LOCATION_HINT); if (lightArrowLocation.empty()) { ganonHintText = hint.GetText()+Hint(YOUR_POCKET).GetText(); - ganonHintLoc = "Link's Pocket"; + LAHintLoc = "Link's Pocket"; } else { ganonHintText = hint.GetText()+GetHintRegion(Location(lightArrowLocation[0])->GetParentRegionKey())->GetHint().GetText(); - ganonHintLoc = Location(lightArrowLocation[0])->GetName(); + LAHintLoc = Location(lightArrowLocation[0])->GetName(); } ganonHintText = ganonHintText + "!"; + if (ShuffleMasterSword) { + //Get the location of the master sword + auto masterSwordLocation = FilterFromPool(allLocations, [](const LocationKey loc){return Location(loc)->GetPlacedItemKey() == MASTER_SWORD;}); + + // Add second text box + ganonHintText = ganonHintText + "^"; + if (masterSwordLocation.empty()) { + ganonHintText = ganonHintText+Hint(MASTER_SWORD_LOCATION_HINT).GetText()+Hint(YOUR_POCKET).GetText(); + MSHintLoc = "Link's Pocket"; + } else { + ganonHintText = ganonHintText+Hint(MASTER_SWORD_LOCATION_HINT).GetText()+GetHintRegion(Location(masterSwordLocation[0])->GetParentRegionKey())->GetHint().GetText(); + MSHintLoc = Location(masterSwordLocation[0])->GetName(); + } + ganonHintText = ganonHintText + "!"; + } + CreateMessageFromTextObject(0x70CC, 0, 2, 3, AddColorsAndFormat(ganonHintText)); } diff --git a/soh/soh/Enhancements/randomizer/3drando/hints.hpp b/soh/soh/Enhancements/randomizer/3drando/hints.hpp index ccf949975d6..a06e8381e69 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hints.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/hints.hpp @@ -43,6 +43,7 @@ enum class HintCategory { Altar, Validation, LightArrow, + MasterSword, GanonLine, MerchantsDialogs, }; @@ -116,6 +117,10 @@ class HintText { return HintText{std::move(obscureText), std::move(ambiguousText), std::move(clearText), HintCategory::LightArrow}; } + static auto MasterSword(std::vector&& obscureText, std::vector&& ambiguousText = {}, Text&& clearText = {}) { + return HintText{std::move(obscureText), std::move(ambiguousText), std::move(clearText), HintCategory::MasterSword}; + } + static auto GanonLine(std::vector&& obscureText, std::vector&& ambiguousText = {}, Text&& clearText = {}) { return HintText{std::move(obscureText), std::move(ambiguousText), std::move(clearText), HintCategory::GanonLine}; } @@ -224,4 +229,5 @@ Text& GetWarpNocturneText(); Text& GetWarpPreludeText(); std::string GetDampeHintLoc(); -std::string GetGanonHintLoc(); +std::string GetLAHintLoc(); +std::string GetMSHintLoc(); diff --git a/soh/soh/Enhancements/randomizer/3drando/item_list.cpp b/soh/soh/Enhancements/randomizer/3drando/item_list.cpp index 59d8518f388..ffc2a6e9bc2 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_list.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_list.cpp @@ -12,7 +12,7 @@ static std::array itemTable; void ItemTable_Init() { // RandomizerGet English name French Spanish Item Type getItemID advancement logic hint key itemTable[NONE] = Item(RG_NONE, Text{"No Item", "Rien", "Sin Objeto"}, ITEMTYPE_EVENT, GI_RUPEE_GREEN, false, &noVariable, NONE); itemTable[KOKIRI_SWORD] = Item(RG_KOKIRI_SWORD, Text{"Kokiri Sword", "Épée Kokiri", "Espada Kokiri"}, ITEMTYPE_ITEM, GI_SWORD_KOKIRI, true, &KokiriSword, KOKIRI_SWORD); - //[MASTER_SWORD] + itemTable[MASTER_SWORD] = Item(RG_MASTER_SWORD, Text{"Master Sword", "Épée de Legende", "Espada Master"}, ITEMTYPE_ITEM, GI_SWORD_MASTER, true, &MasterSword, MASTER_SWORD); itemTable[GIANTS_KNIFE] = Item(RG_GIANTS_KNIFE, Text{"Giant's Knife", "Lame des Géants", "Espada de Biggoron"}, ITEMTYPE_ITEM, GI_SWORD_KNIFE, false, &noVariable, GIANTS_KNIFE); itemTable[BIGGORON_SWORD] = Item(RG_BIGGORON_SWORD, Text{"Biggoron's Sword", "Épée de Biggoron", "Espada de Biggoron"}, ITEMTYPE_ITEM, GI_SWORD_BGS, true, &BiggoronSword, BIGGORON_SWORD); itemTable[DEKU_SHIELD] = Item(RG_DEKU_SHIELD, Text{"Deku Shield", "Bouclier Mojo", "Escudo deku"}, ITEMTYPE_ITEM, GI_SHIELD_DEKU, false, &noVariable, DEKU_SHIELD); diff --git a/soh/soh/Enhancements/randomizer/3drando/item_location.cpp b/soh/soh/Enhancements/randomizer/3drando/item_location.cpp index bf0257064d4..5e1dd82d9dd 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_location.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_location.cpp @@ -756,6 +756,7 @@ void LocationTable_Init() { --- CUTSCENES --- -------------------------------*/ + locationTable[TOT_MASTER_SWORD] = ItemLocation::Delayed(RC_TOT_MASTER_SWORD, 0xFF, 0x00, "ToT Master Sword", TOT_MASTER_SWORD, MASTER_SWORD, {Category::cTempleOfTime, Category::cMarket}, SpoilerCollectionCheck::MasterSword(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); locationTable[TOT_LIGHT_ARROWS_CUTSCENE] = ItemLocation::Delayed(RC_TOT_LIGHT_ARROWS_CUTSCENE, 0xFF, 0x01, "ToT Light Arrow Cutscene", TOT_LIGHT_ARROWS_CUTSCENE, LIGHT_ARROWS, {Category::cTempleOfTime, Category::cMarket}, SpoilerCollectionCheck::Chest(0x43, 0x1E), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); locationTable[LW_GIFT_FROM_SARIA] = ItemLocation::Delayed(RC_LW_GIFT_FROM_SARIA, 0xFF, 0x02, "LW Gift From Saria", LW_GIFT_FROM_SARIA, PROGRESSIVE_OCARINA, {Category::cLostWoods, Category::cForest}, SpoilerCollectionCheck::EventChkInf(0xC1), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); locationTable[ZF_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(RC_ZF_GREAT_FAIRY_REWARD, 0xFF, 0x10, "ZF Great Fairy Reward", ZF_GREAT_FAIRY_REWARD, FARORES_WIND, {Category::cZorasFountain, Category::cFairies}, SpoilerCollectionCheck::Chest(0x3D, 0x01), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); diff --git a/soh/soh/Enhancements/randomizer/3drando/item_location.hpp b/soh/soh/Enhancements/randomizer/3drando/item_location.hpp index 3d6858e5034..a7383961540 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_location.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_location.hpp @@ -155,6 +155,10 @@ class SpoilerCollectionCheck { return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_MAGIC_BEANS, scene, flag); } + static auto MasterSword() { + return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_MASTER_SWORD, 0x00, 0x00); + } + static auto Merchant(int8_t scene, uint8_t flag) { return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_MERCHANT, scene, flag); } diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index 9b55eb0b499..39ea3c81c96 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -47,7 +47,8 @@ const std::array JunkPoolItems = { DEKU_NUTS_10, ICE_TRAP, }; -const std::array alwaysItems = { +const std::array alwaysItems = { + MASTER_SWORD, BIGGORON_SWORD, BOOMERANG, LENS_OF_TRUTH, @@ -108,7 +109,8 @@ const std::array alwaysItems = { ARROWS_10, TREASURE_GAME_HEART, }; -const std::array easyItems = { +const std::array easyItems = { + MASTER_SWORD, BIGGORON_SWORD, KOKIRI_SWORD, BOOMERANG, @@ -674,6 +676,13 @@ void GenerateItemPool() { PlaceItemInLocation(KF_KOKIRI_SWORD_CHEST, KOKIRI_SWORD, false, true); } + if (ShuffleMasterSword) { + AddItemToMainPool(MASTER_SWORD); + IceTrapModels.push_back(GI_SWORD_MASTER); + } else { + PlaceItemInLocation(TOT_MASTER_SWORD, MASTER_SWORD, false, true); + } + if (ShuffleWeirdEgg) { AddItemToMainPool(WEIRD_EGG); IceTrapModels.push_back(GI_WEIRD_EGG); @@ -1153,6 +1162,10 @@ void GenerateItemPool() { ReplaceMaxItem(KOKIRI_SWORD, 0); } + if (!ShuffleMasterSword) { + ReplaceMaxItem(MASTER_SWORD, 0); + } + if (ProgressiveGoronSword) { ReplaceMaxItem(BIGGORON_SWORD, 0); AddItemToMainPool(PROGRESSIVE_GORONSWORD, 2); diff --git a/soh/soh/Enhancements/randomizer/3drando/keys.hpp b/soh/soh/Enhancements/randomizer/3drando/keys.hpp index 38011b8b866..29411f783a0 100644 --- a/soh/soh/Enhancements/randomizer/3drando/keys.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/keys.hpp @@ -356,6 +356,7 @@ typedef enum { MARKET_BOMBCHU_SHOP_ITEM_6, MARKET_BOMBCHU_SHOP_ITEM_7, MARKET_BOMBCHU_SHOP_ITEM_8, + TOT_MASTER_SWORD, TOT_LIGHT_ARROWS_CUTSCENE, //HYRULE_CASTLE HC_MALON_EGG, @@ -1803,6 +1804,7 @@ typedef enum { VALIDATION_LINE, LIGHT_ARROW_LOCATION_HINT, + MASTER_SWORD_LOCATION_HINT, DAMPE_DIARY, YOUR_POCKET, diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_castle_town.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_castle_town.cpp index 6691ac2f2f4..d98096314f2 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_castle_town.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_castle_town.cpp @@ -52,6 +52,7 @@ void AreaTable_Init_CastleTown() { areaTable[TEMPLE_OF_TIME] = Area("Temple of Time", "Temple of Time", TEMPLE_OF_TIME, NO_DAY_NIGHT_CYCLE, {}, { //Locations + LocationAccess(TOT_MASTER_SWORD, {[]{return IsAdult;}}), LocationAccess(TOT_LIGHT_ARROWS_CUTSCENE, {[]{return IsAdult && CanTriggerLACS;}}), }, { //Exits diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp index b52be650e0e..bf1d0614893 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp @@ -95,7 +95,7 @@ void AreaTable_Init_DeathMountain() { LocationAccess(GC_ROLLING_GORON_AS_CHILD, {[]{return IsChild && (HasExplosives || (GoronBracelet && LogicChildRollingWithStrength));}}), LocationAccess(GC_ROLLING_GORON_AS_ADULT, {[]{return StopGCRollingGoronAsAdult;}}), LocationAccess(GC_GS_BOULDER_MAZE, {[]{return IsChild && CanBlastOrSmash;}}), - LocationAccess(GC_GS_CENTER_PLATFORM, {[]{return IsAdult;}}), + LocationAccess(GC_GS_CENTER_PLATFORM, {[]{return CanAdultAttack;}}), LocationAccess(GC_MEDIGORON, {[]{return IsAdult && AdultsWallet && (CanBlastOrSmash || GoronBracelet);}}), LocationAccess(GC_MAZE_GOSSIP_STONE, {[]{return CanBlastOrSmash || CanUse(SILVER_GAUNTLETS);}}), LocationAccess(GC_MEDIGORON_GOSSIP_STONE, {[]{return CanBlastOrSmash || GoronBracelet;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_deku_tree.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_deku_tree.cpp index c39676a826a..69599509fc6 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_deku_tree.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_deku_tree.cpp @@ -23,8 +23,8 @@ void AreaTable_Init_DekuTree() { if (Dungeon::DekuTree.IsVanilla()) { areaTable[DEKU_TREE_LOBBY] = Area("Deku Tree Lobby", "Deku Tree", DEKU_TREE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (IsAdult || KokiriSword || Boomerang);}}), - EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (IsAdult || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(DINS_FIRE));}}), + EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(BOOMERANG));}}), + EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (CanJumpslash || CanUse(SLINGSHOT) || CanUse(BOW) || CanUse(MEGATON_HAMMER) || HasExplosives || CanUse(DINS_FIRE));}}), }, { //Locations LocationAccess(DEKU_TREE_MAP_CHEST, {[]{return true;}}), @@ -33,7 +33,7 @@ void AreaTable_Init_DekuTree() { Entrance(DEKU_TREE_ENTRYWAY, {[]{return true;}}), Entrance(DEKU_TREE_2F_MIDDLE_ROOM, {[]{return true;}}), Entrance(DEKU_TREE_COMPASS_ROOM, {[]{return true;}}), - Entrance(DEKU_TREE_BASEMENT_LOWER, {[]{return Here(DEKU_TREE_LOBBY, []{return IsAdult || CanChildAttack || Nuts;});}}), + Entrance(DEKU_TREE_BASEMENT_LOWER, {[]{return Here(DEKU_TREE_LOBBY, []{return CanAdultAttack || CanChildAttack || Nuts;});}}), Entrance(DEKU_TREE_OUTSIDE_BOSS_ROOM, {[]{return false;}}), Entrance(DEKU_TREE_BOSS_ENTRYWAY, {[]{return false;}}), }); @@ -55,13 +55,13 @@ void AreaTable_Init_DekuTree() { areaTable[DEKU_TREE_COMPASS_ROOM] = Area("Deku Tree Compass Room", "Deku Tree", DEKU_TREE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (IsAdult || KokiriSword || Boomerang);}}), - EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (IsAdult || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(DINS_FIRE));}}), + EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(BOOMERANG));}}), + EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (CanJumpslash || CanUse(SLINGSHOT) || CanUse(BOW) || CanUse(MEGATON_HAMMER) || HasExplosives || CanUse(DINS_FIRE));}}), }, { //Locations LocationAccess(DEKU_TREE_COMPASS_CHEST, {[]{return true;}}), LocationAccess(DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, {[]{return true;}}), - LocationAccess(DEKU_TREE_GS_COMPASS_ROOM, {[]{return IsAdult || CanChildAttack;}}), + LocationAccess(DEKU_TREE_GS_COMPASS_ROOM, {[]{return CanAdultAttack || CanChildAttack;}}), }, { //Exits Entrance(DEKU_TREE_LOBBY, {[]{return HasFireSourceWithTorch || CanUse(BOW);}}), @@ -70,14 +70,14 @@ void AreaTable_Init_DekuTree() { areaTable[DEKU_TREE_BASEMENT_LOWER] = Area("Deku Tree Basement Lower", "Deku Tree", DEKU_TREE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (IsAdult || KokiriSword || Boomerang);}}), - EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (IsAdult || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(DINS_FIRE));}, + EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || Boomerang);}}), + EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (CanJumpslash || CanUse(SLINGSHOT) || CanUse(BOW) || CanUse(MEGATON_HAMMER) || HasExplosives || CanUse(DINS_FIRE));}, /*Glitched*/[]{return CanUse(MEGATON_HAMMER);}}), }, { //Locations LocationAccess(DEKU_TREE_BASEMENT_CHEST, {[]{return true;}}), - LocationAccess(DEKU_TREE_GS_BASEMENT_GATE, {[]{return IsAdult || CanChildAttack;}}), - LocationAccess(DEKU_TREE_GS_BASEMENT_VINES, {[]{return CanUseProjectile || CanUse(DINS_FIRE) || (LogicDekuBasementGS && (IsAdult || Sticks || KokiriSword));}}), + LocationAccess(DEKU_TREE_GS_BASEMENT_GATE, {[]{return CanAdultAttack || CanChildAttack;}}), + LocationAccess(DEKU_TREE_GS_BASEMENT_VINES, {[]{return CanUseProjectile || CanUse(DINS_FIRE) || (LogicDekuBasementGS && CanJumpslash);}}), }, { //Exits Entrance(DEKU_TREE_LOBBY, {[]{return true;}}), @@ -100,8 +100,8 @@ void AreaTable_Init_DekuTree() { areaTable[DEKU_TREE_BASEMENT_TORCH_ROOM] = Area("Deku Tree Basement Torch Room", "Deku Tree", DEKU_TREE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (IsAdult || KokiriSword || Boomerang);}}), - EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (IsAdult || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(DINS_FIRE));}}), + EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(BOOMERANG));}}), + EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (CanJumpslash || CanUse(SLINGSHOT) || CanUse(BOW) || CanUse(MEGATON_HAMMER) || HasExplosives || CanUse(DINS_FIRE));}}), }, {}, { //Exits Entrance(DEKU_TREE_BASEMENT_WATER_ROOM, {[]{return true;}}), @@ -110,9 +110,9 @@ void AreaTable_Init_DekuTree() { areaTable[DEKU_TREE_BASEMENT_BACK_LOBBY] = Area("Deku Tree Basement Back Lobby", "Deku Tree", DEKU_TREE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (IsAdult || KokiriSword || Boomerang);}}), + EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(BOOMERANG));}}), EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (Here(DEKU_TREE_BASEMENT_BACK_LOBBY, []{return HasFireSourceWithTorch || CanUse(BOW);}) && - (IsAdult || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(DINS_FIRE)));}}), + (CanJumpslash || CanUse(SLINGSHOT) || CanUse(BOW) || CanUse(MEGATON_HAMMER) || HasExplosives || CanUse(DINS_FIRE)));}}), }, {}, { //Exits Entrance(DEKU_TREE_BASEMENT_TORCH_ROOM, {[]{return true;}}), @@ -131,8 +131,8 @@ void AreaTable_Init_DekuTree() { areaTable[DEKU_TREE_BASEMENT_UPPER] = Area("Deku Tree Basement Upper", "Deku Tree", DEKU_TREE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (IsAdult || KokiriSword || Boomerang);}}), - EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (IsAdult || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(DINS_FIRE));}}), + EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(BOOMERANG));}}), + EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (CanJumpslash || CanUse(SLINGSHOT) || CanUse(BOW) || CanUse(MEGATON_HAMMER) || HasExplosives || CanUse(DINS_FIRE));}}), }, {}, { //Exits Entrance(DEKU_TREE_BASEMENT_LOWER, {[]{return true;}}), @@ -153,15 +153,15 @@ void AreaTable_Init_DekuTree() { if (Dungeon::DekuTree.IsMQ()) { areaTable[DEKU_TREE_MQ_LOBBY] = Area("Deku Tree MQ Lobby", "Deku Tree", DEKU_TREE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (IsAdult || KokiriSword || Boomerang);}}), - EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (IsAdult || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(DINS_FIRE));}}), + EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(BOOMERANG));}}), + EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (CanJumpslash || CanUse(SLINGSHOT) || CanUse(BOW) || CanUse(MEGATON_HAMMER) || HasExplosives || CanUse(DINS_FIRE));}}), }, { //Locations LocationAccess(DEKU_TREE_MQ_MAP_CHEST, {[]{return true;}}), - LocationAccess(DEKU_TREE_MQ_SLINGSHOT_CHEST, {[]{return IsAdult || CanChildAttack;}}), + LocationAccess(DEKU_TREE_MQ_SLINGSHOT_CHEST, {[]{return CanAdultAttack || CanChildAttack;}}), LocationAccess(DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, {[]{return HasFireSourceWithTorch || (IsAdult && CanUse(BOW));}}), LocationAccess(DEKU_TREE_MQ_BASEMENT_CHEST, {[]{return HasFireSourceWithTorch || (IsAdult && CanUse(BOW));}}), - LocationAccess(DEKU_TREE_MQ_GS_LOBBY, {[]{return IsAdult || CanChildAttack;}}), + LocationAccess(DEKU_TREE_MQ_GS_LOBBY, {[]{return CanAdultAttack || CanChildAttack;}}), }, { //Exits Entrance(DEKU_TREE_ENTRYWAY, {[]{return true;}}), @@ -201,7 +201,8 @@ void AreaTable_Init_DekuTree() { //Exits Entrance(DEKU_TREE_MQ_BASEMENT_BACK_ROOM, {[]{return Here(DEKU_TREE_MQ_BASEMENT_WATER_ROOM_BACK, []{return (IsChild && CanUse(STICKS)) || CanUse(DINS_FIRE) || Here(DEKU_TREE_MQ_BASEMENT_WATER_ROOM_FRONT, []{return IsAdult && CanUse(FIRE_ARROWS);});}) && - Here(DEKU_TREE_MQ_BASEMENT_WATER_ROOM_BACK, []{return IsAdult || KokiriSword || CanUseProjectile || (Nuts && Sticks);});}}), + Here(DEKU_TREE_MQ_BASEMENT_WATER_ROOM_BACK, []{return CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || + CanUseProjectile || (Nuts && CanUse(STICKS));});}}), Entrance(DEKU_TREE_MQ_BASEMENT_WATER_ROOM_FRONT, {[]{return true;}}), }); diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_dodongos_cavern.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_dodongos_cavern.cpp index 133cdc34035..9f8effbcc80 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_dodongos_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_dodongos_cavern.cpp @@ -54,17 +54,17 @@ void AreaTable_Init_DodongosCavern() { areaTable[DODONGOS_CAVERN_SE_CORRIDOR] = Area("Dodongos Cavern SE Corridor", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(DODONGOS_CAVERN_GS_SCARECROW, {[]{return CanUse(SCARECROW) || (IsAdult && CanUse(LONGSHOT)) || (LogicDCScarecrowGS && (IsAdult || CanChildAttack));}}), + LocationAccess(DODONGOS_CAVERN_GS_SCARECROW, {[]{return CanUse(SCARECROW) || (IsAdult && CanUse(LONGSHOT)) || (LogicDCScarecrowGS && (CanAdultAttack || CanChildAttack));}}), }, { //Exits Entrance(DODONGOS_CAVERN_LOBBY, {[]{return true;}}), - Entrance(DODONGOS_CAVERN_SE_ROOM, {[]{return Here(DODONGOS_CAVERN_SE_CORRIDOR, []{return CanBlastOrSmash || IsAdult || CanChildAttack || (CanTakeDamage && CanShield);});}}), + Entrance(DODONGOS_CAVERN_SE_ROOM, {[]{return Here(DODONGOS_CAVERN_SE_CORRIDOR, []{return CanBlastOrSmash || CanAdultAttack || CanChildAttack || (CanTakeDamage && CanShield);});}}), Entrance(DODONGOS_CAVERN_NEAR_LOWER_LIZALFOS, {[]{return true;}}), }); areaTable[DODONGOS_CAVERN_SE_ROOM] = Area("Dodongos Cavern SE Room", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, {[]{return IsAdult || CanChildAttack;}}), + LocationAccess(DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, {[]{return CanAdultAttack || CanChildAttack;}}), }, { //Exits Entrance(DODONGOS_CAVERN_SE_CORRIDOR, {[]{return true;}}), @@ -78,8 +78,10 @@ void AreaTable_Init_DodongosCavern() { areaTable[DODONGOS_CAVERN_LOWER_LIZALFOS] = Area("Dodongos Cavern Lower Lizalfos", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(DODONGOS_CAVERN_NEAR_LOWER_LIZALFOS, {[]{return Here(DODONGOS_CAVERN_LOWER_LIZALFOS, []{return IsAdult || Slingshot || Sticks || KokiriSword || HasExplosives;});}}), - Entrance(DODONGOS_CAVERN_DODONGO_ROOM, {[]{return Here(DODONGOS_CAVERN_LOWER_LIZALFOS, []{return IsAdult || Slingshot || Sticks || KokiriSword || HasExplosives;});}}), + Entrance(DODONGOS_CAVERN_NEAR_LOWER_LIZALFOS, {[]{return Here(DODONGOS_CAVERN_LOWER_LIZALFOS, []{return CanUse(BOW) || CanUse(SLINGSHOT) || CanUse(STICKS) || CanUse(KOKIRI_SWORD) || + CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(MEGATON_HAMMER) || HasExplosives;});}}), + Entrance(DODONGOS_CAVERN_DODONGO_ROOM, {[]{return Here(DODONGOS_CAVERN_LOWER_LIZALFOS, []{return CanUse(BOW) || CanUse(SLINGSHOT) || CanUse(STICKS) || CanUse(KOKIRI_SWORD) || + CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(MEGATON_HAMMER) || HasExplosives;});}}), }); areaTable[DODONGOS_CAVERN_DODONGO_ROOM] = Area("Dodongos Cavern Dodongo Room", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { @@ -119,7 +121,7 @@ void AreaTable_Init_DodongosCavern() { LocationAccess(DODONGOS_CAVERN_COMPASS_CHEST, {[]{return true;}}), }, { //Exits - Entrance(DODONGOS_CAVERN_STAIRS_LOWER, {[]{return IsAdult || HasExplosives || GoronBracelet;}}), + Entrance(DODONGOS_CAVERN_STAIRS_LOWER, {[]{return CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(MEGATON_HAMMER) || HasExplosives || GoronBracelet;}}), }); areaTable[DODONGOS_CAVERN_ARMOS_ROOM] = Area("Dodongos Cavern Armos Room", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { @@ -156,8 +158,10 @@ void AreaTable_Init_DodongosCavern() { areaTable[DODONGOS_CAVERN_UPPER_LIZALFOS] = Area("Dodongos Cavern Upper Lizalfos", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits Entrance(DODONGOS_CAVERN_LOWER_LIZALFOS, {[]{return true;}}), - Entrance(DODONGOS_CAVERN_FIRST_SLINGSHOT_ROOM, {[]{return Here(DODONGOS_CAVERN_LOWER_LIZALFOS, []{return IsAdult || Slingshot || Sticks || KokiriSword || HasExplosives;});}}), - Entrance(DODONGOS_CAVERN_SECOND_SLINGSHOT_ROOM, {[]{return Here(DODONGOS_CAVERN_LOWER_LIZALFOS, []{return IsAdult || Slingshot || Sticks || KokiriSword || HasExplosives;});}}), + Entrance(DODONGOS_CAVERN_FIRST_SLINGSHOT_ROOM, {[]{return Here(DODONGOS_CAVERN_LOWER_LIZALFOS, []{return CanUse(BOW) || CanUse(SLINGSHOT) || CanUse(STICKS) || CanUse(KOKIRI_SWORD) || + CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(MEGATON_HAMMER) || HasExplosives;});}}), + Entrance(DODONGOS_CAVERN_SECOND_SLINGSHOT_ROOM, {[]{return Here(DODONGOS_CAVERN_LOWER_LIZALFOS, []{return CanUse(BOW) || CanUse(SLINGSHOT) || CanUse(STICKS) || CanUse(KOKIRI_SWORD) || + CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(MEGATON_HAMMER) || HasExplosives;});}}), }); areaTable[DODONGOS_CAVERN_SECOND_SLINGSHOT_ROOM] = Area("Dodongos Cavern Second Slingshot Room", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { @@ -197,7 +201,7 @@ void AreaTable_Init_DodongosCavern() { areaTable[DODONGOS_CAVERN_BACK_ROOM] = Area("Dodongos Cavern Back Room", "Dodongos Cavern", DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(DODONGOS_CAVERN_GS_BACK_ROOM, {[]{return IsAdult || CanChildAttack;}}), + LocationAccess(DODONGOS_CAVERN_GS_BACK_ROOM, {[]{return CanAdultAttack || CanChildAttack;}}), }, { //Exits Entrance(DODONGOS_CAVERN_BOSS_AREA, {[]{return true;}}), @@ -221,10 +225,10 @@ void AreaTable_Init_DodongosCavern() { }, { //Locations LocationAccess(DODONGOS_CAVERN_MQ_MAP_CHEST, {[]{return true;}}), - LocationAccess(DODONGOS_CAVERN_MQ_COMPASS_CHEST, {[]{return IsAdult || CanChildAttack || Nuts;}}), + LocationAccess(DODONGOS_CAVERN_MQ_COMPASS_CHEST, {[]{return CanAdultAttack || CanChildAttack || Nuts;}}), LocationAccess(DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, {[]{return (IsChild && CanUse(STICKS)) || HasFireSource;}}), LocationAccess(DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST, {[]{return CanBlastOrSmash || (IsChild && CanUse(STICKS)) || CanUse(DINS_FIRE) || (IsAdult && (LogicDCJump || HoverBoots || Hookshot));}}), - LocationAccess(DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, {[]{return CanPlay(SongOfTime) && (CanChildAttack || IsAdult);}}), + LocationAccess(DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, {[]{return CanPlay(SongOfTime) && (CanChildAttack || CanAdultAttack);}}), LocationAccess(DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, {[]{return (IsChild && CanUse(STICKS)) || HasFireSource;}}), LocationAccess(DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, {[]{return CanBlastOrSmash;}}), LocationAccess(DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, {[]{return CanStunDeku;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp index 887766fe550..5d90b82c44a 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp @@ -46,12 +46,12 @@ void AreaTable_Init_FireTemple() { areaTable[FIRE_TEMPLE_LOOP_ENEMIES] = Area("Fire Temple Loop Enemies", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits Entrance(FIRE_TEMPLE_FIRST_ROOM, {[]{return SmallKeys(FIRE_TEMPLE, 8) || !IsKeysanity;}}), - Entrance(FIRE_TEMPLE_LOOP_TILES, {[]{return Here(FIRE_TEMPLE_LOOP_ENEMIES, []{return IsAdult || KokiriSword;});}}), + Entrance(FIRE_TEMPLE_LOOP_TILES, {[]{return Here(FIRE_TEMPLE_LOOP_ENEMIES, []{return CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(MEGATON_HAMMER);});}}), }); areaTable[FIRE_TEMPLE_LOOP_TILES] = Area("Fire Temple Loop Tiles", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FIRE_TEMPLE_GS_BOSS_KEY_LOOP, {[]{return IsAdult || CanChildAttack;}}), + LocationAccess(FIRE_TEMPLE_GS_BOSS_KEY_LOOP, {[]{return CanAdultAttack || CanChildAttack;}}), }, { //Exits Entrance(FIRE_TEMPLE_LOOP_ENEMIES, {[]{return true;}}), @@ -64,7 +64,8 @@ void AreaTable_Init_FireTemple() { }, { //Exits Entrance(FIRE_TEMPLE_LOOP_TILES, {[]{return true;}}), - Entrance(FIRE_TEMPLE_LOOP_HAMMER_SWITCH, {[]{return Here(FIRE_TEMPLE_LOOP_FLARE_DANCER, []{return (HasExplosives || CanUse(MEGATON_HAMMER) || CanUse(HOOKSHOT)) && (IsAdult || KokiriSword || Slingshot || Boomerang);});}}), + Entrance(FIRE_TEMPLE_LOOP_HAMMER_SWITCH, {[]{return Here(FIRE_TEMPLE_LOOP_FLARE_DANCER, []{return (HasExplosives || CanUse(MEGATON_HAMMER) || CanUse(HOOKSHOT)) && (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || + CanUse(SLINGSHOT) || CanUse(BOOMERANG));});}}), }); areaTable[FIRE_TEMPLE_LOOP_HAMMER_SWITCH] = Area("Fire Temple Loop Hammer Switch", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, { @@ -110,7 +111,7 @@ void AreaTable_Init_FireTemple() { areaTable[FIRE_TEMPLE_BIG_LAVA_ROOM_NORTH_TILES] = Area("Fire Temple Big Lava Room North Tiles", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM, {[]{return IsAdult;}}), + LocationAccess(FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM, {[]{return CanAdultAttack || HookshotOrBoomerang;}}), }, { //Exits Entrance(FIRE_TEMPLE_BIG_LAVA_ROOM, {[]{return true;}}), @@ -149,7 +150,7 @@ void AreaTable_Init_FireTemple() { areaTable[FIRE_TEMPLE_BOULDER_MAZE_LOWER] = Area("Fire Temple Boulder Maze Lower", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations LocationAccess(FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST, {[]{return true;}}), - LocationAccess(FIRE_TEMPLE_GS_BOULDER_MAZE, {[]{return HasExplosives && (IsAdult || Boomerang || CanUse(HOOKSHOT));}}), + LocationAccess(FIRE_TEMPLE_GS_BOULDER_MAZE, {[]{return HasExplosives && (IsAdult || HookshotOrBoomerang);}}), }, { //Exits Entrance(FIRE_TEMPLE_SHORTCUT_ROOM, {[]{return true;}}), @@ -203,7 +204,7 @@ void AreaTable_Init_FireTemple() { areaTable[FIRE_TEMPLE_SCARECROW_ROOM] = Area("Fire Temple Scarecrow Room", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FIRE_TEMPLE_GS_SCARECROW_CLIMB, {[]{return IsAdult || CanChildAttack;}}), + LocationAccess(FIRE_TEMPLE_GS_SCARECROW_CLIMB, {[]{return CanAdultAttack || CanChildAttack;}}), }, { //Exits Entrance(FIRE_TEMPLE_BOULDER_MAZE_UPPER, {[]{return true;}}), @@ -276,8 +277,10 @@ void AreaTable_Init_FireTemple() { areaTable[FIRE_TEMPLE_UPPER_FLARE_DANCER] = Area("Fire Temple Upper Flare Dancer", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(FIRE_TEMPLE_LATE_FIRE_MAZE, {[]{return Here(FIRE_TEMPLE_UPPER_FLARE_DANCER, []{return (HasExplosives || CanUse(MEGATON_HAMMER) || CanUse(HOOKSHOT)) && (IsAdult || KokiriSword || Slingshot || Boomerang);});}}), - Entrance(FIRE_TEMPLE_WEST_CLIMB, {[]{return Here(FIRE_TEMPLE_UPPER_FLARE_DANCER, []{return (HasExplosives || CanUse(MEGATON_HAMMER) || CanUse(HOOKSHOT)) && (IsAdult || KokiriSword || Slingshot || Boomerang);});}}), + Entrance(FIRE_TEMPLE_LATE_FIRE_MAZE, {[]{return Here(FIRE_TEMPLE_UPPER_FLARE_DANCER, []{return (HasExplosives || CanUse(MEGATON_HAMMER) || CanUse(HOOKSHOT)) && ((CanUse(KOKIRI_SWORD)) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || + CanUse(SLINGSHOT) || CanUse(BOOMERANG));});}}), + Entrance(FIRE_TEMPLE_WEST_CLIMB, {[]{return Here(FIRE_TEMPLE_UPPER_FLARE_DANCER, []{return (HasExplosives || CanUse(MEGATON_HAMMER) || CanUse(HOOKSHOT)) && ((CanUse(KOKIRI_SWORD)) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || + CanUse(SLINGSHOT) || CanUse(BOOMERANG));});}}), }); areaTable[FIRE_TEMPLE_WEST_CLIMB] = Area("Fire Temple West Climb", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { @@ -314,14 +317,14 @@ void AreaTable_Init_FireTemple() { if (Dungeon::FireTemple.IsMQ()) { areaTable[FIRE_TEMPLE_MQ_LOWER] = Area("Fire Temple MQ Lower", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, {[]{return IsAdult || KokiriSword || Sticks || Slingshot || Bombs || CanUse(DINS_FIRE);}}), + LocationAccess(FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, {[]{return CanJumpslash || CanUse(SLINGSHOT) || CanUse(BOW) || Bombs || CanUse(DINS_FIRE);}}), LocationAccess(FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, {[]{return IsAdult && (LogicFewerTunicRequirements || CanUse(GORON_TUNIC)) && (((CanUse(HOVER_BOOTS) || (LogicFireMQNearBoss && CanUse(BOW))) && HasFireSource) || (CanUse(HOOKSHOT) && CanUse(FIRE_ARROWS) || (CanUse(DINS_FIRE) && ((DamageMultiplier.IsNot(DAMAGEMULTIPLIER_OHKO) && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_QUADRUPLE) && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_OCTUPLE) && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_SEXDECUPLE)) || CanUse(GORON_TUNIC) || CanUse(BOW) || CanUse(LONGSHOT)))));}}), //Trick: IsAdult && (LogicFewerTunicRequirements || CanUse(GORON_TUNIC)) && (((CanUse(HOVER_BOOTS) || (LogicFireMQNearBoss && CanUse(BOW))) && HasFireSource) || (CanUse(HOOKSHOT) && CanUse(FIRE_ARROWS) || (CanUse(DINS_FIRE) && ((DamageMultiplier.IsNot(DAMAGEMULTIPLIER_OHKO) && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_QUADRUPLE) && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_OCTUPLE) && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_SEXDECUPLE)) || CanUse(GORON_TUNIC) || CanUse(BOW) || CanUse(LONGSHOT))))) }, { //Exits Entrance(FIRE_TEMPLE_ENTRYWAY, {[]{return true;}}), Entrance(FIRE_TEMPLE_BOSS_ENTRYWAY, {[]{return IsAdult && CanUse(GORON_TUNIC) && CanUse(MEGATON_HAMMER) && BossKeyFireTemple && ((HasFireSource && (LogicFireBossDoorJump || HoverBoots)) || HasAccessTo(FIRE_TEMPLE_MQ_UPPER));}}), - Entrance(FIRE_TEMPLE_MQ_LOWER_LOCKED_DOOR, {[]{return SmallKeys(FIRE_TEMPLE, 5) && (IsAdult || KokiriSword);}}), + Entrance(FIRE_TEMPLE_MQ_LOWER_LOCKED_DOOR, {[]{return SmallKeys(FIRE_TEMPLE, 5) && (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD));}}), Entrance(FIRE_TEMPLE_MQ_BIG_LAVA_ROOM, {[]{return IsAdult && FireTimer >= 24 && CanUse(MEGATON_HAMMER);}}), }); @@ -330,7 +333,7 @@ void AreaTable_Init_FireTemple() { EventAccess(&FairyPot, {[]{return true;}}), }, { //Locations - LocationAccess(FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, {[]{return IsAdult && (HasExplosives || Hammer || Hookshot);}}), + LocationAccess(FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, {[]{return IsAdult && (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)) && (HasExplosives || Hammer || Hookshot);}}), LocationAccess(FIRE_TEMPLE_MQ_MAP_CHEST, {[]{return IsAdult && CanUse(MEGATON_HAMMER);}}), }, {}); @@ -353,7 +356,7 @@ void AreaTable_Init_FireTemple() { areaTable[FIRE_TEMPLE_MQ_LOWER_MAZE] = Area("Fire Temple MQ Lower Maze", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, {[]{return true;}}), + LocationAccess(FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, {[]{return CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD);}}), LocationAccess(FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, {[]{return HasExplosives && (LogicFireMQMazeSideRoom || HasAccessTo(FIRE_TEMPLE_MQ_UPPER_MAZE));}}), //Trick: HasExplosives && (LogicFireMQMazeSideRoom || FIRE_TEMPLE_MQ_UPPER_MAZE.Adult()) }, { @@ -378,7 +381,7 @@ void AreaTable_Init_FireTemple() { areaTable[FIRE_TEMPLE_MQ_UPPER] = Area("Fire Temple MQ Upper", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FIRE_TEMPLE_MQ_FREESTANDING_KEY, {[]{return (IsAdult && CanUse(HOOKSHOT)) || LogicFireMQFlameMaze;}}), + LocationAccess(FIRE_TEMPLE_MQ_FREESTANDING_KEY, {[]{return ((CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(SLINGSHOT) || CanUse(BOOMERANG)) && CanUse(HOOKSHOT)) || LogicFireMQFlameMaze;}}), //Trick: (IsAdult && CanUse(HOOKSHOT)) || LogicFireMQFlameMaze LocationAccess(FIRE_TEMPLE_MQ_CHEST_ON_FIRE, {[]{return ((IsAdult && CanUse(HOOKSHOT)) || LogicFireMQFlameMaze) && SmallKeys(FIRE_TEMPLE, 4);}}), //Trick: ((IsAdult && CanUse(HOOKSHOT)) || LogicFireMQFlameMaze) && SmallKeys(FIRE_TEMPLE, 4) diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_forest_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_forest_temple.cpp index d4e95e15c03..fea9fda6f76 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_forest_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_forest_temple.cpp @@ -34,7 +34,7 @@ void AreaTable_Init_ForestTemple() { areaTable[FOREST_TEMPLE_SOUTH_CORRIDOR] = Area("Forest Temple South Corridor", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits Entrance(FOREST_TEMPLE_FIRST_ROOM, {[]{return true;}}), - Entrance(FOREST_TEMPLE_LOBBY, {[]{return IsAdult || CanChildAttack || Nuts;}}), + Entrance(FOREST_TEMPLE_LOBBY, {[]{return CanAdultAttack || CanChildAttack || Nuts;}}), }); areaTable[FOREST_TEMPLE_LOBBY] = Area("Forest Temple Lobby", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, { @@ -66,7 +66,7 @@ void AreaTable_Init_ForestTemple() { EventAccess(&FairyPot, {[]{return true;}}), }, { //Locations - LocationAccess(FOREST_TEMPLE_FIRST_STALFOS_CHEST, {[]{return IsAdult || KokiriSword;}}), + LocationAccess(FOREST_TEMPLE_FIRST_STALFOS_CHEST, {[]{return CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(MEGATON_HAMMER);}}), }, { //Exits Entrance(FOREST_TEMPLE_NORTH_CORRIDOR, {[]{return true;}}), @@ -74,8 +74,8 @@ void AreaTable_Init_ForestTemple() { areaTable[FOREST_TEMPLE_NW_OUTDOORS_LOWER] = Area("Forest Temple NW Outdoors Lower", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (IsAdult || KokiriSword || Boomerang);}}), - EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (IsAdult || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(DINS_FIRE));}}), + EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(BOOMERANG));}}), + EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (CanJumpslash || CanUse(SLINGSHOT) || CanUse(BOW) || CanUse(MEGATON_HAMMER) || HasExplosives || CanUse(DINS_FIRE));}}), }, { //Locations LocationAccess(FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, {[]{return CanUse(LONGSHOT) || Here(FOREST_TEMPLE_NW_OUTDOORS_UPPER, []{return HookshotOrBoomerang;});}}), @@ -90,8 +90,8 @@ void AreaTable_Init_ForestTemple() { areaTable[FOREST_TEMPLE_NW_OUTDOORS_UPPER] = Area("Forest Temple NW Outdoors Upper", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (IsAdult || KokiriSword || Boomerang);}}), - EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (IsAdult || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(DINS_FIRE));}}), + EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(BOOMERANG));}}), + EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (CanJumpslash || CanUse(SLINGSHOT) || CanUse(BOW) || CanUse(MEGATON_HAMMER) || HasExplosives || CanUse(DINS_FIRE));}}), }, {}, { //Exits Entrance(FOREST_TEMPLE_NW_OUTDOORS_LOWER, {[]{return true;}}), @@ -102,8 +102,8 @@ void AreaTable_Init_ForestTemple() { areaTable[FOREST_TEMPLE_NE_OUTDOORS_LOWER] = Area("Forest Temple NE Outdoors Lower", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (IsAdult || KokiriSword || Boomerang);}}), - EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (IsAdult || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(DINS_FIRE));}}), + EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(BOOMERANG));}}), + EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (CanJumpslash || CanUse(SLINGSHOT) || CanUse(BOW) || CanUse(MEGATON_HAMMER) || HasExplosives || CanUse(DINS_FIRE));}}), }, { //Locations LocationAccess(FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, {[]{return CanUse(HOOKSHOT) || HasAccessTo(FOREST_TEMPLE_FALLING_ROOM) || (HasAccessTo(FOREST_TEMPLE_NE_OUTDOORS_UPPER) && IsAdult && LogicForestOutdoorsLedge && HoverBoots);}}), @@ -118,22 +118,22 @@ void AreaTable_Init_ForestTemple() { areaTable[FOREST_TEMPLE_NE_OUTDOORS_UPPER] = Area("Forest Temple NE Outdoors Upper", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (IsAdult || KokiriSword || Boomerang);}}), - EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (IsAdult || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(DINS_FIRE));}}), + EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(BOOMERANG));}}), + EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (CanJumpslash || CanUse(SLINGSHOT) || CanUse(BOW) || CanUse(MEGATON_HAMMER) || HasExplosives || CanUse(DINS_FIRE));}}), }, {}, { //Exits Entrance(FOREST_TEMPLE_NE_OUTDOORS_LOWER, {[]{return true;}}), Entrance(FOREST_TEMPLE_MAP_ROOM, {[]{return true;}}), - Entrance(FOREST_TEMPLE_FALLING_ROOM, {[]{return LogicForestDoorFrame && CanUse(HOVER_BOOTS) && CanUse(SCARECROW);}}), + Entrance(FOREST_TEMPLE_FALLING_ROOM, {[]{return LogicForestDoorFrame && CanJumpslash && CanUse(HOVER_BOOTS) && CanUse(SCARECROW);}}), }); areaTable[FOREST_TEMPLE_MAP_ROOM] = Area("Forest Temple Map Room", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FOREST_TEMPLE_MAP_CHEST, {[]{return Here(FOREST_TEMPLE_MAP_ROOM, []{return HasExplosives || CanUse(MEGATON_HAMMER) || CanUse(BOW) || ((IsAdult || Sticks || KokiriSword || Slingshot) && (Nuts || HookshotOrBoomerang || CanShield));});}}), + LocationAccess(FOREST_TEMPLE_MAP_CHEST, {[]{return Here(FOREST_TEMPLE_MAP_ROOM, []{return HasExplosives || CanUse(MEGATON_HAMMER) || CanUse(BOW) || ((CanJumpslash || CanUse(SLINGSHOT)) && (Nuts || HookshotOrBoomerang || CanShield));});}}), }, { //Exits - Entrance(FOREST_TEMPLE_NW_OUTDOORS_LOWER, {[]{return Here(FOREST_TEMPLE_MAP_ROOM, []{return HasExplosives || CanUse(MEGATON_HAMMER) || CanUse(BOW) || ((IsAdult || Sticks || KokiriSword || Slingshot) && (Nuts || HookshotOrBoomerang || CanShield));});}}), - Entrance(FOREST_TEMPLE_NE_OUTDOORS_UPPER, {[]{return Here(FOREST_TEMPLE_MAP_ROOM, []{return HasExplosives || CanUse(MEGATON_HAMMER) || CanUse(BOW) || ((IsAdult || Sticks || KokiriSword || Slingshot) && (Nuts || HookshotOrBoomerang || CanShield));});}}), + Entrance(FOREST_TEMPLE_NW_OUTDOORS_LOWER, {[]{return Here(FOREST_TEMPLE_MAP_ROOM, []{return HasExplosives || CanUse(MEGATON_HAMMER) || CanUse(BOW) || ((CanJumpslash || CanUse(SLINGSHOT)) && (Nuts || HookshotOrBoomerang || CanShield));});}}), + Entrance(FOREST_TEMPLE_NE_OUTDOORS_UPPER, {[]{return Here(FOREST_TEMPLE_MAP_ROOM, []{return HasExplosives || CanUse(MEGATON_HAMMER) || CanUse(BOW) || ((CanJumpslash || CanUse(SLINGSHOT)) && (Nuts || HookshotOrBoomerang || CanShield));});}}), }); areaTable[FOREST_TEMPLE_SEWER] = Area("Forest Temple Sewer", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { @@ -147,12 +147,12 @@ void AreaTable_Init_ForestTemple() { areaTable[FOREST_TEMPLE_BELOW_BOSS_KEY_CHEST] = Area("Forest Temple Below Boss Key Chest", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(FOREST_TEMPLE_NW_OUTDOORS_UPPER, {[]{return Here(FOREST_TEMPLE_BELOW_BOSS_KEY_CHEST, []{return HasExplosives || CanUse(MEGATON_HAMMER) || CanUse(BOW) || ((IsAdult || Sticks || KokiriSword || Slingshot) && (Nuts || HookshotOrBoomerang || CanShield));});}}), + Entrance(FOREST_TEMPLE_NW_OUTDOORS_UPPER, {[]{return Here(FOREST_TEMPLE_BELOW_BOSS_KEY_CHEST, []{return HasExplosives || CanUse(MEGATON_HAMMER) || CanUse(BOW) || ((CanJumpslash || CanUse(SLINGSHOT)) && (Nuts || HookshotOrBoomerang || CanShield));});}}), }); areaTable[FOREST_TEMPLE_FLOORMASTER_ROOM] = Area("Forest Temple Floormaster Room", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FOREST_TEMPLE_FLOORMASTER_CHEST, {[]{return IsAdult || CanChildDamage;}}), + LocationAccess(FOREST_TEMPLE_FLOORMASTER_CHEST, {[]{return CanAdultDamage || CanChildDamage;}}), }, { //Exits Entrance(FOREST_TEMPLE_NW_OUTDOORS_UPPER, {[]{return true;}}), @@ -161,7 +161,7 @@ void AreaTable_Init_ForestTemple() { areaTable[FOREST_TEMPLE_WEST_CORRIDOR] = Area("Forest Temple West Corridor", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits Entrance(FOREST_TEMPLE_LOBBY, {[]{return SmallKeys(FOREST_TEMPLE, 1, 5);}}), - Entrance(FOREST_TEMPLE_BLOCK_PUSH_ROOM, {[]{return IsAdult || CanChildAttack || Nuts;}}), + Entrance(FOREST_TEMPLE_BLOCK_PUSH_ROOM, {[]{return CanAdultAttack || CanChildAttack || Nuts;}}), }); areaTable[FOREST_TEMPLE_BLOCK_PUSH_ROOM] = Area("Forest Temple Block Push Room", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { @@ -172,7 +172,7 @@ void AreaTable_Init_ForestTemple() { Entrance(FOREST_TEMPLE_WEST_CORRIDOR, {[]{return true;}}), Entrance(FOREST_TEMPLE_NW_OUTDOORS_UPPER, {[]{return CanUse(HOVER_BOOTS) || (LogicForestOutsideBackdoor && CanJumpslash && GoronBracelet);}}), Entrance(FOREST_TEMPLE_NW_CORRIDOR_TWISTED, {[]{return IsAdult && GoronBracelet && SmallKeys(FOREST_TEMPLE, 2);}}), - Entrance(FOREST_TEMPLE_NW_CORRIDOR_STRAIGHTENED, {[]{return CanUse(BOW) && GoronBracelet && SmallKeys(FOREST_TEMPLE, 2);}}), + Entrance(FOREST_TEMPLE_NW_CORRIDOR_STRAIGHTENED, {[]{return (CanUse(BOW) || CanUse(SLINGSHOT)) && GoronBracelet && SmallKeys(FOREST_TEMPLE, 2);}}), }); areaTable[FOREST_TEMPLE_NW_CORRIDOR_TWISTED] = Area("Forest Temple NW Corridor Twisted", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { @@ -204,11 +204,11 @@ void AreaTable_Init_ForestTemple() { areaTable[FOREST_TEMPLE_UPPER_STALFOS] = Area("Forest Temple Upper Stalfos", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FOREST_TEMPLE_BOW_CHEST, {[]{return IsAdult || KokiriSword;}}), + LocationAccess(FOREST_TEMPLE_BOW_CHEST, {[]{return CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(MEGATON_HAMMER);}}), }, { //Exits - Entrance(FOREST_TEMPLE_RED_POE_ROOM, {[]{return IsAdult || KokiriSword;}}), - Entrance(FOREST_TEMPLE_BLUE_POE_ROOM, {[]{return IsAdult || KokiriSword;}}), + Entrance(FOREST_TEMPLE_RED_POE_ROOM, {[]{return CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(MEGATON_HAMMER);}}), + Entrance(FOREST_TEMPLE_BLUE_POE_ROOM, {[]{return CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(MEGATON_HAMMER);}}), }); areaTable[FOREST_TEMPLE_BLUE_POE_ROOM] = Area("Forest Temple Blue Poe Room", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, { @@ -261,8 +261,8 @@ void AreaTable_Init_ForestTemple() { areaTable[FOREST_TEMPLE_EAST_CORRIDOR] = Area("Forest Temple East Corridor", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(FOREST_TEMPLE_LOBBY, {[]{return IsAdult || CanChildAttack || Nuts;}}), - Entrance(FOREST_TEMPLE_GREEN_POE_ROOM, {[]{return IsAdult || CanChildAttack || Nuts;}}), + Entrance(FOREST_TEMPLE_LOBBY, {[]{return CanAdultAttack || CanChildAttack || Nuts;}}), + Entrance(FOREST_TEMPLE_GREEN_POE_ROOM, {[]{return CanAdultAttack || CanChildAttack || Nuts;}}), }); areaTable[FOREST_TEMPLE_BOSS_REGION] = Area("Forest Temple Boss Region", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { @@ -282,12 +282,12 @@ void AreaTable_Init_ForestTemple() { if (Dungeon::ForestTemple.IsMQ()) { areaTable[FOREST_TEMPLE_MQ_LOBBY] = Area("Forest Temple MQ Lobby", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST, {[]{return IsAdult || Bombs || CanUse(STICKS) || Nuts || CanUse(BOOMERANG) || CanUse(DINS_FIRE) || KokiriSword || CanUse(SLINGSHOT);}}), + LocationAccess(FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST, {[]{return CanJumpslash || Bombs || Nuts || HookshotOrBoomerang || CanUse(DINS_FIRE) || CanUse(SLINGSHOT) || CanUse(BOW) || CanUse(HOVER_BOOTS);}}), LocationAccess(FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY, {[]{return HookshotOrBoomerang;}}), }, { //Exits Entrance(FOREST_TEMPLE_ENTRYWAY, {[]{return true;}}), - Entrance(FOREST_TEMPLE_MQ_CENTRAL_AREA, {[]{return SmallKeys(FOREST_TEMPLE, 1) && (IsAdult || CanChildAttack || Nuts);}}), + Entrance(FOREST_TEMPLE_MQ_CENTRAL_AREA, {[]{return SmallKeys(FOREST_TEMPLE, 1) && (CanAdultAttack || CanChildAttack || Nuts);}}), }); areaTable[FOREST_TEMPLE_MQ_CENTRAL_AREA] = Area("Forest Temple MQ Central Area", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, { @@ -295,12 +295,12 @@ void AreaTable_Init_ForestTemple() { EventAccess(&FairyPot, {[]{return true;}}), }, { //Locations - LocationAccess(FOREST_TEMPLE_MQ_WOLFOS_CHEST, {[]{return (CanPlay(SongOfTime) || IsChild) && (IsAdult || CanUse(DINS_FIRE) || CanUse(STICKS) || CanUse(SLINGSHOT) || KokiriSword);}}), - LocationAccess(FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM, {[]{return IsAdult || KokiriSword;}}), + LocationAccess(FOREST_TEMPLE_MQ_WOLFOS_CHEST, {[]{return (CanPlay(SongOfTime) || IsChild) && (CanJumpslash || CanUse(DINS_FIRE) || CanUse(SLINGSHOT));}}), + LocationAccess(FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM, {[]{return CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(MEGATON_HAMMER);}}), }, { //Exits - Entrance(FOREST_TEMPLE_MQ_NW_OUTDOORS, {[]{return (IsAdult && CanUse(BOW)) || (IsChild && CanUse(SLINGSHOT));}}), - Entrance(FOREST_TEMPLE_MQ_NE_OUTDOORS, {[]{return (IsAdult && CanUse(BOW)) || (IsChild && CanUse(SLINGSHOT));}}), //This is as far as child can get + Entrance(FOREST_TEMPLE_MQ_NW_OUTDOORS, {[]{return CanUse(BOW) || CanUse(SLINGSHOT);}}), + Entrance(FOREST_TEMPLE_MQ_NE_OUTDOORS, {[]{return CanUse(BOW) || CanUse(SLINGSHOT);}}), //This is as far as child can get Entrance(FOREST_TEMPLE_MQ_AFTER_BLOCK_PUZZLE, {[]{return IsAdult && (GoronBracelet || (LogicForestMQBlockPuzzle && HasBombchus && IsAdult && CanUse(HOOKSHOT)));}}), //Trick: IsAdult && (GoronBracelet || (LogicForestMQBlockPuzzle && HasBombchus && IsAdult && CanUse(HOOKSHOT))) Entrance(FOREST_TEMPLE_MQ_OUTDOOR_LEDGE, {[]{return (LogicForestMQHallwaySwitchJS && IsAdult && CanUse(HOVER_BOOTS)) || (LogicForestMQHallwaySwitchBoomerang && CanUse(BOOMERANG)) || (LogicForestMQHallwaySwitchHookshot && IsAdult && CanUse(HOOKSHOT));}}), @@ -321,7 +321,7 @@ void AreaTable_Init_ForestTemple() { areaTable[FOREST_TEMPLE_MQ_OUTDOOR_LEDGE] = Area("Forest Temple MQ Outdoor Ledge", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FOREST_TEMPLE_MQ_REDEAD_CHEST, {[]{return true;}}), + LocationAccess(FOREST_TEMPLE_MQ_REDEAD_CHEST, {[]{return CanJumpslash;}}), }, { //Exits Entrance(FOREST_TEMPLE_MQ_NW_OUTDOORS, {[]{return true;}}), @@ -329,7 +329,7 @@ void AreaTable_Init_ForestTemple() { areaTable[FOREST_TEMPLE_MQ_NW_OUTDOORS] = Area("Forest Temple MQ NW Outdoors", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, {[]{return true;}}), + LocationAccess(FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, {[]{return CanAdultAttack || CanChildAttack;}}), }, { //Exits Entrance(FOREST_TEMPLE_MQ_NE_OUTDOORS, {[]{return (IsAdult && (CanUse(IRON_BOOTS) || CanUse(LONGSHOT) || (LogicForestMQWellSwim && CanUse(HOOKSHOT)))) || ProgressiveScale >= 2;}}), @@ -339,8 +339,8 @@ void AreaTable_Init_ForestTemple() { areaTable[FOREST_TEMPLE_MQ_NE_OUTDOORS] = Area("Forest Temple MQ NE Outdoors", "Forest Temple", FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (IsAdult || KokiriSword || Boomerang);}}), - EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (IsAdult || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(DINS_FIRE));}}), + EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(BOOMERANG));}}), + EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || (CanJumpslash || CanUse(SLINGSHOT) || CanUse(BOW) || CanUse(MEGATON_HAMMER) || HasExplosives || CanUse(DINS_FIRE));}}), }, { //Locations LocationAccess(FOREST_TEMPLE_MQ_WELL_CHEST, {[]{return (IsAdult && CanUse(BOW)) || (IsChild && CanUse(SLINGSHOT));}}), @@ -376,7 +376,7 @@ void AreaTable_Init_ForestTemple() { EventAccess(&ForestTempleJoAndBeth, {[]{return ForestTempleJoAndBeth || (IsAdult && CanUse(BOW));}}), }, { //Locations - LocationAccess(FOREST_TEMPLE_MQ_BOW_CHEST, {[]{return true;}}), + LocationAccess(FOREST_TEMPLE_MQ_BOW_CHEST, {[]{return CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(MEGATON_HAMMER);}}), LocationAccess(FOREST_TEMPLE_MQ_MAP_CHEST, {[]{return IsAdult && CanUse(BOW);}}), LocationAccess(FOREST_TEMPLE_MQ_COMPASS_CHEST, {[]{return IsAdult && CanUse(BOW);}}), }, { diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp index ebb8625ec61..292bd6ed945 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp @@ -56,7 +56,7 @@ void AreaTable_Init_GanonsCastle() { EventAccess(&ForestTrialClear, {[]{return CanUse(LIGHT_ARROWS) && (FireArrows || DinsFire);}}), }, { //Locations - LocationAccess(GANONS_CASTLE_FOREST_TRIAL_CHEST, {[]{return IsAdult || CanChildDamage;}}), + LocationAccess(GANONS_CASTLE_FOREST_TRIAL_CHEST, {[]{return CanAdultDamage || CanChildDamage;}}), }, {}); areaTable[GANONS_CASTLE_FIRE_TRIAL] = Area("Ganon's Castle Fire Trial", "Ganon's Castle", GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { @@ -68,7 +68,7 @@ void AreaTable_Init_GanonsCastle() { //Events EventAccess(&BlueFireAccess, {[]{return BlueFireAccess || HasBottle;}}), EventAccess(&FairyPot, {[]{return FairyPot || BlueFire;}}), - EventAccess(&WaterTrialClear, {[]{return BlueFire && Hammer && CanUse(LIGHT_ARROWS);}}), + EventAccess(&WaterTrialClear, {[]{return BlueFire && IsAdult && CanUse(MEGATON_HAMMER) && CanUse(LIGHT_ARROWS);}}), }, { //Locations LocationAccess(GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST, {[]{return true;}}), @@ -77,7 +77,7 @@ void AreaTable_Init_GanonsCastle() { areaTable[GANONS_CASTLE_SHADOW_TRIAL] = Area("Ganon's Castle Shadow Trial", "Ganon's Castle", GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&ShadowTrialClear, {[]{return CanUse(LIGHT_ARROWS) && Hammer && ((FireArrows && (LogicLensCastle || CanUse(LENS_OF_TRUTH))) || (CanUse(LONGSHOT) && (CanUse(HOVER_BOOTS) || (DinsFire && (LogicLensCastle || CanUse(LENS_OF_TRUTH))))));}}), + EventAccess(&ShadowTrialClear, {[]{return CanUse(LIGHT_ARROWS) && CanUse(MEGATON_HAMMER) && ((FireArrows && (LogicLensCastle || CanUse(LENS_OF_TRUTH))) || (CanUse(LONGSHOT) && (CanUse(HOVER_BOOTS) || (DinsFire && (LogicLensCastle || CanUse(LENS_OF_TRUTH))))));}}), }, { //Locations LocationAccess(GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST, {[]{return CanUse(FIRE_ARROWS) || CanUse(HOOKSHOT) || CanUse(HOVER_BOOTS) || CanPlay(SongOfTime) || IsChild;}}), @@ -87,7 +87,7 @@ void AreaTable_Init_GanonsCastle() { areaTable[GANONS_CASTLE_SPIRIT_TRIAL] = Area("Ganon's Castle Spirit Trial", "Ganon's Castle", GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&NutPot, {[]{return NutPot || ((LogicSpiritTrialHookshot || CanUse(HOOKSHOT)) && HasBombchus && Bow && (MirrorShield || (SunlightArrows && CanUse(LIGHT_ARROWS))) && IsAdult);}}), - EventAccess(&SpiritTrialClear, {[]{return CanUse(LIGHT_ARROWS) && (MirrorShield || SunlightArrows) && HasBombchus && (LogicSpiritTrialHookshot || CanUse(HOOKSHOT));}}), + EventAccess(&SpiritTrialClear, {[]{return CanUse(LIGHT_ARROWS) && (IsAdult && CanUse(MIRROR_SHIELD) || SunlightArrows) && HasBombchus && (LogicSpiritTrialHookshot || CanUse(HOOKSHOT));}}), }, { //Locations LocationAccess(GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, {[]{return LogicSpiritTrialHookshot || CanUse(HOOKSHOT);}}), @@ -112,9 +112,9 @@ void AreaTable_Init_GanonsCastle() { areaTable[GANONS_CASTLE_TOWER] = Area("Ganon's Castle Tower", "Ganons Castle", GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(GANONS_TOWER_BOSS_KEY_CHEST, {[]{return true;}}), - LocationAccess(GANONDORF_HINT, {[]{return BossKeyGanonsCastle;}}), - LocationAccess(GANON, {[]{return BossKeyGanonsCastle && CanUse(LIGHT_ARROWS);}}), + LocationAccess(GANONS_TOWER_BOSS_KEY_CHEST, {[]{return CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD);}}), + LocationAccess(GANONDORF_HINT, {[]{return BossKeyGanonsCastle && (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD));}}), + LocationAccess(GANON, {[]{return BossKeyGanonsCastle && CanUse(LIGHT_ARROWS) && CanUse(MASTER_SWORD);}}), }, {}); /*--------------------------- @@ -123,7 +123,7 @@ void AreaTable_Init_GanonsCastle() { if (Dungeon::GanonsCastle.IsMQ()) { areaTable[GANONS_CASTLE_MQ_LOBBY] = Area("Ganon's Castle MQ Lobby", "Ganons Castle", GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(GANONS_CASTLE_ENTRYWAY, {[]{return (IsAdult || (HasExplosives || ((Nuts || Boomerang) && (Sticks || KokiriSword))));}}), + Entrance(GANONS_CASTLE_ENTRYWAY, {[]{return (CanUse(MASTER_SWORD) || (HasExplosives || ((Nuts || Boomerang) && (Sticks || KokiriSword))));}}), Entrance(GANONS_CASTLE_MQ_FOREST_TRIAL, {[]{return true;}}), Entrance(GANONS_CASTLE_MQ_FIRE_TRIAL, {[]{return true;}}), Entrance(GANONS_CASTLE_MQ_WATER_TRIAL, {[]{return true;}}), @@ -153,12 +153,12 @@ void AreaTable_Init_GanonsCastle() { areaTable[GANONS_CASTLE_MQ_FOREST_TRIAL] = Area("Ganon's Castle MQ Forest Trial", "Ganons Castle", GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&ForestTrialClear, {[]{return IsAdult && CanUse(LIGHT_ARROWS) && CanPlay(SongOfTime);}}), + EventAccess(&ForestTrialClear, {[]{return IsAdult && CanUse(LIGHT_ARROWS) && (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)) &&CanPlay(SongOfTime);}}), }, { //Locations - LocationAccess(GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, {[]{return (IsAdult && CanUse(BOW)) || (IsChild && CanUse(SLINGSHOT));}}), - LocationAccess(GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST, {[]{return HasFireSource;}}), - LocationAccess(GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, {[]{return HookshotOrBoomerang;}}), + LocationAccess(GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, {[]{return (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)) && (CanUse(BOW) || CanUse(SLINGSHOT));}}), + LocationAccess(GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST, {[]{return (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)) && HasFireSource;}}), + LocationAccess(GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, {[]{return (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)) && HookshotOrBoomerang;}}), }, {}); areaTable[GANONS_CASTLE_MQ_FIRE_TRIAL] = Area("Ganon's Castle MQ Fire Trial", "Ganons Castle", GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { @@ -170,10 +170,10 @@ void AreaTable_Init_GanonsCastle() { areaTable[GANONS_CASTLE_MQ_WATER_TRIAL] = Area("Ganon's Castle MQ Water Trial", "Ganons Castle", GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&WaterTrialClear, {[]{return BlueFire && IsAdult && CanUse(LIGHT_ARROWS) && SmallKeys(GANONS_CASTLE, 3);}}), - EventAccess(&BlueFireAccess, {[]{return BlueFireAccess || HasBottle;}}), + EventAccess(&BlueFireAccess, {[]{return BlueFireAccess || (HasBottle && CanJumpslash);}}), }, { //Locations - LocationAccess(GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, {[]{return BlueFire && (IsAdult || CanUse(STICKS) || KokiriSword || CanUseProjectile);}}), + LocationAccess(GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, {[]{return BlueFire;}}), }, {}); areaTable[GANONS_CASTLE_MQ_SHADOW_TRIAL] = Area("Ganon's Castle MQ Shadow Trial", "Ganons Castle", GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { @@ -203,11 +203,11 @@ void AreaTable_Init_GanonsCastle() { areaTable[GANONS_CASTLE_MQ_LIGHT_TRIAL] = Area("Ganon's Castle MQ Light Trial", "Ganons Castle", GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&LightTrialClear, {[]{return IsAdult && CanUse(LIGHT_ARROWS) && SmallKeys(GANONS_CASTLE, 3) && (LogicLensCastleMQ || CanUse(LENS_OF_TRUTH)) && (Hookshot || LogicLightTrialMQ);}}), + EventAccess(&LightTrialClear, {[]{return IsAdult && (CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)) && CanUse(LIGHT_ARROWS) && SmallKeys(GANONS_CASTLE, 3) && (LogicLensCastleMQ || CanUse(LENS_OF_TRUTH)) && (Hookshot || LogicLightTrialMQ);}}), //Trick: IsAdult && CanUse(LIGHT_ARROWS) && SmallKeys(GANONS_CASTLE, 3) && (LogicLensCastleMQ || CanUse(LENS_OF_TRUTH)) && (Hookshot || LogicLightTrialMQ) }, { //Locations - LocationAccess(GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, {[]{return CanPlay(ZeldasLullaby);}}), + LocationAccess(GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, {[]{return (CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)) && CanPlay(ZeldasLullaby);}}), }, {}); } } diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_training_grounds.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_training_grounds.cpp index 77cf0a4e289..82b4fab443d 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_training_grounds.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_training_grounds.cpp @@ -25,13 +25,13 @@ void AreaTable_Init_GerudoTrainingGrounds() { //Locations LocationAccess(GERUDO_TRAINING_GROUNDS_LOBBY_LEFT_CHEST, {[]{return CanUse(BOW) || CanUse(SLINGSHOT);}}), LocationAccess(GERUDO_TRAINING_GROUNDS_LOBBY_RIGHT_CHEST, {[]{return CanUse(BOW) || CanUse(SLINGSHOT);}}), - LocationAccess(GERUDO_TRAINING_GROUNDS_STALFOS_CHEST, {[]{return IsAdult || KokiriSword;}}), - LocationAccess(GERUDO_TRAINING_GROUNDS_BEAMOS_CHEST, {[]{return HasExplosives && (IsAdult || KokiriSword);}}), + LocationAccess(GERUDO_TRAINING_GROUNDS_STALFOS_CHEST, {[]{return CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD);}}), + LocationAccess(GERUDO_TRAINING_GROUNDS_BEAMOS_CHEST, {[]{return HasExplosives && (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD));}}), }, { //Exits Entrance(GERUDO_TRAINING_GROUNDS_ENTRYWAY, {[]{return true;}}), - Entrance(GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_ROOM, {[]{return (IsAdult || KokiriSword) && (CanUse(HOOKSHOT) || LogicGtgWithoutHookshot);}}), - Entrance(GERUDO_TRAINING_GROUNDS_LAVA_ROOM, {[]{return Here(GERUDO_TRAINING_GROUNDS_LOBBY, []{return (IsAdult || KokiriSword) && HasExplosives;});}}), + Entrance(GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_ROOM, {[]{return (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)) && (CanUse(HOOKSHOT) || LogicGtgWithoutHookshot);}}), + Entrance(GERUDO_TRAINING_GROUNDS_LAVA_ROOM, {[]{return Here(GERUDO_TRAINING_GROUNDS_LOBBY, []{return (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)) && HasExplosives;});}}), Entrance(GERUDO_TRAINING_GROUNDS_CENTRAL_MAZE, {[]{return true;}}), }); @@ -69,11 +69,11 @@ void AreaTable_Init_GerudoTrainingGrounds() { areaTable[GERUDO_TRAINING_GROUNDS_HAMMER_ROOM] = Area("Gerudo Training Grounds Hammer Room", "Gerudo Training Grounds", GERUDO_TRAINING_GROUNDS, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(GERUDO_TRAINING_GROUNDS_HAMMER_ROOM_CLEAR_CHEST, {[]{return true;}}), + LocationAccess(GERUDO_TRAINING_GROUNDS_HAMMER_ROOM_CLEAR_CHEST, {[]{return CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(MEGATON_HAMMER);}}), LocationAccess(GERUDO_TRAINING_GROUNDS_HAMMER_ROOM_SWITCH_CHEST, {[]{return CanUse(MEGATON_HAMMER) || (CanTakeDamage && LogicFlamingChests);}}), }, { //Exits - Entrance(GERUDO_TRAINING_GROUNDS_EYE_STATUE_LOWER, {[]{return CanUse(MEGATON_HAMMER) && Bow;}}), + Entrance(GERUDO_TRAINING_GROUNDS_EYE_STATUE_LOWER, {[]{return CanUse(MEGATON_HAMMER) && CanUse(BOW);}}), Entrance(GERUDO_TRAINING_GROUNDS_LAVA_ROOM, {[]{return true;}}), }); @@ -95,7 +95,7 @@ void AreaTable_Init_GerudoTrainingGrounds() { areaTable[GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_ROOM] = Area("Gerudo Training Grounds Heavy Block Room", "Gerudo Training Grounds", GERUDO_TRAINING_GROUNDS, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(GERUDO_TRAINING_GROUNDS_BEFORE_HEAVY_BLOCK_CHEST, {[]{return true;}}), + LocationAccess(GERUDO_TRAINING_GROUNDS_BEFORE_HEAVY_BLOCK_CHEST, {[]{return CanJumpslash;}}), }, { //Exits Entrance(GERUDO_TRAINING_GROUNDS_EYE_STATUE_UPPER, {[]{return (LogicLensGtg || CanUse(LENS_OF_TRUTH)) && (CanUse(HOOKSHOT) || (LogicGtgFakeWall && CanUse(HOVER_BOOTS)));}}), @@ -104,10 +104,10 @@ void AreaTable_Init_GerudoTrainingGrounds() { areaTable[GERUDO_TRAINING_GROUNDS_LIKE_LIKE_ROOM] = Area("Gerudo Training Grounds Like Like Room", "Gerudo Training Grounds", GERUDO_TRAINING_GROUNDS, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_FIRST_CHEST, {[]{return true;}}), - LocationAccess(GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_SECOND_CHEST, {[]{return true;}}), - LocationAccess(GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_THIRD_CHEST, {[]{return true;}}), - LocationAccess(GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_FOURTH_CHEST, {[]{return true;}}), + LocationAccess(GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_FIRST_CHEST, {[]{return CanJumpslash;}}), + LocationAccess(GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_SECOND_CHEST, {[]{return CanJumpslash;}}), + LocationAccess(GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_THIRD_CHEST, {[]{return CanJumpslash;}}), + LocationAccess(GERUDO_TRAINING_GROUNDS_HEAVY_BLOCK_FOURTH_CHEST, {[]{return CanJumpslash;}}), }, {}); } @@ -135,10 +135,10 @@ void AreaTable_Init_GerudoTrainingGrounds() { //EventAccess(&WallFairy, {[]{return WallFairy || (IsAdult && CanUse(BOW));}}), }, { //Locations - LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_DINOLFOS_CHEST, {[]{return IsAdult;}}), + LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_DINOLFOS_CHEST, {[]{return IsAdult && (CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD));}}), }, { //Exits - Entrance(GERUDO_TRAINING_GROUNDS_MQ_UNDERWATER, {[]{return (Bow || CanUse(LONGSHOT)) && CanUse(HOVER_BOOTS) && IsAdult;}}), + Entrance(GERUDO_TRAINING_GROUNDS_MQ_UNDERWATER, {[]{return (Bow || (CanUse(LONGSHOT) && HasFireSource)) && CanUse(HOVER_BOOTS) && IsAdult && (CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD));}}), }); areaTable[GERUDO_TRAINING_GROUNDS_MQ_UNDERWATER] = Area("Gerudo Training Grounds MQ Underwater", "Gerudo Training Grounds", GERUDO_TRAINING_GROUNDS, NO_DAY_NIGHT_CYCLE, {}, { @@ -148,7 +148,7 @@ void AreaTable_Init_GerudoTrainingGrounds() { areaTable[GERUDO_TRAINING_GROUNDS_MQ_LEFT_SIDE] = Area("Gerudo Training Grounds MQ Left Side", "Gerudo Training Grounds", GERUDO_TRAINING_GROUNDS, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_FIRST_IRON_KNUCKLE_CHEST, {[]{return IsAdult || KokiriSword || HasExplosives;}}), + LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_FIRST_IRON_KNUCKLE_CHEST, {[]{return CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || HasExplosives;}}), }, { //Exits Entrance(GERUDO_TRAINING_GROUNDS_MQ_STALFOS_ROOM, {[]{return (IsAdult && CanUse(LONGSHOT)) || LogicGtgMQWithoutHookshot || (LogicGtgMQWithHookshot && IsAdult && CanUse(HOOKSHOT));}}), @@ -160,8 +160,8 @@ void AreaTable_Init_GerudoTrainingGrounds() { EventAccess(&BlueFireAccess, {[]{return BlueFireAccess || HasBottle;}}), }, { //Locations - LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_BEFORE_HEAVY_BLOCK_CHEST, {[]{return IsAdult;}}), - LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_HEAVY_BLOCK_CHEST, {[]{return CanUse(SILVER_GAUNTLETS);}}), + LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_BEFORE_HEAVY_BLOCK_CHEST, {[]{return IsAdult && (CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD));}}), + LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_HEAVY_BLOCK_CHEST, {[]{return CanUse(SILVER_GAUNTLETS) && (CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD));}}), }, { //Exits Entrance(GERUDO_TRAINING_GROUNDS_MQ_BACK_AREAS, {[]{return IsAdult && (LogicLensGtgMQ || CanUse(LENS_OF_TRUTH)) && BlueFire && (CanPlay(SongOfTime) || (LogicGtgFakeWall && IsAdult && CanUse(HOVER_BOOTS)));}}), @@ -170,12 +170,12 @@ void AreaTable_Init_GerudoTrainingGrounds() { areaTable[GERUDO_TRAINING_GROUNDS_MQ_BACK_AREAS] = Area("Gerudo Training Grounds MQ Back Areas", "Gerudo Training Grounds", GERUDO_TRAINING_GROUNDS, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_EYE_STATUE_CHEST, {[]{return Bow;}}), - LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_SECOND_IRON_KNUCKLE_CHEST, {[]{return true;}}), - LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_FLAME_CIRCLE_CHEST, {[]{return CanUse(HOOKSHOT) || Bow || HasExplosives;}}), + LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_EYE_STATUE_CHEST, {[]{return CanUse(BOW);}}), + LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_SECOND_IRON_KNUCKLE_CHEST, {[]{return (CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD));}}), + LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_FLAME_CIRCLE_CHEST, {[]{return CanUse(HOOKSHOT) || CanUse(BOW) || HasExplosives;}}), }, { //Exits - Entrance(GERUDO_TRAINING_GROUNDS_MQ_CENTRAL_MAZE_RIGHT, {[]{return Hammer;}}), + Entrance(GERUDO_TRAINING_GROUNDS_MQ_CENTRAL_MAZE_RIGHT, {[]{return CanUse(MEGATON_HAMMER);}}), Entrance(GERUDO_TRAINING_GROUNDS_MQ_RIGHT_SIDE, {[]{return CanUse(LONGSHOT);}}), }); diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp index 70fd1f22b40..31911883399 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp @@ -104,13 +104,13 @@ void AreaTable_Init_GerudoValley() { LocationAccess(GF_CHEST, {[]{return CanUse(HOVER_BOOTS) || (IsAdult && CanUse(SCARECROW)) || CanUse(LONGSHOT);}}), LocationAccess(GF_HBA_1000_POINTS, {[]{return GerudoToken && CanRideEpona && Bow && AtDay;}}), LocationAccess(GF_HBA_1500_POINTS, {[]{return GerudoToken && CanRideEpona && Bow && AtDay;}}), - LocationAccess(GF_NORTH_F1_CARPENTER, {[]{return IsAdult || KokiriSword || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD);}}), - LocationAccess(GF_NORTH_F2_CARPENTER, {[]{return (IsAdult || KokiriSword || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)) && (GerudoToken || CanUse(BOW) || CanUse(HOOKSHOT) || CanUse(HOVER_BOOTS) || LogicGerudoKitchen);}}), - LocationAccess(GF_SOUTH_F1_CARPENTER, {[]{return IsAdult || KokiriSword || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD);}}), - LocationAccess(GF_SOUTH_F2_CARPENTER, {[]{return IsAdult || KokiriSword || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD);}}), + LocationAccess(GF_NORTH_F1_CARPENTER, {[]{return CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD);}}), + LocationAccess(GF_NORTH_F2_CARPENTER, {[]{return (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)) && (GerudoToken || CanUse(BOW) || CanUse(HOOKSHOT) || CanUse(HOVER_BOOTS) || LogicGerudoKitchen);}}), + LocationAccess(GF_SOUTH_F1_CARPENTER, {[]{return CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD);}}), + LocationAccess(GF_SOUTH_F2_CARPENTER, {[]{return CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD);}}), LocationAccess(GF_GERUDO_MEMBERSHIP_CARD, {[]{return CanFinishGerudoFortress;}}), LocationAccess(GF_GS_ARCHERY_RANGE, {[]{return IsAdult && HookshotOrBoomerang && GerudoToken && AtNight && CanGetNightTimeGS;}}), - LocationAccess(GF_GS_TOP_FLOOR, {[]{return IsAdult && AtNight && (GerudoToken || CanUse(BOW) || CanUse(HOOKSHOT) || CanUse(HOVER_BOOTS) || LogicGerudoKitchen || LogicGFJump) && CanGetNightTimeGS;}}), + LocationAccess(GF_GS_TOP_FLOOR, {[]{return IsAdult && AtNight && CanAdultAttack && (GerudoToken || CanUse(BOW) || CanUse(HOOKSHOT) || CanUse(HOVER_BOOTS) || LogicGerudoKitchen || LogicGFJump) && CanGetNightTimeGS;}}), }, { //Exits Entrance(GV_FORTRESS_SIDE, {[]{return true;}}), @@ -149,7 +149,7 @@ void AreaTable_Init_GerudoValley() { }, { //Locations LocationAccess(WASTELAND_CHEST, {[]{return HasFireSource;}}), - LocationAccess(WASTELAND_BOMBCHU_SALESMAN, {[]{return AdultsWallet && (IsAdult || Sticks || KokiriSword);}}), + LocationAccess(WASTELAND_BOMBCHU_SALESMAN, {[]{return AdultsWallet && CanJumpslash;}}), LocationAccess(WASTELAND_GS, {[]{return HookshotOrBoomerang;}}), }, { //Exits @@ -172,7 +172,7 @@ void AreaTable_Init_GerudoValley() { LocationAccess(COLOSSUS_FREESTANDING_POH, {[]{return IsAdult && CanPlantBean(DESERT_COLOSSUS);}}), LocationAccess(COLOSSUS_GS_BEAN_PATCH, {[]{return CanPlantBugs && CanChildAttack;}}), LocationAccess(COLOSSUS_GS_TREE, {[]{return IsAdult && HookshotOrBoomerang && AtNight && CanGetNightTimeGS;}}), - LocationAccess(COLOSSUS_GS_HILL, {[]{return IsAdult && AtNight && (CanPlantBean(DESERT_COLOSSUS) || CanUse(LONGSHOT) || (LogicColossusGS && CanUse(HOOKSHOT))) && CanGetNightTimeGS;}}), + LocationAccess(COLOSSUS_GS_HILL, {[]{return IsAdult && CanAdultAttack && AtNight && (CanPlantBean(DESERT_COLOSSUS) || CanUse(LONGSHOT) || (LogicColossusGS && CanUse(HOOKSHOT))) && CanGetNightTimeGS;}}), LocationAccess(COLOSSUS_GOSSIP_STONE, {[]{return true;}}), }, { //Exits diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp index 7b247049dbd..50a0c340ea2 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp @@ -115,7 +115,7 @@ void AreaTable_Init_HyruleField() { LocationAccess(LH_SUN, {[]{return IsAdult && WaterTempleClear && CanUse(BOW);}}), LocationAccess(LH_FREESTANDING_POH, {[]{return IsAdult && (CanUse(SCARECROW) || CanPlantBean(LAKE_HYLIA));}}), LocationAccess(LH_GS_BEAN_PATCH, {[]{return CanPlantBugs && CanChildAttack;}}), - LocationAccess(LH_GS_LAB_WALL, {[]{return IsChild && (HookshotOrBoomerang || (LogicLabWallGS && (Sticks || KokiriSword || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)))) && AtNight && CanGetNightTimeGS;}}), + LocationAccess(LH_GS_LAB_WALL, {[]{return IsChild && (HookshotOrBoomerang || (LogicLabWallGS && CanJumpslash)) && AtNight && CanGetNightTimeGS;}}), LocationAccess(LH_GS_SMALL_ISLAND, {[]{return IsChild && CanChildAttack && AtNight && CanGetNightTimeGS;}}), LocationAccess(LH_GS_TREE, {[]{return IsAdult && CanUse(LONGSHOT) && AtNight && CanGetNightTimeGS;}}), LocationAccess(LH_LAB_GOSSIP_STONE, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ice_cavern.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ice_cavern.cpp index f5efcc3c8c7..7e8723e1724 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ice_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ice_cavern.cpp @@ -13,7 +13,7 @@ void AreaTable_Init_IceCavern() { areaTable[ICE_CAVERN_ENTRYWAY] = Area("Ice Cavern Entryway", "Ice Cavern", ICE_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits Entrance(ICE_CAVERN_BEGINNING, {[]{return Dungeon::IceCavern.IsVanilla();}}), - Entrance(ICE_CAVERN_MQ_BEGINNING, {[]{return Dungeon::IceCavern.IsMQ();}}), + Entrance(ICE_CAVERN_MQ_BEGINNING, {[]{return Dungeon::IceCavern.IsMQ() && CanUseProjectile;}}), Entrance(ZORAS_FOUNTAIN, {[]{return true;}}), }); @@ -24,7 +24,7 @@ void AreaTable_Init_IceCavern() { areaTable[ICE_CAVERN_BEGINNING] = Area("Ice Cavern Beginning", "Ice Cavern", ICE_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits Entrance(ICE_CAVERN_ENTRYWAY, {[]{return true;}}), - Entrance(ICE_CAVERN_MAIN, {[]{return Here(ICE_CAVERN_BEGINNING, []{return IsAdult || HasExplosives || CanUse(DINS_FIRE);});}}), + Entrance(ICE_CAVERN_MAIN, {[]{return Here(ICE_CAVERN_BEGINNING, []{return (CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)) || HasExplosives || CanUse(DINS_FIRE);});}}), }); areaTable[ICE_CAVERN_MAIN] = Area("Ice Cavern", "Ice Cavern", ICE_CAVERN, NO_DAY_NIGHT_CYCLE, { @@ -34,8 +34,8 @@ void AreaTable_Init_IceCavern() { //Locations LocationAccess(ICE_CAVERN_MAP_CHEST, {[]{return BlueFire && IsAdult;}}), LocationAccess(ICE_CAVERN_COMPASS_CHEST, {[]{return BlueFire;}}), - LocationAccess(ICE_CAVERN_IRON_BOOTS_CHEST, {[]{return BlueFire && (IsAdult || Slingshot || Sticks || KokiriSword || CanUse(DINS_FIRE));}}), - LocationAccess(SHEIK_IN_ICE_CAVERN, {[]{return BlueFire && IsAdult;}}), + LocationAccess(ICE_CAVERN_IRON_BOOTS_CHEST, {[]{return BlueFire && (CanJumpslash || CanUse(SLINGSHOT) || CanUse(DINS_FIRE));}}), + LocationAccess(SHEIK_IN_ICE_CAVERN, {[]{return BlueFire && (CanJumpslash || CanUse(SLINGSHOT) || CanUse(DINS_FIRE)) && IsAdult;}}), LocationAccess(ICE_CAVERN_FREESTANDING_POH, {[]{return BlueFire;}}), LocationAccess(ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, {[]{return HookshotOrBoomerang;}}), LocationAccess(ICE_CAVERN_GS_HEART_PIECE_ROOM, {[]{return BlueFire && HookshotOrBoomerang;}}), @@ -53,24 +53,24 @@ void AreaTable_Init_IceCavern() { }, {}, { //Exits Entrance(ICE_CAVERN_ENTRYWAY, {[]{return true;}}), - Entrance(ICE_CAVERN_MQ_MAP_ROOM, {[]{return IsAdult || CanUse(DINS_FIRE) || (HasExplosives && (CanUse(STICKS) || CanUse(SLINGSHOT) || KokiriSword));}}), + Entrance(ICE_CAVERN_MQ_MAP_ROOM, {[]{return CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(DINS_FIRE) || (HasExplosives && (CanUse(STICKS) || CanUse(SLINGSHOT) || CanJumpslash));}}), Entrance(ICE_CAVERN_MQ_COMPASS_ROOM, {[]{return IsAdult && BlueFire;}}), Entrance(ICE_CAVERN_MQ_IRON_BOOTS_REGION, {[]{return BlueFire;}}), }); areaTable[ICE_CAVERN_MQ_MAP_ROOM] = Area("Ice Cavern MQ Map Room", "Ice Cavern", ICE_CAVERN, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&BlueFireAccess, {[]{return BlueFireAccess || HasBottle;}}), + EventAccess(&BlueFireAccess, {[]{return BlueFireAccess || (HasBottle && CanJumpslash);}}), }, { //Locations - LocationAccess(ICE_CAVERN_MQ_MAP_CHEST, {[]{return BlueFire && (IsAdult || CanUse(STICKS) || KokiriSword || CanUseProjectile);}}), + LocationAccess(ICE_CAVERN_MQ_MAP_CHEST, {[]{return BlueFire && (CanJumpslash || CanUseProjectile);}}), }, {}); areaTable[ICE_CAVERN_MQ_IRON_BOOTS_REGION] = Area("Ice Cavern MQ Iron Boots Region", "Ice Cavern", ICE_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(ICE_CAVERN_MQ_IRON_BOOTS_CHEST, {[]{return IsAdult;}}), + LocationAccess(ICE_CAVERN_MQ_IRON_BOOTS_CHEST, {[]{return IsAdult && (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)) ;}}), LocationAccess(SHEIK_IN_ICE_CAVERN, {[]{return IsAdult;}}), - LocationAccess(ICE_CAVERN_MQ_GS_ICE_BLOCK, {[]{return IsAdult || CanUseProjectile;}}), + LocationAccess(ICE_CAVERN_MQ_GS_ICE_BLOCK, {[]{return (IsAdult && CanJumpslash) || CanUseProjectile;}}), LocationAccess(ICE_CAVERN_MQ_GS_SCARECROW, {[]{return (CanUse(SCARECROW) || (HoverBoots && CanUse(LONGSHOT)) || LogicIceMQScarecrow) && IsAdult;}}), //Tricks: (CanUse(SCARECROW) || (HoverBoots && CanUse(LONGSHOT)) || LogicIceMQScarecrow) && IsAdult }, {}); diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_jabujabus_belly.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_jabujabus_belly.cpp index d7b48d7f110..108b69ccc6a 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_jabujabus_belly.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_jabujabus_belly.cpp @@ -111,7 +111,7 @@ void AreaTable_Init_JabuJabusBelly() { areaTable[JABU_JABUS_BELLY_COMPASS_ROOM] = Area("Jabu Jabus Belly Compass Room", "Jabu Jabus Belly", JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(JABU_JABUS_BELLY_COMPASS_CHEST, {[]{return IsAdult || CanChildAttack;}}), + LocationAccess(JABU_JABUS_BELLY_COMPASS_CHEST, {[]{return CanAdultAttack || CanChildAttack;}}), }, { //Exits Entrance(JABU_JABUS_BELLY_FORKED_CORRIDOR, {[]{return true;}}), @@ -150,7 +150,7 @@ void AreaTable_Init_JabuJabusBelly() { areaTable[JABU_JABUS_BELLY_NEAR_BOSS_ROOM] = Area("Jabu Jabus Belly Near Boss Room", "Jabu Jabus Belly", JABU_JABUS_BELLY, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(JABU_JABUS_BELLY_GS_NEAR_BOSS, {[]{return IsAdult || CanChildAttack;}}), + LocationAccess(JABU_JABUS_BELLY_GS_NEAR_BOSS, {[]{return CanAdultAttack || CanChildAttack;}}), }, { //Exits Entrance(JABU_JABUS_BELLY_LIFT_MIDDLE, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp index db9bb69dc29..55af1620859 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp @@ -184,7 +184,7 @@ void AreaTable_Init_Kakariko() { areaTable[KAK_REDEAD_GROTTO] = Area("Kak Redead Grotto", "Kak Redead Grotto", NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(KAK_REDEAD_GROTTO_CHEST, {[]{return IsAdult || (Sticks || KokiriSword || CanUse(DINS_FIRE) || CanUse(MEGATON_HAMMER) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD));}}), + LocationAccess(KAK_REDEAD_GROTTO_CHEST, {[]{return CanUse(STICKS) || CanUse(KOKIRI_SWORD) || CanUse(DINS_FIRE) || CanUse(MEGATON_HAMMER) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD);}}), }, { //Exits Entrance(KAKARIKO_VILLAGE, {[]{return true;}}), @@ -241,7 +241,7 @@ void AreaTable_Init_Kakariko() { areaTable[GRAVEYARD_COMPOSERS_GRAVE] = Area("Graveyard Composers Grave", "Graveyard Composers Grave", NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations LocationAccess(GRAVEYARD_COMPOSERS_GRAVE_CHEST, {[]{return HasFireSource;}}), - LocationAccess(SONG_FROM_COMPOSERS_GRAVE, {[]{return IsAdult || (Slingshot || Boomerang || Sticks || HasExplosives || KokiriSword || CanUse(MEGATON_HAMMER) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(BOW) || CanUse(HOOKSHOT));}}), + LocationAccess(SONG_FROM_COMPOSERS_GRAVE, {[]{return CanUseProjectile || CanJumpslash || CanUse(MEGATON_HAMMER);}}), }, { //Exits Entrance(THE_GRAVEYARD, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp index 1ba2048a0e4..7ab6f2c4bd2 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp @@ -34,8 +34,8 @@ void AreaTable_Init_LostWoods() { areaTable[KF_OUTSIDE_DEKU_TREE] = Area("KF Outside Deku Tree", "Kokiri Forest", KOKIRI_FOREST, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || ((IsAdult && ShuffleDungeonEntrances.Is(SHUFFLEDUNGEONS_OFF)) || KokiriSword || Boomerang);}}), - EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || ((IsAdult && ShuffleDungeonEntrances.Is(SHUFFLEDUNGEONS_OFF)) || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(DINS_FIRE));}}), + EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || ((IsAdult && (MasterSword || BiggoronSword) && ShuffleDungeonEntrances.Is(SHUFFLEDUNGEONS_OFF)) || KokiriSword || Boomerang);}}), + EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || ((IsAdult && (MasterSword || BiggoronSword) && ShuffleDungeonEntrances.Is(SHUFFLEDUNGEONS_OFF)) || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(DINS_FIRE));}}), EventAccess(&ShowedMidoSwordAndShield, {[]{return ShowedMidoSwordAndShield || (IsChild && KokiriSword && DekuShield);}}), }, { //Locations @@ -144,7 +144,7 @@ void AreaTable_Init_LostWoods() { //Locations LocationAccess(LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, {[]{return IsChild && CanStunDeku;}}), LocationAccess(LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, {[]{return IsChild && CanStunDeku;}}), - LocationAccess(LW_GS_ABOVE_THEATER, {[]{return IsAdult && AtNight && (CanPlantBean(LW_BEYOND_MIDO) || (LogicLostWoodsGSBean && CanUse(HOOKSHOT) && (CanUse(LONGSHOT) || CanUse(BOW) || CanUse(SLINGSHOT) || HasBombchus || CanUse(DINS_FIRE)))) && CanGetNightTimeGS;}}), + LocationAccess(LW_GS_ABOVE_THEATER, {[]{return IsAdult && CanAdultAttack && AtNight && (CanPlantBean(LW_BEYOND_MIDO) || (LogicLostWoodsGSBean && CanUse(HOOKSHOT) && (CanUse(LONGSHOT) || CanUse(BOW) || CanUse(SLINGSHOT) || HasBombchus || CanUse(DINS_FIRE)))) && CanGetNightTimeGS;}}), LocationAccess(LW_GS_BEAN_PATCH_NEAR_THEATER, {[]{return CanPlantBugs && (CanChildAttack || (Scrubsanity.Is(SCRUBSANITY_OFF) && DekuShield));}}), }, { //Exits @@ -185,7 +185,7 @@ void AreaTable_Init_LostWoods() { areaTable[SFM_ENTRYWAY] = Area("SFM Entryway", "Sacred Forest Meadow", SACRED_FOREST_MEADOW, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits Entrance(LW_BEYOND_MIDO, {[]{return true;}}), - Entrance(SACRED_FOREST_MEADOW, {[]{return IsAdult || Slingshot || Sticks || KokiriSword || CanUse(DINS_FIRE) || CanUse(MEGATON_HAMMER) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD);}}), + Entrance(SACRED_FOREST_MEADOW, {[]{return CanUse(SLINGSHOT) || CanUse(STICKS) || CanUse(KOKIRI_SWORD) || CanUse(DINS_FIRE) || CanUse(MEGATON_HAMMER) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD);}}), Entrance(SFM_WOLFOS_GROTTO, {[]{return CanOpenBombGrotto;}}), }); @@ -218,7 +218,7 @@ void AreaTable_Init_LostWoods() { areaTable[SFM_WOLFOS_GROTTO] = Area("SFM Wolfos Grotto", "SFM Wolfos Grotto", NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(SFM_WOLFOS_GROTTO_CHEST, {[]{return IsAdult || Slingshot || Sticks || KokiriSword || CanUse(DINS_FIRE) || CanUse(MEGATON_HAMMER) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD);}}), + LocationAccess(SFM_WOLFOS_GROTTO_CHEST, {[]{return CanUse(SLINGSHOT) || CanUse(STICKS) || CanUse(KOKIRI_SWORD) || CanUse(DINS_FIRE) || CanUse(MEGATON_HAMMER) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD);}}), }, { //Exits Entrance(SFM_ENTRYWAY, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp index 5296a6398c6..a3dda7521f6 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp @@ -26,12 +26,12 @@ void AreaTable_Init_ShadowTemple() { EventAccess(&NutPot, {[]{return true;}}), }, { //Locations - LocationAccess(SHADOW_TEMPLE_MAP_CHEST, {[]{return true;}}), - LocationAccess(SHADOW_TEMPLE_HOVER_BOOTS_CHEST, {[]{return true;}}), + LocationAccess(SHADOW_TEMPLE_MAP_CHEST, {[]{return CanJumpslash;}}), + LocationAccess(SHADOW_TEMPLE_HOVER_BOOTS_CHEST, {[]{return (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD));}}), }, { //Exits Entrance(SHADOW_TEMPLE_ENTRYWAY, {[]{return true;}}), - Entrance(SHADOW_TEMPLE_FIRST_BEAMOS, {[]{return HoverBoots;}}), + Entrance(SHADOW_TEMPLE_FIRST_BEAMOS, {[]{return CanUse(HOVER_BOOTS);}}), }); areaTable[SHADOW_TEMPLE_FIRST_BEAMOS] = Area("Shadow Temple First Beamos", "Shadow Temple", SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, { @@ -39,7 +39,7 @@ void AreaTable_Init_ShadowTemple() { EventAccess(&FairyPot, {[]{return true;}}), //This fairy pot is only on 3DS }, { //Locations - LocationAccess(SHADOW_TEMPLE_COMPASS_CHEST, {[]{return IsAdult || KokiriSword || Sticks;}}), + LocationAccess(SHADOW_TEMPLE_COMPASS_CHEST, {[]{return CanJumpslash;}}), LocationAccess(SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, {[]{return CanUse(HOVER_BOOTS) || CanUse(HOOKSHOT);}}), LocationAccess(SHADOW_TEMPLE_GS_NEAR_SHIP, {[]{return false;}}), }, { @@ -50,14 +50,14 @@ void AreaTable_Init_ShadowTemple() { areaTable[SHADOW_TEMPLE_HUGE_PIT] = Area("Shadow Temple Huge Pit", "Shadow Temple", SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, {[]{return true;}}), - LocationAccess(SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, {[]{return true;}}), + LocationAccess(SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, {[]{return CanJumpslash;}}), + LocationAccess(SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, {[]{return CanJumpslash;}}), LocationAccess(SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST, {[]{return true;}}), LocationAccess(SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST, {[]{return (LogicShadowUmbrella && HoverBoots) || GoronBracelet;}}), LocationAccess(SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST, {[]{return (LogicShadowUmbrella && HoverBoots) || GoronBracelet;}}), LocationAccess(SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST, {[]{return SmallKeys(SHADOW_TEMPLE, 2, 3) && ((LogicLensShadowPlatform && LogicLensShadow) || CanUse(LENS_OF_TRUTH));}}), LocationAccess(SHADOW_TEMPLE_FREESTANDING_KEY, {[]{return SmallKeys(SHADOW_TEMPLE, 2, 3) && ((LogicLensShadowPlatform && LogicLensShadow) || CanUse(LENS_OF_TRUTH)) && Hookshot && (Bombs || GoronBracelet || (LogicShadowFreestandingKey && HasBombchus));}}), - LocationAccess(SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, {[]{return true;}}), + LocationAccess(SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, {[]{return CanJumpslash;}}), LocationAccess(SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, {[]{return Hookshot || (LogicShadowUmbrellaGS && HoverBoots);}}), LocationAccess(SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, {[]{return SmallKeys(SHADOW_TEMPLE, 2, 3) && ((LogicLensShadowPlatform && LogicLensShadow) || CanUse(LENS_OF_TRUTH)) && Hookshot;}}), }, { @@ -68,20 +68,20 @@ void AreaTable_Init_ShadowTemple() { areaTable[SHADOW_TEMPLE_WIND_TUNNEL] = Area("Shadow Temple Wind Tunnel", "Shadow Temple", SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations LocationAccess(SHADOW_TEMPLE_WIND_HINT_CHEST, {[]{return true;}}), - LocationAccess(SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, {[]{return true;}}), + LocationAccess(SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, {[]{return CanJumpslash;}}), LocationAccess(SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, {[]{return true;}}), LocationAccess(SHADOW_TEMPLE_GS_NEAR_SHIP, {[]{return CanUse(LONGSHOT) && SmallKeys(SHADOW_TEMPLE, 4, 5);}}), }, { //Exits - Entrance(SHADOW_TEMPLE_BEYOND_BOAT, {[]{return CanPlay(ZeldasLullaby) && SmallKeys(SHADOW_TEMPLE, 4, 5);}}), + Entrance(SHADOW_TEMPLE_BEYOND_BOAT, {[]{return CanJumpslash && CanPlay(ZeldasLullaby) && SmallKeys(SHADOW_TEMPLE, 4, 5);}}), }); areaTable[SHADOW_TEMPLE_BEYOND_BOAT] = Area("Shadow Temple Beyond Boat", "Shadow Temple", SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations LocationAccess(SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, {[]{return CanUse(DINS_FIRE);}}), LocationAccess(SHADOW_TEMPLE_BOSS_KEY_CHEST, {[]{return CanUse(DINS_FIRE);}}), - LocationAccess(SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, {[]{return true;}}), - LocationAccess(SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, {[]{return true;}}), + LocationAccess(SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, {[]{return CanJumpslash;}}), + LocationAccess(SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, {[]{return CanAdultAttack;}}), }, { //Exits Entrance(SHADOW_TEMPLE_BOSS_ENTRYWAY, {[]{return (CanUse(BOW) || CanUse(DISTANT_SCARECROW) || (LogicShadowStatue && HasBombchus)) && SmallKeys(SHADOW_TEMPLE, 5) && CanUse(HOVER_BOOTS) && BossKeyShadowTemple;}}) @@ -102,15 +102,15 @@ void AreaTable_Init_ShadowTemple() { areaTable[SHADOW_TEMPLE_MQ_DEAD_HAND_AREA] = Area("Shadow Temple MQ Dead Hand Area", "Shadow Temple", SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(SHADOW_TEMPLE_MQ_COMPASS_CHEST, {[]{return true;}}), - LocationAccess(SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST, {[]{return CanPlay(SongOfTime) && IsAdult && CanUse(BOW);}}), + LocationAccess(SHADOW_TEMPLE_MQ_COMPASS_CHEST, {[]{return CanJumpslash;}}), + LocationAccess(SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST, {[]{return CanJumpslash && CanPlay(SongOfTime) && IsAdult && CanUse(BOW);}}), }, {}); areaTable[SHADOW_TEMPLE_MQ_FIRST_BEAMOS] = Area("Shadow Temple MQ First Beamos", "Shadow Temple", SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(SHADOW_TEMPLE_MQ_MAP_CHEST, {[]{return true;}}), - LocationAccess(SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, {[]{return true;}}), - LocationAccess(SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, {[]{return true;}}), + LocationAccess(SHADOW_TEMPLE_MQ_MAP_CHEST, {[]{return CanAdultAttack || Nuts;}}), + LocationAccess(SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, {[]{return CanJumpslash;}}), + LocationAccess(SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, {[]{return CanAdultAttack || Nuts;}}), }, { //Exits Entrance(SHADOW_TEMPLE_MQ_UPPER_HUGE_PIT, {[]{return HasExplosives && SmallKeys(SHADOW_TEMPLE, 2);}}), @@ -134,8 +134,9 @@ void AreaTable_Init_ShadowTemple() { LocationAccess(SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST, {[]{return true;}}), LocationAccess(SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST, {[]{return (LogicShadowUmbrella && HoverBoots) || GoronBracelet;}}), LocationAccess(SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST, {[]{return (LogicShadowUmbrella && HoverBoots) || GoronBracelet;}}), - LocationAccess(SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST, {[]{return HoverBoots && SmallKeys(SHADOW_TEMPLE, 3) && ((LogicLensShadowMQ && LogicLensShadowMQPlatform) || CanUse(LENS_OF_TRUTH));}}), - LocationAccess(SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST, {[]{return HoverBoots && SmallKeys(SHADOW_TEMPLE, 3) && Hookshot && ((LogicLensShadowMQ && LogicLensShadowMQInvisibleBlades && LogicLensShadowMQPlatform) || CanUse(LENS_OF_TRUTH));}}), + LocationAccess(SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST, {[]{return CanJumpslash && HoverBoots && SmallKeys(SHADOW_TEMPLE, 3) && ((LogicLensShadowMQ && LogicLensShadowMQPlatform) || CanUse(LENS_OF_TRUTH));}}), + LocationAccess(SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST, {[]{return (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)) && HoverBoots && SmallKeys(SHADOW_TEMPLE, 3) && Hookshot && ((LogicLensShadowMQ && + LogicLensShadowMQInvisibleBlades && LogicLensShadowMQPlatform) || CanUse(LENS_OF_TRUTH));}}), LocationAccess(SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM, {[]{return Hookshot || (LogicShadowUmbrellaGS && HoverBoots);}}), }, { //Exits @@ -148,7 +149,7 @@ void AreaTable_Init_ShadowTemple() { }, { //Locations LocationAccess(SHADOW_TEMPLE_MQ_WIND_HINT_CHEST, {[]{return true;}}), - LocationAccess(SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST, {[]{return true;}}), + LocationAccess(SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST, {[]{return CanJumpslash;}}), LocationAccess(SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST, {[]{return true;}}), LocationAccess(SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, {[]{return true;}}), LocationAccess(SHADOW_TEMPLE_MQ_GS_AFTER_WIND, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp index ec01cdbfd08..83fa871a812 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp @@ -46,9 +46,9 @@ void AreaTable_Init_SpiritTemple() { LocationAccess(SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, {[]{return HasProjectile(HasProjectileAge::Both) || ((SmallKeys(SPIRIT_TEMPLE, 3) || (SmallKeys(SPIRIT_TEMPLE, 2) && BombchusInLogic && ShuffleDungeonEntrances.Is(SHUFFLEDUNGEONS_OFF))) && CanUse(SILVER_GAUNTLETS) && HasProjectile(HasProjectileAge::Adult)) || (SmallKeys(SPIRIT_TEMPLE, 5) && IsChild && HasProjectile(HasProjectileAge::Child));}}), LocationAccess(SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, {[]{return HasProjectile(HasProjectileAge::Both) || ((SmallKeys(SPIRIT_TEMPLE, 3) || (SmallKeys(SPIRIT_TEMPLE, 2) && BombchusInLogic && ShuffleDungeonEntrances.Is(SHUFFLEDUNGEONS_OFF))) && CanUse(SILVER_GAUNTLETS) && HasProjectile(HasProjectileAge::Adult)) || (SmallKeys(SPIRIT_TEMPLE, 5) && IsChild && HasProjectile(HasProjectileAge::Child));}}), LocationAccess(SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, {[]{return HasProjectile(HasProjectileAge::Both) || CanUse(DINS_FIRE) || - (CanTakeDamage && (Sticks || KokiriSword || HasProjectile(HasProjectileAge::Child))) || + (CanTakeDamage && ((CanJumpslash) || HasProjectile(HasProjectileAge::Child))) || (IsChild && SmallKeys(SPIRIT_TEMPLE, 5) && HasProjectile(HasProjectileAge::Child)) || - ((SmallKeys(SPIRIT_TEMPLE, 3) || (SmallKeys(SPIRIT_TEMPLE, 2) && BombchusInLogic && ShuffleDungeonEntrances.Is(SHUFFLEDUNGEONS_OFF))) && CanUse(SILVER_GAUNTLETS) && (HasProjectile(HasProjectileAge::Adult) || CanTakeDamage));}}), + ((SmallKeys(SPIRIT_TEMPLE, 3) || (SmallKeys(SPIRIT_TEMPLE, 2) && BombchusInLogic && ShuffleDungeonEntrances.Is(SHUFFLEDUNGEONS_OFF))) && CanUse(SILVER_GAUNTLETS) && (HasProjectile(HasProjectileAge::Adult) || (CanTakeDamage && CanJumpslash)));}}), }, { //Exits Entrance(SPIRIT_TEMPLE_CENTRAL_CHAMBER, {[]{return HasExplosives || (SunlightArrows && CanUse(LIGHT_ARROWS));}}), @@ -57,7 +57,7 @@ void AreaTable_Init_SpiritTemple() { areaTable[SPIRIT_TEMPLE_EARLY_ADULT] = Area("Early Adult Spirit Temple", "Spirit Temple", SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations LocationAccess(SPIRIT_TEMPLE_COMPASS_CHEST, {[]{return CanUse(HOOKSHOT) && CanPlay(ZeldasLullaby);}}), - LocationAccess(SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, {[]{return Bow || Hookshot || HasBombchus || (Bombs && LogicSpiritLowerAdultSwitch);}}), + LocationAccess(SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, {[]{return (Bow || Hookshot || HasBombchus || (Bombs && LogicSpiritLowerAdultSwitch)) && (HoverBoots || CanJumpslash);}}), LocationAccess(SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, {[]{return SmallKeys(SPIRIT_TEMPLE, 3);}}), LocationAccess(SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, {[]{return SmallKeys(SPIRIT_TEMPLE, 3);}}), LocationAccess(SPIRIT_TEMPLE_GS_BOULDER_ROOM, {[]{return CanPlay(SongOfTime) && (Bow || Hookshot || HasBombchus || (Bombs && LogicSpiritLowerAdultSwitch));}}), @@ -98,7 +98,7 @@ void AreaTable_Init_SpiritTemple() { (SmallKeys(SPIRIT_TEMPLE, 3) && CanUse(SILVER_GAUNTLETS) && (Hookshot || HoverBoots || LogicSpiritLobbyJump));}}), }, { //Exits - Entrance(SPIRIT_TEMPLE_OUTDOOR_HANDS, {[]{return true;}}), + Entrance(SPIRIT_TEMPLE_OUTDOOR_HANDS, {[]{return CanJumpslash || HasExplosives;}}), Entrance(SPIRIT_TEMPLE_BEYOND_CENTRAL_LOCKED_DOOR, {[]{return SmallKeys(SPIRIT_TEMPLE, 4) && CanUse(SILVER_GAUNTLETS);}}), Entrance(SPIRIT_TEMPLE_CHILD_CLIMB, {[]{return true;}}), }); @@ -125,7 +125,7 @@ void AreaTable_Init_SpiritTemple() { areaTable[SPIRIT_TEMPLE_BEYOND_FINAL_LOCKED_DOOR] = Area("Spirit Temple Beyond Final Locked Door", "Spirit Temple", SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations LocationAccess(SPIRIT_TEMPLE_BOSS_KEY_CHEST, {[]{return CanPlay(ZeldasLullaby) && ((CanTakeDamage && LogicFlamingChests) || (Bow && Hookshot));}}), - LocationAccess(SPIRIT_TEMPLE_TOPMOST_CHEST, {[]{return MirrorShield || (SunlightArrows && CanUse(LIGHT_ARROWS));}}), + LocationAccess(SPIRIT_TEMPLE_TOPMOST_CHEST, {[]{return (MirrorShield && CanAdultAttack) || (SunlightArrows && CanUse(LIGHT_ARROWS));}}), }, { //Exits Entrance(SPIRIT_TEMPLE_INSIDE_STATUE_HEAD, {[]{return MirrorShield && HasExplosives && Hookshot;}}), @@ -174,7 +174,7 @@ void AreaTable_Init_SpiritTemple() { areaTable[SPIRIT_TEMPLE_MQ_ADULT] = Area("Spirit Temple MQ Adult", "Spirit Temple", SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations LocationAccess(SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST, {[]{return SmallKeys(SPIRIT_TEMPLE, 7);}}), - LocationAccess(SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, {[]{return CanPlay(ZeldasLullaby);}}), + LocationAccess(SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, {[]{return CanPlay(ZeldasLullaby) && (CanJumpslash || CanUse(HOVER_BOOTS));}}), LocationAccess(SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST, {[]{return (LogicLensSpiritMQ || CanUse(LENS_OF_TRUTH));}}), LocationAccess(SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, {[]{return SmallKeys(SPIRIT_TEMPLE, 5);}}), LocationAccess(SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST, {[]{return SmallKeys(SPIRIT_TEMPLE, 5) && CanPlay(SongOfTime);}}), @@ -187,7 +187,7 @@ void AreaTable_Init_SpiritTemple() { //Trick: MirrorShield && IsAdult && (CanUse(FIRE_ARROWS) || (LogicSpiritMQLowerAdult && CanUse(DINS_FIRE) && Bow)) Entrance(SPIRIT_TEMPLE_MQ_SHARED, {[]{return true;}}), Entrance(SPIRIT_TEMPLE_MQ_BOSS_AREA, {[]{return SmallKeys(SPIRIT_TEMPLE, 6) && CanPlay(ZeldasLullaby) && Hammer;}}), - Entrance(SPIRIT_TEMPLE_MQ_MIRROR_SHIELD_HAND, {[]{return SmallKeys(SPIRIT_TEMPLE, 5) && CanPlay(SongOfTime) && (LogicLensSpiritMQ || CanUse(LENS_OF_TRUTH));}}), + Entrance(SPIRIT_TEMPLE_MQ_MIRROR_SHIELD_HAND, {[]{return SmallKeys(SPIRIT_TEMPLE, 5) && CanPlay(SongOfTime) && CanJumpslash && (LogicLensSpiritMQ || CanUse(LENS_OF_TRUTH));}}), }); areaTable[SPIRIT_TEMPLE_MQ_SHARED] = Area("Spirit Temple MQ Shared", "Spirit Temple", SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { @@ -200,9 +200,9 @@ void AreaTable_Init_SpiritTemple() { //Trick: (LogicSpiritMQSunBlockGS && Boomerang && (CanPlay(SongOfTime) || LogicSpiritMQSunBlockSoT)) || IsAdult }, { //Exits - Entrance(SPIRIT_TEMPLE_MQ_SILVER_GAUNTLETS_HAND, {[]{return (SmallKeys(SPIRIT_TEMPLE, 7) && (CanPlay(SongOfTime) || LogicSpiritMQSunBlockSoT || IsAdult)) || (SmallKeys(SPIRIT_TEMPLE, 4) && CanPlay(SongOfTime) && (LogicLensSpiritMQ || CanUse(LENS_OF_TRUTH)));}}), + Entrance(SPIRIT_TEMPLE_MQ_SILVER_GAUNTLETS_HAND, {[]{return (SmallKeys(SPIRIT_TEMPLE, 7) && (CanPlay(SongOfTime) || LogicSpiritMQSunBlockSoT || IsAdult)) || (SmallKeys(SPIRIT_TEMPLE, 4) && CanPlay(SongOfTime) && CanJumpslash && (LogicLensSpiritMQ || CanUse(LENS_OF_TRUTH)));}}), //Trick: (SmallKeys(SPIRIT_TEMPLE, 7) && (CanPlay(SongOfTime) || LogicSpiritMQSunBlockSoT || IsAdult)) || (SmallKeys(SPIRIT_TEMPLE, 4) && CanPlay(SongOfTime) && (LogicLensSpiritMQ || CanUse(LENS_OF_TRUTH))) - Entrance(DESERT_COLOSSUS, {[]{return (SmallKeys(SPIRIT_TEMPLE, 7) && (CanPlay(SongOfTime) || LogicSpiritMQSunBlockSoT || IsAdult)) || (SmallKeys(SPIRIT_TEMPLE, 4) && CanPlay(SongOfTime) && (LogicLensSpiritMQ || CanUse(LENS_OF_TRUTH)) && IsAdult);}}), + Entrance(DESERT_COLOSSUS, {[]{return (SmallKeys(SPIRIT_TEMPLE, 7) && (CanPlay(SongOfTime) || LogicSpiritMQSunBlockSoT || IsAdult)) || (SmallKeys(SPIRIT_TEMPLE, 4) && CanPlay(SongOfTime) && CanJumpslash && (LogicLensSpiritMQ || CanUse(LENS_OF_TRUTH)) && IsAdult);}}), //Trick: (SmallKeys(SPIRIT_TEMPLE, 7) && (CanPlay(SongOfTime) || LogicSpiritMQSunBlockSoT || IsAdult)) || (SmallKeys(SPIRIT_TEMPLE, 4) && CanPlay(SongOfTime) && (LogicLensSpiritMQ || CanUse(LENS_OF_TRUTH)) && IsAdult) }); diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_water_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_water_temple.cpp index 79d9dff7cc3..e5f61751a5e 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_water_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_water_temple.cpp @@ -122,7 +122,7 @@ void AreaTable_Init_WaterTemple() { areaTable[WATER_TEMPLE_SOUTH_LOWER] = Area("Water Temple South Lower", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(WATER_TEMPLE_GS_BEHIND_GATE, {[]{return CanUse(HOOKSHOT) || (IsAdult && CanUse(HOVER_BOOTS));}}), + LocationAccess(WATER_TEMPLE_GS_BEHIND_GATE, {[]{return CanUse(HOOKSHOT) || (IsAdult && (CanJumpslash || CanUseProjectile) && CanUse(HOVER_BOOTS));}}), }, { //Exits Entrance(WATER_TEMPLE_LOBBY, {[]{return CanUse(IRON_BOOTS);}}), @@ -131,7 +131,7 @@ void AreaTable_Init_WaterTemple() { areaTable[WATER_TEMPLE_WEST_LOWER] = Area("Water Temple West Lower", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits Entrance(WATER_TEMPLE_LOBBY, {[]{return CanUse(HOOKSHOT) && CanUse(IRON_BOOTS) && GoronBracelet;}}), - Entrance(WATER_TEMPLE_DRAGON_ROOM, {[]{return IsAdult || CanChildAttack;}}), + Entrance(WATER_TEMPLE_DRAGON_ROOM, {[]{return CanJumpslash || CanUseProjectile;}}), }); areaTable[WATER_TEMPLE_DRAGON_ROOM] = Area("Water Temple Dragon Room", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { @@ -257,8 +257,8 @@ void AreaTable_Init_WaterTemple() { //Exits Entrance(WATER_TEMPLE_ENTRYWAY, {[]{return true;}}), Entrance(WATER_TEMPLE_MQ_DIVE, {[]{return IsAdult && WaterTimer >= 24 && CanUse(IRON_BOOTS);}}), - Entrance(WATER_TEMPLE_MQ_DARK_LINK_REGION, {[]{return SmallKeys(WATER_TEMPLE, 1) && IsAdult && CanUse(LONGSHOT);}}), - Entrance(WATER_TEMPLE_BOSS_ENTRYWAY, {[]{return BossKeyWaterTemple && IsAdult && CanUse(LONGSHOT);}}), + Entrance(WATER_TEMPLE_MQ_DARK_LINK_REGION, {[]{return SmallKeys(WATER_TEMPLE, 1) && IsAdult && CanUse(LONGSHOT) && CanJumpslash && Hearts > 0;}}), + Entrance(WATER_TEMPLE_BOSS_ENTRYWAY, {[]{return BossKeyWaterTemple && IsAdult && CanJumpslash && CanUse(LONGSHOT);}}), }); areaTable[WATER_TEMPLE_MQ_DIVE] = Area("Water Temple MQ Dive", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { @@ -273,7 +273,8 @@ void AreaTable_Init_WaterTemple() { areaTable[WATER_TEMPLE_MQ_LOWERED_WATER_LEVELS] = Area("Water Temple MQ Lowered Water Levels", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(WATER_TEMPLE_MQ_COMPASS_CHEST, {[]{return (IsAdult && CanUse(BOW)) || CanUse(DINS_FIRE) || Here(WATER_TEMPLE_MQ_LOBBY, []{return IsChild && CanUse(STICKS) && HasExplosives;});}}), + LocationAccess(WATER_TEMPLE_MQ_COMPASS_CHEST, {[]{return ((IsAdult && CanUse(BOW)) || CanUse(DINS_FIRE) || Here(WATER_TEMPLE_MQ_LOBBY, []{return IsChild && CanUse(STICKS) && HasExplosives;})) && + (CanJumpslash || CanUseProjectile);}}), LocationAccess(WATER_TEMPLE_MQ_LONGSHOT_CHEST, {[]{return IsAdult && CanUse(HOOKSHOT);}}), LocationAccess(WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, {[]{return CanUse(DINS_FIRE);}}), LocationAccess(WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH, {[]{return IsAdult && CanUse(LONGSHOT);}}), @@ -296,7 +297,7 @@ void AreaTable_Init_WaterTemple() { //Locations LocationAccess(WATER_TEMPLE_MQ_FREESTANDING_KEY, {[]{return HoverBoots || CanUse(SCARECROW) || LogicWaterNorthBasementLedgeJump;}}), LocationAccess(WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, {[]{return CanUse(FIRE_ARROWS) && (HoverBoots || CanUse(SCARECROW));}}), - LocationAccess(WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, {[]{return LogicWaterMQLockedGS || (SmallKeys(WATER_TEMPLE, 2) && (HoverBoots || CanUse(SCARECROW) || LogicWaterNorthBasementLedgeJump));}}), + LocationAccess(WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, {[]{return LogicWaterMQLockedGS || (SmallKeys(WATER_TEMPLE, 2) && (HoverBoots || CanUse(SCARECROW) || LogicWaterNorthBasementLedgeJump) && CanJumpslash);}}), //Trick: LogicWaterMQLockedGS || (SmallKeys(WATER_TEMPLE, 2) && (HoverBoots || CanUse(SCARECROW) || LogicWaterNorthBasementLedgeJump)) }, {}); } diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp index 6d46e783e98..be484dea848 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp @@ -95,7 +95,7 @@ void AreaTable_Init_ZorasDomain() { LocationAccess(ZD_CHEST, {[]{return IsChild && CanUse(STICKS);}}), LocationAccess(ZD_KING_ZORA_THAWED, {[]{return KingZoraThawed;}}), LocationAccess(ZD_TRADE_PRESCRIPTION, {[]{return KingZoraThawed && Prescription;}}), - LocationAccess(ZD_GS_FROZEN_WATERFALL, {[]{return IsAdult && AtNight && (HookshotOrBoomerang || CanUse(SLINGSHOT) || Bow || MagicMeter || LogicDomainGS) && CanGetNightTimeGS;}}), + LocationAccess(ZD_GS_FROZEN_WATERFALL, {[]{return IsAdult && AtNight && (HookshotOrBoomerang || CanUse(SLINGSHOT) || Bow || (MagicMeter && (MasterSword || BiggoronSword)) || LogicDomainGS) && CanGetNightTimeGS;}}), LocationAccess(ZD_GOSSIP_STONE, {[]{return true;}}), }, { //Exits diff --git a/soh/soh/Enhancements/randomizer/3drando/logic.cpp b/soh/soh/Enhancements/randomizer/3drando/logic.cpp index 5ef76754efb..bb616d82efa 100644 --- a/soh/soh/Enhancements/randomizer/3drando/logic.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/logic.cpp @@ -253,6 +253,8 @@ namespace Logic { bool CanBlastOrSmash = false; bool CanChildAttack = false; bool CanChildDamage = false; + bool CanAdultAttack = false; + bool CanAdultDamage = false; bool CanCutShrubs = false; bool CanDive = false; bool CanLeaveForest = false; @@ -561,8 +563,10 @@ namespace Logic { CanBlastOrSmash = HasExplosives || CanUse(MEGATON_HAMMER); CanChildAttack = IsChild && (Slingshot || Boomerang || Sticks || KokiriSword || HasExplosives || CanUse(DINS_FIRE) || CanUse(MASTER_SWORD) || CanUse(MEGATON_HAMMER) || CanUse(BIGGORON_SWORD)); CanChildDamage = IsChild && (Slingshot || Sticks || KokiriSword || HasExplosives || CanUse(DINS_FIRE) || CanUse(MASTER_SWORD) || CanUse(MEGATON_HAMMER) || CanUse(BIGGORON_SWORD)); - CanStunDeku = IsAdult || CanChildAttack || Nuts || HasShield; - CanCutShrubs = IsAdult /*|| Sticks*/ || KokiriSword || Boomerang || HasExplosives || CanUse(MASTER_SWORD) || CanUse(MEGATON_HAMMER) || CanUse(BIGGORON_SWORD); + CanAdultAttack = IsAdult && (CanUse(SLINGSHOT) || CanUse(BOOMERANG) || CanUse(STICKS) || CanUse(KOKIRI_SWORD) || HasExplosives || CanUse(DINS_FIRE) || MasterSword || Hammer || BiggoronSword || Hookshot); + CanAdultDamage = IsAdult && (CanUse(SLINGSHOT) || CanUse(STICKS) || CanUse(KOKIRI_SWORD) || HasExplosives || CanUse(DINS_FIRE) || MasterSword || Hammer || BiggoronSword); + CanStunDeku = CanAdultAttack || CanChildAttack || Nuts || HasShield; + CanCutShrubs = CanUse(KOKIRI_SWORD) || CanUse(BOOMERANG) || HasExplosives || CanUse(MASTER_SWORD) || CanUse(MEGATON_HAMMER) || CanUse(BIGGORON_SWORD); CanDive = ProgressiveScale >= 1; CanLeaveForest = OpenForest.IsNot(OPENFOREST_CLOSED) || IsAdult || DekuTreeClear || ShuffleInteriorEntrances || ShuffleOverworldEntrances; CanPlantBugs = IsChild && Bugs; @@ -589,8 +593,8 @@ namespace Logic { HasFireSourceWithTorch = HasFireSource || CanUse(STICKS); //Gerudo Fortress - CanFinishGerudoFortress = (GerudoFortress.Is(GERUDOFORTRESS_NORMAL) && GerudoFortressKeys >= 4 && (IsAdult || KokiriSword || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)) && (GerudoToken || CanUse(BOW) || CanUse(HOOKSHOT) || CanUse(HOVER_BOOTS) || LogicGerudoKitchen)) || - (GerudoFortress.Is(GERUDOFORTRESS_FAST) && GerudoFortressKeys >= 1 && (IsAdult || KokiriSword || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD))) || + CanFinishGerudoFortress = (GerudoFortress.Is(GERUDOFORTRESS_NORMAL) && GerudoFortressKeys >= 4 && (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)) && (GerudoToken || CanUse(BOW) || CanUse(HOOKSHOT) || CanUse(HOVER_BOOTS) || LogicGerudoKitchen)) || + (GerudoFortress.Is(GERUDOFORTRESS_FAST) && GerudoFortressKeys >= 1 && (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD))) || (GerudoFortress.IsNot(GERUDOFORTRESS_NORMAL) && GerudoFortress.IsNot(GERUDOFORTRESS_FAST)); HasShield = CanUse(HYLIAN_SHIELD) || CanUse(DEKU_SHIELD); //Mirror shield can't reflect attacks @@ -599,7 +603,7 @@ namespace Logic { AdultReflectShield = IsAdult && CanUse(HYLIAN_SHIELD); //Mirror shield can't reflect attacks AdultShield = IsAdult && (CanUse(HYLIAN_SHIELD) || CanUse(MIRROR_SHIELD)); CanShieldFlick = ChildShield || AdultShield; - CanJumpslash = IsAdult || Sticks || KokiriSword; + CanJumpslash = CanUse(STICKS) || CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD); // Not including hammer as hammer jump attacks can be weird CanUseProjectile = HasExplosives || CanUse(BOW) || CanUse(HOOKSHOT) || CanUse(SLINGSHOT) || CanUse(BOOMERANG); CanUseMagicArrow = CanUse(FIRE_ARROWS) || CanUse(ICE_ARROWS) || CanUse(LIGHT_ARROWS); diff --git a/soh/soh/Enhancements/randomizer/3drando/logic.hpp b/soh/soh/Enhancements/randomizer/3drando/logic.hpp index 77f942168ab..a505b229590 100644 --- a/soh/soh/Enhancements/randomizer/3drando/logic.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/logic.hpp @@ -242,6 +242,8 @@ extern bool IsGlitched; extern bool CanBlastOrSmash; extern bool CanChildAttack; extern bool CanChildDamage; +extern bool CanAdultAttack; +extern bool CanAdultDamage; extern bool CanCutShrubs; extern bool CanDive; extern bool CanLeaveForest; diff --git a/soh/soh/Enhancements/randomizer/3drando/settings.cpp b/soh/soh/Enhancements/randomizer/3drando/settings.cpp index 7f6b8d7d8c5..fa09afdb7c8 100644 --- a/soh/soh/Enhancements/randomizer/3drando/settings.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/settings.cpp @@ -187,6 +187,7 @@ namespace Settings { Option Scrubsanity = Option::U8 ("Scrub Shuffle", {"Off", "Affordable", "Expensive", "Random Prices"}, {scrubsOff, scrubsAffordable, scrubsExpensive, scrubsRandomPrices}); Option ShuffleCows = Option::Bool("Shuffle Cows", {"Off", "On"}, {shuffleCowsDesc}); Option ShuffleKokiriSword = Option::Bool("Shuffle Kokiri Sword", {"Off", "On"}, {kokiriSwordDesc}); + Option ShuffleMasterSword = Option::Bool("Shuffle Master Sword", {"Off", "On"}, {""}); Option ShuffleOcarinas = Option::Bool("Shuffle Ocarinas", {"Off", "On"}, {ocarinasDesc}); Option ShuffleWeirdEgg = Option::Bool("Shuffle Weird Egg", {"Off", "On"}, {weirdEggDesc}); Option ShuffleGerudoToken = Option::Bool("Shuffle Gerudo Card", {"Off", "On"}, {gerudoTokenDesc}); @@ -208,6 +209,7 @@ namespace Settings { &Scrubsanity, &ShuffleCows, &ShuffleKokiriSword, + &ShuffleMasterSword, &ShuffleOcarinas, &ShuffleWeirdEgg, &ShuffleGerudoToken, @@ -571,6 +573,7 @@ namespace Settings { }; Option StartingKokiriSword = Option::U8 ("Start with Kokiri Sword", {"Off", "On"}, {""}); + Option StartingMasterSword = Option::U8 ("Start with Master Sword", {"Off", "On"}, {""}); Option StartingBiggoronSword = Option::U8 ("Biggoron Sword", {"Off", "Giant's Knife", "Biggoron Sword"}, {""}); Option StartingDekuShield = Option::U8 ("Start with Deku Shield", {"Off", "On"}, {""}); Option StartingHylianShield = Option::U8 ("Hylian Shield", {"Off", "On"}, {""}); @@ -2893,6 +2896,7 @@ namespace Settings { Scrubsanity.SetSelectedIndex(cvarSettings[RSK_SHUFFLE_SCRUBS]); ShuffleCows.SetSelectedIndex(cvarSettings[RSK_SHUFFLE_COWS]); ShuffleKokiriSword.SetSelectedIndex(cvarSettings[RSK_SHUFFLE_KOKIRI_SWORD]); + ShuffleMasterSword.SetSelectedIndex(cvarSettings[RSK_SHUFFLE_MASTER_SWORD]); ShuffleOcarinas.SetSelectedIndex(cvarSettings[RSK_SHUFFLE_OCARINA]); // Shuffle Entrances diff --git a/soh/soh/Enhancements/randomizer/3drando/settings.hpp b/soh/soh/Enhancements/randomizer/3drando/settings.hpp index caba82055ef..1a8c2a91b29 100644 --- a/soh/soh/Enhancements/randomizer/3drando/settings.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/settings.hpp @@ -959,6 +959,7 @@ void UpdateSettings(std::unordered_map cvarSettin extern Option Scrubsanity; extern Option ShuffleCows; extern Option ShuffleKokiriSword; + extern Option ShuffleMasterSword; extern Option ShuffleOcarinas; extern Option ShuffleWeirdEgg; extern Option ShuffleGerudoToken; diff --git a/soh/soh/Enhancements/randomizer/3drando/shops.cpp b/soh/soh/Enhancements/randomizer/3drando/shops.cpp index 4049ee628a3..5ed91124ef9 100644 --- a/soh/soh/Enhancements/randomizer/3drando/shops.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/shops.cpp @@ -226,10 +226,10 @@ void InitTrickNames() { Text{"Korok Sword", "Épée Korok", "Espada Korok"}, Text{"Hero's Sword", "Épée du Héros", "Espada del héroe"}, Text{"Razor Sword", "Lame Rasoir", "Espada de esmeril"}}; -/* trickNameTable[GI_SWORD_MASTER] = { + trickNameTable[GI_SWORD_MASTER] = { Text{"Goddess Sword", "Épée de la déesse", "Espada Divina"}, Text{"Gilded Sword", "Excalibur", "Espada de los Sabios"}, - Text{"Magical Sword", "Lame dorée", "Fay"}};*/ + Text{"Magical Sword", "Lame dorée", "Fay"}}; trickNameTable[GI_SWORD_KNIFE] = { Text{"Big Goron's Sword", "Épée de Gros Goron", "Espada de Big Goron"}, Text{"Fierce Deity's Sword", "Épée du Dieu Démon", "Espada de la Fiera Deidad"}, diff --git a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp index f6ebb5d3673..961ab93cadf 100644 --- a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp @@ -728,7 +728,8 @@ static void WriteHints(int language) { jsonData["ganonText"] = ganonText; jsonData["ganonHintText"] = ganonHintText; - jsonData["ganonHintLoc"] = GetGanonHintLoc(); + jsonData["LAHintLoc"] = GetLAHintLoc(); + jsonData["MSHintLoc"] = GetMSHintLoc(); jsonData["dampeText"] = dampesText; jsonData["dampeHintLoc"] = GetDampeHintLoc(); jsonData["gregText"] = gregText; diff --git a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.hpp b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.hpp index 98c0704f1c3..fe7de2a74e2 100644 --- a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.hpp @@ -25,6 +25,7 @@ typedef enum { SPOILER_CHK_POE_POINTS, SPOILER_CHK_SHOP_ITEM, SPOILER_CHK_MAGIC_BEANS, + SPOILER_CHK_MASTER_SWORD, SPOILER_CHK_MERCHANT, SPOILER_CHK_GRAVEDIGGER, SPOILER_CHK_RANDOMIZER_INF, diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 202147bb94d..f48be3c5325 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -261,6 +261,7 @@ std::unordered_map SpoilerfileSettingNameToEn { "Shuffle Settings:Shuffle Adult Trade", RSK_SHUFFLE_ADULT_TRADE }, { "Shuffle Settings:Shuffle Magic Beans", RSK_SHUFFLE_MAGIC_BEANS }, { "Shuffle Settings:Shuffle Kokiri Sword", RSK_SHUFFLE_KOKIRI_SWORD }, + { "Shuffle Settings:Shuffle Master Sword", RSK_SHUFFLE_MASTER_SWORD }, { "Shuffle Settings:Shuffle Weird Egg", RSK_SHUFFLE_WEIRD_EGG }, { "Shuffle Settings:Shuffle Frog Song Rupees", RSK_SHUFFLE_FROG_SONG_RUPEES }, { "Shuffle Settings:Shuffle Merchants", RSK_SHUFFLE_MERCHANTS }, @@ -820,6 +821,7 @@ void Randomizer::ParseRandomizerSettingsFile(const char* spoilerFileName) { case RSK_SHUFFLE_ADULT_TRADE: case RSK_SHUFFLE_MAGIC_BEANS: case RSK_SHUFFLE_KOKIRI_SWORD: + case RSK_SHUFFLE_MASTER_SWORD: case RSK_SHUFFLE_WEIRD_EGG: case RSK_SHUFFLE_FROG_SONG_RUPEES: case RSK_SHUFFLE_100_GS_REWARD: @@ -1281,7 +1283,8 @@ void Randomizer::ParseHintLocationsFile(const char* spoilerFileName) { std::string formattedGanonHintJsonText = FormatJsonHintText(ganonHintJsonText); strncpy(gSaveContext.ganonHintText, formattedGanonHintJsonText.c_str(), sizeof(gSaveContext.ganonHintText) - 1); gSaveContext.ganonHintText[sizeof(gSaveContext.ganonHintText) - 1] = 0; - gSaveContext.ganonHintCheck = SpoilerfileCheckNameToEnum[spoilerFileJson["ganonHintLoc"]]; + gSaveContext.LAHintCheck = SpoilerfileCheckNameToEnum[spoilerFileJson["LAHintLoc"]]; + gSaveContext.MSHintCheck = SpoilerfileCheckNameToEnum[spoilerFileJson["MSHintLoc"]]; std::string ganonJsonText = spoilerFileJson["ganonText"].get(); std::string formattedGanonJsonText = FormatJsonHintText(ganonJsonText); @@ -1603,6 +1606,8 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe // Equipment case RG_KOKIRI_SWORD: return !CHECK_OWNED_EQUIP(EQUIP_SWORD, 0) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; + case RG_MASTER_SWORD: + return !CHECK_OWNED_EQUIP(EQUIP_SWORD, 1) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; case RG_BIGGORON_SWORD: return !gSaveContext.bgsFlag ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; case RG_DEKU_SHIELD: @@ -1940,6 +1945,8 @@ GetItemID Randomizer::GetItemIdFromRandomizerGet(RandomizerGet randoGet, GetItem // Equipment case RG_KOKIRI_SWORD: return GI_SWORD_KOKIRI; + case RG_MASTER_SWORD: + return GI_SWORD_MASTER; case RG_PROGRESSIVE_GORONSWORD: //todo progressive? return GI_SWORD_BGS; case RG_GIANTS_KNIFE: @@ -2952,6 +2959,7 @@ void GenerateRandomizerImgui(std::string seed = "") { cvarSettings[RSK_STARTING_KOKIRI_SWORD] = CVarGetInteger("gRandomizeStartingKokiriSword", 0); cvarSettings[RSK_SHUFFLE_KOKIRI_SWORD] = CVarGetInteger("gRandomizeShuffleKokiriSword", 0) || CVarGetInteger("gRandomizeStartingKokiriSword", 0); + cvarSettings[RSK_SHUFFLE_MASTER_SWORD] = CVarGetInteger("gRandomizeShuffleMasterSword", 0); cvarSettings[RSK_STARTING_DEKU_SHIELD] = CVarGetInteger("gRandomizeStartingDekuShield", 0); cvarSettings[RSK_STARTING_ZELDAS_LULLABY] = CVarGetInteger("gRandomizeStartingZeldasLullaby", 0); cvarSettings[RSK_STARTING_EPONAS_SONG] = CVarGetInteger("gRandomizeStartingEponasSong", 0); @@ -3832,6 +3840,18 @@ void RandomizerSettingsWindow::DrawElement() { "This will require the use of sticks until the Kokiri Sword is found." ); + //Shuffle Master Sword + //RANDOTODO: Disable when Start with Master Sword is active + // bool disableShuffleMasterSword = CvarGetInteger("gRandomizeStartingMasterSword", 0); + // static const char* disableShuffleMasterSwordText = "This option is disabled because \"Start with Master Sword\" is enabled."; + UIWidgets::EnhancementCheckbox(Settings::ShuffleMasterSword.GetName().c_str(), "gRandomizeShuffleMasterSword"); + UIWidgets::InsertHelpHoverText( + "Shuffles the Master Sword into the item pool.\n" + "\n" + "Adult Link will start with a second free item instead of the Master Sword.\n" + "If you haven't found the Master Sword before facing Ganon, you won't receive it during the fight." + ); + UIWidgets::PaddedSeparator(); // Shuffle Ocarinas @@ -5759,11 +5779,13 @@ CustomMessage Randomizer::GetGoronMessage(u16 index) { void Randomizer::CreateCustomMessages() { // RANDTODO: Translate into french and german and replace GIMESSAGE_UNTRANSLATED // with GIMESSAGE(getItemID, itemID, english, german, french). - const std::array getItemMessages = {{ + const std::array getItemMessages = {{ GIMESSAGE(RG_GREG_RUPEE, ITEM_MASK_GORON, "You found %gGreg%w!", "%gGreg%w! Du hast ihn wirklich gefunden!", "Félicitation! Vous avez trouvé %gGreg%w!"), + GIMESSAGE_UNTRANSLATED(RG_MASTER_SWORD, ITEM_SWORD_MASTER, + "You found the %gMaster Sword%w!",), GIMESSAGE(RG_BOTTLE_WITH_BLUE_FIRE, ITEM_BLUE_FIRE, "You got a %rBottle with Blue &Fire%w! Use it to melt Red Ice!", "Du erhältst eine %rFlasche mit&blauem Feuer%w! Nutze es um&%rRotes Eis%w zu schmelzen!", @@ -6047,6 +6069,7 @@ void InitRandoItemTable() { GET_ITEM(RG_MAGIC_DOUBLE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0xE8, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER, RG_MAGIC_DOUBLE), GET_ITEM(RG_DOUBLE_DEFENSE, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xE9, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER, RG_DOUBLE_DEFENSE), GET_ITEM(RG_GREG_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GREEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER, RG_GREG_RUPEE), + GET_ITEM(RG_MASTER_SWORD, OBJECT_GI_SWORD_1, GID_SWORD_BGS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER, RG_MASTER_SWORD), GET_ITEM(RG_BOTTLE_WITH_RED_POTION, OBJECT_GI_LIQUID, GID_POTION_RED, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER, RG_BOTTLE_WITH_RED_POTION), GET_ITEM(RG_BOTTLE_WITH_GREEN_POTION, OBJECT_GI_LIQUID, GID_POTION_GREEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER, RG_BOTTLE_WITH_GREEN_POTION), GET_ITEM(RG_BOTTLE_WITH_BLUE_POTION, OBJECT_GI_LIQUID, GID_POTION_BLUE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER, RG_BOTTLE_WITH_BLUE_POTION), diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 0cf490b8d23..0dc1ba971ed 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -211,6 +211,7 @@ typedef enum { RC_MARKET_BOMBCHU_SHOP_ITEM_7, RC_MARKET_BOMBCHU_SHOP_ITEM_8, RC_TOT_LIGHT_ARROWS_CUTSCENE, + RC_TOT_MASTER_SWORD, RC_HC_MALON_EGG, RC_HC_ZELDAS_LETTER, RC_HC_GREAT_FAIRY_REWARD, @@ -1112,6 +1113,7 @@ typedef enum { typedef enum { RG_NONE, RG_KOKIRI_SWORD, + RG_MASTER_SWORD, RG_GIANTS_KNIFE, RG_BIGGORON_SWORD, RG_DEKU_SHIELD, @@ -1348,6 +1350,7 @@ typedef enum { RSK_STARTING_NOCTURNE_OF_SHADOW, RSK_STARTING_PRELUDE_OF_LIGHT, RSK_SHUFFLE_KOKIRI_SWORD, + RSK_SHUFFLE_MASTER_SWORD, RSK_STARTING_MAPS_COMPASSES, RSK_SHUFFLE_DUNGEON_REWARDS, RSK_SHUFFLE_SONGS, diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp index 9dc1ce081a7..349f4b25ff0 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp @@ -169,6 +169,7 @@ std::map rcObjects = { RC_OBJECT(RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, RCVORMQ_BOTH, RCTYPE_CHEST_GAME, RCAREA_MARKET, ACTOR_EN_BOX, SCENE_TAKARAYA, 0x00, GI_NONE, "Chest Game Fifth Room Chest", "MK Chest Game Fifth Room Chest"), RC_OBJECT(RC_MARKET_GS_GUARD_HOUSE, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_MARKET, ACTOR_EN_SI, SCENE_MIHARIGOYA, -29176, GI_SKULL_TOKEN, "Market GS Guard House", "Market GS Guard House"), RC_OBJECT(RC_TOT_LIGHT_ARROWS_CUTSCENE, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, GI_NONE, "ToT Light Arrow Cutscene", "ToT Light Arrow Cutscene"), + RC_OBJECT(RC_TOT_MASTER_SWORD, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, GI_SWORD_MASTER, "ToT Master Sword,", "ToT Master Sword"), RC_OBJECT(RC_SHEIK_AT_TEMPLE, RCVORMQ_BOTH, RCTYPE_SONG_LOCATION, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, GI_NONE, "Sheik at Temple", "Sheik at Temple"), RC_OBJECT(RC_MARKET_BOMBCHU_SHOP_ITEM_1, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_NIGHT_SHOP, 0x00, GI_BOMBCHUS_10, "Bombchu Shop Item 1", "MK Bombchu Shop Item 1"), RC_OBJECT(RC_MARKET_BOMBCHU_SHOP_ITEM_2, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_NIGHT_SHOP, 0x01, GI_BOMBCHUS_10, "Bombchu Shop Item 2", "MK Bombchu Shop Item 2"), diff --git a/soh/src/code/z_sram.c b/soh/src/code/z_sram.c index ce5651539fe..124187d8756 100644 --- a/soh/src/code/z_sram.c +++ b/soh/src/code/z_sram.c @@ -168,10 +168,13 @@ void Sram_OpenSave() { // check for owning kokiri sword.. to restore master sword? bug or debug feature? if (LINK_AGE_IN_YEARS == YEARS_ADULT && !CHECK_OWNED_EQUIP(EQUIP_SWORD, 1)) { - gSaveContext.inventory.equipment |= gBitFlags[1] << gEquipShifts[EQUIP_SWORD]; - gSaveContext.equips.buttonItems[0] = ITEM_SWORD_MASTER; - gSaveContext.equips.equipment &= ~0xF; - gSaveContext.equips.equipment |= 2; + if (gSaveContext.n64ddFlag && Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD)) {;} + else { + gSaveContext.inventory.equipment |= gBitFlags[1] << gEquipShifts[EQUIP_SWORD]; + gSaveContext.equips.buttonItems[0] = ITEM_SWORD_MASTER; + gSaveContext.equips.equipment &= ~0xF; + gSaveContext.equips.equipment |= 2; + } } if (!(gSaveContext.n64ddFlag && Randomizer_GetSettingValue(RSK_SHUFFLE_ADULT_TRADE))) { diff --git a/soh/src/overlays/actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c b/soh/src/overlays/actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c index 8abc3a5ae39..c85904c27ed 100644 --- a/soh/src/overlays/actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c +++ b/soh/src/overlays/actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c @@ -122,7 +122,12 @@ void func_808BAF40(BgTokiSwd* this, PlayState* play) { if (!LINK_IS_ADULT || (gSaveContext.eventChkInf[5] & 0x20 && !gSaveContext.n64ddFlag) || gSaveContext.n64ddFlag) { if (Actor_HasParent(&this->actor, play)) { if (!LINK_IS_ADULT) { - Item_Give(play, ITEM_SWORD_MASTER); + if (Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD)) { + GetItemEntry itemEntry = Randomizer_GetItemFromKnownCheck(RC_TOT_MASTER_SWORD, GI_SWORD_MASTER); + Randomizer_Item_Give(play, itemEntry); + } else { + Item_Give(play, ITEM_SWORD_MASTER); + } play->csCtx.segment = D_808BB2F0; } else { play->csCtx.segment = D_808BB7A0; From a2dbdd3ac10a7eb26dfa9d08603e7f269ec6f965 Mon Sep 17 00:00:00 2001 From: Ralphie Morell Date: Sun, 11 Jun 2023 21:07:47 -0400 Subject: [PATCH 02/28] Removed `GI_SWORD_MASTER`; "Master Sword" Items now actually give MS --- soh/include/z64item.h | 1 - soh/soh/Enhancements/randomizer/3drando/item_list.cpp | 2 +- soh/soh/Enhancements/randomizer/3drando/item_pool.cpp | 2 +- soh/soh/Enhancements/randomizer/3drando/shops.cpp | 2 +- soh/soh/Enhancements/randomizer/randomizer.cpp | 2 -- .../Enhancements/randomizer/randomizer_check_objects.cpp | 2 +- soh/src/code/z_parameter.c | 9 +++++++++ soh/src/overlays/actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c | 2 +- 8 files changed, 14 insertions(+), 8 deletions(-) diff --git a/soh/include/z64item.h b/soh/include/z64item.h index 73ef0bef681..65f6e93d90c 100644 --- a/soh/include/z64item.h +++ b/soh/include/z64item.h @@ -380,7 +380,6 @@ typedef enum { /* 0x7B */ GI_BULLET_BAG_50, /* 0x7C */ GI_ICE_TRAP, // freezes link when opened from a chest /* 0x7D */ GI_TEXT_0, // no model appears over Link, shows text id 0 (pocket egg) - /* 0x7E */ GI_SWORD_MASTER, /* 0x84 */ GI_MAX } GetItemID; diff --git a/soh/soh/Enhancements/randomizer/3drando/item_list.cpp b/soh/soh/Enhancements/randomizer/3drando/item_list.cpp index ffc2a6e9bc2..d9477cc9c84 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_list.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_list.cpp @@ -12,7 +12,7 @@ static std::array itemTable; void ItemTable_Init() { // RandomizerGet English name French Spanish Item Type getItemID advancement logic hint key itemTable[NONE] = Item(RG_NONE, Text{"No Item", "Rien", "Sin Objeto"}, ITEMTYPE_EVENT, GI_RUPEE_GREEN, false, &noVariable, NONE); itemTable[KOKIRI_SWORD] = Item(RG_KOKIRI_SWORD, Text{"Kokiri Sword", "Épée Kokiri", "Espada Kokiri"}, ITEMTYPE_ITEM, GI_SWORD_KOKIRI, true, &KokiriSword, KOKIRI_SWORD); - itemTable[MASTER_SWORD] = Item(RG_MASTER_SWORD, Text{"Master Sword", "Épée de Legende", "Espada Master"}, ITEMTYPE_ITEM, GI_SWORD_MASTER, true, &MasterSword, MASTER_SWORD); + //itemTable[MASTER_SWORD] = Item(RG_MASTER_SWORD, Text{"Master Sword", "Épée de Legende", "Espada Master"}, ITEMTYPE_ITEM, GI_SWORD_MASTER, true, &MasterSword, MASTER_SWORD); itemTable[GIANTS_KNIFE] = Item(RG_GIANTS_KNIFE, Text{"Giant's Knife", "Lame des Géants", "Espada de Biggoron"}, ITEMTYPE_ITEM, GI_SWORD_KNIFE, false, &noVariable, GIANTS_KNIFE); itemTable[BIGGORON_SWORD] = Item(RG_BIGGORON_SWORD, Text{"Biggoron's Sword", "Épée de Biggoron", "Espada de Biggoron"}, ITEMTYPE_ITEM, GI_SWORD_BGS, true, &BiggoronSword, BIGGORON_SWORD); itemTable[DEKU_SHIELD] = Item(RG_DEKU_SHIELD, Text{"Deku Shield", "Bouclier Mojo", "Escudo deku"}, ITEMTYPE_ITEM, GI_SHIELD_DEKU, false, &noVariable, DEKU_SHIELD); diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index 39ea3c81c96..e5a32f95f62 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -678,7 +678,7 @@ void GenerateItemPool() { if (ShuffleMasterSword) { AddItemToMainPool(MASTER_SWORD); - IceTrapModels.push_back(GI_SWORD_MASTER); + IceTrapModels.push_back(0x73); //Master Sword without the GI enum } else { PlaceItemInLocation(TOT_MASTER_SWORD, MASTER_SWORD, false, true); } diff --git a/soh/soh/Enhancements/randomizer/3drando/shops.cpp b/soh/soh/Enhancements/randomizer/3drando/shops.cpp index 5ed91124ef9..6b9b1e1231b 100644 --- a/soh/soh/Enhancements/randomizer/3drando/shops.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/shops.cpp @@ -226,7 +226,7 @@ void InitTrickNames() { Text{"Korok Sword", "Épée Korok", "Espada Korok"}, Text{"Hero's Sword", "Épée du Héros", "Espada del héroe"}, Text{"Razor Sword", "Lame Rasoir", "Espada de esmeril"}}; - trickNameTable[GI_SWORD_MASTER] = { + trickNameTable[0x73] = { //Master Sword without the GI enum Text{"Goddess Sword", "Épée de la déesse", "Espada Divina"}, Text{"Gilded Sword", "Excalibur", "Espada de los Sabios"}, Text{"Magical Sword", "Lame dorée", "Fay"}}; diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index f48be3c5325..a810642fc84 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -1945,8 +1945,6 @@ GetItemID Randomizer::GetItemIdFromRandomizerGet(RandomizerGet randoGet, GetItem // Equipment case RG_KOKIRI_SWORD: return GI_SWORD_KOKIRI; - case RG_MASTER_SWORD: - return GI_SWORD_MASTER; case RG_PROGRESSIVE_GORONSWORD: //todo progressive? return GI_SWORD_BGS; case RG_GIANTS_KNIFE: diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp index 349f4b25ff0..dc678c24e94 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp @@ -169,7 +169,7 @@ std::map rcObjects = { RC_OBJECT(RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, RCVORMQ_BOTH, RCTYPE_CHEST_GAME, RCAREA_MARKET, ACTOR_EN_BOX, SCENE_TAKARAYA, 0x00, GI_NONE, "Chest Game Fifth Room Chest", "MK Chest Game Fifth Room Chest"), RC_OBJECT(RC_MARKET_GS_GUARD_HOUSE, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_MARKET, ACTOR_EN_SI, SCENE_MIHARIGOYA, -29176, GI_SKULL_TOKEN, "Market GS Guard House", "Market GS Guard House"), RC_OBJECT(RC_TOT_LIGHT_ARROWS_CUTSCENE, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, GI_NONE, "ToT Light Arrow Cutscene", "ToT Light Arrow Cutscene"), - RC_OBJECT(RC_TOT_MASTER_SWORD, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, GI_SWORD_MASTER, "ToT Master Sword,", "ToT Master Sword"), + RC_OBJECT(RC_TOT_MASTER_SWORD, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, GI_NONE, "ToT Master Sword,", "ToT Master Sword"), RC_OBJECT(RC_SHEIK_AT_TEMPLE, RCVORMQ_BOTH, RCTYPE_SONG_LOCATION, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, GI_NONE, "Sheik at Temple", "Sheik at Temple"), RC_OBJECT(RC_MARKET_BOMBCHU_SHOP_ITEM_1, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_NIGHT_SHOP, 0x00, GI_BOMBCHUS_10, "Bombchu Shop Item 1", "MK Bombchu Shop Item 1"), RC_OBJECT(RC_MARKET_BOMBCHU_SHOP_ITEM_2, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_NIGHT_SHOP, 0x01, GI_BOMBCHUS_10, "Bombchu Shop Item 2", "MK Bombchu Shop Item 2"), diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index 83066aff4b1..ceefbae50c6 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -2578,6 +2578,15 @@ u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { return Return_Item_Entry(giEntry, RG_NONE); } + if (item == RG_MASTER_SWORD) { + if (!CHECK_OWNED_EQUIP(EQUIP_SWORD, 1)) { + gSaveContext.inventory.equipment |= gBitFlags[1] << gEquipShifts[EQUIP_SWORD]; + gSaveContext.equips.equipment &= 0xFFF0; + gSaveContext.equips.equipment |= 0x0002; + } + return Return_Item_Entry(giEntry, RG_NONE); + } + temp = gSaveContext.inventory.items[slot]; osSyncPrintf("Item_Register(%d)=%d %d\n", slot, item, temp); INV_CONTENT(item) = item; diff --git a/soh/src/overlays/actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c b/soh/src/overlays/actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c index c85904c27ed..3770227748a 100644 --- a/soh/src/overlays/actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c +++ b/soh/src/overlays/actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c @@ -123,7 +123,7 @@ void func_808BAF40(BgTokiSwd* this, PlayState* play) { if (Actor_HasParent(&this->actor, play)) { if (!LINK_IS_ADULT) { if (Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD)) { - GetItemEntry itemEntry = Randomizer_GetItemFromKnownCheck(RC_TOT_MASTER_SWORD, GI_SWORD_MASTER); + GetItemEntry itemEntry = Randomizer_GetItemFromKnownCheck(RC_TOT_MASTER_SWORD, GI_NONE); Randomizer_Item_Give(play, itemEntry); } else { Item_Give(play, ITEM_SWORD_MASTER); From 677a0a48f1f8a121624521ea4bbafc3f10ee435f Mon Sep 17 00:00:00 2001 From: Ralphie Morell Date: Sun, 11 Jun 2023 21:56:03 -0400 Subject: [PATCH 03/28] Removed dupe MS entries in item pool; updated GIMESSAGE (should stop crashing on non-Windows); re-added MS in item list --- soh/soh/Enhancements/randomizer/3drando/item_list.cpp | 2 +- soh/soh/Enhancements/randomizer/3drando/item_location.cpp | 1 + soh/soh/Enhancements/randomizer/3drando/item_pool.cpp | 2 -- soh/soh/Enhancements/randomizer/randomizer.cpp | 6 ++++-- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/item_list.cpp b/soh/soh/Enhancements/randomizer/3drando/item_list.cpp index d9477cc9c84..458500a3915 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_list.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_list.cpp @@ -12,7 +12,7 @@ static std::array itemTable; void ItemTable_Init() { // RandomizerGet English name French Spanish Item Type getItemID advancement logic hint key itemTable[NONE] = Item(RG_NONE, Text{"No Item", "Rien", "Sin Objeto"}, ITEMTYPE_EVENT, GI_RUPEE_GREEN, false, &noVariable, NONE); itemTable[KOKIRI_SWORD] = Item(RG_KOKIRI_SWORD, Text{"Kokiri Sword", "Épée Kokiri", "Espada Kokiri"}, ITEMTYPE_ITEM, GI_SWORD_KOKIRI, true, &KokiriSword, KOKIRI_SWORD); - //itemTable[MASTER_SWORD] = Item(RG_MASTER_SWORD, Text{"Master Sword", "Épée de Legende", "Espada Master"}, ITEMTYPE_ITEM, GI_SWORD_MASTER, true, &MasterSword, MASTER_SWORD); + itemTable[MASTER_SWORD] = Item(RG_MASTER_SWORD, Text{"Master Sword", "Épée de Legende", "Espada Master"}, ITEMTYPE_ITEM, 0x73, true, &MasterSword, MASTER_SWORD); itemTable[GIANTS_KNIFE] = Item(RG_GIANTS_KNIFE, Text{"Giant's Knife", "Lame des Géants", "Espada de Biggoron"}, ITEMTYPE_ITEM, GI_SWORD_KNIFE, false, &noVariable, GIANTS_KNIFE); itemTable[BIGGORON_SWORD] = Item(RG_BIGGORON_SWORD, Text{"Biggoron's Sword", "Épée de Biggoron", "Espada de Biggoron"}, ITEMTYPE_ITEM, GI_SWORD_BGS, true, &BiggoronSword, BIGGORON_SWORD); itemTable[DEKU_SHIELD] = Item(RG_DEKU_SHIELD, Text{"Deku Shield", "Bouclier Mojo", "Escudo deku"}, ITEMTYPE_ITEM, GI_SHIELD_DEKU, false, &noVariable, DEKU_SHIELD); diff --git a/soh/soh/Enhancements/randomizer/3drando/item_location.cpp b/soh/soh/Enhancements/randomizer/3drando/item_location.cpp index 5e1dd82d9dd..8ca046e2b59 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_location.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_location.cpp @@ -1267,6 +1267,7 @@ std::vector overworldLocations = { OGC_GREAT_FAIRY_REWARD, //Temple of Time + TOT_MASTER_SWORD, SHEIK_AT_TEMPLE, TOT_LIGHT_ARROWS_CUTSCENE, diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index e5a32f95f62..d25f7e15e45 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -48,7 +48,6 @@ const std::array JunkPoolItems = { ICE_TRAP, }; const std::array alwaysItems = { - MASTER_SWORD, BIGGORON_SWORD, BOOMERANG, LENS_OF_TRUTH, @@ -110,7 +109,6 @@ const std::array alwaysItems = { TREASURE_GAME_HEART, }; const std::array easyItems = { - MASTER_SWORD, BIGGORON_SWORD, KOKIRI_SWORD, BOOMERANG, diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index a810642fc84..2f4f1f6300b 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -5782,8 +5782,10 @@ void Randomizer::CreateCustomMessages() { "You found %gGreg%w!", "%gGreg%w! Du hast ihn wirklich gefunden!", "Félicitation! Vous avez trouvé %gGreg%w!"), - GIMESSAGE_UNTRANSLATED(RG_MASTER_SWORD, ITEM_SWORD_MASTER, - "You found the %gMaster Sword%w!",), + GIMESSAGE(RG_MASTER_SWORD, ITEM_SWORD_MASTER, + "You found the %gMaster Sword%w!", + "Du erhältst dem %gMaster-Schwert%w!", + "Vous obtenez %gl'Épée de Légende%w!"), GIMESSAGE(RG_BOTTLE_WITH_BLUE_FIRE, ITEM_BLUE_FIRE, "You got a %rBottle with Blue &Fire%w! Use it to melt Red Ice!", "Du erhältst eine %rFlasche mit&blauem Feuer%w! Nutze es um&%rRotes Eis%w zu schmelzen!", From 6775ba93972ba27f5a6b9b5864a88dc099a347cb Mon Sep 17 00:00:00 2001 From: Ralphie Morell Date: Sun, 11 Jun 2023 23:09:28 -0400 Subject: [PATCH 04/28] Give Adult Link a freebie with shuffle MS on; cihld -> adult no longer gives MS; ToT Master Sword now gives correct item --- soh/soh/Enhancements/randomizer/savefile.cpp | 5 +++++ soh/src/code/z_parameter.c | 7 ++++++- .../overlays/actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c | 12 ++++++++++-- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/savefile.cpp b/soh/soh/Enhancements/randomizer/savefile.cpp index 4b546e1f013..85b4afd9218 100644 --- a/soh/soh/Enhancements/randomizer/savefile.cpp +++ b/soh/soh/Enhancements/randomizer/savefile.cpp @@ -352,6 +352,11 @@ extern "C" void Randomizer_InitSaveFile() { INV_CONTENT(ITEM_LETTER_ZELDA) = ITEM_LETTER_ZELDA; } + if (Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) && startingAge == RO_AGE_ADULT) { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_TOT_MASTER_SWORD, GI_NONE); + StartingItemGive(getItemEntry); + } + HIGH_SCORE(HS_POE_POINTS) = 1000 - (100 * Randomizer_GetSettingValue(RSK_BIG_POE_COUNT)); if (Randomizer_GetSettingValue(RSK_SKIP_EPONA_RACE)) { diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index ceefbae50c6..903e1e99e25 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -1415,13 +1415,18 @@ void Inventory_SwapAgeEquipment(void) { // When becoming adult, remove swordless flag since we'll get master sword // Only in rando to keep swordless link bugs in vanilla if (gSaveContext.n64ddFlag) { + if (!Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD)) { gSaveContext.infTable[29] &= ~1; + } } gSaveContext.childEquips.equipment = gSaveContext.equips.equipment; if (gSaveContext.adultEquips.buttonItems[0] == ITEM_NONE) { - gSaveContext.equips.buttonItems[0] = ITEM_SWORD_MASTER; + if (gSaveContext.n64ddFlag && Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD)) {;} + else { + gSaveContext.equips.buttonItems[0] = ITEM_SWORD_MASTER; + } if (gSaveContext.inventory.items[SLOT_NUT] != ITEM_NONE) { gSaveContext.equips.buttonItems[1] = ITEM_NUT; diff --git a/soh/src/overlays/actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c b/soh/src/overlays/actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c index 3770227748a..b4b6415a96c 100644 --- a/soh/src/overlays/actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c +++ b/soh/src/overlays/actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c @@ -123,8 +123,16 @@ void func_808BAF40(BgTokiSwd* this, PlayState* play) { if (Actor_HasParent(&this->actor, play)) { if (!LINK_IS_ADULT) { if (Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD)) { - GetItemEntry itemEntry = Randomizer_GetItemFromKnownCheck(RC_TOT_MASTER_SWORD, GI_NONE); - Randomizer_Item_Give(play, itemEntry); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_TOT_MASTER_SWORD, GI_NONE); + if (getItemEntry.modIndex == MOD_NONE) { + //RANDOTODO: Move this into Item_Give() or some other central location + if (getItemEntry.getItemId == GI_SWORD_BGS) { + gSaveContext.bgsFlag = true; + } + Item_Give(play, getItemEntry.itemId); + } else if (getItemEntry.modIndex == MOD_RANDOMIZER) { + Randomizer_Item_Give(play, getItemEntry); + } } else { Item_Give(play, ITEM_SWORD_MASTER); } From b3f05797db55af90663579691f4d56adc9fac9d7 Mon Sep 17 00:00:00 2001 From: Adam Bird Date: Mon, 12 Jun 2023 15:55:23 -0400 Subject: [PATCH 05/28] add master sword GI draw func based on ToT MS object --- soh/soh/Enhancements/randomizer/draw.cpp | 22 +++++++++++++++++++ soh/soh/Enhancements/randomizer/draw.h | 1 + .../Enhancements/randomizer/randomizer.cpp | 4 +++- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/draw.cpp b/soh/soh/Enhancements/randomizer/draw.cpp index 73a05250824..54afa58f28d 100644 --- a/soh/soh/Enhancements/randomizer/draw.cpp +++ b/soh/soh/Enhancements/randomizer/draw.cpp @@ -8,6 +8,7 @@ #include "objects/object_gi_key/object_gi_key.h" #include "objects/object_gi_bosskey/object_gi_bosskey.h" #include "objects/object_gi_hearts/object_gi_hearts.h" +#include "objects/object_toki_objects/object_toki_objects.h" #include "objects/gameplay_field_keep/gameplay_field_keep.h" extern "C" void Randomizer_DrawSmallKey(PlayState* play, GetItemEntry* getItemEntry) { @@ -165,3 +166,24 @@ extern "C" void Randomizer_DrawDoubleDefense(PlayState* play, GetItemEntry getIt CLOSE_DISPS(play->state.gfxCtx); } + +extern "C" void Randomizer_DrawMasterSword(PlayState* play, GetItemEntry getItemEntry) { + OPEN_DISPS(play->state.gfxCtx); + + Gfx_SetupDL_25Opa(play->state.gfxCtx); + + gSPSegment(POLY_OPA_DISP++, 0x08, + (uintptr_t)Gfx_TwoTexScroll(play->state.gfxCtx, 0, 1 * (play->state.frames * 1), + 0 * (play->state.frames * 1), 32, 32, 1, 0 * (play->state.frames * 1), + 0 * (play->state.frames * 1), 32, 32)); + + Matrix_Scale(0.05f, 0.05f, 0.05f, MTXMODE_APPLY); + Matrix_RotateZ(2.1f, MTXMODE_APPLY); + + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_MODELVIEW | G_MTX_LOAD); + + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)object_toki_objects_DL_001BD0); + + CLOSE_DISPS(play->state.gfxCtx); +} diff --git a/soh/soh/Enhancements/randomizer/draw.h b/soh/soh/Enhancements/randomizer/draw.h index d9f0ed36b44..a855ecb71ee 100644 --- a/soh/soh/Enhancements/randomizer/draw.h +++ b/soh/soh/Enhancements/randomizer/draw.h @@ -10,6 +10,7 @@ extern "C" void Randomizer_DrawSmallKey(PlayState* play, GetItemEntry* getItemEn extern "C" void Randomizer_DrawKeyRing(PlayState* play, GetItemEntry* getItemEntry); extern "C" void Randomizer_DrawBossKey(PlayState* play, GetItemEntry* getItemEntry); extern "C" void Randomizer_DrawDoubleDefense(PlayState* play, GetItemEntry getItemEntry); +extern "C" void Randomizer_DrawMasterSword(PlayState* play, GetItemEntry getItemEntry); extern "C" void Randomizer_DrawIceTrap(PlayState* play, GetItemEntry getItemEntry); #endif diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 2f4f1f6300b..42cfcde7516 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -6069,7 +6069,7 @@ void InitRandoItemTable() { GET_ITEM(RG_MAGIC_DOUBLE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0xE8, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER, RG_MAGIC_DOUBLE), GET_ITEM(RG_DOUBLE_DEFENSE, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xE9, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER, RG_DOUBLE_DEFENSE), GET_ITEM(RG_GREG_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GREEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER, RG_GREG_RUPEE), - GET_ITEM(RG_MASTER_SWORD, OBJECT_GI_SWORD_1, GID_SWORD_BGS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER, RG_MASTER_SWORD), + GET_ITEM(RG_MASTER_SWORD, OBJECT_TOKI_OBJECTS,GID_SWORD_BGS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER, RG_MASTER_SWORD), GET_ITEM(RG_BOTTLE_WITH_RED_POTION, OBJECT_GI_LIQUID, GID_POTION_RED, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER, RG_BOTTLE_WITH_RED_POTION), GET_ITEM(RG_BOTTLE_WITH_GREEN_POTION, OBJECT_GI_LIQUID, GID_POTION_GREEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER, RG_BOTTLE_WITH_GREEN_POTION), GET_ITEM(RG_BOTTLE_WITH_BLUE_POTION, OBJECT_GI_LIQUID, GID_POTION_BLUE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER, RG_BOTTLE_WITH_BLUE_POTION), @@ -6141,6 +6141,8 @@ void InitRandoItemTable() { randoGetItemTable[i].drawFunc = (CustomDrawFunc)Randomizer_DrawBossKey; } else if (randoGetItemTable[i].itemId == RG_DOUBLE_DEFENSE) { randoGetItemTable[i].drawFunc = (CustomDrawFunc)Randomizer_DrawDoubleDefense; + } else if (randoGetItemTable[i].itemId == RG_MASTER_SWORD) { + randoGetItemTable[i].drawFunc = (CustomDrawFunc)Randomizer_DrawMasterSword; } ItemTableManager::Instance->AddItemEntry(MOD_RANDOMIZER, randoGetItemTable[i].itemId, randoGetItemTable[i]); } From 7cb1cccb1f3ec01c2fb46cd39a2ec461d031916a Mon Sep 17 00:00:00 2001 From: Ralphie Morell Date: Mon, 12 Jun 2023 19:03:56 -0400 Subject: [PATCH 06/28] Force `MasterSword` logic var to only update upon getting MS --- soh/soh/Enhancements/randomizer/3drando/logic.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/logic.cpp b/soh/soh/Enhancements/randomizer/3drando/logic.cpp index bb616d82efa..006c2dab657 100644 --- a/soh/soh/Enhancements/randomizer/3drando/logic.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/logic.cpp @@ -514,7 +514,7 @@ namespace Logic { SilverScale = ProgressiveScale >= 1; GoldScale = ProgressiveScale >= 2; AdultsWallet = ProgressiveWallet >= 1; - MasterSword = MasterSword || IsAdult; + MasterSword = MasterSword; BiggoronSword = BiggoronSword || ProgressiveGiantKnife >= 2; ScarecrowSong = ScarecrowSong || FreeScarecrow || (ChildScarecrow && AdultScarecrow); From 4ee5d6611bcdffaa34f27f00b4bc871d151f92ca Mon Sep 17 00:00:00 2001 From: Ralphie Morell Date: Mon, 12 Jun 2023 19:16:51 -0400 Subject: [PATCH 07/28] Dorf funny line now activates with LA and MS in inv --- soh/soh/OTRGlobals.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 3a75545a5f3..136fc6db520 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1922,7 +1922,8 @@ extern "C" int CustomMessage_RetrieveIfExists(PlayState* play) { ? CustomMessageManager::Instance->RetrieveMessage(Randomizer::hintMessageTableID, TEXT_ALTAR_ADULT) : CustomMessageManager::Instance->RetrieveMessage(Randomizer::hintMessageTableID, TEXT_ALTAR_CHILD); } else if (textId == TEXT_GANONDORF) { - if (INV_CONTENT(ITEM_ARROW_LIGHT) == ITEM_ARROW_LIGHT || !Randomizer_GetSettingValue(RSK_GANONDORF_LIGHT_ARROWS_HINT)) { + if ((INV_CONTENT(ITEM_ARROW_LIGHT) == ITEM_ARROW_LIGHT && CHECK_OWNED_EQUIP(EQUIP_SWORD, 1)) || + !Randomizer_GetSettingValue(RSK_GANONDORF_LIGHT_ARROWS_HINT)) { messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::hintMessageTableID, TEXT_GANONDORF_NOHINT); } else { messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::hintMessageTableID, TEXT_GANONDORF); From 778bf5a0e36b97ec520cbe4795041ab0b8c762eb Mon Sep 17 00:00:00 2001 From: Ralphie Morell Date: Tue, 13 Jun 2023 11:25:50 -0400 Subject: [PATCH 08/28] Apply suggestions --- soh/soh/Enhancements/randomizer/3drando/item_pool.cpp | 3 ++- soh/soh/Enhancements/randomizer/3drando/logic.cpp | 1 - soh/src/code/z_parameter.c | 8 +++----- soh/src/code/z_sram.c | 3 +-- 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index d25f7e15e45..7cf2f9160f3 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -47,7 +47,7 @@ const std::array JunkPoolItems = { DEKU_NUTS_10, ICE_TRAP, }; -const std::array alwaysItems = { +const std::array alwaysItems = { BIGGORON_SWORD, BOOMERANG, LENS_OF_TRUTH, @@ -111,6 +111,7 @@ const std::array alwaysItems = { const std::array easyItems = { BIGGORON_SWORD, KOKIRI_SWORD, + MASTER_SWORD, BOOMERANG, LENS_OF_TRUTH, MEGATON_HAMMER, diff --git a/soh/soh/Enhancements/randomizer/3drando/logic.cpp b/soh/soh/Enhancements/randomizer/3drando/logic.cpp index 006c2dab657..c06bf7ea94a 100644 --- a/soh/soh/Enhancements/randomizer/3drando/logic.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/logic.cpp @@ -514,7 +514,6 @@ namespace Logic { SilverScale = ProgressiveScale >= 1; GoldScale = ProgressiveScale >= 2; AdultsWallet = ProgressiveWallet >= 1; - MasterSword = MasterSword; BiggoronSword = BiggoronSword || ProgressiveGiantKnife >= 2; ScarecrowSong = ScarecrowSong || FreeScarecrow || (ChildScarecrow && AdultScarecrow); diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index 903e1e99e25..e1fe985a6e4 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -1413,18 +1413,16 @@ void Inventory_SwapAgeEquipment(void) { } // When becoming adult, remove swordless flag since we'll get master sword + // (Unless Master Sword is shuffled) // Only in rando to keep swordless link bugs in vanilla - if (gSaveContext.n64ddFlag) { - if (!Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD)) { + if (!gSaveContext.n64ddFlag || !Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD)) { gSaveContext.infTable[29] &= ~1; - } } gSaveContext.childEquips.equipment = gSaveContext.equips.equipment; if (gSaveContext.adultEquips.buttonItems[0] == ITEM_NONE) { - if (gSaveContext.n64ddFlag && Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD)) {;} - else { + if (!gSaveContext.n64ddFlag || !Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD)) { gSaveContext.equips.buttonItems[0] = ITEM_SWORD_MASTER; } diff --git a/soh/src/code/z_sram.c b/soh/src/code/z_sram.c index 124187d8756..57530eb13d7 100644 --- a/soh/src/code/z_sram.c +++ b/soh/src/code/z_sram.c @@ -168,8 +168,7 @@ void Sram_OpenSave() { // check for owning kokiri sword.. to restore master sword? bug or debug feature? if (LINK_AGE_IN_YEARS == YEARS_ADULT && !CHECK_OWNED_EQUIP(EQUIP_SWORD, 1)) { - if (gSaveContext.n64ddFlag && Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD)) {;} - else { + if (!gSaveContext.n64ddFlag || !Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD)) { gSaveContext.inventory.equipment |= gBitFlags[1] << gEquipShifts[EQUIP_SWORD]; gSaveContext.equips.buttonItems[0] = ITEM_SWORD_MASTER; gSaveContext.equips.equipment &= ~0xF; From 5ff88c7d02fa54a7b5b5fb7c77d016b99eb9563c Mon Sep 17 00:00:00 2001 From: Ralphie Morell Date: Tue, 13 Jun 2023 22:33:04 -0400 Subject: [PATCH 09/28] Updated RAND_INF; Check Tracker changes; Gave RAND_INF and ice trap logic to ToT MS check; Fixed swordless behavior for HBA/fishing --- soh/include/z64save.h | 2 +- .../Enhancements/debugger/debugSaveEditor.h | 3 ++- .../randomizer/randomizer_check_objects.cpp | 2 +- .../randomizer/randomizer_check_tracker.cpp | 5 ++++ .../Enhancements/randomizer/randomizer_inf.h | 2 ++ soh/soh/Enhancements/randomizer/savefile.cpp | 1 + soh/src/code/z_parameter.c | 26 +++++++++++++++++-- .../actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c | 8 ++++-- 8 files changed, 42 insertions(+), 7 deletions(-) diff --git a/soh/include/z64save.h b/soh/include/z64save.h index 8002b660717..438aded8894 100644 --- a/soh/include/z64save.h +++ b/soh/include/z64save.h @@ -318,7 +318,7 @@ typedef struct { /* */ RandomizerCheck gregCheck; /* */ RandomizerCheck dampeCheck; /* */ u8 seedIcons[5]; - /* */ u16 randomizerInf[9]; + /* */ u16 randomizerInf[10]; /* */ u16 adultTradeItems; // #endregion } SaveContext; // size = 0x1428 diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.h b/soh/soh/Enhancements/debugger/debugSaveEditor.h index 0128f88018f..25ad4aeafbb 100644 --- a/soh/soh/Enhancements/debugger/debugSaveEditor.h +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.h @@ -348,7 +348,7 @@ const std::vector flagTables = { { 0x24, "Market Crowd Text Randomizer" }, { 0x30, "Entered the Market" }, } }, - { "Randomizer Inf Flags", RANDOMIZER_INF, 0x08, { + { "Randomizer Inf Flags", RANDOMIZER_INF, 0x09, { { RAND_INF_DUNGEONS_DONE_DEKU_TREE, "DUNGEONS_DONE_DEKU_TREE" }, { RAND_INF_DUNGEONS_DONE_DODONGOS_CAVERN, "DUNGEONS_DONE_DODONGOS_CAVERN" }, { RAND_INF_DUNGEONS_DONE_JABU_JABUS_BELLY, "DUNGEONS_DONE_JABU_JABUS_BELLY" }, @@ -500,6 +500,7 @@ const std::vector flagTables = { { RAND_INF_KAK_100_GOLD_SKULLTULA_REWARD, "KAK_100_GOLD_SKULLTULA_REWARD" }, { RAND_INF_GREG_FOUND, "RAND_INF_GREG_FOUND" }, + { RAND_INF_TOT_MASTER_SWORD, "RAND_INF_TOT_MASTER_SWORD"}, } }, }; diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp index dc678c24e94..9eeadb60a60 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp @@ -169,7 +169,7 @@ std::map rcObjects = { RC_OBJECT(RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, RCVORMQ_BOTH, RCTYPE_CHEST_GAME, RCAREA_MARKET, ACTOR_EN_BOX, SCENE_TAKARAYA, 0x00, GI_NONE, "Chest Game Fifth Room Chest", "MK Chest Game Fifth Room Chest"), RC_OBJECT(RC_MARKET_GS_GUARD_HOUSE, RCVORMQ_BOTH, RCTYPE_SKULL_TOKEN, RCAREA_MARKET, ACTOR_EN_SI, SCENE_MIHARIGOYA, -29176, GI_SKULL_TOKEN, "Market GS Guard House", "Market GS Guard House"), RC_OBJECT(RC_TOT_LIGHT_ARROWS_CUTSCENE, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, GI_NONE, "ToT Light Arrow Cutscene", "ToT Light Arrow Cutscene"), - RC_OBJECT(RC_TOT_MASTER_SWORD, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, GI_NONE, "ToT Master Sword,", "ToT Master Sword"), + RC_OBJECT(RC_TOT_MASTER_SWORD, RCVORMQ_BOTH, RCTYPE_STANDARD, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, GI_NONE, "ToT Master Sword", "ToT Master Sword"), RC_OBJECT(RC_SHEIK_AT_TEMPLE, RCVORMQ_BOTH, RCTYPE_SONG_LOCATION, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, GI_NONE, "Sheik at Temple", "Sheik at Temple"), RC_OBJECT(RC_MARKET_BOMBCHU_SHOP_ITEM_1, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_NIGHT_SHOP, 0x00, GI_BOMBCHUS_10, "Bombchu Shop Item 1", "MK Bombchu Shop Item 1"), RC_OBJECT(RC_MARKET_BOMBCHU_SHOP_ITEM_2, RCVORMQ_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_NIGHT_SHOP, 0x01, GI_BOMBCHUS_10, "Bombchu Shop Item 2", "MK Bombchu Shop Item 2"), diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index 3a1e2947c73..c1a5bc774c6 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -364,6 +364,7 @@ bool showMerchants; bool showCows; bool showAdultTrade; bool showKokiriSword; +bool showMasterSword; bool showWeirdEgg; bool showGerudoCard; bool showFrogSongRupees; @@ -403,6 +404,9 @@ void LoadSettings() { showKokiriSword = gSaveContext.n64ddFlag ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_KOKIRI_SWORD) == RO_GENERIC_YES : true; + showMasterSword = gSaveContext.n64ddFlag ? + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_MASTER_SWORD) == RO_GENERIC_YES + : true; showWeirdEgg = gSaveContext.n64ddFlag ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_WEIRD_EGG) == RO_GENERIC_YES : true; @@ -505,6 +509,7 @@ bool IsVisibleInCheckTracker(RandomizerCheckObject rcObj) { rcObj.rc == RC_DMT_TRADE_CLAIM_CHECK // even when shuffle adult trade is off ) && (rcObj.rc != RC_KF_KOKIRI_SWORD_CHEST || showKokiriSword) && + (rcObj.rc != RC_TOT_MASTER_SWORD || showMasterSword) && (rcObj.rc != RC_ZR_MAGIC_BEAN_SALESMAN || showBeans) && (rcObj.rc != RC_HC_MALON_EGG || showWeirdEgg) && (rcObj.rcType != RCTYPE_FROG_SONG || showFrogSongRupees) && diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index 70157d3e128..f295b707bd7 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -154,6 +154,8 @@ typedef enum { RAND_INF_GREG_FOUND, + RAND_INF_TOT_MASTER_SWORD, + // If you add anything to this list, you need to update the size of randomizerInf in z64save.h to be ceil(RAND_INF_MAX / 16) RAND_INF_MAX, diff --git a/soh/soh/Enhancements/randomizer/savefile.cpp b/soh/soh/Enhancements/randomizer/savefile.cpp index 85b4afd9218..403243c316d 100644 --- a/soh/soh/Enhancements/randomizer/savefile.cpp +++ b/soh/soh/Enhancements/randomizer/savefile.cpp @@ -355,6 +355,7 @@ extern "C" void Randomizer_InitSaveFile() { if (Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) && startingAge == RO_AGE_ADULT) { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_TOT_MASTER_SWORD, GI_NONE); StartingItemGive(getItemEntry); + Flags_SetRandomizerInf(RAND_INF_TOT_MASTER_SWORD); } HIGH_SCORE(HS_POE_POINTS) = 1000 - (100 * Randomizer_GetSettingValue(RSK_BIG_POE_COUNT)); diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index e1fe985a6e4..bedeb51946e 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -818,6 +818,8 @@ void func_80083108(PlayState* play) { InterfaceContext* interfaceCtx = &play->interfaceCtx; s16 i; s16 sp28 = 0; + u8 swordlessShuffleFlag = (gSaveContext.n64ddFlag && Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) && + !(CHECK_OWNED_EQUIP(EQUIP_SWORD, 1)) && LINK_IS_ADULT); if ((gSaveContext.cutsceneIndex < 0xFFF0) || ((play->sceneNum == SCENE_SPOT20) && (gSaveContext.cutsceneIndex == 0xFFF0))) { @@ -825,7 +827,7 @@ void func_80083108(PlayState* play) { if ((player->stateFlags1 & 0x00800000) || (play->shootingGalleryStatus > 1) || ((play->sceneNum == SCENE_BOWLING) && Flags_GetSwitch(play, 0x38))) { - if (gSaveContext.equips.buttonItems[0] != ITEM_NONE) { + if (gSaveContext.equips.buttonItems[0] != ITEM_NONE || swordlessShuffleFlag) { gSaveContext.unk_13E7 = 1; if (gSaveContext.buttonStatus[0] == BTN_DISABLED) { @@ -877,6 +879,17 @@ void func_80083108(PlayState* play) { } else if ((play->sceneNum == SCENE_BOWLING) && Flags_GetSwitch(play, 0x38)) { Interface_ChangeAlpha(8); } else if (player->stateFlags1 & 0x00800000) { + if (swordlessShuffleFlag) { + if (INV_CONTENT(SLOT_BOW) == ITEM_BOW) { + gSaveContext.equips.buttonItems[0] = ITEM_BOW; + Interface_LoadItemIcon1(play, 0); + } else { + gSaveContext.equips.buttonItems[0] = ITEM_NONE; + } + gSaveContext.buttonStatus[1] = gSaveContext.buttonStatus[2] = gSaveContext.buttonStatus[3] = BTN_DISABLED; + gSaveContext.buttonStatus[5] = gSaveContext.buttonStatus[6] = gSaveContext.buttonStatus[7] = + gSaveContext.buttonStatus[8] = BTN_DISABLED; + } Interface_ChangeAlpha(12); } } else { @@ -892,6 +905,9 @@ void func_80083108(PlayState* play) { if (play->interfaceCtx.unk_260 != 0) { if (gSaveContext.equips.buttonItems[0] != ITEM_FISHING_POLE) { gSaveContext.buttonStatus[0] = gSaveContext.equips.buttonItems[0]; + if (swordlessShuffleFlag) { + gSaveContext.buttonStatus[0] = BTN_ENABLED; + } gSaveContext.equips.buttonItems[0] = ITEM_FISHING_POLE; gSaveContext.unk_13EA = 0; Interface_LoadItemIcon1(play, 0); @@ -902,6 +918,9 @@ void func_80083108(PlayState* play) { Interface_ChangeAlpha(12); } } else if (gSaveContext.equips.buttonItems[0] == ITEM_FISHING_POLE) { + if (swordlessShuffleFlag) { + gSaveContext.buttonStatus[0] = BTN_DISABLED; + } gSaveContext.equips.buttonItems[0] = gSaveContext.buttonStatus[0]; gSaveContext.unk_13EA = 0; @@ -1050,6 +1069,9 @@ void func_80083108(PlayState* play) { (gSaveContext.equips.buttonItems[0] == ITEM_BOMBCHU) || (gSaveContext.equips.buttonItems[0] == ITEM_NONE)) { if ((gSaveContext.equips.buttonItems[0] != ITEM_NONE) || (gSaveContext.infTable[29] == 0)) { + if (swordlessShuffleFlag) { + gSaveContext.buttonStatus[0] = 255; + } gSaveContext.equips.buttonItems[0] = gSaveContext.buttonStatus[0]; sp28 = 1; @@ -1415,7 +1437,7 @@ void Inventory_SwapAgeEquipment(void) { // When becoming adult, remove swordless flag since we'll get master sword // (Unless Master Sword is shuffled) // Only in rando to keep swordless link bugs in vanilla - if (!gSaveContext.n64ddFlag || !Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD)) { + if (gSaveContext.n64ddFlag && !Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD)) { gSaveContext.infTable[29] &= ~1; } diff --git a/soh/src/overlays/actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c b/soh/src/overlays/actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c index b4b6415a96c..77931b9ca30 100644 --- a/soh/src/overlays/actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c +++ b/soh/src/overlays/actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c @@ -122,7 +122,7 @@ void func_808BAF40(BgTokiSwd* this, PlayState* play) { if (!LINK_IS_ADULT || (gSaveContext.eventChkInf[5] & 0x20 && !gSaveContext.n64ddFlag) || gSaveContext.n64ddFlag) { if (Actor_HasParent(&this->actor, play)) { if (!LINK_IS_ADULT) { - if (Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD)) { + if (Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) && !Flags_GetRandomizerInf(RAND_INF_TOT_MASTER_SWORD)) { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_TOT_MASTER_SWORD, GI_NONE); if (getItemEntry.modIndex == MOD_NONE) { //RANDOTODO: Move this into Item_Give() or some other central location @@ -130,9 +130,13 @@ void func_808BAF40(BgTokiSwd* this, PlayState* play) { gSaveContext.bgsFlag = true; } Item_Give(play, getItemEntry.itemId); - } else if (getItemEntry.modIndex == MOD_RANDOMIZER) { + } else if (getItemEntry.modIndex == MOD_RANDOMIZER && getItemEntry.itemId != RG_ICE_TRAP) { Randomizer_Item_Give(play, getItemEntry); } + if (getItemEntry.itemId == GI_ICE_TRAP || getItemEntry.itemId == RG_ICE_TRAP) { + GameInteractor_ExecuteOnItemReceiveHooks(getItemEntry); + } + Flags_SetRandomizerInf(RAND_INF_TOT_MASTER_SWORD); } else { Item_Give(play, ITEM_SWORD_MASTER); } From b848eb9b83532e3d47fed69184cd48718b906fac Mon Sep 17 00:00:00 2001 From: Ralphie Morell Date: Wed, 14 Jun 2023 17:11:48 -0400 Subject: [PATCH 10/28] ToT MS Check now works in check tracker; Visual bug where box hovers over non-existent MS gone; Fixed RAND_INF check with ToT MS pedestal; Ganon no longer gives free MS --- .../Enhancements/randomizer/randomizer.cpp | 1 + .../randomizer/randomizer_check_tracker.cpp | 1 + soh/src/code/z_parameter.c | 4 ++- .../actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c | 28 ++++++++++--------- .../actors/ovl_Boss_Ganon2/z_boss_ganon2.c | 12 +++++--- .../actors/ovl_player_actor/z_player.c | 9 ++++-- 6 files changed, 34 insertions(+), 21 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 42cfcde7516..5ed0af7ac0a 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -2651,6 +2651,7 @@ std::map rcToRandomizerInf = { { RC_MARKET_BOMBCHU_SHOP_ITEM_6, RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_6 }, { RC_MARKET_BOMBCHU_SHOP_ITEM_7, RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_7 }, { RC_MARKET_BOMBCHU_SHOP_ITEM_8, RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_8 }, + { RC_TOT_MASTER_SWORD, RAND_INF_TOT_MASTER_SWORD }, { RC_GC_MEDIGORON, RAND_INF_MERCHANTS_MEDIGORON }, { RC_KAK_GRANNYS_SHOP, RAND_INF_MERCHANTS_GRANNYS_SHOP }, { RC_WASTELAND_BOMBCHU_SALESMAN, RAND_INF_MERCHANTS_CARPET_SALESMAN }, diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index fd8a6f441e7..89c3dd66d5e 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -736,6 +736,7 @@ bool HasItemBeenCollected(RandomizerCheckObject obj) { case SpoilerCollectionCheckType::SPOILER_CHK_COW: case SpoilerCollectionCheckType::SPOILER_CHK_SCRUB: case SpoilerCollectionCheckType::SPOILER_CHK_RANDOMIZER_INF: + case SpoilerCollectionCheckType::SPOILER_CHK_MASTER_SWORD: return Flags_GetRandomizerInf(OTRGlobals::Instance->gRandomizer->GetRandomizerInfFromCheck(obj.rc)); case SpoilerCollectionCheckType::SPOILER_CHK_EVENT_CHK_INF: return gSaveContext.eventChkInf[flag / 16] & (0x01 << flag % 16); diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index b1a213aa28f..db4a4fb3794 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -1461,7 +1461,9 @@ void Inventory_SwapAgeEquipment(void) { gSaveContext.equips.buttonItems[3] = gSaveContext.inventory.items[SLOT_OCARINA]; gSaveContext.equips.cButtonSlots[1] = SLOT_BOMB; gSaveContext.equips.cButtonSlots[2] = SLOT_OCARINA; - gSaveContext.equips.equipment = 0x1122; + + gSaveContext.equips.equipment = (gSaveContext.n64ddFlag && Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) && + gSaveContext.equips.buttonItems[0] == ITEM_NONE) ? 0x1120 :0x1122; // Set the dpad to nothing gSaveContext.equips.buttonItems[4] = ITEM_NONE; diff --git a/soh/src/overlays/actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c b/soh/src/overlays/actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c index 77931b9ca30..9faeadea039 100644 --- a/soh/src/overlays/actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c +++ b/soh/src/overlays/actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c @@ -122,21 +122,23 @@ void func_808BAF40(BgTokiSwd* this, PlayState* play) { if (!LINK_IS_ADULT || (gSaveContext.eventChkInf[5] & 0x20 && !gSaveContext.n64ddFlag) || gSaveContext.n64ddFlag) { if (Actor_HasParent(&this->actor, play)) { if (!LINK_IS_ADULT) { - if (Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) && !Flags_GetRandomizerInf(RAND_INF_TOT_MASTER_SWORD)) { - GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_TOT_MASTER_SWORD, GI_NONE); - if (getItemEntry.modIndex == MOD_NONE) { - //RANDOTODO: Move this into Item_Give() or some other central location - if (getItemEntry.getItemId == GI_SWORD_BGS) { - gSaveContext.bgsFlag = true; + if (Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD)) { + if (!Flags_GetRandomizerInf(RAND_INF_TOT_MASTER_SWORD)) { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_TOT_MASTER_SWORD, GI_NONE); + if (getItemEntry.modIndex == MOD_NONE) { + //RANDOTODO: Move this into Item_Give() or some other central location + if (getItemEntry.getItemId == GI_SWORD_BGS) { + gSaveContext.bgsFlag = true; + } + Item_Give(play, getItemEntry.itemId); + } else if (getItemEntry.modIndex == MOD_RANDOMIZER && getItemEntry.itemId != RG_ICE_TRAP) { + Randomizer_Item_Give(play, getItemEntry); } - Item_Give(play, getItemEntry.itemId); - } else if (getItemEntry.modIndex == MOD_RANDOMIZER && getItemEntry.itemId != RG_ICE_TRAP) { - Randomizer_Item_Give(play, getItemEntry); - } - if (getItemEntry.itemId == GI_ICE_TRAP || getItemEntry.itemId == RG_ICE_TRAP) { - GameInteractor_ExecuteOnItemReceiveHooks(getItemEntry); + if (getItemEntry.itemId == GI_ICE_TRAP || getItemEntry.itemId == RG_ICE_TRAP) { + GameInteractor_ExecuteOnItemReceiveHooks(getItemEntry); + } + Flags_SetRandomizerInf(RAND_INF_TOT_MASTER_SWORD); } - Flags_SetRandomizerInf(RAND_INF_TOT_MASTER_SWORD); } else { Item_Give(play, ITEM_SWORD_MASTER); } diff --git a/soh/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.c b/soh/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.c index 6d5256b9fb2..5062cd05a52 100644 --- a/soh/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.c +++ b/soh/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.c @@ -153,6 +153,7 @@ void func_808FD27C(PlayState* play, Vec3f* position, Vec3f* velocity, f32 scale) } } +static u8 MSFlag = 0; void BossGanon2_Init(Actor* thisx, PlayState* play) { BossGanon2* this = (BossGanon2*)thisx; s32 pad; @@ -175,6 +176,9 @@ void BossGanon2_Init(Actor* thisx, PlayState* play) { func_808FD5C4(this, play); this->actor.naviEnemyId = 0x3E; this->actor.gravity = 0.0f; + if (gSaveContext.n64ddFlag && Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) && CHECK_OWNED_EQUIP(EQUIP_SWORD, 1)){ + MSFlag = 1; + } } void BossGanon2_Destroy(Actor* thisx, PlayState* play) { @@ -2914,10 +2918,10 @@ void func_80905DA8(BossGanon2* this, PlayState* play) { } effect->velocity.y = 0.0f; } - if ((SQ(player->actor.world.pos.x - effect->position.x) + - SQ(player->actor.world.pos.z - effect->position.z)) < SQ(25.0f)) { - effect->type = 0; - this->csState = 10; + if (((SQ(player->actor.world.pos.x - effect->position.x) + SQ(player->actor.world.pos.z - effect->position.z)) < SQ(25.0f)) && + (!gSaveContext.n64ddFlag || (gSaveContext.n64ddFlag && !Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD)) || MSFlag )) { + effect->type = 0; + this->csState = 10; } } } else if (effect->type == 2) { diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index f8b3f44d383..683fa47a810 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -14911,9 +14911,12 @@ void func_80852648(PlayState* play, Player* this, CsCmdActorAction* arg2) { this->heldItemId = ITEM_NONE; this->modelGroup = this->nextModelGroup = Player_ActionToModelGroup(this, PLAYER_IA_NONE); this->leftHandDLists = D_80125E08; - Inventory_ChangeEquipment(EQUIP_SWORD, 2); - gSaveContext.equips.buttonItems[0] = ITEM_SWORD_MASTER; - Inventory_DeleteEquipment(play, 0); + if (!gSaveContext.n64ddFlag || !Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) || + (Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) && CHECK_OWNED_EQUIP(EQUIP_SWORD, 1) && play->sceneNum == SCENE_GANON_DEMO)) { + Inventory_ChangeEquipment(EQUIP_SWORD, 2); + gSaveContext.equips.buttonItems[0] = ITEM_SWORD_MASTER; + Inventory_DeleteEquipment(play, 0); + } } } From 9a5608638e3badea29b778ef007d5fbb879a1e8e Mon Sep 17 00:00:00 2001 From: Ralphie Morell Date: Thu, 15 Jun 2023 00:14:08 -0400 Subject: [PATCH 11/28] adult equips no longer reset in MS shuffle --- soh/src/code/z_parameter.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index db4a4fb3794..29bc5e6e5f0 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -1445,9 +1445,11 @@ void Inventory_SwapAgeEquipment(void) { gSaveContext.childEquips.equipment = gSaveContext.equips.equipment; - if (gSaveContext.adultEquips.buttonItems[0] == ITEM_NONE) { + if (gSaveContext.adultEquips.buttonItems[0] == ITEM_NONE && !(gSaveContext.n64ddFlag && Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) && gSaveContext.adultEquips.equipment)) { if (!gSaveContext.n64ddFlag || !Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD)) { gSaveContext.equips.buttonItems[0] = ITEM_SWORD_MASTER; + } else { + gSaveContext.equips.buttonItems[0] = ITEM_NONE; } if (gSaveContext.inventory.items[SLOT_NUT] != ITEM_NONE) { From f272589b37187c3ea2fd9ba5c55f633c7fd69f1a Mon Sep 17 00:00:00 2001 From: Ralphie Morell Date: Thu, 15 Jun 2023 17:41:36 -0400 Subject: [PATCH 12/28] Apply (most) locacc review suggestions Co-authored-by: inspectredc <78732756+inspectredc@users.noreply.github.com> --- .../location_access/locacc_fire_temple.cpp | 16 ++++++++-------- .../location_access/locacc_ganons_castle.cpp | 10 +++++----- .../locacc_gerudo_training_grounds.cpp | 10 +++++----- .../location_access/locacc_gerudo_valley.cpp | 2 +- .../location_access/locacc_ice_cavern.cpp | 4 ++-- .../location_access/locacc_lost_woods.cpp | 6 +++--- .../location_access/locacc_spirit_temple.cpp | 2 +- .../location_access/locacc_zoras_domain.cpp | 2 +- 8 files changed, 26 insertions(+), 26 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp index 5d90b82c44a..e5eb3681e96 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp @@ -64,8 +64,8 @@ void AreaTable_Init_FireTemple() { }, { //Exits Entrance(FIRE_TEMPLE_LOOP_TILES, {[]{return true;}}), - Entrance(FIRE_TEMPLE_LOOP_HAMMER_SWITCH, {[]{return Here(FIRE_TEMPLE_LOOP_FLARE_DANCER, []{return (HasExplosives || CanUse(MEGATON_HAMMER) || CanUse(HOOKSHOT)) && (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || - CanUse(SLINGSHOT) || CanUse(BOOMERANG));});}}), + Entrance(FIRE_TEMPLE_LOOP_HAMMER_SWITCH, {[]{return Here(FIRE_TEMPLE_LOOP_FLARE_DANCER, []{return CanUse(MEGATON_HAMMER) || CanUse(HOOKSHOT) || (HasExplosives && (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || + CanUse(SLINGSHOT) || CanUse(BOW) || CanUse(BOOMERANG)));});}}), }); areaTable[FIRE_TEMPLE_LOOP_HAMMER_SWITCH] = Area("Fire Temple Loop Hammer Switch", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, { @@ -277,10 +277,10 @@ void AreaTable_Init_FireTemple() { areaTable[FIRE_TEMPLE_UPPER_FLARE_DANCER] = Area("Fire Temple Upper Flare Dancer", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(FIRE_TEMPLE_LATE_FIRE_MAZE, {[]{return Here(FIRE_TEMPLE_UPPER_FLARE_DANCER, []{return (HasExplosives || CanUse(MEGATON_HAMMER) || CanUse(HOOKSHOT)) && ((CanUse(KOKIRI_SWORD)) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || - CanUse(SLINGSHOT) || CanUse(BOOMERANG));});}}), - Entrance(FIRE_TEMPLE_WEST_CLIMB, {[]{return Here(FIRE_TEMPLE_UPPER_FLARE_DANCER, []{return (HasExplosives || CanUse(MEGATON_HAMMER) || CanUse(HOOKSHOT)) && ((CanUse(KOKIRI_SWORD)) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || - CanUse(SLINGSHOT) || CanUse(BOOMERANG));});}}), + Entrance(FIRE_TEMPLE_LATE_FIRE_MAZE, {[]{return Here(FIRE_TEMPLE_UPPER_FLARE_DANCER, []{return CanUse(MEGATON_HAMMER) || CanUse(HOOKSHOT) || (HasExplosives && ((CanUse(KOKIRI_SWORD)) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || + CanUse(SLINGSHOT) || CanUse(BOW) || CanUse(BOOMERANG)));});}}), + Entrance(FIRE_TEMPLE_WEST_CLIMB, {[]{return Here(FIRE_TEMPLE_UPPER_FLARE_DANCER, []{return CanUse(MEGATON_HAMMER) || CanUse(HOOKSHOT) || (HasExplosives && ((CanUse(KOKIRI_SWORD)) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || + CanUse(SLINGSHOT) || CanUse(BOOMERANG)));});}}), }); areaTable[FIRE_TEMPLE_WEST_CLIMB] = Area("Fire Temple West Climb", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { @@ -333,7 +333,7 @@ void AreaTable_Init_FireTemple() { EventAccess(&FairyPot, {[]{return true;}}), }, { //Locations - LocationAccess(FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, {[]{return IsAdult && (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)) && (HasExplosives || Hammer || Hookshot);}}), + LocationAccess(FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, {[]{return IsAdult && (CanUse(MEGATON_HAMMER) || CanUse(HOOKSHOT) || (HasExplosives && (CanUse(MASTER_SWORD) || CanUse(KOKIRI_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(BOW) || CanUse(SLINGSHOT) || CanUse(BOOMERANG))));}}), LocationAccess(FIRE_TEMPLE_MQ_MAP_CHEST, {[]{return IsAdult && CanUse(MEGATON_HAMMER);}}), }, {}); @@ -356,7 +356,7 @@ void AreaTable_Init_FireTemple() { areaTable[FIRE_TEMPLE_MQ_LOWER_MAZE] = Area("Fire Temple MQ Lower Maze", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, {[]{return CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD);}}), + LocationAccess(FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, {[]{return CanUse(MASTER_SWORD) || CanUse(KOKIRI_SWORD) || CanUse(BIGGORON_SWORD);}}), LocationAccess(FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, {[]{return HasExplosives && (LogicFireMQMazeSideRoom || HasAccessTo(FIRE_TEMPLE_MQ_UPPER_MAZE));}}), //Trick: HasExplosives && (LogicFireMQMazeSideRoom || FIRE_TEMPLE_MQ_UPPER_MAZE.Adult()) }, { diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp index 292bd6ed945..e2b18d2f74d 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp @@ -86,8 +86,8 @@ void AreaTable_Init_GanonsCastle() { areaTable[GANONS_CASTLE_SPIRIT_TRIAL] = Area("Ganon's Castle Spirit Trial", "Ganon's Castle", GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&NutPot, {[]{return NutPot || ((LogicSpiritTrialHookshot || CanUse(HOOKSHOT)) && HasBombchus && Bow && (MirrorShield || (SunlightArrows && CanUse(LIGHT_ARROWS))) && IsAdult);}}), - EventAccess(&SpiritTrialClear, {[]{return CanUse(LIGHT_ARROWS) && (IsAdult && CanUse(MIRROR_SHIELD) || SunlightArrows) && HasBombchus && (LogicSpiritTrialHookshot || CanUse(HOOKSHOT));}}), + EventAccess(&NutPot, {[]{return NutPot || (((LogicSpiritTrialHookshot && CanJumpslash) || CanUse(HOOKSHOT)) && HasBombchus && CanUse(BOW) && (CanUse(MIRROR_SHIELD) || (SunlightArrows && CanUse(LIGHT_ARROWS))));}}), + EventAccess(&SpiritTrialClear, {[]{return CanUse(LIGHT_ARROWS) && (CanUse(MIRROR_SHIELD) || SunlightArrows) && HasBombchus && ((LogicSpiritTrialHookshot && CanJumpslash) || CanUse(HOOKSHOT));}}), }, { //Locations LocationAccess(GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, {[]{return LogicSpiritTrialHookshot || CanUse(HOOKSHOT);}}), @@ -153,7 +153,7 @@ void AreaTable_Init_GanonsCastle() { areaTable[GANONS_CASTLE_MQ_FOREST_TRIAL] = Area("Ganon's Castle MQ Forest Trial", "Ganons Castle", GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&ForestTrialClear, {[]{return IsAdult && CanUse(LIGHT_ARROWS) && (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)) &&CanPlay(SongOfTime);}}), + EventAccess(&ForestTrialClear, {[]{return IsAdult && CanUse(LIGHT_ARROWS) && (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)) && CanPlay(SongOfTime);}}), }, { //Locations LocationAccess(GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, {[]{return (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)) && (CanUse(BOW) || CanUse(SLINGSHOT));}}), @@ -203,11 +203,11 @@ void AreaTable_Init_GanonsCastle() { areaTable[GANONS_CASTLE_MQ_LIGHT_TRIAL] = Area("Ganon's Castle MQ Light Trial", "Ganons Castle", GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&LightTrialClear, {[]{return IsAdult && (CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)) && CanUse(LIGHT_ARROWS) && SmallKeys(GANONS_CASTLE, 3) && (LogicLensCastleMQ || CanUse(LENS_OF_TRUTH)) && (Hookshot || LogicLightTrialMQ);}}), + EventAccess(&LightTrialClear, {[]{return IsAdult && (CanUse(MASTER_SWORD) || CanUse(KOKIRI_SWORD) || CanUse(BIGGORON_SWORD)) && CanUse(LIGHT_ARROWS) && SmallKeys(GANONS_CASTLE, 3) && (LogicLensCastleMQ || CanUse(LENS_OF_TRUTH)) && (Hookshot || LogicLightTrialMQ);}}), //Trick: IsAdult && CanUse(LIGHT_ARROWS) && SmallKeys(GANONS_CASTLE, 3) && (LogicLensCastleMQ || CanUse(LENS_OF_TRUTH)) && (Hookshot || LogicLightTrialMQ) }, { //Locations - LocationAccess(GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, {[]{return (CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)) && CanPlay(ZeldasLullaby);}}), + LocationAccess(GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, {[]{return (CanUse(MASTER_SWORD) || CanUse(KOKIRI_SWORD) || CanUse(BIGGORON_SWORD)) && CanPlay(ZeldasLullaby);}}), }, {}); } } diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_training_grounds.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_training_grounds.cpp index 82b4fab443d..93ffca14534 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_training_grounds.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_training_grounds.cpp @@ -135,10 +135,10 @@ void AreaTable_Init_GerudoTrainingGrounds() { //EventAccess(&WallFairy, {[]{return WallFairy || (IsAdult && CanUse(BOW));}}), }, { //Locations - LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_DINOLFOS_CHEST, {[]{return IsAdult && (CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD));}}), + LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_DINOLFOS_CHEST, {[]{return IsAdult && (CanUse(MASTER_SWORD) || CanUse(KOKIRI_SWORD) || CanUse(BIGGORON_SWORD));}}), }, { //Exits - Entrance(GERUDO_TRAINING_GROUNDS_MQ_UNDERWATER, {[]{return (Bow || (CanUse(LONGSHOT) && HasFireSource)) && CanUse(HOVER_BOOTS) && IsAdult && (CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD));}}), + Entrance(GERUDO_TRAINING_GROUNDS_MQ_UNDERWATER, {[]{return (Bow || (CanUse(LONGSHOT) && HasFireSource)) && CanUse(HOVER_BOOTS) && IsAdult && (CanUse(MASTER_SWORD) || CanUse(KOKIRI_SWORD) || CanUse(BIGGORON_SWORD));}}), }); areaTable[GERUDO_TRAINING_GROUNDS_MQ_UNDERWATER] = Area("Gerudo Training Grounds MQ Underwater", "Gerudo Training Grounds", GERUDO_TRAINING_GROUNDS, NO_DAY_NIGHT_CYCLE, {}, { @@ -160,8 +160,8 @@ void AreaTable_Init_GerudoTrainingGrounds() { EventAccess(&BlueFireAccess, {[]{return BlueFireAccess || HasBottle;}}), }, { //Locations - LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_BEFORE_HEAVY_BLOCK_CHEST, {[]{return IsAdult && (CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD));}}), - LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_HEAVY_BLOCK_CHEST, {[]{return CanUse(SILVER_GAUNTLETS) && (CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD));}}), + LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_BEFORE_HEAVY_BLOCK_CHEST, {[]{return IsAdult && (CanUse(MASTER_SWORD) || CanUse(KOKIRI_SWORD) || CanUse(BIGGORON_SWORD));}}), + LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_HEAVY_BLOCK_CHEST, {[]{return CanUse(SILVER_GAUNTLETS) && (CanUse(MASTER_SWORD) || CanUse(KOKIRI_SWORD) || CanUse(BIGGORON_SWORD));}}), }, { //Exits Entrance(GERUDO_TRAINING_GROUNDS_MQ_BACK_AREAS, {[]{return IsAdult && (LogicLensGtgMQ || CanUse(LENS_OF_TRUTH)) && BlueFire && (CanPlay(SongOfTime) || (LogicGtgFakeWall && IsAdult && CanUse(HOVER_BOOTS)));}}), @@ -171,7 +171,7 @@ void AreaTable_Init_GerudoTrainingGrounds() { areaTable[GERUDO_TRAINING_GROUNDS_MQ_BACK_AREAS] = Area("Gerudo Training Grounds MQ Back Areas", "Gerudo Training Grounds", GERUDO_TRAINING_GROUNDS, NO_DAY_NIGHT_CYCLE, {}, { //Locations LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_EYE_STATUE_CHEST, {[]{return CanUse(BOW);}}), - LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_SECOND_IRON_KNUCKLE_CHEST, {[]{return (CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD));}}), + LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_SECOND_IRON_KNUCKLE_CHEST, {[]{return (CanUse(MASTER_SWORD) || CanUse(KOKIRI_SWORD) || CanUse(BIGGORON_SWORD));}}), LocationAccess(GERUDO_TRAINING_GROUNDS_MQ_FLAME_CIRCLE_CHEST, {[]{return CanUse(HOOKSHOT) || CanUse(BOW) || HasExplosives;}}), }, { //Exits diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp index 31911883399..3cc7278b268 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp @@ -172,7 +172,7 @@ void AreaTable_Init_GerudoValley() { LocationAccess(COLOSSUS_FREESTANDING_POH, {[]{return IsAdult && CanPlantBean(DESERT_COLOSSUS);}}), LocationAccess(COLOSSUS_GS_BEAN_PATCH, {[]{return CanPlantBugs && CanChildAttack;}}), LocationAccess(COLOSSUS_GS_TREE, {[]{return IsAdult && HookshotOrBoomerang && AtNight && CanGetNightTimeGS;}}), - LocationAccess(COLOSSUS_GS_HILL, {[]{return IsAdult && CanAdultAttack && AtNight && (CanPlantBean(DESERT_COLOSSUS) || CanUse(LONGSHOT) || (LogicColossusGS && CanUse(HOOKSHOT))) && CanGetNightTimeGS;}}), + LocationAccess(COLOSSUS_GS_HILL, {[]{return IsAdult && AtNight && ((CanPlantBean(DESERT_COLOSSUS) && CanAdultAttack) || CanUse(LONGSHOT) || (LogicColossusGS && CanUse(HOOKSHOT))) && CanGetNightTimeGS;}}), LocationAccess(COLOSSUS_GOSSIP_STONE, {[]{return true;}}), }, { //Exits diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ice_cavern.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ice_cavern.cpp index 7e8723e1724..3544791920f 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ice_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ice_cavern.cpp @@ -24,7 +24,7 @@ void AreaTable_Init_IceCavern() { areaTable[ICE_CAVERN_BEGINNING] = Area("Ice Cavern Beginning", "Ice Cavern", ICE_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits Entrance(ICE_CAVERN_ENTRYWAY, {[]{return true;}}), - Entrance(ICE_CAVERN_MAIN, {[]{return Here(ICE_CAVERN_BEGINNING, []{return (CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)) || HasExplosives || CanUse(DINS_FIRE);});}}), + Entrance(ICE_CAVERN_MAIN, {[]{return Here(ICE_CAVERN_BEGINNING, []{return (CanUse(MASTER_SWORD) || CanUse(KOKIRI_SWORD) || CanUse(BIGGORON_SWORD)) || HasExplosives || CanUse(DINS_FIRE);});}}), }); areaTable[ICE_CAVERN_MAIN] = Area("Ice Cavern", "Ice Cavern", ICE_CAVERN, NO_DAY_NIGHT_CYCLE, { @@ -53,7 +53,7 @@ void AreaTable_Init_IceCavern() { }, {}, { //Exits Entrance(ICE_CAVERN_ENTRYWAY, {[]{return true;}}), - Entrance(ICE_CAVERN_MQ_MAP_ROOM, {[]{return CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(DINS_FIRE) || (HasExplosives && (CanUse(STICKS) || CanUse(SLINGSHOT) || CanJumpslash));}}), + Entrance(ICE_CAVERN_MQ_MAP_ROOM, {[]{return CanUse(MASTER_SWORD) || CanUse(KOKIRI_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(DINS_FIRE) || (HasExplosives && (CanUse(STICKS) || CanUse(SLINGSHOT) || CanUse(BOW)));}}), Entrance(ICE_CAVERN_MQ_COMPASS_ROOM, {[]{return IsAdult && BlueFire;}}), Entrance(ICE_CAVERN_MQ_IRON_BOOTS_REGION, {[]{return BlueFire;}}), }); diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp index 7ab6f2c4bd2..e4b1eeba3c7 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp @@ -144,7 +144,7 @@ void AreaTable_Init_LostWoods() { //Locations LocationAccess(LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, {[]{return IsChild && CanStunDeku;}}), LocationAccess(LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, {[]{return IsChild && CanStunDeku;}}), - LocationAccess(LW_GS_ABOVE_THEATER, {[]{return IsAdult && CanAdultAttack && AtNight && (CanPlantBean(LW_BEYOND_MIDO) || (LogicLostWoodsGSBean && CanUse(HOOKSHOT) && (CanUse(LONGSHOT) || CanUse(BOW) || CanUse(SLINGSHOT) || HasBombchus || CanUse(DINS_FIRE)))) && CanGetNightTimeGS;}}), + LocationAccess(LW_GS_ABOVE_THEATER, {[]{return IsAdult && AtNight && ((CanPlantBean(LW_BEYOND_MIDO) && CanAdultAttack) || (LogicLostWoodsGSBean && CanUse(HOOKSHOT) && (CanUse(LONGSHOT) || CanUse(BOW) || CanUse(SLINGSHOT) || HasBombchus || CanUse(DINS_FIRE)))) && CanGetNightTimeGS;}}), LocationAccess(LW_GS_BEAN_PATCH_NEAR_THEATER, {[]{return CanPlantBugs && (CanChildAttack || (Scrubsanity.Is(SCRUBSANITY_OFF) && DekuShield));}}), }, { //Exits @@ -185,7 +185,7 @@ void AreaTable_Init_LostWoods() { areaTable[SFM_ENTRYWAY] = Area("SFM Entryway", "Sacred Forest Meadow", SACRED_FOREST_MEADOW, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits Entrance(LW_BEYOND_MIDO, {[]{return true;}}), - Entrance(SACRED_FOREST_MEADOW, {[]{return CanUse(SLINGSHOT) || CanUse(STICKS) || CanUse(KOKIRI_SWORD) || CanUse(DINS_FIRE) || CanUse(MEGATON_HAMMER) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD);}}), + Entrance(SACRED_FOREST_MEADOW, {[]{return IsAdult || CanJumpslash || CanUse(SLINGSHOT) || CanUse(BOW) || CanUse(DINS_FIRE) || CanUse(MEGATON_HAMMER);}}), Entrance(SFM_WOLFOS_GROTTO, {[]{return CanOpenBombGrotto;}}), }); @@ -218,7 +218,7 @@ void AreaTable_Init_LostWoods() { areaTable[SFM_WOLFOS_GROTTO] = Area("SFM Wolfos Grotto", "SFM Wolfos Grotto", NONE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(SFM_WOLFOS_GROTTO_CHEST, {[]{return CanUse(SLINGSHOT) || CanUse(STICKS) || CanUse(KOKIRI_SWORD) || CanUse(DINS_FIRE) || CanUse(MEGATON_HAMMER) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD);}}), + LocationAccess(SFM_WOLFOS_GROTTO_CHEST, {[]{return CanJumpslash || CanUse(SLINGSHOT) || CanUse(BOW) || CanUse(DINS_FIRE) || CanUse(MEGATON_HAMMER);}}), }, { //Exits Entrance(SFM_ENTRYWAY, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp index 83fa871a812..25ee7af793d 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp @@ -46,7 +46,7 @@ void AreaTable_Init_SpiritTemple() { LocationAccess(SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, {[]{return HasProjectile(HasProjectileAge::Both) || ((SmallKeys(SPIRIT_TEMPLE, 3) || (SmallKeys(SPIRIT_TEMPLE, 2) && BombchusInLogic && ShuffleDungeonEntrances.Is(SHUFFLEDUNGEONS_OFF))) && CanUse(SILVER_GAUNTLETS) && HasProjectile(HasProjectileAge::Adult)) || (SmallKeys(SPIRIT_TEMPLE, 5) && IsChild && HasProjectile(HasProjectileAge::Child));}}), LocationAccess(SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, {[]{return HasProjectile(HasProjectileAge::Both) || ((SmallKeys(SPIRIT_TEMPLE, 3) || (SmallKeys(SPIRIT_TEMPLE, 2) && BombchusInLogic && ShuffleDungeonEntrances.Is(SHUFFLEDUNGEONS_OFF))) && CanUse(SILVER_GAUNTLETS) && HasProjectile(HasProjectileAge::Adult)) || (SmallKeys(SPIRIT_TEMPLE, 5) && IsChild && HasProjectile(HasProjectileAge::Child));}}), LocationAccess(SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, {[]{return HasProjectile(HasProjectileAge::Both) || CanUse(DINS_FIRE) || - (CanTakeDamage && ((CanJumpslash) || HasProjectile(HasProjectileAge::Child))) || + (CanTakeDamage && (CanJumpslash || HasProjectile(HasProjectileAge::Child))) || (IsChild && SmallKeys(SPIRIT_TEMPLE, 5) && HasProjectile(HasProjectileAge::Child)) || ((SmallKeys(SPIRIT_TEMPLE, 3) || (SmallKeys(SPIRIT_TEMPLE, 2) && BombchusInLogic && ShuffleDungeonEntrances.Is(SHUFFLEDUNGEONS_OFF))) && CanUse(SILVER_GAUNTLETS) && (HasProjectile(HasProjectileAge::Adult) || (CanTakeDamage && CanJumpslash)));}}), }, { diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp index be484dea848..af9aef74601 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp @@ -95,7 +95,7 @@ void AreaTable_Init_ZorasDomain() { LocationAccess(ZD_CHEST, {[]{return IsChild && CanUse(STICKS);}}), LocationAccess(ZD_KING_ZORA_THAWED, {[]{return KingZoraThawed;}}), LocationAccess(ZD_TRADE_PRESCRIPTION, {[]{return KingZoraThawed && Prescription;}}), - LocationAccess(ZD_GS_FROZEN_WATERFALL, {[]{return IsAdult && AtNight && (HookshotOrBoomerang || CanUse(SLINGSHOT) || Bow || (MagicMeter && (MasterSword || BiggoronSword)) || LogicDomainGS) && CanGetNightTimeGS;}}), + LocationAccess(ZD_GS_FROZEN_WATERFALL, {[]{return IsAdult && AtNight && (HookshotOrBoomerang || CanUse(SLINGSHOT) || Bow || (MagicMeter && (CanUse(MASTER_SWORD) || CanUse(KOKIRI_SWORD) || CanUse(BIGGORON_SWORD))) || LogicDomainGS) && CanGetNightTimeGS;}}), LocationAccess(ZD_GOSSIP_STONE, {[]{return true;}}), }, { //Exits From 1c74cf43d65fa1680cb7a37b0764c0cde7f1b568 Mon Sep 17 00:00:00 2001 From: Ralphie Morell Date: Thu, 15 Jun 2023 20:25:39 -0400 Subject: [PATCH 13/28] Reorganized swordless check for interface to fit edge cases; getting master sword no longer highlights box --- soh/src/code/z_parameter.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index 29bc5e6e5f0..a50824fe182 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -820,8 +820,9 @@ void func_80083108(PlayState* play) { InterfaceContext* interfaceCtx = &play->interfaceCtx; s16 i; s16 sp28 = 0; - u8 swordlessShuffleFlag = (gSaveContext.n64ddFlag && Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) && - !(CHECK_OWNED_EQUIP(EQUIP_SWORD, 1)) && LINK_IS_ADULT); + u8 sDoesNotHaveMS = !(CHECK_OWNED_EQUIP(EQUIP_SWORD, 1)); + u8 sHaveButNotOnB = CHECK_OWNED_EQUIP(EQUIP_SWORD, 1) && (gSaveContext.equips.buttonItems[0] == ITEM_NONE || gSaveContext.buttonStatus[0] < ITEM_SWORD_KOKIRI); + u8 swordlessShuffleFlag = (gSaveContext.n64ddFlag && Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) && (sDoesNotHaveMS || sHaveButNotOnB)); if ((gSaveContext.cutsceneIndex < 0xFFF0) || ((play->sceneNum == SCENE_SPOT20) && (gSaveContext.cutsceneIndex == 0xFFF0))) { @@ -1030,6 +1031,9 @@ void func_80083108(PlayState* play) { (gSaveContext.equips.buttonItems[0] != ITEM_SWORD_MASTER) && (gSaveContext.equips.buttonItems[0] != ITEM_SWORD_BGS) && (gSaveContext.equips.buttonItems[0] != ITEM_SWORD_KNIFE)) { + if (swordlessShuffleFlag) { + gSaveContext.buttonStatus[0] = 255; + } gSaveContext.equips.buttonItems[0] = gSaveContext.buttonStatus[0]; } else { gSaveContext.buttonStatus[0] = gSaveContext.equips.buttonItems[0]; @@ -2612,8 +2616,6 @@ u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { if (item == RG_MASTER_SWORD) { if (!CHECK_OWNED_EQUIP(EQUIP_SWORD, 1)) { gSaveContext.inventory.equipment |= gBitFlags[1] << gEquipShifts[EQUIP_SWORD]; - gSaveContext.equips.equipment &= 0xFFF0; - gSaveContext.equips.equipment |= 0x0002; } return Return_Item_Entry(giEntry, RG_NONE); } From a9f368800085d18b22a6a73c326b932eb41e5b61 Mon Sep 17 00:00:00 2001 From: Ralphie Morell Date: Thu, 6 Jul 2023 22:34:11 -0400 Subject: [PATCH 14/28] Edge case for BGS but no bow --- soh/src/code/z_parameter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index f41aeb4ed53..c1c5f973b75 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -1074,7 +1074,7 @@ void func_80083108(PlayState* play) { (gSaveContext.equips.buttonItems[0] == ITEM_BOMBCHU) || (gSaveContext.equips.buttonItems[0] == ITEM_NONE)) { if ((gSaveContext.equips.buttonItems[0] != ITEM_NONE) || (gSaveContext.infTable[29] == 0)) { - if (swordlessShuffleFlag) { + if (swordlessShuffleFlag && gSaveContext.buttonStatus[0] != ITEM_SWORD_BGS) { gSaveContext.buttonStatus[0] = 255; } gSaveContext.equips.buttonItems[0] = gSaveContext.buttonStatus[0]; From 39274ba8d9926fe5e7f0b86ac959c2bec814a87a Mon Sep 17 00:00:00 2001 From: RaelCappra Date: Wed, 19 Jul 2023 19:28:30 -0300 Subject: [PATCH 15/28] Fix implicit declaration error for GI hooks (#9) --- soh/src/overlays/actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c | 1 + 1 file changed, 1 insertion(+) diff --git a/soh/src/overlays/actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c b/soh/src/overlays/actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c index a4a0a533f5c..4e0036a15a6 100644 --- a/soh/src/overlays/actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c +++ b/soh/src/overlays/actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c @@ -6,6 +6,7 @@ #include "z_bg_toki_swd.h" #include "objects/object_toki_objects/object_toki_objects.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED From bf41e38d1863b025f37db7da6a79ca67a2064344 Mon Sep 17 00:00:00 2001 From: Ralphie Morell Date: Fri, 25 Aug 2023 16:40:13 -0400 Subject: [PATCH 16/28] Adjusted `CanAdultAttack/Damage`; applied logic suggestions --- .../randomizer/3drando/location_access/locacc_deku_tree.cpp | 2 +- .../randomizer/3drando/location_access/locacc_fire_temple.cpp | 2 +- .../3drando/location_access/locacc_gerudo_valley.cpp | 4 ++-- .../randomizer/3drando/location_access/locacc_ice_cavern.cpp | 4 ++-- .../randomizer/3drando/location_access/locacc_lost_woods.cpp | 4 ++-- .../3drando/location_access/locacc_spirit_temple.cpp | 2 +- .../3drando/location_access/locacc_water_temple.cpp | 2 +- .../3drando/location_access/locacc_zoras_domain.cpp | 2 +- soh/soh/Enhancements/randomizer/3drando/logic.cpp | 4 ++-- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_deku_tree.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_deku_tree.cpp index 69599509fc6..2224df4caa3 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_deku_tree.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_deku_tree.cpp @@ -76,7 +76,7 @@ void AreaTable_Init_DekuTree() { }, { //Locations LocationAccess(DEKU_TREE_BASEMENT_CHEST, {[]{return true;}}), - LocationAccess(DEKU_TREE_GS_BASEMENT_GATE, {[]{return CanAdultAttack || CanChildAttack;}}), + LocationAccess(DEKU_TREE_GS_BASEMENT_GATE, {[]{return CanJumpslash || CanUse(SLINGSHOT) || CanUse(BOOMERANG) || HasExplosives || CanUse(BOW) || CanUse(HOOKSHOT) || CanUse(DINS_FIRE);}}), LocationAccess(DEKU_TREE_GS_BASEMENT_VINES, {[]{return CanUseProjectile || CanUse(DINS_FIRE) || (LogicDekuBasementGS && CanJumpslash);}}), }, { //Exits diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp index e5eb3681e96..2275b0b6aca 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp @@ -204,7 +204,7 @@ void AreaTable_Init_FireTemple() { areaTable[FIRE_TEMPLE_SCARECROW_ROOM] = Area("Fire Temple Scarecrow Room", "Fire Temple", FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(FIRE_TEMPLE_GS_SCARECROW_CLIMB, {[]{return CanAdultAttack || CanChildAttack;}}), + LocationAccess(FIRE_TEMPLE_GS_SCARECROW_CLIMB, {[]{return CanJumpslash || CanUse(SLINGSHOT) || CanUse(BOOMERANG) || HasExplosives || CanUse(BOW) || CanUse(HOOKSHOT) || CanUse(DINS_FIRE);}}), }, { //Exits Entrance(FIRE_TEMPLE_BOULDER_MAZE_UPPER, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp index 3cc7278b268..f7b1c95afdc 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp @@ -110,7 +110,7 @@ void AreaTable_Init_GerudoValley() { LocationAccess(GF_SOUTH_F2_CARPENTER, {[]{return CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD);}}), LocationAccess(GF_GERUDO_MEMBERSHIP_CARD, {[]{return CanFinishGerudoFortress;}}), LocationAccess(GF_GS_ARCHERY_RANGE, {[]{return IsAdult && HookshotOrBoomerang && GerudoToken && AtNight && CanGetNightTimeGS;}}), - LocationAccess(GF_GS_TOP_FLOOR, {[]{return IsAdult && AtNight && CanAdultAttack && (GerudoToken || CanUse(BOW) || CanUse(HOOKSHOT) || CanUse(HOVER_BOOTS) || LogicGerudoKitchen || LogicGFJump) && CanGetNightTimeGS;}}), + LocationAccess(GF_GS_TOP_FLOOR, {[]{return IsAdult && AtNight && (CanJumpslash || CanUse(SLINGSHOT) || CanUse(BOOMERANG) || HasExplosives || CanUse(BOW) || CanUse(HOOKSHOT) || CanUse(DINS_FIRE)) && (GerudoToken || CanUse(BOW) || CanUse(HOOKSHOT) || CanUse(HOVER_BOOTS) || LogicGerudoKitchen || LogicGFJump) && CanGetNightTimeGS;}}), }, { //Exits Entrance(GV_FORTRESS_SIDE, {[]{return true;}}), @@ -149,7 +149,7 @@ void AreaTable_Init_GerudoValley() { }, { //Locations LocationAccess(WASTELAND_CHEST, {[]{return HasFireSource;}}), - LocationAccess(WASTELAND_BOMBCHU_SALESMAN, {[]{return AdultsWallet && CanJumpslash;}}), + LocationAccess(WASTELAND_BOMBCHU_SALESMAN, {[]{return AdultsWallet && (CanJumpslash || CanUse(HOVER_BOOTS)) ;}}), LocationAccess(WASTELAND_GS, {[]{return HookshotOrBoomerang;}}), }, { //Exits diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ice_cavern.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ice_cavern.cpp index 3544791920f..551cfc978b2 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ice_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ice_cavern.cpp @@ -34,8 +34,8 @@ void AreaTable_Init_IceCavern() { //Locations LocationAccess(ICE_CAVERN_MAP_CHEST, {[]{return BlueFire && IsAdult;}}), LocationAccess(ICE_CAVERN_COMPASS_CHEST, {[]{return BlueFire;}}), - LocationAccess(ICE_CAVERN_IRON_BOOTS_CHEST, {[]{return BlueFire && (CanJumpslash || CanUse(SLINGSHOT) || CanUse(DINS_FIRE));}}), - LocationAccess(SHEIK_IN_ICE_CAVERN, {[]{return BlueFire && (CanJumpslash || CanUse(SLINGSHOT) || CanUse(DINS_FIRE)) && IsAdult;}}), + LocationAccess(ICE_CAVERN_IRON_BOOTS_CHEST, {[]{return BlueFire && (CanJumpslash || CanUse(SLINGSHOT) || CanUse(BOW) || CanUse(MEGATON_HAMMER) || CanUse(DINS_FIRE));}}), + LocationAccess(SHEIK_IN_ICE_CAVERN, {[]{return BlueFire && (CanJumpslash || CanUse(SLINGSHOT) || CanUse(BOW) || CanUse(MEGATON_HAMMER) || CanUse(DINS_FIRE)) && IsAdult;}}), LocationAccess(ICE_CAVERN_FREESTANDING_POH, {[]{return BlueFire;}}), LocationAccess(ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, {[]{return HookshotOrBoomerang;}}), LocationAccess(ICE_CAVERN_GS_HEART_PIECE_ROOM, {[]{return BlueFire && HookshotOrBoomerang;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp index e4b1eeba3c7..c16468d24a3 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp @@ -34,8 +34,8 @@ void AreaTable_Init_LostWoods() { areaTable[KF_OUTSIDE_DEKU_TREE] = Area("KF Outside Deku Tree", "Kokiri Forest", KOKIRI_FOREST, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || ((IsAdult && (MasterSword || BiggoronSword) && ShuffleDungeonEntrances.Is(SHUFFLEDUNGEONS_OFF)) || KokiriSword || Boomerang);}}), - EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || ((IsAdult && (MasterSword || BiggoronSword) && ShuffleDungeonEntrances.Is(SHUFFLEDUNGEONS_OFF)) || KokiriSword || Slingshot || Sticks || HasExplosives || CanUse(DINS_FIRE));}}), + EventAccess(&DekuBabaSticks, {[]{return DekuBabaSticks || ((IsAdult && (CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(KOKIRI_SWORD)) && !ShuffleEntrances) || (IsChild && (CanUse(KOKIRI_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(MASTER_SWORD) || CanUse(BOOMERANG))));}}), + EventAccess(&DekuBabaNuts, {[]{return DekuBabaNuts || ((IsAdult && (CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD) || CanUse(KOKIRI_SWORD)) && !ShuffleEntrances) || (IsChild && (CanJumpslash || CanUse(SLINGSHOT) || HasExplosives || CanUse(DINS_FIRE))));}}), EventAccess(&ShowedMidoSwordAndShield, {[]{return ShowedMidoSwordAndShield || (IsChild && KokiriSword && DekuShield);}}), }, { //Locations diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp index 25ee7af793d..2aa0c051634 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp @@ -57,7 +57,7 @@ void AreaTable_Init_SpiritTemple() { areaTable[SPIRIT_TEMPLE_EARLY_ADULT] = Area("Early Adult Spirit Temple", "Spirit Temple", SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations LocationAccess(SPIRIT_TEMPLE_COMPASS_CHEST, {[]{return CanUse(HOOKSHOT) && CanPlay(ZeldasLullaby);}}), - LocationAccess(SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, {[]{return (Bow || Hookshot || HasBombchus || (Bombs && LogicSpiritLowerAdultSwitch)) && (HoverBoots || CanJumpslash);}}), + LocationAccess(SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, {[]{return (CanUse(BOW) || CanUse(HOOKSHOT) || CanUse(SLINGSHOT) || CanUse(BOOMERANG) || HasBombchus || (Bombs && IsAdult && LogicSpiritLowerAdultSwitch)) && (CanUse(HOVER_BOOTS) || CanJumpslash);}}), LocationAccess(SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, {[]{return SmallKeys(SPIRIT_TEMPLE, 3);}}), LocationAccess(SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, {[]{return SmallKeys(SPIRIT_TEMPLE, 3);}}), LocationAccess(SPIRIT_TEMPLE_GS_BOULDER_ROOM, {[]{return CanPlay(SongOfTime) && (Bow || Hookshot || HasBombchus || (Bombs && LogicSpiritLowerAdultSwitch));}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_water_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_water_temple.cpp index e5f61751a5e..559b6c20c7b 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_water_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_water_temple.cpp @@ -122,7 +122,7 @@ void AreaTable_Init_WaterTemple() { areaTable[WATER_TEMPLE_SOUTH_LOWER] = Area("Water Temple South Lower", "Water Temple", WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LocationAccess(WATER_TEMPLE_GS_BEHIND_GATE, {[]{return CanUse(HOOKSHOT) || (IsAdult && (CanJumpslash || CanUseProjectile) && CanUse(HOVER_BOOTS));}}), + LocationAccess(WATER_TEMPLE_GS_BEHIND_GATE, {[]{return (CanJumpslash || CanUse(MEGATON_HAMMER)) && (CanUse(HOOKSHOT) || (IsAdult && CanUse(HOVER_BOOTS)));}}), }, { //Exits Entrance(WATER_TEMPLE_LOBBY, {[]{return CanUse(IRON_BOOTS);}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp index af9aef74601..d9c91b876b5 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp @@ -95,7 +95,7 @@ void AreaTable_Init_ZorasDomain() { LocationAccess(ZD_CHEST, {[]{return IsChild && CanUse(STICKS);}}), LocationAccess(ZD_KING_ZORA_THAWED, {[]{return KingZoraThawed;}}), LocationAccess(ZD_TRADE_PRESCRIPTION, {[]{return KingZoraThawed && Prescription;}}), - LocationAccess(ZD_GS_FROZEN_WATERFALL, {[]{return IsAdult && AtNight && (HookshotOrBoomerang || CanUse(SLINGSHOT) || Bow || (MagicMeter && (CanUse(MASTER_SWORD) || CanUse(KOKIRI_SWORD) || CanUse(BIGGORON_SWORD))) || LogicDomainGS) && CanGetNightTimeGS;}}), + LocationAccess(ZD_GS_FROZEN_WATERFALL, {[]{return IsAdult && AtNight && (HookshotOrBoomerang || CanUse(SLINGSHOT) || Bow || (MagicMeter && (CanUse(MASTER_SWORD) || CanUse(KOKIRI_SWORD) || CanUse(BIGGORON_SWORD))) || (LogicDomainGS && CanJumpslash)) && CanGetNightTimeGS;}}), LocationAccess(ZD_GOSSIP_STONE, {[]{return true;}}), }, { //Exits diff --git a/soh/soh/Enhancements/randomizer/3drando/logic.cpp b/soh/soh/Enhancements/randomizer/3drando/logic.cpp index c06bf7ea94a..85444851f2a 100644 --- a/soh/soh/Enhancements/randomizer/3drando/logic.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/logic.cpp @@ -562,8 +562,8 @@ namespace Logic { CanBlastOrSmash = HasExplosives || CanUse(MEGATON_HAMMER); CanChildAttack = IsChild && (Slingshot || Boomerang || Sticks || KokiriSword || HasExplosives || CanUse(DINS_FIRE) || CanUse(MASTER_SWORD) || CanUse(MEGATON_HAMMER) || CanUse(BIGGORON_SWORD)); CanChildDamage = IsChild && (Slingshot || Sticks || KokiriSword || HasExplosives || CanUse(DINS_FIRE) || CanUse(MASTER_SWORD) || CanUse(MEGATON_HAMMER) || CanUse(BIGGORON_SWORD)); - CanAdultAttack = IsAdult && (CanUse(SLINGSHOT) || CanUse(BOOMERANG) || CanUse(STICKS) || CanUse(KOKIRI_SWORD) || HasExplosives || CanUse(DINS_FIRE) || MasterSword || Hammer || BiggoronSword || Hookshot); - CanAdultDamage = IsAdult && (CanUse(SLINGSHOT) || CanUse(STICKS) || CanUse(KOKIRI_SWORD) || HasExplosives || CanUse(DINS_FIRE) || MasterSword || Hammer || BiggoronSword); + CanAdultAttack = IsAdult && (CanUse(BOW) || CanUse(BOOMERANG) || CanUse(STICKS) || CanUse(KOKIRI_SWORD) || HasExplosives || CanUse(DINS_FIRE) || MasterSword || Hammer || BiggoronSword || Hookshot); + CanAdultDamage = IsAdult && (CanUse(BOW) || CanUse(STICKS) || CanUse(KOKIRI_SWORD) || HasExplosives || CanUse(DINS_FIRE) || MasterSword || Hammer || BiggoronSword); CanStunDeku = CanAdultAttack || CanChildAttack || Nuts || HasShield; CanCutShrubs = CanUse(KOKIRI_SWORD) || CanUse(BOOMERANG) || HasExplosives || CanUse(MASTER_SWORD) || CanUse(MEGATON_HAMMER) || CanUse(BIGGORON_SWORD); CanDive = ProgressiveScale >= 1; From 41106672f4be1f66010f60cc2161a834f612c7ad Mon Sep 17 00:00:00 2001 From: Ralphie Morell Date: Sun, 17 Sep 2023 00:34:15 -0400 Subject: [PATCH 17/28] Fixed build errors (hopefully) --- .../randomizer/3drando/item_location.cpp | 2 +- .../randomizer/3drando/settings.cpp | 42 +++++++++---------- .../actors/ovl_player_actor/z_player.c | 2 +- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/item_location.cpp b/soh/soh/Enhancements/randomizer/3drando/item_location.cpp index 5db5fae21ca..394deb94512 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_location.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_location.cpp @@ -754,7 +754,7 @@ void LocationTable_Init() { /*------------------------------- --- CUTSCENES --- -------------------------------*/ - locationTable[TOT_MASTER_SWORD] = ItemLocation::Delayed(RC_TOT_MASTER_SWORD, 0xFF, 0x00, "ToT Master Sword", TOT_MASTER_SWORD, MASTER_SWORD, {}, SpoilerCollectionCheck::MasterSword(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[TOT_MASTER_SWORD] = ItemLocation::Delayed(RC_TOT_MASTER_SWORD, 0xFF, "ToT Master Sword", TOT_MASTER_SWORD, MASTER_SWORD, {}, SpoilerCollectionCheck::MasterSword(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); locationTable[TOT_LIGHT_ARROWS_CUTSCENE] = ItemLocation::Delayed(RC_TOT_LIGHT_ARROWS_CUTSCENE, 0xFF, "ToT Light Arrow Cutscene", TOT_LIGHT_ARROWS_CUTSCENE, LIGHT_ARROWS, {}, SpoilerCollectionCheck::Chest(0x43, 0x1E), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); locationTable[LW_GIFT_FROM_SARIA] = ItemLocation::Delayed(RC_LW_GIFT_FROM_SARIA, 0xFF, "LW Gift From Saria", LW_GIFT_FROM_SARIA, PROGRESSIVE_OCARINA, {}, SpoilerCollectionCheck::EventChkInf(0xC1), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); locationTable[ZF_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(RC_ZF_GREAT_FAIRY_REWARD, 0xFF, "ZF Great Fairy Reward", ZF_GREAT_FAIRY_REWARD, FARORES_WIND, {}, SpoilerCollectionCheck::Chest(0x3D, 0x01), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); diff --git a/soh/soh/Enhancements/randomizer/3drando/settings.cpp b/soh/soh/Enhancements/randomizer/3drando/settings.cpp index bb3a49b739e..1c5dde2a41a 100644 --- a/soh/soh/Enhancements/randomizer/3drando/settings.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/settings.cpp @@ -170,27 +170,27 @@ namespace Settings { }; //Shuffle Settings - Option RandomizeShuffle = Option::Bool("Randomize Settings", {"No","Yes"}, OptionCategory::Toggle); - Option ShuffleRewards = Option::U8 ("Shuffle Dungeon Rewards",{"End of dungeons", "Any dungeon", "Overworld", "Anywhere"}); - Option LinksPocketItem = Option::U8 ("Link's Pocket", {"Dungeon Reward", "Advancement", "Anything", "Nothing"}); - Option ShuffleSongs = Option::U8 ("Shuffle Songs", {"Song locations", "Dungeon rewards", "Anywhere"}); - Option Shopsanity = Option::U8 ("Shopsanity", {"Off","0 Items","1 Item","2 Items","3 Items","4 Items","Random"}); - Option ShopsanityPrices = Option::U8 ("Shopsanity Prices", {"Balanced", "Starting Wallet", "Adult Wallet", "Giant's Wallet", "Tycoon's Wallet" }); - Option ShopsanityPricesAffordable = Option::Bool("Affordable Prices", {"Off", "On"}); - Option Tokensanity = Option::U8 ("Tokensanity", {"Off", "Dungeons", "Overworld", "All Tokens"}); - Option Scrubsanity = Option::U8 ("Scrub Shuffle", {"Off", "Affordable", "Expensive", "Random Prices"}); - Option ShuffleCows = Option::Bool("Shuffle Cows", {"Off", "On"}); - Option ShuffleKokiriSword = Option::Bool("Shuffle Kokiri Sword", {"Off", "On"}); - Option ShuffleMasterSword = Option::Bool("Shuffle Master Sword", {"Off", "On"}}; - Option ShuffleOcarinas = Option::Bool("Shuffle Ocarinas", {"Off", "On"}); - Option ShuffleWeirdEgg = Option::Bool("Shuffle Weird Egg", {"Off", "On"}); - Option ShuffleGerudoToken = Option::Bool("Shuffle Gerudo Card", {"Off", "On"}); - Option ShuffleMagicBeans = Option::Bool("Shuffle Magic Beans", {"Off", "On"}); - Option ShuffleMerchants = Option::U8 ("Shuffle Merchants", {"Off", "On (No Hints)", "On (With Hints)"}); - Option ShuffleFrogSongRupees = Option::Bool("Shuffle Frog Song Rupees",{"Off", "On"}); - Option ShuffleAdultTradeQuest = Option::Bool("Shuffle Adult Trade", {"Off", "On"}); - Option ShuffleChestMinigame = Option::U8 ("Shuffle Chest Minigame", {"Off", "On (Separate)", "On (Pack)"}); - Option Shuffle100GSReward = Option::Bool("Shuffle 100 GS Reward", {"Off", "On"}); + Option RandomizeShuffle = Option::Bool("Randomize Settings", {"No","Yes"}, OptionCategory::Toggle); + Option ShuffleRewards = Option::U8 ("Shuffle Dungeon Rewards",{"End of dungeons", "Any dungeon", "Overworld", "Anywhere"}); + Option LinksPocketItem = Option::U8 ("Link's Pocket", {"Dungeon Reward", "Advancement", "Anything", "Nothing"}); + Option ShuffleSongs = Option::U8 ("Shuffle Songs", {"Song locations", "Dungeon rewards", "Anywhere"}); + Option Shopsanity = Option::U8 ("Shopsanity", {"Off","0 Items","1 Item","2 Items","3 Items","4 Items","Random"}); + Option ShopsanityPrices = Option::U8 ("Shopsanity Prices", {"Balanced", "Starting Wallet", "Adult Wallet", "Giant's Wallet", "Tycoon's Wallet" }); + Option ShopsanityPricesAffordable = Option::Bool("Affordable Prices", {"Off", "On"}); + Option Tokensanity = Option::U8 ("Tokensanity", {"Off", "Dungeons", "Overworld", "All Tokens"}); + Option Scrubsanity = Option::U8 ("Scrub Shuffle", {"Off", "Affordable", "Expensive", "Random Prices"}); + Option ShuffleCows = Option::Bool("Shuffle Cows", {"Off", "On"}); + Option ShuffleKokiriSword = Option::Bool("Shuffle Kokiri Sword", {"Off", "On"}); + Option ShuffleMasterSword = Option::Bool("Shuffle Master Sword", {"Off", "On"}); + Option ShuffleOcarinas = Option::Bool("Shuffle Ocarinas", {"Off", "On"}); + Option ShuffleWeirdEgg = Option::Bool("Shuffle Weird Egg", {"Off", "On"}); + Option ShuffleGerudoToken = Option::Bool("Shuffle Gerudo Card", {"Off", "On"}); + Option ShuffleMagicBeans = Option::Bool("Shuffle Magic Beans", {"Off", "On"}); + Option ShuffleMerchants = Option::U8 ("Shuffle Merchants", {"Off", "On (No Hints)", "On (With Hints)"}); + Option ShuffleFrogSongRupees = Option::Bool("Shuffle Frog Song Rupees",{"Off", "On"}); + Option ShuffleAdultTradeQuest = Option::Bool("Shuffle Adult Trade", {"Off", "On"}); + Option ShuffleChestMinigame = Option::U8 ("Shuffle Chest Minigame", {"Off", "On (Separate)", "On (Pack)"}); + Option Shuffle100GSReward = Option::Bool("Shuffle 100 GS Reward", {"Off", "On"}); std::vector