From 8c2cf4cc720a3df7b6cbb3cac3af60675ba22e15 Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sat, 18 Jul 2026 18:15:42 -0500 Subject: [PATCH 01/12] FairySanity - Implements logic for shuffling Stray Fairies with the same settings as other Dungeon Items ("Vanilla", "Start With", "Own Dungeon", "Any Dungeon", "Overworld", "Anywhere") - Add StrayFairy override type - Adjust Stray Fairy GetItemIDs - Create custom messages for Stray Fairies --- source/custom_messages.cpp | 51 +++++++++++++++++++++++ source/dungeon.cpp | 4 +- source/fill.cpp | 71 +++++++++++++++++--------------- source/include/item_location.hpp | 4 +- source/item_list.cpp | 10 ++--- source/item_location.cpp | 6 +-- source/item_pool.cpp | 50 +++++++++++----------- source/settings.cpp | 2 +- source/starting_inventory.cpp | 8 ++++ 9 files changed, 136 insertions(+), 70 deletions(-) diff --git a/source/custom_messages.cpp b/source/custom_messages.cpp index 4f22e81..a9b93e3 100644 --- a/source/custom_messages.cpp +++ b/source/custom_messages.cpp @@ -345,6 +345,57 @@ void CreateBaselineCustomMessages() { }, {QM_BLUE, QM_RED}, {}, {}, 0x0, false, false); + //Bank Rewards + CreateMessage(0x045c, 0xFFFF, 0x3FFFFFFF, 0xFF0000, + {"What's this? You've already saved up #500 Rupees#!?! Well, little guy, here's your special gift. Take it!", + // French + "Vous avez déjà économisé #500 Rubis#?! Bon, petit, voici votre cadeau spécial. Prenez-le!", + }, + {QM_RED}, {}, {}, 0x0, false, false); + + CreateMessage(0x045d, 0xFFFF, 0x3FFFFFFF, 0xFF0000, + {"What's this? You've already saved up #1,000 Rupees#?! Well, little guy, I can't take any more deposits. Sorry, but this is all I can give you.", + // French + "Vous avez déjà économisé #1000 Rubis#?! Bon, petit, je ne peux plus accepter de dépôts. Désolé, mais c'est tout ce que je peux vous donner.", + }, + {QM_RED}, {}, {}, 0x0, false, false); + + //Stray Fairies + CreateMessage(0x06144, 0xFFFF, 0x3FFFFFFF, 0xFF0000, + {"You got the #Clock Town Stray Fairy#! Bring it to the Fairy Fountain in North Clock Town!", + // French + "Vous obtenez une #Fée Perdue de Clock Town#! Apporte-le à la Fontaine des Fées, dans le Quartier Nord de Bourg-Clocher!", + }, + {QM_RED}, {}, {}, 0x0, false, false); + + CreateMessage(0x06145, 0xFFFF, 0x3FFFFFFF, 0xFF0000, + {"You got a #Woodfall Stray Fairy#! &You have collected #=WFF#.", + // French + "Vous obtenez une #Fée Perdue de la forêt#!&Vous en avez désormais #=WFF#.", + }, + {QM_GREEN, QM_RED}, {}, {}, 0x0, false, false); + + CreateMessage(0x06146, 0xFFFF, 0x3FFFFFFF, 0xFF0000, + {"You got a #Snowhead Stray Fairy#! &You have collected #=SHF#.", + // French + "Vous obtenez une #Fée Perdue des neiges#!&Vous en avez désormais #=SHF#.", + }, + {QM_MAGENTA, QM_RED}, {}, {}, 0x0, false, false); + + CreateMessage(0x06147, 0xFFFF, 0x3FFFFFFF, 0xFF0000, + {"You got a #Great Bay Stray Fairy#! &You have collected #=GBF#.", + // French + "Vous obtenez une #Fée Perdue de la baie#!&Vous en avez désormais #=GBF#.", + }, + {QM_BLUE, QM_RED}, {}, {}, 0x0, false, false); + + CreateMessage(0x06148, 0xFFFF, 0x3FFFFFFF, 0xFF0000, + {"You got a #Stone Tower Stray Fairy#! &You have collected #=STF#.", + // French + "Vous obtenez une #Fée Perdue d'Ikana#!&Vous en avez désormais #=STF#.", + }, + {QM_YELLOW, QM_RED}, {}, {}, 0x0, false, false); + } u32 NumMessages() { diff --git a/source/dungeon.cpp b/source/dungeon.cpp index fce0ac5..59b2063 100644 --- a/source/dungeon.cpp +++ b/source/dungeon.cpp @@ -67,7 +67,7 @@ void DungeonInfo::PlaceVanillaBossKey() { auto bossKeyLocation = FilterFromPool(dungeonLocations, [](const LocationKey loc) { return Location(loc)->IsCategory(Category::cVanillaBossKey); })[0]; PlaceItemInLocation(bossKeyLocation, bossKey); } -/* + void DungeonInfo::PlaceVanillaSwampToken() { auto dungeonLocations = GetDungeonLocations(); auto tokenLocations = FilterFromPool(dungeonLocations, [](const LocationKey loc){return Location(loc)->IsCategory(Category::cSwampSkulltula);}); @@ -115,7 +115,7 @@ void DungeonInfo::PlaceVanillaSTStray() { PlaceItemInLocation(location, ST_STRAY_FAIRY); } } -*/ + void DungeonInfo::PlaceVanillaSmallKeys() { if (smallKey == NONE) { return; diff --git a/source/fill.cpp b/source/fill.cpp index f4d628e..dd6e750 100644 --- a/source/fill.cpp +++ b/source/fill.cpp @@ -653,6 +653,11 @@ static void RandomizeOwnDungeon(const Dungeon::DungeonInfo* dungeon) { //} // true; }); + if (ShuffleSongs.Value() == 1 /*Song Locations*/) { + std::vector songLocations = FilterFromPool(allLocations, [](const LocationKey loc) { return Location(loc)->IsCategory(Category::cSong);}); + std::vector songs = FilterAndEraseFromPool(ItemPool, [](const ItemKey i) { return ItemTable(i).GetItemType() == ITEMTYPE_SONG;}); + AssumedFill(songs, songLocations, true); + } /* PlacementLog_Msg("\nAllowed Locations are: \n"); CitraPrint("Allowed Locations are:"); @@ -720,6 +725,38 @@ static void RandomizeDungeonItems() { auto bossKey = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == dungeon->GetBossKey();}); AddElementsToPool(overworldItems, bossKey); } + if (StrayFairysanity.Value() == 2/*Any Dungeon*/) { + switch (dungeon) { + case WoodfallTemple: + auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == WF_STRAY_FAIRY;}); + AddElementsToPool(anyDungeonItems, strayFairy); + case SnowheadTemple: + auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == SH_STRAY_FAIRY;}); + AddElementsToPool(anyDungeonItems, strayFairy); + case GreatBayTemple: + auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == GBT_STRAY_FAIRY;}); + AddElementsToPool(anyDungeonItems, strayFairy); + case StoneTowerTemple: + auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == ST_STRAY_FAIRY;}); + AddElementsToPool(anyDungeonItems, strayFairy); + } + } + else if (StrayFairysanity.Value() == 3/*Overworld*/) { + switch (dungeon) { + case WoodfallTemple: + auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == WF_STRAY_FAIRY;}); + AddElementsToPool(overworldItems, strayFairy); + case SnowheadTemple: + auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == SH_STRAY_FAIRY;}); + AddElementsToPool(overworldItems, strayFairy); + case GreatBayTemple: + auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == GBT_STRAY_FAIRY;}); + AddElementsToPool(overworldItems, strayFairy); + case StoneTowerTemple: + auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == ST_STRAY_FAIRY;}); + AddElementsToPool(overworldItems, strayFairy); + } + } } @@ -818,40 +855,6 @@ int VanillaFill() { 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(); - 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; -} - - int Fill() { CustomMessages::CreateBaselineCustomMessages(); diff --git a/source/include/item_location.hpp b/source/include/item_location.hpp index 1b6a4f3..3733827 100644 --- a/source/include/item_location.hpp +++ b/source/include/item_location.hpp @@ -135,7 +135,7 @@ class ItemLocation { else if (type == ItemLocationType::TempleReward) {key.type = ItemOverride_Type::OVR_TEMPLE;} //else if (type == ItemLocationType::Misc) {key.type = game::act::Type::Misc;} //TO-DO - //else if (type == ItemLocationType::StrayFairy) {key.type = ItemOverride_Type::OVR_STRAY;} + else if (type == ItemLocationType::StrayFairy) {key.type = ItemOverride_Type::OVR_STRAY_FAIRY;} //else if (type == ItemLocationType::HintStone) {key.type = ItemOverride_Type::OVR_HINT;} //else if (type == ItemLocationType::OtherHint) {key.type = ItemOverride_Type::OVR_OTHER_HINT;} //key.type = type; //TODO make sure these match up @@ -174,6 +174,8 @@ class ItemLocation { else if (type == ItemLocationType::GrottoScrub) {ovrtype = ItemOverride_Type::OVR_GROTTO_SCRUB;} else if (type == ItemLocationType::Delayed) {ovrtype = ItemOverride_Type::OVR_DELAYED;} else if (type == ItemLocationType::TempleReward) {ovrtype = ItemOverride_Type::OVR_TEMPLE;} + else if (type == ItemLocationType::StrayFairy) {ovrtype = ItemOverride_Type::OVR_STRAY_FAIRY;} + return ovrtype; } diff --git a/source/item_list.cpp b/source/item_list.cpp index 9f689ee..fe14070 100644 --- a/source/item_list.cpp +++ b/source/item_list.cpp @@ -74,19 +74,19 @@ void ItemTable_Init() { //repeatable denotes that an item in a vanilla playth //Stray Fairies// //Clock Town Fairies - itemTable[CT_STRAY_FAIRY] = Item(true, false, &ClockTownStrayFairy, Text{"Clock Town Stray Fairy", "Fée égarée de Cadranbourg", "Hada Extraviada de la Ciudad", "", "Fée égarée de Bourg-Clocher", "" }, CT_STRAY_FAIRY, (u32)GetItemID::GI_NONE, ITEMTYPE_STRAYFAIRY); + itemTable[CT_STRAY_FAIRY] = Item(true, false, &ClockTownStrayFairy, Text{"Clock Town Stray Fairy", "Fée égarée de Cadranbourg", "Hada Extraviada de la Ciudad", "", "Fée égarée de Bourg-Clocher", "" }, CT_STRAY_FAIRY, 0xBB, ITEMTYPE_STRAYFAIRY); //Woodfall Stray Fairies - itemTable[WF_STRAY_FAIRY] = Item(true, false, &WoodfallStrayFairies, Text{"Woodfall Stray Fairy", "Fée égarée de Boisé-les-Cascades", "Hada Extraviada del Bosque Catarata", "", "Fée égarée de Bois-Cascade", "" }, WF_STRAY_FAIRY, (u32)GetItemID::GI_NONE, ITEMTYPE_STRAYFAIRY); + itemTable[WF_STRAY_FAIRY] = Item(true, false, &WoodfallStrayFairies, Text{"Woodfall Stray Fairy", "Fée égarée de Boisé-les-Cascades", "Hada Extraviada del Bosque Catarata", "", "Fée égarée de Bois-Cascade", "" }, WF_STRAY_FAIRY, 0xBC, ITEMTYPE_STRAYFAIRY); //Snowhead Stray Fairies - itemTable[SH_STRAY_FAIRY] = Item(true, false, &SnowheadStrayFairies, Text{"Snowhead Stray Fairy", "Fée égarée du Pic des neiges", "Hada Extraviada del Pico Nevado", "", "Fée égarée du pic des Neiges", "" }, SH_STRAY_FAIRY, (u32)GetItemID::GI_NONE, ITEMTYPE_STRAYFAIRY); + itemTable[SH_STRAY_FAIRY] = Item(true, false, &SnowheadStrayFairies, Text{"Snowhead Stray Fairy", "Fée égarée du Pic des neiges", "Hada Extraviada del Pico Nevado", "", "Fée égarée du pic des Neiges", "" }, SH_STRAY_FAIRY, 0xBD, ITEMTYPE_STRAYFAIRY); //Great Bay Stray Fairies - itemTable[GBT_STRAY_FAIRY] = Item(true, false, &GreatBayStrayFairies, Text{"Great Bay Stray Fairy", "Fée égarée de la Grande Baie", "Hada Extraviada de la Gran Bahía", }, GBT_STRAY_FAIRY, (u32)GetItemID::GI_NONE, ITEMTYPE_STRAYFAIRY); + itemTable[GBT_STRAY_FAIRY] = Item(true, false, &GreatBayStrayFairies, Text{"Great Bay Stray Fairy", "Fée égarée de la Grande Baie", "Hada Extraviada de la Gran Bahía", }, GBT_STRAY_FAIRY, 0xBE, ITEMTYPE_STRAYFAIRY); //Stone Tower Stray Fairies - itemTable[ST_STRAY_FAIRY] = Item(true, false, &StoneTowerStrayFairies, Text{"Stone Tower Stray Fairy", "Fée égarée de la Forteresse de Pierre", "Hada Extraviada de la Torre de Piedra", }, ST_STRAY_FAIRY, (u32)GetItemID::GI_NONE, ITEMTYPE_STRAYFAIRY); + itemTable[ST_STRAY_FAIRY] = Item(true, false, &StoneTowerStrayFairies, Text{"Stone Tower Stray Fairy", "Fée égarée de la Forteresse de Pierre", "Hada Extraviada de la Torre de Piedra", }, ST_STRAY_FAIRY, 0xBF, ITEMTYPE_STRAYFAIRY); //Bottles itemTable[EMPTY_BOTTLE1] = Item(true, false, &ArcheryBottle, Text{"Empty Bottle", "Flacon vide", "Botella vacía", }, EMPTY_BOTTLE1, (u32)GetItemID::GI_BOTTLE_EMPTY, ITEMTYPE_ITEM); diff --git a/source/item_location.cpp b/source/item_location.cpp index 6530801..8a5f93d 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -165,9 +165,9 @@ void LocationTable_Init() { locationTable[S_CLOCK_TOWN_CLOCK_TOWER_ENTRANCE] = ItemLocation::Collectable(0x6F, 0x00, false, "SCT Clock Tower Entrance", S_CLOCK_TOWN_CLOCK_TOWER_ENTRANCE, PIECE_OF_HEART, {Category::cSouthClockTown, Category::cVanillaHeartPiece,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_S_CLOCK_TOWN ); 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, Category::cNoOcarinaStart}, 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, Category::cNoOcarinaStart}, 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, Category::cMainInventory, Category::cNoOcarinaStart}, 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 ); + locationTable[S_CLOCK_TOWN_BANK_REWARD_1] = ItemLocation::Base (0x6F, 0x48, false, "SCT Bank Reward 1 (200)", S_CLOCK_TOWN_BANK_REWARD_1, PROGRESSIVE_WALLET, {Category::cSouthClockTown,Category::cDayOne, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_S_CLOCK_TOWN ); + locationTable[S_CLOCK_TOWN_BANK_REWARD_2] = ItemLocation::Base (0x6F, 0x03, false, "SCT Bank Reward 2 (500)", 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 (1000)", S_CLOCK_TOWN_BANK_REWARD_3, PIECE_OF_HEART, {Category::cSouthClockTown, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_S_CLOCK_TOWN ); //Snowhead locationTable[SNOWHEAD_GREAT_FAIRY] = ItemLocation::Base (0x26, 0x2B, false, "SH Great Fairy", SNOWHEAD_GREAT_FAIRY, PROGRESSIVE_MAGIC_METER, {Category::cSnowhead, Category::cFairyFountain,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SNOWHEAD ); diff --git a/source/item_pool.cpp b/source/item_pool.cpp index 57d670c..9604c31 100644 --- a/source/item_pool.cpp +++ b/source/item_pool.cpp @@ -641,15 +641,25 @@ static void PlaceVanillaBossKeys() { }; static void PlaceVanillaStrayFairies() { - /*TO-DO::make simpler for (auto dungeon : dungeonList) { - dungeon->PlaceVanillaWFStray(); - dungeon->PlaceVanillaSHStray(); - dungeon->PlaceVanillaGBTStray(); - dungeon->PlaceVanillaSTStray(); - }*/ + switch (dungeon) { + case WoodfallTemple: + dungeon->PlaceVanillaWFStray(); + break; + case SnowheadTemple: + dungeon->PlaceVanillaSHStray(); + break; + case GreatBayTemple: + dungeon->PlaceVanillaGBTStray(); + break; + case StoneTowerTemple: + dungeon->PlaceVanillaSTStray(); + break; + } + } //Clock Town PlaceItemInLocation(LAUNDRY_POOL_SF, CT_STRAY_FAIRY); + /* //Woodfall Temple PlaceItemInLocation(WF_SF_ENTRANCE_FAIRY, WF_STRAY_FAIRY); PlaceItemInLocation(WF_SF_ENTRANCE_PLATFORM, WF_STRAY_FAIRY); @@ -714,14 +724,19 @@ static void PlaceVanillaStrayFairies() { PlaceItemInLocation(ST_SF_STATUE_EYE, ST_STRAY_FAIRY); PlaceItemInLocation(ST_SF_UNDERWATER, ST_STRAY_FAIRY); PlaceItemInLocation(ST_SF_BRIDGE_CRYSTAL, ST_STRAY_FAIRY); + */ }; static void PlaceVanillaSkulltulaTokens() { - /* TO-DO::make simpler for (auto dungeon : dungeonList) { - dungeon->PlaceVanillaSwampToken(); - dungeon->PlaceVanillaOceanToken(); - }*/ + switch (dungeon) { + case SwampSpiderHouse: + dungeon->PlaceVanillaSwampToken(); + case OceansideSpiderHouse: + dungeon->PlaceVanillaOceanToken(); + } + } + /* //Swamp Skull Tokens PlaceItemInLocation(SSH_MAIN_ROOM_NEAR_CEILING, SWAMP_SKULLTULA_TOKEN); PlaceItemInLocation(SSH_MAIN_ROOM_WATER, SWAMP_SKULLTULA_TOKEN); @@ -784,6 +799,7 @@ static void PlaceVanillaSkulltulaTokens() { PlaceItemInLocation(OSH_COLORED_SKULLS_CHANDELIER_3, OCEANSIDE_SKULLTULA_TOKEN); PlaceItemInLocation(OSH_COLORED_SKULLS_BEHIND_PICTURE, OCEANSIDE_SKULLTULA_TOKEN); PlaceItemInLocation(OSH_COLORED_SKULLS_POT, OCEANSIDE_SKULLTULA_TOKEN); + */ }; static void PlaceVanillaCowMilk() { @@ -1022,11 +1038,6 @@ void GenerateItemPool() { else { PlaceVanillaSongs(); } - //No Longer Needed since Song of Healing is now randomized and the check is always obtainable even when starting with SoH - // 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); - // } //GREAT FAIRY SHUFFLE if(ShuffleGFRewards.Is((u8)GreatFairyRewardShuffleSetting::GFREWARDSHUFFLE_VANILLA)){ @@ -1095,7 +1106,6 @@ void GenerateItemPool() { PlaceItemInLocation(THE_MOON_GARO_CHEST, ARROWS_30); PlaceItemInLocation(THE_MOON_IRON_KNUCKLE_CHEST, BOMBCHU_10); } - //TOKENSANITY if(Tokensanity){ @@ -1108,8 +1118,6 @@ void GenerateItemPool() { PlaceVanillaSkulltulaTokens(); } - - //DEKU MERCHANT TRADE QUEST if (ShuffleMerchants){//Merchants is Deku Scrub Trade Quest AddItemsToPool(ItemPool, scrubTradeItems); @@ -1126,14 +1134,8 @@ void GenerateItemPool() { if (ShuffleTradeItems){//TradeItems refers to Anju&Kafei Items AddItemsToPool(ItemPool, anjuKafeiTradeItems); } 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); diff --git a/source/settings.cpp b/source/settings.cpp index 08be62e..423d8ec 100644 --- a/source/settings.cpp +++ b/source/settings.cpp @@ -378,7 +378,7 @@ namespace Settings { &MapsAndCompasses, &Keysanity, &BossKeysanity, - //&StrayFairysanity, + &StrayFairysanity, &ShuffleRewards, &ShuffleHeartContainers, &MoonRemainsRequired, diff --git a/source/starting_inventory.cpp b/source/starting_inventory.cpp index a663728..3fb6fe5 100644 --- a/source/starting_inventory.cpp +++ b/source/starting_inventory.cpp @@ -52,6 +52,14 @@ void GenerateStartingInventory() { AddItemToInventory(GBT_BOSS_KEY); AddItemToInventory(STONE_TOWER_TEMPLE_BOSS_KEY); } + + if (StrayFairysanity.Value() == 1/*Start With*/) { + AddItemToInventory(CT_STRAY_FAIRY, 1); + AddItemToInventory(WF_STRAY_FAIRY, 15); + AddItemToInventory(SH_STRAY_FAIRY, 15); + AddItemToInventory(GBT_STRAY_FAIRY, 15); + AddItemToInventory(ST_STRAY_FAIRY, 15); + } //Starting Inventory Menu //Values are associated so that the count of items matches the index of From f20603a8d39666079024e3a9dc40d393644d3a0f Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sun, 19 Jul 2026 13:22:52 -0500 Subject: [PATCH 02/12] fairysanity 2 implement Own Dungeon Any Dungeon and overworld add new hints to replace vanilla text with the randomized item for bank reward and deku salesman --- .gitmodules | 2 +- source/fill.cpp | 32 +++++++++++++++++++------------- source/hints.cpp | 18 ++++++++++++++++++ source/include/hints.hpp | 3 ++- source/playthrough.cpp | 1 + 5 files changed, 41 insertions(+), 15 deletions(-) diff --git a/.gitmodules b/.gitmodules index 12a5f3b..ccc04ce 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "Z3DR"] path = Z3DR url = https://github.com/Z3DR/mm3dr.git - branch = dev + branch = fairysanity diff --git a/source/fill.cpp b/source/fill.cpp index dd6e750..8aece22 100644 --- a/source/fill.cpp +++ b/source/fill.cpp @@ -642,17 +642,6 @@ static void RandomizeOwnDungeon(const Dungeon::DungeonInfo* dungeon) { std::vector dungeonLocations = dungeon->GetDungeonLocations(); std::vector dungeonItems; - //filter out locations that may be required to have songs placed at them - - dungeonLocations = FilterFromPool(dungeonLocations, [](const LocationKey loc) { - //if (ShuffleSongs.Is(rnd::SongShuffleSetting::SONGSHUFFLE_SONG_LOCATIONS)) { - return !(Location(loc)->IsCategory(Category::cSong)) && !(Location(loc)->IsCategory(Category::cDungeonReward)); - //} - //if (ShuffleSongs.Is(rnd::SongShuffleSetting::SONGSHUFFLE_DUNGEON_REWARDS)) { - // return !(Location(loc)->IsCategory(Category::cDungeonReward)); - //} - // true; - }); if (ShuffleSongs.Value() == 1 /*Song Locations*/) { std::vector songLocations = FilterFromPool(allLocations, [](const LocationKey loc) { return Location(loc)->IsCategory(Category::cSong);}); std::vector songs = FilterAndEraseFromPool(ItemPool, [](const ItemKey i) { return ItemTable(i).GetItemType() == ITEMTYPE_SONG;}); @@ -678,6 +667,23 @@ static void RandomizeOwnDungeon(const Dungeon::DungeonInfo* dungeon) { AddElementsToPool(dungeonItems, dungeonBossKey); } + if (StrayFairySanity.Value() == 3 /* Own Dungeon*/) + { + switch (dungeon) { + case WoodfallTemple: + auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == WF_STRAY_FAIRY;}); + AddElementsToPool(dungeonItems, strayFairy); + case SnowheadTemple: + auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == SH_STRAY_FAIRY;}); + AddElementsToPool(dungeonItems, strayFairy); + case GreatBayTemple: + auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == GBT_STRAY_FAIRY;}); + AddElementsToPool(dungeonItems, strayFairy); + case StoneTowerTemple: + auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == ST_STRAY_FAIRY;}); + AddElementsToPool(dungeonItems, strayFairy); + } + } //randomize boss key and small keys together for even distribution AssumedFill(dungeonItems, dungeonLocations, true); @@ -725,7 +731,7 @@ static void RandomizeDungeonItems() { auto bossKey = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == dungeon->GetBossKey();}); AddElementsToPool(overworldItems, bossKey); } - if (StrayFairysanity.Value() == 2/*Any Dungeon*/) { + if (StrayFairysanity.Value() == 4/*Any Dungeon*/) { switch (dungeon) { case WoodfallTemple: auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == WF_STRAY_FAIRY;}); @@ -741,7 +747,7 @@ static void RandomizeDungeonItems() { AddElementsToPool(anyDungeonItems, strayFairy); } } - else if (StrayFairysanity.Value() == 3/*Overworld*/) { + else if (StrayFairysanity.Value() == 5/*Overworld*/) { switch (dungeon) { case WoodfallTemple: auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == WF_STRAY_FAIRY;}); diff --git a/source/hints.cpp b/source/hints.cpp index dd64adc..14f982d 100644 --- a/source/hints.cpp +++ b/source/hints.cpp @@ -485,6 +485,24 @@ void CreateTingleHintText() { {QM_GREEN, QM_RED, QM_GREEN, QM_RED, QM_GREEN}, {}, {}, 0x0, false, false); } } + +void CreateOtherHints() { + // Create other hints for various texts + + //Bank Reward 1 hint (Vanilla Wallet) + Text bankReward1Hint = Text{"For example, if you deposit 200 Rupees, you'll get #"+ItemTable(Location(S_CLOCK_TOWN_BANK_REWARD_1)->GetPlacedItemKey)->GetHint().GetText()+"#."}; + CustomMessages::CreateMessageFromTextObject(0x44d, 0xFFFF, 0x3FF0A014, 0xFF1001, + bankReward1Hint, + {QM_RED}, {}, {}, 0x0, false, false); + + //Termina Field Deku Salesman Heart Piece + Text dekuSalesmanHint = Text{" Please! I'll sell you a #"+ItemTable(Location(TERMINA_FIELD_BUSINESS_SCRUB)->GetPlacedItemKey).GetName()+"# if you just keep this place a secret..."}; + CustomMessages::CreateMessageFromTextObject(0x1631, 0xFFFF, 0x3FF0A014, 0xFF1001, + dekuSalesmanHint, + {QM_RED}, {}, {}, 0x0, false, false); + +} + //Find the location which has the given itemKey and create the generic altar text for the reward /*static Text BuildDungeonRewardText(ItemID itemID, const ItemKey itemKey) { diff --git a/source/include/hints.hpp b/source/include/hints.hpp index 6933142..193989b 100644 --- a/source/include/hints.hpp +++ b/source/include/hints.hpp @@ -167,4 +167,5 @@ class HintText { extern void CreateAllHints(); extern void CreateTingleHintText(); extern void CreateClockTowerDoorHints(); -extern void CreateMoonChildHint(); \ No newline at end of file +extern void CreateMoonChildHint(); +extern void CreateOtherHints(); \ No newline at end of file diff --git a/source/playthrough.cpp b/source/playthrough.cpp index 06d628b..34f3bb9 100644 --- a/source/playthrough.cpp +++ b/source/playthrough.cpp @@ -80,6 +80,7 @@ namespace Playthrough { CreateTingleHintText(); CreateClockTowerDoorHints(); CreateMoonChildHint(); + CreateOtherHints(); playthroughLocations.clear(); wothLocations.clear(); From f2172db9374c0cf2912f13a99022b89dcc4c477e Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sun, 19 Jul 2026 17:55:19 -0500 Subject: [PATCH 03/12] Fill Fixes - Fixes item filling for Stray Fairies so they are placed properly according to the setting selected. - Removes WIP tag from Stray Fairy shuffle descriptions - Fixes text layout for new Other Hints so they properly compile - Adds new setting to separately shuffle the Clock Town Stray Fairy as it is not a dungeon item like the others - Add override values to stray fairies --- source/fill.cpp | 98 ++++++++++--------- source/hints.cpp | 33 ++++++- source/include/setting_descriptions.hpp | 1 + source/include/settings.hpp | 1 + source/item_location.cpp | 122 ++++++++++++------------ source/item_pool.cpp | 35 +++---- source/setting_descriptions.cpp | 19 ++-- source/settings.cpp | 9 ++ 8 files changed, 178 insertions(+), 140 deletions(-) diff --git a/source/fill.cpp b/source/fill.cpp index 8aece22..2e714e2 100644 --- a/source/fill.cpp +++ b/source/fill.cpp @@ -667,25 +667,30 @@ static void RandomizeOwnDungeon(const Dungeon::DungeonInfo* dungeon) { AddElementsToPool(dungeonItems, dungeonBossKey); } - if (StrayFairySanity.Value() == 3 /* Own Dungeon*/) + if (StrayFairysanity.Value() == 2 /* Own Dungeon*/) { - switch (dungeon) { - case WoodfallTemple: - auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == WF_STRAY_FAIRY;}); - AddElementsToPool(dungeonItems, strayFairy); - case SnowheadTemple: - auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == SH_STRAY_FAIRY;}); - AddElementsToPool(dungeonItems, strayFairy); - case GreatBayTemple: - auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == GBT_STRAY_FAIRY;}); - AddElementsToPool(dungeonItems, strayFairy); - case StoneTowerTemple: - auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == ST_STRAY_FAIRY;}); - AddElementsToPool(dungeonItems, strayFairy); - } + if (dungeon->GetName() == "Woodfall Temple") { + auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == WF_STRAY_FAIRY;}); + AddElementsToPool(dungeonItems, strayFairy); + } + else if (dungeon->GetName() == "Snowhead Temple") { + auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == SH_STRAY_FAIRY;}); + AddElementsToPool(dungeonItems, strayFairy); + } + else if (dungeon->GetName() == "Great Bay Temple") { + auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == GBT_STRAY_FAIRY;}); + AddElementsToPool(dungeonItems, strayFairy); + } + else if (dungeon->GetName() == "Stone Tower Temple") { + auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == ST_STRAY_FAIRY;}); + AddElementsToPool(dungeonItems, strayFairy); + } + } //randomize boss key and small keys together for even distribution + NoRepeatOnTokens = true; AssumedFill(dungeonItems, dungeonLocations, true); + NoRepeatOnTokens = false; //randomize map and compass separately since they're not progressive if (MapsAndCompasses.Is((u8)MapsAndCompassesSetting::MAPSANDCOMPASSES_OWN_DUNGEON) && dungeon->GetMap() != NONE && dungeon->GetCompass() != NONE) { @@ -731,39 +736,42 @@ static void RandomizeDungeonItems() { auto bossKey = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == dungeon->GetBossKey();}); AddElementsToPool(overworldItems, bossKey); } - if (StrayFairysanity.Value() == 4/*Any Dungeon*/) { - switch (dungeon) { - case WoodfallTemple: - auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == WF_STRAY_FAIRY;}); - AddElementsToPool(anyDungeonItems, strayFairy); - case SnowheadTemple: - auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == SH_STRAY_FAIRY;}); - AddElementsToPool(anyDungeonItems, strayFairy); - case GreatBayTemple: - auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == GBT_STRAY_FAIRY;}); - AddElementsToPool(anyDungeonItems, strayFairy); - case StoneTowerTemple: - auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == ST_STRAY_FAIRY;}); - AddElementsToPool(anyDungeonItems, strayFairy); + if (StrayFairysanity.Value() == 3/*Any Dungeon*/) { + if (dungeon->GetName() == "Woodfall Temple") { + auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == WF_STRAY_FAIRY;}); + AddElementsToPool(anyDungeonItems, strayFairy); + } + else if (dungeon->GetName() == "Snowhead Temple") { + auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == SH_STRAY_FAIRY;}); + AddElementsToPool(anyDungeonItems, strayFairy); + } + else if (dungeon->GetName() == "Great Bay Temple") { + auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == GBT_STRAY_FAIRY;}); + AddElementsToPool(anyDungeonItems, strayFairy); + } + else if (dungeon->GetName() == "Stone Tower Temple") { + auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == ST_STRAY_FAIRY;}); + AddElementsToPool(anyDungeonItems, strayFairy); } } - else if (StrayFairysanity.Value() == 5/*Overworld*/) { - switch (dungeon) { - case WoodfallTemple: - auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == WF_STRAY_FAIRY;}); - AddElementsToPool(overworldItems, strayFairy); - case SnowheadTemple: - auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == SH_STRAY_FAIRY;}); - AddElementsToPool(overworldItems, strayFairy); - case GreatBayTemple: - auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == GBT_STRAY_FAIRY;}); - AddElementsToPool(overworldItems, strayFairy); - case StoneTowerTemple: - auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == ST_STRAY_FAIRY;}); - AddElementsToPool(overworldItems, strayFairy); + else if (StrayFairysanity.Value() == 4/*Overworld*/) { + if (dungeon->GetName() == "Woodfall Temple") { + auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == WF_STRAY_FAIRY;}); + AddElementsToPool(overworldItems, strayFairy); + } + else if (dungeon->GetName() == "Snowhead Temple") { + auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == SH_STRAY_FAIRY;}); + AddElementsToPool(overworldItems, strayFairy); + } + else if (dungeon->GetName() == "Great Bay Temple") { + auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == GBT_STRAY_FAIRY;}); + AddElementsToPool(overworldItems, strayFairy); + } + else if (dungeon->GetName() == "Stone Tower Temple") { + auto strayFairy = FilterAndEraseFromPool(ItemPool, [dungeon](const ItemKey i) {return i == ST_STRAY_FAIRY;}); + AddElementsToPool(overworldItems, strayFairy); } } - } const std::array dungeonRewards = { @@ -787,8 +795,10 @@ static void RandomizeDungeonItems() { } //Randomize Any Dungeon and Overworld pools + NoRepeatOnTokens = true; AssumedFill(anyDungeonItems, anyDungeonLocations, true); AssumedFill(overworldItems, overworldLocations, true); + NoRepeatOnTokens = false; //Randomize maps and compasses after since they're not advancement items for (auto dungeon : dungeonList) { diff --git a/source/hints.cpp b/source/hints.cpp index 14f982d..490d9e8 100644 --- a/source/hints.cpp +++ b/source/hints.cpp @@ -490,13 +490,42 @@ void CreateOtherHints() { // Create other hints for various texts //Bank Reward 1 hint (Vanilla Wallet) - Text bankReward1Hint = Text{"For example, if you deposit 200 Rupees, you'll get #"+ItemTable(Location(S_CLOCK_TOWN_BANK_REWARD_1)->GetPlacedItemKey)->GetHint().GetText()+"#."}; + Text bankReward1Hint = Text{ + Text{ + /*NaEnglish*/"For example, if you deposit 200 Rupees, you'll get #", + /*NaFrench*/"Par exemple, si vous déposez 200 Rupees, vous obtiendrez #", + /*NaSpanish*/"Por ejemplo, si depositas 200 Rupees, obtendrás #", + /*EuEnglish*/"", + /*EuFrench*/"", + /*EuSpanish*/"", + } + +ItemTable(Location(S_CLOCK_TOWN_BANK_REWARD_1)->GetPlacedItemKey()).GetHint().GetText() + +Text{"#."} + }; CustomMessages::CreateMessageFromTextObject(0x44d, 0xFFFF, 0x3FF0A014, 0xFF1001, bankReward1Hint, {QM_RED}, {}, {}, 0x0, false, false); //Termina Field Deku Salesman Heart Piece - Text dekuSalesmanHint = Text{" Please! I'll sell you a #"+ItemTable(Location(TERMINA_FIELD_BUSINESS_SCRUB)->GetPlacedItemKey).GetName()+"# if you just keep this place a secret..."}; + Text dekuSalesmanHint = Text{ + Text{ + /*NaEnglish*/" Please! I'll sell you a #", + /*NaFrench*/" S'il te plaît, je te vendrai un #", + /*NaSpanish*/" Por favor, te venderé un #", + /*EuEnglish*/" Please! I'll sell you a #", + /*EuFrench*/" S'il te plaît, je te vendrai un #", + /*EuSpanish*/" Por favor, te venderé un #", + } + +ItemTable(Location(TERMINA_FIELD_BUSINESS_SCRUB)->GetPlacedItemKey()).GetName() + +Text{ + /*NaEnglish*/"# if you just keep this place a secret...", + /*NaFrench*/"# si tu gardes ce lieu secret...", + /*NaSpanish*/"# si guardas este lugar en secreto...", + /*EuEnglish*/"# if you just keep this place a secret...", + /*EuFrench*/"# si tu gardes ce lieu secret...", + /*EuSpanish*/"# si guardas este lugar en secreto...", + } + }; CustomMessages::CreateMessageFromTextObject(0x1631, 0xFFFF, 0x3FF0A014, 0xFF1001, dekuSalesmanHint, {QM_RED}, {}, {}, 0x0, false, false); diff --git a/source/include/setting_descriptions.hpp b/source/include/setting_descriptions.hpp index 601c7f8..c3fa332 100644 --- a/source/include/setting_descriptions.hpp +++ b/source/include/setting_descriptions.hpp @@ -47,6 +47,7 @@ extern string_view fairyOwnDungeon; extern string_view fairyAnyDungeon; extern string_view fairyOverworld; extern string_view fairyAnywhere; +extern string_view shuffleCTStrayDesc; extern string_view shuffleRewardsEndOfDungeon; extern string_view shuffleRewardsAnyDungeon; diff --git a/source/include/settings.hpp b/source/include/settings.hpp index 0b94337..a33d75d 100644 --- a/source/include/settings.hpp +++ b/source/include/settings.hpp @@ -418,6 +418,7 @@ namespace Settings { extern Option ShuffleHeartContainers; extern Option MoonRemainsRequired; extern Option MajoraRemainsRequired; + extern Option ShuffleCTStray; extern std::vector shuffleItemOptions; //ItemPool Settings diff --git a/source/item_location.cpp b/source/item_location.cpp index 8a5f93d..b8f1cab 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -435,76 +435,76 @@ void LocationTable_Init() { -------------------------------*/ //Clock Town Stray Fairy - locationTable[LAUNDRY_POOL_SF] = ItemLocation::StrayFairy (0x70, 0x00, true, "Laundry Pool SF", CT_STRAY_FAIRY, CT_STRAY_FAIRY, {Category::cLaundryPool, Category::cVanillaStrayFairy, Category::cCTStray,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_LAUNDRY_POOL); + locationTable[LAUNDRY_POOL_SF] = ItemLocation::StrayFairy (0x70, 0x7F, true, "Laundry Pool SF", CT_STRAY_FAIRY, CT_STRAY_FAIRY, {Category::cLaundryPool, Category::cVanillaStrayFairy, Category::cCTStray,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_LAUNDRY_POOL); //Woodfall Stray Faries - locationTable[WF_SF_ENTRANCE_FAIRY] = ItemLocation::StrayFairy (0x1B, 0x00, true, "Woodfall Temple SF Entrance", WF_SF_ENTRANCE_FAIRY, WF_STRAY_FAIRY, {Category::cWoodfall, Category::cWoodfallTemple, Category::cWFStray, Category::cVanillaStrayFairy,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); - locationTable[WF_SF_ENTRANCE_PLATFORM] = ItemLocation::StrayFairy (0x1B, 0x00, true, "Woodfall Temple SF Entrance Platform", WF_SF_ENTRANCE_PLATFORM, WF_STRAY_FAIRY, {Category::cWoodfall, Category::cWoodfallTemple, Category::cWFStray, Category::cVanillaStrayFairy,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); - locationTable[WF_SF_MAIN_ROOM_BUBBLE] = ItemLocation::StrayFairy (0x1B, 0x00, true, "Woodfall Temple SF Main Room Bubble", WF_SF_MAIN_ROOM_BUBBLE, WF_STRAY_FAIRY, {Category::cWoodfall, Category::cWoodfallTemple, Category::cWFStray, Category::cVanillaStrayFairy,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); - locationTable[WF_SF_MAIN_ROOM_SWITCH] = ItemLocation::StrayFairy (0x1B, 0x00, true, "Woodfall Temple SF Main Room Switch", WF_SF_MAIN_ROOM_SWITCH, WF_STRAY_FAIRY, {Category::cWoodfall, Category::cWoodfallTemple, Category::cWFStray, Category::cVanillaStrayFairy,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); - locationTable[WF_SF_PRE_BOSS_LOWER_RIGHT_BUBBLE] = ItemLocation::StrayFairy (0xB1, 0x00, true, "Woodfall Temple SF Pre-Boss Lower Right Bubble", WF_SF_PRE_BOSS_LOWER_RIGHT_BUBBLE, WF_STRAY_FAIRY, {Category::cWoodfall, Category::cWoodfallTemple, Category::cWFStray, Category::cVanillaStrayFairy,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); - locationTable[WF_SF_PRE_BOSS_UPPER_RIGHT_BUBBLE] = ItemLocation::StrayFairy (0x1B, 0x00, true, "Woodfall Temple SF Pre-Boss Upper Left Bubble", WF_SF_PRE_BOSS_UPPER_RIGHT_BUBBLE, WF_STRAY_FAIRY, {Category::cWoodfall, Category::cWoodfallTemple, Category::cWFStray, Category::cVanillaStrayFairy,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); - locationTable[WF_SF_PRE_BOSS_UPPER_LEFT_BUBBLE] = ItemLocation::StrayFairy (0x1B, 0x00, true, "Woodfall Temple SF Pre-Boss Upper Right Bubble", WF_SF_PRE_BOSS_UPPER_LEFT_BUBBLE, WF_STRAY_FAIRY, {Category::cWoodfall, Category::cWoodfallTemple, Category::cWFStray, Category::cVanillaStrayFairy,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); - locationTable[WF_SF_PRE_BOSS_PILLAR_BUBBLE] = ItemLocation::StrayFairy (0x1B, 0x00, true, "Woodfall Temple SF Pre-Boss Pillar Bubble", WF_SF_PRE_BOSS_PILLAR_BUBBLE, WF_STRAY_FAIRY, {Category::cWoodfall, Category::cWoodfallTemple, Category::cWFStray, Category::cVanillaStrayFairy,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); - locationTable[WF_SF_DEKU_BABA] = ItemLocation::StrayFairy (0x1B, 0x00, true, "Woodfall Temple SF Deku Baba", WF_SF_DEKU_BABA, WF_STRAY_FAIRY, {Category::cWoodfall, Category::cWoodfallTemple, Category::cWFStray, Category::cVanillaStrayFairy,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); - locationTable[WF_SF_DRAGONFLY_ROOM_BUBBLE] = ItemLocation::StrayFairy (0x1B, 0x00, true, "Woodfall Temple SF Dragonfly Room Bubble", WF_SF_DRAGONFLY_ROOM_BUBBLE, WF_STRAY_FAIRY, {Category::cWoodfall, Category::cWoodfallTemple, Category::cWFStray, Category::cVanillaStrayFairy,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); - locationTable[WF_SF_SKULLTULA] = ItemLocation::StrayFairy (0x1B, 0x00, true, "Woodfall Temple SF Skulltula", WF_SF_SKULLTULA, WF_STRAY_FAIRY, {Category::cWoodfall, Category::cWoodfallTemple, Category::cWFStray, Category::cVanillaStrayFairy,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); - locationTable[WF_SF_DARK_ROOM] = ItemLocation::StrayFairy (0x1B, 0x00, true, "Woodfall Temple SF Dark Room", WF_SF_DARK_ROOM, WF_STRAY_FAIRY, {Category::cWoodfall, Category::cWoodfallTemple, Category::cWFStray, Category::cVanillaStrayFairy,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); - locationTable[WF_SF_JAR_FAIRY] = ItemLocation::StrayFairy (0x1B, 0x00, true, "Woodfall Temple SF Jar Fairy", WF_SF_JAR_FAIRY, WF_STRAY_FAIRY, {Category::cWoodfall, Category::cWoodfallTemple, Category::cWFStray, Category::cVanillaStrayFairy,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); - locationTable[WF_SF_BRIDGE_ROOM_BEEHIVE] = ItemLocation::StrayFairy (0x1B, 0x00, true, "Woodfall Temple SF Bridge Room Beehive", WF_SF_BRIDGE_ROOM_BEEHIVE, WF_STRAY_FAIRY, {Category::cWoodfall, Category::cWoodfallTemple, Category::cWFStray, Category::cVanillaStrayFairy,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); - locationTable[WF_SF_PLATFORM_ROOM_BEEHIVE] = ItemLocation::StrayFairy (0x1B, 0x00, true, "Woodfall Temple SF Platform Room Beehive", WF_SF_PLATFORM_ROOM_BEEHIVE, WF_STRAY_FAIRY, {Category::cWoodfall, Category::cWoodfallTemple, Category::cWFStray, Category::cVanillaStrayFairy,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); + locationTable[WF_SF_ENTRANCE_FAIRY] = ItemLocation::StrayFairy (0x1B, 0x2B, true, "Woodfall Temple SF Entrance", WF_SF_ENTRANCE_FAIRY, WF_STRAY_FAIRY, {Category::cWoodfall, Category::cWoodfallTemple, Category::cWFStray, Category::cVanillaStrayFairy,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); + locationTable[WF_SF_ENTRANCE_PLATFORM] = ItemLocation::StrayFairy (0x1B, 0x18, true, "Woodfall Temple SF Entrance Platform", WF_SF_ENTRANCE_PLATFORM, WF_STRAY_FAIRY, {Category::cWoodfall, Category::cWoodfallTemple, Category::cWFStray, Category::cVanillaStrayFairy,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); + locationTable[WF_SF_MAIN_ROOM_BUBBLE] = ItemLocation::StrayFairy (0x1B, 0x30, true, "Woodfall Temple SF Main Room Bubble", WF_SF_MAIN_ROOM_BUBBLE, WF_STRAY_FAIRY, {Category::cWoodfall, Category::cWoodfallTemple, Category::cWFStray, Category::cVanillaStrayFairy,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); + locationTable[WF_SF_MAIN_ROOM_SWITCH] = ItemLocation::StrayFairy (0x1B, 0x17, true, "Woodfall Temple SF Main Room Switch", WF_SF_MAIN_ROOM_SWITCH, WF_STRAY_FAIRY, {Category::cWoodfall, Category::cWoodfallTemple, Category::cWFStray, Category::cVanillaStrayFairy,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); + locationTable[WF_SF_PRE_BOSS_LOWER_RIGHT_BUBBLE] = ItemLocation::StrayFairy (0x1B, 0x2A, true, "Woodfall Temple SF Pre-Boss Lower Right Bubble", WF_SF_PRE_BOSS_LOWER_RIGHT_BUBBLE, WF_STRAY_FAIRY, {Category::cWoodfall, Category::cWoodfallTemple, Category::cWFStray, Category::cVanillaStrayFairy,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); + locationTable[WF_SF_PRE_BOSS_UPPER_RIGHT_BUBBLE] = ItemLocation::StrayFairy (0x1B, 0x32, true, "Woodfall Temple SF Pre-Boss Upper Left Bubble", WF_SF_PRE_BOSS_UPPER_RIGHT_BUBBLE, WF_STRAY_FAIRY, {Category::cWoodfall, Category::cWoodfallTemple, Category::cWFStray, Category::cVanillaStrayFairy,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); + locationTable[WF_SF_PRE_BOSS_UPPER_LEFT_BUBBLE] = ItemLocation::StrayFairy (0x1B, 0x2C, true, "Woodfall Temple SF Pre-Boss Upper Right Bubble", WF_SF_PRE_BOSS_UPPER_LEFT_BUBBLE, WF_STRAY_FAIRY, {Category::cWoodfall, Category::cWoodfallTemple, Category::cWFStray, Category::cVanillaStrayFairy,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); + locationTable[WF_SF_PRE_BOSS_PILLAR_BUBBLE] = ItemLocation::StrayFairy (0x1B, 0x2D, true, "Woodfall Temple SF Pre-Boss Pillar Bubble", WF_SF_PRE_BOSS_PILLAR_BUBBLE, WF_STRAY_FAIRY, {Category::cWoodfall, Category::cWoodfallTemple, Category::cWFStray, Category::cVanillaStrayFairy,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); + locationTable[WF_SF_DEKU_BABA] = ItemLocation::StrayFairy (0x1B, 0x2E, true, "Woodfall Temple SF Deku Baba", WF_SF_DEKU_BABA, WF_STRAY_FAIRY, {Category::cWoodfall, Category::cWoodfallTemple, Category::cWFStray, Category::cVanillaStrayFairy,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); + locationTable[WF_SF_DRAGONFLY_ROOM_BUBBLE] = ItemLocation::StrayFairy (0x1B, 0x2F, true, "Woodfall Temple SF Dragonfly Room Bubble", WF_SF_DRAGONFLY_ROOM_BUBBLE, WF_STRAY_FAIRY, {Category::cWoodfall, Category::cWoodfallTemple, Category::cWFStray, Category::cVanillaStrayFairy,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); + locationTable[WF_SF_SKULLTULA] = ItemLocation::StrayFairy (0x1B, 0x31, true, "Woodfall Temple SF Skulltula", WF_SF_SKULLTULA, WF_STRAY_FAIRY, {Category::cWoodfall, Category::cWoodfallTemple, Category::cWFStray, Category::cVanillaStrayFairy,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); + locationTable[WF_SF_DARK_ROOM] = ItemLocation::StrayFairy (0x1B, 0x19, true, "Woodfall Temple SF Dark Room", WF_SF_DARK_ROOM, WF_STRAY_FAIRY, {Category::cWoodfall, Category::cWoodfallTemple, Category::cWFStray, Category::cVanillaStrayFairy,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); + locationTable[WF_SF_JAR_FAIRY] = ItemLocation::StrayFairy (0x1B, 0x1C, true, "Woodfall Temple SF Jar Fairy", WF_SF_JAR_FAIRY, WF_STRAY_FAIRY, {Category::cWoodfall, Category::cWoodfallTemple, Category::cWFStray, Category::cVanillaStrayFairy,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); + locationTable[WF_SF_BRIDGE_ROOM_BEEHIVE] = ItemLocation::StrayFairy (0x1B, 0x1D, true, "Woodfall Temple SF Bridge Room Beehive", WF_SF_BRIDGE_ROOM_BEEHIVE, WF_STRAY_FAIRY, {Category::cWoodfall, Category::cWoodfallTemple, Category::cWFStray, Category::cVanillaStrayFairy,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); + locationTable[WF_SF_PLATFORM_ROOM_BEEHIVE] = ItemLocation::StrayFairy (0x1B, 0x1E, true, "Woodfall Temple SF Platform Room Beehive", WF_SF_PLATFORM_ROOM_BEEHIVE, WF_STRAY_FAIRY, {Category::cWoodfall, Category::cWoodfallTemple, Category::cWFStray, Category::cVanillaStrayFairy,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); //Snowhead Stray Faries - locationTable[SH_SF_SNOW_ROOM_BUBBLE] = ItemLocation::StrayFairy (0x21, 0x00, true, "Snowhead Temple SF Snow Room Bubble", SH_SF_SNOW_ROOM_BUBBLE, SH_STRAY_FAIRY, {Category::cSnowheadTemple, Category::cVanillaStrayFairy,Category::cSHStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); - locationTable[SH_SF_CEILING_BUBBLE] = ItemLocation::StrayFairy (0x21, 0x00, true, "Snowhead Temple SF Ceiling Bubble", SH_SF_CEILING_BUBBLE, SH_STRAY_FAIRY, {Category::cSnowheadTemple, Category::cVanillaStrayFairy,Category::cSHStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); - locationTable[SH_SF_DINOLFOS_1] = ItemLocation::StrayFairy (0x21, 0x00, true, "Snowhead Temple SF Dinolfos 1", SH_SF_DINOLFOS_1, SH_STRAY_FAIRY, {Category::cSnowheadTemple, Category::cVanillaStrayFairy,Category::cSHStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); - locationTable[SH_SF_DINOLFOS_2] = ItemLocation::StrayFairy (0x21, 0x00, true, "Snowhead Temple SF Dinolfos 2", SH_SF_DINOLFOS_2, SH_STRAY_FAIRY, {Category::cSnowheadTemple, Category::cVanillaStrayFairy,Category::cSHStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); - locationTable[SH_SF_BRIDGE_ROOM_LEDGE_BUBBLE] = ItemLocation::StrayFairy (0x21, 0x00, true, "Snowhead Temple SF Bridge Room Ledge Bubble", SH_SF_BRIDGE_ROOM_LEDGE_BUBBLE, SH_STRAY_FAIRY, {Category::cSnowheadTemple, Category::cVanillaStrayFairy,Category::cSHStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); - locationTable[SH_SF_BRIDGE_ROOM_PILLAR_BUBBLE] = ItemLocation::StrayFairy (0x21, 0x00, true, "Snowhead Temple SF Bridge Room Pillar Bubble", SH_SF_BRIDGE_ROOM_PILLAR_BUBBLE, SH_STRAY_FAIRY, {Category::cSnowheadTemple, Category::cVanillaStrayFairy,Category::cSHStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); - locationTable[SH_SF_MAP_ROOM_FAIRY] = ItemLocation::StrayFairy (0x21, 0x00, true, "Snowhead Temple SF Map Room Fairy", SH_SF_MAP_ROOM_FAIRY, SH_STRAY_FAIRY, {Category::cSnowheadTemple, Category::cVanillaStrayFairy,Category::cSHStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); - locationTable[SH_SF_MAP_ROOM_LEDGE] = ItemLocation::StrayFairy (0x21, 0x00, true, "Snowhead Temple SF Map Room Ledge", SH_SF_MAP_ROOM_LEDGE, SH_STRAY_FAIRY, {Category::cSnowheadTemple, Category::cVanillaStrayFairy,Category::cSHStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); - locationTable[SH_SF_BASEMENT] = ItemLocation::StrayFairy (0x21, 0x00, true, "Snowhead Temple SF Basement", SH_SF_BASEMENT, SH_STRAY_FAIRY, {Category::cSnowheadTemple, Category::cVanillaStrayFairy,Category::cSHStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); - locationTable[SH_SF_TWIN_BLOCK] = ItemLocation::StrayFairy (0x21, 0x00, true, "Snowhead Temple SF Twin Block", SH_SF_TWIN_BLOCK, SH_STRAY_FAIRY, {Category::cSnowheadTemple, Category::cVanillaStrayFairy,Category::cSHStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); - locationTable[SH_SF_ICICLE_ROOM_WALL] = ItemLocation::StrayFairy (0x21, 0x00, true, "Snowhead Temple SF Icicle Room Wall", SH_SF_ICICLE_ROOM_WALL, SH_STRAY_FAIRY, {Category::cSnowheadTemple, Category::cVanillaStrayFairy,Category::cSHStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); - locationTable[SH_SF_MAIN_ROOM_WALL] = ItemLocation::StrayFairy (0x21, 0x00, true, "Snowhead Temple SF Main Room Wall", SH_SF_MAIN_ROOM_WALL, SH_STRAY_FAIRY, {Category::cSnowheadTemple, Category::cVanillaStrayFairy,Category::cSHStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); - locationTable[SH_SF_PILLAR_FREEZARDS] = ItemLocation::StrayFairy (0x21, 0x00, true, "Snowhead Temple SF Pillar Freezards", SH_SF_PILLAR_FREEZARDS, SH_STRAY_FAIRY, {Category::cSnowheadTemple, Category::cVanillaStrayFairy,Category::cSHStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); - locationTable[SH_SF_ICE_PUZZLE] = ItemLocation::StrayFairy (0x21, 0x00, true, "Snowhead Temple SF Ice Puzzle", SH_SF_ICE_PUZZLE, SH_STRAY_FAIRY, {Category::cSnowheadTemple, Category::cVanillaStrayFairy,Category::cSHStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); - locationTable[SH_SF_CRATE] = ItemLocation::StrayFairy (0x21, 0x00, true, "Snowhead Temple SF Crate", SH_SF_CRATE, SH_STRAY_FAIRY, {Category::cSnowheadTemple, Category::cVanillaStrayFairy,Category::cSHStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); + locationTable[SH_SF_SNOW_ROOM_BUBBLE] = ItemLocation::StrayFairy (0x21, 0x2B, true, "Snowhead Temple SF Snow Room Bubble", SH_SF_SNOW_ROOM_BUBBLE, SH_STRAY_FAIRY, {Category::cSnowheadTemple, Category::cVanillaStrayFairy,Category::cSHStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); + locationTable[SH_SF_CEILING_BUBBLE] = ItemLocation::StrayFairy (0x21, 0x2C, true, "Snowhead Temple SF Ceiling Bubble", SH_SF_CEILING_BUBBLE, SH_STRAY_FAIRY, {Category::cSnowheadTemple, Category::cVanillaStrayFairy,Category::cSHStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); + locationTable[SH_SF_DINOLFOS_1] = ItemLocation::StrayFairy (0x21, 0x2D, true, "Snowhead Temple SF Dinolfos 1", SH_SF_DINOLFOS_1, SH_STRAY_FAIRY, {Category::cSnowheadTemple, Category::cVanillaStrayFairy,Category::cSHStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); + locationTable[SH_SF_DINOLFOS_2] = ItemLocation::StrayFairy (0x21, 0x31, true, "Snowhead Temple SF Dinolfos 2", SH_SF_DINOLFOS_2, SH_STRAY_FAIRY, {Category::cSnowheadTemple, Category::cVanillaStrayFairy,Category::cSHStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); + locationTable[SH_SF_BRIDGE_ROOM_LEDGE_BUBBLE] = ItemLocation::StrayFairy (0x21, 0x2F, true, "Snowhead Temple SF Bridge Room Ledge Bubble", SH_SF_BRIDGE_ROOM_LEDGE_BUBBLE, SH_STRAY_FAIRY, {Category::cSnowheadTemple, Category::cVanillaStrayFairy,Category::cSHStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); + locationTable[SH_SF_BRIDGE_ROOM_PILLAR_BUBBLE] = ItemLocation::StrayFairy (0x21, 0x30, true, "Snowhead Temple SF Bridge Room Pillar Bubble", SH_SF_BRIDGE_ROOM_PILLAR_BUBBLE, SH_STRAY_FAIRY, {Category::cSnowheadTemple, Category::cVanillaStrayFairy,Category::cSHStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); + locationTable[SH_SF_MAP_ROOM_FAIRY] = ItemLocation::StrayFairy (0x21, 0x32, true, "Snowhead Temple SF Map Room Fairy", SH_SF_MAP_ROOM_FAIRY, SH_STRAY_FAIRY, {Category::cSnowheadTemple, Category::cVanillaStrayFairy,Category::cSHStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); + locationTable[SH_SF_MAP_ROOM_LEDGE] = ItemLocation::StrayFairy (0x21, 0x13, true, "Snowhead Temple SF Map Room Ledge", SH_SF_MAP_ROOM_LEDGE, SH_STRAY_FAIRY, {Category::cSnowheadTemple, Category::cVanillaStrayFairy,Category::cSHStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); + locationTable[SH_SF_BASEMENT] = ItemLocation::StrayFairy (0x21, 0x14, true, "Snowhead Temple SF Basement", SH_SF_BASEMENT, SH_STRAY_FAIRY, {Category::cSnowheadTemple, Category::cVanillaStrayFairy,Category::cSHStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); + locationTable[SH_SF_TWIN_BLOCK] = ItemLocation::StrayFairy (0x21, 0x15, true, "Snowhead Temple SF Twin Block", SH_SF_TWIN_BLOCK, SH_STRAY_FAIRY, {Category::cSnowheadTemple, Category::cVanillaStrayFairy,Category::cSHStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); + locationTable[SH_SF_ICICLE_ROOM_WALL] = ItemLocation::StrayFairy (0x21, 0x16, true, "Snowhead Temple SF Icicle Room Wall", SH_SF_ICICLE_ROOM_WALL, SH_STRAY_FAIRY, {Category::cSnowheadTemple, Category::cVanillaStrayFairy,Category::cSHStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); + locationTable[SH_SF_MAIN_ROOM_WALL] = ItemLocation::StrayFairy (0x21, 0x17, true, "Snowhead Temple SF Main Room Wall", SH_SF_MAIN_ROOM_WALL, SH_STRAY_FAIRY, {Category::cSnowheadTemple, Category::cVanillaStrayFairy,Category::cSHStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); + locationTable[SH_SF_PILLAR_FREEZARDS] = ItemLocation::StrayFairy (0x21, 0x18, true, "Snowhead Temple SF Pillar Freezards", SH_SF_PILLAR_FREEZARDS, SH_STRAY_FAIRY, {Category::cSnowheadTemple, Category::cVanillaStrayFairy,Category::cSHStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); + locationTable[SH_SF_ICE_PUZZLE] = ItemLocation::StrayFairy (0x21, 0x19, true, "Snowhead Temple SF Ice Puzzle", SH_SF_ICE_PUZZLE, SH_STRAY_FAIRY, {Category::cSnowheadTemple, Category::cVanillaStrayFairy,Category::cSHStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); + locationTable[SH_SF_CRATE] = ItemLocation::StrayFairy (0x21, 0x1E, true, "Snowhead Temple SF Crate", SH_SF_CRATE, SH_STRAY_FAIRY, {Category::cSnowheadTemple, Category::cVanillaStrayFairy,Category::cSHStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); //Great Bay Stray Fairies - locationTable[GBT_SF_SKULLTULA] = ItemLocation::StrayFairy (0x49, 0x00, true, "Great Bay Temple SF Skulltula", GBT_SF_SKULLTULA, GBT_STRAY_FAIRY, {Category::cGreatBayTemple, Category::cVanillaStrayFairy,Category::cGBTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); - locationTable[GBT_SF_WATER_CONTROL_UNDERWATER_BUBBLE] = ItemLocation::StrayFairy (0x49, 0x00, true, "Great Bay Temple SF Water Control Room Underwater Bubble", GBT_SF_WATER_CONTROL_UNDERWATER_BUBBLE, GBT_STRAY_FAIRY, {Category::cGreatBayTemple, Category::cVanillaStrayFairy,Category::cGBTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); - locationTable[GBT_SF_WATERWHEEL_ROOM_LOWER] = ItemLocation::StrayFairy (0x49, 0x00, true, "Great Bay Temple SF Waterwheel Room Lower", GBT_SF_WATERWHEEL_ROOM_LOWER, GBT_STRAY_FAIRY, {Category::cGreatBayTemple, Category::cVanillaStrayFairy,Category::cGBTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); - locationTable[GBT_SF_WATERWHEEL_ROOM_UPPER] = ItemLocation::StrayFairy (0x49, 0x00, true, "Great Bay Temple SF Waterwheel Room Upper", GBT_SF_WATERWHEEL_ROOM_UPPER, GBT_STRAY_FAIRY, {Category::cGreatBayTemple, Category::cVanillaStrayFairy,Category::cGBTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); - locationTable[GBT_SF_GREEN_VALVE] = ItemLocation::StrayFairy (0x49, 0x00, true, "Great Bay Temple SF Green Valve", GBT_SF_GREEN_VALVE, GBT_STRAY_FAIRY, {Category::cGreatBayTemple, Category::cVanillaStrayFairy,Category::cGBTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); - locationTable[GBT_SF_SEESAW_ROOM] = ItemLocation::StrayFairy (0x49, 0x00, true, "Great Bay Temple SF Seesaw Room", GBT_SF_SEESAW_ROOM, GBT_STRAY_FAIRY, {Category::cGreatBayTemple, Category::cVanillaStrayFairy,Category::cGBTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); - locationTable[GBT_SF_ENTRANCE_TORCHES] = ItemLocation::StrayFairy (0x49, 0x00, true, "Great Bay Temple SF Entrance Torches", GBT_SF_ENTRANCE_TORCHES, GBT_STRAY_FAIRY, {Category::cGreatBayTemple, Category::cVanillaStrayFairy,Category::cGBTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); - locationTable[GBT_SF_BIO_BABAS] = ItemLocation::StrayFairy (0x49, 0x00, true, "Great Bay Temple SF Bio Babas", GBT_SF_BIO_BABAS, GBT_STRAY_FAIRY, {Category::cGreatBayTemple, Category::cVanillaStrayFairy,Category::cGBTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); - locationTable[GBT_SF_UNDERWATER_BARREL] = ItemLocation::StrayFairy (0x49, 0x00, true, "Great Bay Temple SF Underwater Barrel", GBT_SF_UNDERWATER_BARREL, GBT_STRAY_FAIRY, {Category::cGreatBayTemple, Category::cVanillaStrayFairy,Category::cGBTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); - locationTable[GBT_SF_WHIRLPOOL_JAR] = ItemLocation::StrayFairy (0x49, 0x00, true, "Great Bay Temple SF Whirlpool Jar", GBT_SF_WHIRLPOOL_JAR, GBT_STRAY_FAIRY, {Category::cGreatBayTemple, Category::cVanillaStrayFairy,Category::cGBTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); - locationTable[GBT_SF_WHIRLPOOL_BARREL] = ItemLocation::StrayFairy (0x49, 0x00, true, "Great Bay Temple SF Whirlpool Barrel", GBT_SF_WHIRLPOOL_BARREL, GBT_STRAY_FAIRY, {Category::cGreatBayTemple, Category::cVanillaStrayFairy,Category::cGBTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); - locationTable[GBT_SF_DEXIHANDS_JAR] = ItemLocation::StrayFairy (0x49, 0x00, true, "Great Bay Temple SF Dexihands Jar", GBT_SF_DEXIHANDS_JAR, GBT_STRAY_FAIRY, {Category::cGreatBayTemple, Category::cVanillaStrayFairy,Category::cGBTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); - locationTable[GBT_SF_LEDGE_JAR] = ItemLocation::StrayFairy (0x49, 0x00, true, "Great Bay Temple SF Ledge Jar", GBT_SF_LEDGE_JAR, GBT_STRAY_FAIRY, {Category::cGreatBayTemple, Category::cVanillaStrayFairy,Category::cGBTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); - locationTable[GBT_SF_PRE_BOSS_ROOM_BUBBLE] = ItemLocation::StrayFairy (0x49, 0x00, true, "Great Bay Temple SF Pre-Boss Room Bubble", GBT_SF_PRE_BOSS_ROOM_BUBBLE, GBT_STRAY_FAIRY, {Category::cGreatBayTemple, Category::cVanillaStrayFairy,Category::cGBTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); - locationTable[GBT_SF_PRE_BOSS_ROOM_UNDERWATER_BUBBLE] = ItemLocation::StrayFairy (0x49, 0x00, true, "Great Bay Temple SF Pre-Boss Room Underwater Bubble", GBT_SF_PRE_BOSS_ROOM_UNDERWATER_BUBBLE, GBT_STRAY_FAIRY, {Category::cGreatBayTemple, Category::cVanillaStrayFairy,Category::cGBTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); + locationTable[GBT_SF_SKULLTULA] = ItemLocation::StrayFairy (0x49, 0x32, true, "Great Bay Temple SF Skulltula", GBT_SF_SKULLTULA, GBT_STRAY_FAIRY, {Category::cGreatBayTemple, Category::cVanillaStrayFairy,Category::cGBTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); + locationTable[GBT_SF_WATER_CONTROL_UNDERWATER_BUBBLE] = ItemLocation::StrayFairy (0x49, 0x30, true, "Great Bay Temple SF Water Control Room Underwater Bubble", GBT_SF_WATER_CONTROL_UNDERWATER_BUBBLE, GBT_STRAY_FAIRY, {Category::cGreatBayTemple, Category::cVanillaStrayFairy,Category::cGBTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); + locationTable[GBT_SF_WATERWHEEL_ROOM_LOWER] = ItemLocation::StrayFairy (0x49, 0x17, true, "Great Bay Temple SF Waterwheel Room Lower", GBT_SF_WATERWHEEL_ROOM_LOWER, GBT_STRAY_FAIRY, {Category::cGreatBayTemple, Category::cVanillaStrayFairy,Category::cGBTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); + locationTable[GBT_SF_WATERWHEEL_ROOM_UPPER] = ItemLocation::StrayFairy (0x49, 0x14, true, "Great Bay Temple SF Waterwheel Room Upper", GBT_SF_WATERWHEEL_ROOM_UPPER, GBT_STRAY_FAIRY, {Category::cGreatBayTemple, Category::cVanillaStrayFairy,Category::cGBTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); + locationTable[GBT_SF_GREEN_VALVE] = ItemLocation::StrayFairy (0x49, 0x15, true, "Great Bay Temple SF Green Valve", GBT_SF_GREEN_VALVE, GBT_STRAY_FAIRY, {Category::cGreatBayTemple, Category::cVanillaStrayFairy,Category::cGBTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); + locationTable[GBT_SF_SEESAW_ROOM] = ItemLocation::StrayFairy (0x49, 0x16, true, "Great Bay Temple SF Seesaw Room", GBT_SF_SEESAW_ROOM, GBT_STRAY_FAIRY, {Category::cGreatBayTemple, Category::cVanillaStrayFairy,Category::cGBTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); + locationTable[GBT_SF_ENTRANCE_TORCHES] = ItemLocation::StrayFairy (0x49, 0x18, true, "Great Bay Temple SF Entrance Torches", GBT_SF_ENTRANCE_TORCHES, GBT_STRAY_FAIRY, {Category::cGreatBayTemple, Category::cVanillaStrayFairy,Category::cGBTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); + locationTable[GBT_SF_BIO_BABAS] = ItemLocation::StrayFairy (0x49, 0x19, true, "Great Bay Temple SF Bio Babas", GBT_SF_BIO_BABAS, GBT_STRAY_FAIRY, {Category::cGreatBayTemple, Category::cVanillaStrayFairy,Category::cGBTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); + locationTable[GBT_SF_UNDERWATER_BARREL] = ItemLocation::StrayFairy (0x49, 0x1A, true, "Great Bay Temple SF Underwater Barrel", GBT_SF_UNDERWATER_BARREL, GBT_STRAY_FAIRY, {Category::cGreatBayTemple, Category::cVanillaStrayFairy,Category::cGBTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); + locationTable[GBT_SF_WHIRLPOOL_JAR] = ItemLocation::StrayFairy (0x49, 0x1B, true, "Great Bay Temple SF Whirlpool Jar", GBT_SF_WHIRLPOOL_JAR, GBT_STRAY_FAIRY, {Category::cGreatBayTemple, Category::cVanillaStrayFairy,Category::cGBTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); + locationTable[GBT_SF_WHIRLPOOL_BARREL] = ItemLocation::StrayFairy (0x49, 0x1C, true, "Great Bay Temple SF Whirlpool Barrel", GBT_SF_WHIRLPOOL_BARREL, GBT_STRAY_FAIRY, {Category::cGreatBayTemple, Category::cVanillaStrayFairy,Category::cGBTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); + locationTable[GBT_SF_DEXIHANDS_JAR] = ItemLocation::StrayFairy (0x49, 0x1D, true, "Great Bay Temple SF Dexihands Jar", GBT_SF_DEXIHANDS_JAR, GBT_STRAY_FAIRY, {Category::cGreatBayTemple, Category::cVanillaStrayFairy,Category::cGBTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); + locationTable[GBT_SF_LEDGE_JAR] = ItemLocation::StrayFairy (0x49, 0x1E, true, "Great Bay Temple SF Ledge Jar", GBT_SF_LEDGE_JAR, GBT_STRAY_FAIRY, {Category::cGreatBayTemple, Category::cVanillaStrayFairy,Category::cGBTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); + locationTable[GBT_SF_PRE_BOSS_ROOM_BUBBLE] = ItemLocation::StrayFairy (0x49, 0x31, true, "Great Bay Temple SF Pre-Boss Room Bubble", GBT_SF_PRE_BOSS_ROOM_BUBBLE, GBT_STRAY_FAIRY, {Category::cGreatBayTemple, Category::cVanillaStrayFairy,Category::cGBTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); + locationTable[GBT_SF_PRE_BOSS_ROOM_UNDERWATER_BUBBLE] = ItemLocation::StrayFairy (0x49, 0x2F, true, "Great Bay Temple SF Pre-Boss Room Underwater Bubble", GBT_SF_PRE_BOSS_ROOM_UNDERWATER_BUBBLE, GBT_STRAY_FAIRY, {Category::cGreatBayTemple, Category::cVanillaStrayFairy,Category::cGBTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); //Stone Tower Temple Stray Fairies - locationTable[ST_SF_MIRROR_SUN_BLOCK] = ItemLocation::StrayFairy (0x16, 0x00, true, "Stone Tower Temple SF Mirror Sun Block", ST_SF_MIRROR_SUN_BLOCK, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); - locationTable[ST_SF_LAVA_ROOM_LEDGE] = ItemLocation::StrayFairy (0x16, 0x00, true, "Stone Tower Temple SF Lava Room Ledge", ST_SF_LAVA_ROOM_LEDGE, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); - locationTable[ST_SF_LAVA_ROOM_FIRE_RING] = ItemLocation::StrayFairy (0x16, 0x00, true, "Stone Tower Temple SF Lava Room Fire Ring", ST_SF_LAVA_ROOM_FIRE_RING, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); - locationTable[ST_SF_EYEGORE] = ItemLocation::StrayFairy (0x16, 0x00, true, "Stone Tower Temple SF Eyegore", ST_SF_EYEGORE, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); - locationTable[ST_SF_UPDRAFT_FIRE_RING] = ItemLocation::StrayFairy (0x18, 0x00, true, "Stone Tower Temple SF Updraft Fire Ring", ST_SF_UPDRAFT_FIRE_RING, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); - locationTable[ST_SF_MIRROR_SUN_SWITCH] = ItemLocation::StrayFairy (0x16, 0x00, true, "Stone Tower Temple SF Mirror Sun Switch", ST_SF_MIRROR_SUN_SWITCH, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); - locationTable[ST_SF_BOSS_WARP] = ItemLocation::StrayFairy (0x18, 0x00, true, "Stone Tower Temple SF Boss Warp", ST_SF_BOSS_WARP, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); - locationTable[ST_SF_WIZZROBE] = ItemLocation::StrayFairy (0x18, 0x00, true, "Stone Tower Temple SF Wizzrobe", ST_SF_WIZZROBE, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); - locationTable[ST_SF_DEATH_ARMOS] = ItemLocation::StrayFairy (0x18, 0x00, true, "Stone Tower Temple SF Death Armos", ST_SF_DEATH_ARMOS, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); - locationTable[ST_SF_UPDRAFT_FROZEN_EYE] = ItemLocation::StrayFairy (0x18, 0x00, true, "Stone Tower Temple SF Updraft Frozen Eye", ST_SF_UPDRAFT_FROZEN_EYE, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); - locationTable[ST_SF_THIN_BRIDGE] = ItemLocation::StrayFairy (0x18, 0x00, true, "Stone Tower Temple SF Thin Bridge", ST_SF_THIN_BRIDGE, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); - locationTable[ST_SF_BASEMENT_LEDGE] = ItemLocation::StrayFairy (0x16, 0x00, true, "Stone Tower Temple SF Basement Ledge", ST_SF_BASEMENT_LEDGE, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); - locationTable[ST_SF_STATUE_EYE] = ItemLocation::StrayFairy (0x16, 0x00, true, "Stone Tower Temple SF Statue Eye", ST_SF_STATUE_EYE, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); - locationTable[ST_SF_UNDERWATER] = ItemLocation::StrayFairy (0x18, 0x00, true, "Stone Tower Temple SF Underwater", ST_SF_UNDERWATER, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); - locationTable[ST_SF_BRIDGE_CRYSTAL] = ItemLocation::StrayFairy (0x18, 0x00, true, "Stone Tower Temple SF Bridge Crystal", ST_SF_BRIDGE_CRYSTAL, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); + locationTable[ST_SF_MIRROR_SUN_BLOCK] = ItemLocation::StrayFairy (0x16, 0x0B, true, "Stone Tower Temple SF Mirror Sun Block", ST_SF_MIRROR_SUN_BLOCK, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); + locationTable[ST_SF_LAVA_ROOM_LEDGE] = ItemLocation::StrayFairy (0x16, 0x19, true, "Stone Tower Temple SF Lava Room Ledge", ST_SF_LAVA_ROOM_LEDGE, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); + locationTable[ST_SF_LAVA_ROOM_FIRE_RING] = ItemLocation::StrayFairy (0x16, 0x0D, true, "Stone Tower Temple SF Lava Room Fire Ring", ST_SF_LAVA_ROOM_FIRE_RING, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); + locationTable[ST_SF_EYEGORE] = ItemLocation::StrayFairy (0x16, 0x0C, true, "Stone Tower Temple SF Eyegore", ST_SF_EYEGORE, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); + locationTable[ST_SF_UPDRAFT_FIRE_RING] = ItemLocation::StrayFairy (0x18, 0x0E, true, "Stone Tower Temple SF Updraft Fire Ring", ST_SF_UPDRAFT_FIRE_RING, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); + locationTable[ST_SF_MIRROR_SUN_SWITCH] = ItemLocation::StrayFairy (0x16, 0x0F, true, "Stone Tower Temple SF Mirror Sun Switch", ST_SF_MIRROR_SUN_SWITCH, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); + locationTable[ST_SF_BOSS_WARP] = ItemLocation::StrayFairy (0x18, 0x10, true, "Stone Tower Temple SF Boss Warp", ST_SF_BOSS_WARP, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); + locationTable[ST_SF_WIZZROBE] = ItemLocation::StrayFairy (0x18, 0x11, true, "Stone Tower Temple SF Wizzrobe", ST_SF_WIZZROBE, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); + locationTable[ST_SF_DEATH_ARMOS] = ItemLocation::StrayFairy (0x18, 0x12, true, "Stone Tower Temple SF Death Armos", ST_SF_DEATH_ARMOS, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); + locationTable[ST_SF_UPDRAFT_FROZEN_EYE] = ItemLocation::StrayFairy (0x18, 0x13, true, "Stone Tower Temple SF Updraft Frozen Eye", ST_SF_UPDRAFT_FROZEN_EYE, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); + locationTable[ST_SF_THIN_BRIDGE] = ItemLocation::StrayFairy (0x18, 0x14, true, "Stone Tower Temple SF Thin Bridge", ST_SF_THIN_BRIDGE, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); + locationTable[ST_SF_BASEMENT_LEDGE] = ItemLocation::StrayFairy (0x16, 0x15, true, "Stone Tower Temple SF Basement Ledge", ST_SF_BASEMENT_LEDGE, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); + locationTable[ST_SF_STATUE_EYE] = ItemLocation::StrayFairy (0x16, 0x16, true, "Stone Tower Temple SF Statue Eye", ST_SF_STATUE_EYE, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); + locationTable[ST_SF_UNDERWATER] = ItemLocation::StrayFairy (0x18, 0x17, true, "Stone Tower Temple SF Underwater", ST_SF_UNDERWATER, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); + locationTable[ST_SF_BRIDGE_CRYSTAL] = ItemLocation::StrayFairy (0x18, 0x18, true, "Stone Tower Temple SF Bridge Crystal", ST_SF_BRIDGE_CRYSTAL, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); /*------------------------------- ---HEART CONTAINERS --- diff --git a/source/item_pool.cpp b/source/item_pool.cpp index 9604c31..5aaa1fc 100644 --- a/source/item_pool.cpp +++ b/source/item_pool.cpp @@ -642,20 +642,10 @@ static void PlaceVanillaBossKeys() { static void PlaceVanillaStrayFairies() { for (auto dungeon : dungeonList) { - switch (dungeon) { - case WoodfallTemple: - dungeon->PlaceVanillaWFStray(); - break; - case SnowheadTemple: - dungeon->PlaceVanillaSHStray(); - break; - case GreatBayTemple: - dungeon->PlaceVanillaGBTStray(); - break; - case StoneTowerTemple: - dungeon->PlaceVanillaSTStray(); - break; - } + dungeon->PlaceVanillaWFStray(); + dungeon->PlaceVanillaSHStray(); + dungeon->PlaceVanillaGBTStray(); + dungeon->PlaceVanillaSTStray(); } //Clock Town PlaceItemInLocation(LAUNDRY_POOL_SF, CT_STRAY_FAIRY); @@ -729,12 +719,8 @@ static void PlaceVanillaStrayFairies() { static void PlaceVanillaSkulltulaTokens() { for (auto dungeon : dungeonList) { - switch (dungeon) { - case SwampSpiderHouse: - dungeon->PlaceVanillaSwampToken(); - case OceansideSpiderHouse: - dungeon->PlaceVanillaOceanToken(); - } + dungeon->PlaceVanillaSwampToken(); + dungeon->PlaceVanillaOceanToken(); } /* //Swamp Skull Tokens @@ -1254,13 +1240,20 @@ void GenerateItemPool() { PlaceVanillaStrayFairies(); } else { - AddItemToMainPool(CT_STRAY_FAIRY, 1); //if no selection or error ?? AddItemToMainPool(WF_STRAY_FAIRY, 15); AddItemToMainPool(SH_STRAY_FAIRY, 15); AddItemToMainPool(GBT_STRAY_FAIRY, 15); AddItemToMainPool(ST_STRAY_FAIRY, 15); } + //CLOCK TOWN STRAY FAIRY (Separated because it's not in a dungeon) + if (!ShuffleCTStray) { + PlaceItemInLocation(CT_STRAY_FAIRY, LAUNDRY_POOL_SF); + } + else { + AddItemToMainPool(CT_STRAY_FAIRY, 1); + } + //DungeonRewards AddItemsToPool(ItemPool, dungeonRewards); diff --git a/source/setting_descriptions.cpp b/source/setting_descriptions.cpp index 524accb..940a0b7 100644 --- a/source/setting_descriptions.cpp +++ b/source/setting_descriptions.cpp @@ -182,24 +182,19 @@ string_view bossKeyAnywhere = "Boss Keys can appear anywhere in the wo /*------------------------------ // | STRAY FAIRIES | // ------------------------------*/ // -string_view fairyVanilla = "**OPTION CURRENTLY WIP**\n" // - "Stray Fairies will appear in their \n" // +string_view fairyVanilla = "Stray Fairies will appear in their \n" // "vanilla locations."; // -string_view fairyStartWith = "**OPTION CURRENTLY WIP**\n" // - "Stray Fairies are given to you from the start so \n" +string_view fairyStartWith = "Stray Fairies are given to you from the start so \n" "won't have to worry about collecting them.\n" // "An easier mode."; // -string_view fairyOwnDungeon = "**OPTION CURRENTLY WIP**\n" // - "Stray Fairies can only appear in their respective\n" +string_view fairyOwnDungeon = "Stray Fairies can only appear in their respective\n" "dungeon."; // -string_view fairyAnyDungeon = "**OPTION CURRENTLY WIP**\n" // - "Stray Fairies can only appear inside of any dungeon\n" +string_view fairyAnyDungeon = "Stray Fairies can only appear inside of any dungeon\n" "but won't necessarily be in the dungeon that they\n" "are supposed to be found in."; // -string_view fairyOverworld = "**OPTION CURRENTLY WIP**\n" // - "Stray Fairies can only appear outside of dungeons"; -string_view fairyAnywhere = "**OPTION CURRENTLY WIP**\n" // - "Stray Fairies can appear anywhere in the world."; // +string_view fairyOverworld = "Stray Fairies can only appear outside of dungeons"; +string_view fairyAnywhere = "Stray Fairies can appear anywhere in the world."; // +string_view shuffleCTStrayDesc = "Shuffle the Clock Town Stray Fairy"; // /*------------------------------ // | SHUFFLE DUNGEON REWARDS | // ------------------------------*/ // diff --git a/source/settings.cpp b/source/settings.cpp index 423d8ec..79a1361 100644 --- a/source/settings.cpp +++ b/source/settings.cpp @@ -372,6 +372,7 @@ namespace Settings { Option ShuffleHeartContainers = Option::Bool("Heart Containers", { "Vanilla", "Random"}, { shuffleHeartContainersDesc }); Option MoonRemainsRequired = Option::U8("Moon Requirements", {"Vanilla", "3", "2", "1", "0"}, { MoonRemainsRequiredDesc }, OptionCategory::Setting); Option MajoraRemainsRequired = Option::U8("Majora Requirements",{"Vanilla", "3", "2", "1", "0"}, { MajoraRemainsRequiredDesc }, OptionCategory::Setting); + Option ShuffleCTStray = Option::Bool("Clock Town Stray Fairy", { "Vanilla", "Anywhere" }, { shuffleCTStrayDesc }); std::vectordungeonSettingsOptions = { &RandomizeDungeon, @@ -379,6 +380,7 @@ namespace Settings { &Keysanity, &BossKeysanity, &StrayFairysanity, + &ShuffleCTStray, &ShuffleRewards, &ShuffleHeartContainers, &MoonRemainsRequired, @@ -1475,6 +1477,12 @@ namespace Settings { else { Unhide(strayFairies); } + if (!ShuffleCTStray) { + IncludeAndHide( {LAUNDRY_POOL_SF} ); + } + else { + Unhide( {LAUNDRY_POOL_SF} ); + } } @@ -1769,6 +1777,7 @@ namespace Settings { MapsAndCompasses.SetSelectedIndex(0); BossKeysanity.SetSelectedIndex(0); StrayFairysanity.SetSelectedIndex(0); + ShuffleCTStray.SetSelectedIndex(0); ShuffleRewards.SetSelectedIndex(0); ShuffleHeartContainers.SetSelectedIndex(0); ShuffleMainInventory.SetSelectedIndex(0); From bd630fb6676b15f2d39d030044cd52319a342b0a Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sun, 19 Jul 2026 21:31:12 -0500 Subject: [PATCH 04/12] Update fill.cpp Remove Anju & kafei placement as it is no longer needed also remove block comment that is unused and will not be used --- source/fill.cpp | 24 +----------------------- 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/source/fill.cpp b/source/fill.cpp index 2e714e2..d4db8f0 100644 --- a/source/fill.cpp +++ b/source/fill.cpp @@ -1054,11 +1054,7 @@ int Fill() { //Then Place those to expand the amount of checks available AssumedFill(mainadvancementItems, allLocations,true); - //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 - 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); - + //Then place the rest of the repeatable items in locations marked as repeatable std::vector repeatableItemLocations = FilterFromPool(allLocations, [](const LocationKey loc) {return Location(loc)->IsRepeatable();}); std::vector remainingRepeatItemPool = FilterAndEraseFromPool(ItemPool, [](const ItemKey i) {return ItemTable(i).IsReusable();}); AssumedFill(remainingRepeatItemPool, repeatableItemLocations, true); @@ -1068,24 +1064,6 @@ int Fill() { std::vector dekuTrades = FilterAndEraseFromPool(ItemPool, [](const ItemKey i) {return ItemTable(i).GetItemType() == ITEMTYPE_TRADE;}); AssumedFill(dekuTrades, allLocations); } */ - - //Then Place songs if song shuffle is set to specific locations - /* - if (ShuffleSongs.IsNot(SongShuffleSetting::SONGSHUFFLE_ANYWHERE)) { - - //Get each song - std::vector songs = FilterAndEraseFromPool(ItemPool, [](const ItemKey i) { return ItemTable(i).GetItemType() == ITEMTYPE_SONG;}); - - //Get each song location - std::vector songLocations; - if (ShuffleSongs.Is(SongShuffleSetting::SONGSHUFFLE_SONG_LOCATIONS)) { - songLocations = FilterFromPool(allLocations, [](const LocationKey loc) { return Location(loc)->IsCategory(Category::cSong);}); - } - else if (ShuffleSongs.Is(SongShuffleSetting::SONGSHUFFLE_ANYWHERE)) { - songLocations = allLocations; - } - AssumedFill(songs, songLocations, true); - }*/ //Then place Link's Pocket Item if it has to be an advancement item //Links Pocket is useless as there is no unobtainable check due to a certain time travel sword pedistal From 4473c520350048a341ab275723995733198e6b2c Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Tue, 21 Jul 2026 22:46:31 -0500 Subject: [PATCH 05/12] SoT Hint - Adds SoT hint to the Clock Tower Door if it's shuffled - Adds custom text to Beavers to replace "Empty Bottle" with the item it's been randomized to. --- source/custom_messages.cpp | 2 +- source/fill.cpp | 1 + source/hints.cpp | 246 +++++++++++++++++++++++++++++++++++-- 3 files changed, 236 insertions(+), 13 deletions(-) diff --git a/source/custom_messages.cpp b/source/custom_messages.cpp index a9b93e3..27ee151 100644 --- a/source/custom_messages.cpp +++ b/source/custom_messages.cpp @@ -254,7 +254,7 @@ void CreateBaselineCustomMessages() { // Woodfall CreateMessageFromTextObject(0x6137, 0x003E, 0x3FFFFFFF, 0xFF0000, GITextIntroMap + GITextDungeonWoodfall, - {QM_GREEN, QM_GREEN}, {}, {}, 0x0, false, false); + {QM_GREEN, QM_WHITE}, {}, {}, 0x0, false, false); // Snowhead CreateMessageFromTextObject(0x6138, 0x003E, 0x3FFFFFFF, 0xFF0000, diff --git a/source/fill.cpp b/source/fill.cpp index d4db8f0..e0a149f 100644 --- a/source/fill.cpp +++ b/source/fill.cpp @@ -890,6 +890,7 @@ int Fill() { GenerateStartingInventory(); RemoveStartingItemsFromPool(); FillExcludedLocations(); + PlaceItemInLocation(S_CLOCK_TOWN_CLOCK_TOWER_ENTRANCE, WOODFALL_TEMPLE_SMALL_KEY); showItemProgress = true; diff --git a/source/hints.cpp b/source/hints.cpp index 490d9e8..4aab982 100644 --- a/source/hints.cpp +++ b/source/hints.cpp @@ -503,8 +503,7 @@ void CreateOtherHints() { +Text{"#."} }; CustomMessages::CreateMessageFromTextObject(0x44d, 0xFFFF, 0x3FF0A014, 0xFF1001, - bankReward1Hint, - {QM_RED}, {}, {}, 0x0, false, false); + bankReward1Hint, {QM_RED}, {}, {}, 0x0, false, false); //Termina Field Deku Salesman Heart Piece Text dekuSalesmanHint = Text{ @@ -527,8 +526,205 @@ void CreateOtherHints() { } }; CustomMessages::CreateMessageFromTextObject(0x1631, 0xFFFF, 0x3FF0A014, 0xFF1001, - dekuSalesmanHint, - {QM_RED}, {}, {}, 0x0, false, false); + dekuSalesmanHint,{QM_RED}, {}, {}, 0x0, false, false); + + //Beaver Hints + Text EmptyBottleHint = ItemTable(Location(ZORA_CAPE_BEAVER_RACE_1)->GetPlacedItemKey()).GetName(); + Text beaverHint1 = Text{ + Text{ + /*NaEnglish*/"You want a #", + /*NaFrench*/"Tu veux une #", + /*NaSpanish*/"¿Quieres una #", + /*EuEnglish*/"You want an #", + /*EuFrench*/"Tu veux une #", + /*EuSpanish*/"¿Quieres una #", + } + +ItemTable(Location(ZORA_CAPE_BEAVER_RACE_1)->GetPlacedItemKey()).GetName() + +Text{ + /*NaEnglish*/"#, don't you? You never learn your lesson!", + /*NaFrench*/"#, n'est-ce pas? Tu n'apprends jamais ta leçon!", + /*NaSpanish*/"#, ¿verdad? No aprendes tu lección...", + /*EuEnglish*/"#, don't you? You never learn your lesson!", + /*EuFrench*/"#, n'est-ce pas? Tu n'apprends jamais ta leçon!", + /*EuSpanish*/"#, ¿verdad? No aprendes tu lección...", + } + }; + CustomMessages::CreateMessageFromTextObject(0x10cf, 0xFFFF, 0x3fffffff, 0xFF0000, + beaverHint1, {QM_RED}, {}, {}, 0x0, false, false); + + Text beaverHint2 = Text{ + Text{ + /*NaEnglish*/"Koo, koo, koo. If you want an #", + /*NaFrench*/"Koo, koo, koo. Si tu veux une #", + /*NaSpanish*/"Koo, koo, koo. Si quieres una #", + /*EuEnglish*/"Koo, koo, koo. If you want an #", + /*EuFrench*/"Koo, koo, koo. Si tu veux une #", + /*EuSpanish*/"Koo, koo, koo. Si quieres una #", + } + +ItemTable(Location(ZORA_CAPE_BEAVER_RACE_1)->GetPlacedItemKey()).GetName() + +Text{ + /*NaEnglish*/"#, I can give you one... But only if you can swim through all the rings in the river in under two minutes.", + /*NaFrench*/"#, je peux te donner une... Mais seulement si tu peux nager à travers tous les anneaux de la rivière en moins de deux minutes.", + /*NaSpanish*/"#, puedo darte una... Pero solo si puedes nadar a través de todos los anillos del río en menos de dos minutos.", + /*EuEnglish*/"#, I can give you one... But only if you can swim through all the rings in the river in under two minutes.", + /*EuFrench*/"#, je peux te donner une... Mais seulement si tu peux nager à travers tous les anneaux de la rivière en moins de deux minutes.", + /*EuSpanish*/"#, puedo darte una... Pero solo si puedes nadar a través de todos los anillos del río en menos de dos minutos.", + } + }; + CustomMessages::CreateMessageFromTextObject(0x10d4, 0xFFFF, 0x3fffffff, 0xFF0000, + beaverHint2, {QM_RED}, {}, {}, 0x0, false, false); + + Text beaverHint3 = Text{ + Text{ + /*NaEnglish*/"What? A #", + /*NaFrench*/"Quoi? Une #", + /*NaSpanish*/"¿Qué? Una #", + /*EuEnglish*/"What? A #", + /*EuFrench*/"Quoi? Une #", + /*EuSpanish*/"¿Qué? Una #", + } + +ItemTable(Location(ZORA_CAPE_BEAVER_RACE_1)->GetPlacedItemKey()).GetName() + +Text{ + /*NaEnglish*/"#?", + /*NaFrench*/"#?", + /*NaSpanish*/"#?", + /*EuEnglish*/"#?", + /*EuFrench*/"#?", + /*EuSpanish*/"#?", + } + }; + CustomMessages::CreateMessageFromTextObject(0x10e0, 0xFFFF, 0x3fffffff, 0xFF0000, + beaverHint3, {QM_RED}, {}, {}, 0x0, false, false); + + Text beaverHint4 = Text{ + Text{ + /*NaEnglish*/"Yeah... A #", + /*NaFrench*/"Oui... Une #", + /*NaSpanish*/"Sí... Una #", + /*EuEnglish*/"Yeah... A #", + /*EuFrench*/"Oui... Une #", + /*EuSpanish*/"Sí... Una #", + } + +ItemTable(Location(ZORA_CAPE_BEAVER_RACE_1)->GetPlacedItemKey()).GetName() + +Text{ + /*NaEnglish*/"#.", + /*NaFrench*/"#.", + /*NaSpanish*/"#.", + /*EuEnglish*/"#.", + /*EuFrench*/"#.", + /*EuSpanish*/"#.", + } + }; + CustomMessages::CreateMessageFromTextObject(0x10e1, 0xFFFF, 0x3fffffff, 0xFF0000, + beaverHint4, {QM_RED}, {}, {}, 0x0, false, false); + + Text beaverHint5 = Text{ + Text{ + /*NaEnglish*/"To you, it's just an #", + /*NaFrench*/"Pour toi, c'est juste une #", + /*NaSpanish*/"Para ti, es solo una #", + /*EuEnglish*/"To you, it's just an #", + /*EuFrench*/"Pour toi, c'est juste une #", + /*EuSpanish*/"Para ti, es solo una #", + } + +ItemTable(Location(ZORA_CAPE_BEAVER_RACE_1)->GetPlacedItemKey()).GetName() + +Text{ + /*NaEnglish*/"# but to us it's a precious treasure. I can't give you one just because you beat my little brother.", + /*NaFrench*/"# mais pour nous c'est un trésor précieux. Je ne peux pas te donner une seule parce que tu as battu mon petit frère.", + /*NaSpanish*/"# pero para nosotros es un tesoro precioso. No puedo darte una solo porque venciste a mi hermano menor.", + /*EuEnglish*/"# but to us it's a precious treasure. I can't give you one just because you beat my little brother.", + /*EuFrench*/"# mais pour nous c'est un trésor précieux. Je ne peux pas te donner une seule parce que tu as battu mon petit frère.", + /*EuSpanish*/"# pero para nosotros es un tesoro precioso. No puedo darte una solo porque venciste a mi hermano menor.", + } + }; + CustomMessages::CreateMessageFromTextObject(0x10e2, 0xFFFF, 0x3fffffff, 0xFF0000, + beaverHint5, {QM_RED}, {}, {}, 0x0, false, false); + + Text beaverHint6 = Text{ + Text{ + /*NaEnglish*/"But we don't have any more #", + /*NaFrench*/"Mais nous n'avons plus aucune #", + /*NaSpanish*/"Pero no tenemos más #", + /*EuEnglish*/"But we don't have any more #", + /*EuFrench*/"Mais nous n'avons plus aucune #", + /*EuSpanish*/"Pero no tenemos más #", + } + +ItemTable(Location(ZORA_CAPE_BEAVER_RACE_1)->GetPlacedItemKey()).GetName() + +Text{ + /*NaEnglish*/"#s...do we, Little Brother?", + /*NaFrench*/"#s...n'est-ce pas, petit frère?", + /*NaSpanish*/"#s...¿verdad, hermano menor?", + /*EuEnglish*/"#s...do we, Little Brother?", + /*EuFrench*/"#s...n'est-ce pas, petit frère?", + /*EuSpanish*/"#s...¿verdad, hermano menor?", + } + }; + CustomMessages::CreateMessageFromTextObject(0x10f5, 0xFFFF, 0x3fffffff, 0xFF0000, + beaverHint6, {QM_RED}, {}, {}, 0x0, false, false); + + Text beaverHint7 = Text{ + Text{ + /*NaEnglish*/"I told you that the beavers above the waterfall on the Zora Hall coast have #", + /*NaFrench*/"Je t'ai dit que les castors au-dessus de la cascade sur la côte du Château des Zora ont #", + /*NaSpanish*/"Te dije que los zorros encima de la cascada en la orilla del Palacio de los Zora tienen #", + /*EuEnglish*/"I told you that the beavers above the waterfall on the Zora Hall coast have #", + /*EuFrench*/"Je t'ai dit que les castors au-dessus de la cascade sur la côte du Château des Zora ont #", + /*EuSpanish*/"Te dije que los zorros encima de la cascada en la orilla del Palacio de los Zora tienen #", + } + +ItemTable(Location(ZORA_CAPE_BEAVER_RACE_1)->GetPlacedItemKey()).GetName() + +Text{ + /*NaEnglish*/"#s, right? If you could nab a #", + /*NaFrench*/"#s, n'est-ce pas? Si tu pouvais t'emparer d'un #", + /*NaSpanish*/"#s, ¿verdad? Si pudieras pillar un #", + /*EuEnglish*/"#s, right? If you could nab a #", + /*EuFrench*/"#s, n'est-ce pas? Si tu pouvais t'emparer d'un #", + /*EuSpanish*/"#s, ¿verdad? Si pudieras pillar un #", + } + +ItemTable(Location(ZORA_CAPE_BEAVER_RACE_1)->GetPlacedItemKey()).GetName() + +Text{ + /*NaEnglish*/"# from them...Ah, but you'd have to climb pretty high up to get to where they live, way up on top of the waterfall.", + /*NaFrench*/"# de eux... Ah, mais il faudrait grimper très haut pour atteindre leur domicile, bien en haut sur la cascade.", + /*NaSpanish*/"# de ellos... Ah, pero tendrías que escalar bastante alto para llegar a donde viven, muy arriba sobre la cascada.", + /*EuEnglish*/"# from them...Ah, but you'd have to climb pretty high up to get to where they live, way up on top of the waterfall.", + /*EuFrench*/"# de eux... Ah, mais il faudrait grimper très haut pour atteindre leur domicile, bien en haut sur la cascade.", + /*EuSpanish*/"# de ellos... Ah, pero tendrías que escalar bastante alto para llegar a donde viven, muy arriba sobre la cascada.", + } + }; + CustomMessages::CreateMessageFromTextObject(0x1240, 0xFFFF, 0x3fffffff, 0xFF0000, + beaverHint7, {QM_RED, QM_RED}, {}, {}, 0x0, false, false); + + Text beaverHint8 = Text{ + Text{ + /*NaEnglish*/"I already told you the beavers above the waterfall have #", + /*NaFrench*/"Je t'ai déjà dit que les castors au-dessus de la cascade ont #", + /*NaSpanish*/"Te dije ya que los zorros encima de la cascada tienen #", + /*EuEnglish*/"I already told you the beavers above the waterfall have #", + /*EuFrench*/"Je t'ai déjà dit que les castors au-dessus de la cascade ont #", + /*EuSpanish*/"Te dije ya que los zorros encima de la cascada tienen #", + } + +ItemTable(Location(ZORA_CAPE_BEAVER_RACE_1)->GetPlacedItemKey()).GetName() + +Text{ + /*NaEnglish*/"#s, didn't I? If you could nab a #", + /*NaFrench*/"#s, n'est-ce pas? Si tu pouvais t'emparer d'un #", + /*NaSpanish*/"#s, ¿verdad? Si pudieras pillar un #", + /*EuEnglish*/"#s, didn't I? If you could nab a #", + /*EuFrench*/"#s, n'est-ce pas? Si tu pouvais t'emparer d'un #", + /*EuSpanish*/"#s, ¿verdad? Si pudieras pillar un #", + } + +ItemTable(Location(ZORA_CAPE_BEAVER_RACE_1)->GetPlacedItemKey()).GetName() + +Text{ + /*NaEnglish*/"# from them... Ah, but you'd have to climb pretty high up to get to where they live, way up on top of the waterfall. The fisherman had an item that could latch on to trees and pull him toward them...but the pirates stole it. Isn't there anything you can do?", + /*NaFrench*/"# de eux... Ah, mais il faudrait grimper très haut pour atteindre leur domicile, bien en haut sur la cascade. Le pêcheur avait un objet qui pouvait s'agripper aux arbres et l'entraîner vers eux... mais les pirates l'ont volé. N'y a-t-il rien que tu puisses faire?", + /*NaSpanish*/"# de ellos... Ah, pero tendrías que escalar bastante alto para llegar a donde viven, muy arriba sobre la cascada. El pescador tenía un objeto que podía aferrarse a los árboles y jalarlo hacia ellos... pero los piratas lo robaron. ¿No hay nada que puedas hacer?", + /*EuEnglish*/"# from them... Ah, but you'd have to climb pretty high up to get to where they live, way up on top of the waterfall. The fisherman had an item that could latch on to trees and pull him toward them...but the pirates stole it. Isn't there anything you can do?", + /*EuFrench*/"# de eux... Ah, mais il faudrait grimper très haut pour atteindre leur domicile, bien en haut sur la cascade. Le pêcheur avait un objet qui pouvait s'agripper aux arbres et l'entraîner vers eux... mais les pirates l'ont volé. N'y a-t-il rien que tu puisses faire?", + /*EuSpanish*/"# de ellos... Ah, pero tendrías que escalar bastante alto para llegar a donde viven, muy arriba sobre la cascada. El pescador tenía un objeto que podía aferrarse a los árboles y jalarlo hacia ellos... pero los piratas lo robaron. ¿No hay nada que puedas hacer?", + } + }; + CustomMessages::CreateMessageFromTextObject(0x1242, 0xFFFF, 0x3fffffff, 0xFF0000, + beaverHint8, {QM_RED, QM_RED}, {}, {}, 0x0, false, false); + + } @@ -558,6 +754,14 @@ void CreateClockTowerDoorHints() { /*EuFrench */"Dis, t'avais pas un &#instrument de musique# ?&Je parie que Skull Kid, l'a caché vers ", /*EuSpanish*/"" }+BuildDoorText(OCARINA_OF_TIME); + Text songTimeHint = Text{ + /*NaEnglish*/"How could you forget the #Song of Time#?&We'll need to relearn it in ", + /*NaFrench */"Comment as-tu pu oublier la #Chanson du Temps#?&On devra l'apprendre dans ", + /*NaSpanish*/"¿Cómo pudiste olvidar la #Song of Time#?&Vamos a necesitar aprenderla en ", + /*EuEnglish*/"How could you forget the #Song of Time#?&We'll need to relearn it in ", + /*EuFrench */"Comment as-tu pu oublier la #Chanson du Temps#?&On devra l'apprendre dans ", + /*EuSpanish*/"¿Cómo pudiste olvidar la #Song of Time#?&Vamos a necesitar aprenderla en " + }+BuildDoorText(SONG_OF_TIME); Text odolwaHint = Text{ /*English*/"There's one with a #crown# and #jewellery# said to be found at ", /*French */"Y'en a un avec une #couronne# et des #bijoux# situé vers ", @@ -642,7 +846,24 @@ void CreateClockTowerDoorHints() { break; } - CustomMessages::CreateMessage(0x0630, (StartingOcarina.Value() == 0) ? 0x8000 : 0x8002, 0x3FFFFFFF, 0x0FF0211, + CustomMessages::CreateMessage(0x0630, (StartingOcarina.Value() == 0) ? 0x8000 : 0x8003, 0x3FFFFFFF, 0x0FF0211, + {"Rooftop access strictly prohibited!&(Enforceable until #midnight# on the&#eve# of the carnival.)^" + "#Notice of carnival activities:#&Musical Performance Contest&Unique Mask Contest&#Prizes available!#", + // French + "Accès aux toits strictement&interdit jusqu'à #minuit#, la&#veille #du carnaval.^" + "#Notice d'activités du carnaval:#&Concours de performance musicale&Concours de masques singuliers&#Prix à la clé!#", + // Spanish + "Acceso al tejado.&¡Prohibida la entrada hasta&la #medianoche de la víspera&#del carnaval!^" + "**SPANISH**", + // // German + // "Zugang zum Dach&Betreten streng verboten!&(bis um #Mitternacht# am&Vorabend des #Karnevals#)^" + // "**GERMAN**", + // // Italian + // "Porta del tetto&Ingresso vietato fino alla&#mezzanotte# della #vigilia# del&carnevale.^" + // "**ITALIAN**", + }, + {QM_RED, QM_RED, QM_RED, QM_MAGENTA}, {}, {}, 0x0, false, false); + CustomMessages::CreateMessage(0x0630, (ShuffleSongOfTime.Value() == 1) ? 0x8000 : 0x8003, 0x3FFFFFFF, 0x0FF0211, {"Rooftop access strictly prohibited!&(Enforceable until #midnight# on the&#eve# of the carnival.)^" "#Notice of carnival activities:#&Musical Performance Contest&Unique Mask Contest&#Prizes available!#", // French @@ -660,23 +881,24 @@ void CreateClockTowerDoorHints() { }, {QM_RED, QM_RED, QM_RED, QM_MAGENTA}, {}, {}, 0x0, false, false); CustomMessages::CreateMessageFromTextObject(0x8000, 0x8001, 0x3FFFFFFF, 0x1000000, ocarinaHint, {QM_BLUE, QM_RED}, {}, {}, 0x083E, false, false); - CustomMessages::CreateMessage(0x8001, 0x8003, 0x3FFFFFFF, 0x1FF0000, + CustomMessages::CreateMessageFromTextObject(0x8001, 0x8002, 0x3FFFFFFF, 0x1000000, songTimeHint, {QM_BLUE, QM_RED}, {}, {}, 0x083E, false, false); + CustomMessages::CreateMessage(0x8002, 0x8004, 0x3FFFFFFF, 0x1FF0000, {"Also, that #mask competition# sounds interesting! I've heard rumours of some pretty #rare masks# around here, truly one of a kind stuff!", // French "D'ailleurs, ce #concours de masques# me rappelle que j'ai entendu des rumeurs dans le coin sur des #masques très uniques#.", }, {QM_RED, QM_RED}, {}, {}, 0x0, false, false); - CustomMessages::CreateMessage(0x8002, 0x8003, 0x3FFFFFFF, 0x1FF0000, + CustomMessages::CreateMessage(0x8003, 0x8004, 0x3FFFFFFF, 0x1FF0000, {"Hey, that #mask competition# sounds interesting! I've heard rumours of some pretty #rare masks# around here, truly one of a kind stuff!", // French "Dis, ce #concours de masques# me rappelle que j'ai entendu des rumeurs dans le coin sur des #masques très uniques#.", }, {QM_RED, QM_RED}, {}, {}, 0x083E, false, false); - CustomMessages::CreateMessageFromTextObject(0x8003, 0x8004, 0x3FFFFFFF, 0x15D0000, odolwaHint, {QM_GREEN, QM_GREEN, QM_RED}, {}, {}, 0x0, false, false); - CustomMessages::CreateMessageFromTextObject(0x8004, 0x8005, 0x3FFFFFFF, 0x15E0000, gohtHint, {QM_MAGENTA, QM_MAGENTA, QM_RED}, {}, {}, 0x0, false, false); - CustomMessages::CreateMessageFromTextObject(0x8005, 0x8006, 0x3FFFFFFF, 0x15F0000, gyorgHint, {QM_CYAN, QM_CYAN, QM_RED}, {}, {}, 0x0, false, false); - CustomMessages::CreateMessageFromTextObject(0x8006, 0x8007, 0x3FFFFFFF, 0x1600000, twinmoldHint, {QM_YELLOW, QM_YELLOW, QM_RED}, {}, {}, 0x0, false, false); - CustomMessages::CreateMessageFromTextObject(0x8007, 0xFFFF, 0x3FFFFFFF, 0x0FF0000, remainsNeededHint, {QM_RED}, {}, {}, 0x0, false, false); + CustomMessages::CreateMessageFromTextObject(0x8004, 0x8005, 0x3FFFFFFF, 0x15D0000, odolwaHint, {QM_GREEN, QM_GREEN, QM_RED}, {}, {}, 0x0, false, false); + CustomMessages::CreateMessageFromTextObject(0x8005, 0x8006, 0x3FFFFFFF, 0x15E0000, gohtHint, {QM_MAGENTA, QM_MAGENTA, QM_RED}, {}, {}, 0x0, false, false); + CustomMessages::CreateMessageFromTextObject(0x8006, 0x8007, 0x3FFFFFFF, 0x15F0000, gyorgHint, {QM_CYAN, QM_CYAN, QM_RED}, {}, {}, 0x0, false, false); + CustomMessages::CreateMessageFromTextObject(0x8007, 0x8008, 0x3FFFFFFF, 0x1600000, twinmoldHint, {QM_YELLOW, QM_YELLOW, QM_RED}, {}, {}, 0x0, false, false); + CustomMessages::CreateMessageFromTextObject(0x8008, 0xFFFF, 0x3FFFFFFF, 0x0FF0000, remainsNeededHint, {QM_RED}, {}, {}, 0x0, false, false); } void CreateMoonChildHint() { From 59278f6942a8eee8e95cfcc438acd6ad15c2fa9d Mon Sep 17 00:00:00 2001 From: pizza1398 <259104093+pizza1398@users.noreply.github.com> Date: Thu, 23 Jul 2026 22:47:42 +0200 Subject: [PATCH 06/12] Fix Clock Door SoT Hint logic (#181) - Fix crash when determining first Clock Door hint - Put Remains hints after Ocarina's if SoT isn't shuffled - Only play Tatl sound on SoT hint if it was first --- source/hints.cpp | 28 ++++++++-------------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/source/hints.cpp b/source/hints.cpp index 4aab982..8d8234e 100644 --- a/source/hints.cpp +++ b/source/hints.cpp @@ -846,24 +846,12 @@ void CreateClockTowerDoorHints() { break; } - CustomMessages::CreateMessage(0x0630, (StartingOcarina.Value() == 0) ? 0x8000 : 0x8003, 0x3FFFFFFF, 0x0FF0211, - {"Rooftop access strictly prohibited!&(Enforceable until #midnight# on the&#eve# of the carnival.)^" - "#Notice of carnival activities:#&Musical Performance Contest&Unique Mask Contest&#Prizes available!#", - // French - "Accès aux toits strictement&interdit jusqu'à #minuit#, la&#veille #du carnaval.^" - "#Notice d'activités du carnaval:#&Concours de performance musicale&Concours de masques singuliers&#Prix à la clé!#", - // Spanish - "Acceso al tejado.&¡Prohibida la entrada hasta&la #medianoche de la víspera&#del carnaval!^" - "**SPANISH**", - // // German - // "Zugang zum Dach&Betreten streng verboten!&(bis um #Mitternacht# am&Vorabend des #Karnevals#)^" - // "**GERMAN**", - // // Italian - // "Porta del tetto&Ingresso vietato fino alla&#mezzanotte# della #vigilia# del&carnevale.^" - // "**ITALIAN**", - }, - {QM_RED, QM_RED, QM_RED, QM_MAGENTA}, {}, {}, 0x0, false, false); - CustomMessages::CreateMessage(0x0630, (ShuffleSongOfTime.Value() == 1) ? 0x8000 : 0x8003, 0x3FFFFFFF, 0x0FF0211, + // Determine which hint to display first + u16 clockDoorFirstHint = 0x8003; + if (StartingOcarina.Value() == 0) clockDoorFirstHint = 0x8000; + else if (ShuffleSongOfTime) clockDoorFirstHint = 0x8001; + + CustomMessages::CreateMessage(0x0630, clockDoorFirstHint, 0x3FFFFFFF, 0x0FF0211, {"Rooftop access strictly prohibited!&(Enforceable until #midnight# on the&#eve# of the carnival.)^" "#Notice of carnival activities:#&Musical Performance Contest&Unique Mask Contest&#Prizes available!#", // French @@ -880,8 +868,8 @@ void CreateClockTowerDoorHints() { // "**ITALIAN**", }, {QM_RED, QM_RED, QM_RED, QM_MAGENTA}, {}, {}, 0x0, false, false); - CustomMessages::CreateMessageFromTextObject(0x8000, 0x8001, 0x3FFFFFFF, 0x1000000, ocarinaHint, {QM_BLUE, QM_RED}, {}, {}, 0x083E, false, false); - CustomMessages::CreateMessageFromTextObject(0x8001, 0x8002, 0x3FFFFFFF, 0x1000000, songTimeHint, {QM_BLUE, QM_RED}, {}, {}, 0x083E, false, false); + CustomMessages::CreateMessageFromTextObject(0x8000, ShuffleSongOfTime ? 0x8001 : 0x8002, 0x3FFFFFFF, 0x1000000, ocarinaHint, {QM_BLUE, QM_RED}, {}, {}, 0x083E, false, false); + CustomMessages::CreateMessageFromTextObject(0x8001, 0x8002, 0x3FFFFFFF, 0x1000000, songTimeHint, {QM_BLUE, QM_RED}, {}, {}, (clockDoorFirstHint == 0x8001) ? 0x083E : 0x0, false, false); CustomMessages::CreateMessage(0x8002, 0x8004, 0x3FFFFFFF, 0x1FF0000, {"Also, that #mask competition# sounds interesting! I've heard rumours of some pretty #rare masks# around here, truly one of a kind stuff!", // French From fc20ee561fc8177c018d15468302075298b798d2 Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Fri, 24 Jul 2026 17:14:09 -0500 Subject: [PATCH 07/12] Update Z3DR --- Z3DR | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Z3DR b/Z3DR index 56dd88d..6c90e9d 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit 56dd88d97355cf468fe2b0ae30fb26babda291de +Subproject commit 6c90e9d034a829bfc397381577c1532b1b716365 From 5d7de2764016fe0aec8caf0cea890a2e82341866 Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sat, 25 Jul 2026 13:48:56 -0500 Subject: [PATCH 08/12] Clock Town Fairy Fix - Adjusts flag value so Clock Town Stray Fairy properly overrides - Adds new override for the Clock Town Stray Fairy when it's in East Clock Town --- source/include/keys.hpp | 1 + source/item_location.cpp | 7 +++++-- source/item_pool.cpp | 1 + source/spoiler_log.cpp | 7 ------- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/source/include/keys.hpp b/source/include/keys.hpp index c815635..290f03f 100644 --- a/source/include/keys.hpp +++ b/source/include/keys.hpp @@ -330,6 +330,7 @@ typedef enum { LAUNDRY_POOL_CURIOSITY_SHOP_MAN_TWO, LAUNDRY_POOL_GURU_GURU, LAUNDRY_POOL_SF, + E_CLOCK_TOWN_SF, LAUNDRY_POOL_POSTBOX, //Milk Road MILK_ROAD_GORMAN_RACE, diff --git a/source/item_location.cpp b/source/item_location.cpp index b8f1cab..52ccc5a 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -435,8 +435,8 @@ void LocationTable_Init() { -------------------------------*/ //Clock Town Stray Fairy - locationTable[LAUNDRY_POOL_SF] = ItemLocation::StrayFairy (0x70, 0x7F, true, "Laundry Pool SF", CT_STRAY_FAIRY, CT_STRAY_FAIRY, {Category::cLaundryPool, Category::cVanillaStrayFairy, Category::cCTStray,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_LAUNDRY_POOL); - + locationTable[LAUNDRY_POOL_SF] = ItemLocation::StrayFairy (0x70, 0xFF, true, "Laundry Pool SF", CT_STRAY_FAIRY, CT_STRAY_FAIRY, {Category::cLaundryPool, Category::cVanillaStrayFairy, Category::cCTStray,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_LAUNDRY_POOL); + locationTable[E_CLOCK_TOWN_SF] = ItemLocation::StrayFairy (0x6C, 0xFF, true, "East Clock Town SF", CT_STRAY_FAIRY, CT_STRAY_FAIRY, {Category::cEastClockTown, Category::cVanillaStrayFairy, Category::cCTStray,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN); //Woodfall Stray Faries locationTable[WF_SF_ENTRANCE_FAIRY] = ItemLocation::StrayFairy (0x1B, 0x2B, true, "Woodfall Temple SF Entrance", WF_SF_ENTRANCE_FAIRY, WF_STRAY_FAIRY, {Category::cWoodfall, Category::cWoodfallTemple, Category::cWFStray, Category::cVanillaStrayFairy,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); @@ -824,6 +824,7 @@ std::vector overworldLocations = { //E_CLOCK_TOWN_TREASURE_CHEST_GAME_HUMAN, //E_CLOCK_TOWN_TREASURE_CHEST_GAME_ZORA, //E_CLOCK_TOWN_TREASURE_CHEST_GAME_DEKU, + E_CLOCK_TOWN_SF, //Goron Village GORON_VILLAGE_POWDER_KEG_CHALLENGE, GORON_VILLAGE_SCRUB_PURCHASE, @@ -1241,6 +1242,8 @@ void CreateItemOverrides() { //Curiosity Shop Big Bomb Bag is same as Bomb Shop Big Bomb Bag auto loc24 = Location(W_CLOCK_TOWN_BIG_BOMB_BAG_BUY); PlaceItemInLocation(W_CLOCK_TOWN_CURIOSITY_BOMB_BAG, loc24->GetPlacedItemKey()); + auto loc25 = Location(LAUNDRY_POOL_SF); + PlaceItemInLocation(E_CLOCK_TOWN_SF, loc25->GetPlacedItemKey()); for (LocationKey locKey : allLocations) { auto loc = Location(locKey); diff --git a/source/item_pool.cpp b/source/item_pool.cpp index 5aaa1fc..63f586b 100644 --- a/source/item_pool.cpp +++ b/source/item_pool.cpp @@ -920,6 +920,7 @@ void GenerateItemPool() { PlaceItemInLocation(SOUTHERN_SWAMP_SCRUB_TRADE_CLEAR, BLUE_RUPEE); PlaceItemInLocation(SWAMP_TOURIST_CENTER_ROOF_CLEAR, BLUE_RUPEE); PlaceItemInLocation(STONE_TOWER_TEMPLE_UPRIGHT_DEATH_ARMOS_ROOM_CHEST, BLUE_RUPEE); + PlaceItemInLocation(E_CLOCK_TOWN_SF, BLUE_RUPEE); //Check Non Dungeon Settings //OCARINA SHUFFLE diff --git a/source/spoiler_log.cpp b/source/spoiler_log.cpp index 0a89e1a..acea6e1 100644 --- a/source/spoiler_log.cpp +++ b/source/spoiler_log.cpp @@ -259,13 +259,6 @@ static void WriteIngameSpoilerLog() { if (!Settings::ShuffleTingleMaps && Location(key)->IsCategory(Category::cTingleMap)) { continue; } - // If Starting with Song of Healing hide Deku Mask and Bombers Notebook as they're unobtainable and junk - if (key == HMS_DEKU_MASK && (Settings::StartingSongOfHealing.Value() == u8(1) || !Settings::ShuffleTransformation)) { - continue; - } - if (key == HMS_BOMBERS_NOTEBOOK && (Settings::StartingSongOfHealing.Value() == u8(1) || !Settings::ShuffleBombersNotebook)) { - continue; - } // Always hide unreachable checks if (key == CLOCK_TOWER_OCARINA_OF_TIME && (Settings::StartingOcarina.Value() == u8(1))) { continue; From 55e5a79a2d86a8b3e6a84fba450ee462093880e5 Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sat, 25 Jul 2026 16:47:24 -0500 Subject: [PATCH 09/12] Update item_location.cpp -Adjust scene for several Stone Tower Stray Fairies so they override properly --- source/item_location.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/source/item_location.cpp b/source/item_location.cpp index 52ccc5a..cc31c23 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -496,15 +496,15 @@ void LocationTable_Init() { locationTable[ST_SF_EYEGORE] = ItemLocation::StrayFairy (0x16, 0x0C, true, "Stone Tower Temple SF Eyegore", ST_SF_EYEGORE, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); locationTable[ST_SF_UPDRAFT_FIRE_RING] = ItemLocation::StrayFairy (0x18, 0x0E, true, "Stone Tower Temple SF Updraft Fire Ring", ST_SF_UPDRAFT_FIRE_RING, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); locationTable[ST_SF_MIRROR_SUN_SWITCH] = ItemLocation::StrayFairy (0x16, 0x0F, true, "Stone Tower Temple SF Mirror Sun Switch", ST_SF_MIRROR_SUN_SWITCH, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); - locationTable[ST_SF_BOSS_WARP] = ItemLocation::StrayFairy (0x18, 0x10, true, "Stone Tower Temple SF Boss Warp", ST_SF_BOSS_WARP, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); + locationTable[ST_SF_BOSS_WARP] = ItemLocation::StrayFairy (0x36, 0x10, true, "Stone Tower Temple SF Boss Warp", ST_SF_BOSS_WARP, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); locationTable[ST_SF_WIZZROBE] = ItemLocation::StrayFairy (0x18, 0x11, true, "Stone Tower Temple SF Wizzrobe", ST_SF_WIZZROBE, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); - locationTable[ST_SF_DEATH_ARMOS] = ItemLocation::StrayFairy (0x18, 0x12, true, "Stone Tower Temple SF Death Armos", ST_SF_DEATH_ARMOS, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); - locationTable[ST_SF_UPDRAFT_FROZEN_EYE] = ItemLocation::StrayFairy (0x18, 0x13, true, "Stone Tower Temple SF Updraft Frozen Eye", ST_SF_UPDRAFT_FROZEN_EYE, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); - locationTable[ST_SF_THIN_BRIDGE] = ItemLocation::StrayFairy (0x18, 0x14, true, "Stone Tower Temple SF Thin Bridge", ST_SF_THIN_BRIDGE, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); + locationTable[ST_SF_DEATH_ARMOS] = ItemLocation::StrayFairy (0x16, 0x12, true, "Stone Tower Temple SF Death Armos", ST_SF_DEATH_ARMOS, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); + locationTable[ST_SF_UPDRAFT_FROZEN_EYE] = ItemLocation::StrayFairy (0x16, 0x13, true, "Stone Tower Temple SF Updraft Frozen Eye", ST_SF_UPDRAFT_FROZEN_EYE, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); + locationTable[ST_SF_THIN_BRIDGE] = ItemLocation::StrayFairy (0x16, 0x14, true, "Stone Tower Temple SF Thin Bridge", ST_SF_THIN_BRIDGE, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); locationTable[ST_SF_BASEMENT_LEDGE] = ItemLocation::StrayFairy (0x16, 0x15, true, "Stone Tower Temple SF Basement Ledge", ST_SF_BASEMENT_LEDGE, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); locationTable[ST_SF_STATUE_EYE] = ItemLocation::StrayFairy (0x16, 0x16, true, "Stone Tower Temple SF Statue Eye", ST_SF_STATUE_EYE, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); - locationTable[ST_SF_UNDERWATER] = ItemLocation::StrayFairy (0x18, 0x17, true, "Stone Tower Temple SF Underwater", ST_SF_UNDERWATER, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); - locationTable[ST_SF_BRIDGE_CRYSTAL] = ItemLocation::StrayFairy (0x18, 0x18, true, "Stone Tower Temple SF Bridge Crystal", ST_SF_BRIDGE_CRYSTAL, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); + locationTable[ST_SF_UNDERWATER] = ItemLocation::StrayFairy (0x16, 0x17, true, "Stone Tower Temple SF Underwater", ST_SF_UNDERWATER, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); + locationTable[ST_SF_BRIDGE_CRYSTAL] = ItemLocation::StrayFairy (0x16, 0x18, true, "Stone Tower Temple SF Bridge Crystal", ST_SF_BRIDGE_CRYSTAL, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); /*------------------------------- ---HEART CONTAINERS --- From 86f4668cfc4114f1791ffe43e9f4350df103f419 Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sat, 25 Jul 2026 17:47:57 -0500 Subject: [PATCH 10/12] Update item_location.cpp --- source/item_location.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/item_location.cpp b/source/item_location.cpp index cc31c23..552ae60 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -496,10 +496,10 @@ void LocationTable_Init() { locationTable[ST_SF_EYEGORE] = ItemLocation::StrayFairy (0x16, 0x0C, true, "Stone Tower Temple SF Eyegore", ST_SF_EYEGORE, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); locationTable[ST_SF_UPDRAFT_FIRE_RING] = ItemLocation::StrayFairy (0x18, 0x0E, true, "Stone Tower Temple SF Updraft Fire Ring", ST_SF_UPDRAFT_FIRE_RING, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); locationTable[ST_SF_MIRROR_SUN_SWITCH] = ItemLocation::StrayFairy (0x16, 0x0F, true, "Stone Tower Temple SF Mirror Sun Switch", ST_SF_MIRROR_SUN_SWITCH, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); - locationTable[ST_SF_BOSS_WARP] = ItemLocation::StrayFairy (0x36, 0x10, true, "Stone Tower Temple SF Boss Warp", ST_SF_BOSS_WARP, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); + locationTable[ST_SF_BOSS_WARP] = ItemLocation::StrayFairy (0x18, 0x10, true, "Stone Tower Temple SF Boss Warp", ST_SF_BOSS_WARP, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); locationTable[ST_SF_WIZZROBE] = ItemLocation::StrayFairy (0x18, 0x11, true, "Stone Tower Temple SF Wizzrobe", ST_SF_WIZZROBE, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); locationTable[ST_SF_DEATH_ARMOS] = ItemLocation::StrayFairy (0x16, 0x12, true, "Stone Tower Temple SF Death Armos", ST_SF_DEATH_ARMOS, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); - locationTable[ST_SF_UPDRAFT_FROZEN_EYE] = ItemLocation::StrayFairy (0x16, 0x13, true, "Stone Tower Temple SF Updraft Frozen Eye", ST_SF_UPDRAFT_FROZEN_EYE, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); + locationTable[ST_SF_UPDRAFT_FROZEN_EYE] = ItemLocation::StrayFairy (0x18, 0x13, true, "Stone Tower Temple SF Updraft Frozen Eye", ST_SF_UPDRAFT_FROZEN_EYE, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); locationTable[ST_SF_THIN_BRIDGE] = ItemLocation::StrayFairy (0x16, 0x14, true, "Stone Tower Temple SF Thin Bridge", ST_SF_THIN_BRIDGE, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); locationTable[ST_SF_BASEMENT_LEDGE] = ItemLocation::StrayFairy (0x16, 0x15, true, "Stone Tower Temple SF Basement Ledge", ST_SF_BASEMENT_LEDGE, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); locationTable[ST_SF_STATUE_EYE] = ItemLocation::StrayFairy (0x16, 0x16, true, "Stone Tower Temple SF Statue Eye", ST_SF_STATUE_EYE, ST_STRAY_FAIRY, {Category::cStoneTowerTemple, Category::cVanillaStrayFairy,Category::cSTStray,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); From 348e97f90a94dba0dac20e26b685f031444a8b72 Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sat, 25 Jul 2026 19:19:36 -0500 Subject: [PATCH 11/12] Update Z3DR --- Z3DR | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Z3DR b/Z3DR index 6c90e9d..05a5637 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit 6c90e9d034a829bfc397381577c1532b1b716365 +Subproject commit 05a56374d7b815a1729e1ae37539c27a2d8ef534 From b037413c9e3555ca5d751d4630048668bf6c0cef Mon Sep 17 00:00:00 2001 From: Phlex <3514085+PhlexPlexico@users.noreply.github.com> Date: Sun, 26 Jul 2026 11:20:31 -0600 Subject: [PATCH 12/12] fix: Point submodule back to dev. --- .gitmodules | 2 +- Z3DR | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitmodules b/.gitmodules index ccc04ce..12a5f3b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "Z3DR"] path = Z3DR url = https://github.com/Z3DR/mm3dr.git - branch = fairysanity + branch = dev diff --git a/Z3DR b/Z3DR index 05a5637..4f10d4c 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit 05a56374d7b815a1729e1ae37539c27a2d8ef534 +Subproject commit 4f10d4cb418a3c3339d984ffd39fb4b99f86e481