From 5f2ccc9cba916c93c106c15af272a4c7bcaa0e4c Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sat, 4 Jul 2026 15:58:35 -0500 Subject: [PATCH 1/3] ProgressiveLullaby Adds in new custom item to support Progressive Lullaby --- source/hint_list.cpp | 6 ++++++ source/include/keys.hpp | 1 + source/include/logic.hpp | 1 + source/item_list.cpp | 1 + source/item_location.cpp | 4 ++-- source/item_pool.cpp | 10 ++++++---- source/location_access.cpp | 10 +++++----- source/logic.cpp | 2 ++ source/starting_inventory.cpp | 2 +- 9 files changed, 25 insertions(+), 12 deletions(-) diff --git a/source/hint_list.cpp b/source/hint_list.cpp index 6d1a894..05ea802 100644 --- a/source/hint_list.cpp +++ b/source/hint_list.cpp @@ -440,6 +440,12 @@ void HintTable_Init() { }, //clear Text{"a progressive magic power", "une amélioration d'énergie magique", "un poder mágico progresivo"} ); + hintTable[PROGRESSIVE_LULLABY] = HintText::Item({ + //obscure + Text{"a progressive lullaby", "une berceuse progressive", "una canción de cuna progresiva"} + }, //clear + Text{"a progressive lullaby", "une berceuse progressive", "una canción de cuna progresiva"} + ); //PROGRESSIVE_BOMBCHUS //BOTTLE ITEMS hintTable[EMPTY_BOTTLE] = HintText::Item({ diff --git a/source/include/keys.hpp b/source/include/keys.hpp index 3ed8eab..c815635 100644 --- a/source/include/keys.hpp +++ b/source/include/keys.hpp @@ -79,6 +79,7 @@ typedef enum { PROGRESSIVE_WALLET, PROGRESSIVE_MAGIC_METER, PROGRESSIVE_BOMBCHUS, + PROGRESSIVE_LULLABY, //Keys just used for Logic RAZOR_SWORD, diff --git a/source/include/logic.hpp b/source/include/logic.hpp index 4169175..aede534 100644 --- a/source/include/logic.hpp +++ b/source/include/logic.hpp @@ -139,6 +139,7 @@ namespace Logic { extern u8 ProgressiveWallet; extern u8 ProgressiveBombBag; extern u8 ProgressiveSword; + extern u8 ProgressiveLullaby; //Keys extern u8 WoodfallTempleKeys; extern u8 SnowheadTempleKeys; diff --git a/source/item_list.cpp b/source/item_list.cpp index c3b09c8..9f689ee 100644 --- a/source/item_list.cpp +++ b/source/item_list.cpp @@ -230,6 +230,7 @@ void ItemTable_Init() { //repeatable denotes that an item in a vanilla playth itemTable[PROGRESSIVE_BOW] = Item(true, false, &ProgressiveBow, Text{"Progressive Bow", "Arc (prog.)", "Arco progresivo", }, PROGRESSIVE_BOW, 0x47, ITEMTYPE_ITEM); itemTable[PROGRESSIVE_WALLET] = Item(true, false, &ProgressiveWallet, Text{"Progressive Wallet", "Bourse (prog.)", "Bolsa de rupias progresiva", }, PROGRESSIVE_WALLET, 0x48, ITEMTYPE_ITEM); itemTable[PROGRESSIVE_MAGIC_METER] = Item(true, false, &ProgressiveMagic, Text{"Progressive Magic Meter", "Jauge de magie (prog)", "Poder mágico progresivo", "", "Capacité de magie (prog.)", "" }, PROGRESSIVE_MAGIC_METER, 0x49, ITEMTYPE_GFAIRY); + itemTable[PROGRESSIVE_LULLABY] = Item(true, false, &ProgressiveLullaby, Text{"Progressive Lullaby", "Berceuse (prog.)", "Canción de cuna progresiva", "", "Berceuse (prog.)", "" }, PROGRESSIVE_LULLABY, 0x45, ITEMTYPE_SONG); itemTable[MAJORAS_MASK] = Item(true, false, &noVariable, Text{"Majora's Mask", "Masque de Majora", "Máscara de Majora", }, MAJORAS_MASK, (u32)GetItemID::GI_ERROR_NOTHING_40, ITEMTYPE_EVENT); itemTable[HINT] = Item(true, true, &noVariable, Text{"Hint", "Indice", "Pista", }, HINT, (u32)GetItemID::GI_ERROR_NOTHING_40, ITEMTYPE_EVENT); diff --git a/source/item_location.cpp b/source/item_location.cpp index be4c7a4..6530801 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -58,7 +58,7 @@ void LocationTable_Init() { locationTable[GORON_VILLAGE_LENS_OF_TRUTH_CHEST] = ItemLocation::Chest (0x07, 0x01, true, "GV Lens of Truth Chest", GORON_VILLAGE_LENS_OF_TRUTH_CHEST, LENS_OF_TRUTH, {Category::cGoronVillage, Category::cChest, Category::cDayOne, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); locationTable[GORON_VILLAGE_SCRUB_TRADE] = ItemLocation::Base (0x4D, 0x99, true, "GV Deku Scrub Merchant Trade", GORON_VILLAGE_SCRUB_TRADE, MOUNTAIN_TITLE, {Category::cGoronVillage, Category::cDekuScrub, Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); locationTable[GORON_VILLAGE_LEDGE] = ItemLocation::Collectable(0x4D, 0x00, false, "GV Piece of Heart", GORON_VILLAGE_LEDGE, PIECE_OF_HEART, {Category::cGoronVillage, Category::cVanillaHeartPiece, Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); - locationTable[GORON_VILLAGE_GORON_LULLABY] = ItemLocation::Base (0x32, 0x4D, false, "GV Goron Lullaby", GORON_VILLAGE_GORON_LULLABY, GORONS_LULLABY, {Category::cGoronVillage, Category::cSong, Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); + locationTable[GORON_VILLAGE_GORON_LULLABY] = ItemLocation::Base (0x32, 0x4D, false, "GV Goron Lullaby", GORON_VILLAGE_GORON_LULLABY, PROGRESSIVE_LULLABY, {Category::cGoronVillage, Category::cSong, Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); locationTable[LENS_CAVE_RED_RUPEE] = ItemLocation::Chest (0x07, 0x03, true, "GV Lens Cave Invisible Chest", LENS_CAVE_RED_RUPEE, RED_RUPEE, {Category::cGoronVillage, Category::cChest ,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); locationTable[LENS_CAVE_PURPLE_RUPEE] = ItemLocation::Chest (0x07, 0x06, true, "GV Lens Cave Rock Chest", LENS_CAVE_PURPLE_RUPEE, PURPLE_RUPEE, {Category::cGoronVillage, Category::cChest ,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); locationTable[GORON_VILLAGE_POWDER_KEG_CHALLENGE_SPRING] = ItemLocation::Base (0x48, 0x34, false, "GV Powder Keg Challenge (Spring)", GORON_VILLAGE_POWDER_KEG_CHALLENGE_SPRING, POWDER_KEG, {Category::cGoronVillage, Category::cDayOne, Category::cAlternateCheck, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); @@ -227,7 +227,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, 0x74, false, "TI Lullaby Intro", TWIN_ISLANDS_LULLABY_INTRO, LULLABY_INTRO, {Category::cTwinIslands, Category::cSong, Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_TWIN_ISLANDS ); + locationTable[TWIN_ISLANDS_LULLABY_INTRO] = ItemLocation::Base (0x5D, 0x74, false, "TI Lullaby Intro", TWIN_ISLANDS_LULLABY_INTRO, PROGRESSIVE_LULLABY, {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, Category::cShop, Category::cMainInventory, Category::cNoOcarinaStart}, 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, Category::cShop, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); diff --git a/source/item_pool.cpp b/source/item_pool.cpp index ea17bc5..92b550e 100644 --- a/source/item_pool.cpp +++ b/source/item_pool.cpp @@ -266,8 +266,10 @@ const std::array songList = { SONG_OF_HEALING, //SONG_OF_SOARING, SONATA_OF_AWAKENING, - LULLABY_INTRO, - GORONS_LULLABY, + //LULLABY_INTRO, + //GORONS_LULLABY, + PROGRESSIVE_LULLABY, + PROGRESSIVE_LULLABY, NEW_WAVE_BOSSA_NOVA, ELEGY_OF_EMPTINESS, OATH_TO_ORDER @@ -276,8 +278,8 @@ 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(TWIN_ISLANDS_LULLABY_INTRO, PROGRESSIVE_LULLABY); + PlaceItemInLocation(GORON_VILLAGE_GORON_LULLABY, PROGRESSIVE_LULLABY); PlaceItemInLocation(ROMANI_RANCH_ROMANIS_GAME, EPONAS_SONG); PlaceItemInLocation(GBC_BABY_ZORAS, NEW_WAVE_BOSSA_NOVA); PlaceItemInLocation(IKANA_CASTLE_IKANA_KING, ELEGY_OF_EMPTINESS); diff --git a/source/location_access.cpp b/source/location_access.cpp index 9609513..7c5b4ea 100644 --- a/source/location_access.cpp +++ b/source/location_access.cpp @@ -793,7 +793,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(TERMINA_FIELD_GOSSIP_STONES, {[] {return (GoronMask && CanPlay(GoronsLullaby)) || + LocationAccess(TERMINA_FIELD_GOSSIP_STONES, {[] {return (GoronMask && (ProgressiveLullaby >= 2)) || (DekuMask && CanPlay(SonataOfAwakening)) || (ZoraMask && CanPlay(NewWaveBossaNova));}}), LocationAccess(TF_FOUR_STONE_GROTTO_1, {[] {return true;}}), @@ -1267,11 +1267,11 @@ void AreaTable_Init() { areaTable[GORON_VILLAGE_INTERIOR] = Area("Goron Village Interior", "Goron Village Interior", GORON_VILLAGE, { //Events EventAccess(&SpokeToBabyGoron, {[]{return true;}}), - EventAccess(&RockSirloin, {[]{return GoronMask && MagicMeter && (CanUse(FIRE_ARROWS) || (CanPlay(LullabyIntro) && HasFireSourceWithTorch));}}), + EventAccess(&RockSirloin, {[]{return GoronMask && MagicMeter && (CanUse(FIRE_ARROWS) || ((ProgressiveLullaby >= 1) && HasFireSourceWithTorch));}}), }, { //Locations - LocationAccess(GORON_VILLAGE_GORON_LULLABY, {[]{return GoronMask && CanPlay(LullabyIntro);}}), + LocationAccess(GORON_VILLAGE_GORON_LULLABY, {[]{return GoronMask && (ProgressiveLullaby >= 1);}}), }, { //Exits @@ -1334,8 +1334,8 @@ void AreaTable_Init() { }, { //Exits - Entrance(SNOWHEAD_TEMPLE_ENTRANCE, {[]{return GoronMask && MagicMeter && CanPlay(GoronsLullaby);}}), - Entrance(SNOWHEAD_FAIRY_FOUNTAIN, {[]{return GoronMask && MagicMeter && CanPlay(GoronsLullaby);}}), + Entrance(SNOWHEAD_TEMPLE_ENTRANCE, {[]{return GoronMask && MagicMeter && (ProgressiveLullaby >= 2);}}), + Entrance(SNOWHEAD_FAIRY_FOUNTAIN, {[]{return GoronMask && MagicMeter && (ProgressiveLullaby >= 2);}}), Entrance(ROAD_TO_SNOWHEAD, {[]{return true;}}), }); diff --git a/source/logic.cpp b/source/logic.cpp index f51fcb0..413726e 100644 --- a/source/logic.cpp +++ b/source/logic.cpp @@ -142,6 +142,7 @@ namespace Logic { u8 ProgressiveWallet = 0; u8 ProgressiveBombBag = 0; u8 ProgressiveSword = 0; + u8 ProgressiveLullaby = 0; //Keys u8 WoodfallTempleKeys = 0; u8 SnowheadTempleKeys = 0; @@ -697,6 +698,7 @@ namespace Logic { ProgressiveWallet = 0; ProgressiveBombBag = 0; ProgressiveSword = 0; + ProgressiveLullaby = 0; //Keys WoodfallTempleKeys = 0; SnowheadTempleKeys = 0; diff --git a/source/starting_inventory.cpp b/source/starting_inventory.cpp index 575f306..a663728 100644 --- a/source/starting_inventory.cpp +++ b/source/starting_inventory.cpp @@ -84,7 +84,7 @@ void GenerateStartingInventory() { //AddItemToInventory(SONG_OF_TIME, StartingSongOfTime.Value()); AddItemToInventory(SONG_OF_STORMS, StartingSongOfStorms.Value()); AddItemToInventory(SONATA_OF_AWAKENING, StartingSonataOfAwakening.Value()); - AddItemToInventory(GORONS_LULLABY, StartingGoronsLullaby.Value()); + AddItemToInventory(PROGRESSIVE_LULLABY, StartingGoronsLullaby.Value()); AddItemToInventory(NEW_WAVE_BOSSA_NOVA, StartingNewWaveBossaNova.Value()); AddItemToInventory(ELEGY_OF_EMPTINESS, StartingElegyOfEmptiness.Value()); AddItemToInventory(SONG_OF_HEALING, StartingSongOfHealing.Value()); From b979446a02bfbdf1ff2b27b315d4c8a951f25739 Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sat, 4 Jul 2026 16:49:28 -0500 Subject: [PATCH 2/3] Update Z3DR --- Z3DR | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Z3DR b/Z3DR index f6f4ed0..195c065 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit f6f4ed0572882c92dc8fd79a7f6f65c335571eeb +Subproject commit 195c065acd12bde357916b49929245e105017b1a From 1ddea73a8c930c5d590c691cb5b95a8bc3945cb2 Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Mon, 6 Jul 2026 00:34:34 -0500 Subject: [PATCH 3/3] Remove RepeatableItemsOnTokens - Removes all instances of the RepeatableItemsOnTokens setting. We're choosing to remove this setting because it has continiously caused seed generation issues when set to Off. In addition we have resolved all issues with skulltulas giving items which was also a concern when the setting was implemented. --- source/fill.cpp | 119 ++++++++++---------------------- source/include/settings.hpp | 1 - source/item_pool.cpp | 19 ----- source/setting_descriptions.cpp | 6 -- source/settings.cpp | 2 - 5 files changed, 37 insertions(+), 110 deletions(-) diff --git a/source/fill.cpp b/source/fill.cpp index dc683b5..f4d628e 100644 --- a/source/fill.cpp +++ b/source/fill.cpp @@ -405,7 +405,7 @@ static void FastFill(std::vector items, std::vector locati static void AssumedFill(const std::vector& items, const std::vector& allowedLocations, bool setLocationsAsHintable = false) { if (items.size() > allowedLocations.size()) { - //If Tokensanity is on and RepeatableItemsOnTokens is off + //If NoRepeatOnTokens is on //Don't display this message if (NoRepeatOnTokens) { //do nothing here to not display the message @@ -444,9 +444,9 @@ static void AssumedFill(const std::vector& items, const std::vector& items, const std::vector& items, const std::vectorSetAsHintable(); - } + //Else place it and keep going + PlaceItemInLocation(selectedLocation, item); + attemptedLocations.push_back(selectedLocation); + //This tells us the location went through the randomization algorithm + //to distinguish it from locations which did not or that the player already + //knows + if (setLocationsAsHintable) { + Location(selectedLocation)->SetAsHintable(); + } - //If ALR is off, then we check beatability after placing the item. - //If the game is beatable, then we can stop placing items with logic. - if (!LocationsReachable) { - playthroughBeatable = false; - Logic::LogicReset(); - GetAccessibleLocations(allLocations, SearchMode::CheckBeatable); - if (playthroughBeatable) { - FastFill(itemsToPlace, GetAllEmptyLocations(), true); - return; - } - } + //If ALR is off, then we check beatability after placing the item. + //If the game is beatable, then we can stop placing items with logic. + if (!LocationsReachable) { + playthroughBeatable = false; + Logic::LogicReset(); + GetAccessibleLocations(allLocations, SearchMode::CheckBeatable); + if (playthroughBeatable) { + FastFill(itemsToPlace, GetAllEmptyLocations(), true); + return; } - } - else { + //place the item within one of the allowed locations accounting for if this item needs to be able to be obtained more than once and if location allows that //the only situation we don't want is a non repeatable location with a reusable item if ( !(Location(selectedLocation)->IsRepeatable()) && ItemTable(item).IsReusable() ){ - //unsuccessfulPlacement = true; -#ifdef ENABLE_DEBUG - CitraPrint("Attempting to place repeatable item in non repeatable spot in AssumedFill"); -#endif - PlacementLog_Msg("\n Attempted to place " + ItemTable(item).GetName().GetNAEnglish() + " at " + Location(selectedLocation)->GetName()); - itemsToPlace.push_back(item); - } - else { + //unsuccessfulPlacement = true; + #ifdef ENABLE_DEBUG + CitraPrint("Attempting to place repeatable item in non repeatable spot in AssumedFill"); + #endif + PlacementLog_Msg("\n Attempted to place " + ItemTable(item).GetName().GetNAEnglish() + " at " + Location(selectedLocation)->GetName()); + itemsToPlace.push_back(item); + } + else { PlaceItemInLocation(selectedLocation, item); //PlacementLog_Msg("Placed " + ItemTable(item).GetName().GetNAEnglish() + " at " + Location(selectedLocation)->GetName()); //CitraPrint("Placed " + ItemTable(item).GetName().GetNAEnglish() + " at " + Location(selectedLocation)->GetName()); attemptedLocations.push_back(selectedLocation); - + //This tells us the location went through the randomization algorithm //to distinguish it from locations which did not or that the player already //knows if (setLocationsAsHintable) { Location(selectedLocation)->SetAsHintable(); } - + //If ALR is off, then we check beatability after placing the item. //If the game is beatable, then we can stop placing items with logic. if (!LocationsReachable) { @@ -613,7 +599,8 @@ static void AssumedFill(const std::vector& items, const std::vector songs = FilterAndEraseFromPool(ItemPool, [](const ItemKey i) {return ItemTable(i).GetItemType() == ITEMTYPE_SONG;}); //If Shuffled in Song Locations restrict location pool to only song locations @@ -926,6 +912,7 @@ int Fill() { // Ensure Ocarina and Song of Time are obtainable with the current placement. // If they are not reachable with currently placed items (Rewards, Keys, etc.), // we place additional advancement items from the pool to open paths until they are reachable. + // but only if the logic setting is not set to "None" (No Logic). if (((StartingOcarina.Value() == 0) || ShuffleSongOfTime) && Settings::Logic.IsNot(LogicSetting::LOGIC_NONE)) { while (true) { Logic::LogicReset(); @@ -1041,38 +1028,6 @@ int Fill() { AssumedFill(gfItems, gfLocations, true); } - //Then if repeatable items on tokens is off -- fill token spots with nonrepeatable items - if (Tokensanity && !RepeatableItemsOnTokens){ - //Set Variable to not mess with fill algorithm - NoRepeatOnTokens = true; - //Get SSH locations - std::vector SwampSkullLocations = FilterFromPool(allLocations, [](const LocationKey loc) {return Location(loc)->IsCategory(Category::cSwampSkulltula);}); - //Get NonRepeatItems - std::vector NonRepeatItems = FilterAndEraseFromPool(ItemPool, [](const ItemKey i) {return !ItemTable(i).IsReusable();}); - //fill SSH spots with nonrepeatableitems - AssumedFill(NonRepeatItems, SwampSkullLocations, true); - - //Get OSH locations - std::vector OceanSkullLocations = FilterFromPool(allLocations, [](const LocationKey loc1) {return Location(loc1)->IsCategory(Category::cOceanSkulltula);}); - //Get NonRepeatItems - std::vector NonRepeatItems2 = FilterAndEraseFromPool(ItemPool, [](const ItemKey i) {return !ItemTable(i).IsReusable();}); - //CitraPrint("Items in NonRepeatItems2:\n"); - //fill OSH spots with NonRepeatableItems - AssumedFill(NonRepeatItems2, OceanSkullLocations, true); - //Set Variable back to false to go back to normal filling - NoRepeatOnTokens = false; - - //Then Place Anju & Kafei Items in spots accessable on Day 1, this should prevent situations where you cant get an item in time for its use - //Do this before continuing as the pool of accessable locations is smaller after filling all skulltula locations - std::vector day1Locations = FilterFromPool(allLocations, [](const LocationKey loc) {return Location(loc)->IsCategory(Category::cDayOne);}); - std::vector anjukafeiitems = FilterAndEraseFromPool(ItemPool, [](const ItemKey i) {return ItemTable(i).GetItemType() == ITEMTYPE_QUEST;}); - AssumedFill(anjukafeiitems, day1Locations,true); - - //get the rest of the repeatable items and fill them in -- may not be needed? - //std::vector remainingRepeatItems = FilterAndEraseFromPool(ItemPool, [](const ItemKey i) {return ItemTable(i).IsReusable();}); - //CitraPrint("Starting Fill of remaining Repeat Items"); - //AssumedFill(remainingRepeatItems, allLocations,true); - } //Place Main Inventory First //So first get all items in the pool + DekuMask, diff --git a/source/include/settings.hpp b/source/include/settings.hpp index 29865d6..0b94337 100644 --- a/source/include/settings.hpp +++ b/source/include/settings.hpp @@ -568,7 +568,6 @@ namespace Settings { extern std::vector gameOptions; extern Menu gameSettings; - extern Option RepeatableItemsOnTokens; extern std::vector shuffleItemsMenu; } diff --git a/source/item_pool.cpp b/source/item_pool.cpp index 92b550e..57d670c 100644 --- a/source/item_pool.cpp +++ b/source/item_pool.cpp @@ -1103,25 +1103,6 @@ void GenerateItemPool() { AddItemToMainPool(OCEANSIDE_SKULLTULA_TOKEN, 30); std::vector SwampSkullLocations = FilterFromPool(allLocations, [](const LocationKey loc) {return Location(loc)->IsCategory(Category::cSwampSkulltula);}); std::vector OceanSkullLocations = FilterFromPool(allLocations, [](const LocationKey loc1) {return Location(loc1)->IsCategory(Category::cOceanSkulltula);}); - - //REPEATABLE ITEMS ON SKULLTOKENS - if(RepeatableItemsOnTokens){ - for (LocationKey loc : SwampSkullLocations) { - Location(loc)->SetRepeatable(true); - } - for (LocationKey loc1 : OceanSkullLocations) { - Location(loc1)->SetRepeatable(true); - } - } - else { - //DEFAULT REPEATABLE TO FALSE - for (LocationKey loc : SwampSkullLocations) { - Location(loc)->SetRepeatable(false); - } - for (LocationKey loc1 : OceanSkullLocations) { - Location(loc1)->SetRepeatable(false); - } - } } else { PlaceVanillaSkulltulaTokens(); diff --git a/source/setting_descriptions.cpp b/source/setting_descriptions.cpp index 08c127e..524accb 100644 --- a/source/setting_descriptions.cpp +++ b/source/setting_descriptions.cpp @@ -657,12 +657,6 @@ string_view LanguageDesc = "Selected region differs from console mean "Also, Spanish is incomplete and will currently \n" // "be Latin Spanish regardless of game region"; // /*------------------------------ // -| REPEATABLE ITEMS ON TOKENS | // -------------------------------*/ // -string_view repeatItemsOnTokensDesc = "Allows items potentially needed more than once \n" // - "such as Title Deeds and Anju & Kafei quest items \n"// - "to be placed on gold skulltula drops"; // -/*------------------------------ // | MOON AND MAJORA REQUIREMENTS | // ------------------------------*/ // string_view MoonRemainsRequiredDesc = "Select the number of Boss Remains needed to \n" // diff --git a/source/settings.cpp b/source/settings.cpp index 6c1c6b3..9a65c86 100644 --- a/source/settings.cpp +++ b/source/settings.cpp @@ -389,11 +389,9 @@ namespace Settings { //Item Pool Settings Option ItemPoolValue = Option::U8 ("Item Pool", {"Plentiful", "Balanced", "Scarce", "Minimal" }, {itemPoolPlentiful, itemPoolBalanced, itemPoolScarce, itemPoolMinimal }, OptionCategory::Setting, (u8)ItemPoolSetting::ITEMPOOL_BALANCED); Option RemoveDoubleDefense = Option::Bool("Remove Double Defense", {"No", "Yes"}, {removeDDDesc}); - Option RepeatableItemsOnTokens= Option::Bool("Repeat Items on Tokens",{"No", "Yes"}, {repeatItemsOnTokensDesc}); std::vectoritemPoolSettingsOptions = { &ItemPoolValue, &RemoveDoubleDefense, - &RepeatableItemsOnTokens, }; Option GossipStoneHints = Option::U8("Gossip Stone Hints", { "No Hints", "Need Nothing", "Mask of Truth" }, { gossipStonesHintsDesc }, OptionCategory::Setting, (u8)GossipStoneHintsSetting::HINTS_NEED_NOTHING);