From 121a09cb7e6592bb644a093492627c22c7ce75c5 Mon Sep 17 00:00:00 2001 From: Phlex Date: Fri, 2 Feb 2024 16:51:03 -0600 Subject: [PATCH 1/6] Update subrepo for various fixes. Update Pamela override. --- Z3DR | 2 +- source/item_location.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Z3DR b/Z3DR index d77f27f..d279ef7 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit d77f27fc28599d01b476c2967cff1bd8deeb587c +Subproject commit d279ef76229c45125be6a473a9f67e7513a09a55 diff --git a/source/item_location.cpp b/source/item_location.cpp index 86f6cc3..25fedae 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -82,7 +82,7 @@ void LocationTable_Init() { locationTable[IKANA_CANYON_GREAT_FAIRY] = ItemLocation::Base (0x26, 0x3B, false, "IC Great Fairy", IKANA_CANYON_GREAT_FAIRY, GREAT_FAIRYS_SWORD, {Category::cIkanaCanyon,Category::cDayOne, Category::cFairyFountain}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_IKANA_CANYON ); locationTable[IKANA_CANYON_POE_HUT_HP] = ItemLocation::Base (0x51, 0x06, false, "IC Poe Hut", IKANA_CANYON_POE_HUT_HP, PIECE_OF_HEART, {Category::cIkanaCanyon, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_IKANA_CANYON ); locationTable[IKANA_CANYON_LEDGE] = ItemLocation::Collectable(0x13, 0x00, false, "IC Ledge", IKANA_CANYON_LEDGE, PIECE_OF_HEART, {Category::cIkanaCanyon, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_IKANA_CANYON ); - locationTable[IKANA_CANYON_PAMELAS_FATHER] = ItemLocation::Base (0x55, 0x87, false, "IC Pamela's Father", IKANA_CANYON_PAMELAS_FATHER, GIBDOS_MASK, {Category::cIkanaCanyon, Category::cVanillaMask,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_IKANA_CANYON ); + locationTable[IKANA_CANYON_PAMELAS_FATHER] = ItemLocation::Base (0x55, 0x7A, false, "IC Pamela's Father", IKANA_CANYON_PAMELAS_FATHER, GIBDOS_MASK, {Category::cIkanaCanyon, Category::cVanillaMask,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_IKANA_CANYON ); locationTable[IKANA_CANYON_SECRET_SHRINE_GROTTO_CHEST] = ItemLocation::Chest (0x07, 0x14, true, "IC Secret Shrine Grotto", IKANA_CANYON_SECRET_SHRINE_GROTTO_CHEST, BOMBCHU_5, {Category::cIkanaCanyon, Category::cGrotto,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_IKANA_CANYON ); locationTable[IKANA_CANYON_SCRUB_TRADE] = ItemLocation::Base (0x13, 0x07, true, "IC Deku Scrub Merchant Trade", IKANA_CANYON_SCRUB_TRADE, HUGE_RUPEE, {Category::cIkanaCanyon, Category::cDekuScrub,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_IKANA_CANYON ); locationTable[IKANA_CANYON_SCRUB_PURCHASE] = ItemLocation::Base (0x13, 0x5D, true, "IC Deku Scrub Merchant Purchase", IKANA_CANYON_SCRUB_PURCHASE, BLUE_POTION_REFILL, {Category::cIkanaCanyon, Category::cDekuScrub,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_IKANA_CANYON ); From d586045970a3cfc2105be88d4746512c752b882a Mon Sep 17 00:00:00 2001 From: Phlex Date: Fri, 2 Feb 2024 22:00:41 -0600 Subject: [PATCH 2/6] Bring in camera fix. --- Z3DR | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Z3DR b/Z3DR index d279ef7..f72b432 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit d279ef76229c45125be6a473a9f67e7513a09a55 +Subproject commit f72b432b8219dc2ca7c7c256934b211ce19921b7 From 18350bc24be390d45064eef7126969301bc55284 Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sat, 3 Feb 2024 15:17:16 -0600 Subject: [PATCH 3/6] Override Updates - Adjust Fill Algorithm so Anju & Kafei Items only get placed on day one accessible locations - Add new item & item location for Gorons Lullaby Intro & adjust logic to require it for the full Lullaby - Fix Poe Hut HP override - Fix Pamela's Father Override - Fix IG Iron Knuckle Override - Add new room for the room between the grave entrance on day 2 and the iron knuckle room and adjust logic to fit requirements - Fix Scene on Inverted Stone Tower chests, also fixes incorrect overrides on Inverted Stone Tower Temple as they were sharing scene and flag values. - Add new logic check, if starting with Song of Healing the Deku Mask and Bomber's Notebook will now fill with junk as they are otherwise unaccessable. - Adjust requirements for Deku Butler Race to require Deku Princess to be returned. - Update Deku Princess requirements to need a bottle. - Add Oath to Order checks to the end of all dungeons as it is obtained after the first dungeon clear. - Adjust Ikana King requirements as only Mirror Shield works not Light Arrows. - Fix Starting Sword so the correct amount of progressive swords is added to the pool depending on which starting sword option is selected, (3 for None, 2 for Kokiri, 1 for Razor, 0 for Gilded) - Fix Starting Shield so the correct amount of Shields is added to the pool depending on which starting shield option is selected. --- source/fill.cpp | 17 +++++++++++++---- source/hint_list.cpp | 3 +++ source/include/keys.hpp | 3 +++ source/include/logic.hpp | 1 + source/item_list.cpp | 1 + source/item_location.cpp | 15 ++++++++------- source/item_pool.cpp | 12 +++++++++--- source/location_access.cpp | 31 ++++++++++++++++++++++++------- source/logic.cpp | 2 ++ source/spoiler_log.cpp | 12 ++++++++++++ source/starting_inventory.cpp | 10 +++++++--- 11 files changed, 83 insertions(+), 24 deletions(-) diff --git a/source/fill.cpp b/source/fill.cpp index 5fcc221..f80eb9d 100644 --- a/source/fill.cpp +++ b/source/fill.cpp @@ -344,9 +344,18 @@ static void FastFill(std::vector items, std::vector locati //Loop until locations are empty, or also end if items are empty and the parameters specify to end then while (!locations.empty() && (!endOnItemsEmpty || !items.empty())) { LocationKey loc = RandomElement(locations, true); + ItemKey item = RandomElement(items, true); + /*if ( (Location(loc)->IsRepeatable() == false) && (ItemTable(item).IsReusable() == true) ){ + //unsuccessfulPlacement = true; + CitraPrint("Attemting to place repeatable item in nonrepeatable spot in FastFill"); + PlacementLog_Msg("\n Attempted to place " + ItemTable(item).GetName().GetEnglish() + " at " + Location(loc)->GetName()); + items.push_back(item); + locations.push_back(loc); + } + else {*/ Location(loc)->SetAsHintable(); - PlaceItemInLocation(loc, RandomElement(items, true)); - + PlaceItemInLocation(loc, item); + if (items.empty() && !endOnItemsEmpty) { items.push_back(GetJunkItem()); } @@ -477,7 +486,7 @@ static void AssumedFill(const std::vector& items, const std::vectorIsRepeatable()) && ItemTable(item).IsReusable() ){ //unsuccessfulPlacement = true; - CitraPrint("Attemting to place things where they shouldnt be"); + CitraPrint("Attemting to place repeatable item in non repeatable spot in AssumedFill"); PlacementLog_Msg("\n Attempted to place " + ItemTable(item).GetName().GetEnglish() + " at " + Location(selectedLocation)->GetName()); itemsToPlace.push_back(item); } @@ -814,7 +823,7 @@ int Fill() { //Place Main Inventory First //So first get all items in the pool + DekuMask, - std::vector mainadvancementItems = FilterAndEraseFromPool(ItemPool, [](const ItemKey i) {return ItemTable(i).IsAdvancement();});//&& ItemTable(i).GetItemType() == ITEMTYPE_ITEM + std::vector mainadvancementItems = FilterAndEraseFromPool(ItemPool, [](const ItemKey i) {return ItemTable(i).IsAdvancement() && ItemTable(i).GetItemType() != ITEMTYPE_QUEST;});//(ItemTable(i).GetItemType() == ITEMTYPE_ITEM || ItemTable(i).GetItemType() == ITEMTYPE_MASK || ItemTable(i).GetItemType() == ITEMTYPE_TRADE || ItemTable(i).GetItemType() == ITEMTYPE_GFAIRY) //Then Place those to expand the amount of checks available AssumedFill(mainadvancementItems, allLocations,true); diff --git a/source/hint_list.cpp b/source/hint_list.cpp index f94def9..7cdf8e8 100644 --- a/source/hint_list.cpp +++ b/source/hint_list.cpp @@ -142,6 +142,7 @@ void HintTable_Init() { //hintTable[INVERTED_SONG_OF_TIME] = HintText::Item({ Text{"slowed time", "slowed time", "slowed time"}}); hintTable[EPONAS_SONG] = HintText::Item({ Text{"a horses song", "a horses song", "a horses song"}}); hintTable[SONATA_OF_AWAKENING] = HintText::Item({ Text{"a royal song", "a royal song", "a royal song"}}); + hintTable[LULLABY_INTRO] = HintText::Item({ Text{"a sleepy melody intro", "a sleepy melody intro", "a sleepy melody intro"}}); hintTable[GORONS_LULLABY] = HintText::Item({ Text{"a sleepy melody", "a sleepy melody", "a sleepy melody"}}); hintTable[NEW_WAVE_BOSSA_NOVA] = HintText::Item({ Text{"a song of newborns", "a song of newborns", "a song of newborns"}}); hintTable[ELEGY_OF_EMPTINESS] = HintText::Item({ Text{"empty shells", "empty shells", "empty shells"}}); @@ -440,6 +441,7 @@ void HintTable_Init() { hintTable[TWIN_ISLANDS_GORON_RACETRACK_GROTTO_CHEST] = HintText::Sometimes({Text{"a hidden cave contains", "", ""}}); hintTable[TWIN_ISLANDS_UNDERWATER_RAMP_CHEST] = HintText::Sometimes({Text{"a spring treasure contains", "", ""}}); hintTable[TWIN_ISLANDS_CAVE_CHEST] = HintText::Sometimes({Text{"a sunken springtime treasure contains", "", ""}}); + hintTable[TWIN_ISLANDS_LULLABY_INTRO] = HintText::Sometimes({Text{"a goron elder teaches", "", ""}}); hintTable[TINGLE_TWIN_ISLANDS_SH] = HintText::Sometimes({Text{"a map maker sells ", "", ""}}); hintTable[TINGLE_TWIN_ISLANDS_RR] = HintText::Sometimes({Text{"a map maker sells", "", ""}}); hintTable[TINGLE_TWIN_ISLANDS_SH_SPRING] = HintText::Sometimes({Text{"a map maker sells", "", ""}}); @@ -795,6 +797,7 @@ void HintTable_Init() { hintTable[IKANA_GRAVEYARD_BATS_ROOM] = HintText::Region({Text{"Ikana Graveyard", "", ""}}); hintTable[IKANA_GRAVEYARD_TABLET_ROOM] = HintText::Region({Text{"Ikana Graveyard", "", ""}}); hintTable[IKANA_GRAVEYARD_BELOW_GRAVE2] = HintText::Region({Text{"Ikana Graveyard", "", ""}}); + hintTable[IKANA_GRAVEYARD_PRE_IRON_KNUCKLE_ROOM] = HintText::Region({Text{"Ikana Graveyard", "", ""}}); hintTable[IKANA_GRAVEYARD_IRON_KNUCKLE_ROOM] = HintText::Region({Text{"Ikana Graveyard", "", ""}}); hintTable[IKANA_GRAVEYARD_BELOW_GRAVE3] = HintText::Region({Text{"Ikana Graveyard", "", ""}}); hintTable[DAMPES_HUT] = HintText::Region({Text{"Ikana Graveyard", "", ""}}); diff --git a/source/include/keys.hpp b/source/include/keys.hpp index 157bbb3..0c971e2 100644 --- a/source/include/keys.hpp +++ b/source/include/keys.hpp @@ -127,6 +127,7 @@ typedef enum { SONG_OF_TIME, SONG_OF_STORMS, SONATA_OF_AWAKENING, + LULLABY_INTRO, GORONS_LULLABY, NEW_WAVE_BOSSA_NOVA, ELEGY_OF_EMPTINESS, @@ -237,6 +238,7 @@ typedef enum { SOUTHERN_SWAMP_MUSIC_STATUE, GIANTS_OATH_TO_ORDER, DEKU_PALACE_IMPRISONED_MONKEY, + TWIN_ISLANDS_LULLABY_INTRO, GORON_VILLAGE_GORON_LULLABY, GBC_BABY_ZORAS, ROMANI_RANCH_ROMANIS_GAME, @@ -813,6 +815,7 @@ typedef enum { IKANA_GRAVEYARD_BATS_ROOM, IKANA_GRAVEYARD_TABLET_ROOM, IKANA_GRAVEYARD_BELOW_GRAVE2, + IKANA_GRAVEYARD_PRE_IRON_KNUCKLE_ROOM, IKANA_GRAVEYARD_IRON_KNUCKLE_ROOM, IKANA_GRAVEYARD_BELOW_GRAVE3, DAMPES_HUT, diff --git a/source/include/logic.hpp b/source/include/logic.hpp index 8965a3a..91e22a7 100644 --- a/source/include/logic.hpp +++ b/source/include/logic.hpp @@ -114,6 +114,7 @@ namespace Logic { extern bool SongOfStorms; extern bool SongOfHealing; extern bool SonataOfAwakening; + extern bool LullabyIntro; extern bool GoronsLullaby; extern bool NewWaveBossaNova; extern bool ElegyOfEmptiness; diff --git a/source/item_list.cpp b/source/item_list.cpp index eed7e25..351aa36 100644 --- a/source/item_list.cpp +++ b/source/item_list.cpp @@ -131,6 +131,7 @@ void ItemTable_Init() { //repeatable denotes that an item in a vanilla playth //itemTable[SONG_OF_TIME] = Item(Text{"Song of Time", "Chant du temps", "Canción del tiempo"}, ITEMTYPE_SONG, 0xC5, true, &SongOfTime, SONG_OF_TIME, false,); itemTable[SONG_OF_STORMS] = Item(true, false, &SongOfStorms, Text{"Song of Storms", "Chant des tempêtes", "Canción de la tormenta"}, SONG_OF_STORMS, (u32)GetItemID::GI_NONE, ITEMTYPE_SONG); itemTable[SONATA_OF_AWAKENING] = Item(true, false, &SonataOfAwakening, Text{"Sonata of Awakening", "Sonate de i'Eveil", "Sonata del Despertar"}, SONATA_OF_AWAKENING, (u32)GetItemID::GI_NONE, ITEMTYPE_SONG ); + itemTable[LULLABY_INTRO] = Item(true, false, &LullabyIntro, Text{"Goron's Lullaby Intro", "Goron's Lullaby Intro", "Goron's Lullaby Intro"}, LULLABY_INTRO, (u32)GetItemID::GI_NONE, ITEMTYPE_SONG ); itemTable[GORONS_LULLABY] = Item(true, false, &GoronsLullaby, Text{"Goron's Lullaby", "Berceuse des Gorons", "Nana Goron"}, GORONS_LULLABY, (u32)GetItemID::GI_NONE, ITEMTYPE_SONG); itemTable[NEW_WAVE_BOSSA_NOVA] = Item(true, false, &NewWaveBossaNova, Text{"New Wave Bossa Nova", "Bossa Nova des Flots", "Nueva Bossanova"}, NEW_WAVE_BOSSA_NOVA, (u32)GetItemID::GI_NONE, ITEMTYPE_SONG ); itemTable[ELEGY_OF_EMPTINESS] = Item(true, false, &ElegyOfEmptiness, Text{"Elegy of Emptiness", "Hymne du Vida", "Elegia al Vacio"}, ELEGY_OF_EMPTINESS, (u32)GetItemID::GI_NONE, ITEMTYPE_SONG ); diff --git a/source/item_location.cpp b/source/item_location.cpp index 25fedae..71fc8e3 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -80,16 +80,16 @@ void LocationTable_Init() { //Ikana Canyon locationTable[IKANA_CANYON_GREAT_FAIRY] = ItemLocation::Base (0x26, 0x3B, false, "IC Great Fairy", IKANA_CANYON_GREAT_FAIRY, GREAT_FAIRYS_SWORD, {Category::cIkanaCanyon,Category::cDayOne, Category::cFairyFountain}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_IKANA_CANYON ); - locationTable[IKANA_CANYON_POE_HUT_HP] = ItemLocation::Base (0x51, 0x06, false, "IC Poe Hut", IKANA_CANYON_POE_HUT_HP, PIECE_OF_HEART, {Category::cIkanaCanyon, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_IKANA_CANYON ); + locationTable[IKANA_CANYON_POE_HUT_HP] = ItemLocation::Base (0x51, 0x0C, false, "IC Poe Hut", IKANA_CANYON_POE_HUT_HP, PIECE_OF_HEART, {Category::cIkanaCanyon, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_IKANA_CANYON ); locationTable[IKANA_CANYON_LEDGE] = ItemLocation::Collectable(0x13, 0x00, false, "IC Ledge", IKANA_CANYON_LEDGE, PIECE_OF_HEART, {Category::cIkanaCanyon, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_IKANA_CANYON ); - locationTable[IKANA_CANYON_PAMELAS_FATHER] = ItemLocation::Base (0x55, 0x7A, false, "IC Pamela's Father", IKANA_CANYON_PAMELAS_FATHER, GIBDOS_MASK, {Category::cIkanaCanyon, Category::cVanillaMask,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_IKANA_CANYON ); + locationTable[IKANA_CANYON_PAMELAS_FATHER] = ItemLocation::Base (0x55, 0x87, false, "IC Pamela's Father", IKANA_CANYON_PAMELAS_FATHER, GIBDOS_MASK, {Category::cIkanaCanyon, Category::cVanillaMask,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_IKANA_CANYON ); locationTable[IKANA_CANYON_SECRET_SHRINE_GROTTO_CHEST] = ItemLocation::Chest (0x07, 0x14, true, "IC Secret Shrine Grotto", IKANA_CANYON_SECRET_SHRINE_GROTTO_CHEST, BOMBCHU_5, {Category::cIkanaCanyon, Category::cGrotto,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_IKANA_CANYON ); locationTable[IKANA_CANYON_SCRUB_TRADE] = ItemLocation::Base (0x13, 0x07, true, "IC Deku Scrub Merchant Trade", IKANA_CANYON_SCRUB_TRADE, HUGE_RUPEE, {Category::cIkanaCanyon, Category::cDekuScrub,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_IKANA_CANYON ); locationTable[IKANA_CANYON_SCRUB_PURCHASE] = ItemLocation::Base (0x13, 0x5D, true, "IC Deku Scrub Merchant Purchase", IKANA_CANYON_SCRUB_PURCHASE, BLUE_POTION_REFILL, {Category::cIkanaCanyon, Category::cDekuScrub,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_IKANA_CANYON ); //Ikana Graveyard locationTable[IKANA_GRAVEYARD_DAMPE_DIGGING] = ItemLocation::Chest (0x30, 0x10, false, "IG Dampe Digging", IKANA_GRAVEYARD_DAMPE_DIGGING, PIECE_OF_HEART, {Category::cIkanaGraveyard, Category::cMinigame,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_IKANA_GRAVEYARD ); - locationTable[IKANA_GRAVEYARD_IRON_KNUCKLE_CHEST] = ItemLocation::Chest (0x0C, 0x04, false, "IG Iron Knuckle Chest", IKANA_GRAVEYARD_IRON_KNUCKLE_CHEST, PIECE_OF_HEART, {Category::cIkanaGraveyard, Category::cVanillaHeartPiece, Category::cChest, Category::cDayTwo}, SpoilerCollectionCheckGroup::GROUP_IKANA_GRAVEYARD ); + locationTable[IKANA_GRAVEYARD_IRON_KNUCKLE_CHEST] = ItemLocation::Chest (0x0C, 0x00, false, "IG Iron Knuckle Chest", IKANA_GRAVEYARD_IRON_KNUCKLE_CHEST, PIECE_OF_HEART, {Category::cIkanaGraveyard, Category::cVanillaHeartPiece, Category::cChest, Category::cDayTwo}, SpoilerCollectionCheckGroup::GROUP_IKANA_GRAVEYARD ); locationTable[IKANA_GRAVEYARD_CAPTAIN_KEETA_CHEST] = ItemLocation::Chest (0x43, 0x00, false, "IG Captain Keeta's Chest", IKANA_GRAVEYARD_CAPTAIN_KEETA_CHEST, CAPTAINS_HAT, {Category::cIkanaGraveyard, Category::cVanillaMask,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_IKANA_GRAVEYARD ); locationTable[IKANA_GRAVEYARD_DAY_ONE_GRAVE_TABLET] = ItemLocation::Base (0x0C, 0x73, false, "IG Day 1 Grave Tablet", IKANA_GRAVEYARD_DAY_ONE_GRAVE_TABLET, SONG_OF_STORMS, {Category::cIkanaGraveyard, Category::cSong,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_IKANA_GRAVEYARD ); locationTable[IKANA_GRAVEYARD_DAY_ONE_GRAVE_BATS] = ItemLocation::Chest (0x0C, 0x03, true, "IG Day 1 Grave Bats", IKANA_GRAVEYARD_DAY_ONE_GRAVE_BATS, PURPLE_RUPEE, {Category::cIkanaGraveyard,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_IKANA_GRAVEYARD ); @@ -198,9 +198,9 @@ void LocationTable_Init() { locationTable[STOCKPOTINN_GUEST_ROOM_CHEST] = ItemLocation::Chest (0x61, 0x00, true, "SPI Guest Room Chest", STOCKPOTINN_GUEST_ROOM_CHEST, SILVER_RUPEE, {Category::cStockPotInn,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_STOCKPOTINN ); //Stone Tower - locationTable[STONE_TOWER_INVERTED_RIGHT_CHEST] = ItemLocation::Chest (0x18, 0x1D, true, "IST Right Chest", STONE_TOWER_INVERTED_RIGHT_CHEST, SILVER_RUPEE, {Category::cStoneTower,Category::cChest,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_STONE_TOWER ); - locationTable[STONE_TOWER_INVERTED_CENTER_CHEST] = ItemLocation::Chest (0x18, 0x1E, true, "IST Center Chest", STONE_TOWER_INVERTED_CENTER_CHEST, BOMBCHU_10, {Category::cStoneTower,Category::cChest,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_STONE_TOWER ); - locationTable[STONE_TOWER_INVERTED_LEFT_CHEST] = ItemLocation::Chest (0x18, 0x1F, true, "IST Left Chest", STONE_TOWER_INVERTED_LEFT_CHEST, MAGIC_BEAN, {Category::cStoneTower,Category::cChest,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_STONE_TOWER ); + locationTable[STONE_TOWER_INVERTED_RIGHT_CHEST] = ItemLocation::Chest (0x59, 0x1D, true, "IST Right Chest", STONE_TOWER_INVERTED_RIGHT_CHEST, SILVER_RUPEE, {Category::cStoneTower,Category::cChest,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_STONE_TOWER ); + locationTable[STONE_TOWER_INVERTED_CENTER_CHEST] = ItemLocation::Chest (0x59, 0x1E, true, "IST Center Chest", STONE_TOWER_INVERTED_CENTER_CHEST, BOMBCHU_10, {Category::cStoneTower,Category::cChest,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_STONE_TOWER ); + locationTable[STONE_TOWER_INVERTED_LEFT_CHEST] = ItemLocation::Chest (0x59, 0x1F, true, "IST Left Chest", STONE_TOWER_INVERTED_LEFT_CHEST, MAGIC_BEAN, {Category::cStoneTower,Category::cChest,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_STONE_TOWER ); //Termina Field locationTable[TERMINA_FIELD_MOONS_TEAR] = ItemLocation::Base (0x2D, 0x96, true, "TF Moon's Tear", TERMINA_FIELD_MOONS_TEAR, MOONS_TEAR, {Category::cTerminaField,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_TERMINA_FIELD ); @@ -222,7 +222,7 @@ void LocationTable_Init() { locationTable[TWIN_ISLANDS_GORON_RACETRACK_GROTTO_CHEST] = ItemLocation::Chest (0x07, 0x19, true, "TI Goron Racetrack Grotto", TWIN_ISLANDS_GORON_RACETRACK_GROTTO_CHEST, BOMBCHU_5, {Category::cTwinIslands, Category::cGrotto,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_TWIN_ISLANDS ); locationTable[TWIN_ISLANDS_UNDERWATER_RAMP_CHEST] = ItemLocation::Chest (0x5E, 0x06, true, "TI Underwater Ramp Chest", TWIN_ISLANDS_UNDERWATER_RAMP_CHEST, PIECE_OF_HEART, {Category::cTwinIslands, Category::cVanillaHeartPiece, Category::cChest, Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_TWIN_ISLANDS ); locationTable[TWIN_ISLANDS_CAVE_CHEST] = ItemLocation::Chest (0x5E, 0x00, true, "TI Cave Chest", TWIN_ISLANDS_CAVE_CHEST, RED_RUPEE, {Category::cTwinIslands,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_TWIN_ISLANDS ); - + locationTable[TWIN_ISLANDS_LULLABY_INTRO] = ItemLocation::Base (0x5D, 0x00, false, "TI Lullaby Intro", TWIN_ISLANDS_LULLABY_INTRO, LULLABY_INTRO, {Category::cTwinIslands, Category::cSong, Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_TWIN_ISLANDS ); //W Clock Town locationTable[W_CLOCK_TOWN_BOMB_BAG_BUY] = ItemLocation::Base (0x0D, 0x1B, false, "WCT Bomb Bag Purchase", W_CLOCK_TOWN_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); locationTable[W_CLOCK_TOWN_BIG_BOMB_BAG_BUY] = ItemLocation::Base (0x0D, 0x1C, false, "WCT Big Bomb Bag Purchase", W_CLOCK_TOWN_BIG_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown,Category::cDayTwo}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); @@ -987,6 +987,7 @@ std::vector overworldLocations = { TWIN_ISLANDS_GORON_RACETRACK_GROTTO_CHEST, TWIN_ISLANDS_UNDERWATER_RAMP_CHEST, TWIN_ISLANDS_CAVE_CHEST, + TWIN_ISLANDS_LULLABY_INTRO, TINGLE_TWIN_ISLANDS_SH, TINGLE_TWIN_ISLANDS_RR, TINGLE_TWIN_ISLANDS_SH_SPRING, diff --git a/source/item_pool.cpp b/source/item_pool.cpp index 07f8725..0406d4d 100644 --- a/source/item_pool.cpp +++ b/source/item_pool.cpp @@ -257,7 +257,7 @@ const std::array chestItems = { MIRROR_SHIELD, }; -const std::array songList = { +const std::array songList = { //SONG_OF_TIME, //SONG_OF_DOUBLE_TIME, //INVERTED_SONG_OF_TIME, //SoT not included yet @@ -266,6 +266,7 @@ const std::array songList = { SONG_OF_HEALING, //SONG_OF_SOARING, SONATA_OF_AWAKENING, + LULLABY_INTRO, GORONS_LULLABY, NEW_WAVE_BOSSA_NOVA, ELEGY_OF_EMPTINESS, @@ -275,6 +276,7 @@ const std::array songList = { static void PlaceVanillaSongs() { PlaceItemInLocation(HMS_SONG_OF_HEALING, SONG_OF_HEALING); PlaceItemInLocation(DEKU_PALACE_IMPRISONED_MONKEY, SONATA_OF_AWAKENING); + PlaceItemInLocation(TWIN_ISLANDS_LULLABY_INTRO, LULLABY_INTRO); PlaceItemInLocation(GORON_VILLAGE_GORON_LULLABY, GORONS_LULLABY); PlaceItemInLocation(ROMANI_RANCH_ROMANIS_GAME, EPONAS_SONG); PlaceItemInLocation(GBC_BABY_ZORAS, NEW_WAVE_BOSSA_NOVA); @@ -911,7 +913,7 @@ void GenerateItemPool() { //KOKIRISWORD SHUFFLE if(StartingKokiriSword.Value() == (u8)StartingSwordSetting::STARTINGSWORD_NONE) {//if starting with no sword we need to add an extra to the pool - AddItemToMainPool(PROGRESSIVE_SWORD); + AddItemToMainPool(PROGRESSIVE_SWORD, 1); IceTrapModels.push_back(0x37);//GetItemID::GI_KOKIRI_SWORD PlaceItemInLocation(HMS_STARTING_SWORD,GREEN_RUPEE);//Add Junk to this location because theres no way to get it otherwise } else { @@ -920,7 +922,7 @@ void GenerateItemPool() { //SHUFFLE STARTING SHIELD if(StartingShield.Value() == (u8)StartingSheildSetting::STARTINGSHIELD_NONE){//if starting with no shield add an extra to the pool - AddItemToMainPool(HEROS_SHIELD); + AddItemToMainPool(HEROS_SHIELD, 1); PlaceItemInLocation(HMS_STARTING_SHIELD, GREEN_RUPEE);//PlaceJunk Here because you cant not get this } else { PlaceItemInLocation(HMS_STARTING_SHIELD, HEROS_SHIELD);}//if starting with any other shield place this here because this location is unobtainable @@ -994,6 +996,10 @@ void GenerateItemPool() { //else { PlaceVanillaSongs(); //} + if (StartingSongOfHealing.Value() == u8(1)){//if starting with song of healing fill deku mask and notebook spots as they are unobtainable + PlaceItemInLocation(HMS_DEKU_MASK, GREEN_RUPEE); + PlaceItemInLocation(HMS_BOMBERS_NOTEBOOK, GREEN_RUPEE); + } //if (ShuffleSoaring) //{ diff --git a/source/location_access.cpp b/source/location_access.cpp index a12796b..e3d861d 100644 --- a/source/location_access.cpp +++ b/source/location_access.cpp @@ -965,7 +965,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(DEKU_PALACE_BUTLER_RACE, {[] {return DekuMask;}}),// && DekuPrincessReturned + LocationAccess(DEKU_PALACE_BUTLER_RACE, {[] {return DekuMask && DekuPrincessReturned;}}), }, { //Exits @@ -1084,6 +1084,7 @@ void AreaTable_Init() { //Locations LocationAccess(TWIN_ISLANDS_UNDERWATER_RAMP_CHEST, {[] {return SnowheadClear && ZoraMask;}}), LocationAccess(TWIN_ISLANDS_CAVE_CHEST, {[] {return SnowheadClear && ZoraMask;}}), + LocationAccess(TWIN_ISLANDS_LULLABY_INTRO, {[] {return GoronMask && ((AnyBottle && HotSpringWater) || (Bow && MagicMeter && FireArrows));}}), LocationAccess(TINGLE_TWIN_ISLANDS_SH, {[]{return (DekuMask && MagicMeter) || Bow || Hookshot || ZoraMask;}}), LocationAccess(TINGLE_TWIN_ISLANDS_RR, {[]{return (DekuMask && MagicMeter) || Bow || Hookshot || ZoraMask;}}), LocationAccess(TINGLE_TWIN_ISLANDS_SH_SPRING, {[]{return (DekuMask && MagicMeter) || Bow || Hookshot || ZoraMask;}}), @@ -1179,7 +1180,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(GORON_VILLAGE_GORON_LULLABY, {[]{return GoronMask;}}), + LocationAccess(GORON_VILLAGE_GORON_LULLABY, {[]{return GoronMask && LullabyIntro;}}), }, { //Exits @@ -1718,7 +1719,19 @@ void AreaTable_Init() { { //Exits Entrance(IKANA_GRAVEYARD, {[]{return true;}}), - Entrance(IKANA_GRAVEYARD_IRON_KNUCKLE_ROOM, {[]{return true;}}), + Entrance(IKANA_GRAVEYARD_PRE_IRON_KNUCKLE_ROOM, {[]{return true;}}), + }); + + areaTable[IKANA_GRAVEYARD_PRE_IRON_KNUCKLE_ROOM] = Area("Ikana Graveyard Below Graves Pre Iron Knuckle Room", "Ikana Graveyard Below Graves Pre Iron Knuckle Room", NONE, { + //Evvents + }, + { + //Locations + }, + { + //Exits + Entrance(IKANA_GRAVEYARD_BELOW_GRAVE2, {[]{return true;}}), + Entrance(IKANA_GRAVEYARD_IRON_KNUCKLE_ROOM, {[]{return Bow && LensOfTruth && MagicMeter && AnyBombBag;}}), }); areaTable[IKANA_GRAVEYARD_IRON_KNUCKLE_ROOM] = Area("Ikana Graveyard Below Graves Iron Knuckle Room", "Ikana Graveyard Below Graves Iron Knuckle Room", NONE, { @@ -1726,7 +1739,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(IKANA_GRAVEYARD_IRON_KNUCKLE_CHEST, {[] {return CaptainsHat && AnyBombBag && Fighting;}}), //Doesnt need bombs? + LocationAccess(IKANA_GRAVEYARD_IRON_KNUCKLE_CHEST, {[] {return Fighting;}}), }, { //Exits @@ -2111,7 +2124,7 @@ void AreaTable_Init() { areaTable[WOODFALL_TEMPLE_PRINCESS_ROOM] = Area("Deku Princess Room", "Deku Princess Room", WOODFALL_TEMPLE, { //Events - EventAccess(&DekuPrincess, {[]{return WoodfallClear;}}), + EventAccess(&DekuPrincess, {[]{return WoodfallClear && AnyBottle;}}), }, { //Locations @@ -2436,6 +2449,7 @@ void AreaTable_Init() { //Locations LocationAccess(GOHT, {[] {return GoronMask && FireArrows && Bow && MagicMeter && BossKeySnowheadTemple;}}), LocationAccess(GOHT_HEART_CONTAINER, {[] {return GoronMask && BossKeySnowheadTemple && Bow && FireArrows && MagicMeter;}}), + LocationAccess(GIANTS_OATH_TO_ORDER, {[]{return SnowheadClear;}}), }, { //Exits @@ -2677,6 +2691,7 @@ void AreaTable_Init() { //Locations LocationAccess(GYORG, {[] {return ZoraMask && Hookshot && BossKeyGreatBayTemple && IceArrows && FireArrows && Bow && MagicMeter;}}), LocationAccess(GYORG_HEART_CONTAINER, {[] {return ZoraMask && Hookshot && BossKeyGreatBayTemple && IceArrows && FireArrows && Bow && MagicMeter;}}), + LocationAccess(GIANTS_OATH_TO_ORDER, {[]{return GreatBayClear;}}), }, { //Exits @@ -2989,6 +3004,7 @@ void AreaTable_Init() { LocationAccess(STONE_TOWER_TEMPLE_GIANTS_MASK_CHEST, {[] {return LightArrows && Bow && MagicMeter && BossKeyStoneTowerTemple;}}), LocationAccess(TWINMOLD, {[] {return LightArrows && Bow && MagicMeter && BossKeyStoneTowerTemple && GiantsMask;}}), LocationAccess(TWINMOLD_HEART_CONTAINER, {[] {return LightArrows && Bow && MagicMeter && BossKeyStoneTowerTemple && GiantsMask;}}), + LocationAccess(GIANTS_OATH_TO_ORDER, {[]{return StoneTowerClear;}}), }, { //Exits @@ -3451,7 +3467,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(IKANA_CASTLE_IKANA_KING, {[] {return (LightArrows || MirrorShield) && Fighting && FireArrows && Bow && MagicMeter;}}), + LocationAccess(IKANA_CASTLE_IKANA_KING, {[] {return MirrorShield && Fighting && FireArrows && Bow && MagicMeter;}}), }, { //Exits @@ -4032,7 +4048,7 @@ void AreaTable_Init() { } namespace Areas { - static std::array < const AreaKey, 265> allAreas = { + static std::array < const AreaKey, 266> allAreas = { ROOT, ROOT_EXITS, N_CLOCK_TOWN, @@ -4135,6 +4151,7 @@ namespace Areas { IKANA_GRAVEYARD_BATS_ROOM, IKANA_GRAVEYARD_TABLET_ROOM, IKANA_GRAVEYARD_BELOW_GRAVE2, + IKANA_GRAVEYARD_PRE_IRON_KNUCKLE_ROOM, IKANA_GRAVEYARD_IRON_KNUCKLE_ROOM, IKANA_GRAVEYARD_BELOW_GRAVE3, DAMPES_HUT, diff --git a/source/logic.cpp b/source/logic.cpp index f86f36e..d47c93e 100644 --- a/source/logic.cpp +++ b/source/logic.cpp @@ -122,6 +122,7 @@ namespace Logic { bool SongOfStorms = false; bool SonataOfAwakening = false; bool SongOfHealing = false; + bool LullabyIntro = false; bool GoronsLullaby = false; bool NewWaveBossaNova = false; bool ElegyOfEmptiness = false; @@ -649,6 +650,7 @@ namespace Logic { SongOfStorms = false; SonataOfAwakening = false; SongOfHealing = false; + LullabyIntro = false; GoronsLullaby = false; NewWaveBossaNova = false; ElegyOfEmptiness = false; diff --git a/source/spoiler_log.cpp b/source/spoiler_log.cpp index be487c5..b952364 100644 --- a/source/spoiler_log.cpp +++ b/source/spoiler_log.cpp @@ -287,6 +287,18 @@ static void WriteIngameSpoilerLog() { { spoilerData.ItemLocations[spoilerItemIndex].CollectType = COLLECTTYPE_REPEATABLE; } + if (key == HMS_DEKU_MASK && Settings::StartingSongOfHealing.Value() == u8(1)) + { + spoilerData.ItemLocations[spoilerItemIndex].CollectType = COLLECTTYPE_NEVER; + spoilerData.ItemLocations[spoilerItemIndex].RevealType = REVEALTYPE_ALWAYS; + spoilerData.ItemLocations[spoilerItemIndex].CollectionCheckType = SPOILER_CHK_ALWAYS_COLLECTED; + } + if (key == HMS_BOMBERS_NOTEBOOK && Settings::StartingSongOfHealing.Value() == u8(1)) + { + spoilerData.ItemLocations[spoilerItemIndex].CollectType = COLLECTTYPE_NEVER; + spoilerData.ItemLocations[spoilerItemIndex].RevealType = REVEALTYPE_ALWAYS; + spoilerData.ItemLocations[spoilerItemIndex].CollectionCheckType = SPOILER_CHK_ALWAYS_COLLECTED; + } auto checkGroup = loc->GetCollectionCheckGroup(); spoilerData.ItemLocations[spoilerItemIndex].Group = checkGroup; diff --git a/source/starting_inventory.cpp b/source/starting_inventory.cpp index 2b08ada..6d1d906 100644 --- a/source/starting_inventory.cpp +++ b/source/starting_inventory.cpp @@ -95,9 +95,13 @@ void GenerateStartingInventory() { AddItemToInventory(ELEGY_OF_EMPTINESS, StartingElegyOfEmptiness.Value()); AddItemToInventory(SONG_OF_HEALING, StartingSongOfHealing.Value()); AddItemToInventory(SONG_OF_SOARING, StartingSongOfSoaring.Value()); - AddItemToInventory(PROGRESSIVE_SWORD, StartingKokiriSword.Value()); - if (StartingShield.Value() == 1){ AddItemToInventory(HEROS_SHIELD, 1);} - if (StartingShield.Value() == 2){ AddItemToInventory(MIRROR_SHIELD, 1);} + //AddItemToInventory(PROGRESSIVE_SWORD, StartingKokiriSword.Value()); + if (StartingKokiriSword.Value() == (u8)0){ AddItemToInventory(PROGRESSIVE_SWORD, 0);} + if (StartingKokiriSword.Value() == (u8)1){ AddItemToInventory(PROGRESSIVE_SWORD, 1);} + if (StartingKokiriSword.Value() == (u8)2){ AddItemToInventory(PROGRESSIVE_SWORD, 2);} + if (StartingKokiriSword.Value() == (u8)3){ AddItemToInventory(PROGRESSIVE_SWORD, 0);} + if (StartingShield.Value() == (u8)0){ AddItemToInventory(HEROS_SHIELD, 1);} + if (StartingShield.Value() == (u8)1){ AddItemToInventory(MIRROR_SHIELD, 1);} AddItemToInventory(PROGRESSIVE_MAGIC_METER, StartingMagicMeter.Value()); AddItemToInventory(PROGRESSIVE_WALLET, StartingWallet.Value()); AddItemToInventory(DOUBLE_DEFENSE, StartingDoubleDefense.Value()); From eed432f0fe2ec506a0274553c330a500eb98d365 Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sat, 3 Feb 2024 15:22:27 -0600 Subject: [PATCH 4/6] Update item_location.cpp Update Giant's Mask Chest Flag to 0x00 --- source/item_location.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/item_location.cpp b/source/item_location.cpp index 71fc8e3..dfe3f3a 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -298,7 +298,7 @@ void LocationTable_Init() { locationTable[STONE_TOWER_TEMPLE_UPDRAFT_ROOM_CHEST] = ItemLocation::Chest (0x18, 0x04, true, "Stone Tower Temple Updraft Room Chest", STONE_TOWER_TEMPLE_UPDRAFT_ROOM_CHEST, STONE_TOWER_TEMPLE_SMALL_KEY, {Category::cStoneTowerTemple, Category::cVanillaSmallKey,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); locationTable[STONE_TOWER_TEMPLE_DEATH_ARMOS_ROOM_CHEST] = ItemLocation::Chest (0x18, 0x05, true, "Stone Tower Temple Death Armos Room Chest", STONE_TOWER_TEMPLE_DEATH_ARMOS_ROOM_CHEST, STONE_TOWER_TEMPLE_SMALL_KEY, {Category::cStoneTowerTemple, Category::cVanillaSmallKey,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); locationTable[STONE_TOWER_TEMPLE_LIGHT_ARROW_CHEST] = ItemLocation::Chest (0x16, 0x1B, true, "Stone Tower Temple Light Arrow Chest", STONE_TOWER_TEMPLE_LIGHT_ARROW_CHEST, LIGHT_ARROWS, {Category::cStoneTowerTemple,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); - locationTable[STONE_TOWER_TEMPLE_GIANTS_MASK_CHEST] = ItemLocation::Chest (0x36, 0x7D, false, "Stone Tower Temple Giant's Mask Chest", STONE_TOWER_TEMPLE_GIANTS_MASK_CHEST, GIANTS_MASK, {Category::cStoneTowerTemple,Category::cChest, Category::cVanillaMask ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); + locationTable[STONE_TOWER_TEMPLE_GIANTS_MASK_CHEST] = ItemLocation::Chest (0x36, 0x00, false, "Stone Tower Temple Giant's Mask Chest", STONE_TOWER_TEMPLE_GIANTS_MASK_CHEST, GIANTS_MASK, {Category::cStoneTowerTemple,Category::cChest, Category::cVanillaMask ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); //Pirate Fortress locationTable[PF_INTERIOR_HOOKSHOT_CHEST] = ItemLocation::Chest (0x23, 0x02, true, "Pirate's Fortress Int Hookshot Chest", PF_INTERIOR_HOOKSHOT_CHEST, HOOKSHOT, {Category::cPiratesFortressInterior,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_PIRATE_FORTRESS ); From e95cc138fbadfbe89f2a018ea829dfdd0d44a7e9 Mon Sep 17 00:00:00 2001 From: Phlex Date: Sun, 4 Feb 2024 10:04:40 -0600 Subject: [PATCH 5/6] Update subrepo to bring in fish HP check. Update subrepo to bring in bottle override checks. Update Keaton locations to use green rupee instead of heart piece to avoid collisions. --- Z3DR | 2 +- source/item_location.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Z3DR b/Z3DR index f72b432..838c070 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit f72b432b8219dc2ca7c7c256934b211ce19921b7 +Subproject commit 838c0701b6e608381342f0dd24d9546f54986ff2 diff --git a/source/item_location.cpp b/source/item_location.cpp index dfe3f3a..b5099f8 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -71,7 +71,7 @@ void LocationTable_Init() { //locationTable[GBC_OCEAN_SPIDER_DAY3] = ItemLocation::Base (0x28, 0x00, true, "OSH Day 3 Reward", GBC_OCEAN_SPIDER_DAY3, RED_RUPEE, {Category::cGreatBayCoast,Category::cDayThree}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GREAT_BAY_COAST ); locationTable[GBC_FISHERMAN_GAME] = ItemLocation::Base (0x37, 0x06, false, "GBC Fisherman's Game", GBC_FISHERMAN_GAME, PIECE_OF_HEART, {Category::cGreatBayCoast, Category::cMinigame,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GREAT_BAY_COAST ); locationTable[GBC_OCEAN_SPIDER_CHEST] = ItemLocation::Chest (0x28, 0x00, false, "OSH Chest", GBC_OCEAN_SPIDER_CHEST, PIECE_OF_HEART, {Category::cGreatBayCoast, Category::cVanillaHeartPiece ,Category::cDayOne,Category::cChest}, SpoilerCollectionCheckGroup::GROUP_GREAT_BAY_COAST ); - locationTable[GBC_LAB_FISH] = ItemLocation::Collectable(0x2F, 0x0A, false, "GBC Marine Lab Fish HP", GBC_LAB_FISH, PIECE_OF_HEART, {Category::cGreatBayCoast, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_GREAT_BAY_COAST ); + locationTable[GBC_LAB_FISH] = ItemLocation::Collectable(0x2F, 0x00, false, "GBC Marine Lab Fish HP", GBC_LAB_FISH, PIECE_OF_HEART, {Category::cGreatBayCoast, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_GREAT_BAY_COAST ); locationTable[GBC_LEDGE] = ItemLocation::Collectable(0x37, 0x00, false, "GBC Ledge", GBC_LEDGE, PIECE_OF_HEART, {Category::cGreatBayCoast, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_GREAT_BAY_COAST ); locationTable[GBC_MIKAU] = ItemLocation::Base (0x37, 0x7A, false, "GBC Mikau", GBC_MIKAU, ZORA_MASK, {Category::cGreatBayCoast, Category::cTransformMask,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GREAT_BAY_COAST ); locationTable[GBC_BABY_ZORAS] = ItemLocation::Base (0x2F, 0x4E, false, "GBC Marine Lab Baby Zoras", GBC_BABY_ZORAS, NEW_WAVE_BOSSA_NOVA, {Category::cGreatBayCoast, Category::cSong,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GREAT_BAY_COAST ); @@ -105,7 +105,7 @@ void LocationTable_Init() { locationTable[MILK_ROAD_GORMAN_RACE] = ItemLocation::Base (0x6A, 0x81, false, "MR Gorman Track Race", MILK_ROAD_GORMAN_RACE, GAROS_MASK, {Category::cMilkRoad, Category::cMinigame, Category::cVanillaMask,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_MILK_ROAD ); locationTable[MILK_ROAD_GORMAN_MILK_BUY] = ItemLocation::Base (0x6A, 0x92, true, "MR Gorman Track Milk Purchase", MILK_ROAD_GORMAN_MILK_BUY, MILK, {Category::cMilkRoad,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_MILK_ROAD ); locationTable[GORMAN_TRACK_MYSTERY_MILK_QUEST] = ItemLocation::Base (0x6A, 0x70, false, "MR Gorman's Mystery Milk Quest", GORMAN_TRACK_MYSTERY_MILK_QUEST, BOTTLE_WITH_MYSTERY_MILK, {Category::cMilkRoad,Category::cDayTwo}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_MILK_ROAD ); - locationTable[MILK_ROAD_KEATON_QUIZ] = ItemLocation::Base (0x22, 0x0C, false, "MR Keaton Quiz", MILK_ROAD_KEATON_QUIZ, PIECE_OF_HEART, {Category::cMilkRoad, Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_MILK_ROAD ); + locationTable[MILK_ROAD_KEATON_QUIZ] = ItemLocation::Base (0x22, 0x01, false, "MR Keaton Quiz", MILK_ROAD_KEATON_QUIZ, PIECE_OF_HEART, {Category::cMilkRoad, Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_MILK_ROAD ); //Mountain Village locationTable[MOUNTAIN_VILLAGE_SMITH_DAY_ONE] = ItemLocation::Base (0x2C, 0x38, false, "MV Smith Day 1", MOUNTAIN_VILLAGE_SMITH_DAY_ONE, RAZOR_SWORD, {Category::cMountainVillage,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_MOUNTAIN_VILLAGE ); @@ -119,7 +119,7 @@ void LocationTable_Init() { //N Clock Town locationTable[N_CLOCK_TOWN_GREAT_FAIRY_DEKU] = ItemLocation::Base (0x26, 0x0E, false, "NCT Great Fairy (Deku)", N_CLOCK_TOWN_GREAT_FAIRY_DEKU, PROGRESSIVE_MAGIC_METER, {Category::cNorthClockTown, Category::cFairyFountain,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_N_CLOCK_TOWN ); //locationTable[N_CLOCK_TOWN_BOMBERS_HIDE_SEEK] = ItemLocation::Base (0x6E, 0x50, true, "NCT Bombers Hide n Seek", N_CLOCK_TOWN_BOMBERS_HIDE_SEEK, BOMBERS_NOTEBOOK, {Category::cNorthClockTown,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_N_CLOCK_TOWN ); - locationTable[N_CLOCK_TOWN_KEATON_QUIZ] = ItemLocation::Base (0x6E, 0x0C, false, "NCT Keaton Quiz", N_CLOCK_TOWN_KEATON_QUIZ, PIECE_OF_HEART, {Category::cNorthClockTown, Category::cMinigame, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_N_CLOCK_TOWN ); + locationTable[N_CLOCK_TOWN_KEATON_QUIZ] = ItemLocation::Base (0x6E, 0x01, false, "NCT Keaton Quiz", N_CLOCK_TOWN_KEATON_QUIZ, PIECE_OF_HEART, {Category::cNorthClockTown, Category::cMinigame, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_N_CLOCK_TOWN ); locationTable[N_CLOCK_TOWN_DEKU_PLAYGROUND_3DAYS] = ItemLocation::Base (0x1E, 0x0C, false, "NCT Deku Playground 3 Days Reward", N_CLOCK_TOWN_DEKU_PLAYGROUND_3DAYS, PIECE_OF_HEART, {Category::cNorthClockTown, Category::cMinigame, Category::cVanillaHeartPiece,Category::cDayThree}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_N_CLOCK_TOWN ); locationTable[N_CLOCK_TOWN_TREE] = ItemLocation::Collectable(0x6E, 0x00, false, "NCT Tree", N_CLOCK_TOWN_TREE, PIECE_OF_HEART, {Category::cNorthClockTown, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_N_CLOCK_TOWN ); locationTable[N_CLOCK_TOWN_OLD_LADY] = ItemLocation::Base (0x6E, 0x8D, false, "NCT Old Lady", N_CLOCK_TOWN_OLD_LADY, BLAST_MASK, {Category::cNorthClockTown, Category::cVanillaMask,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_N_CLOCK_TOWN ); From 6e97a6b3c79f5161820c45297f8ce99129280abc Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sun, 4 Feb 2024 12:29:12 -0600 Subject: [PATCH 6/6] Add New Check - Adds Mountain Village Keaton Quiz Check --- source/hint_list.cpp | 1 + source/include/keys.hpp | 1 + source/item_location.cpp | 5 ++++- source/item_pool.cpp | 1 + source/location_access.cpp | 1 + 5 files changed, 8 insertions(+), 1 deletion(-) diff --git a/source/hint_list.cpp b/source/hint_list.cpp index 7cdf8e8..003f18e 100644 --- a/source/hint_list.cpp +++ b/source/hint_list.cpp @@ -332,6 +332,7 @@ void HintTable_Init() { hintTable[MOUNTAIN_VILLAGE_SMITH_DAY_ONE] = HintText::Sometimes({Text{"a moutain smith crafts", "", ""}}); hintTable[MOUNTAIN_VILLAGE_SMITH_DAY_TWO] = HintText::Sometimes({Text{"a mountain smith crafts", "", ""}}); hintTable[MOUNTAIN_VILLAGE_FROG_CHOIR] = HintText::Sometimes({Text{"a frog choir rewards", "", ""}}); + hintTable[MOUNTAIN_VILLAGE_KEATON_QUIZ] = HintText::Sometimes({Text{"a mysterious fox rewards", "", ""}}); hintTable[MOUNTAIN_VILLAGE_DARMANI] = HintText::Sometimes({Text{"a mountain spirit rewards", "", ""}}); hintTable[MOUNTAIN_VILLAGE_HUNGRY_GORON] = HintText::Sometimes({Text{"a hungry goron rewards", "", ""}}); hintTable[MOUNTAIN_WATERFALL_CHEST] = HintText::Sometimes({Text{"a springtime waterfall contains", "", ""}}); diff --git a/source/include/keys.hpp b/source/include/keys.hpp index 0c971e2..23a9449 100644 --- a/source/include/keys.hpp +++ b/source/include/keys.hpp @@ -340,6 +340,7 @@ typedef enum { MOUNTAIN_VILLAGE_SMITH_DAY_ONE, MOUNTAIN_VILLAGE_SMITH_DAY_TWO, MOUNTAIN_VILLAGE_FROG_CHOIR, + MOUNTAIN_VILLAGE_KEATON_QUIZ, MOUNTAIN_VILLAGE_DARMANI, MOUNTAIN_VILLAGE_HUNGRY_GORON, MOUNTAIN_WATERFALL_CHEST, diff --git a/source/item_location.cpp b/source/item_location.cpp index b5099f8..f11ad37 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -115,7 +115,8 @@ void LocationTable_Init() { locationTable[MOUNTAIN_VILLAGE_HUNGRY_GORON] = ItemLocation::Base (0x50, 0x88, false, "MV Hungry Goron", MOUNTAIN_VILLAGE_HUNGRY_GORON, DON_GEROS_MASK, {Category::cMountainVillage, Category::cVanillaMask,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_MOUNTAIN_VILLAGE ); locationTable[MOUNTAIN_WATERFALL_CHEST] = ItemLocation::Chest (0x5A, 0x00, true, "MV Waterfall Chest", MOUNTAIN_WATERFALL_CHEST, RED_RUPEE, {Category::cMountainVillage,Category::cChest,Category::cDayOne }, SpoilerCollectionCheckGroup::GROUP_MOUNTAIN_VILLAGE ); locationTable[MOUNTAIN_VILLAGE_SPRING_WATER_GROTTO_CHEST] = ItemLocation::Chest (0x07, 0x1B, true, "MV Spring Water Grotto", MOUNTAIN_VILLAGE_SPRING_WATER_GROTTO_CHEST, RED_RUPEE, {Category::cMountainVillage, Category::cGrotto,Category::cChest,Category::cDayOne }, SpoilerCollectionCheckGroup::GROUP_MOUNTAIN_VILLAGE ); - + locationTable[MOUNTAIN_VILLAGE_KEATON_QUIZ] = ItemLocation::Base (0x5A, 0x01, false, "MV Keaton Quiz", MOUNTAIN_VILLAGE_KEATON_QUIZ, PIECE_OF_HEART, {Category::cMountainVillage, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_MOUNTAIN_VILLAGE ); + //N Clock Town locationTable[N_CLOCK_TOWN_GREAT_FAIRY_DEKU] = ItemLocation::Base (0x26, 0x0E, false, "NCT Great Fairy (Deku)", N_CLOCK_TOWN_GREAT_FAIRY_DEKU, PROGRESSIVE_MAGIC_METER, {Category::cNorthClockTown, Category::cFairyFountain,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_N_CLOCK_TOWN ); //locationTable[N_CLOCK_TOWN_BOMBERS_HIDE_SEEK] = ItemLocation::Base (0x6E, 0x50, true, "NCT Bombers Hide n Seek", N_CLOCK_TOWN_BOMBERS_HIDE_SEEK, BOMBERS_NOTEBOOK, {Category::cNorthClockTown,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_N_CLOCK_TOWN ); @@ -878,6 +879,7 @@ std::vector overworldLocations = { MOUNTAIN_VILLAGE_SMITH_DAY_ONE, MOUNTAIN_VILLAGE_SMITH_DAY_TWO, MOUNTAIN_VILLAGE_FROG_CHOIR, + MOUNTAIN_VILLAGE_KEATON_QUIZ, MOUNTAIN_VILLAGE_DARMANI, MOUNTAIN_VILLAGE_HUNGRY_GORON, MOUNTAIN_WATERFALL_CHEST, @@ -1198,6 +1200,7 @@ void CreateItemOverrides() { //Keaton Quiz auto loc14 = Location(N_CLOCK_TOWN_KEATON_QUIZ); PlaceItemInLocation(MILK_ROAD_KEATON_QUIZ, loc14->GetPlacedItemKey());//copy NCT keaton quiz item to milk road + PlaceItemInLocation(MOUNTAIN_VILLAGE_KEATON_QUIZ, loc14->GetPlacedItemKey());//copy NCT keaton quiz item to Mountain Village //Spring time Goron Village auto loc15 = Location(GORON_VILLAGE_POWDER_KEG_CHALLENGE); auto loc16 = Location(GORON_VILLAGE_SCRUB_PURCHASE); diff --git a/source/item_pool.cpp b/source/item_pool.cpp index 0406d4d..a73e920 100644 --- a/source/item_pool.cpp +++ b/source/item_pool.cpp @@ -904,6 +904,7 @@ void GenerateItemPool() { PlaceItemInLocation(N_CLOCK_TOWN_POSTBOX, BLUE_RUPEE); PlaceItemInLocation(E_CLOCK_TOWN_POSTBOX, BLUE_RUPEE); PlaceItemInLocation(MILK_ROAD_KEATON_QUIZ, BLUE_RUPEE); + PlaceItemInLocation(MOUNTAIN_VILLAGE_KEATON_QUIZ, BLUE_RUPEE); PlaceItemInLocation(GORON_VILLAGE_POWDER_KEG_CHALLENGE_SPRING, BLUE_RUPEE); PlaceItemInLocation(GORON_VILLAGE_SCRUB_PURCHASE_SPRING, BLUE_RUPEE); PlaceItemInLocation(GORON_VILLAGE_SCRUB_TRADE_SPRING, BLUE_RUPEE); diff --git a/source/location_access.cpp b/source/location_access.cpp index e3d861d..1bbe381 100644 --- a/source/location_access.cpp +++ b/source/location_access.cpp @@ -1025,6 +1025,7 @@ void AreaTable_Init() { LocationAccess(MOUNTAIN_VILLAGE_FROG_CHOIR, {[] {return SnowheadClear && LaundryFrog && SwampFrog && WoodfallFrog && GreatBayFrog && DonGerosMask;}}), LocationAccess(MOUNTAIN_VILLAGE_HUNGRY_GORON, {[] {return GoronMask && MagicMeter;}}), LocationAccess(MOUNTAIN_WATERFALL_CHEST, {[] {return SnowheadClear;}}), + LocationAccess(MOUNTAIN_VILLAGE_KEATON_QUIZ, {[]{return SnowheadClear && KeatonMask && AnySword;}}), //Gossip Stones LocationAccess(MV_NEAR_FROGS_GOSSIP, {[] {return true;}}), LocationAccess(MV_NEAR_GROTTO_GOSSIP, {[] {return true;}}),