From 582771ab48fbefb2253920a4522f9cbbc633a9cf Mon Sep 17 00:00:00 2001 From: Ralphie Morell Date: Wed, 18 Oct 2023 01:30:49 -0400 Subject: [PATCH 001/230] insert witty commit message here --- soh/soh/Enhancements/mods.cpp | 49 +++++++++ .../Enhancements/randomizer/3drando/fill.cpp | 3 +- .../3drando/hint_list/hint_list_item.cpp | 101 ++++++++++++++++++ .../randomizer/3drando/item_list.cpp | 11 ++ .../randomizer/3drando/item_pool.cpp | 13 +++ .../Enhancements/randomizer/3drando/keys.hpp | 11 ++ .../location_access/locacc_deku_tree.cpp | 4 +- .../locacc_dodongos_cavern.cpp | 4 +- .../location_access/locacc_fire_temple.cpp | 2 +- .../location_access/locacc_forest_temple.cpp | 4 +- .../locacc_jabujabus_belly.cpp | 2 +- .../location_access/locacc_shadow_temple.cpp | 4 +- .../location_access/locacc_spirit_temple.cpp | 4 +- .../location_access/locacc_water_temple.cpp | 6 +- .../Enhancements/randomizer/3drando/logic.cpp | 47 ++++++++ .../Enhancements/randomizer/3drando/logic.hpp | 10 ++ .../randomizer/3drando/settings.cpp | 3 + .../randomizer/3drando/settings.hpp | 8 ++ .../Enhancements/randomizer/3drando/shops.cpp | 38 ++++++- soh/soh/Enhancements/randomizer/draw.cpp | 27 +++++ .../Enhancements/randomizer/randomizer.cpp | 44 +++++++- .../Enhancements/randomizer/randomizerTypes.h | 16 +++ .../Enhancements/randomizer/randomizer_inf.h | 10 ++ soh/src/code/z_parameter.c | 7 ++ .../overlays/actors/ovl_Boss_Va/z_boss_va.c | 4 + 25 files changed, 413 insertions(+), 19 deletions(-) diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index 73d6c4634..7424b8b86 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -1015,6 +1015,54 @@ void RegisterRandomizerSheikSpawn() { }); } +//Boss souls require an additional item (represented by a RAND_INF) to spawn a boss in a particular lair +void RegisterBossSouls() { + GameInteractor::Instance->RegisterGameHook([](void* actor) { + if (!gPlayState) return; + if (!IS_RANDO || !(OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_BOSS_SOULS))) return; + RandomizerInf rand_inf = RAND_INF_MAX; + Actor* actual = (Actor*)actor; + switch (gPlayState->sceneNum){ + case SCENE_DEKU_TREE_BOSS: + rand_inf = RAND_INF_GOHMA_SOUL; + break; + case SCENE_DODONGOS_CAVERN_BOSS: + rand_inf = RAND_INF_KING_DODONGO_SOUL; + break; + case SCENE_JABU_JABU_BOSS: + rand_inf = RAND_INF_BARINADE_SOUL; + break; + case SCENE_FOREST_TEMPLE_BOSS: + rand_inf = RAND_INF_PHANTOM_GANON_SOUL; + break; + case SCENE_FIRE_TEMPLE_BOSS: + rand_inf = RAND_INF_VOLVAGIA_SOUL; + break; + case SCENE_WATER_TEMPLE_BOSS: + rand_inf = RAND_INF_MORPHA_SOUL; + break; + case SCENE_SHADOW_TEMPLE_BOSS: + rand_inf = RAND_INF_BONGO_BONGO_SOUL; + break; + case SCENE_SPIRIT_TEMPLE_BOSS: + rand_inf = RAND_INF_TWINROVA_SOUL; + break; + case SCENE_GANONDORF_BOSS: + rand_inf = RAND_INF_GANON_SOUL; + break; + case SCENE_GANON_BOSS: + rand_inf = RAND_INF_GANON_SOUL; + break; + default: break; + } + + if (!Flags_GetRandomizerInf(rand_inf) && actual->category == ACTORCAT_BOSS) { + Actor_Delete(&gPlayState->actorCtx, actual, gPlayState); + } + }); + +} + void InitMods() { RegisterTTS(); RegisterInfiniteMoney(); @@ -1041,5 +1089,6 @@ void InitMods() { RegisterEnemyDefeatCounts(); RegisterAltTrapTypes(); RegisterRandomizerSheikSpawn(); + RegisterBossSouls(); NameTag_RegisterHooks(); } diff --git a/soh/soh/Enhancements/randomizer/3drando/fill.cpp b/soh/soh/Enhancements/randomizer/3drando/fill.cpp index f9d3a9592..a1f11049c 100644 --- a/soh/soh/Enhancements/randomizer/3drando/fill.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/fill.cpp @@ -716,7 +716,8 @@ static void RandomizeDungeonRewards() { } for (size_t i = 0; i < dungeonRewardLocations.size(); i++) { - const auto index = Location(dungeonRewardLocations[i])->GetPlacedItem().GetItemID() - baseOffset; + const auto itemID = Location(dungeonRewardLocations[i])->GetPlacedItem().GetItemID(); + const auto index = itemID - baseOffset; rDungeonRewardOverrides[i] = index; //set the player's dungeon reward on file creation instead of pushing it to them at the start. diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp index 9b9913c8c..f2b836bf5 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp @@ -1939,6 +1939,107 @@ void HintTable_Init_Item() { Text{"a Piece of the Triforce", /*french*/"un fragment de la Triforce", /*spanish*/"un fragmento de la Trifuerza"} ); + hintTable[GOHMA_BOSS_SOUL] = HintText::Item({ + //obscure text + Text{"a regal soul", "", ""}, + Text("some spider essence", "", ""), + }, { + //ambiguous text + Text("something webbed", "", "") + }, { + //clear text + Text("the soul of Gohma", "", "")} + ); + + hintTable[KING_DODONGO_BOSS_SOUL] = HintText::Item({ + //obscure text + Text{"a royal soul", "", ""}, + Text("some reptile essence", "", ""), + }, { + //ambiguous text + Text("something spectral", "", "") + }, { + //clear text + Text("the soul of King Dodongo", "", "") + }); + hintTable[BARINADE_BOSS_SOUL] = HintText::Item({ + //obscure text + Text{"an infectuous soul", "", ""}, + Text("some parasitic essence", "", ""), + }, { + //ambiguous text + Text("something fishy", "", "") + }, { + //clear text + Text("the soul of Barinade", "", "") + }); + hintTable[PHANTOM_GANON_BOSS_SOUL] = HintText::Item({ + //obscure text + Text{"a duplicate soul", "", ""}, + Text("some illusionary essence", "", ""), + }, { + //ambiguous text + Text("something spectral", "", "") + }, { + //clear text + Text("the soul of Phantom Ganon", "", "") + }); +hintTable[VOLVAGIA_BOSS_SOUL] = HintText::Item({ + //obscure text + Text{"a draconic soul", "", ""}, + Text("some magmatic essence", "", ""), + }, { + //ambiguous text + Text("something hot", "", "") + }, { + //clear text + Text("the soul of Volvagia", "", "") + }); +hintTable[MORPHA_BOSS_SOUL] = HintText::Item({ + //obscure text + Text{"an aquatic soul", "", ""}, + Text("some liquid essence", "", ""), + }, { + //ambiguous text + Text("something wet", "", "") + }, { + //clear text + Text("the soul of Barinade", "", "") + }); +hintTable[BONGO_BONGO_BOSS_SOUL] = HintText::Item({ + //obscure text + Text{"a shadowy soul", "", ""}, + Text("some handy essence", "", ""), + }, { + //ambiguous text + Text("something dark", "", "") + }, { + //clear text + Text("the soul of Bongo Bongo", "", "") + }); +hintTable[TWINROVA_BOSS_SOUL] = HintText::Item({ + //obscure text + Text{"old souls", "", ""}, + Text("twin essences", "", ""), + }, { + //ambiguous text + Text("something spiritual", "", "") + }, { + //clear text + Text("the soul of Twinrova", "", "") + }); +hintTable[GANON_BOSS_SOUL] = HintText::Item({ + //obscure text + Text{"an evil soul", "", ""}, + Text("some powerful essence", "", ""), + }, { + //ambiguous text + Text("something strong", "", "") + }, { + //clear text + Text("the soul of Ganon", "", "") + }); + hintTable[EPONA] = HintText::Item({ //obscure text Text{"a horse", /*french*/"un fidèle destrier", /*spanish*/"una yegua"}, diff --git a/soh/soh/Enhancements/randomizer/3drando/item_list.cpp b/soh/soh/Enhancements/randomizer/3drando/item_list.cpp index 417203a5b..4b3cdab07 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_list.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_list.cpp @@ -246,6 +246,17 @@ void ItemTable_Init() { // RandomizerGet itemTable[TRIFORCE] = Item(RG_TRIFORCE, Text{"Triforce", "Triforce", "Trifuerza"}, ITEMTYPE_EVENT, GI_RUPEE_RED_LOSE, false, &noVariable, NONE); itemTable[HINT] = Item(RG_HINT, Text{"Hint", "Indice", "Pista"}, ITEMTYPE_EVENT, GI_RUPEE_BLUE_LOSE, false, &noVariable, NONE); + //Boss Souls + itemTable[GOHMA_BOSS_SOUL] = Item(RG_GOHMA_SOUL, Text{"Gohma's Soul", "Ame de Gohma", "Alma de Gohma"}, ITEMTYPE_ITEM, 0xE1, true, &CanSummonGohma, NONE); + itemTable[KING_DODONGO_BOSS_SOUL] = Item(RG_KING_DODONGO_SOUL, Text{"King Dodongo's Soul", "Ame de ", "Alma de "}, ITEMTYPE_ITEM, 0xE2, true, &CanSummonKingDodongo, NONE); + itemTable[BARINADE_BOSS_SOUL] = Item(RG_BARINADE_SOUL, Text{"Barinade's Soul", "Ame de ", "Alma de "}, ITEMTYPE_ITEM, 0xE3, true, &CanSummonBarinade, NONE); + itemTable[PHANTOM_GANON_BOSS_SOUL] = Item(RG_GOHMA_SOUL, Text{"Phantom Ganon's Soul", "Ame de ", "Alma de "}, ITEMTYPE_ITEM, 0xE4, true, &CanSummonPhantomGanon, NONE); + itemTable[VOLVAGIA_BOSS_SOUL] = Item(RG_GOHMA_SOUL, Text{"Volvagia's Soul", "Ame de ", "Alma de "}, ITEMTYPE_ITEM, 0xE5, true, &CanSummonVolvagia, NONE); + itemTable[MORPHA_BOSS_SOUL] = Item(RG_GOHMA_SOUL, Text{"Morpha's Soul", "Ame de ", "Alma de "}, ITEMTYPE_ITEM, 0xE6, true, &CanSummonMorpha, NONE); + itemTable[BONGO_BONGO_BOSS_SOUL] = Item(RG_GOHMA_SOUL, Text{"Bongo Bongo's Soul", "Ame de ", "Alma de "}, ITEMTYPE_ITEM, 0xE7, true, &CanSummonBongoBongo, NONE); + itemTable[TWINROVA_BOSS_SOUL] = Item(RG_GOHMA_SOUL, Text{"Twinrova's Soul", "Ame de ", "Alma de "}, ITEMTYPE_ITEM, 0xE8, true, &CanSummonTwinrova, NONE); + itemTable[GANON_BOSS_SOUL] = Item(RG_GOHMA_SOUL, Text{"Ganon's Soul", "Ame de ", "Alma de "}, ITEMTYPE_ITEM, 0xE9, true, &CanSummonGanon, NONE); + // itemTable[HOOKSHOT] = Item(RG_HOOKSHOT, Text{"Hookshot", "Grappin", "Gancho"}, ITEMTYPE_ITEM, 0x80, true, &ProgressiveHookshot, HOOKSHOT); // itemTable[LONGSHOT] = Item(RG_LONGSHOT, Text{"Longshot", "Super-Grappin", "Supergancho"}, ITEMTYPE_ITEM, 0x80, true, &ProgressiveHookshot, LONGSHOT); // itemTable[FAIRY_OCARINA] = Item(RG_FAIRY_OCARINA, Text{"Fairy Ocarina", "Ocarina des fées", "Ocarina de las Hadas"}, ITEMTYPE_ITEM, 0x8B, true, &ProgressiveOcarina, FAIRY_OCARINA); diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index 485fc4154..22cc5d759 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -816,6 +816,19 @@ void GenerateItemPool() { PlaceItemInLocation(KAK_100_GOLD_SKULLTULA_REWARD, HUGE_RUPEE, false, true); } + if (ShuffleBossSouls.IsNot(BOSSSOULS_OFF)) { + AddItemToMainPool(GOHMA_BOSS_SOUL); + AddItemToMainPool(KING_DODONGO_BOSS_SOUL); + AddItemToMainPool(BARINADE_BOSS_SOUL); + AddItemToMainPool(PHANTOM_GANON_BOSS_SOUL); + AddItemToMainPool(VOLVAGIA_BOSS_SOUL); + AddItemToMainPool(BONGO_BONGO_BOSS_SOUL); + AddItemToMainPool(TWINROVA_BOSS_SOUL); + if (ShuffleBossSouls.Is(BOSSSOULS_ON_PLUS_GANON)) { + AddItemToMainPool(GANON_BOSS_SOUL); + } + } + if (BombchusInLogic) { AddItemToMainPool(PROGRESSIVE_BOMBCHUS, 5); } else { diff --git a/soh/soh/Enhancements/randomizer/3drando/keys.hpp b/soh/soh/Enhancements/randomizer/3drando/keys.hpp index 6e9e87f4e..764aae54a 100644 --- a/soh/soh/Enhancements/randomizer/3drando/keys.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/keys.hpp @@ -203,6 +203,17 @@ typedef enum { TRIFORCE, TRIFORCE_PIECE, TRIFORCE_COMPLETED, + + GOHMA_BOSS_SOUL, + KING_DODONGO_BOSS_SOUL, + BARINADE_BOSS_SOUL, + PHANTOM_GANON_BOSS_SOUL, + VOLVAGIA_BOSS_SOUL, + MORPHA_BOSS_SOUL, + BONGO_BONGO_BOSS_SOUL, + TWINROVA_BOSS_SOUL, + GANON_BOSS_SOUL, + EPONA, HINT, diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_deku_tree.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_deku_tree.cpp index c39676a82..8a4b35772 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 @@ -253,9 +253,9 @@ void AreaTable_Init_DekuTree() { { // Events EventAccess(&DekuTreeClear, { [] { - return DekuTreeClear || + return DekuTreeClear || (CanSummonGohma && (CanJumpslash && (Nuts || CanUse(SLINGSHOT) || CanUse(BOW) || - HookshotOrBoomerang)); + HookshotOrBoomerang))); }}), }, { diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_dodongos_cavern.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_dodongos_cavern.cpp index 133cdc340..784514188 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 @@ -290,10 +290,10 @@ void AreaTable_Init_DodongosCavern() { // Events EventAccess(&DodongosCavernClear, { [] { - return DodongosCavernClear || + return DodongosCavernClear || (CanSummonKingDodongo && (Here(DODONGOS_CAVERN_BOSS_ROOM, [] { return HasExplosives || (CanUse(MEGATON_HAMMER) && LogicDCHammerFloor); }) && - (Bombs || GoronBracelet) && CanJumpslash); /*todo add chu kill to tricks*/ + (Bombs || GoronBracelet) && CanJumpslash)); /*todo add chu kill to tricks*/ }}), }, { diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp index 887766fe5..31c59094d 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 @@ -407,7 +407,7 @@ void AreaTable_Init_FireTemple() { { // Events EventAccess(&FireTempleClear, - { [] { return FireTempleClear || (FireTimer >= 64 && CanUse(MEGATON_HAMMER)); }}), + { [] { return FireTempleClear || (CanSummonVolvagia && (FireTimer >= 64 && CanUse(MEGATON_HAMMER))); }}), }, { // Locations diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_forest_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_forest_temple.cpp index d4e95e15c..dc675849b 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 @@ -421,8 +421,8 @@ void AreaTable_Init_ForestTemple() { { // Events EventAccess(&ForestTempleClear, { [] { - return ForestTempleClear || ((CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)) && - (CanUse(HOOKSHOT) || CanUse(BOW) || CanUse(SLINGSHOT))); + return ForestTempleClear || (CanSummonPhantomGanon && ((CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)) && + (CanUse(HOOKSHOT) || CanUse(BOW) || CanUse(SLINGSHOT)))); } }), }, { diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_jabujabus_belly.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_jabujabus_belly.cpp index d7b48d7f1..0a14e9257 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 @@ -235,7 +235,7 @@ void AreaTable_Init_JabuJabusBelly() { { // Events //todo: add pot kill trick EventAccess(&JabuJabusBellyClear, - { [] { return JabuJabusBellyClear || (CanUse(BOOMERANG) && CanJumpslash); } }), + { [] { return JabuJabusBellyClear || (CanSummonBarinade && (CanUse(BOOMERANG) && CanJumpslash)); } }), }, { // Locations diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp index 5296a6398..4b3786ec1 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 @@ -194,10 +194,10 @@ void AreaTable_Init_ShadowTemple() { { // Events EventAccess(&ShadowTempleClear, { [] { - return ShadowTempleClear || + return ShadowTempleClear || (CanSummonBongoBongo && ((CanUse(LENS_OF_TRUTH) || LogicLensBongo) && (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)) && - (CanUse(HOOKSHOT) || CanUse(BOW) || CanUse(SLINGSHOT) || LogicShadowBongo)); + (CanUse(HOOKSHOT) || CanUse(BOW) || CanUse(SLINGSHOT) || LogicShadowBongo))); } }), }, { diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp index ec01cdbfd..c44ece42d 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 @@ -259,8 +259,8 @@ void AreaTable_Init_SpiritTemple() { { // Events EventAccess(&SpiritTempleClear, { [] { - return SpiritTempleClear || (CanUse(MIRROR_SHIELD) && - (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD))); + return SpiritTempleClear || (CanSummonTwinrova && (CanUse(MIRROR_SHIELD) && + (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)))); } }), }, { diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_water_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_water_temple.cpp index 79d9dff7c..c8905b78e 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 @@ -318,14 +318,14 @@ void AreaTable_Init_WaterTemple() { { // Events EventAccess(&WaterTempleClear, { [] { - return WaterTempleClear || - (CanUse(HOOKSHOT) && (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD))); + return WaterTempleClear || (CanSummonMorpha && + (CanUse(HOOKSHOT) && (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)))); } }), }, { // Locations LocationAccess(WATER_TEMPLE_MORPHA_HEART, { [] { return WaterTempleClear; } }), - LocationAccess(MORPHA, { [] { return WaterTempleClear; } }), + LocationAccess(MORPHA, { [] { return CanSummonMorpha && WaterTempleClear; } }), }, { // Exits diff --git a/soh/soh/Enhancements/randomizer/3drando/logic.cpp b/soh/soh/Enhancements/randomizer/3drando/logic.cpp index ddf53824e..fe79cae67 100644 --- a/soh/soh/Enhancements/randomizer/3drando/logic.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/logic.cpp @@ -314,6 +314,16 @@ namespace Logic { uint8_t Age = 0; bool CanCompleteTriforce = false; + bool CanSummonGohma = false; + bool CanSummonKingDodongo = false; + bool CanSummonBarinade = false; + bool CanSummonPhantomGanon = false; + bool CanSummonVolvagia = false; + bool CanSummonMorpha = false; + bool CanSummonBongoBongo = false; + bool CanSummonTwinrova = false; + bool CanSummonGanon = false; + //Events bool ShowedMidoSwordAndShield = false; bool CarpenterRescue = false; @@ -464,6 +474,22 @@ namespace Logic { (age == HasProjectileAge::Either && (Slingshot || Boomerang || Hookshot || Bow)); } + bool HasBossSoul(uint32_t itemName) { + if (ShuffleBossSouls.Is(BOSSSOULS_OFF)) { + return true; + } + return (itemName == GOHMA_BOSS_SOUL && CanSummonGohma) || + (itemName == KING_DODONGO_BOSS_SOUL && CanSummonKingDodongo) || + (itemName == BARINADE_BOSS_SOUL && CanSummonBarinade) || + (itemName == PHANTOM_GANON_BOSS_SOUL && CanSummonPhantomGanon) || + (itemName == VOLVAGIA_BOSS_SOUL && CanSummonVolvagia) || + (itemName == MORPHA_BOSS_SOUL && CanSummonMorpha) || + (itemName == BONGO_BONGO_BOSS_SOUL && CanSummonBongoBongo) || + (itemName == TWINROVA_BOSS_SOUL && CanSummonTwinrova) || + (ShuffleBossSouls.Is(BOSSSOULS_ON_PLUS_GANON) && (itemName == GANON_BOSS_SOUL && CanSummonGanon)); + + } + uint8_t GetDifficultyValueFromString(Option& glitchOption) { return 0; } @@ -625,6 +651,16 @@ namespace Logic { (LACSCondition == LACSCONDITION_DUNGEONS && DungeonCount + (Greg && GregInLogic ? 1 : 0) >= LACSDungeonCount.Value()) || (LACSCondition == LACSCONDITION_TOKENS && GoldSkulltulaTokens >= LACSTokenCount.Value()); CanCompleteTriforce = TriforcePieces >= TriforceHuntRequired.Value(); + CanSummonGohma = HasBossSoul(GOHMA_BOSS_SOUL); + CanSummonKingDodongo = HasBossSoul(KING_DODONGO_BOSS_SOUL); + CanSummonBarinade = HasBossSoul(BARINADE_BOSS_SOUL); + CanSummonPhantomGanon = HasBossSoul(PHANTOM_GANON_BOSS_SOUL); + CanSummonVolvagia = HasBossSoul(VOLVAGIA_BOSS_SOUL); + CanSummonMorpha = HasBossSoul(MORPHA_BOSS_SOUL); + CanSummonBongoBongo = HasBossSoul(BONGO_BONGO_BOSS_SOUL); + CanSummonTwinrova = HasBossSoul(TWINROVA_BOSS_SOUL); + CanSummonGanon = HasBossSoul(GANON_BOSS_SOUL); + } bool SmallKeys(Key dungeon, uint8_t requiredAmount) { @@ -880,6 +916,17 @@ namespace Logic { //Triforce Pieces TriforcePieces = 0; + //Boss Souls + CanSummonGohma = false; + CanSummonKingDodongo = false; + CanSummonBarinade = false; + CanSummonPhantomGanon = false; + CanSummonVolvagia = false; + CanSummonMorpha = false; + CanSummonBongoBongo = false; + CanSummonTwinrova = false; + CanSummonGanon = false; + //Drops and Bottle Contents Access DekuNutDrop = false; NutPot = false; diff --git a/soh/soh/Enhancements/randomizer/3drando/logic.hpp b/soh/soh/Enhancements/randomizer/3drando/logic.hpp index 4d24fd3ff..a58338899 100644 --- a/soh/soh/Enhancements/randomizer/3drando/logic.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/logic.hpp @@ -303,6 +303,16 @@ extern bool LinksCow; extern uint8_t Age; extern bool CanCompleteTriforce; +extern bool CanSummonGohma; +extern bool CanSummonKingDodongo; +extern bool CanSummonBarinade; +extern bool CanSummonPhantomGanon; +extern bool CanSummonVolvagia; +extern bool CanSummonMorpha; +extern bool CanSummonBongoBongo; +extern bool CanSummonTwinrova; +extern bool CanSummonGanon; + // Events extern bool ShowedMidoSwordAndShield; extern bool CarpenterRescue; diff --git a/soh/soh/Enhancements/randomizer/3drando/settings.cpp b/soh/soh/Enhancements/randomizer/3drando/settings.cpp index 2cd894ffd..6eb360bb2 100644 --- a/soh/soh/Enhancements/randomizer/3drando/settings.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/settings.cpp @@ -196,6 +196,7 @@ namespace Settings { 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 ShuffleBossSouls = Option::U8 ("Shuffle Boss Souls", {"Off", "On", "On + Ganon"}); std::vector