From d18a3b89aea58c18f4dc32515df29120a05fc2ae Mon Sep 17 00:00:00 2001 From: PhlexPlexico Date: Mon, 29 Jan 2024 16:56:33 -0600 Subject: [PATCH 01/47] Update patch code to fix various item check issues. (#32) - Epona Taking Away Sword - Twinmold Not Spawning - Room Key not being able to enter - Possibly Letter to Mama - Pendant of Memories not being able to be given. --- Z3DR | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Z3DR b/Z3DR index 37d1a54..d77f27f 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit 37d1a5497763f9d899be8bf60ed4fb89b59d6d6e +Subproject commit d77f27fc28599d01b476c2967cff1bd8deeb587c From 177bc4d49747972c84b5f6a5960e2c1c47f375a7 Mon Sep 17 00:00:00 2001 From: PhlexPlexico Date: Mon, 29 Jan 2024 20:05:06 -0600 Subject: [PATCH 02/47] Include Giant Mask unshuffling for now as the check is not giving proper items. (#33) Fix Gabora not giving proper sword rewards. --- source/include/version.hpp | 2 +- source/item_location.cpp | 2 +- source/item_pool.cpp | 11 ++++++++--- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/source/include/version.hpp b/source/include/version.hpp index cf766e1..af618ae 100644 --- a/source/include/version.hpp +++ b/source/include/version.hpp @@ -1,4 +1,4 @@ #pragma once -#define RANDOMIZER_VERSION "v1.1.1" +#define RANDOMIZER_VERSION "v1.1.2" #define COMMIT_NUMBER "develop" diff --git a/source/item_location.cpp b/source/item_location.cpp index cb61ec3..05c10a8 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -108,7 +108,7 @@ void LocationTable_Init() { locationTable[MILK_ROAD_KEATON_QUIZ] = ItemLocation::Base (0x6A, 0x0C, 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, 0x4A, false, "MV Smith Day 1", MOUNTAIN_VILLAGE_SMITH_DAY_ONE, RAZOR_SWORD, {Category::cMountainVillage,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_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 ); locationTable[MOUNTAIN_VILLAGE_SMITH_DAY_TWO] = ItemLocation::Base (0x2C, 0x39, false, "MV Smith Day 2", MOUNTAIN_VILLAGE_SMITH_DAY_TWO, GILDED_SWORD, {Category::cMountainVillage,Category::cDayTwo}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_MOUNTAIN_VILLAGE ); locationTable[MOUNTAIN_VILLAGE_FROG_CHOIR] = ItemLocation::Base (0x5A, 0x0C, false, "MV Frog Choir", MOUNTAIN_VILLAGE_FROG_CHOIR, PIECE_OF_HEART, {Category::cMountainVillage, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_MOUNTAIN_VILLAGE ); locationTable[MOUNTAIN_VILLAGE_DARMANI] = ItemLocation::Base (0x4E, 0x79, false, "MV Graveyard Darmani", MOUNTAIN_VILLAGE_DARMANI, GORON_MASK, {Category::cMountainVillage, Category::cTransformMask,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_MOUNTAIN_VILLAGE ); diff --git a/source/item_pool.cpp b/source/item_pool.cpp index bb7c6e5..07f8725 100644 --- a/source/item_pool.cpp +++ b/source/item_pool.cpp @@ -283,7 +283,8 @@ static void PlaceVanillaSongs() { PlaceItemInLocation(GIANTS_OATH_TO_ORDER, OATH_TO_ORDER); }; -const std::array maskList = { +// TODO: Change back to 18 when the override value is correct. +const std::array maskList = { KEATON_MASK, BUNNY_HOOD, POSTMANS_HAT, @@ -300,7 +301,7 @@ const std::array maskList = { GIBDOS_MASK, GAROS_MASK, CAPTAINS_HAT, - GIANTS_MASK, + // GIANTS_MASK, // TODO: Add this back in after the override is completed. MASK_OF_TRUTH, }; @@ -799,7 +800,8 @@ static void PlaceVanillaShopItems() { PlaceItemInLocation(TRADING_POST_ITEM_7, BUY_DEKU_NUT_10); PlaceItemInLocation(TRADING_POST_ITEM_8, BUY_MAGIC_BEAN); PlaceItemInLocation(BOMB_SHOP_ITEM_1, BUY_BOMBS_10); - PlaceItemInLocation(BOMB_SHOP_ITEM_2, BUY_BOMBCHU_10); + PlaceItemInLocation(BOMB_SHOP_ITEM_2, BUY_BOMBCHU_10); + PlaceItemInLocation(W_CLOCK_TOWN_BOMB_SHOP_GORON, POWDER_KEG); PlaceItemInLocation(POTION_SHOP_ITEM_1, BUY_BLUE_POTION); PlaceItemInLocation(POTION_SHOP_ITEM_2, BUY_GREEN_POTION); PlaceItemInLocation(POTION_SHOP_ITEM_3, BUY_RED_POTION); @@ -891,6 +893,9 @@ void GenerateItemPool() { //temp placement until shopsanity works PlaceItemInLocation(SOUTHERN_SWAMP_SCRUB_PURCHASE, MAGIC_BEAN); + // TODO: Remove these once overrides are fixed. + PlaceItemInLocation(STONE_TOWER_TEMPLE_GIANTS_MASK_CHEST, GIANTS_MASK); + //Place Temp Items at alt locations so they don't get filled with important stuff - will be replaced later PlaceItemInLocation(SOUTHERN_SWAMP_KOTAKE_IN_WOODS, BLUE_RUPEE); From e5b9922acf28d1eb01cfca1799ad5578637289e6 Mon Sep 17 00:00:00 2001 From: PhlexPlexico Date: Mon, 29 Jan 2024 20:15:22 -0600 Subject: [PATCH 03/47] Fix Keaton Quiz in Milk Road. (#34) --- 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 05c10a8..86f6cc3 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -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 (0x6A, 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, 0x0C, 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 ); From 0b9790f988076bfc1b522b60f0d8805be971a590 Mon Sep 17 00:00:00 2001 From: PhlexPlexico Date: Sun, 4 Feb 2024 12:49:27 -0600 Subject: [PATCH 04/47] Item Location Fixes (#35) Patch Side: - Include fixes for deku trade quest in giving repeat progressive items. - Include gorman track fix for getting the mask and milk. - Fix for bottle refills and obtaining new bottles. - Bring back blue rupee item give back on default chests. - Fix HP Override for the Fish Lab HP - Adjust Keaton to use flags for green rupees instead of heart pieces to avoid collisions in searches. - Fix Oceanside Spiderhouse override - Fix camera reset on Zora Swimming and Goron Rolling - Dungeon resets will now keep free standing stray fairies removed, and keep doors that were previously unlocked open. - Banker no longer keeps giving rewards at 1k rupees - Swamp Manager now gives the proper rewards and will give fishing passes after. App/Logic Side: - 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. - Update Giant's Mask Chest Flag to 0x00 - Add in Keaton Check for Springtime Mountain Village --------- Co-authored-by: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> --- Z3DR | 2 +- source/fill.cpp | 17 +++++++++++++---- source/hint_list.cpp | 4 ++++ source/include/keys.hpp | 4 ++++ source/include/logic.hpp | 1 + source/item_list.cpp | 1 + source/item_location.cpp | 26 +++++++++++++++----------- source/item_pool.cpp | 13 ++++++++++--- source/location_access.cpp | 32 +++++++++++++++++++++++++------- source/logic.cpp | 2 ++ source/spoiler_log.cpp | 12 ++++++++++++ source/starting_inventory.cpp | 10 +++++++--- 12 files changed, 95 insertions(+), 29 deletions(-) diff --git a/Z3DR b/Z3DR index d77f27f..838c070 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit d77f27fc28599d01b476c2967cff1bd8deeb587c +Subproject commit 838c0701b6e608381342f0dd24d9546f54986ff2 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..003f18e 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"}}); @@ -331,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", "", ""}}); @@ -440,6 +442,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 +798,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..23a9449 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, @@ -338,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, @@ -813,6 +816,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 86f6cc3..f11ad37 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 ); @@ -80,7 +80,7 @@ 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, 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 ); @@ -89,7 +89,7 @@ void LocationTable_Init() { //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 ); @@ -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 ); @@ -115,11 +115,12 @@ 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 ); - 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 ); @@ -198,9 +199,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 +223,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 ); @@ -298,7 +299,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 ); @@ -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, @@ -987,6 +989,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, @@ -1197,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 07f8725..a73e920 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); @@ -902,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); @@ -911,7 +914,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 +923,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 +997,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..1bbe381 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 @@ -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;}}), @@ -1084,6 +1085,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 +1181,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(GORON_VILLAGE_GORON_LULLABY, {[]{return GoronMask;}}), + LocationAccess(GORON_VILLAGE_GORON_LULLABY, {[]{return GoronMask && LullabyIntro;}}), }, { //Exits @@ -1718,7 +1720,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 +1740,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 +2125,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 +2450,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 +2692,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 +3005,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 +3468,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 +4049,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 +4152,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 6edccc1e36969e3bcf755864fdb83236ea749096 Mon Sep 17 00:00:00 2001 From: PhlexPlexico Date: Sun, 4 Feb 2024 12:50:11 -0600 Subject: [PATCH 05/47] Update Version Number --- source/include/version.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/include/version.hpp b/source/include/version.hpp index af618ae..4119a28 100644 --- a/source/include/version.hpp +++ b/source/include/version.hpp @@ -1,4 +1,4 @@ #pragma once -#define RANDOMIZER_VERSION "v1.1.2" +#define RANDOMIZER_VERSION "v1.2" #define COMMIT_NUMBER "develop" From d664f00f52b7b6d800f9cd352f6a5c6bbf439b36 Mon Sep 17 00:00:00 2001 From: PhlexPlexico Date: Mon, 5 Feb 2024 16:41:59 -0600 Subject: [PATCH 06/47] Change Pamela's Father override to be correct. (#36) Update Z3DR to fix key issue and show overhead progressive items. Fix ZH Deku Evan to be ZH Evan. Fix MV Day 1/2 to be razor and gilded. Formatting adjustments in item table. Fix starting bottles being moldy milk. Fix sword and shield not applying on all on. Adjust deku princess access to add sword. --- Z3DR | 2 +- source/include/version.hpp | 2 +- source/item_location.cpp | 30 +++++++++++++++--------------- source/location_access.cpp | 2 +- source/settings.cpp | 8 ++++++-- 5 files changed, 24 insertions(+), 20 deletions(-) diff --git a/Z3DR b/Z3DR index 838c070..ca06827 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit 838c0701b6e608381342f0dd24d9546f54986ff2 +Subproject commit ca06827a409a849c20ff3e69ee9f0961208ccace diff --git a/source/include/version.hpp b/source/include/version.hpp index 4119a28..ccd7436 100644 --- a/source/include/version.hpp +++ b/source/include/version.hpp @@ -1,4 +1,4 @@ #pragma once -#define RANDOMIZER_VERSION "v1.2" +#define RANDOMIZER_VERSION "v1.2.1" #define COMMIT_NUMBER "develop" diff --git a/source/item_location.cpp b/source/item_location.cpp index f11ad37..b55fa5e 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -33,10 +33,10 @@ void LocationTable_Init() { //East Clock Town locationTable[E_CLOCK_TOWN_AROMA_IN_BAR] = ItemLocation::Base (0x15, 0x6F, false, "ECT Milk Bar Madame Aroma", E_CLOCK_TOWN_AROMA_IN_BAR, CHATEAU_ROMANI, {Category::cEastClockTown, Category::cDayThree}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); - locationTable[E_CLOCK_TOWN_ARCHERY_1] = ItemLocation::Base (0x20, 0x47, false, "ECT Archery #1", E_CLOCK_TOWN_ARCHERY_1, PROGRESSIVE_BOW, {Category::cEastClockTown, Category::cMinigame,Category::cDayOne }, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); + locationTable[E_CLOCK_TOWN_ARCHERY_1] = ItemLocation::Base (0x20, 0x47, false, "ECT Archery #1", E_CLOCK_TOWN_ARCHERY_1, PROGRESSIVE_BOW, {Category::cEastClockTown, Category::cMinigame,Category::cDayOne }, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); locationTable[E_CLOCK_TOWN_MAYOR] = ItemLocation::Base (0x12, 0x0C, false, "ECT Mayor Reward", E_CLOCK_TOWN_MAYOR, PIECE_OF_HEART, {Category::cEastClockTown, Category::cVanillaHeartPiece ,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); - locationTable[E_CLOCK_TOWN_ARCHERY_2] = ItemLocation::Base (0x20, 0x0C, false, "ECT Archery #2", E_CLOCK_TOWN_ARCHERY_2, PIECE_OF_HEART, {Category::cEastClockTown, Category::cMinigame , Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); - locationTable[E_CLOCK_TOWN_HONEY_DARLING_3DAYS] = ItemLocation::Base (0x11, 0x0C, false, "ECT Honey and Darling 3 Days", E_CLOCK_TOWN_HONEY_DARLING_3DAYS, PIECE_OF_HEART, {Category::cEastClockTown, Category::cMinigame , Category::cVanillaHeartPiece,Category::cDayThree}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); + locationTable[E_CLOCK_TOWN_ARCHERY_2] = ItemLocation::Base (0x20, 0x0C, false, "ECT Archery #2", E_CLOCK_TOWN_ARCHERY_2, PIECE_OF_HEART, {Category::cEastClockTown, Category::cMinigame , Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); + locationTable[E_CLOCK_TOWN_HONEY_DARLING_3DAYS] = ItemLocation::Base (0x11, 0x0C, false, "ECT Honey and Darling 3 Days", E_CLOCK_TOWN_HONEY_DARLING_3DAYS, PIECE_OF_HEART, {Category::cEastClockTown, Category::cMinigame , Category::cVanillaHeartPiece,Category::cDayThree}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); locationTable[E_CLOCK_TOWN_TREASURE_CHEST_GAME_GORON] = ItemLocation::Chest (0x17, 0x00, true, "ECT Treasure Chest Game (Goron)", E_CLOCK_TOWN_TREASURE_CHEST_GAME_GORON, PIECE_OF_HEART, {Category::cEastClockTown, Category::cMinigame, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); locationTable[E_CLOCK_TOWN_POSTMAN_FREEDOM] = ItemLocation::Base (0x6C, 0x84, true, "ECT Postman's Freedom", E_CLOCK_TOWN_POSTMAN_FREEDOM, POSTMANS_HAT, {Category::cEastClockTown, Category::cVanillaMask,Category::cDayThree}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); locationTable[E_CLOCK_TOWN_GORMAN] = ItemLocation::Base (0x15, 0x83, false, "ECT Milk Bar Gorman", E_CLOCK_TOWN_GORMAN, CIRCUS_LEADERS_MASK, {Category::cEastClockTown, Category::cVanillaMask,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); @@ -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, 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, 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 ); @@ -108,8 +108,8 @@ void LocationTable_Init() { 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 ); - locationTable[MOUNTAIN_VILLAGE_SMITH_DAY_TWO] = ItemLocation::Base (0x2C, 0x39, false, "MV Smith Day 2", MOUNTAIN_VILLAGE_SMITH_DAY_TWO, GILDED_SWORD, {Category::cMountainVillage,Category::cDayTwo}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_MOUNTAIN_VILLAGE ); + locationTable[MOUNTAIN_VILLAGE_SMITH_DAY_ONE] = ItemLocation::Base (0x2C, 0x38, false, "MV Razor Sword", MOUNTAIN_VILLAGE_SMITH_DAY_ONE, RAZOR_SWORD, {Category::cMountainVillage,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_MOUNTAIN_VILLAGE ); + locationTable[MOUNTAIN_VILLAGE_SMITH_DAY_TWO] = ItemLocation::Base (0x2C, 0x39, false, "MV Gilded Sword", MOUNTAIN_VILLAGE_SMITH_DAY_TWO, GILDED_SWORD, {Category::cMountainVillage,Category::cDayTwo}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_MOUNTAIN_VILLAGE ); locationTable[MOUNTAIN_VILLAGE_FROG_CHOIR] = ItemLocation::Base (0x5A, 0x0C, false, "MV Frog Choir", MOUNTAIN_VILLAGE_FROG_CHOIR, PIECE_OF_HEART, {Category::cMountainVillage, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_MOUNTAIN_VILLAGE ); locationTable[MOUNTAIN_VILLAGE_DARMANI] = ItemLocation::Base (0x4E, 0x79, false, "MV Graveyard Darmani", MOUNTAIN_VILLAGE_DARMANI, GORON_MASK, {Category::cMountainVillage, Category::cTransformMask,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_MOUNTAIN_VILLAGE ); 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 ); @@ -173,8 +173,8 @@ void LocationTable_Init() { //Southern Swamp locationTable[SOUTHERN_SWAMP_KOUME] = ItemLocation::Base (0x57, 0x43, false, "SS Koume", SOUTHERN_SWAMP_KOUME, PICTOGRAPH_BOX, {Category::cSouthernSwamp,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); - locationTable[SOUTHERN_SWAMP_KOTAKE] = ItemLocation::Base (0x0A, 0x59, false, "SS Kotake", SOUTHERN_SWAMP_KOTAKE, BOTTLE_WITH_RED_POTION, {Category::cSouthernSwamp,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); - locationTable[SOUTHERN_SWAMP_KOTAKE_IN_WOODS] = ItemLocation::Base (0x64, 0x59, false, "SS Mystery Woods Kotake", SOUTHERN_SWAMP_KOTAKE_IN_WOODS, BOTTLE_WITH_RED_POTION, {Category::cSouthernSwamp,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); + locationTable[SOUTHERN_SWAMP_KOTAKE] = ItemLocation::Base (0x0A, 0x59, false, "SS Kotake", SOUTHERN_SWAMP_KOTAKE, BOTTLE_WITH_RED_POTION, {Category::cSouthernSwamp,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); + locationTable[SOUTHERN_SWAMP_KOTAKE_IN_WOODS] = ItemLocation::Base (0x64, 0x59, false, "SS Mystery Woods Kotake", SOUTHERN_SWAMP_KOTAKE_IN_WOODS, BOTTLE_WITH_RED_POTION, {Category::cSouthernSwamp,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); locationTable[SOUTHERN_SWAMP_SCRUB_TRADE] = ItemLocation::Base (0x45, 0x98, true, "SS Deku Scrub Merchant Trade", SOUTHERN_SWAMP_SCRUB_TRADE, SWAMP_TITLE, {Category::cSouthernSwamp, Category::cDekuScrub,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); locationTable[SOUTHERN_SWAMP_PICTOGRAPH_WINNER] = ItemLocation::Base (0x57, 0xBA, false, "SS Pictograph Contest Winner", SOUTHERN_SWAMP_PICTOGRAPH_WINNER, PIECE_OF_HEART, {Category::cSouthernSwamp, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); locationTable[SOUTHERN_SWAMP_BOAT_ARCHERY] = ItemLocation::Base (0x57, 0x5A, false, "SS Boat Archery", SOUTHERN_SWAMP_BOAT_ARCHERY, EMPTY_BOTTLE2, {Category::cSouthernSwamp, Category::cMinigame, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); @@ -227,10 +227,10 @@ void LocationTable_Init() { //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 ); - locationTable[W_CLOCK_TOWN_POSTMANS_GAME] = ItemLocation::Base (0x2E, 0x0C, false, "WCT Postman's Game", W_CLOCK_TOWN_POSTMANS_GAME, PIECE_OF_HEART, {Category::cWestClockTown, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); - locationTable[W_CLOCK_TOWN_ROSA_SISTERS] = ItemLocation::Base (0x6D, 0x0C, false, "WCT Rosa Sisters", W_CLOCK_TOWN_ROSA_SISTERS, PIECE_OF_HEART, {Category::cWestClockTown, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); - locationTable[W_CLOCK_TOWN_SWORDSMANS_SCHOOL] = ItemLocation::Base (0x54, 0x0C, false, "WCT Swordsman's School", W_CLOCK_TOWN_SWORDSMANS_SCHOOL, PIECE_OF_HEART, {Category::cWestClockTown, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); - locationTable[W_CLOCK_TOWN_ALL_NIGHT_MASK_BUY] = ItemLocation::Base (0x0D, 0x7E, false, "WCT All-Night Mask Purchase", W_CLOCK_TOWN_ALL_NIGHT_MASK_BUY, ALL_NIGHT_MASK, {Category::cWestClockTown, Category::cVanillaMask,Category::cDayThree}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); + locationTable[W_CLOCK_TOWN_POSTMANS_GAME] = ItemLocation::Base (0x2E, 0x0C, false, "WCT Postman's Game", W_CLOCK_TOWN_POSTMANS_GAME, PIECE_OF_HEART, {Category::cWestClockTown, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); + locationTable[W_CLOCK_TOWN_ROSA_SISTERS] = ItemLocation::Base (0x6D, 0x0C, false, "WCT Rosa Sisters", W_CLOCK_TOWN_ROSA_SISTERS, PIECE_OF_HEART, {Category::cWestClockTown, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); + locationTable[W_CLOCK_TOWN_SWORDSMANS_SCHOOL] = ItemLocation::Base (0x54, 0x0C, false, "WCT Swordsman's School", W_CLOCK_TOWN_SWORDSMANS_SCHOOL, PIECE_OF_HEART, {Category::cWestClockTown, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); + locationTable[W_CLOCK_TOWN_ALL_NIGHT_MASK_BUY] = ItemLocation::Base (0x0D, 0x7E, false, "WCT All-Night Mask Purchase", W_CLOCK_TOWN_ALL_NIGHT_MASK_BUY, ALL_NIGHT_MASK, {Category::cWestClockTown, Category::cVanillaMask,Category::cDayThree}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); //locationTable[W_CLOCK_TOWN_LOTTERY] = ItemLocation::Base (0x39, 0x00, true, "WCT Lottery", W_CLOCK_TOWN_LOTTERY, PURPLE_RUPEE, {Category::cWestClockTown}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); locationTable[W_CLOCK_TOWN_BOMB_SHOP_GORON] = ItemLocation::Base (0x0D, 0x34, true, "WCT Bomb Shop Goron", W_CLOCK_TOWN_BOMB_SHOP_GORON, POWDER_KEG, {Category::cWestClockTown, Category::cMerchant,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); @@ -242,8 +242,8 @@ void LocationTable_Init() { //Zora Cape locationTable[ZORA_CAPE_GREAT_FAIRY] = ItemLocation::Base (0x26, 0xB2, false, "ZC Great Fairy", ZORA_CAPE_GREAT_FAIRY, DOUBLE_DEFENSE, {Category::cZoraCape,Category::cFairyFountain,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_CAPE ); - locationTable[ZORA_CAPE_BEAVER_RACE_1] = ItemLocation::Base (0x4A, 0x5A, false, "ZC Beaver Race 1", ZORA_CAPE_BEAVER_RACE_1, EMPTY_BOTTLE1, {Category::cZoraCape,Category::cMinigame,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_CAPE ); - locationTable[ZORA_CAPE_BEAVER_RACE_2] = ItemLocation::Base (0x4A, 0x0C, false, "ZC Beaver Race 2", ZORA_CAPE_BEAVER_RACE_2, PIECE_OF_HEART, {Category::cZoraCape,Category::cMinigame, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_CAPE ); + locationTable[ZORA_CAPE_BEAVER_RACE_1] = ItemLocation::Base (0x4A, 0x5A, false, "ZC Beaver Race 1", ZORA_CAPE_BEAVER_RACE_1, EMPTY_BOTTLE1, {Category::cZoraCape,Category::cMinigame,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_CAPE ); + locationTable[ZORA_CAPE_BEAVER_RACE_2] = ItemLocation::Base (0x4A, 0x0C, false, "ZC Beaver Race 2", ZORA_CAPE_BEAVER_RACE_2, PIECE_OF_HEART, {Category::cZoraCape,Category::cMinigame, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_CAPE ); locationTable[ZORA_CAPE_LIKE_LIKE] = ItemLocation::Collectable(0x38, 0x00, false, "ZC Like Like HP", ZORA_CAPE_LIKE_LIKE, PIECE_OF_HEART, {Category::cZoraCape, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_ZORA_CAPE ); locationTable[ZORA_CAPE_LEDGE_NO_TREE] = ItemLocation::Chest (0x38, 0x01, true, "ZC Ledge Without Tree Chest", ZORA_CAPE_LEDGE_NO_TREE, RED_RUPEE, {Category::cZoraCape,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_ZORA_CAPE ); locationTable[ZORA_CAPE_LEDGE_WITH_TREE] = ItemLocation::Chest (0x38, 0x02, true, "ZC Ledge With Tree Chest", ZORA_CAPE_LEDGE_WITH_TREE, RED_RUPEE, {Category::cZoraCape,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_ZORA_CAPE ); @@ -252,7 +252,7 @@ void LocationTable_Init() { //Zora Hall locationTable[ZORA_HALL_SCRUB_TRADE] = ItemLocation::Base (0x4C, 0x9A, true, "ZH Deku Scrub Merchant Trade", ZORA_HALL_SCRUB_TRADE, OCEAN_TITLE, {Category::cZoraHall, Category::cDekuScrub,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_HALL ); - locationTable[ZORA_HALL_EVAN] = ItemLocation::Base (0x4C, 0x0C, false, "ZH Deku Evan", ZORA_HALL_EVAN, PIECE_OF_HEART, {Category::cZoraHall, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_HALL ); + locationTable[ZORA_HALL_EVAN] = ItemLocation::Base (0x4C, 0x0C, false, "ZH Evan", ZORA_HALL_EVAN, PIECE_OF_HEART, {Category::cZoraHall, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_HALL ); locationTable[ZORA_HALL_LULU_ROOM_LEDGE] = ItemLocation::Collectable(0x4C, 0x00, false, "ZH Lulu's Room Ledge", ZORA_HALL_LULU_ROOM_LEDGE, PIECE_OF_HEART, {Category::cZoraHall, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_ZORA_HALL ); locationTable[ZORA_HALL_SCRUB_PURCHASE] = ItemLocation::Base (0x4C, 0x5C, true, "ZH Deku Scrub Merchant Purchase", ZORA_HALL_SCRUB_PURCHASE, GREEN_POTION_REFILL, {Category::cZoraHall, Category::cDekuScrub,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_HALL ); //locationTable[ZORA_HALL_STAGE_LIGHTS] = ItemLocation::Base (0x33, 0x00, true, "ZH Stage Lights", ZORA_HALL_STAGE_LIGHTS, BLUE_RUPEE, {Category::cZoraHall}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_HALL ); diff --git a/source/location_access.cpp b/source/location_access.cpp index 1bbe381..560a44f 100644 --- a/source/location_access.cpp +++ b/source/location_access.cpp @@ -2129,7 +2129,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(WOODFALL_TEMPLE_DEKU_PRINCESS, {[]{return AnyBottle;}}), + LocationAccess(WOODFALL_TEMPLE_DEKU_PRINCESS, {[]{return AnyBottle && AnySword;}}), }, { //Exits diff --git a/source/settings.cpp b/source/settings.cpp index c198451..aaa6da8 100644 --- a/source/settings.cpp +++ b/source/settings.cpp @@ -1061,7 +1061,11 @@ namespace Settings { break; case 1: startingInventoryOptions[i]->Hide(); - startingInventoryOptions[i]->SetSelectedIndex((startingInventoryOptions[i]->GetOptionCount())-1); + if (startingInventorySections.GetName() == "Equipment & Upgrades") { + startingInventoryOptions[i]->SetSelectedIndex((startingInventoryOptions[i]->GetOptionCount())-2); + } else { + startingInventoryOptions[i]->SetSelectedIndex((startingInventoryOptions[i]->GetOptionCount())-1); + } break; case 2: startingInventoryOptions[i]->Unhide(); @@ -1208,7 +1212,7 @@ namespace Settings { CollapseCategory(StartingSongsToggle, 51, 60); CollapseCategory(StartingUpgradesToggle, 61, 67); CollapseCategory(StartingQuestToggle, 68, 72); - for(int i = 14; i < 21 ;++i){ + for(int i = 18; i < 25 ;++i) { switch(StartingInventoryToggle.Value()) { case 0: startingInventoryOptions[i]->Hide(); From 86b15a2f4d30e80491c684e12621c31266b4f302 Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sun, 11 Feb 2024 09:40:29 -0600 Subject: [PATCH 07/47] v1.2.1 Bug Fixes - Adds locations & overrides for Cleared Southern Swamp Tourist Center Roof HP and Business Scrub Trade and Purchase. - Adjusts overrides for vanilla bottle locations so they don't get Anju and Kafei items due to issues with repeating checks giving bottle refills instead of the item again - Adjusts Keaton check override flags - Adjusts Banker reward 2 override flag - Removes Tingle Maps from being added to pool when Dungeon Maps/Compasses is set to anything except vanilla - Adjusts All Night Mask Purchase to require 2 wallets - Adjusts spoiler log to reveal Anju and Kafei items when set to vanilla - Adjusts Anju and Kafei Shuffle, when set to Vanilla the Kafei's Mask and Couples' Mask will now be vanilla instead of randomized (previously depended on if shuffle masks was set to random) --- source/hint_list.cpp | 3 +++ source/include/keys.hpp | 3 +++ source/item_location.cpp | 37 ++++++++++++++++++++++++------------ source/item_pool.cpp | 17 +++++++++-------- source/location_access.cpp | 5 ++++- source/spoiler_log.cpp | 39 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 83 insertions(+), 21 deletions(-) diff --git a/source/hint_list.cpp b/source/hint_list.cpp index 003f18e..5331783 100644 --- a/source/hint_list.cpp +++ b/source/hint_list.cpp @@ -405,6 +405,9 @@ void HintTable_Init() { //hintTable[SOUTHERN_SWAMP_PICTOGRAPH_STANDARD] = HintText::Sometimes({Text{"", "", ""}}); //hintTable[SOUTHERN_SWAMP_PICTOGRAPH_GOOD] = HintText::Sometimes({Text{"", "", ""}}); hintTable[SOUTHERN_SWAMP_SCRUB_PURCHASE] = HintText::Sometimes({Text{"a southern merchant sells", "", ""}}); + hintTable[SOUTHERN_SWAMP_SCRUB_PURCHASE_CLEAR] = HintText::Sometimes({Text{"a southern merchant sells", "", ""}}); + hintTable[SOUTHERN_SWAMP_SCRUB_TRADE_CLEAR] = HintText::Sometimes({Text{"a southern merchant trades", "", ""}}); + hintTable[SWAMP_TOURIST_CENTER_ROOF_CLEAR] = HintText::Sometimes({Text{"a tourist center contains", "", ""}}); hintTable[POTION_SHOP_ITEM_1] = HintText::Sometimes({Text{"a potion maker sells", "", ""}}); hintTable[POTION_SHOP_ITEM_2] = HintText::Sometimes({Text{"a potion maker sells", "", ""}}); hintTable[POTION_SHOP_ITEM_3] = HintText::Sometimes({Text{"a potion maker sells", "", ""}}); diff --git a/source/include/keys.hpp b/source/include/keys.hpp index 23a9449..d1cab97 100644 --- a/source/include/keys.hpp +++ b/source/include/keys.hpp @@ -412,6 +412,9 @@ typedef enum { SOUTHERN_SWAMP_PICTOGRAPH_STANDARD, SOUTHERN_SWAMP_PICTOGRAPH_GOOD, SOUTHERN_SWAMP_SCRUB_PURCHASE, + SOUTHERN_SWAMP_SCRUB_PURCHASE_CLEAR, + SOUTHERN_SWAMP_SCRUB_TRADE_CLEAR, + SWAMP_TOURIST_CENTER_ROOF_CLEAR, POTION_SHOP_ITEM_1, POTION_SHOP_ITEM_2, POTION_SHOP_ITEM_3, diff --git a/source/item_location.cpp b/source/item_location.cpp index b55fa5e..fb74090 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -76,7 +76,7 @@ void LocationTable_Init() { 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 ); locationTable[GBC_GROTTO_CHEST] = ItemLocation::Chest (0x07, 0x17, true, "GBC Grotto Chest", GREAT_BAY_COAST_GROTTO, RED_RUPEE, {Category::cGreatBayCoast,Category::cGrotto,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_GREAT_BAY_COAST ); - locationTable[GBC_FISHERMAN_PHOTO] = ItemLocation::Base (0x3C, 0x95, false, "GBC Fisherman Photo", GBC_FISHERMAN_PHOTO, SEAHORSE, {Category::cGreatBayCoast,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GREAT_BAY_COAST ); + locationTable[GBC_FISHERMAN_PHOTO] = ItemLocation::Base (0x3C, 0x95, false, "GBC Fisherman Photo", GBC_FISHERMAN_PHOTO, SEAHORSE, {Category::cGreatBayCoast}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GREAT_BAY_COAST ); //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 ); @@ -104,8 +104,8 @@ void LocationTable_Init() { //Milk Road 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, 0x01, false, "MR Keaton Quiz", MILK_ROAD_KEATON_QUIZ, PIECE_OF_HEART, {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}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_MILK_ROAD ); + locationTable[MILK_ROAD_KEATON_QUIZ] = ItemLocation::Base (0x22, 0x03, 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 Razor Sword", MOUNTAIN_VILLAGE_SMITH_DAY_ONE, RAZOR_SWORD, {Category::cMountainVillage,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_MOUNTAIN_VILLAGE ); @@ -115,12 +115,12 @@ 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 ); + locationTable[MOUNTAIN_VILLAGE_KEATON_QUIZ] = ItemLocation::Base (0x5A, 0x03, 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 ); - 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_KEATON_QUIZ] = ItemLocation::Base (0x6E, 0x03, 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 ); @@ -151,7 +151,7 @@ void LocationTable_Init() { locationTable[ROAD_TO_SWAMP_GROTTO_CHEST] = ItemLocation::Chest (0x07, 0x1E, true, "Road to Southern Swamp Grotto", ROAD_TO_SWAMP_GROTTO_CHEST, RED_RUPEE, {Category::cRoadToSouthernSwamp,Category::cGrotto, Category::cChest,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); //Romani Ranch - locationTable[ROMANI_RANCH_ALIEN_DEFENSE] = ItemLocation::Base (0x35, 0x60, true, "RR Alien Defense", ROMANI_RANCH_ALIEN_DEFENSE, BOTTLE_WITH_MILK, {Category::cRomaniRanch,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ROMANI_RANCH ); + locationTable[ROMANI_RANCH_ALIEN_DEFENSE] = ItemLocation::Base (0x35, 0x60, true, "RR Alien Defense", ROMANI_RANCH_ALIEN_DEFENSE, BOTTLE_WITH_MILK, {Category::cRomaniRanch}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ROMANI_RANCH ); locationTable[ROMANI_RANCH_DOG_RACE] = ItemLocation::Base (0x41, 0x0C, false, "RR Dog Race", ROMANI_RANCH_DOG_RACE, PIECE_OF_HEART, {Category::cRomaniRanch,Category::cMinigame, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ROMANI_RANCH ); locationTable[ROMANI_RANCH_GROG] = ItemLocation::Base (0x42, 0x7F, false, "RR Grog", ROMANI_RANCH_GROG, BUNNY_HOOD, {Category::cRomaniRanch, Category::cVanillaMask,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ROMANI_RANCH ); locationTable[ROMANI_RANCH_CREMIA_ESCORT] = ItemLocation::Base (0x2D, 0x82, true, "RR Cremia Escort", ROMANI_RANCH_CREMIA_ESCORT, ROMANIS_MASK, {Category::cRomaniRanch, Category::cVanillaMask,Category::cDayTwo}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ROMANI_RANCH ); @@ -165,7 +165,7 @@ void LocationTable_Init() { locationTable[S_CLOCK_TOWN_STRAW_ROOF_CHEST] = ItemLocation::Chest (0x6F, 0x00, true, "SCT Straw Roof Chest", S_CLOCK_TOWN_STRAW_ROOF_CHEST, RED_RUPEE, {Category::cSouthClockTown,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_S_CLOCK_TOWN ); locationTable[S_CLOCK_TOWN_FINAL_DAY_CHEST] = ItemLocation::Chest (0x6F, 0x01, true, "SCT Final Day Chest", S_CLOCK_TOWN_FINAL_DAY_CHEST, PURPLE_RUPEE, {Category::cSouthClockTown,Category::cChest ,Category::cDayThree}, SpoilerCollectionCheckGroup::GROUP_S_CLOCK_TOWN ); locationTable[S_CLOCK_TOWN_BANK_REWARD_1] = ItemLocation::Base (0x6F, 0x48, false, "SCT Bank Reward 1", S_CLOCK_TOWN_BANK_REWARD_1, PROGRESSIVE_WALLET, {Category::cSouthClockTown,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_S_CLOCK_TOWN ); - locationTable[S_CLOCK_TOWN_BANK_REWARD_2] = ItemLocation::Base (0x6F, 0x02, false, "SCT Bank Reward 2", S_CLOCK_TOWN_BANK_REWARD_2, BLUE_RUPEE, {Category::cSouthClockTown,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_S_CLOCK_TOWN ); + locationTable[S_CLOCK_TOWN_BANK_REWARD_2] = ItemLocation::Base (0x6F, 0x03, false, "SCT Bank Reward 2", S_CLOCK_TOWN_BANK_REWARD_2, BLUE_RUPEE, {Category::cSouthClockTown,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_S_CLOCK_TOWN ); locationTable[S_CLOCK_TOWN_BANK_REWARD_3] = ItemLocation::Base (0x6F, 0x0C, false, "SCT Bank Reward 3", S_CLOCK_TOWN_BANK_REWARD_3, PIECE_OF_HEART, {Category::cSouthClockTown, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_S_CLOCK_TOWN ); //Snowhead @@ -173,11 +173,11 @@ void LocationTable_Init() { //Southern Swamp locationTable[SOUTHERN_SWAMP_KOUME] = ItemLocation::Base (0x57, 0x43, false, "SS Koume", SOUTHERN_SWAMP_KOUME, PICTOGRAPH_BOX, {Category::cSouthernSwamp,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); - locationTable[SOUTHERN_SWAMP_KOTAKE] = ItemLocation::Base (0x0A, 0x59, false, "SS Kotake", SOUTHERN_SWAMP_KOTAKE, BOTTLE_WITH_RED_POTION, {Category::cSouthernSwamp,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); - locationTable[SOUTHERN_SWAMP_KOTAKE_IN_WOODS] = ItemLocation::Base (0x64, 0x59, false, "SS Mystery Woods Kotake", SOUTHERN_SWAMP_KOTAKE_IN_WOODS, BOTTLE_WITH_RED_POTION, {Category::cSouthernSwamp,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); + locationTable[SOUTHERN_SWAMP_KOTAKE] = ItemLocation::Base (0x0A, 0x59, false, "SS Kotake", SOUTHERN_SWAMP_KOTAKE, BOTTLE_WITH_RED_POTION, {Category::cSouthernSwamp}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); + locationTable[SOUTHERN_SWAMP_KOTAKE_IN_WOODS] = ItemLocation::Base (0x64, 0x59, false, "SS Mystery Woods Kotake", SOUTHERN_SWAMP_KOTAKE_IN_WOODS, BOTTLE_WITH_RED_POTION, {Category::cSouthernSwamp}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); locationTable[SOUTHERN_SWAMP_SCRUB_TRADE] = ItemLocation::Base (0x45, 0x98, true, "SS Deku Scrub Merchant Trade", SOUTHERN_SWAMP_SCRUB_TRADE, SWAMP_TITLE, {Category::cSouthernSwamp, Category::cDekuScrub,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); locationTable[SOUTHERN_SWAMP_PICTOGRAPH_WINNER] = ItemLocation::Base (0x57, 0xBA, false, "SS Pictograph Contest Winner", SOUTHERN_SWAMP_PICTOGRAPH_WINNER, PIECE_OF_HEART, {Category::cSouthernSwamp, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); - locationTable[SOUTHERN_SWAMP_BOAT_ARCHERY] = ItemLocation::Base (0x57, 0x5A, false, "SS Boat Archery", SOUTHERN_SWAMP_BOAT_ARCHERY, EMPTY_BOTTLE2, {Category::cSouthernSwamp, Category::cMinigame, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); + locationTable[SOUTHERN_SWAMP_BOAT_ARCHERY] = ItemLocation::Base (0x57, 0x5A, false, "SS Boat Archery", SOUTHERN_SWAMP_BOAT_ARCHERY, EMPTY_BOTTLE2, {Category::cSouthernSwamp, Category::cMinigame, Category::cVanillaHeartPiece}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); locationTable[SWAMP_TOURIST_CENTER_ROOF] = ItemLocation::Collectable(0x45, 0x00, false, "SS Tourist Center Roof", SWAMP_TOURIST_CENTER_ROOF, PIECE_OF_HEART, {Category::cSouthernSwamp, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); locationTable[SOUTHERN_SWAMP_SPIDER_HOUSE_REWARD] = ItemLocation::Base (0x27, 0x8A, false, "SSH Reward", SOUTHERN_SWAMP_SPIDER_HOUSE_REWARD, MASK_OF_TRUTH, {Category::cSouthernSwamp, Category::cVanillaMask,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); locationTable[SOUTHERN_SWAMP_MUSIC_STATUE] = ItemLocation::Base (0x45, 0x72, false, "SS Music Statue", SOUTHERN_SWAMP_MUSIC_STATUE, SONG_OF_SOARING, {Category::cSouthernSwamp, Category::cSong,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); @@ -187,6 +187,9 @@ void LocationTable_Init() { //locationTable[SOUTHERN_SWAMP_PICTOGRAPH_STANDARD] = ItemLocation::Base (0x0A, 0x00, true, "SS Pictograph Standard", SOUTHERN_SWAMP_PICTOGRAPH_STANDARD, BLUE_RUPEE, {Category::cSouthernSwamp, Category::cMinigame}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); //locationTable[SOUTHERN_SWAMP_PICTOGRAPH_GOOD] = ItemLocation::Base (0x0A, 0x00, true, "SS Pictograph Good", SOUTHERN_SWAMP_PICTOGRAPH_GOOD, RED_RUPEE, {Category::cSouthernSwamp,Category::cMinigame}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); locationTable[SOUTHERN_SWAMP_SCRUB_PURCHASE] = ItemLocation::Base (0x45, 0x35, true, "SS Deku Scrub Merchant Purchase", SOUTHERN_SWAMP_SCRUB_PURCHASE, MAGIC_BEAN, {Category::cSouthernSwamp, Category::cDekuScrub,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); + locationTable[SOUTHERN_SWAMP_SCRUB_PURCHASE_CLEAR] = ItemLocation::Base (0x00, 0x35, true, "SS Deku Scrub Merchant Purchase (Cleared)", SOUTHERN_SWAMP_SCRUB_PURCHASE_CLEAR, MAGIC_BEAN, {Category::cSouthernSwamp, Category::cDekuScrub,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); + locationTable[SWAMP_TOURIST_CENTER_ROOF_CLEAR] = ItemLocation::Collectable(0x00, 0x00, false, "SS Tourist Center Roof (Cleared)", SWAMP_TOURIST_CENTER_ROOF_CLEAR, PIECE_OF_HEART, {Category::cSouthernSwamp, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); + locationTable[SOUTHERN_SWAMP_SCRUB_TRADE_CLEAR] = ItemLocation::Base (0x00, 0x98, true, "SS Deku Scrub Merchant Trade (Cleared)", SOUTHERN_SWAMP_SCRUB_TRADE_CLEAR, SWAMP_TITLE, {Category::cSouthernSwamp, Category::cDekuScrub,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); //Stock Pot Inn locationTable[STOCKPOTINN_RESERVATION] = ItemLocation::Base (0x61, 0xA0, true, "SPI Reservation", STOCKPOTINN_RESERVATION, ROOM_KEY, {Category::cStockPotInn,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_STOCKPOTINN ); @@ -219,7 +222,7 @@ void LocationTable_Init() { //Twin Islands locationTable[HOT_SPRING_WATER_GROTTO_CHEST] = ItemLocation::Chest (0x07, 0x02, true, "TI Hot Spring Water Grotto Chest", HOT_SPRING_WATER_GROTTO_CHEST, RED_RUPEE, {Category::cTwinIslands, Category::cGrotto,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_TWIN_ISLANDS ); - locationTable[TWIN_ISLANDS_GORON_RACE] = ItemLocation::Base (0x6B, 0x6A, true, "TI Goron Racetrack Race", TWIN_ISLANDS_GORON_RACE, GOLD_DUST, {Category::cTwinIslands,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_TWIN_ISLANDS ); + locationTable[TWIN_ISLANDS_GORON_RACE] = ItemLocation::Base (0x6B, 0x6A, true, "TI Goron Racetrack Race", TWIN_ISLANDS_GORON_RACE, GOLD_DUST, {Category::cTwinIslands}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_TWIN_ISLANDS ); 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 ); @@ -242,7 +245,7 @@ void LocationTable_Init() { //Zora Cape locationTable[ZORA_CAPE_GREAT_FAIRY] = ItemLocation::Base (0x26, 0xB2, false, "ZC Great Fairy", ZORA_CAPE_GREAT_FAIRY, DOUBLE_DEFENSE, {Category::cZoraCape,Category::cFairyFountain,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_CAPE ); - locationTable[ZORA_CAPE_BEAVER_RACE_1] = ItemLocation::Base (0x4A, 0x5A, false, "ZC Beaver Race 1", ZORA_CAPE_BEAVER_RACE_1, EMPTY_BOTTLE1, {Category::cZoraCape,Category::cMinigame,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_CAPE ); + locationTable[ZORA_CAPE_BEAVER_RACE_1] = ItemLocation::Base (0x4A, 0x5A, false, "ZC Beaver Race 1", ZORA_CAPE_BEAVER_RACE_1, EMPTY_BOTTLE1, {Category::cZoraCape,Category::cMinigame}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_CAPE ); locationTable[ZORA_CAPE_BEAVER_RACE_2] = ItemLocation::Base (0x4A, 0x0C, false, "ZC Beaver Race 2", ZORA_CAPE_BEAVER_RACE_2, PIECE_OF_HEART, {Category::cZoraCape,Category::cMinigame, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_CAPE ); locationTable[ZORA_CAPE_LIKE_LIKE] = ItemLocation::Collectable(0x38, 0x00, false, "ZC Like Like HP", ZORA_CAPE_LIKE_LIKE, PIECE_OF_HEART, {Category::cZoraCape, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_ZORA_CAPE ); locationTable[ZORA_CAPE_LEDGE_NO_TREE] = ItemLocation::Chest (0x38, 0x01, true, "ZC Ledge Without Tree Chest", ZORA_CAPE_LEDGE_NO_TREE, RED_RUPEE, {Category::cZoraCape,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_ZORA_CAPE ); @@ -952,6 +955,9 @@ std::vector overworldLocations = { //SOUTHERN_SWAMP_PICTOGRAPH_STANDARD, //SOUTHERN_SWAMP_PICTOGRAPH_GOOD, SOUTHERN_SWAMP_SCRUB_PURCHASE, + SOUTHERN_SWAMP_SCRUB_PURCHASE_CLEAR, + SOUTHERN_SWAMP_SCRUB_TRADE_CLEAR, + SWAMP_TOURIST_CENTER_ROOF_CLEAR, POTION_SHOP_ITEM_1, POTION_SHOP_ITEM_2, POTION_SHOP_ITEM_3, @@ -1210,6 +1216,13 @@ void CreateItemOverrides() { PlaceItemInLocation(GORON_VILLAGE_SCRUB_PURCHASE_SPRING, loc16->GetPlacedItemKey()); PlaceItemInLocation(GORON_VILLAGE_SCRUB_TRADE_SPRING, loc17->GetPlacedItemKey()); PlaceItemInLocation(GORON_VILLAGE_LEDGE_SPRING, loc18->GetPlacedItemKey()); + //Cleared Southern Swamp + auto loc19 = Location(SOUTHERN_SWAMP_SCRUB_PURCHASE); + auto loc20 = Location(SOUTHERN_SWAMP_SCRUB_TRADE); + auto loc21 = Location(SWAMP_TOURIST_CENTER_ROOF); + PlaceItemInLocation(SOUTHERN_SWAMP_SCRUB_PURCHASE_CLEAR, loc19->GetPlacedItemKey()); + PlaceItemInLocation(SOUTHERN_SWAMP_SCRUB_TRADE_CLEAR, loc20->GetPlacedItemKey()); + PlaceItemInLocation(SWAMP_TOURIST_CENTER_ROOF_CLEAR, loc21->GetPlacedItemKey()); for (LocationKey locKey : allLocations) { auto loc = Location(locKey); diff --git a/source/item_pool.cpp b/source/item_pool.cpp index a73e920..b76b1e1 100644 --- a/source/item_pool.cpp +++ b/source/item_pool.cpp @@ -909,7 +909,9 @@ void GenerateItemPool() { PlaceItemInLocation(GORON_VILLAGE_SCRUB_PURCHASE_SPRING, BLUE_RUPEE); PlaceItemInLocation(GORON_VILLAGE_SCRUB_TRADE_SPRING, BLUE_RUPEE); PlaceItemInLocation(GORON_VILLAGE_LEDGE_SPRING, BLUE_RUPEE); - + PlaceItemInLocation(SOUTHERN_SWAMP_SCRUB_PURCHASE_CLEAR, BLUE_RUPEE); + PlaceItemInLocation(SOUTHERN_SWAMP_SCRUB_TRADE_CLEAR, BLUE_RUPEE); + PlaceItemInLocation(SWAMP_TOURIST_CENTER_ROOF_CLEAR, BLUE_RUPEE); //Check Non Dungeon Settings //KOKIRISWORD SHUFFLE @@ -1102,14 +1104,14 @@ void GenerateItemPool() { if (ShuffleTradeItems){//TradeItems refers to Anju&Kafei Items AddItemsToPool(ItemPool, anjuKafeiTradeItems); } else { - if(ShuffleMasks){ - AddItemToMainPool(KAFEIS_MASK); - AddItemToMainPool(COUPLES_MASK); - } - else{ + //if(ShuffleMasks){ //-Kafei & Couples Mask part of A&K not masks + // AddItemToMainPool(KAFEIS_MASK); + // AddItemToMainPool(COUPLES_MASK); + //} + //else{ PlaceItemInLocation(E_CLOCK_TOWN_AROMA_IN_OFFICE, KAFEIS_MASK); PlaceItemInLocation(STOCKPOTINN_ANJU_AND_KAFEI, COUPLES_MASK); - } + //} PlaceItemInLocation(STOCKPOTINN_MIDNIGHT_MEETING, LETTER_KAFEI); PlaceItemInLocation(LAUNDRY_POOL_CURIOSITY_SHOP_MAN_TWO, LETTER_MAMA); PlaceItemInLocation(STOCKPOTINN_RESERVATION, ROOM_KEY); @@ -1199,7 +1201,6 @@ void GenerateItemPool() { AddItemToMainPool(dungeon->GetCompass()); } } - AddItemsToPool(ItemPool, tingleMaps); } if (Keysanity.Is(KeysanitySetting::KEYSANITY_VANILLA)) { diff --git a/source/location_access.cpp b/source/location_access.cpp index 560a44f..ad1f971 100644 --- a/source/location_access.cpp +++ b/source/location_access.cpp @@ -524,7 +524,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(W_CLOCK_TOWN_ALL_NIGHT_MASK_BUY, {[] {return AnyWallet;}}), + LocationAccess(W_CLOCK_TOWN_ALL_NIGHT_MASK_BUY, {[] {return (ProgressiveWallet >= 2);}}), }, { //Exits @@ -818,6 +818,9 @@ void AreaTable_Init() { LocationAccess(SOUTHERN_SWAMP_SCRUB_PURCHASE, {[]{return DekuMask;}}), LocationAccess(SOUTHERN_SWAMP_MUSIC_STATUE, {[] {return true;}}), LocationAccess(SWAMP_TOURIST_CENTER_ROOF, {[] {return DekuMask && LandTitle;}}), + LocationAccess(SOUTHERN_SWAMP_SCRUB_TRADE_CLEAR, {[] {return LandTitle && WoodfallClear;}}), + LocationAccess(SOUTHERN_SWAMP_SCRUB_PURCHASE_CLEAR, {[]{return DekuMask && WoodfallClear;}}), + LocationAccess(SWAMP_TOURIST_CENTER_ROOF_CLEAR, {[] {return DekuMask && LandTitle && WoodfallClear;}}), //Gossip Stones LocationAccess(SS_GOSSIP, {[] {return true;}}), }, diff --git a/source/spoiler_log.cpp b/source/spoiler_log.cpp index b952364..dedc200 100644 --- a/source/spoiler_log.cpp +++ b/source/spoiler_log.cpp @@ -283,10 +283,12 @@ static void WriteIngameSpoilerLog() { spoilerData.ItemLocations[spoilerItemIndex].RevealType = REVEALTYPE_ALWAYS; spoilerData.ItemLocations[spoilerItemIndex].CollectionCheckType = SPOILER_CHK_ALWAYS_COLLECTED; } + //Set Repeatable locations CollectType(Used for changing color in spoiler log) if (Location(key)->IsRepeatable()) { spoilerData.ItemLocations[spoilerItemIndex].CollectType = COLLECTTYPE_REPEATABLE; } + //If Starting with Song of Healing reveal Deku Mask and Bombers Notebook as they're unobtainable and junk if (key == HMS_DEKU_MASK && Settings::StartingSongOfHealing.Value() == u8(1)) { spoilerData.ItemLocations[spoilerItemIndex].CollectType = COLLECTTYPE_NEVER; @@ -299,6 +301,43 @@ static void WriteIngameSpoilerLog() { spoilerData.ItemLocations[spoilerItemIndex].RevealType = REVEALTYPE_ALWAYS; spoilerData.ItemLocations[spoilerItemIndex].CollectionCheckType = SPOILER_CHK_ALWAYS_COLLECTED; } + //If !ShuffleTradeItems Show Anju and Kafei Items in default locations + if (key == E_CLOCK_TOWN_AROMA_IN_OFFICE && (Settings::ShuffleTradeItems.Value() == false)) + { + spoilerData.ItemLocations[spoilerItemIndex].CollectType = COLLECTTYPE_NEVER; + spoilerData.ItemLocations[spoilerItemIndex].RevealType = REVEALTYPE_ALWAYS; + spoilerData.ItemLocations[spoilerItemIndex].CollectionCheckType = SPOILER_CHK_ALWAYS_COLLECTED; + } + if (key == STOCKPOTINN_ANJU_AND_KAFEI && (Settings::ShuffleTradeItems.Value() == false)) + { + spoilerData.ItemLocations[spoilerItemIndex].CollectType = COLLECTTYPE_NEVER; + spoilerData.ItemLocations[spoilerItemIndex].RevealType = REVEALTYPE_ALWAYS; + spoilerData.ItemLocations[spoilerItemIndex].CollectionCheckType = SPOILER_CHK_ALWAYS_COLLECTED; + } + if (key == STOCKPOTINN_MIDNIGHT_MEETING && (Settings::ShuffleTradeItems.Value() == false)) + { + spoilerData.ItemLocations[spoilerItemIndex].CollectType = COLLECTTYPE_NEVER; + spoilerData.ItemLocations[spoilerItemIndex].RevealType = REVEALTYPE_ALWAYS; + spoilerData.ItemLocations[spoilerItemIndex].CollectionCheckType = SPOILER_CHK_ALWAYS_COLLECTED; + } + if (key == STOCKPOTINN_RESERVATION && (Settings::ShuffleTradeItems.Value() == false)) + { + spoilerData.ItemLocations[spoilerItemIndex].CollectType = COLLECTTYPE_NEVER; + spoilerData.ItemLocations[spoilerItemIndex].RevealType = REVEALTYPE_ALWAYS; + spoilerData.ItemLocations[spoilerItemIndex].CollectionCheckType = SPOILER_CHK_ALWAYS_COLLECTED; + } + if (key == LAUNDRY_POOL_KAFEI && (Settings::ShuffleTradeItems.Value() == false)) + { + spoilerData.ItemLocations[spoilerItemIndex].CollectType = COLLECTTYPE_NEVER; + spoilerData.ItemLocations[spoilerItemIndex].RevealType = REVEALTYPE_ALWAYS; + spoilerData.ItemLocations[spoilerItemIndex].CollectionCheckType = SPOILER_CHK_ALWAYS_COLLECTED; + } + if (key == LAUNDRY_POOL_CURIOSITY_SHOP_MAN_TWO && (Settings::ShuffleTradeItems.Value() == false)) + { + 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; From 853a9b695d6c008e30037e5722024f3bfc4c54fa Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sun, 11 Feb 2024 09:48:49 -0600 Subject: [PATCH 08/47] Update Z3DR --- Z3DR | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Z3DR b/Z3DR index ca06827..47d06c3 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit ca06827a409a849c20ff3e69ee9f0961208ccace +Subproject commit 47d06c3f90b6ccb347ee282411e17dd1afcb7296 From 8805f4a58776f3efbc86af6663ee725730d4f1c5 Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sun, 11 Feb 2024 09:51:13 -0600 Subject: [PATCH 09/47] Update version.hpp --- source/include/version.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/include/version.hpp b/source/include/version.hpp index ccd7436..31cc15f 100644 --- a/source/include/version.hpp +++ b/source/include/version.hpp @@ -1,4 +1,4 @@ #pragma once -#define RANDOMIZER_VERSION "v1.2.1" +#define RANDOMIZER_VERSION "v1.2.2" #define COMMIT_NUMBER "develop" From c7a534e68fe73f1499bbdcb9888a08840add3d11 Mon Sep 17 00:00:00 2001 From: PhlexPlexico Date: Sun, 11 Feb 2024 09:55:33 -0600 Subject: [PATCH 10/47] Update build script to be more automatic in generating full releases. (#41) --- .github/workflows/create-build.yml | 28 ++++++++++++++++++---------- linux_build_rando.sh | 13 +++++++++---- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/.github/workflows/create-build.yml b/.github/workflows/create-build.yml index cf698a9..12074af 100644 --- a/.github/workflows/create-build.yml +++ b/.github/workflows/create-build.yml @@ -20,16 +20,21 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout Project - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: Get Last Nightly Commit and Private Key id: nightly-version run: | - echo "last_nightly=$(git describe --tags $(git rev-list --tags --max-count=1))" >> $GITHUB_ENV + if [[ ${{ github.event.inputs.build_type == 'Nightly' }} == true ]]; then + echo "last_nightly=$(git describe --tags $(git rev-list --tags --max-count=1))" >> $GITHUB_ENV + else + echo "last_nightly=$(git describe --tags --match="v[0-9]*" HEAD)" >> $GITHUB_ENV + fi + - name: Generate changelog id: changelog - uses: metcalfc/changelog-generator@v4.0.1 + uses: metcalfc/changelog-generator@v4.3.0 with: myToken: ${{ secrets.GITHUB_TOKEN }} base-ref: ${{ env.last_nightly }} @@ -46,12 +51,15 @@ jobs: steps: - name: Checkout Project - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: submodules: true - name: Run Build Script run: | + if [[ ${{ github.event.inputs.build_type == 'Release' }} == true ]]; then + url_tag=v${{ github.event.inputs.version }} + fi chmod +x linux_build_rando.sh ./linux_build_rando.sh @@ -61,7 +69,7 @@ jobs: - if: ${{ github.event.inputs.build_type == 'Nightly' }} name: Create Pre-release - uses: ncipollo/release-action@v1.12.0 + uses: ncipollo/release-action@v1.14.0 with: token: "${{ secrets.GITHUB_TOKEN }}" artifacts: "MM3D_Randomizer.cia,MM3D_Randomizer.3dsx,cia.png,3dsx.png" @@ -84,7 +92,7 @@ jobs: - if: ${{ github.event.inputs.build_type == 'Release' }} name: Create Release - uses: ncipollo/release-action@v1.12.0 + uses: ncipollo/release-action@v1.14.0 with: token: "${{ secrets.GITHUB_TOKEN }}" artifacts: "MM3D_Randomizer.cia,MM3D_Randomizer.3dsx,cia.png,3dsx.png" @@ -93,15 +101,15 @@ jobs: tag: "v${{ github.event.inputs.version }}" name: "v${{ github.event.inputs.version }}" body: | - ${{ github.event.inputs.version }} Changes: - - Please check back later for a full list of changes. + ${{ github.event.inputs.version }} Changes 🛠: + ${{ needs.get-changelog.outputs.changelog }} When reporting issues, please mention the six character commit listed in the randomizer menu. You can use the FBI homebrew application to install the randomizer using either of these QR codes. CIA QR Code: - ![CIA Download](https://github.com/${{ github.repository }}/releases/download/Nightly-${{ env.sha_short }}/cia.png) + ![CIA Download](https://github.com/${{ github.repository }}/releases/download/v${{ github.event.inputs.version }}/cia.png) 3DSX QR Code: - ![CIA Download](https://github.com/${{ github.repository }}/releases/download/Nightly-${{ env.sha_short }}/3dsx.png) + ![CIA Download](https://github.com/${{ github.repository }}/releases/download/v${{ github.event.inputs.version }}/3dsx.png) deploy-gist: needs: build-cia-3dsx diff --git a/linux_build_rando.sh b/linux_build_rando.sh index a3ac65b..f9c2d5a 100755 --- a/linux_build_rando.sh +++ b/linux_build_rando.sh @@ -5,8 +5,8 @@ compile() { APP_NAME=$(basename "$PWD") BANNERTOOLAPP=bannertool IS_GH_ACTIONS=true - if [ -n "$var" ]; then - echo "Building on Github Actions.." + if [ -n "$GITHUB_SHA" ]; then + echo "Building on Github Actions..." else echo "GITHUB_SHA is empty, building locally." IS_GH_ACTIONS=false @@ -43,8 +43,13 @@ compile() { 3dstool -cvtf romfs ./romfs.bin --romfs-dir ./romfs makerom -f cia -o ${APP_NAME}.cia -DAPP_ENCRYPTED=false -target t -exefslogo -elf ./${APP_NAME}.elf -icon ./icon.icn -banner ./banner.bnr -rsf ./mmrando.rsf -romfs ./romfs.bin -major 1 -minor 0 -micro 0 if $IS_GH_ACTIONS; then - qrencode -ocia.png https://github.com/$GITHUB_REPOSITORY/releases/download/Nightly-$commitHashShort/${APP_NAME}.cia - qrencode -o3dsx.png https://github.com/$GITHUB_REPOSITORY/releases/download/Nightly-$commitHashShort/${APP_NAME}.3dsx + if [ -n "$url_tag" ]; then + qrencode -ocia.png https://github.com/$GITHUB_REPOSITORY/releases/download/$url_tag/${APP_NAME}.cia + qrencode -o3dsx.png https://github.com/$GITHUB_REPOSITORY/releases/download/$url_tag/${APP_NAME}.3dsx + else + qrencode -ocia.png https://github.com/$GITHUB_REPOSITORY/releases/download/Nightly-$commitHashShort/${APP_NAME}.cia + qrencode -o3dsx.png https://github.com/$GITHUB_REPOSITORY/releases/download/Nightly-$commitHashShort/${APP_NAME}.3dsx + fi fi } From 92407dfefad5c8020ad6f25bb1a43a758eed9bea Mon Sep 17 00:00:00 2001 From: PhlexPlexico Date: Sun, 11 Feb 2024 10:02:04 -0600 Subject: [PATCH 11/47] Update create-build.yml Update the last nightly on release to check without a hash. --- .github/workflows/create-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/create-build.yml b/.github/workflows/create-build.yml index 12074af..4f37b0a 100644 --- a/.github/workflows/create-build.yml +++ b/.github/workflows/create-build.yml @@ -29,7 +29,7 @@ jobs: if [[ ${{ github.event.inputs.build_type == 'Nightly' }} == true ]]; then echo "last_nightly=$(git describe --tags $(git rev-list --tags --max-count=1))" >> $GITHUB_ENV else - echo "last_nightly=$(git describe --tags --match="v[0-9]*" HEAD)" >> $GITHUB_ENV + echo "last_nightly=$(git describe --tags --match="v[0-9]*" HEAD --abbrev=0)" >> $GITHUB_ENV fi - name: Generate changelog From 7978e5820dd5c38d0bf2b77a651612717eb9aa71 Mon Sep 17 00:00:00 2001 From: PhlexPlexico Date: Tue, 13 Feb 2024 17:51:35 -0600 Subject: [PATCH 12/47] Spoiler Log Updates & Patch Fixes (#44) * Update dungeon.cpp Reorganizes Spoiler log entries in dungeons so it is consistent, * Revert fast arrow swap changes as it was interfering with fast masks Fix Item Override Bottle Logic. Fix gibdo mask give item again. * Update build script to remove debug_app and properly check for url_tag existence. * Update item_location.cpp - Change Pamela's Father back to 0x87 - Adjust GBC Fisherman Game from 0x06 to 0x0C * Update Z3DR for spoiler log changes. --------- Co-authored-by: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> --- Z3DR | 2 +- linux_build_rando.sh | 4 ++-- source/dungeon.cpp | 6 +++--- source/item_location.cpp | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Z3DR b/Z3DR index 47d06c3..d5283f5 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit 47d06c3f90b6ccb347ee282411e17dd1afcb7296 +Subproject commit d5283f5e15b8fca37febf484af530e23cb721f0d diff --git a/linux_build_rando.sh b/linux_build_rando.sh index f9c2d5a..7a3e3fc 100755 --- a/linux_build_rando.sh +++ b/linux_build_rando.sh @@ -36,14 +36,14 @@ compile() { export commitHashShort=$(echo ${GITHUB_SHA::6}) sed -i "s/develop/${commitHashShort:-develop}/" ./source/include/version.hpp - make -j debug_app=1 + make -j sed -i "s/${commitHashShort}/develop/" ./source/include/version.hpp $BANNERTOOLAPP makebanner -i ./banner.png -a ./audio.wav -o ./banner.bnr $BANNERTOOLAPP makesmdh -s "Majora's Mask 3D Randomizer" -l "A Randomized Majoras Mask Experience" -p "Z3DR Team" -i icon.png -o ./icon.icn 3dstool -cvtf romfs ./romfs.bin --romfs-dir ./romfs makerom -f cia -o ${APP_NAME}.cia -DAPP_ENCRYPTED=false -target t -exefslogo -elf ./${APP_NAME}.elf -icon ./icon.icn -banner ./banner.bnr -rsf ./mmrando.rsf -romfs ./romfs.bin -major 1 -minor 0 -micro 0 if $IS_GH_ACTIONS; then - if [ -n "$url_tag" ]; then + if [[ ${url_tag+x} ]]; then qrencode -ocia.png https://github.com/$GITHUB_REPOSITORY/releases/download/$url_tag/${APP_NAME}.cia qrencode -o3dsx.png https://github.com/$GITHUB_REPOSITORY/releases/download/$url_tag/${APP_NAME}.3dsx else diff --git a/source/dungeon.cpp b/source/dungeon.cpp index dcf09e7..802a188 100644 --- a/source/dungeon.cpp +++ b/source/dungeon.cpp @@ -147,9 +147,9 @@ std::vector DungeonInfo::GetEveryLocation() const { WOODFALL_TEMPLE_MAP_CHEST, WOODFALL_TEMPLE_COMPASS_CHEST, WOODFALL_TEMPLE_SMALL_KEY_CHEST, - ODOLWA_HEART_CONTAINER, WOODFALL_TEMPLE_HEROS_BOW_CHEST, WOODFALL_TEMPLE_BOSS_KEY_CHEST, + ODOLWA_HEART_CONTAINER, ODOLWA, WOODFALL_TEMPLE_DEKU_PRINCESS, },{ @@ -209,8 +209,8 @@ std::vector DungeonInfo::GetEveryLocation() const { GBT_SMALL_KEY_CHEST, GBT_ICE_ARROW_CHEST, GBT_BOSS_KEY_CHEST, - GYORG, GYORG_HEART_CONTAINER, + GYORG, },{ //STRAY FAIRY LOCATIONS GBT_SF_SKULLTULA, @@ -241,8 +241,8 @@ std::vector DungeonInfo::GetEveryLocation() const { STONE_TOWER_TEMPLE_UPDRAFT_ROOM_CHEST, STONE_TOWER_TEMPLE_GIANTS_MASK_CHEST, STONE_TOWER_TEMPLE_LIGHT_ARROW_CHEST, - TWINMOLD, TWINMOLD_HEART_CONTAINER, + TWINMOLD, },{ //STRAY FAIRY LOCATIONS ST_SF_MIRROR_SUN_BLOCK, diff --git a/source/item_location.cpp b/source/item_location.cpp index fb74090..233adaf 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -69,7 +69,7 @@ void LocationTable_Init() { locationTable[GBC_OCEAN_SPIDER_DAY1] = ItemLocation::Base (0x28, 0x48, false, "OSH Day 1 Reward", GBC_OCEAN_SPIDER_DAY1, PROGRESSIVE_WALLET, {Category::cGreatBayCoast ,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GREAT_BAY_COAST ); //locationTable[GBC_OCEAN_SPIDER_DAY2] = ItemLocation::Base (0x28, 0x00, true, "OSH Day 2 Reward", GBC_OCEAN_SPIDER_DAY2, PURPLE_RUPEE, {Category::cGreatBayCoast ,Category::cDayTwo}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GREAT_BAY_COAST ); //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_FISHERMAN_GAME] = ItemLocation::Base (0x37, 0x0C, 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, 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 ); @@ -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, 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 ); From 72cb0beca09dd270e056baa3b381961b09e3cd86 Mon Sep 17 00:00:00 2001 From: PhlexPlexico Date: Tue, 13 Feb 2024 17:52:03 -0600 Subject: [PATCH 13/47] Update version.hpp (#46) --- source/include/version.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/include/version.hpp b/source/include/version.hpp index 31cc15f..20a68a6 100644 --- a/source/include/version.hpp +++ b/source/include/version.hpp @@ -1,4 +1,4 @@ #pragma once -#define RANDOMIZER_VERSION "v1.2.2" +#define RANDOMIZER_VERSION "v1.2.3" #define COMMIT_NUMBER "develop" From f6b0147bd6f1ea5d1271656c28f93497f762e0db Mon Sep 17 00:00:00 2001 From: PhlexPlexico Date: Thu, 15 Feb 2024 15:59:42 -0600 Subject: [PATCH 14/47] Change field 4 flags to be that of southern swamp for tingle. (#47) --- source/playthrough.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/playthrough.cpp b/source/playthrough.cpp index 7bd171b..c06ee3d 100644 --- a/source/playthrough.cpp +++ b/source/playthrough.cpp @@ -76,7 +76,7 @@ namespace Playthrough { clockTownMap = ItemTable(Location(TINGLE_N_CLOCK_TOWN_CT)->GetPlacedItemKey()).GetName().GetEnglish(); woodfallMap = ItemTable(Location(TINGLE_N_CLOCK_TOWN_WF)->GetPlacedItemKey()).GetName().GetEnglish(); - CustomMessages::CreateMessage(0x1D12, 0xFFFF, 0x3FF0A005, 0xFF1001, + CustomMessages::CreateMessage(0x1D12, 0xFFFF, 0x3FF0A014, 0xFF1001, woodfallMap.insert(0, "#").append("# #20 Rupees#&").append(snowHeadMap.insert(0, "#").c_str()).append("# #40 Rupees#").append("&#No thanks#").c_str(), {QM_GREEN, QM_RED, QM_GREEN, QM_RED, QM_GREEN}, {}, {}, 0x0, false, false); woodfallMap = ItemTable(Location(TINGLE_N_CLOCK_TOWN_WF)->GetPlacedItemKey()).GetName().GetEnglish(); From 356514f99c921bf25cde0425ff2f48f5cfe2ea97 Mon Sep 17 00:00:00 2001 From: PhlexPlexico Date: Thu, 15 Feb 2024 19:29:40 -0600 Subject: [PATCH 15/47] Adjust workflow to use proper variables. (#48) --- .github/workflows/create-build.yml | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/.github/workflows/create-build.yml b/.github/workflows/create-build.yml index 4f37b0a..170d6cb 100644 --- a/.github/workflows/create-build.yml +++ b/.github/workflows/create-build.yml @@ -55,11 +55,17 @@ jobs: with: submodules: true - - name: Run Build Script + - if: ${{ github.event.inputs.build_type == 'Nightly' }} + name: Run Build Script Nightly + run: | + chmod +x linux_build_rando.sh + ./linux_build_rando.sh + + - if: ${{ github.event.inputs.build_type == 'Release' }} + name: Run Build Script Release + env: + url_tag: v${{ github.event.inputs.version }} run: | - if [[ ${{ github.event.inputs.build_type == 'Release' }} == true ]]; then - url_tag=v${{ github.event.inputs.version }} - fi chmod +x linux_build_rando.sh ./linux_build_rando.sh From db095334d296a13adc06e8fedcdb14e2ff4c83c7 Mon Sep 17 00:00:00 2001 From: PhlexPlexico Date: Mon, 19 Feb 2024 14:08:21 -0600 Subject: [PATCH 16/47] Version 1.3.0 RC (#50) * Bug Fixes & New Things - Adjusts text on Kokiri Sword item obtain message to have proper capitalization - Adjust Vanilla & No Logic fills to respect starting inventory, excluded locations, and generate hints (only no logic) - Renames Circus Leader Mask to Troupe Leader Mask - Adjusts name of Ocean Spider House Reward to no longer include "Day 1" as in 3D it can be obtained any day - Adds overrides for Heart Containers from bosses - Adds Giants Mask back into randomization logic - Adds Deku Mask requirement to the North Clock Town Great Fairy Deku check - Adds Bunny Hood to Postman Game check (will add trick later to not require it) - Adds Seahorse to all Pinnacle Rock checks (No longer need to navigate the murky water without a guide (likely will add trick later for doing the maze without the seahorse)) - Adjusts a few logical helpers as they only accounted for one bottle not any - Adjusts Gold Dust and Mystery Milk to be considered Quest Items during placement (ensures they will be placed in a location available on day 1) - Adds option in dungeon settings for shuffling Heart Containers * Update Z3DR to bring in patch features. * Include chest size option for contents. --------- Co-authored-by: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> --- Z3DR | 2 +- source/custom_messages.cpp | 2 +- source/fill.cpp | 70 ++++++++++++++++++++++++-------------- source/hints.cpp | 2 +- source/item_list.cpp | 6 ++-- source/item_location.cpp | 14 ++++---- source/item_pool.cpp | 8 ++--- source/location_access.cpp | 14 ++++---- source/logic.cpp | 6 ++-- source/settings.cpp | 6 ++-- 10 files changed, 73 insertions(+), 57 deletions(-) diff --git a/Z3DR b/Z3DR index d5283f5..0538c5a 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit d5283f5e15b8fca37febf484af530e23cb721f0d +Subproject commit 0538c5a6446df4e3e3f06d5510446d38bc07eee6 diff --git a/source/custom_messages.cpp b/source/custom_messages.cpp index 01d9936..b18af23 100644 --- a/source/custom_messages.cpp +++ b/source/custom_messages.cpp @@ -143,7 +143,7 @@ void CreateBaselineCustomMessages() { // Kokiri Sword CreateMessage(0x0037, 0xFFFF, 0x3FFFFFFF, 0xFF0000, - "You got the #kokiri sword!# The trusty sword you're familiar with. A treasure from Kokiri Forest.", + "You got the #Kokiri Sword!# The trusty sword you're familiar with. A treasure from Kokiri Forest.", {QM_GREEN, QM_RED}, {}, {}, 0x0, false, false); // Ice Trap diff --git a/source/fill.cpp b/source/fill.cpp index f80eb9d..a8c23b8 100644 --- a/source/fill.cpp +++ b/source/fill.cpp @@ -238,7 +238,7 @@ std::vector GetAccessibleLocations(const std::vector& } return {}; } - + erase_if(accessibleLocations, [&allowedLocations](LocationKey loc) { for (LocationKey allowedLocation : allowedLocations) { if (loc == allowedLocation || Location(loc)->GetPlacedItemKey() != NONE) { @@ -247,6 +247,7 @@ std::vector GetAccessibleLocations(const std::vector& } return true; }); + return accessibleLocations; } @@ -731,11 +732,14 @@ static void RandomizeLinksPocket() { int VanillaFill() { //Perform minimum needed initialization - AreaTable_Init(); + CitraPrint("Starting VanillaFill\n"); + AreaTable_Init(); //Reset the world graph to intialize the proper locations + ItemReset(); //Reset shops incase of shopsanity random GenerateLocationPool(); GenerateItemPool(); GenerateStartingInventory(); - //Place vanilla item in each location + RemoveStartingItemsFromPool(); + FillExcludedLocations(); RandomizeDungeonRewards(); for (LocationKey loc : allLocations) { Location(loc)->PlaceVanillaItem(); @@ -747,42 +751,58 @@ int VanillaFill() { // printf("\x1b[7;32HDone"); //} //Finish up + GeneratePlaythrough(); + printf("Done"); + printf("\x1b[9;10HCalculating Playthrough..."); + PareDownPlaythrough(); + printf("Done"); + printf("\x1b[10;10HCalculating Way of the Hero..."); + CalculateWotH(); + printf("Done"); + CitraPrint("Creating Item Overrides"); CreateItemOverrides(); - //CreateEntranceOverrides(); - //CreateAlwaysIncludedMessages(); + // CreateEntranceOverrides(); + // CreateAlwaysIncludedMessages(); + if (GossipStoneHints.IsNot(rnd::GossipStoneHintsSetting::HINTS_NO_HINTS)) { + printf("\x1b[11;10HCreating Hints..."); + CreateAllHints(); + printf("Done"); + } + return 1; } int NoLogicFill() { + CitraPrint("StartingNoLogicFill\n"); AreaTable_Init(); //Reset the world graph to intialize the proper locations ItemReset(); //Reset shops incase of shopsanity random GenerateLocationPool(); GenerateItemPool(); GenerateStartingInventory(); + RemoveStartingItemsFromPool(); + FillExcludedLocations(); RandomizeDungeonRewards(); std::vector remainingPool = FilterAndEraseFromPool(ItemPool, [](const ItemKey i) {return true;}); FastFill(remainingPool, GetAllEmptyLocations(), false); GeneratePlaythrough(); - //Successful placement, produced beatable result - //if (playthroughBeatable && !placementFailure) { - // printf("Done"); - // printf("\x1b[9;10HCalculating Playthrough..."); - // PareDownPlaythrough(); - // CalculateWotH(); - // printf("Done"); - CreateItemOverrides(); - // CreateEntranceOverrides(); - // CreateAlwaysIncludedMessages(); - /*if (GossipStoneHints.IsNot(HINTS_NO_HINTS)) { - printf("\x1b[10;10HCreating Hints..."); - CreateAllHints(); - printf("Done"); - } - if (ShuffleMerchants.Is(SHUFFLEMERCHANTS_HINTS)) { - CreateMerchantsHints(); - }*/ - //} - return 1; + printf("Done"); + printf("\x1b[9;10HCalculating Playthrough..."); + PareDownPlaythrough(); + printf("Done"); + printf("\x1b[10;10HCalculating Way of the Hero..."); + CalculateWotH(); + printf("Done"); + CitraPrint("Creating Item Overrides"); + CreateItemOverrides(); + // CreateEntranceOverrides(); + // CreateAlwaysIncludedMessages(); + if (GossipStoneHints.IsNot(rnd::GossipStoneHintsSetting::HINTS_NO_HINTS)) { + printf("\x1b[11;10HCreating Hints..."); + CreateAllHints(); + printf("Done"); + } + + return 1; } diff --git a/source/hints.cpp b/source/hints.cpp index fd4a304..5f232e7 100644 --- a/source/hints.cpp +++ b/source/hints.cpp @@ -151,7 +151,7 @@ static std::vector GetAccessibleGossipStones(const LocationKey hint auto accessibleGossipStones = GetAccessibleLocations(gossipStoneLocations); //Give the item back to the location Location(hintedLocation)->SetPlacedItem(originalItem); - + return accessibleGossipStones; } diff --git a/source/item_list.cpp b/source/item_list.cpp index 351aa36..85cb218 100644 --- a/source/item_list.cpp +++ b/source/item_list.cpp @@ -53,7 +53,7 @@ void ItemTable_Init() { //repeatable denotes that an item in a vanilla playth itemTable[DON_GEROS_MASK] = Item(true, false, &DonGerosMask, Text{"Don Gero's Mask", "Masque de Don Gero", "Máscara de Don Gero"}, DON_GEROS_MASK, (u32)GetItemID::GI_MASK_DON_GEROS, ITEMTYPE_MASK ); itemTable[MASK_OF_SCENTS] = Item(true, false, &MaskOfScents, Text{"Mask of Scents", "Masque des Senteurs", "Máscara de aromas"}, MASK_OF_SCENTS, (u32)GetItemID::GI_MASK_OF_SCENTS, ITEMTYPE_MASK ); itemTable[ROMANIS_MASK] = Item(true, false, &RomanisMask, Text{"Romani's Mask", "Masque de Romani", "Máscara de Romani"}, ROMANIS_MASK, (u32)GetItemID::GI_MASK_ROMANIS, ITEMTYPE_MASK ); - itemTable[CIRCUS_LEADERS_MASK] = Item(true, false, &CircusLeadersMask, Text{"Circus Leader's Mask", "Masque de chef de cirque", "Máscara de lider de circo"}, CIRCUS_LEADERS_MASK, (u32)GetItemID::GI_MASK_TROUPE_LEADERS, ITEMTYPE_MASK ); + itemTable[CIRCUS_LEADERS_MASK] = Item(true, false, &CircusLeadersMask, Text{"Troupe Leader's Mask", "Masque de chef de troupe", "Máscara de lider de troupe"}, CIRCUS_LEADERS_MASK, (u32)GetItemID::GI_MASK_TROUPE_LEADERS, ITEMTYPE_MASK ); itemTable[KAFEIS_MASK] = Item(true, false, &KafeisMask, Text{"Kafei's Mask", "Masque de Kafei", "Máscara de Kafei"}, KAFEIS_MASK, (u32)GetItemID::GI_MASK_KAFEIS, ITEMTYPE_MASK ); itemTable[COUPLES_MASK] = Item(true, false, &CouplesMask, Text{"Couple's Mask", "Masque de couple", "Máscara de pareja"}, COUPLES_MASK, (u32)GetItemID::GI_MASK_COUPLES, ITEMTYPE_MASK ); itemTable[KAMAROS_MASK] = Item(true, false, &KamarosMask, Text{"Kamaro's Mask", "Masque de Kamaro", "Máscara de Kamaro"}, KAMAROS_MASK, (u32)GetItemID::GI_MASK_KAMARAOS, ITEMTYPE_MASK ); @@ -94,9 +94,9 @@ void ItemTable_Init() { //repeatable denotes that an item in a vanilla playth itemTable[EMPTY_BOTTLE] = Item(true, false, &HasBottle, Text{"Empty Bottle", "Flacon vide", "Botella vacía" }, EMPTY_BOTTLE, (u32)GetItemID::GI_BOTTLE_EMPTY, ITEMTYPE_ITEM); itemTable[BOTTLE_WITH_MILK] = Item(true, false, &AlienBottle, Text{"Bottle with Milk", "Flacon de lait", "Botella de leche Lon Lon"}, BOTTLE_WITH_MILK, (u32)GetItemID::GI_BOTTLE_MILK, ITEMTYPE_ITEM); itemTable[BOTTLE_WITH_RED_POTION] = Item(true, false, &WitchBottle, Text{"Bottle with Red Potion", "Flacon de potion rouge", "Botella de poción roja"}, BOTTLE_WITH_RED_POTION, (u32)GetItemID::GI_BOTTLE_POTION_RED, ITEMTYPE_ITEM); - itemTable[GOLD_DUST] = Item(true, true, &GoronRaceBottle, Text{"Gold Dust", "Poudre d'Or", "Polvo de Oro" }, GOLD_DUST, (u32)GetItemID::GI_BOTTLE_GOLD_DUST, ITEMTYPE_ITEM); + itemTable[GOLD_DUST] = Item(true, true, &GoronRaceBottle, Text{"Gold Dust", "Poudre d'Or", "Polvo de Oro" }, GOLD_DUST, (u32)GetItemID::GI_BOTTLE_GOLD_DUST, ITEMTYPE_QUEST); itemTable[CHATEAU_ROMANI] = Item(true, false, &ChateauBottle, Text{"Chateau Romani", "Chateau Romani", "Reserva Romani" }, CHATEAU_ROMANI, (u32)GetItemID::GI_BOTTLE_CHATEAU_ROMANI, ITEMTYPE_ITEM); - itemTable[BOTTLE_WITH_MYSTERY_MILK] = Item(true, true, &MysteryMilkBottle, Text{"Bottle with Mystery Milk", "Bottle with Mystery Milk", "Bottle with Mystery Milk"}, BOTTLE_WITH_MYSTERY_MILK, (u32)GetItemID::GI_BOTTLE_MYSTERY_MILK, ITEMTYPE_ITEM); + itemTable[BOTTLE_WITH_MYSTERY_MILK] = Item(true, true, &MysteryMilkBottle, Text{"Bottle with Mystery Milk", "Bottle with Mystery Milk", "Bottle with Mystery Milk"}, BOTTLE_WITH_MYSTERY_MILK, (u32)GetItemID::GI_BOTTLE_MYSTERY_MILK, ITEMTYPE_QUEST); //Other bottle items itemTable[DEKU_PRINCESS] = Item(true, true, &DekuPrincess, Text{"Deku Princess", "Princesse Mojo", "Princesa Deku"}, DEKU_PRINCESS, (u32)GetItemID::GI_DEKU_PRINCESS_FAIRY, ITEMTYPE_ITEM); itemTable[BOTTLE_WITH_GREEN_POTION] = Item(false, false, &HasBottle, Text{"Bottle with Green Potion", "Flacon de potion verde", "Botella de poción verte"}, BOTTLE_WITH_GREEN_POTION, (u32)GetItemID::GI_POTION_GREEN, ITEMTYPE_ITEM); diff --git a/source/item_location.cpp b/source/item_location.cpp index 233adaf..d654f77 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -66,7 +66,7 @@ void LocationTable_Init() { locationTable[GORON_VILLAGE_LEDGE_SPRING] = ItemLocation::Collectable(0x48, 0x00, false, "GV Piece of Heart (Spring)", GORON_VILLAGE_LEDGE_SPRING, PIECE_OF_HEART, {Category::cGoronVillage, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); //Great Bay Coast - locationTable[GBC_OCEAN_SPIDER_DAY1] = ItemLocation::Base (0x28, 0x48, false, "OSH Day 1 Reward", GBC_OCEAN_SPIDER_DAY1, PROGRESSIVE_WALLET, {Category::cGreatBayCoast ,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GREAT_BAY_COAST ); + locationTable[GBC_OCEAN_SPIDER_DAY1] = ItemLocation::Base (0x28, 0x48, false, "OSH Reward", GBC_OCEAN_SPIDER_DAY1, PROGRESSIVE_WALLET, {Category::cGreatBayCoast ,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GREAT_BAY_COAST ); //locationTable[GBC_OCEAN_SPIDER_DAY2] = ItemLocation::Base (0x28, 0x00, true, "OSH Day 2 Reward", GBC_OCEAN_SPIDER_DAY2, PURPLE_RUPEE, {Category::cGreatBayCoast ,Category::cDayTwo}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GREAT_BAY_COAST ); //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, 0x0C, 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 ); @@ -507,10 +507,10 @@ void LocationTable_Init() { /*------------------------------- ---HEART CONTAINERS --- -------------------------------*/ - locationTable[ODOLWA_HEART_CONTAINER] = ItemLocation::Base (0x1F, 0x00, false, "Woodfall Temple Odolwa Heart Container", ODOLWA_HEART_CONTAINER, HEART_CONTAINER, {Category::cWoodfall, Category::cWoodfallTemple,Category::cBossHeart, Category::cDungeonReward,Category::cDayOne}, SpoilerCollectionCheck::Collectable(0x00,0x00), SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); - locationTable[GOHT_HEART_CONTAINER] = ItemLocation::Base (0x44, 0x00, false, "Snowhead Temple Goht Heart Container", GOHT_HEART_CONTAINER, HEART_CONTAINER, {Category::cSnowhead, Category::cSnowheadTemple, Category::cBossHeart, Category::cDungeonReward,Category::cDayOne}, SpoilerCollectionCheck::Collectable(0x00,0x00), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); - locationTable[GYORG_HEART_CONTAINER] = ItemLocation::Base (0x5F, 0x00, false, "Great Bay Temple Gyorg Heart Container", GYORG_HEART_CONTAINER, HEART_CONTAINER, {Category::cZoraCape, Category::cGreatBayTemple, Category::cBossHeart, Category::cDungeonReward,Category::cDayOne}, SpoilerCollectionCheck::Collectable(0x00,0x00), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); - locationTable[TWINMOLD_HEART_CONTAINER] = ItemLocation::Base (0x36, 0x00, false, "Stone Tower Temple Twinmold Heart Container", TWINMOLD_HEART_CONTAINER, HEART_CONTAINER, {Category::cStoneTower, Category::cStoneTowerTemple,Category::cBossHeart, Category::cDungeonReward,Category::cDayOne}, SpoilerCollectionCheck::Collectable(0x00,0x00), SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); + locationTable[ODOLWA_HEART_CONTAINER] = ItemLocation::Base (0x1F, 0x0D, false, "Woodfall Temple Odolwa Heart Container", ODOLWA_HEART_CONTAINER, HEART_CONTAINER, {Category::cWoodfall, Category::cWoodfallTemple,Category::cBossHeart, Category::cDungeonReward,Category::cDayOne}, SpoilerCollectionCheck::Collectable(0x00,0x00), SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); + locationTable[GOHT_HEART_CONTAINER] = ItemLocation::Base (0x44, 0x0D, false, "Snowhead Temple Goht Heart Container", GOHT_HEART_CONTAINER, HEART_CONTAINER, {Category::cSnowhead, Category::cSnowheadTemple, Category::cBossHeart, Category::cDungeonReward,Category::cDayOne}, SpoilerCollectionCheck::Collectable(0x00,0x00), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); + locationTable[GYORG_HEART_CONTAINER] = ItemLocation::Base (0x5F, 0x0D, false, "Great Bay Temple Gyorg Heart Container", GYORG_HEART_CONTAINER, HEART_CONTAINER, {Category::cZoraCape, Category::cGreatBayTemple, Category::cBossHeart, Category::cDungeonReward,Category::cDayOne}, SpoilerCollectionCheck::Collectable(0x00,0x00), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); + locationTable[TWINMOLD_HEART_CONTAINER] = ItemLocation::Base (0x36, 0x0D, false, "Stone Tower Temple Twinmold Heart Container", TWINMOLD_HEART_CONTAINER, HEART_CONTAINER, {Category::cStoneTower, Category::cStoneTowerTemple,Category::cBossHeart, Category::cDungeonReward,Category::cDayOne}, SpoilerCollectionCheck::Collectable(0x00,0x00), SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); /*------------------------------- --- COWS --- @@ -1132,11 +1132,11 @@ void LocationReset() { for (LocationKey il : dungeonRewardLocations) { Location(il)->RemoveFromPool(); - } + }*/ for (LocationKey il : gossipStoneLocations) { Location(il)->RemoveFromPool(); - }*/ + } // Something's still missing from allLocations, IDK what though and this fixes it for (LocationKey il = LINKS_POCKET; il <= OSH_COLORED_SKULLS_POT; il++) { diff --git a/source/item_pool.cpp b/source/item_pool.cpp index b76b1e1..bf7c4fe 100644 --- a/source/item_pool.cpp +++ b/source/item_pool.cpp @@ -286,7 +286,7 @@ static void PlaceVanillaSongs() { }; // TODO: Change back to 18 when the override value is correct. -const std::array maskList = { +const std::array maskList = { KEATON_MASK, BUNNY_HOOD, POSTMANS_HAT, @@ -303,7 +303,7 @@ const std::array maskList = { GIBDOS_MASK, GAROS_MASK, CAPTAINS_HAT, - // GIANTS_MASK, // TODO: Add this back in after the override is completed. + GIANTS_MASK, MASK_OF_TRUTH, }; @@ -894,10 +894,6 @@ void GenerateItemPool() { //temp placement until shopsanity works PlaceItemInLocation(SOUTHERN_SWAMP_SCRUB_PURCHASE, MAGIC_BEAN); - - // TODO: Remove these once overrides are fixed. - PlaceItemInLocation(STONE_TOWER_TEMPLE_GIANTS_MASK_CHEST, GIANTS_MASK); - //Place Temp Items at alt locations so they don't get filled with important stuff - will be replaced later PlaceItemInLocation(SOUTHERN_SWAMP_KOTAKE_IN_WOODS, BLUE_RUPEE); diff --git a/source/location_access.cpp b/source/location_access.cpp index ad1f971..68e71f8 100644 --- a/source/location_access.cpp +++ b/source/location_access.cpp @@ -248,7 +248,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(N_CLOCK_TOWN_GREAT_FAIRY_DEKU, {[] {return ClockTownStrayFairy && (ZoraMask || DekuMask || GoronMask );}}), + LocationAccess(N_CLOCK_TOWN_GREAT_FAIRY_DEKU, {[] {return ClockTownStrayFairy && DekuMask;}}), LocationAccess(N_CLOCK_TOWN_GREAT_FAIRY_HUMAN, {[] {return ClockTownStrayFairy;}}), }, @@ -464,7 +464,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(W_CLOCK_TOWN_POSTMANS_GAME, {[] {return true;}}),//Maybe Bunny Hood? + LocationAccess(W_CLOCK_TOWN_POSTMANS_GAME, {[] {return BunnyHood;}}),//trick to do without? }, { //Exits @@ -1453,11 +1453,11 @@ void AreaTable_Init() { { //Locations LocationAccess(PINNACLE_ROCK_SEAHORSES, {[]{return ZoraMask && MagicMeter && Seahorse;}}), - LocationAccess(PINNACLE_ROCK_UPPER_CHEST, {[]{return ZoraMask && MagicMeter;}}), - LocationAccess(PINNACLE_ROCK_LOWER_CHEST, {[]{return ZoraMask && MagicMeter;}}), - LocationAccess(PINNACLE_ROCK_ZORA_EGG1, {[]{return ZoraMask && MagicMeter && AnyBottle;}}), - LocationAccess(PINNACLE_ROCK_ZORA_EGG2, {[]{return ZoraMask && MagicMeter && AnyBottle;}}), - LocationAccess(PINNACLE_ROCK_ZORA_EGG3, {[]{return ZoraMask && MagicMeter && AnyBottle;}}), + LocationAccess(PINNACLE_ROCK_UPPER_CHEST, {[]{return ZoraMask && MagicMeter && Seahorse;}}), + LocationAccess(PINNACLE_ROCK_LOWER_CHEST, {[]{return ZoraMask && MagicMeter && Seahorse;}}), + LocationAccess(PINNACLE_ROCK_ZORA_EGG1, {[]{return ZoraMask && MagicMeter && AnyBottle && Seahorse;}}), + LocationAccess(PINNACLE_ROCK_ZORA_EGG2, {[]{return ZoraMask && MagicMeter && AnyBottle && Seahorse;}}), + LocationAccess(PINNACLE_ROCK_ZORA_EGG3, {[]{return ZoraMask && MagicMeter && AnyBottle && Seahorse;}}), }, { //Exits diff --git a/source/logic.cpp b/source/logic.cpp index d47c93e..adae943 100644 --- a/source/logic.cpp +++ b/source/logic.cpp @@ -463,9 +463,9 @@ namespace Logic { DekuNutDrop = NutPot || NutCrate || DekuBabaNuts; BugsAccess = BugShrub || WanderingBugs || BugRock; FishAccess = LoneFish || FishGroup; - WaterAccess = (SpringWater && WitchBottle) || CanPlay(SongOfStorms); - HotSpringWaterAccess = HotSpringWater && WitchBottle; - WaterForBeans = (WitchBottle && WaterAccess) || SongOfStorms; + WaterAccess = (SpringWater && AnyBottle) || CanPlay(SongOfStorms); + HotSpringWaterAccess = HotSpringWater && AnyBottle; + WaterForBeans = (AnyBottle && WaterAccess) || SongOfStorms; AnyMagicBean = (MagicBean || MagicBeanPack || LimitlessBeans); //refills Bombs = AnyBombBag; diff --git a/source/settings.cpp b/source/settings.cpp index aaa6da8..ce58f21 100644 --- a/source/settings.cpp +++ b/source/settings.cpp @@ -64,7 +64,7 @@ namespace Settings { }; //Mode/Logic Settings - Option Logic = Option::U8("Logic", { "Glitchless", "No Logic", "Vanilla", "Glitched" }, { logicGlitchless, logicNoLogic, logicVanilla, logicGlitched }); + Option Logic = Option::U8("Logic", { "Glitchless", "No Logic", "Vanilla", "Glitched" }, { logicGlitchless, logicNoLogic, logicVanilla, logicGlitched },OptionCategory::Setting, (u8)LogicSetting::LOGIC_GLITCHLESS); Option LocationsReachable = Option::Bool("All Locations Reachable", { "Off", "On" }, { locationsReachableDesc }, OptionCategory::Setting, 1); //All Locations Reachable On std::vector logicOptions = { &Logic, @@ -302,7 +302,7 @@ namespace Settings { &BossKeysanity, //&StrayFairysanity, //&ShuffleRewards, - //&ShuffleHeartContainers, + &ShuffleHeartContainers, }; //Item Pool Settings @@ -351,7 +351,7 @@ namespace Settings { &CompassShowWoTH, //&DamageMultiplier, //&ChestAnimations, - //&ChestSize, + &ChestSize, //&ChangeOverworldItems, //&IngameSpoilers, //&MenuOpeningButton, From 944f4d53594589f4dd55c71fcea83e6a3e0db58c Mon Sep 17 00:00:00 2001 From: PhlexPlexico Date: Mon, 19 Feb 2024 14:08:52 -0600 Subject: [PATCH 17/47] Update version.hpp --- source/include/version.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/include/version.hpp b/source/include/version.hpp index 20a68a6..42e18eb 100644 --- a/source/include/version.hpp +++ b/source/include/version.hpp @@ -1,4 +1,4 @@ #pragma once -#define RANDOMIZER_VERSION "v1.2.3" +#define RANDOMIZER_VERSION "v1.3.0" #define COMMIT_NUMBER "develop" From 3b1f71a2ae607aa17fda1407c6720609b3968bc4 Mon Sep 17 00:00:00 2001 From: PhlexPlexico Date: Mon, 19 Feb 2024 19:56:32 -0600 Subject: [PATCH 18/47] Fix minor text issues. (#51) Fix chest content matching breaking chests and having them draw in ground. --- Z3DR | 2 +- source/item_list.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Z3DR b/Z3DR index 0538c5a..8d22509 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit 0538c5a6446df4e3e3f06d5510446d38bc07eee6 +Subproject commit 8d22509f18d8ca783c0d1d4d5a2bd4a83abf1ad6 diff --git a/source/item_list.cpp b/source/item_list.cpp index 85cb218..7fc8c72 100644 --- a/source/item_list.cpp +++ b/source/item_list.cpp @@ -13,7 +13,7 @@ void ItemTable_Init() { //repeatable denotes that an item in a vanilla playth itemTable[TEST] = Item(); itemTable[NONE] = Item(false, false, &noVariable, Text{"No Item", "Rien", "Sin Objeto" }, NONE, (u32)GetItemID::GI_NONE, ITEMTYPE_EVENT); itemTable[KOKIRI_SWORD] = Item(true , false, &KokiriSword, Text{"Kokiri Sword", "Épée Kokiri", "Espada Kokiri" }, KOKIRI_SWORD, (u32)GetItemID::GI_KOKIRI_SWORD, ITEMTYPE_ITEM ); - itemTable[GREAT_FAIRYS_SWORD] = Item(true , false, &GreatFairySword, Text{"Great Fairys Sword", "Grande Épée de Fees", "Espada de la Gran Hada"}, GREAT_FAIRYS_SWORD, (u32)GetItemID::GI_GREAT_FAIRY_SWORD, ITEMTYPE_GFAIRY ); + itemTable[GREAT_FAIRYS_SWORD] = Item(true , false, &GreatFairySword, Text{"Great Fairy's Sword", "Grande Épée de Fees", "Espada de la Gran Hada"}, GREAT_FAIRYS_SWORD, (u32)GetItemID::GI_GREAT_FAIRY_SWORD, ITEMTYPE_GFAIRY ); itemTable[HEROS_SHIELD] = Item(false, true, &HerosShield, Text{"Heros Shield", "Bouclier du Heros", "Escudo del Heroe"}, HEROS_SHIELD, (u32)GetItemID::GI_SHIELD_HERO, ITEMTYPE_ITEM ); itemTable[DEKU_STICK] = Item(true , true, &DekuStick, Text{"Deku Stick", "Bâton Mojo", "palos deku" }, DEKU_STICK, (u32)GetItemID::GI_STICKS_1, ITEMTYPE_ITEM ); itemTable[LAND_TITLE] = Item(true, true, &LandTitle, Text{"Land Title Deed", "Titre de propriete fonciere", "Escritura de propiedad de la Tierra" }, LAND_TITLE, (u32)GetItemID::GI_TOWN_TITLE_DEED, ITEMTYPE_TRADE ); @@ -57,7 +57,7 @@ void ItemTable_Init() { //repeatable denotes that an item in a vanilla playth itemTable[KAFEIS_MASK] = Item(true, false, &KafeisMask, Text{"Kafei's Mask", "Masque de Kafei", "Máscara de Kafei"}, KAFEIS_MASK, (u32)GetItemID::GI_MASK_KAFEIS, ITEMTYPE_MASK ); itemTable[COUPLES_MASK] = Item(true, false, &CouplesMask, Text{"Couple's Mask", "Masque de couple", "Máscara de pareja"}, COUPLES_MASK, (u32)GetItemID::GI_MASK_COUPLES, ITEMTYPE_MASK ); itemTable[KAMAROS_MASK] = Item(true, false, &KamarosMask, Text{"Kamaro's Mask", "Masque de Kamaro", "Máscara de Kamaro"}, KAMAROS_MASK, (u32)GetItemID::GI_MASK_KAMARAOS, ITEMTYPE_MASK ); - itemTable[GIBDOS_MASK] = Item(true, false, &GibdosMask, Text{"Gibdo's Mask", "Masque Gibdo", "Máscara de Gibdo"}, GIBDOS_MASK, (u32)GetItemID::GI_MASK_GIBDO, ITEMTYPE_MASK ); + itemTable[GIBDOS_MASK] = Item(true, false, &GibdosMask, Text{"Gibdo Mask", "Masque Gibdo", "Máscara de Gibdo"}, GIBDOS_MASK, (u32)GetItemID::GI_MASK_GIBDO, ITEMTYPE_MASK ); itemTable[GAROS_MASK] = Item(true, false, &GarosMask, Text{"Garo's Mask", "Masque de Garo", "Máscara de Garo"}, GAROS_MASK, (u32)GetItemID::GI_MASK_GARO, ITEMTYPE_MASK ); itemTable[CAPTAINS_HAT] = Item(true, false, &CaptainsHat, Text{"Captain's Hat", "Chapeau de capitaine", "Sombrero de Capitan"}, CAPTAINS_HAT, (u32)GetItemID::GI_MASK_CAPTAINS_HAT, ITEMTYPE_MASK ); itemTable[GIANTS_MASK] = Item(true, false, &GiantsMask, Text{"Giant's Mask", "Masque de geant", "Máscara de gigante"}, GIANTS_MASK, (u32)GetItemID::GI_MASK_GIANTS, ITEMTYPE_MASK ); From e60440feb0d22f35fb8e6f0dffec0dc3b3989e7f Mon Sep 17 00:00:00 2001 From: PhlexPlexico Date: Tue, 20 Feb 2024 07:16:26 -0600 Subject: [PATCH 19/47] Update MM3DR for new patches. (#52) Update bank reward three to cover giant wallet or progressive wallet > 1. --- Z3DR | 2 +- source/location_access.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Z3DR b/Z3DR index 8d22509..8271ffb 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit 8d22509f18d8ca783c0d1d4d5a2bd4a83abf1ad6 +Subproject commit 8271ffb3585fee78a1383bed36e44b6aec858164 diff --git a/source/location_access.cpp b/source/location_access.cpp index 68e71f8..2923127 100644 --- a/source/location_access.cpp +++ b/source/location_access.cpp @@ -543,7 +543,7 @@ void AreaTable_Init() { LocationAccess(S_CLOCK_TOWN_FINAL_DAY_CHEST, {[] {return Hookshot || (DekuMask && MoonsTear);}}), LocationAccess(S_CLOCK_TOWN_BANK_REWARD_1, {[] {return true;}}), LocationAccess(S_CLOCK_TOWN_BANK_REWARD_2, {[] {return AnyWallet;}}), - LocationAccess(S_CLOCK_TOWN_BANK_REWARD_3, {[] {return AnyWallet;}}), + LocationAccess(S_CLOCK_TOWN_BANK_REWARD_3, {[] {return (OceanWallet500 || ProgressiveWallet > 1);}}), }, { //Exits From 332f2265eec324d68da698147ad8b488899264f4 Mon Sep 17 00:00:00 2001 From: PhlexPlexico Date: Wed, 21 Feb 2024 16:27:41 -0600 Subject: [PATCH 20/47] Nightly fixes from last reports (#55) Fix: Diety -> Deity Fix: StockPotInn -> Stock Pot Inn Fix: Lens and Progressive Items are now big chests Fix: Chests now override their proper textures --- Z3DR | 2 +- source/hint_list.cpp | 12 ++++++------ source/include/keys.hpp | 4 ++-- source/include/logic.hpp | 2 +- source/include/setting_descriptions.hpp | 4 ++-- source/include/settings.hpp | 6 +++--- source/item_list.cpp | 2 +- source/item_location.cpp | 2 +- source/item_pool.cpp | 10 +++++----- source/location_access.cpp | 10 +++++----- source/logic.cpp | 8 ++++---- source/setting_descriptions.cpp | 6 +++--- source/settings.cpp | 20 ++++++++++---------- source/starting_inventory.cpp | 2 +- 14 files changed, 45 insertions(+), 45 deletions(-) diff --git a/Z3DR b/Z3DR index 8271ffb..9c46098 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit 8271ffb3585fee78a1383bed36e44b6aec858164 +Subproject commit 9c46098003dcdf1beed3015893f0d48fdd58c611 diff --git a/source/hint_list.cpp b/source/hint_list.cpp index 5331783..6f996ac 100644 --- a/source/hint_list.cpp +++ b/source/hint_list.cpp @@ -78,7 +78,7 @@ void HintTable_Init() { hintTable[GAROS_MASK] = HintText::Item({ Text{"the mask of spies", "the mask of spies", "the mask of spies"}}); hintTable[CAPTAINS_HAT] = HintText::Item({ Text{"a commanding presence", "a commanding presence", "a commanding presence"}}); hintTable[GIANTS_MASK] = HintText::Item({ Text{"a growth spurt", "a growth spurt", "a growth spurt"}}); - hintTable[FIERCE_DIETY_MASK] = HintText::Item({ Text{"the wrath of a god", "the wrath of a god", "the wrath of a god"}}); + hintTable[FIERCE_DEITY_MASK] = HintText::Item({ Text{"the wrath of a god", "the wrath of a god", "the wrath of a god"}}); hintTable[MASK_OF_TRUTH] = HintText::Item({ Text{"a piercing gaze", "a piercing gaze", "a piercing gaze"}}); hintTable[FISHING_PASS] = HintText::Item({Text{"a fishing pass", "a fishing passs", "a fishing pass"}}); hintTable[ICE_TRAP] = HintText::Item({Text{"a frosty surprise", "a frosty surprise", "a frosty surprise"}}); @@ -411,7 +411,7 @@ void HintTable_Init() { hintTable[POTION_SHOP_ITEM_1] = HintText::Sometimes({Text{"a potion maker sells", "", ""}}); hintTable[POTION_SHOP_ITEM_2] = HintText::Sometimes({Text{"a potion maker sells", "", ""}}); hintTable[POTION_SHOP_ITEM_3] = HintText::Sometimes({Text{"a potion maker sells", "", ""}}); -//StockPotInn +//Stock Pot Inn hintTable[STOCKPOTINN_RESERVATION] = HintText::Sometimes({Text{"checking-in rewards", "", ""}}); hintTable[STOCKPOTINN_MIDNIGHT_MEETING] = HintText::Sometimes({Text{"a late meeting rewards", "", ""}}); hintTable[STOCKPOTINN_TOILET_HAND] = HintText::Sometimes({Text{"a strange palm rewards", "", ""}}); @@ -705,10 +705,10 @@ void HintTable_Init() { hintTable[CLOCK_TOWN_FAIRY_FOUNTAIN] = HintText::Region({Text{"Clock Town Fairy Fountain", "", ""}}); hintTable[CLOCK_TOWN_DEKU_PLAYGROUND] = HintText::Region({Text{"Deku Playground", "", ""}}); hintTable[E_CLOCK_TOWN] = HintText::Region({Text{"E Clock Town", "", ""}}); - hintTable[STOCKPOTINN] = HintText::Region({Text{"StockPotInn", "", ""}}); - hintTable[STOCKPOTINN_GUEST_ROOM] = HintText::Region({Text{"StockPotInn", "", ""}}); - hintTable[STOCKPOTINN_STAFF_ROOM] = HintText::Region({Text{"StockPotInn", "", ""}}); - hintTable[STOCKPOTINN_GRANDMA_ROOM] = HintText::Region({Text{"StockPotInn", "", ""}}); + hintTable[STOCKPOTINN] = HintText::Region({Text{"Stock Pot Inn", "", ""}}); + hintTable[STOCKPOTINN_GUEST_ROOM] = HintText::Region({Text{"Stock Pot Inn", "", ""}}); + hintTable[STOCKPOTINN_STAFF_ROOM] = HintText::Region({Text{"Stock Pot Inn", "", ""}}); + hintTable[STOCKPOTINN_GRANDMA_ROOM] = HintText::Region({Text{"Stock Pot Inn", "", ""}}); hintTable[CLOCK_TOWN_OBSERVATORY] = HintText::Region({Text{"Observatory", "", ""}}); hintTable[CLOCK_TOWN_BAR] = HintText::Region({Text{"Milk Bar", "", ""}}); hintTable[CLOCK_TOWN_HONEY_DARLING] = HintText::Region({Text{"E Clock Town", "", ""}}); diff --git a/source/include/keys.hpp b/source/include/keys.hpp index d1cab97..69b3b15 100644 --- a/source/include/keys.hpp +++ b/source/include/keys.hpp @@ -57,7 +57,7 @@ typedef enum { GAROS_MASK, CAPTAINS_HAT, GIANTS_MASK, - FIERCE_DIETY_MASK, + FIERCE_DEITY_MASK, MASK_OF_TRUTH, SWAMP_SKULLTULA_TOKEN, OCEANSIDE_SKULLTULA_TOKEN, @@ -418,7 +418,7 @@ typedef enum { POTION_SHOP_ITEM_1, POTION_SHOP_ITEM_2, POTION_SHOP_ITEM_3, -//StockPotInn +//Stock Pot Inn STOCKPOTINN_RESERVATION, STOCKPOTINN_MIDNIGHT_MEETING, STOCKPOTINN_TOILET_HAND, diff --git a/source/include/logic.hpp b/source/include/logic.hpp index 91e22a7..6f835ba 100644 --- a/source/include/logic.hpp +++ b/source/include/logic.hpp @@ -82,7 +82,7 @@ namespace Logic { extern bool GarosMask; extern bool CaptainsHat; extern bool GiantsMask; - extern bool FierceDietyMask; + extern bool FierceDeityMask; extern bool MaskOfTruth; extern bool OneMask; extern bool TwoMasks; diff --git a/source/include/setting_descriptions.hpp b/source/include/setting_descriptions.hpp index e3083d2..27bc7be 100644 --- a/source/include/setting_descriptions.hpp +++ b/source/include/setting_descriptions.hpp @@ -106,7 +106,7 @@ extern string_view blastLong; extern string_view blastVeryLong; extern string_view underwaterOcarinaDesc; -extern string_view fierceDietyAnywhereDesc; +extern string_view fierceDeityAnywhereDesc; extern string_view skipMinigamePhasesDesc; extern string_view fastLabFishDesc; extern string_view fastBankDesc; @@ -207,7 +207,7 @@ extern string_view shuffleHeartContainersDesc; extern string_view shufflePiecesOfHeartDesc; extern string_view shuffleMainInventoryDesc; extern string_view shuffleTransformationDesc; -extern string_view shuffleFierceDietyDesc; +extern string_view shuffleFierceDeityDesc; extern string_view shuffleMoonItemsDesc; extern string_view shuffleBombersNotebookDesc; extern string_view ocarinaDiveDesc; diff --git a/source/include/settings.hpp b/source/include/settings.hpp index 3075003..2124cfe 100644 --- a/source/include/settings.hpp +++ b/source/include/settings.hpp @@ -363,7 +363,7 @@ namespace Settings { extern Option StartingGaroMask; extern Option StartingCaptainsHat; extern Option StartingGiantsMask; - extern Option StartingFierceDietyMask; + extern Option StartingFierceDeityMask; extern Option StartingMaskOfTruth; //Excluded Locations extern std::vector excludeLocationsOptions; @@ -400,7 +400,7 @@ namespace Settings { extern Option ItemPoolValue; extern Option ShuffleMainInventory; extern Option ShuffleTransformation; - extern Option ShuffleFierceDiety; + extern Option ShuffleFierceDeity; extern Option ShuffleChests; extern Option ShuffleMasks; extern Option ShuffleGFRewards; @@ -427,7 +427,7 @@ namespace Settings { //Comfort extern Option BlastMaskCooldown; extern Option UnderwaterOcarina; - extern Option FierceDietyAnywhere; + extern Option FierceDeityAnywhere; extern Option ProgressiveGildedSword; extern Option StartingSpin; extern Option AmmoDrops; diff --git a/source/item_list.cpp b/source/item_list.cpp index 7fc8c72..e2f45f7 100644 --- a/source/item_list.cpp +++ b/source/item_list.cpp @@ -61,7 +61,7 @@ void ItemTable_Init() { //repeatable denotes that an item in a vanilla playth itemTable[GAROS_MASK] = Item(true, false, &GarosMask, Text{"Garo's Mask", "Masque de Garo", "Máscara de Garo"}, GAROS_MASK, (u32)GetItemID::GI_MASK_GARO, ITEMTYPE_MASK ); itemTable[CAPTAINS_HAT] = Item(true, false, &CaptainsHat, Text{"Captain's Hat", "Chapeau de capitaine", "Sombrero de Capitan"}, CAPTAINS_HAT, (u32)GetItemID::GI_MASK_CAPTAINS_HAT, ITEMTYPE_MASK ); itemTable[GIANTS_MASK] = Item(true, false, &GiantsMask, Text{"Giant's Mask", "Masque de geant", "Máscara de gigante"}, GIANTS_MASK, (u32)GetItemID::GI_MASK_GIANTS, ITEMTYPE_MASK ); - itemTable[FIERCE_DIETY_MASK] = Item(true, false, &FierceDietyMask, Text{"Fierce Diety Mask", "Masque Dietetique Fiere", "Máscara Fiere Diety"}, FIERCE_DIETY_MASK, (u32)GetItemID::GI_MASK_FIERCE_DEITY, ITEMTYPE_MASK ); + itemTable[FIERCE_DEITY_MASK] = Item(true, false, &FierceDeityMask, Text{"Fierce Deity Mask", "Masque Dietetique Fiere", "Máscara Fiere Deity"}, FIERCE_DEITY_MASK, (u32)GetItemID::GI_MASK_FIERCE_DEITY, ITEMTYPE_MASK ); itemTable[MASK_OF_TRUTH] = Item(true, false, &MaskOfTruth, Text{"Mask of Truth", "Masque de vérité", "Máscara de la Verdad"}, MASK_OF_TRUTH, (u32)GetItemID::GI_MASK_OF_TRUTH, ITEMTYPE_MASK ); itemTable[FISHING_PASS] = Item(false, true, &noVariable, Text{"Fishing Pass", "Fishing Pass", "Fishing Pass"}, FISHING_PASS, 0xBA, ITEMTYPE_ITEM ); // diff --git a/source/item_location.cpp b/source/item_location.cpp index d654f77..53e1788 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -347,7 +347,7 @@ void LocationTable_Init() { locationTable[THE_MOON_LINK_TRIAL_BONUS] = ItemLocation::Collectable(0x66, 0x00, false, "The Moon Link Trial Bonus", THE_MOON_LINK_TRIAL_BONUS, PIECE_OF_HEART, {Category::cTheMoon,Category::cDayThree}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_THE_MOON ); locationTable[THE_MOON_GARO_CHEST] = ItemLocation::Chest (0x66, 0x01, true, "The Moon Garo Chest", THE_MOON_GARO_CHEST, ARROWS_30, {Category::cTheMoon,Category::cDayThree}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_THE_MOON ); locationTable[THE_MOON_IRON_KNUCKLE_CHEST] = ItemLocation::Chest (0x67, 0x02, true, "The Moon Iron Knuckle Chest", THE_MOON_IRON_KNUCKLE_CHEST, BOMBCHU_10, {Category::cTheMoon,Category::cDayThree}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_THE_MOON ); - locationTable[THE_MOON_MAJORA_CHILD] = ItemLocation::Base (0x67, 0x7B, false, "The Moon Majora Child", THE_MOON_MAJORA_CHILD, FIERCE_DIETY_MASK, {Category::cTheMoon,Category::cDayThree}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_DUNGEON_THE_MOON ); + locationTable[THE_MOON_MAJORA_CHILD] = ItemLocation::Base (0x67, 0x7B, false, "The Moon Majora Child", THE_MOON_MAJORA_CHILD, FIERCE_DEITY_MASK, {Category::cTheMoon,Category::cDayThree}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_DUNGEON_THE_MOON ); /*------------------------------- --- BOSSES --- diff --git a/source/item_pool.cpp b/source/item_pool.cpp index bf7c4fe..a8ef3c8 100644 --- a/source/item_pool.cpp +++ b/source/item_pool.cpp @@ -103,7 +103,7 @@ const std::array easyItems = { GAROS_MASK, CAPTAINS_HAT, GIANTS_MASK, - FIERCE_DIETY_MASK, + FIERCE_DEITY_MASK, MASK_OF_TRUTH, EMPTY_BOTTLE1, EMPTY_BOTTLE2, @@ -1045,12 +1045,12 @@ void GenerateItemPool() { PlaceItemInLocation(GBC_MIKAU, ZORA_MASK); } - //FIERECE DIETY SHUFFLE - if(ShuffleFierceDiety){ - AddItemToMainPool(FIERCE_DIETY_MASK); + //FIERECE DEITY SHUFFLE + if(ShuffleFierceDeity){ + AddItemToMainPool(FIERCE_DEITY_MASK); } else{ - PlaceItemInLocation(THE_MOON_MAJORA_CHILD,FIERCE_DIETY_MASK); + PlaceItemInLocation(THE_MOON_MAJORA_CHILD,FIERCE_DEITY_MASK); } //PIECEOFHEART SHUFFLE diff --git a/source/location_access.cpp b/source/location_access.cpp index 2923127..579675d 100644 --- a/source/location_access.cpp +++ b/source/location_access.cpp @@ -284,7 +284,7 @@ void AreaTable_Init() { Entrance(N_CLOCK_TOWN, {[]{return true;}}), Entrance(TERMINA_FIELD, {[]{return true;}}), Entrance(CLOCK_TOWN_OBSERVATORY, {[]{return BombersNotebook || SkipBombersMinigame;}}), - Entrance(STOCKPOTINN, {[]{return true;}}),//to-Do StockPotInn Night Access + Entrance(STOCKPOTINN, {[]{return true;}}),//to-Do Stock Pot Inn Night Access Entrance(CLOCK_TOWN_BAR, {[]{return RomanisMask;}}), Entrance(CLOCK_TOWN_HONEY_DARLING, {[]{return true;}}), Entrance(CLOCK_TOWN_TREASURE_CHEST_GAME, {[]{return true;}}), @@ -293,7 +293,7 @@ void AreaTable_Init() { Entrance(S_CLOCK_TOWN, {[]{return true;}}), }); - areaTable[STOCKPOTINN] = Area("StockPotInn", "StockPotInn", STOCKPOTINN, { + areaTable[STOCKPOTINN] = Area("Stock Pot Inn", "Stock Pot Inn", STOCKPOTINN, { //Events }, { @@ -309,7 +309,7 @@ void AreaTable_Init() { Entrance(E_CLOCK_TOWN, {[]{return true;}}), }); - areaTable[STOCKPOTINN_GUEST_ROOM] = Area("StockPotInn Guest Room", "StockPotInn Guest Room", NONE, { + areaTable[STOCKPOTINN_GUEST_ROOM] = Area("Stock Pot Inn Guest Room", "Stock Pot Inn Guest Room", NONE, { //Events //Listen to Anju? --probably not needed as its not hard required }, @@ -322,7 +322,7 @@ void AreaTable_Init() { Entrance(STOCKPOTINN, {[]{return true;}}), }); - areaTable[STOCKPOTINN_STAFF_ROOM] = Area("StockPotInn Staff Room", "StockPotInn Staff Room", NONE, { + areaTable[STOCKPOTINN_STAFF_ROOM] = Area("Stock Pot Inn Staff Room", "Stock Pot Inn Staff Room", NONE, { //Events }, { @@ -336,7 +336,7 @@ void AreaTable_Init() { Entrance(STOCKPOTINN, {[]{return true;}}), }); - areaTable[STOCKPOTINN_GRANDMA_ROOM] = Area("StockPotInn Grandma's Room", "StockPotInn Grandma's Room", NONE, { + areaTable[STOCKPOTINN_GRANDMA_ROOM] = Area("Stock Pot Inn Grandma's Room", "Stock Pot Inn Grandma's Room", NONE, { //Events }, { diff --git a/source/logic.cpp b/source/logic.cpp index adae943..d57a1d8 100644 --- a/source/logic.cpp +++ b/source/logic.cpp @@ -90,7 +90,7 @@ namespace Logic { bool GarosMask = false; bool CaptainsHat = false; bool GiantsMask = false; - bool FierceDietyMask = false; + bool FierceDeityMask = false; bool MaskOfTruth = false; bool OneMask = false; bool TwoMasks = false; @@ -364,7 +364,7 @@ namespace Logic { (item == GAROS_MASK) || (item == CAPTAINS_HAT) || (item == GIANTS_MASK) || - (item == FIERCE_DIETY_MASK) || + (item == FIERCE_DEITY_MASK) || (item == MASK_OF_TRUTH); } static bool HasItem(ItemKey itemName) { @@ -398,7 +398,7 @@ namespace Logic { (itemName == GAROS_MASK && GarosMask) || (itemName == CAPTAINS_HAT && CaptainsHat) || (itemName == GIANTS_MASK && GiantsMask) || - (itemName == FIERCE_DIETY_MASK && FierceDietyMask) || + (itemName == FIERCE_DEITY_MASK && FierceDeityMask) || (itemName == MASK_OF_TRUTH && MaskOfTruth); } @@ -618,7 +618,7 @@ namespace Logic { GarosMask = false; CaptainsHat = false; GiantsMask = false; - FierceDietyMask = false; + FierceDeityMask = false; MaskOfTruth = false; OneMask = false; TwoMasks = false; diff --git a/source/setting_descriptions.cpp b/source/setting_descriptions.cpp index 38a6d08..3f37cc4 100644 --- a/source/setting_descriptions.cpp +++ b/source/setting_descriptions.cpp @@ -120,7 +120,7 @@ string_view shuffleMainInventoryDesc = "Shuffle Main Inventory Items\n" "Magic Beans and Fire, Ice, and Light Arrows"; // // string_view shuffleTransformationDesc = "Shuffles Deku, Goron, and Zora Masks"; // -string_view shuffleFierceDietyDesc = "Shuffles Fierce Diety Mask"; // +string_view shuffleFierceDeityDesc = "Shuffles Fierce Deity Mask"; // string_view shuffleMoonItemsDesc = "Shuffles Items from the Moon into the pool\n" // "Includes 4 Pieces of Heart, and 2 junk items"; // /*------------------------------ // @@ -420,8 +420,8 @@ string_view skipMinigamePhasesDesc = "**OPTION CURRENTLY WIP**\n" "both rewards at once for that minigame." // "Also skips the first beaver race."; // // -string_view fierceDietyAnywhereDesc = "**OPTION CURRENTLY WIP**\n" // - "Enables the use of the Fierce Diety Mask anywhere";// +string_view fierceDeityAnywhereDesc = "**OPTION CURRENTLY WIP**\n" // + "Enables the use of the Fierce Deity Mask anywhere";// // string_view underwaterOcarinaDesc = "**OPTION CURRENTLY WIP**\n" // "Enables the use of the ocarina while underwater.";// diff --git a/source/settings.cpp b/source/settings.cpp index ce58f21..3249c67 100644 --- a/source/settings.cpp +++ b/source/settings.cpp @@ -162,7 +162,7 @@ namespace Settings { Option StartingGaroMask = Option::U8(" Garo Mask", { "None", "Garo M."}, { "" }); Option StartingCaptainsHat = Option::U8(" Captain's Mask", { "None", "Captains M." }, { "" }); Option StartingGiantsMask = Option::U8(" Giants Mask", { "None", "Giants M." }, { "" }); - Option StartingFierceDietyMask = Option::U8(" Fierce Diety Mask", { "None", "F.D M." }, { "" }); + Option StartingFierceDeityMask = Option::U8(" Fierce Deity Mask", { "None", "F.D M." }, { "" }); Option StartingMaskOfTruth = Option::U8(" Mask of Truth", { "None", "Truth M." }, { "" }); Option StartingStickCapacity = Option::U8(" Stick Capacity", { "None", "10 Sticks", "20 Sticks", "30 Sticks" }, { "" }); Option StartingPictographBox = Option::U8(" Pictograph Box", { "None", "PictoBox" }, { "" }); @@ -222,7 +222,7 @@ namespace Settings { &StartingGaroMask, &StartingCaptainsHat, &StartingGiantsMask, - &StartingFierceDietyMask, + &StartingFierceDeityMask, &StartingMaskOfTruth, &StartingSongsToggle, &StartingOathToOrder, @@ -312,13 +312,13 @@ namespace Settings { Option ShuffleGFRewards = Option::U8("Great Fairy Rewards", {"Vanilla", "Great Fairies", "Anywhere" }, { shuffleGFVanilla, shuffleGFSelf, shuffleGFAnywhere }, OptionCategory::Setting, (u8)GreatFairyRewardShuffleSetting::GFREWARDSHUFFLE_VANILLA); Option ShuffleMainInventory = Option::Bool("Main Inventory", {"Vanilla", "Random"}, { shuffleMainInventoryDesc}, OptionCategory::Toggle, 1); Option ShuffleTransformation = Option::Bool("Transformation Masks", {"Vanilla", "Random"}, { shuffleTransformationDesc}); - Option ShuffleFierceDiety = Option::Bool("Fierce Diety Mask", {"Vanilla", "Random"}, { shuffleFierceDietyDesc}); + Option ShuffleFierceDeity = Option::Bool("Fierce Deity Mask", {"Vanilla", "Random"}, { shuffleFierceDeityDesc}); Option ShuffleMoonItems = Option::Bool("Shuffle Moon Items", {"Off", "On"}, {shuffleMoonItemsDesc}); std::vectoritemPoolSettingsOptions = { &ItemPoolValue, &ShuffleMainInventory, &ShuffleTransformation, - &ShuffleFierceDiety, + &ShuffleFierceDeity, &ShuffleMasks, &ShuffleGFRewards, &ShufflePiecesOfHeart, @@ -362,7 +362,7 @@ namespace Settings { Option BlastMaskCooldown = Option::U8("Blast Mask Cooldown", { "Default", "Instant", "Very Short", "Short", "Long", "Very Long" }, { blastDefault, blastInstant, blastVeryShort, blastShort, blastLong, blastVeryLong }); Option UnderwaterOcarina = Option::Bool("Underwater Ocarina", { "No","Yes" }, { underwaterOcarinaDesc }, OptionCategory::Toggle); - Option FierceDietyAnywhere = Option::Bool("Fierce Diety Anywhere", { "No","Yes" }, { fierceDietyAnywhereDesc }, OptionCategory::Toggle); + Option FierceDeityAnywhere = Option::Bool("Fierce Deity Anywhere", { "No","Yes" }, { fierceDeityAnywhereDesc }, OptionCategory::Toggle); Option ProgressiveGildedSword = Option::Bool("Progressive Gilded Sword", { "Off", "On" }, { progressiveGildedSwordDesc }); Option StartingSpin = Option::Bool("Starting Spin", { "Vanilla", "Upgraded" }, { startingSpinDesc }); Option AmmoDrops = Option::U8("Ammo Drops", { "Off", "On" }, { ammoDropDesc }); @@ -373,7 +373,7 @@ namespace Settings { &BlastMaskCooldown, &UnderwaterOcarina, - &FierceDietyAnywhere, + &FierceDeityAnywhere, //&ProgressiveGildedSword, &StartingSpin, &AmmoDrops, @@ -620,7 +620,7 @@ namespace Settings { ctx.itemPoolValue = ItemPoolValue.Value(); //ctx.shuffleMainInventory = (ShuffleMainInventory) ? 1 : 0; //ctx.shuffleTransformation = (ShuffleTransformation) ? 1 : 0; - //ctx.shuffleFierceDiety = (ShuffleFierceDiety) ? 1:0; + //ctx.shuffleFierceDeity = (ShuffleFierceDeity) ? 1:0; //ctx.shuffleMasks = (ShuffleMasks) ? 1 : 0; ctx.shuffleGreatFairyRewards = ShuffleGFRewards.Value(); //ctx.shufflePiecesOfHeart = (ShufflePiecesOfHeart) ? 1:0; @@ -639,7 +639,7 @@ namespace Settings { //ctx.blastMaskCooldown = BlastMaskCooldown.Value(); //ctx.underwaterOcarina = (UnderwaterOcarina) ? 1 : 0; - //ctx.fierceDietyAnywhere = (FierceDietyAnywhere) ? 1 : 0; + //ctx.fierceDeityAnywhere = (FierceDeityAnywhere) ? 1 : 0; ctx.skipMinigamePhases = (SkipMinigamePhases) ? 1 : 0; ctx.skipEponaRace = (SkipEponaRace) ? 1 : 0; //ctx.fastLabFish = (FastLabFish) ? 1 : 0; @@ -765,7 +765,7 @@ namespace Settings { ctx.startingGaroMask = StartingGaroMask.Value(); ctx.startingCaptainsHat = StartingCaptainsHat.Value(); ctx.startingGiantsMask = StartingGiantsMask.Value(); - ctx.startingFierceDietyMask = StartingFierceDietyMask.Value(); + ctx.startingFierceDeityMask = StartingFierceDeityMask.Value(); ctx.startingMaskOfTruth = StartingMaskOfTruth.Value(); //Restoration Features @@ -1419,7 +1419,7 @@ namespace Settings { ShuffleHeartContainers.SetSelectedIndex(0); ShuffleMainInventory.SetSelectedIndex(0); ShuffleTransformation.SetSelectedIndex(0); - ShuffleFierceDiety.SetSelectedIndex(0); + ShuffleFierceDeity.SetSelectedIndex(0); ShuffleMasks.SetSelectedIndex(0); ShuffleGFRewards.SetSelectedIndex(0); ShufflePiecesOfHeart.SetSelectedIndex(0); diff --git a/source/starting_inventory.cpp b/source/starting_inventory.cpp index 6d1d906..f16989b 100644 --- a/source/starting_inventory.cpp +++ b/source/starting_inventory.cpp @@ -134,7 +134,7 @@ void GenerateStartingInventory() { AddItemToInventory(GAROS_MASK, StartingGaroMask.Value()); AddItemToInventory(CAPTAINS_HAT, StartingCaptainsHat.Value()); AddItemToInventory(GIANTS_MASK, StartingGiantsMask.Value()); - AddItemToInventory(FIERCE_DIETY_MASK, StartingFierceDietyMask.Value()); + AddItemToInventory(FIERCE_DEITY_MASK, StartingFierceDeityMask.Value()); AddItemToInventory(MASK_OF_TRUTH, StartingMaskOfTruth.Value()); From 26a418409f4bfe43e65d10a1a12f62d7cc88d6ef Mon Sep 17 00:00:00 2001 From: PhlexPlexico Date: Thu, 22 Feb 2024 12:25:03 -0600 Subject: [PATCH 21/47] Update chest logic to be less restrictive on repeat items. (#56) Things like ammo/rupees/etc will now be repeatable. --- Z3DR | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Z3DR b/Z3DR index 9c46098..c7fde8c 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit 9c46098003dcdf1beed3015893f0d48fdd58c611 +Subproject commit c7fde8ca93e23f24ab6f783c90dd4b72e85c20b1 From 82d9ec61111d92bb26261cb34a413d2182678028 Mon Sep 17 00:00:00 2001 From: PhlexPlexico Date: Thu, 22 Feb 2024 13:02:56 -0600 Subject: [PATCH 22/47] Implement blast mask cooldown changes. Includes new comfort menu. (#57) --- Z3DR | 2 +- source/setting_descriptions.cpp | 14 +++++--------- source/settings.cpp | 18 +++++++++--------- 3 files changed, 15 insertions(+), 19 deletions(-) diff --git a/Z3DR b/Z3DR index c7fde8c..1cf9682 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit c7fde8ca93e23f24ab6f783c90dd4b72e85c20b1 +Subproject commit 1cf968275c1312b4a8b085e8ae2312f98145171d diff --git a/source/setting_descriptions.cpp b/source/setting_descriptions.cpp index 3f37cc4..200fd42 100644 --- a/source/setting_descriptions.cpp +++ b/source/setting_descriptions.cpp @@ -393,17 +393,13 @@ string_view removeDDDesc = "If set the double defense item will be /*------------------------------ // | BLAST MASK COOLDOWN | // ------------------------------*/ // -string_view blastDefault = "**OPTION CURRENTLY WIP**\n" // - "Sets the cooldown time on the blastmask to \n" // +string_view blastDefault = "Sets the cooldown time on the blastmask to \n" // "the default cooldown time of 10 seconds"; // -string_view blastInstant = "**OPTION CURRENTLY WIP**\n" // - "Sets the cooldown time on the blastmask to \n" // +string_view blastInstant = "Sets the cooldown time on the blastmask to \n" // "have no cooldown time"; // -string_view blastVeryShort = "**OPTION CURRENTLY WIP**\n" // - "Sets the cooldown time on the blastmask to \n" // - "have an even shorter cooldown time of 1 second"; // -string_view blastShort = "**OPTION CURRENTLY WIP**\n" // - "Sets the cooldown time on the blastmask to \n" // +string_view blastVeryShort = "Sets the cooldown time on the blastmask to \n" // + "have an even shorter cooldown time of 3 seconds"; // +string_view blastShort = "Sets the cooldown time on the blastmask to \n" // "have a shorter cooldown time of 5 seconds"; // string_view blastLong = "**OPTION CURRENTLY WIP**\n" // "Sets the cooldown time on the blastmask to \n" // diff --git a/source/settings.cpp b/source/settings.cpp index 3249c67..015d0c5 100644 --- a/source/settings.cpp +++ b/source/settings.cpp @@ -360,7 +360,7 @@ namespace Settings { /*COMFORT*/ - Option BlastMaskCooldown = Option::U8("Blast Mask Cooldown", { "Default", "Instant", "Very Short", "Short", "Long", "Very Long" }, { blastDefault, blastInstant, blastVeryShort, blastShort, blastLong, blastVeryLong }); + Option BlastMaskCooldown = Option::U8("Blast Mask Cooldown", {"Default", "Short", "Very Short", "Instant"}, { blastDefault, blastShort, blastVeryShort, blastInstant }); Option UnderwaterOcarina = Option::Bool("Underwater Ocarina", { "No","Yes" }, { underwaterOcarinaDesc }, OptionCategory::Toggle); Option FierceDeityAnywhere = Option::Bool("Fierce Deity Anywhere", { "No","Yes" }, { fierceDeityAnywhereDesc }, OptionCategory::Toggle); Option ProgressiveGildedSword = Option::Bool("Progressive Gilded Sword", { "Off", "On" }, { progressiveGildedSwordDesc }); @@ -372,12 +372,12 @@ namespace Settings { std::vector comfortOptions = { &BlastMaskCooldown, - &UnderwaterOcarina, - &FierceDeityAnywhere, + // &UnderwaterOcarina, + // &FierceDeityAnywhere, //&ProgressiveGildedSword, - &StartingSpin, - &AmmoDrops, - &HeartDropRefills, + // &StartingSpin, + // &AmmoDrops, + // &HeartDropRefills, //&BombchusInLogic, }; @@ -543,7 +543,7 @@ namespace Settings { //Menu mainSettings = Menu::SubMenu("Main Settings", &mainSettingsOptions); - Menu comfort = Menu::SubMenu("Comfort", &comfortOptions); + Menu comfort = Menu::SubMenu("Comfort Settings", &comfortOptions); Menu restorationSettings = Menu::SubMenu("Restoration Settings", &restorationOptions); Menu cutsceneSettings = Menu::SubMenu("Cutscene Settings", &cutsceneOptions); Menu settingsPresets = Menu::SubMenu("Settings Presets", &settingsPresetItems); @@ -563,7 +563,7 @@ namespace Settings { &itemPool, &startingInventory, &detailLogic, - //&comfort, + &comfort, &restorationSettings, &cutsceneSettings, &otherSettings, @@ -637,7 +637,7 @@ namespace Settings { ctx.ingameSpoilers = (IngameSpoilers) ? 1 : 0; //ctx.menuOpeningButton = MenuOpeningButton.Value(); - //ctx.blastMaskCooldown = BlastMaskCooldown.Value(); + ctx.blastMaskCooldown = BlastMaskCooldown.Value(); //ctx.underwaterOcarina = (UnderwaterOcarina) ? 1 : 0; //ctx.fierceDeityAnywhere = (FierceDeityAnywhere) ? 1 : 0; ctx.skipMinigamePhases = (SkipMinigamePhases) ? 1 : 0; From 0bf0b8459a88dbab423290618687f27c56d8d034 Mon Sep 17 00:00:00 2001 From: PhlexPlexico Date: Sat, 24 Feb 2024 16:09:33 -0600 Subject: [PATCH 23/47] Logic fixes (#58) * Update base patch to bring in all new fixes and features. * Logic Fixes1 - Adjusts Postman's Freedom to no longer be repeatable - Deku Mask is no longer required to enter Stone Tower Temple - Pirate Hideout Beehive no longer accepts Hookshot as a valid way to knock down. - Snowhead Stray Fairies behind invisible walls now expect lens of truth to collect - Mountain Village Waterfall Chest now expects lens of truth as it is invisible - Beneath the Well left side chest now expects lens of truth as it is invisible - Twin Islands Goron Track Grotto now expects either Goron Mask or Hookshot to reach * Update starting_inventory.cpp Make it so tingle maps don't get removed from pool when mapsandcompasses is start with --------- Co-authored-by: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> --- Z3DR | 2 +- source/item_location.cpp | 10 +++++----- source/location_access.cpp | 18 +++++++++--------- source/starting_inventory.cpp | 6 ------ 4 files changed, 15 insertions(+), 21 deletions(-) diff --git a/Z3DR b/Z3DR index 1cf9682..ffa1f85 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit 1cf968275c1312b4a8b085e8ae2312f98145171d +Subproject commit ffa1f85a64f1544dc71b22b03da082f548c6c4f2 diff --git a/source/item_location.cpp b/source/item_location.cpp index 53e1788..9afcac0 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -38,7 +38,7 @@ void LocationTable_Init() { locationTable[E_CLOCK_TOWN_ARCHERY_2] = ItemLocation::Base (0x20, 0x0C, false, "ECT Archery #2", E_CLOCK_TOWN_ARCHERY_2, PIECE_OF_HEART, {Category::cEastClockTown, Category::cMinigame , Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); locationTable[E_CLOCK_TOWN_HONEY_DARLING_3DAYS] = ItemLocation::Base (0x11, 0x0C, false, "ECT Honey and Darling 3 Days", E_CLOCK_TOWN_HONEY_DARLING_3DAYS, PIECE_OF_HEART, {Category::cEastClockTown, Category::cMinigame , Category::cVanillaHeartPiece,Category::cDayThree}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); locationTable[E_CLOCK_TOWN_TREASURE_CHEST_GAME_GORON] = ItemLocation::Chest (0x17, 0x00, true, "ECT Treasure Chest Game (Goron)", E_CLOCK_TOWN_TREASURE_CHEST_GAME_GORON, PIECE_OF_HEART, {Category::cEastClockTown, Category::cMinigame, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); - locationTable[E_CLOCK_TOWN_POSTMAN_FREEDOM] = ItemLocation::Base (0x6C, 0x84, true, "ECT Postman's Freedom", E_CLOCK_TOWN_POSTMAN_FREEDOM, POSTMANS_HAT, {Category::cEastClockTown, Category::cVanillaMask,Category::cDayThree}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); + locationTable[E_CLOCK_TOWN_POSTMAN_FREEDOM] = ItemLocation::Base (0x6C, 0x84, false, "ECT Postman's Freedom", E_CLOCK_TOWN_POSTMAN_FREEDOM, POSTMANS_HAT, {Category::cEastClockTown, Category::cVanillaMask,Category::cDayThree}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); locationTable[E_CLOCK_TOWN_GORMAN] = ItemLocation::Base (0x15, 0x83, false, "ECT Milk Bar Gorman", E_CLOCK_TOWN_GORMAN, CIRCUS_LEADERS_MASK, {Category::cEastClockTown, Category::cVanillaMask,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); locationTable[E_CLOCK_TOWN_AROMA_IN_OFFICE] = ItemLocation::Base (0x12, 0x8F, false, "ECT Mayor's Office Madame Aroma", E_CLOCK_TOWN_AROMA_IN_OFFICE, KAFEIS_MASK, {Category::cEastClockTown, Category::cVanillaMask,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); locationTable[BOMBERS_HIDEOUT_CHEST] = ItemLocation::Chest (0x29, 0x00, true, "Bombers' Hideout Chest", BOMBERS_HIDEOUT_CHEST, SILVER_RUPEE, {Category::cEastClockTown,Category::cChest,Category::cDayOne }, SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); @@ -354,10 +354,10 @@ void LocationTable_Init() { -------------------------------*/ locationTable[LINKS_POCKET] = ItemLocation::Base (0x63, 0x00, false, "Link's Pocket", LINKS_POCKET, NONE, {}, SpoilerCollectionCheck::AlwaysCollected(), SpoilerCollectionCheckGroup::GROUP_NO_GROUP ); - locationTable[ODOLWA] = ItemLocation::Reward (0x1F, 0x2D, false, "Woodfall Temple Odolwa's Remains", ODOLWAS_REMAINS, ODOLWAS_REMAINS, {}, SpoilerCollectionCheck::EventChkInf(0), SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); - locationTable[GOHT] = ItemLocation::Reward (0x44, 0x2F, false, "Snowhead Temple Goht's Remains", GOHTS_REMAINS, GOHTS_REMAINS, {}, SpoilerCollectionCheck::EventChkInf(0), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); - locationTable[GYORG] = ItemLocation::Reward (0x5F, 0x30, false, "Great Bay Temple Gyorg's Remains", GYORGS_REMAINS, GYORGS_REMAINS, {}, SpoilerCollectionCheck::EventChkInf(0), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); - locationTable[TWINMOLD] = ItemLocation::Reward (0x36, 0x31, false, "Stone Tower Temple Twinmold's Remains", TWINMOLDS_REMAINS, TWINMOLDS_REMAINS, {}, SpoilerCollectionCheck::EventChkInf(0), SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); + locationTable[ODOLWA] = ItemLocation::Base (0x1F, 0x2D, false, "Woodfall Temple Odolwa's Remains", ODOLWAS_REMAINS, ODOLWAS_REMAINS, {}, SpoilerCollectionCheck::EventChkInf(0), SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); + locationTable[GOHT] = ItemLocation::Base (0x44, 0x2F, false, "Snowhead Temple Goht's Remains", GOHTS_REMAINS, GOHTS_REMAINS, {}, SpoilerCollectionCheck::EventChkInf(0), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); + locationTable[GYORG] = ItemLocation::Base (0x5F, 0x30, false, "Great Bay Temple Gyorg's Remains", GYORGS_REMAINS, GYORGS_REMAINS, {}, SpoilerCollectionCheck::EventChkInf(0), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); + locationTable[TWINMOLD] = ItemLocation::Base (0x36, 0x31, false, "Stone Tower Temple Twinmold's Remains", TWINMOLDS_REMAINS, TWINMOLDS_REMAINS, {}, SpoilerCollectionCheck::EventChkInf(0), SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); locationTable[MAJORA] = ItemLocation::Reward (0x0B, 0x00, false, "Majora", MAJORA, MAJORAS_MASK, {}, SpoilerCollectionCheck::None(), SpoilerCollectionCheckGroup::GROUP_DUNGEON_THE_MOON ); /*------------------------------- diff --git a/source/location_access.cpp b/source/location_access.cpp index 579675d..a8da61f 100644 --- a/source/location_access.cpp +++ b/source/location_access.cpp @@ -1027,7 +1027,7 @@ void AreaTable_Init() { //Locations 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_WATERFALL_CHEST, {[] {return SnowheadClear && LensOfTruth && MagicMeter;}}), LocationAccess(MOUNTAIN_VILLAGE_KEATON_QUIZ, {[]{return SnowheadClear && KeatonMask && AnySword;}}), //Gossip Stones LocationAccess(MV_NEAR_FROGS_GOSSIP, {[] {return true;}}), @@ -1112,7 +1112,7 @@ void AreaTable_Init() { { //Exits Entrance(TWIN_ISLANDS, {[]{return true;}}), - Entrance(TWIN_ISLANDS_GORON_RACETRACK_GROTTO, {[]{return AnyBombBag;}}), + Entrance(TWIN_ISLANDS_GORON_RACETRACK_GROTTO, {[]{return AnyBombBag || (Hookshot || GoronMask);}}), }); areaTable[TWIN_ISLANDS_GORON_RACETRACK_GROTTO] = Area("Goron Racetrack Grotto", "Goron Racetrack Grotto", NONE, { @@ -1901,8 +1901,8 @@ void AreaTable_Init() { { //Exits Entrance(IKANA_CANYON_UPPER, {[]{return true;}}), - Entrance(STONE_TOWER_TEMPLE_ENTRANCE, {[]{return CanPlay(ElegyOfEmptiness) && GoronMask && ZoraMask && DekuMask && Hookshot;}}), - Entrance(INVERTED_STONE_TOWER, {[]{return CanPlay(ElegyOfEmptiness) && GoronMask && ZoraMask && DekuMask && Hookshot && Bow && LightArrows && MagicMeter;}}), + Entrance(STONE_TOWER_TEMPLE_ENTRANCE, {[]{return CanPlay(ElegyOfEmptiness) && GoronMask && ZoraMask && Hookshot;}}), + Entrance(INVERTED_STONE_TOWER, {[]{return CanPlay(ElegyOfEmptiness) && GoronMask && ZoraMask && Hookshot && Bow && LightArrows && MagicMeter;}}), }); areaTable[INVERTED_STONE_TOWER] = Area("Inverted Stone Tower", "Inverted Stone Tower", INVERTED_STONE_TOWER, { @@ -2293,7 +2293,7 @@ void AreaTable_Init() { { //Locations LocationAccess(SNOWHEAD_TEMPLE_ICICLE_ROOM_CHEST, {[] {return Bow;}}), - LocationAccess(SH_SF_ICICLE_ROOM_WALL, {[] {return Bow && GreatFairyMask;}}), + LocationAccess(SH_SF_ICICLE_ROOM_WALL, {[] {return Bow && GreatFairyMask && LensOfTruth && MagicMeter;}}), }, { //Exits @@ -2306,7 +2306,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(SH_SF_CEILING_BUBBLE, {[] {return (Hookshot || Bow) && GreatFairyMask;}}), + LocationAccess(SH_SF_CEILING_BUBBLE, {[] {return (Hookshot || Bow) && GreatFairyMask && LensOfTruth && MagicMeter;}}), }, { //Exits @@ -2319,7 +2319,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(SH_SF_MAIN_ROOM_WALL, {[] {return (Bow || Hookshot) && GreatFairyMask;}}), + LocationAccess(SH_SF_MAIN_ROOM_WALL, {[] {return (Bow || Hookshot) && GreatFairyMask && LensOfTruth && MagicMeter;}}), }, { //Exits @@ -3105,7 +3105,7 @@ void AreaTable_Init() { areaTable[PIRATE_FORTRESS_HOOKSHOT_ROOM_TOP] = Area("Pirates Fortress Upper Hookshot Room", "Pirates Fortress Upper Hookshot Room", PIRATE_FORTRESS, { //Events - EventAccess(&PirateBees, {[]{return Bow || Hookshot;}}), + EventAccess(&PirateBees, {[]{return Bow;}}),//potential trick for zora fins or deku bubble? }, { //Locations @@ -3225,7 +3225,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(WELL_LEFT_PATH_CHEST, {[] {return true;}}), + LocationAccess(WELL_LEFT_PATH_CHEST, {[] {return LensOfTruth && MagicMeter;}}),//invisible chest }, { //Exits diff --git a/source/starting_inventory.cpp b/source/starting_inventory.cpp index f16989b..d08e944 100644 --- a/source/starting_inventory.cpp +++ b/source/starting_inventory.cpp @@ -25,12 +25,6 @@ void GenerateStartingInventory() { for (auto* dungeon : dungeonList) { if (dungeon->GetMap() != NONE) { AddItemToInventory(dungeon->GetMap()); - AddItemToInventory(CLOCK_TOWN_MAP); - AddItemToInventory(WOODFALL_MAP); - AddItemToInventory(SNOWHEAD_MAP); - AddItemToInventory(ROMANI_RANCH_MAP); - AddItemToInventory(GREAT_BAY_MAP); - AddItemToInventory(STONE_TOWER_MAP); } if (dungeon->GetCompass() != NONE) { From 5d9cf4d9aed2b0e8b69d2884b36b5a2652fc43cb Mon Sep 17 00:00:00 2001 From: PhlexPlexico Date: Sun, 25 Feb 2024 20:43:49 -0600 Subject: [PATCH 24/47] Update patch code to bring in new changes. (#61) --- Z3DR | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Z3DR b/Z3DR index ffa1f85..bd7103a 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit ffa1f85a64f1544dc71b22b03da082f548c6c4f2 +Subproject commit bd7103a7b3a59d671ef8578fd5305b2a4ffc1e9f From 44677483723b164f66a4537b377d398ff3b1c6aa Mon Sep 17 00:00:00 2001 From: PhlexPlexico Date: Mon, 26 Feb 2024 07:43:37 -0600 Subject: [PATCH 25/47] Update base patch to fix lens of truth checks. (#63) --- Z3DR | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Z3DR b/Z3DR index bd7103a..d965c90 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit bd7103a7b3a59d671ef8578fd5305b2a4ffc1e9f +Subproject commit d965c90fde37af48d3f00bd8eac4f6709be25201 From 94fcecabe01d3f8b0aedb0e4f386412cfaaa5b00 Mon Sep 17 00:00:00 2001 From: PhlexPlexico Date: Tue, 27 Feb 2024 19:31:53 -0600 Subject: [PATCH 26/47] Include patch code changes for twinmold patches and bottle patches. (#65) --- Z3DR | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Z3DR b/Z3DR index d965c90..4ac8fc9 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit d965c90fde37af48d3f00bd8eac4f6709be25201 +Subproject commit 4ac8fc9c811900a48476fc3296fad4ab2005961d From 06d23207e253460dacbe5bb3ae971147186e56da Mon Sep 17 00:00:00 2001 From: PhlexPlexico Date: Thu, 29 Feb 2024 15:06:03 -0600 Subject: [PATCH 27/47] Add Restoration Twinmold Option (#66) * Twinmold Option and Logic Fixes - Adds toggle for Twinmold Restoration - Fixes Great Fairys Sword starting inventory option to actually remove the sword from the pool when toggled on - Fixes description on D-Pad Ocarina to show D-Pad Right instead of D-Pad Down - Fixes Twin Islands Goron Racetrack Grotto Requirements - Fixes Road to Snowhead Pillar HP Requirements to require Hookshot - Removes Light Arrows as potential requirement from Beneath the Well Mirror Shield Chest * Update mm3dr base repo for more patch changes. --------- Co-authored-by: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> --- Z3DR | 2 +- source/include/setting_descriptions.hpp | 1 + source/include/settings.hpp | 4 ++++ source/location_access.cpp | 9 ++++++--- source/setting_descriptions.cpp | 4 +++- source/settings.cpp | 3 +++ source/starting_inventory.cpp | 1 + 7 files changed, 19 insertions(+), 5 deletions(-) diff --git a/Z3DR b/Z3DR index 4ac8fc9..bd4499f 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit 4ac8fc9c811900a48476fc3296fad4ab2005961d +Subproject commit bd4499f6f1373c36b31fdabae8b56efca1256713 diff --git a/source/include/setting_descriptions.hpp b/source/include/setting_descriptions.hpp index 27bc7be..298c6ed 100644 --- a/source/include/setting_descriptions.hpp +++ b/source/include/setting_descriptions.hpp @@ -215,6 +215,7 @@ extern string_view fastZoraSwimDesc; extern string_view dpadMaskDesc; extern string_view dpadOcarinaDesc; extern string_view dpadArrowDesc; +extern string_view twinmoldRestorationDesc; extern string_view customMapButtonDesc; extern string_view customItemsButtonDesc; extern string_view customMasksButtonDesc; diff --git a/source/include/settings.hpp b/source/include/settings.hpp index 2124cfe..455fa6f 100644 --- a/source/include/settings.hpp +++ b/source/include/settings.hpp @@ -448,6 +448,10 @@ namespace Settings { extern Option SkipSongReplays; extern Option FastZoraSwim; extern Option OcarinaDive; + extern Option DpadTransform; + extern Option DpadOcarina; + extern Option DpadArrows; + extern Option TwinmoldRestoraion; //Trial Skips extern Option OdolwaTrialSkip; diff --git a/source/location_access.cpp b/source/location_access.cpp index a8da61f..b251e3e 100644 --- a/source/location_access.cpp +++ b/source/location_access.cpp @@ -352,6 +352,7 @@ void AreaTable_Init() { areaTable[CLOCK_TOWN_OBSERVATORY] = Area("Astral Observatory/Bombers Hideout", "Astral Obseravtory/Bombers Hideout", NONE, { //Events EventAccess(&WatchMoonTearFall, {[]{return true;}}), + EventAccess(&ScarecrowSong, {[]{return Ocarina;}}), }, { //Locations @@ -502,6 +503,8 @@ void AreaTable_Init() { areaTable[CLOCK_TOWN_TRADING_POST] = Area("Trading Post", "Trading Post", NONE, { //Events + EventAccess(&ScarecrowSong, {[]{return Ocarina;}}), + EventAccess(&SpringWater, {[]{return SpringWater;}}), }, { //Locations @@ -1112,7 +1115,7 @@ void AreaTable_Init() { { //Exits Entrance(TWIN_ISLANDS, {[]{return true;}}), - Entrance(TWIN_ISLANDS_GORON_RACETRACK_GROTTO, {[]{return AnyBombBag || (Hookshot || GoronMask);}}), + Entrance(TWIN_ISLANDS_GORON_RACETRACK_GROTTO, {[]{return AnyBombBag && ( (Hookshot && ScarecrowSong) || GoronMask);}}), }); areaTable[TWIN_ISLANDS_GORON_RACETRACK_GROTTO] = Area("Goron Racetrack Grotto", "Goron Racetrack Grotto", NONE, { @@ -1211,7 +1214,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(ROAD_TO_SNOWHEAD_PILLAR, {[] {return GoronMask && MagicMeter && LensOfTruth;}}), + LocationAccess(ROAD_TO_SNOWHEAD_PILLAR, {[] {return GoronMask && MagicMeter && LensOfTruth && Hookshot && ScarecrowSong;}}), }, { @@ -3332,7 +3335,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(BENEATH_THE_WELL_MIRROR_SHIELD_CHEST, {[] {return (FireArrows || LightArrows) && Bow && MagicMeter;}}),//Either burn the cloth or just light arow the switch + LocationAccess(BENEATH_THE_WELL_MIRROR_SHIELD_CHEST, {[] {return FireArrows && Bow && MagicMeter;}}),//Either burn the cloth or just light arow the switch }, { //Exits diff --git a/source/setting_descriptions.cpp b/source/setting_descriptions.cpp index 200fd42..bd2384c 100644 --- a/source/setting_descriptions.cpp +++ b/source/setting_descriptions.cpp @@ -613,10 +613,12 @@ string_view ocarinaDiveDesc = "Enables Ocarina Diving"; string_view dpadMaskDesc = "Enables using the 3 D-Pad buttons to use\n" // "transformation masks. This option will also\n" // "patch using Down A with Mask Storage."; // -string_view dpadOcarinaDesc = "Enables using D-Pad down to activate your\n" // +string_view dpadOcarinaDesc = "Enables using D-Pad right to activate your\n" // "ocarina."; // string_view dpadArrowDesc = "Enables using D-Pad up to change your current\n" // "arrow that is being used."; // +string_view twinmoldRestorationDesc = "Fixes Twinmold boss fight so Red Twinmold does not\n" + "regen health when it burrows."; // // /*------------------------------- // | CUSTOM BUTTON MAPPING | // diff --git a/source/settings.cpp b/source/settings.cpp index 015d0c5..eebabda 100644 --- a/source/settings.cpp +++ b/source/settings.cpp @@ -397,6 +397,7 @@ namespace Settings { Option DpadTransform = Option::Bool("DPad Transformation", { "No", "Yes" }, {dpadMaskDesc}); Option DpadOcarina = Option::Bool("DPad Ocarina", { "No", "Yes" }, {dpadOcarinaDesc}); Option DpadArrows = Option::Bool("Dpad Arrow Swap", { "No", "Yes" }, {dpadArrowDesc}); + Option TwinmoldRestoration = Option::Bool("Twinmold Restoration", { "No", "Yes" }, {twinmoldRestorationDesc}); std::vector