From 758c3bdb8eea097cc877f7a5f2760d9eaa5bc9fe Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Fri, 16 Jan 2026 21:58:08 -0600 Subject: [PATCH 1/9] Songsanity Initial songsanity implemtation of the following. - Adjusts fill algorithm to include songs - Adds missing hints for Song of Time and Clock Tower Song of Time - Adds settings for Songsanity and sub settings for shuffling Song of Soaring and Song of Time separately from the rest of the songs - Uncomments and fixes Song of Time item in item table, also adjusts GIDs of songs in item table - Adds missing Clock Tower Song of Time location as well as adjusts several locations to exclude them from the pool of locations available when placing the Ocarina of Time and Song of Time if they are shuffled. - Adjusts ItemPool to accomidate songsanity and options - Adjusts requirement for Clock Tower Ocarina of Time from always accessable to requiring a projectile. Also adds new Song of Time location with same requirement - Adjusts Settings Descriptions for Songsanity - Adjusts Settings for Songsanity as well as adding Starting Inventory options for Song of Time and Goron Lullaby Intro. --- source/fill.cpp | 30 ++++++++++++- source/hint_list.cpp | 10 ++++- source/include/keys.hpp | 1 + source/include/logic.hpp | 1 + source/include/setting_descriptions.hpp | 3 ++ source/include/settings.hpp | 3 ++ source/item_list.cpp | 22 +++++----- source/item_location.cpp | 26 ++++++----- source/item_pool.cpp | 51 ++++++++++++---------- source/location_access.cpp | 3 +- source/logic.cpp | 1 + source/setting_descriptions.cpp | 16 +++---- source/settings.cpp | 58 ++++++++++++++++++++----- source/spoiler_log.cpp | 8 +++- 14 files changed, 161 insertions(+), 72 deletions(-) diff --git a/source/fill.cpp b/source/fill.cpp index 0dbba12..64bcbe1 100644 --- a/source/fill.cpp +++ b/source/fill.cpp @@ -873,6 +873,34 @@ int Fill() { //Then place dungeon items that are assigned to restrictive location pools RandomizeDungeonItems(); + CitraPrint("Trying to place songs"); + + //Place Songs before inventory to prevent song locations from being used + //get Songs in pool + std::vector songs = FilterAndEraseFromPool(ItemPool, [](const ItemKey i) {return ItemTable(i).GetItemType() == ITEMTYPE_SONG;}); + //If Shuffled in Song Locations restrict location pool to only song locations + //If Song of Time is shuffled do that first with a restricted location pool to prevent softlocks + if (ShuffleSongOfTime) { + std::vector ocarinaLocations = FilterFromPool(allLocations, []( const LocationKey loc) {return Location(loc)->IsCategory(Category::cNoOcarinaStart);}); + std::vector SoTItem = FilterAndEraseFromPool(ItemPool, [](const ItemKey i) { return ItemTable(i).GetHintKey() == SONG_OF_TIME; }); + NoRepeatOnTokens = true; + AssumedFill(SoTItem, ocarinaLocations, true); + NoRepeatOnTokens = false; + } + //If Songs are at song locations get all song locations and place them there + if (ShuffleSongs.Value() == u8(1)){ + std::vector songLocations = FilterFromPool(allLocations, [](const LocationKey loc) {return Location(loc)->IsCategory(Category::cSong);}); + NoRepeatOnTokens = true; + AssumedFill(songs, songLocations,true); + NoRepeatOnTokens = false; + } + //else just place them anywhere + else { + NoRepeatOnTokens = true; + AssumedFill(songs, allLocations,true); + NoRepeatOnTokens = false; + } + //If Ocarina is shuffled place that first if (StartingOcarina.Value() == 0) { //Get acceptable Ocarina Locations @@ -922,7 +950,7 @@ int Fill() { //std::vector remainingRepeatItems = FilterAndEraseFromPool(ItemPool, [](const ItemKey i) {return ItemTable(i).IsReusable();}); //CitraPrint("Starting Fill of remaining Repeat Items"); //AssumedFill(remainingRepeatItems, allLocations,true); - } + } //Place Main Inventory First //So first get all items in the pool + DekuMask, diff --git a/source/hint_list.cpp b/source/hint_list.cpp index bd179e7..5f08e89 100644 --- a/source/hint_list.cpp +++ b/source/hint_list.cpp @@ -674,7 +674,13 @@ void HintTable_Init() { hintTable[MAGIC_POWER] = HintText::Item({Text{"magic power", "**FRENCH**", "**SPANISH**"}}); hintTable[EXTENDED_MAGIC_POWER] = HintText::Item({Text{"magic power", "**FRENCH**", "**SPANISH**"}}); //SONGS - //hintTable[SONG_OF_TIME] = HintText::Item({Text{"song of time", "**FRENCH**", "**SPANISH**"}}); + hintTable[SONG_OF_TIME] = HintText::Item({ + //obscure + Text{"song of time", "**FRENCH**", "**SPANISH**"} + }, + //clear + Text{"the Song of Time", "**FRENCH**", "**SPANISH**"} + ); hintTable[SONG_OF_STORMS] = HintText::Item({ //obscure Text{"stormy weather", "**FRENCH**", "**SPANISH**"} @@ -1148,6 +1154,8 @@ void HintTable_Init() { // Clock Tower hintTable[CLOCK_TOWER_OCARINA_OF_TIME] = HintText::Sometimes({ Text{"A Musical Instrument", "**FRENCH**", "**SPANISH**"}}); + hintTable[CLOCK_TOWER_SONG_OF_TIME] = HintText::Sometimes({ + Text{"A Timeless Song", "**FRENCH**", "**SPANISH**"}}); hintTable[HMS_DEKU_MASK] = HintText::Sometimes({ Text{"a forest curse removed rewards", "**FRENCH**", "**SPANISH**"}}); hintTable[HMS_SONG_OF_HEALING] = HintText::Sometimes({ diff --git a/source/include/keys.hpp b/source/include/keys.hpp index 94bdc90..b6bab7b 100644 --- a/source/include/keys.hpp +++ b/source/include/keys.hpp @@ -246,6 +246,7 @@ typedef enum { //// Overworld // Clock Tower CLOCK_TOWER_OCARINA_OF_TIME, + CLOCK_TOWER_SONG_OF_TIME, HMS_DEKU_MASK, HMS_BOMBERS_NOTEBOOK, HMS_STARTING_SWORD, diff --git a/source/include/logic.hpp b/source/include/logic.hpp index 4d1d9b9..33ff078 100644 --- a/source/include/logic.hpp +++ b/source/include/logic.hpp @@ -111,6 +111,7 @@ namespace Logic { extern bool LetterMamaAccess; extern bool MoonsTearAccess; //Songs + extern bool SongOfTime; extern bool ScarecrowSong; extern bool SongOfStorms; extern bool SongOfHealing; diff --git a/source/include/setting_descriptions.hpp b/source/include/setting_descriptions.hpp index fa2ec30..0c4df3d 100644 --- a/source/include/setting_descriptions.hpp +++ b/source/include/setting_descriptions.hpp @@ -60,8 +60,11 @@ extern string_view kokiriSwordDesc; extern string_view songsSongLocations; extern string_view songsDungeonRewards; extern string_view songsAllLocations; +extern string_view songsVanilla; extern string_view shuffleSoaringVanilla; extern string_view shuffleSoaringRandom; +extern string_view songTimeVanilla; +extern string_view songTimeRandom; extern string_view gossipStonesHintsDesc; diff --git a/source/include/settings.hpp b/source/include/settings.hpp index 65d5acc..bd8e477 100644 --- a/source/include/settings.hpp +++ b/source/include/settings.hpp @@ -327,6 +327,8 @@ namespace Settings { extern Option StartingElegyOfEmptiness; extern Option StartingSongOfHealing; extern Option StartingSongOfSoaring; + extern Option StartingSongOfTime; + extern Option StartingGoronIntro; extern Option StartingUpgradesToggle; extern Option StartingKokiriSword; extern Option StartingGreatFairySword; @@ -398,6 +400,7 @@ namespace Settings { extern Option ShuffleMerchants; extern Option ShuffleSongs; extern Option ShuffleSoaring; + extern Option ShuffleSongOfTime; extern Option ShuffleStartingShield; extern Option ShuffleBombersNotebook; extern Option ShuffleTradeItems; diff --git a/source/item_list.cpp b/source/item_list.cpp index c553c44..80fa294 100644 --- a/source/item_list.cpp +++ b/source/item_list.cpp @@ -128,19 +128,19 @@ void ItemTable_Init() { //repeatable denotes that an item in a vanilla playth itemTable[EXTENDED_MAGIC_POWER] = Item(true, false, &ExtendedMagicPower, Text{"Extended Magic Power", "Extended Magic Power", "Extended Magic Power",}, EXTENDED_MAGIC_POWER, (u32)GetItemID::GI_NONE, ITEMTYPE_ITEM); //Songs - //itemTable[SONG_OF_TIME] = Item(Text{"Song of Time", "Chant du temps", "Canción del tiempo"}, ITEMTYPE_SONG, 0xC5, true, &SongOfTime, SONG_OF_TIME, false,); - itemTable[SONG_OF_STORMS] = Item(true, false, &SongOfStorms, Text{"Song of Storms", "Chant des tempêtes", "Canción de la tormenta"}, SONG_OF_STORMS, (u32)GetItemID::GI_NONE, ITEMTYPE_SONG); - itemTable[SONATA_OF_AWAKENING] = Item(true, false, &SonataOfAwakening, Text{"Sonata of Awakening", "Sonate de i'Eveil", "Sonata del Despertar"}, SONATA_OF_AWAKENING, (u32)GetItemID::GI_NONE, ITEMTYPE_SONG ); - itemTable[LULLABY_INTRO] = Item(true, false, &LullabyIntro, Text{"Goron's Lullaby Intro", "Goron's Lullaby Intro", "Goron's Lullaby Intro"}, LULLABY_INTRO, (u32)GetItemID::GI_NONE, ITEMTYPE_SONG ); - itemTable[GORONS_LULLABY] = Item(true, false, &GoronsLullaby, Text{"Goron's Lullaby", "Berceuse des Gorons", "Nana Goron"}, GORONS_LULLABY, (u32)GetItemID::GI_NONE, ITEMTYPE_SONG); - itemTable[NEW_WAVE_BOSSA_NOVA] = Item(true, false, &NewWaveBossaNova, Text{"New Wave Bossa Nova", "Bossa Nova des Flots", "Nueva Bossanova"}, NEW_WAVE_BOSSA_NOVA, (u32)GetItemID::GI_NONE, ITEMTYPE_SONG ); - itemTable[ELEGY_OF_EMPTINESS] = Item(true, false, &ElegyOfEmptiness, Text{"Elegy of Emptiness", "Hymne du Vida", "Elegia al Vacio"}, ELEGY_OF_EMPTINESS, (u32)GetItemID::GI_NONE, ITEMTYPE_SONG ); - itemTable[OATH_TO_ORDER] = Item(true, false, &OathToOrder, Text{"Oath to Order", "Ode lAppel", "Oda al Order"}, OATH_TO_ORDER, (u32)GetItemID::GI_NONE, ITEMTYPE_SONG ); - itemTable[EPONAS_SONG] = Item(true, false, &EponasSong, Text{"Epona's Song", "Chant d'Épona", "Canción de Epona"}, EPONAS_SONG, (u32)GetItemID::GI_NONE, ITEMTYPE_SONG ); + itemTable[SONG_OF_TIME] = Item(true, false, &SongOfTime, Text{"Song of Time", "Chant du temps", "Canción del tiempo"}, SONG_OF_TIME, (u32)0x53, ITEMTYPE_SONG); + itemTable[SONG_OF_STORMS] = Item(true, false, &SongOfStorms, Text{"Song of Storms", "Chant des tempêtes", "Canción de la tormenta"}, SONG_OF_STORMS, (u32)0x73, ITEMTYPE_SONG); + itemTable[SONATA_OF_AWAKENING] = Item(true, false, &SonataOfAwakening, Text{"Sonata of Awakening", "Sonate de i'Eveil", "Sonata del Despertar"}, SONATA_OF_AWAKENING, (u32)0x4B, ITEMTYPE_SONG ); + itemTable[LULLABY_INTRO] = Item(true, false, &LullabyIntro, Text{"Goron's Lullaby Intro", "Goron's Lullaby Intro", "Goron's Lullaby Intro"}, LULLABY_INTRO, (u32)0x74, ITEMTYPE_SONG ); + itemTable[GORONS_LULLABY] = Item(true, false, &GoronsLullaby, Text{"Goron's Lullaby", "Berceuse des Gorons", "Nana Goron"}, GORONS_LULLABY, (u32)0x4D, ITEMTYPE_SONG); + itemTable[NEW_WAVE_BOSSA_NOVA] = Item(true, false, &NewWaveBossaNova, Text{"New Wave Bossa Nova", "Bossa Nova des Flots", "Nueva Bossanova"}, NEW_WAVE_BOSSA_NOVA, (u32)0x4E, ITEMTYPE_SONG ); + itemTable[ELEGY_OF_EMPTINESS] = Item(true, false, &ElegyOfEmptiness, Text{"Elegy of Emptiness", "Hymne du Vida", "Elegia al Vacio"}, ELEGY_OF_EMPTINESS, (u32)0x4F, ITEMTYPE_SONG ); + itemTable[OATH_TO_ORDER] = Item(true, false, &OathToOrder, Text{"Oath to Order", "Ode lAppel", "Oda al Order"}, OATH_TO_ORDER, (u32)0x51, ITEMTYPE_SONG ); + itemTable[EPONAS_SONG] = Item(true, false, &EponasSong, Text{"Epona's Song", "Chant d'Épona", "Canción de Epona"}, EPONAS_SONG, (u32)0x6C, ITEMTYPE_SONG ); //itemTable[INVERTED_SONG_OF_TIME] = Item(true,0, 0, Text{"Inverted Song of Time", "Chant du Temps Inverse", "Canción del Tiempo Invertida"}, ITEMTYPE_SONG, 0xC2, true, &InvertedSongOfTime, INVERTED_SONG_OF_TIME, false,); //itemTable[SONG_OF_DOUBLE_TIME] = Item(true,0, 0, Text{"Song of Double Time", "Chant du Temps Accelere", "Canción del Doble Tiempo"}, ITEMTYPE_SONG, 0xC3, true, &SongOfDoubleTime, SONG_OF_DOUBLE_TIME, false,); - itemTable[SONG_OF_HEALING] = Item(true, false, &SongOfHealing, Text{"Song of Healing", "Chant de l'Apaisement", "Sonata de Curacion"}, SONG_OF_HEALING, (u32)GetItemID::GI_NONE, ITEMTYPE_SONG ); - itemTable[SONG_OF_SOARING] = Item(true, false, &SongOfSoaring, Text{"Song of Soaring", "Chant de l'Envol", "Canción de Vuelo"}, SONG_OF_SOARING, (u32)GetItemID::GI_NONE, ITEMTYPE_SONG ); + itemTable[SONG_OF_HEALING] = Item(true, false, &SongOfHealing, Text{"Song of Healing", "Chant de l'Apaisement", "Sonata de Curacion"}, SONG_OF_HEALING, (u32)0x54, ITEMTYPE_SONG ); + itemTable[SONG_OF_SOARING] = Item(true, false, &SongOfSoaring, Text{"Song of Soaring", "Chant de l'Envol", "Canción de Vuelo"}, SONG_OF_SOARING, (u32)0x72, ITEMTYPE_SONG ); //Maps and Compasses itemTable[WOODFALL_TEMPLE_MAP] = Item(false, false, &noVariable, Text{"Woodfall Temple Map", "Carte de Temple de Bois-Cascade", "Mapa del Templo del Bosque Catarata"}, WOODFALL_TEMPLE_MAP, (u32)0xAE, ITEMTYPE_MAP ); diff --git a/source/item_location.cpp b/source/item_location.cpp index f826673..66f208f 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -1,4 +1,4 @@ - #include "item_location.hpp" +#include "item_location.hpp" #include "dungeon.hpp" #include "settings.hpp" @@ -17,8 +17,9 @@ void LocationTable_Init() { //LocationTable itemlocation::type scene, flag, Repeatable, name hint key (hint_list.cpp) vanilla item categories collection check 376 Collection Check Group //Happy Mask Salesman - Starting Items - locationTable[HMS_SONG_OF_HEALING] = ItemLocation::Base (0x63, 0x54, false, "Song of Healing", HMS_SONG_OF_HEALING, SONG_OF_HEALING, {Category::cClockTower, Category::cDayOne, Category::cSong, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(6), SpoilerCollectionCheckGroup::GROUP_INSIDE_CLOCKTOWER); - locationTable[CLOCK_TOWER_OCARINA_OF_TIME] = ItemLocation::Base (0x19, 0x4C, false, "Ocarina of Time", CLOCK_TOWER_OCARINA_OF_TIME, OCARINA_OF_TIME, {Category::cClockTower, Category::cDayThree, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(6), SpoilerCollectionCheckGroup::GROUP_INSIDE_CLOCKTOWER ); + locationTable[HMS_SONG_OF_HEALING] = ItemLocation::Base (0x63, 0x54, false, "Song of Healing", HMS_SONG_OF_HEALING, SONG_OF_HEALING, {Category::cClockTower, Category::cDayOne, Category::cSong, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(6), SpoilerCollectionCheckGroup::GROUP_INSIDE_CLOCKTOWER ); + locationTable[CLOCK_TOWER_OCARINA_OF_TIME] = ItemLocation::Base (0x19, 0x4C, false, "Ocarina of Time", CLOCK_TOWER_OCARINA_OF_TIME, OCARINA_OF_TIME, {Category::cClockTower, Category::cDayThree, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(6), SpoilerCollectionCheckGroup::GROUP_INSIDE_CLOCKTOWER ); + locationTable[CLOCK_TOWER_SONG_OF_TIME] = ItemLocation::Base (0x19, 0x53, false, "Song of Time", CLOCK_TOWER_SONG_OF_TIME, SONG_OF_TIME, {Category::cClockTower, Category::cDayThree, Category::cSong, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(6), SpoilerCollectionCheckGroup::GROUP_INSIDE_CLOCKTOWER ); locationTable[HMS_DEKU_MASK] = ItemLocation::Base (0x63, 0x78, false, "Deku Mask", HMS_DEKU_MASK, DEKU_MASK, {Category::cClockTower, Category::cTransformMask, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(6), SpoilerCollectionCheckGroup::GROUP_INSIDE_CLOCKTOWER ); locationTable[HMS_BOMBERS_NOTEBOOK] = ItemLocation::Base (0x63, 0x50, false, "Bombers Notebook", HMS_BOMBERS_NOTEBOOK, BOMBERS_NOTEBOOK, {Category::cClockTower, Category::cDayOne, Category::cNotebook, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(6), SpoilerCollectionCheckGroup::GROUP_INSIDE_CLOCKTOWER ); locationTable[HMS_STARTING_SWORD] = ItemLocation::Base (0x00, 0x37, false, "Starting Sword", HMS_STARTING_SWORD, PROGRESSIVE_SWORD, {Category::cClockTower, Category::cAlternateCheck}, SpoilerCollectionCheck::ItemGetInf(6), SpoilerCollectionCheckGroup::GROUP_NO_GROUP ); @@ -32,7 +33,7 @@ void LocationTable_Init() { locationTable[DEKU_PALACE_BEAN_GROTTO_CHEST] = ItemLocation::Chest (0x07, 0x05, true, "DP Bean Grotto Chest", DEKU_PALACE_BEAN_GROTTO_CHEST, RED_RUPEE, {Category::cDekuPalace,Category::cGrotto,Category::cWoodfall,Category::cChest,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_DEKU_PALACE); //East Clock Town - locationTable[E_CLOCK_TOWN_AROMA_IN_BAR] = ItemLocation::Base (0x15, 0x6F, false, "ECT Milk Bar Madame Aroma", E_CLOCK_TOWN_AROMA_IN_BAR, CHATEAU_ROMANI, {Category::cEastClockTown, Category::cDayThree, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); + locationTable[E_CLOCK_TOWN_AROMA_IN_BAR] = ItemLocation::Base (0x15, 0x6F, false, "ECT Milk Bar Madame Aroma", E_CLOCK_TOWN_AROMA_IN_BAR, CHATEAU_ROMANI, {Category::cEastClockTown, Category::cDayThree, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); locationTable[E_CLOCK_TOWN_ARCHERY_1] = ItemLocation::Base (0x20, 0x47, false, "ECT Archery #1", E_CLOCK_TOWN_ARCHERY_1, PROGRESSIVE_BOW, {Category::cEastClockTown, Category::cMinigame,Category::cDayOne, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); locationTable[E_CLOCK_TOWN_MAYOR] = ItemLocation::Base (0x12, 0x0C, false, "ECT Mayor Reward", E_CLOCK_TOWN_MAYOR, PIECE_OF_HEART, {Category::cEastClockTown, Category::cVanillaHeartPiece ,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); locationTable[E_CLOCK_TOWN_ARCHERY_2] = ItemLocation::Base (0x20, 0x0C, false, "ECT Archery #2", E_CLOCK_TOWN_ARCHERY_2, PIECE_OF_HEART, {Category::cEastClockTown, Category::cMinigame , Category::cVanillaHeartPiece,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); @@ -40,7 +41,7 @@ void LocationTable_Init() { locationTable[E_CLOCK_TOWN_TREASURE_CHEST_GAME_GORON] = ItemLocation::Chest (0x17, 0x00, true, "ECT Treasure Chest Game (Goron)", E_CLOCK_TOWN_TREASURE_CHEST_GAME_GORON, PIECE_OF_HEART, {Category::cEastClockTown, Category::cMinigame, Category::cVanillaHeartPiece,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); locationTable[E_CLOCK_TOWN_POSTMAN_FREEDOM] = ItemLocation::Base (0x6C, 0x84, false, "ECT Postman's Freedom", E_CLOCK_TOWN_POSTMAN_FREEDOM, POSTMANS_HAT, {Category::cEastClockTown, Category::cVanillaMask,Category::cDayThree, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); locationTable[E_CLOCK_TOWN_GORMAN] = ItemLocation::Base (0x15, 0x83, false, "ECT Milk Bar Gorman", E_CLOCK_TOWN_GORMAN, CIRCUS_LEADERS_MASK, {Category::cEastClockTown, Category::cVanillaMask,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); - locationTable[E_CLOCK_TOWN_AROMA_IN_OFFICE] = ItemLocation::Base (0x12, 0x8F, false, "ECT Mayor's Office Madame Aroma", E_CLOCK_TOWN_AROMA_IN_OFFICE, KAFEIS_MASK, {Category::cEastClockTown, Category::cDayOne, Category::cAnjuAndKafei, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); + locationTable[E_CLOCK_TOWN_AROMA_IN_OFFICE] = ItemLocation::Base (0x12, 0x8F, false, "ECT Mayor's Office Madame Aroma", E_CLOCK_TOWN_AROMA_IN_OFFICE, KAFEIS_MASK, {Category::cEastClockTown, Category::cDayOne, Category::cAnjuAndKafei}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); locationTable[BOMBERS_HIDEOUT_CHEST] = ItemLocation::Chest (0x29, 0x00, true, "Bombers' Hideout Chest", BOMBERS_HIDEOUT_CHEST, SILVER_RUPEE, {Category::cEastClockTown, Category::cChest,Category::cDayOne, Category::cNoOcarinaStart }, SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); locationTable[E_CLOCK_TOWN_CHEST] = ItemLocation::Chest (0x6C, 0x0A, true, "ECT Chest", E_CLOCK_TOWN_CHEST, SILVER_RUPEE, {Category::cEastClockTown, Category::cChest ,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); //locationTable[E_CLOCK_TOWN_MILK_BAR_CHATEAU] = ItemLocation::Base (0x12, 0x00, true, "Milk Bar Chateau Buy", E_CLOCK_TOWN_MILK_BAR_CHATEAU, CHATEAU_ROMANI, {Category::cEastClockTown}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); @@ -96,9 +97,9 @@ void LocationTable_Init() { locationTable[IKANA_GRAVEYARD_GROTTO_CHEST] = ItemLocation::Chest (0x07, 0x18, true, "IG Grotto", IKANA_GRAVEYARD_GROTTO_CHEST, BOMBCHU_5, {Category::cIkanaGraveyard, Category::cGrotto,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_IKANA_GRAVEYARD ); //Laundry Pool - locationTable[LAUNDRY_POOL_KAFEI] = ItemLocation::Base (0x0D, 0xAB, true, "LP Kafei's Pendant", LAUNDRY_POOL_KAFEI, PENDANT_MEMORIES, {Category::cLaundryPool,Category::cDayOne, Category::cAnjuAndKafei, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_LAUNDRY_POOL ); - locationTable[LAUNDRY_POOL_CURIOSITY_SHOP_MAN_ONE] = ItemLocation::Base (0x0D, 0x80, false, "LP Curiosity Shop Man 1", LAUNDRY_POOL_CURIOSITY_SHOP_MAN_ONE, KEATON_MASK, {Category::cLaundryPool, Category::cVanillaMask,Category::cDayThree, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_LAUNDRY_POOL ); - locationTable[LAUNDRY_POOL_CURIOSITY_SHOP_MAN_TWO] = ItemLocation::Base (0x0D, 0xA1, true, "LP Curiosity Shop Man 2", LAUNDRY_POOL_CURIOSITY_SHOP_MAN_TWO, LETTER_MAMA, {Category::cLaundryPool,Category::cDayThree, Category::cAnjuAndKafei, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_LAUNDRY_POOL ); + locationTable[LAUNDRY_POOL_KAFEI] = ItemLocation::Base (0x0D, 0xAB, true, "LP Kafei's Pendant", LAUNDRY_POOL_KAFEI, PENDANT_MEMORIES, {Category::cLaundryPool,Category::cDayOne, Category::cAnjuAndKafei}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_LAUNDRY_POOL ); + locationTable[LAUNDRY_POOL_CURIOSITY_SHOP_MAN_ONE] = ItemLocation::Base (0x0D, 0x80, false, "LP Keaton Mask", LAUNDRY_POOL_CURIOSITY_SHOP_MAN_ONE, KEATON_MASK, {Category::cLaundryPool, Category::cVanillaMask,Category::cDayThree}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_LAUNDRY_POOL ); + locationTable[LAUNDRY_POOL_CURIOSITY_SHOP_MAN_TWO] = ItemLocation::Base (0x0D, 0xA1, true, "LP Letter to Mama", LAUNDRY_POOL_CURIOSITY_SHOP_MAN_TWO, LETTER_MAMA, {Category::cLaundryPool,Category::cDayThree, Category::cAnjuAndKafei}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_LAUNDRY_POOL ); locationTable[LAUNDRY_POOL_GURU_GURU] = ItemLocation::Base (0x70, 0x8C, false, "LP Guru Guru", LAUNDRY_POOL_GURU_GURU, BREMEN_MASK, {Category::cLaundryPool, Category::cVanillaMask,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_LAUNDRY_POOL ); //Milk Road @@ -151,7 +152,7 @@ void LocationTable_Init() { locationTable[ROAD_TO_SWAMP_GROTTO_CHEST] = ItemLocation::Chest (0x07, 0x1E, true, "Road to Southern Swamp Grotto", ROAD_TO_SWAMP_GROTTO_CHEST, RED_RUPEE, {Category::cRoadToSouthernSwamp,Category::cGrotto, Category::cChest,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); //Romani Ranch - locationTable[ROMANI_RANCH_ALIEN_DEFENSE] = ItemLocation::Base (0x35, 0x60, false, "RR Alien Defense", ROMANI_RANCH_ALIEN_DEFENSE, BOTTLE_WITH_MILK, {Category::cRomaniRanch, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ROMANI_RANCH ); + locationTable[ROMANI_RANCH_ALIEN_DEFENSE] = ItemLocation::Base (0x35, 0x60, false, "RR Alien Defense", ROMANI_RANCH_ALIEN_DEFENSE, BOTTLE_WITH_MILK, {Category::cRomaniRanch}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ROMANI_RANCH ); locationTable[ROMANI_RANCH_DOG_RACE] = ItemLocation::Base (0x41, 0x0C, false, "RR Dog Race", ROMANI_RANCH_DOG_RACE, PIECE_OF_HEART, {Category::cRomaniRanch,Category::cMinigame, Category::cVanillaHeartPiece,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ROMANI_RANCH ); locationTable[ROMANI_RANCH_GROG] = ItemLocation::Base (0x42, 0x7F, false, "RR Grog", ROMANI_RANCH_GROG, BUNNY_HOOD, {Category::cRomaniRanch, Category::cVanillaMask,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ROMANI_RANCH ); locationTable[ROMANI_RANCH_CREMIA_ESCORT] = ItemLocation::Base (0x2D, 0x82, true, "RR Cremia Escort", ROMANI_RANCH_CREMIA_ESCORT, ROMANIS_MASK, {Category::cRomaniRanch, Category::cVanillaMask,Category::cDayTwo}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ROMANI_RANCH ); @@ -192,13 +193,13 @@ void LocationTable_Init() { locationTable[SOUTHERN_SWAMP_SCRUB_TRADE_CLEAR] = ItemLocation::Base (0x00, 0x98, true, "SS Deku Scrub Merchant Trade (Cleared)", SOUTHERN_SWAMP_SCRUB_TRADE_CLEAR, SWAMP_TITLE, {Category::cSouthernSwamp, Category::cDekuScrub,Category::cDayOne,Category::cTradeItem, Category::cAlternateCheck}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); //Stock Pot Inn - locationTable[STOCKPOTINN_RESERVATION] = ItemLocation::Base (0x61, 0xA0, true, "SPI Reservation", STOCKPOTINN_RESERVATION, ROOM_KEY, {Category::cStockPotInn,Category::cDayOne, Category::cAnjuAndKafei, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_STOCKPOTINN ); - locationTable[STOCKPOTINN_MIDNIGHT_MEETING] = ItemLocation::Base (0x61, 0xAA, true, "SPI Midnight Meeting", STOCKPOTINN_MIDNIGHT_MEETING, LETTER_KAFEI, {Category::cStockPotInn,Category::cDayOne, Category::cAnjuAndKafei, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_STOCKPOTINN ); + locationTable[STOCKPOTINN_RESERVATION] = ItemLocation::Base (0x61, 0xA0, true, "SPI Reservation", STOCKPOTINN_RESERVATION, ROOM_KEY, {Category::cStockPotInn,Category::cDayOne, Category::cAnjuAndKafei}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_STOCKPOTINN ); + locationTable[STOCKPOTINN_MIDNIGHT_MEETING] = ItemLocation::Base (0x61, 0xAA, true, "SPI Midnight Meeting", STOCKPOTINN_MIDNIGHT_MEETING, LETTER_KAFEI, {Category::cStockPotInn,Category::cDayOne, Category::cAnjuAndKafei}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_STOCKPOTINN ); locationTable[STOCKPOTINN_TOILET_HAND] = ItemLocation::Base (0x61, 0x01, false, "SPI Toilet Hand", STOCKPOTINN_TOILET_HAND, PIECE_OF_HEART, {Category::cStockPotInn, Category::cVanillaHeartPiece,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_STOCKPOTINN ); locationTable[STOCKPOTINN_GRANDMA_SHORT_STORY] = ItemLocation::Base (0x61, 0x0C, false, "SPI Grandma Short Story", STOCKPOTINN_GRANDMA_SHORT_STORY, PIECE_OF_HEART, {Category::cStockPotInn, Category::cVanillaHeartPiece,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_STOCKPOTINN ); locationTable[STOCKPOTINN_GRANDMA_LONG_STORY] = ItemLocation::Base (0x61, 0xBA, false, "SPI Grandma Long Story", STOCKPOTINN_GRANDMA_LONG_STORY, PIECE_OF_HEART, {Category::cStockPotInn, Category::cVanillaHeartPiece,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_STOCKPOTINN ); locationTable[STOCKPOTINN_ANJU_AND_KAFEI] = ItemLocation::Base (0x61, 0x85, false, "SPI Anju And Kafei", STOCKPOTINN_ANJU_AND_KAFEI, COUPLES_MASK, {Category::cStockPotInn, Category::cDayThree, Category::cAnjuAndKafei}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_STOCKPOTINN ); - locationTable[STOCKPOTINN_STAFF_ROOM_CHEST] = ItemLocation::Chest (0x61, 0x01, true, "SPI Staff Room Chest", STOCKPOTINN_STAFF_ROOM_CHEST, SILVER_RUPEE, {Category::cStockPotInn,Category::cChest ,Category::cDayThree, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_STOCKPOTINN ); + locationTable[STOCKPOTINN_STAFF_ROOM_CHEST] = ItemLocation::Chest (0x61, 0x01, true, "SPI Staff Room Chest", STOCKPOTINN_STAFF_ROOM_CHEST, SILVER_RUPEE, {Category::cStockPotInn,Category::cChest ,Category::cDayThree}, SpoilerCollectionCheckGroup::GROUP_STOCKPOTINN ); locationTable[STOCKPOTINN_GUEST_ROOM_CHEST] = ItemLocation::Chest (0x61, 0x00, true, "SPI Guest Room Chest", STOCKPOTINN_GUEST_ROOM_CHEST, SILVER_RUPEE, {Category::cStockPotInn,Category::cChest ,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_STOCKPOTINN ); //Stone Tower @@ -789,6 +790,7 @@ std::vector dungeonRewardLocations = { std::vector overworldLocations = { // Clock Tower CLOCK_TOWER_OCARINA_OF_TIME, + CLOCK_TOWER_SONG_OF_TIME, HMS_DEKU_MASK, HMS_SONG_OF_HEALING, HMS_BOMBERS_NOTEBOOK, diff --git a/source/item_pool.cpp b/source/item_pool.cpp index ac38356..7643815 100644 --- a/source/item_pool.cpp +++ b/source/item_pool.cpp @@ -257,7 +257,7 @@ const std::array chestItems = { MIRROR_SHIELD, }; -const std::array songList = { +const std::array songList = { //SONG_OF_TIME, //SONG_OF_DOUBLE_TIME, //INVERTED_SONG_OF_TIME, //SoT not included yet @@ -283,6 +283,8 @@ static void PlaceVanillaSongs() { PlaceItemInLocation(IKANA_CASTLE_IKANA_KING, ELEGY_OF_EMPTINESS); PlaceItemInLocation(IKANA_GRAVEYARD_DAY_ONE_GRAVE_TABLET, SONG_OF_STORMS); PlaceItemInLocation(GIANTS_OATH_TO_ORDER, OATH_TO_ORDER); + PlaceItemInLocation(CLOCK_TOWER_SONG_OF_TIME, SONG_OF_TIME); + PlaceItemInLocation(SOUTHERN_SWAMP_MUSIC_STATUE, SONG_OF_SOARING); }; // TODO: Change back to 18 when the override value is correct. @@ -867,7 +869,7 @@ void GenerateItemPool() { }; //Check song shuffle and dungeon reward shuffle just for ice traps /* - if (ShuffleSongs.Is(rnd::SongShuffleSetting::SONGSHUFFLE_ANYWHERE)) { + if (ShuffleSongs.Value() != 0) { //Push item ids for songs IceTrapModels.push_back(0x4B); IceTrapModels.push_back(0x4C); @@ -876,10 +878,10 @@ void GenerateItemPool() { IceTrapModels.push_back(0x4F); IceTrapModels.push_back(0x51); IceTrapModels.push_back(0x54); - //IceTrapModels.push_back(0x53); // should be song of time but not included yet + IceTrapModels.push_back(0x53); // should be song of time but not included yet //IceTrapModels.push_back(0xC6); }*/ - if (ShuffleRewards.Is(rnd::RewardShuffleSetting::REWARDSHUFFLE_ANYWHERE)) { + if (ShuffleRewards.Value() != 0) { //Push item ids for dungeon rewards IceTrapModels.push_back(0x55); IceTrapModels.push_back(0x56); @@ -943,8 +945,6 @@ void GenerateItemPool() { } else {PlaceItemInLocation(HMS_BOMBERS_NOTEBOOK, BOMBERS_NOTEBOOK);} - //ShuffleOcarina - //COWSANITY //if (ShuffleCows) { //8 total cows -- rather have junk than 8 extra milk refills @@ -995,29 +995,32 @@ void GenerateItemPool() { } //SONG SHUFFLE - //add extra songs only if song shuffle is anywhere - //if (ShuffleSongs.Is(SongShuffleSetting::SONGSHUFFLE_ANYWHERE)){ - // AddItemsToPool(ItemPool, songList); - //} - //else if (ShuffleSongs.Is(SongShuffleSetting::SONGSHUFFLE_ANYWHERE) && ItemPoolValue.Is(ItemPoolSetting::ITEMPOOL_PLENTIFUL)) { - // AddItemsToPool(PendingJunkPool, songList); - //} - //else { + //Add songs to pool if they're shuffled + if (ShuffleSongs.Value() != u8(0)) { + AddItemsToPool(ItemPool, songList); + //If Song of Time is shuffled add it to the pool + if (ShuffleSongOfTime) { + AddItemToMainPool(SONG_OF_TIME); + } + else { + PlaceItemInLocation(CLOCK_TOWER_SONG_OF_TIME, SONG_OF_TIME); + } + //If Soaring is shuffled add it to the pool + if (ShuffleSoaring) { + AddItemToMainPool(SONG_OF_SOARING); + } + else { + PlaceItemInLocation(SOUTHERN_SWAMP_MUSIC_STATUE, SONG_OF_SOARING); + } + } + else { PlaceVanillaSongs(); - //} + } + if (StartingSongOfHealing.Value() == u8(1)){//if starting with song of healing fill deku mask and notebook spots as they are unobtainable PlaceItemInLocation(HMS_DEKU_MASK, GREEN_RUPEE); PlaceItemInLocation(HMS_BOMBERS_NOTEBOOK, GREEN_RUPEE); } - - //if (ShuffleSoaring) - //{ - // AddItemToPool(ItemPool, SONG_OF_SOARING); - //} - //else { - PlaceItemInLocation(SOUTHERN_SWAMP_MUSIC_STATUE, SONG_OF_SOARING); - // } - //GREAT FAIRY SHUFFLE if(ShuffleGFRewards.Is((u8)GreatFairyRewardShuffleSetting::GFREWARDSHUFFLE_VANILLA)){ diff --git a/source/location_access.cpp b/source/location_access.cpp index e866fa4..4bb2cdf 100644 --- a/source/location_access.cpp +++ b/source/location_access.cpp @@ -591,7 +591,8 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(CLOCK_TOWER_OCARINA_OF_TIME, {[]{return true;}}), + LocationAccess(CLOCK_TOWER_OCARINA_OF_TIME, {[]{return CanUseProjectile;}}), + LocationAccess(CLOCK_TOWER_SONG_OF_TIME, {[]{return CanUseProjectile;}}), }, { //Exits diff --git a/source/logic.cpp b/source/logic.cpp index b9cc420..1faf094 100644 --- a/source/logic.cpp +++ b/source/logic.cpp @@ -119,6 +119,7 @@ namespace Logic { bool LetterMamaAccess = false; bool MoonsTearAccess = false; //Songs + bool SongOfTime = false; bool ScarecrowSong = false; bool SongOfStorms = false; bool SonataOfAwakening = false; diff --git a/source/setting_descriptions.cpp b/source/setting_descriptions.cpp index 2cecb53..c1143e2 100644 --- a/source/setting_descriptions.cpp +++ b/source/setting_descriptions.cpp @@ -279,19 +279,17 @@ string_view startingSpinDesc = "**OPTION CURRENTLY WIP**\n" /*------------------------------ // | SONG SHUFFLE | // ------------------------------*/ // -string_view songsSongLocations = "**OPTION CURRENTLY WIP**\n" // - "Songs will only appear at locations that normally\n" +string_view songsSongLocations = "Songs will only appear at locations that normally\n" "teach songs."; // -string_view songsDungeonRewards = "**OPTION CURRENTLY WIP**\n" // - "Songs appear at the end of dungeons. For major\n" // +string_view songsDungeonRewards = "Songs appear at the end of dungeons. For major\n" // "dungeons, they will be at the boss heart container" "location. "; // -string_view songsAllLocations = "**OPTION CURRENTLY WIP**\n" // - "Songs can appear in any location."; // - // +string_view songsAllLocations = "Songs can appear in any location."; // +string_view songsVanilla = "Songs will not be randomized"; // string_view shuffleSoaringVanilla = "Sets Song of Soaring to its Vanilla Location"; // -string_view shuffleSoaringRandom = "**OPTION CURRENTLY WIP**\n" // - "Randomizes Song of Soaring"; // +string_view shuffleSoaringRandom = "Randomizes Song of Soaring"; // +string_view songTimeVanilla = "Sets Song of Time to its Vanilla Location"; // +string_view songTimeRandom = "Randomizes Song of Time"; // /*------------------------------ // | GOSSIP STONE HINTS | // ------------------------------*/ // diff --git a/source/settings.cpp b/source/settings.cpp index 72b1ff4..95c9489 100644 --- a/source/settings.cpp +++ b/source/settings.cpp @@ -140,6 +140,8 @@ namespace Settings { Option StartingElegyOfEmptiness = Option::U8("Elegy of Emptiness", { "None", "Elegy of Emptiness" }, { "" }); Option StartingSongOfHealing = Option::U8("Song of Healing", { "None", "Song of Healing" }, { "" }, OptionCategory::Setting); Option StartingSongOfSoaring = Option::U8("Song of Soaring", { "None", "Song of Soaring" }, { "" }); + Option StartingSongOfTime = Option::U8("Song of Time", { "None", "Song of Time" }, { "" }); + Option StartingGoronIntro = Option::U8("Goron Lullaby Intro", { "None", "Lullaby Intro" }, { "" }); Option StartingUpgradesToggle = Option::U8("Equipment & Upgrades", { "All Off", "All On", "Choose" }, { "" }); Option StartingKokiriSword = Option::U8("Sword", { "Kokiri Sword", "Razor Sword", "Gilded Sword", "None" }, { "" }, OptionCategory::Setting, (u8)StartingSwordSetting::STARTINGSWORD_KOKIRI);//1U = StartingSwordSetting::STARTINGSWORD_KOKIRI Option StartingGreatFairySword = Option::U8("Great Fairy Sword", { "None", "G. F. S." }, { "" }); @@ -248,10 +250,12 @@ namespace Settings { }; std::vector startingInventorySongs = { + &StartingSongOfTime, &StartingOathToOrder, &StartingEponasSong, &StartingSongOfStorms, &StartingSonataOfAwakening, + &StartingGoronIntro, &StartingGoronsLullaby, &StartingNewWaveBossaNova, &StartingElegyOfEmptiness, @@ -290,8 +294,9 @@ namespace Settings { Option ShuffleMasks = Option::Bool("Shuffle Masks", {"Off", "On"}, {shuffleMasksVanilla, shuffleMasksRandom}, OptionCategory::Toggle, 1); Option ShuffleTransformation = Option::Bool("Shuffle Transformation",{"Off", "On"}, {shuffleTransformationDesc}); Option ShufflePiecesOfHeart = Option::Bool("Shuffle Piece of Heart",{"Off", "On"}, {shufflePiecesOfHeartDesc }, OptionCategory::Toggle, 1); - Option ShuffleSongs = Option::U8 ("Shuffle Songs", {"Off", "Dungeon Rewards", "Anywhere"}, {songsSongLocations, songsDungeonRewards, songsAllLocations}, OptionCategory::Setting, (u8)SongShuffleSetting::SONGSHUFFLE_SONG_LOCATIONS); - Option ShuffleSoaring = Option::Bool("Shuffle SoS", {"Off", "On"}, {shuffleSoaringVanilla, shuffleSoaringRandom}); + Option ShuffleSongs = Option::U8 ("Shuffle Songs", {"Off", "Song Locations", "Anywhere"}, {songsVanilla, songsSongLocations, songsAllLocations}, OptionCategory::Setting, 0); + Option ShuffleSoaring = Option::Bool("Shuffle Song of Soaring",{"Off", "On"}, {shuffleSoaringVanilla, shuffleSoaringRandom}, OptionCategory::Toggle, 0); + Option ShuffleSongOfTime = Option::Bool("Shuffle Song of Time", {"Off", "On"}, {songTimeVanilla, songTimeRandom}, OptionCategory::Toggle, 0); Option Shopsanity = Option::U8 ("Shopsanity", {"Off", "0", "1", "2", "3", "4", "Random"}, {shopsOff, shopsZero, shopsOne, shopsTwo, shopsThree, shopsFour, shopsRandom}); Option Tokensanity = Option::Bool("Tokensanity", {"Off", "On"}, {tokensOff, tokensAllTokens}); Option Scrubsanity = Option::U8 ("Shuffle Scrub Wares", {"Off", "Affordable", "Expensive", "Random Prices"}, {scrubsOff, scrubsAffordable, scrubsExpensive, scrubsRandomPrices}); @@ -312,8 +317,9 @@ namespace Settings { &ShuffleMasks, &ShuffleTransformation, &ShufflePiecesOfHeart, - //&ShuffleSongs, - //&ShuffleSoaring, + &ShuffleSongs, + &ShuffleSoaring, + &ShuffleSongOfTime, //&Shopsanity, &Tokensanity, &ShuffleMerchants, @@ -777,6 +783,8 @@ namespace Settings { ctx.startingElegyOfEmptiness = StartingElegyOfEmptiness.Value(); ctx.startingSongOfSoaring = StartingSongOfSoaring.Value(); ctx.startingSongOfHealing = StartingSongOfHealing.Value(); + ctx.startingSongOfTime = StartingSongOfTime.Value(); + ctx.startingGoronIntro = StartingGoronIntro.Value(); //Upgrades ctx.startingKokiriSword = StartingKokiriSword.Value(); ctx.startingShield = StartingShield.Value(); @@ -1162,15 +1170,18 @@ namespace Settings { //Force include song locations std::vector songLocations = GetLocations(everyPossibleLocation, Category::cSong); //Unhide all song locations, then lock necessary ones - //Unhide(songLocations); - - //if (ShuffleSongs.Is((u8)SongShuffleSetting::SONGSHUFFLE_SONG_LOCATIONS)) { - // IncludeAndHide(songLocations); - // } - //else if (ShuffleSongs.Is((u8)SongShuffleSetting::SONGSHUFFLE_DUNGEON_REWARDS)) { + if (ShuffleSongs.Value() == 0) { IncludeAndHide(songLocations); - //} - + } + else { + Unhide(songLocations); + } + if (!ShuffleSoaring) { + IncludeAndHide({SOUTHERN_SWAMP_MUSIC_STATUE}); + } + if (!ShuffleSongOfTime) { + IncludeAndHide({CLOCK_TOWER_SONG_OF_TIME}); + } //Force Include Dungeon Rewards std::vector DungeonRewards = GetLocations(everyPossibleLocation, Category::cDungeonReward); if (ShuffleRewards.Is((u8)RewardShuffleSetting::REWARDSHUFFLE_END_OF_DUNGEON)) { @@ -1569,6 +1580,28 @@ namespace Settings { LanguageSelect.Hide(); LanguageSelect.SetSelectedIndex(LANGUAGE_NONE); } + //Show or Hide Shuffle Song of Soaring / Song of Time if Song Shuffle is on / off + if (ShuffleSongs.Value() == u8(0)) { + ShuffleSoaring.Hide(); + ShuffleSongOfTime.Hide(); + } + else { + ShuffleSoaring.Unhide(); + ShuffleSoaring.Unlock(); + ShuffleSongOfTime.Unhide(); + ShuffleSongOfTime.Unlock(); + } + //if starting with Song of Soaring or Song of Time set settings to Vanilla and hide and lock + if (StartingSongOfSoaring.Value() == u8(1)) { + ShuffleSoaring.SetSelectedIndex(0); + ShuffleSoaring.Hide(); + ShuffleSoaring.Lock(); + } + if (StartingSongOfTime.Value() == u8(1)) { + ShuffleSongOfTime.SetSelectedIndex(0); + ShuffleSongOfTime.Hide(); + ShuffleSongOfTime.Lock(); + } ResolveExcludedLocationConflicts(); } @@ -1687,6 +1720,7 @@ namespace Settings { if (Logic.Is((u8)LogicSetting::LOGIC_VANILLA)) { ShuffleSongs.SetSelectedIndex(0); ShuffleSoaring.SetSelectedIndex(0); + ShuffleSongOfTime.SetSelectedIndex(0); Shopsanity.SetSelectedIndex(0); Tokensanity.SetSelectedIndex(0); ShuffleCows.SetSelectedIndex(0); diff --git a/source/spoiler_log.cpp b/source/spoiler_log.cpp index 31825bf..68f9f74 100644 --- a/source/spoiler_log.cpp +++ b/source/spoiler_log.cpp @@ -213,9 +213,15 @@ static void WriteIngameSpoilerLog() { continue; } // Songs - if ((Settings::ShuffleSongs.Is(SongShuffleSetting::SONGSHUFFLE_SONG_LOCATIONS)) && Location(key)->IsCategory(Category::cSong)) { + if ((Settings::ShuffleSongs.Value() == u8(0)) && Location(key)->IsCategory(Category::cSong)) { continue; } + //if ((!Settings::ShuffleSongOfTime) && Location(key)->IsCategory(Category::cSong)) { + // continue; + //} + //if ((!Settings::ShuffleSoaring) && Location(key)->IsCategory(Category::cSong)) { + // continue; + //} // Tingle Maps if (!Settings::ShuffleTingleMaps && Location(key)->IsCategory(Category::cTingleMap)) { continue; From 0736083fed6a3659e999c6e8bbf67da8c0927d89 Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Fri, 16 Jan 2026 22:05:56 -0600 Subject: [PATCH 2/9] Update .gitmodules --- .gitmodules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index a0bdeab..071cc31 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "Z3DR"] path = Z3DR url = https://github.com/Z3DR/mm3dr.git - branch = dev \ No newline at end of file + branch = Songsanity-StartingInventory \ No newline at end of file From 812458e4c4fa85e3511c23bc60f2b29843ff50e5 Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Fri, 16 Jan 2026 22:07:35 -0600 Subject: [PATCH 3/9] Update Z3DR --- Z3DR | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Z3DR b/Z3DR index 4f59bf8..d1cd1fb 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit 4f59bf82b0d539fbcea820142fb342d32c6f9b2a +Subproject commit d1cd1fb264051bc83e7d0664d6af2ec57ee070c9 From ea65234a037a5ff500211ae066cd058d966d1045 Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Fri, 23 Jan 2026 22:24:42 -0600 Subject: [PATCH 4/9] Z3DR Update -Fixes missing music statue and oath to order locations in overworldLocations - Removes extra Oath to Order locations from dungeons, now only shows under Woodfall Temple - Update Z3DR --- .gitmodules | 2 +- source/item_location.cpp | 2 ++ source/location_access.cpp | 3 --- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.gitmodules b/.gitmodules index 071cc31..12a5f3b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "Z3DR"] path = Z3DR url = https://github.com/Z3DR/mm3dr.git - branch = Songsanity-StartingInventory \ No newline at end of file + branch = dev diff --git a/source/item_location.cpp b/source/item_location.cpp index 66f208f..294ffde 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -947,6 +947,7 @@ std::vector overworldLocations = { //Snowhead SNOWHEAD_GREAT_FAIRY, //Southern Swamp + SOUTHERN_SWAMP_MUSIC_STATUE, SOUTHERN_SWAMP_KOUME, SOUTHERN_SWAMP_KOTAKE, SOUTHERN_SWAMP_KOTAKE_IN_WOODS, @@ -1032,6 +1033,7 @@ std::vector overworldLocations = { WOODFALL_BEHIND_OWL_CHEST, ENTRANCE_TO_WOODFALL_CHEST, WOODFALL_GREAT_FAIRY, + GIANTS_OATH_TO_ORDER, //Zora Cape ZORA_CAPE_GREAT_FAIRY, ZORA_CAPE_BEAVER_RACE_1, diff --git a/source/location_access.cpp b/source/location_access.cpp index 4bb2cdf..edce9dd 100644 --- a/source/location_access.cpp +++ b/source/location_access.cpp @@ -2583,7 +2583,6 @@ void AreaTable_Init() { //Locations LocationAccess(GOHT, {[]{return GoronMask && CanUse(FIRE_ARROWS);}}), LocationAccess(GOHT_HEART_CONTAINER, {[]{return GoronMask && CanUse(FIRE_ARROWS);}}), - LocationAccess(GIANTS_OATH_TO_ORDER, {[]{return GoronMask && CanUse(FIRE_ARROWS);}}), }, { //Exits @@ -2825,7 +2824,6 @@ void AreaTable_Init() { //Locations LocationAccess(GYORG, {[]{return ZoraMask && MagicMeter && CanUseProjectile;}}), LocationAccess(GYORG_HEART_CONTAINER, {[]{return ZoraMask && MagicMeter && CanUseProjectile;}}), - LocationAccess(GIANTS_OATH_TO_ORDER, {[]{return ZoraMask && MagicMeter && CanUseProjectile;}}), }, { //Exits @@ -3150,7 +3148,6 @@ void AreaTable_Init() { LocationAccess(STONE_TOWER_TEMPLE_GIANTS_MASK_CHEST, {[]{return CanUse(LIGHT_ARROWS) || CanUse(GIANTS_MASK);}}), LocationAccess(TWINMOLD, {[]{return CanUse(LIGHT_ARROWS) && CanUse(GIANTS_MASK);}}), LocationAccess(TWINMOLD_HEART_CONTAINER, {[]{return CanUse(LIGHT_ARROWS) && CanUse(GIANTS_MASK);}}), - LocationAccess(GIANTS_OATH_TO_ORDER, {[]{return CanUse(LIGHT_ARROWS) && CanUse(GIANTS_MASK);}}), }, { //Exits From 30189468d29642e2e2b74f39999bf1444598355a Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Fri, 23 Jan 2026 22:39:35 -0600 Subject: [PATCH 5/9] fix after rebase actually makes the changes in dev cause itdidnt change before --- .gitmodules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index 12a5f3b..679158b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "Z3DR"] path = Z3DR url = https://github.com/Z3DR/mm3dr.git - branch = dev + branch = Songsanity-StartingInventory From 3d6313821b78baaa88d1f91e787637081fd5921e Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sat, 24 Jan 2026 16:05:19 -0600 Subject: [PATCH 6/9] Update item_location.cpp fix GID value for Lullaby Intro location --- source/item_location.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/item_location.cpp b/source/item_location.cpp index 294ffde..2d9a782 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -227,7 +227,7 @@ void LocationTable_Init() { locationTable[TWIN_ISLANDS_GORON_RACETRACK_GROTTO_CHEST] = ItemLocation::Chest (0x07, 0x19, true, "TI Goron Racetrack Grotto", TWIN_ISLANDS_GORON_RACETRACK_GROTTO_CHEST, BOMBCHU_5, {Category::cTwinIslands, Category::cGrotto,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_TWIN_ISLANDS ); locationTable[TWIN_ISLANDS_UNDERWATER_RAMP_CHEST] = ItemLocation::Chest (0x5E, 0x06, true, "TI Underwater Ramp Chest", TWIN_ISLANDS_UNDERWATER_RAMP_CHEST, PIECE_OF_HEART, {Category::cTwinIslands, Category::cVanillaHeartPiece, Category::cChest, Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_TWIN_ISLANDS ); locationTable[TWIN_ISLANDS_CAVE_CHEST] = ItemLocation::Chest (0x5E, 0x00, true, "TI Cave Chest", TWIN_ISLANDS_CAVE_CHEST, RED_RUPEE, {Category::cTwinIslands,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_TWIN_ISLANDS ); - locationTable[TWIN_ISLANDS_LULLABY_INTRO] = ItemLocation::Base (0x5D, 0x00, false, "TI Lullaby Intro", TWIN_ISLANDS_LULLABY_INTRO, LULLABY_INTRO, {Category::cTwinIslands, Category::cSong, Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_TWIN_ISLANDS ); + locationTable[TWIN_ISLANDS_LULLABY_INTRO] = ItemLocation::Base (0x5D, 0x74, false, "TI Lullaby Intro", TWIN_ISLANDS_LULLABY_INTRO, LULLABY_INTRO, {Category::cTwinIslands, Category::cSong, Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_TWIN_ISLANDS ); //W Clock Town locationTable[W_CLOCK_TOWN_BOMB_BAG_BUY] = ItemLocation::Base (0x0D, 0x1B, false, "WCT Bomb Bag Purchase", W_CLOCK_TOWN_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown,Category::cDayOne, Category::cShop, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); locationTable[W_CLOCK_TOWN_BIG_BOMB_BAG_BUY] = ItemLocation::Base (0x0D, 0x1C, false, "WCT Big Bomb Bag Purchase", W_CLOCK_TOWN_BIG_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown,Category::cDayTwo, Category::cShop, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); From 4eb877dc145e722a5047b709a30e39470cf2ccb0 Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sun, 1 Feb 2026 18:37:01 -0600 Subject: [PATCH 7/9] Updates - Adjust fill algorithm to do ocarina after song of time but before songsanity - Remove several locations from the list of locations available for placement when placing Ocarina + Song of Time - Adjust settings to actually cache Song of Soaring / Time settings --- source/fill.cpp | 21 ++++++++++----------- source/item_location.cpp | 10 +++++----- source/settings.cpp | 7 +++---- 3 files changed, 18 insertions(+), 20 deletions(-) diff --git a/source/fill.cpp b/source/fill.cpp index 64bcbe1..4c783ee 100644 --- a/source/fill.cpp +++ b/source/fill.cpp @@ -887,6 +887,16 @@ int Fill() { AssumedFill(SoTItem, ocarinaLocations, true); NoRepeatOnTokens = false; } + //If Ocarina is shuffled place that first + if (StartingOcarina.Value() == 0) { + //Get acceptable Ocarina Locations + std::vector ocarinaLocations = FilterFromPool(allLocations, []( const LocationKey loc) {return Location(loc)->IsCategory(Category::cNoOcarinaStart);}); + std::vector ocarinaItem = FilterAndEraseFromPool(ItemPool, [](const ItemKey i) { return ItemTable(i).GetItemId()==(u32)GetItemID::GI_OCARINA_OF_TIME; }); + //reuse NoRepeatOnTokens variable because making a new one is stupid + NoRepeatOnTokens = true; + AssumedFill(ocarinaItem, ocarinaLocations, true); + NoRepeatOnTokens = false; + } //If Songs are at song locations get all song locations and place them there if (ShuffleSongs.Value() == u8(1)){ std::vector songLocations = FilterFromPool(allLocations, [](const LocationKey loc) {return Location(loc)->IsCategory(Category::cSong);}); @@ -901,17 +911,6 @@ int Fill() { NoRepeatOnTokens = false; } - //If Ocarina is shuffled place that first - if (StartingOcarina.Value() == 0) { - //Get acceptable Ocarina Locations - std::vector ocarinaLocations = FilterFromPool(allLocations, []( const LocationKey loc) {return Location(loc)->IsCategory(Category::cNoOcarinaStart);}); - std::vector ocarinaItem = FilterAndEraseFromPool(ItemPool, [](const ItemKey i) { return ItemTable(i).GetItemId()==(u32)GetItemID::GI_OCARINA_OF_TIME; }); - //reuse NoRepeatOnTokens variable because making a new one is stupid - NoRepeatOnTokens = true; - AssumedFill(ocarinaItem, ocarinaLocations, true); - NoRepeatOnTokens = false; - } - if (ShuffleGFRewards.Is((u8)GreatFairyRewardShuffleSetting::GFREWARDSHUFFLE_ALL_GREAT_FARIES)){ //get GF locations std::vector gfLocations = FilterFromPool(allLocations, [](const LocationKey loc) {return Location(loc)->IsCategory(Category::cFairyFountain);}); diff --git a/source/item_location.cpp b/source/item_location.cpp index 2d9a782..8479077 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -39,8 +39,8 @@ void LocationTable_Init() { locationTable[E_CLOCK_TOWN_ARCHERY_2] = ItemLocation::Base (0x20, 0x0C, false, "ECT Archery #2", E_CLOCK_TOWN_ARCHERY_2, PIECE_OF_HEART, {Category::cEastClockTown, Category::cMinigame , Category::cVanillaHeartPiece,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); locationTable[E_CLOCK_TOWN_HONEY_DARLING_3DAYS] = ItemLocation::Base (0x11, 0x0C, false, "ECT Honey and Darling 3 Days", E_CLOCK_TOWN_HONEY_DARLING_3DAYS, PIECE_OF_HEART, {Category::cEastClockTown, Category::cMinigame , Category::cVanillaHeartPiece,Category::cDayThree, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); locationTable[E_CLOCK_TOWN_TREASURE_CHEST_GAME_GORON] = ItemLocation::Chest (0x17, 0x00, true, "ECT Treasure Chest Game (Goron)", E_CLOCK_TOWN_TREASURE_CHEST_GAME_GORON, PIECE_OF_HEART, {Category::cEastClockTown, Category::cMinigame, Category::cVanillaHeartPiece,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); - locationTable[E_CLOCK_TOWN_POSTMAN_FREEDOM] = ItemLocation::Base (0x6C, 0x84, false, "ECT Postman's Freedom", E_CLOCK_TOWN_POSTMAN_FREEDOM, POSTMANS_HAT, {Category::cEastClockTown, Category::cVanillaMask,Category::cDayThree, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); - locationTable[E_CLOCK_TOWN_GORMAN] = ItemLocation::Base (0x15, 0x83, false, "ECT Milk Bar Gorman", E_CLOCK_TOWN_GORMAN, CIRCUS_LEADERS_MASK, {Category::cEastClockTown, Category::cVanillaMask,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); + locationTable[E_CLOCK_TOWN_POSTMAN_FREEDOM] = ItemLocation::Base (0x6C, 0x84, false, "ECT Postman's Freedom", E_CLOCK_TOWN_POSTMAN_FREEDOM, POSTMANS_HAT, {Category::cEastClockTown, Category::cVanillaMask,Category::cDayThree}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); + locationTable[E_CLOCK_TOWN_GORMAN] = ItemLocation::Base (0x15, 0x83, false, "ECT Milk Bar Gorman", E_CLOCK_TOWN_GORMAN, CIRCUS_LEADERS_MASK, {Category::cEastClockTown, Category::cVanillaMask,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); locationTable[E_CLOCK_TOWN_AROMA_IN_OFFICE] = ItemLocation::Base (0x12, 0x8F, false, "ECT Mayor's Office Madame Aroma", E_CLOCK_TOWN_AROMA_IN_OFFICE, KAFEIS_MASK, {Category::cEastClockTown, Category::cDayOne, Category::cAnjuAndKafei}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); locationTable[BOMBERS_HIDEOUT_CHEST] = ItemLocation::Chest (0x29, 0x00, true, "Bombers' Hideout Chest", BOMBERS_HIDEOUT_CHEST, SILVER_RUPEE, {Category::cEastClockTown, Category::cChest,Category::cDayOne, Category::cNoOcarinaStart }, SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); locationTable[E_CLOCK_TOWN_CHEST] = ItemLocation::Chest (0x6C, 0x0A, true, "ECT Chest", E_CLOCK_TOWN_CHEST, SILVER_RUPEE, {Category::cEastClockTown, Category::cChest ,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); @@ -54,7 +54,7 @@ void LocationTable_Init() { //Goron Village locationTable[GORON_VILLAGE_POWDER_KEG_CHALLENGE] = ItemLocation::Base (0x4D, 0x34, false, "GV Powder Keg Challenge", GORON_VILLAGE_POWDER_KEG_CHALLENGE, POWDER_KEG, {Category::cGoronVillage, Category::cDayOne, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); - locationTable[GORON_VILLAGE_SCRUB_PURCHASE] = ItemLocation::Base (0x4D, 0x1D, false, "GV Scrub Purchase", GORON_VILLAGE_SCRUB_PURCHASE, PROGRESSIVE_BOMB_BAG, {Category::cGoronVillage, Category::cDekuScrub,Category::cDayOne, Category::cShop, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); + locationTable[GORON_VILLAGE_SCRUB_PURCHASE] = ItemLocation::Base (0x4D, 0x1D, false, "GV Scrub Purchase", GORON_VILLAGE_SCRUB_PURCHASE, PROGRESSIVE_BOMB_BAG, {Category::cGoronVillage, Category::cDekuScrub,Category::cDayOne, Category::cShop, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); locationTable[GORON_VILLAGE_LENS_OF_TRUTH_CHEST] = ItemLocation::Chest (0x07, 0x01, true, "GV Lens of Truth Chest", GORON_VILLAGE_LENS_OF_TRUTH_CHEST, LENS_OF_TRUTH, {Category::cGoronVillage, Category::cChest, Category::cDayOne, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); locationTable[GORON_VILLAGE_SCRUB_TRADE] = ItemLocation::Base (0x4D, 0x99, true, "GV Deku Scrub Merchant Trade", GORON_VILLAGE_SCRUB_TRADE, MOUNTAIN_TITLE, {Category::cGoronVillage, Category::cDekuScrub, Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); locationTable[GORON_VILLAGE_LEDGE] = ItemLocation::Collectable(0x4D, 0x00, false, "GV Piece of Heart", GORON_VILLAGE_LEDGE, PIECE_OF_HEART, {Category::cGoronVillage, Category::cVanillaHeartPiece, Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); @@ -100,7 +100,7 @@ void LocationTable_Init() { locationTable[LAUNDRY_POOL_KAFEI] = ItemLocation::Base (0x0D, 0xAB, true, "LP Kafei's Pendant", LAUNDRY_POOL_KAFEI, PENDANT_MEMORIES, {Category::cLaundryPool,Category::cDayOne, Category::cAnjuAndKafei}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_LAUNDRY_POOL ); locationTable[LAUNDRY_POOL_CURIOSITY_SHOP_MAN_ONE] = ItemLocation::Base (0x0D, 0x80, false, "LP Keaton Mask", LAUNDRY_POOL_CURIOSITY_SHOP_MAN_ONE, KEATON_MASK, {Category::cLaundryPool, Category::cVanillaMask,Category::cDayThree}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_LAUNDRY_POOL ); locationTable[LAUNDRY_POOL_CURIOSITY_SHOP_MAN_TWO] = ItemLocation::Base (0x0D, 0xA1, true, "LP Letter to Mama", LAUNDRY_POOL_CURIOSITY_SHOP_MAN_TWO, LETTER_MAMA, {Category::cLaundryPool,Category::cDayThree, Category::cAnjuAndKafei}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_LAUNDRY_POOL ); - locationTable[LAUNDRY_POOL_GURU_GURU] = ItemLocation::Base (0x70, 0x8C, false, "LP Guru Guru", LAUNDRY_POOL_GURU_GURU, BREMEN_MASK, {Category::cLaundryPool, Category::cVanillaMask,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_LAUNDRY_POOL ); + locationTable[LAUNDRY_POOL_GURU_GURU] = ItemLocation::Base (0x70, 0x8C, false, "LP Bremen Mask", LAUNDRY_POOL_GURU_GURU, BREMEN_MASK, {Category::cLaundryPool, Category::cVanillaMask,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_LAUNDRY_POOL ); //Milk Road locationTable[MILK_ROAD_GORMAN_RACE] = ItemLocation::Base (0x6A, 0x81, false, "MR Gorman Track Race", MILK_ROAD_GORMAN_RACE, GAROS_MASK, {Category::cMilkRoad, Category::cMinigame, Category::cVanillaMask,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_MILK_ROAD ); @@ -210,7 +210,7 @@ void LocationTable_Init() { //Termina Field locationTable[TERMINA_FIELD_MOONS_TEAR] = ItemLocation::Base (0x2D, 0x96, true, "TF Moon's Tear", TERMINA_FIELD_MOONS_TEAR, MOONS_TEAR, {Category::cTerminaField,Category::cDayOne, Category::cTradeItem, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_TERMINA_FIELD ); locationTable[TERMINA_FIELD_GOSSIP_STONES] = ItemLocation::Base (0x07, 0x0C, false, "TF Gossip Stones", TERMINA_FIELD_GOSSIP_STONES, PIECE_OF_HEART, {Category::cTerminaField,Category::cGrotto, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_TERMINA_FIELD ); - locationTable[TERMINA_FIELD_BUSINESS_SCRUB] = ItemLocation::Base (0x07, 0x01, false, "TF Business Scrub", TERMINA_FIELD_BUSINESS_SCRUB, PIECE_OF_HEART, {Category::cTerminaField,Category::cGrotto,Category::cDekuScrub, Category::cVanillaHeartPiece,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_TERMINA_FIELD ); + locationTable[TERMINA_FIELD_BUSINESS_SCRUB] = ItemLocation::Base (0x07, 0x01, false, "TF Business Scrub", TERMINA_FIELD_BUSINESS_SCRUB, PIECE_OF_HEART, {Category::cTerminaField,Category::cGrotto,Category::cDekuScrub, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_TERMINA_FIELD ); locationTable[TERMINA_FIELD_PEAHAT_GROTTO_CHEST] = ItemLocation::Chest (0x07, 0x04, true, "TF Peahat Grotto Chest", TERMINA_FIELD_PEAHAT_GROTTO_CHEST, PIECE_OF_HEART, {Category::cTerminaField,Category::cGrotto, Category::cVanillaHeartPiece,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_TERMINA_FIELD ); locationTable[TERMINA_FIELD_DODONGO_GROTTO_CHEST] = ItemLocation::Chest (0x07, 0x00, true, "TF Dodongo Grotto Chest", TERMINA_FIELD_DODONGO_GROTTO_CHEST, PIECE_OF_HEART, {Category::cTerminaField,Category::cGrotto, Category::cVanillaHeartPiece, Category::cChest, Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_TERMINA_FIELD ); locationTable[TERMINA_FIELD_BIO_BABA_GROTTO_BEEHIVE] = ItemLocation::Collectable(0x07, 0x00, false, "TF Bio Baba Grotto HP", TERMINA_FIELD_BIO_BABA_GROTTO_BEEHIVE, PIECE_OF_HEART, {Category::cTerminaField,Category::cGrotto, Category::cVanillaHeartPiece, Category::cChest, Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_TERMINA_FIELD ); diff --git a/source/settings.cpp b/source/settings.cpp index 95c9489..a217fa8 100644 --- a/source/settings.cpp +++ b/source/settings.cpp @@ -295,8 +295,8 @@ namespace Settings { Option ShuffleTransformation = Option::Bool("Shuffle Transformation",{"Off", "On"}, {shuffleTransformationDesc}); Option ShufflePiecesOfHeart = Option::Bool("Shuffle Piece of Heart",{"Off", "On"}, {shufflePiecesOfHeartDesc }, OptionCategory::Toggle, 1); Option ShuffleSongs = Option::U8 ("Shuffle Songs", {"Off", "Song Locations", "Anywhere"}, {songsVanilla, songsSongLocations, songsAllLocations}, OptionCategory::Setting, 0); - Option ShuffleSoaring = Option::Bool("Shuffle Song of Soaring",{"Off", "On"}, {shuffleSoaringVanilla, shuffleSoaringRandom}, OptionCategory::Toggle, 0); - Option ShuffleSongOfTime = Option::Bool("Shuffle Song of Time", {"Off", "On"}, {songTimeVanilla, songTimeRandom}, OptionCategory::Toggle, 0); + Option ShuffleSoaring = Option::Bool("Shuffle Song of Soaring",{"Off", "On"}, {shuffleSoaringVanilla, shuffleSoaringRandom}, OptionCategory::Setting, 0); + Option ShuffleSongOfTime = Option::Bool("Shuffle Song of Time", {"Off", "On"}, {songTimeVanilla, songTimeRandom}, OptionCategory::Setting, 0); Option Shopsanity = Option::U8 ("Shopsanity", {"Off", "0", "1", "2", "3", "4", "Random"}, {shopsOff, shopsZero, shopsOne, shopsTwo, shopsThree, shopsFour, shopsRandom}); Option Tokensanity = Option::Bool("Tokensanity", {"Off", "On"}, {tokensOff, tokensAllTokens}); Option Scrubsanity = Option::U8 ("Shuffle Scrub Wares", {"Off", "Affordable", "Expensive", "Random Prices"}, {scrubsOff, scrubsAffordable, scrubsExpensive, scrubsRandomPrices}); @@ -1580,6 +1580,7 @@ namespace Settings { LanguageSelect.Hide(); LanguageSelect.SetSelectedIndex(LANGUAGE_NONE); } + //Show or Hide Shuffle Song of Soaring / Song of Time if Song Shuffle is on / off if (ShuffleSongs.Value() == u8(0)) { ShuffleSoaring.Hide(); @@ -1719,8 +1720,6 @@ namespace Settings { //If vanilla logic, we want to set all settings which unnecessarily modify vanilla behavior to off if (Logic.Is((u8)LogicSetting::LOGIC_VANILLA)) { ShuffleSongs.SetSelectedIndex(0); - ShuffleSoaring.SetSelectedIndex(0); - ShuffleSongOfTime.SetSelectedIndex(0); Shopsanity.SetSelectedIndex(0); Tokensanity.SetSelectedIndex(0); ShuffleCows.SetSelectedIndex(0); From 87d1edd89c4deda3e33093946f33083720540f4b Mon Sep 17 00:00:00 2001 From: Phlex <3514085+PhlexPlexico@users.noreply.github.com> Date: Wed, 11 Feb 2026 08:54:10 -0600 Subject: [PATCH 8/9] fix: Include two location hints for songs that were causing crashes. Format item location table to be better inline with existing items. --- source/hint_list.cpp | 4 ++ source/item_location.cpp | 146 +++++++++++++++++++-------------------- 2 files changed, 77 insertions(+), 73 deletions(-) diff --git a/source/hint_list.cpp b/source/hint_list.cpp index 5f08e89..73884ba 100644 --- a/source/hint_list.cpp +++ b/source/hint_list.cpp @@ -1439,6 +1439,8 @@ void HintTable_Init() { hintTable[SNOWHEAD_GREAT_FAIRY] = HintText::Sometimes({ Text{"the fairy of power rewards", "**FRENCH**", "**SPANISH**"}}); //Southern Swamp + hintTable[SOUTHERN_SWAMP_MUSIC_STATUE] = HintText::Exclude({ + Text{"a guiding owl teaches", "**FRENCH**", "**SPANISH**"}}); hintTable[SOUTHERN_SWAMP_KOUME] = HintText::Sometimes({ Text{"a witch rewards", "**FRENCH**", "**SPANISH**"}}); hintTable[SOUTHERN_SWAMP_KOTAKE] = HintText::Sometimes({ @@ -1683,6 +1685,8 @@ void HintTable_Init() { Text{"a lost fairy is", "**FRENCH**", "**SPANISH**"}}); hintTable[ODOLWA_HEART_CONTAINER] = HintText::Exclude({ Text{"a masked evil contains", "**FRENCH**", "**SPANISH**"}}); + hintTable[GIANTS_OATH_TO_ORDER] = HintText::Exclude({ + Text{"a gentile giant teaches", "**FRENCH**", "**SPANISH**"}}); //Snowhead Temple hintTable[SNOWHEAD_TEMPLE_FIRE_ARROW_CHEST] = HintText::Exclude({ Text{"an icy temple contains", "**FRENCH**", "**SPANISH**"}}); diff --git a/source/item_location.cpp b/source/item_location.cpp index 8479077..1068074 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -34,10 +34,10 @@ void LocationTable_Init() { //East Clock Town locationTable[E_CLOCK_TOWN_AROMA_IN_BAR] = ItemLocation::Base (0x15, 0x6F, false, "ECT Milk Bar Madame Aroma", E_CLOCK_TOWN_AROMA_IN_BAR, CHATEAU_ROMANI, {Category::cEastClockTown, Category::cDayThree, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); - locationTable[E_CLOCK_TOWN_ARCHERY_1] = ItemLocation::Base (0x20, 0x47, false, "ECT Archery #1", E_CLOCK_TOWN_ARCHERY_1, PROGRESSIVE_BOW, {Category::cEastClockTown, Category::cMinigame,Category::cDayOne, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); + locationTable[E_CLOCK_TOWN_ARCHERY_1] = ItemLocation::Base (0x20, 0x47, false, "ECT Archery #1", E_CLOCK_TOWN_ARCHERY_1, PROGRESSIVE_BOW, {Category::cEastClockTown, Category::cMinigame,Category::cDayOne, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); locationTable[E_CLOCK_TOWN_MAYOR] = ItemLocation::Base (0x12, 0x0C, false, "ECT Mayor Reward", E_CLOCK_TOWN_MAYOR, PIECE_OF_HEART, {Category::cEastClockTown, Category::cVanillaHeartPiece ,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); - locationTable[E_CLOCK_TOWN_ARCHERY_2] = ItemLocation::Base (0x20, 0x0C, false, "ECT Archery #2", E_CLOCK_TOWN_ARCHERY_2, PIECE_OF_HEART, {Category::cEastClockTown, Category::cMinigame , Category::cVanillaHeartPiece,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); - locationTable[E_CLOCK_TOWN_HONEY_DARLING_3DAYS] = ItemLocation::Base (0x11, 0x0C, false, "ECT Honey and Darling 3 Days", E_CLOCK_TOWN_HONEY_DARLING_3DAYS, PIECE_OF_HEART, {Category::cEastClockTown, Category::cMinigame , Category::cVanillaHeartPiece,Category::cDayThree, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); + locationTable[E_CLOCK_TOWN_ARCHERY_2] = ItemLocation::Base (0x20, 0x0C, false, "ECT Archery #2", E_CLOCK_TOWN_ARCHERY_2, PIECE_OF_HEART, {Category::cEastClockTown, Category::cMinigame , Category::cVanillaHeartPiece,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); + locationTable[E_CLOCK_TOWN_HONEY_DARLING_3DAYS] = ItemLocation::Base (0x11, 0x0C, false, "ECT Honey and Darling 3 Days", E_CLOCK_TOWN_HONEY_DARLING_3DAYS, PIECE_OF_HEART, {Category::cEastClockTown, Category::cMinigame , Category::cVanillaHeartPiece,Category::cDayThree, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); locationTable[E_CLOCK_TOWN_TREASURE_CHEST_GAME_GORON] = ItemLocation::Chest (0x17, 0x00, true, "ECT Treasure Chest Game (Goron)", E_CLOCK_TOWN_TREASURE_CHEST_GAME_GORON, PIECE_OF_HEART, {Category::cEastClockTown, Category::cMinigame, Category::cVanillaHeartPiece,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); locationTable[E_CLOCK_TOWN_POSTMAN_FREEDOM] = ItemLocation::Base (0x6C, 0x84, false, "ECT Postman's Freedom", E_CLOCK_TOWN_POSTMAN_FREEDOM, POSTMANS_HAT, {Category::cEastClockTown, Category::cVanillaMask,Category::cDayThree}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); locationTable[E_CLOCK_TOWN_GORMAN] = ItemLocation::Base (0x15, 0x83, false, "ECT Milk Bar Gorman", E_CLOCK_TOWN_GORMAN, CIRCUS_LEADERS_MASK, {Category::cEastClockTown, Category::cVanillaMask,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); @@ -152,8 +152,8 @@ void LocationTable_Init() { locationTable[ROAD_TO_SWAMP_GROTTO_CHEST] = ItemLocation::Chest (0x07, 0x1E, true, "Road to Southern Swamp Grotto", ROAD_TO_SWAMP_GROTTO_CHEST, RED_RUPEE, {Category::cRoadToSouthernSwamp,Category::cGrotto, Category::cChest,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); //Romani Ranch - locationTable[ROMANI_RANCH_ALIEN_DEFENSE] = ItemLocation::Base (0x35, 0x60, false, "RR Alien Defense", ROMANI_RANCH_ALIEN_DEFENSE, BOTTLE_WITH_MILK, {Category::cRomaniRanch}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ROMANI_RANCH ); - locationTable[ROMANI_RANCH_DOG_RACE] = ItemLocation::Base (0x41, 0x0C, false, "RR Dog Race", ROMANI_RANCH_DOG_RACE, PIECE_OF_HEART, {Category::cRomaniRanch,Category::cMinigame, Category::cVanillaHeartPiece,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ROMANI_RANCH ); + locationTable[ROMANI_RANCH_ALIEN_DEFENSE] = ItemLocation::Base (0x35, 0x60, false, "RR Alien Defense", ROMANI_RANCH_ALIEN_DEFENSE, BOTTLE_WITH_MILK, {Category::cRomaniRanch}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ROMANI_RANCH ); + locationTable[ROMANI_RANCH_DOG_RACE] = ItemLocation::Base (0x41, 0x0C, false, "RR Dog Race", ROMANI_RANCH_DOG_RACE, PIECE_OF_HEART, {Category::cRomaniRanch,Category::cMinigame, Category::cVanillaHeartPiece,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ROMANI_RANCH ); locationTable[ROMANI_RANCH_GROG] = ItemLocation::Base (0x42, 0x7F, false, "RR Grog", ROMANI_RANCH_GROG, BUNNY_HOOD, {Category::cRomaniRanch, Category::cVanillaMask,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ROMANI_RANCH ); locationTable[ROMANI_RANCH_CREMIA_ESCORT] = ItemLocation::Base (0x2D, 0x82, true, "RR Cremia Escort", ROMANI_RANCH_CREMIA_ESCORT, ROMANIS_MASK, {Category::cRomaniRanch, Category::cVanillaMask,Category::cDayTwo}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ROMANI_RANCH ); locationTable[ROMANI_RANCH_ROMANIS_GAME] = ItemLocation::Base (0x35, 0x6C, false, "RR Romani's Game", ROMANI_RANCH_ROMANIS_GAME, EPONAS_SONG, {Category::cRomaniRanch,Category::cSong,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ROMANI_RANCH ); @@ -174,8 +174,8 @@ void LocationTable_Init() { //Southern Swamp locationTable[SOUTHERN_SWAMP_KOUME] = ItemLocation::Base (0x57, 0x43, false, "SS Koume", SOUTHERN_SWAMP_KOUME, PICTOGRAPH_BOX, {Category::cSouthernSwamp,Category::cDayOne, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); - locationTable[SOUTHERN_SWAMP_KOTAKE] = ItemLocation::Base (0x0A, 0x59, false, "SS Kotake", SOUTHERN_SWAMP_KOTAKE, BOTTLE_WITH_RED_POTION, {Category::cSouthernSwamp, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); - locationTable[SOUTHERN_SWAMP_KOTAKE_IN_WOODS] = ItemLocation::Base (0x64, 0x59, false, "SS Mystery Woods Kotake", SOUTHERN_SWAMP_KOTAKE_IN_WOODS, BOTTLE_WITH_RED_POTION, {Category::cSouthernSwamp, Category::cAlternateCheck, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); + locationTable[SOUTHERN_SWAMP_KOTAKE] = ItemLocation::Base (0x0A, 0x59, false, "SS Kotake", SOUTHERN_SWAMP_KOTAKE, BOTTLE_WITH_RED_POTION, {Category::cSouthernSwamp, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); + locationTable[SOUTHERN_SWAMP_KOTAKE_IN_WOODS] = ItemLocation::Base (0x64, 0x59, false, "SS Mystery Woods Kotake", SOUTHERN_SWAMP_KOTAKE_IN_WOODS, BOTTLE_WITH_RED_POTION, {Category::cSouthernSwamp, Category::cAlternateCheck, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); locationTable[SOUTHERN_SWAMP_SCRUB_TRADE] = ItemLocation::Base (0x45, 0x98, true, "SS Deku Scrub Merchant Trade", SOUTHERN_SWAMP_SCRUB_TRADE, SWAMP_TITLE, {Category::cSouthernSwamp, Category::cDekuScrub,Category::cDayOne, Category::cTradeItem, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); locationTable[SOUTHERN_SWAMP_PICTOGRAPH_WINNER] = ItemLocation::Base (0x57, 0xBA, false, "SS Pictograph Contest Winner", SOUTHERN_SWAMP_PICTOGRAPH_WINNER, PIECE_OF_HEART, {Category::cSouthernSwamp, Category::cVanillaHeartPiece,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); locationTable[SOUTHERN_SWAMP_BOAT_ARCHERY] = ItemLocation::Base (0x57, 0x5A, false, "SS Boat Archery", SOUTHERN_SWAMP_BOAT_ARCHERY, EMPTY_BOTTLE1, {Category::cSouthernSwamp, Category::cMinigame, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); @@ -231,10 +231,10 @@ void LocationTable_Init() { //W Clock Town locationTable[W_CLOCK_TOWN_BOMB_BAG_BUY] = ItemLocation::Base (0x0D, 0x1B, false, "WCT Bomb Bag Purchase", W_CLOCK_TOWN_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown,Category::cDayOne, Category::cShop, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); locationTable[W_CLOCK_TOWN_BIG_BOMB_BAG_BUY] = ItemLocation::Base (0x0D, 0x1C, false, "WCT Big Bomb Bag Purchase", W_CLOCK_TOWN_BIG_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown,Category::cDayTwo, Category::cShop, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); - locationTable[W_CLOCK_TOWN_POSTMANS_GAME] = ItemLocation::Base (0x2E, 0x0C, false, "WCT Postman's Game", W_CLOCK_TOWN_POSTMANS_GAME, PIECE_OF_HEART, {Category::cWestClockTown, Category::cVanillaHeartPiece,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); - locationTable[W_CLOCK_TOWN_ROSA_SISTERS] = ItemLocation::Base (0x6D, 0x0C, false, "WCT Rosa Sisters", W_CLOCK_TOWN_ROSA_SISTERS, PIECE_OF_HEART, {Category::cWestClockTown, Category::cVanillaHeartPiece,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); - locationTable[W_CLOCK_TOWN_SWORDSMANS_SCHOOL] = ItemLocation::Base (0x54, 0x0C, false, "WCT Swordsman's School", W_CLOCK_TOWN_SWORDSMANS_SCHOOL, PIECE_OF_HEART, {Category::cWestClockTown, Category::cVanillaHeartPiece,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); - locationTable[W_CLOCK_TOWN_ALL_NIGHT_MASK_BUY] = ItemLocation::Base (0x0D, 0x7E, false, "WCT All-Night Mask Purchase", W_CLOCK_TOWN_ALL_NIGHT_MASK_BUY, ALL_NIGHT_MASK, {Category::cWestClockTown, Category::cVanillaMask,Category::cDayThree}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); + locationTable[W_CLOCK_TOWN_POSTMANS_GAME] = ItemLocation::Base (0x2E, 0x0C, false, "WCT Postman's Game", W_CLOCK_TOWN_POSTMANS_GAME, PIECE_OF_HEART, {Category::cWestClockTown, Category::cVanillaHeartPiece,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); + locationTable[W_CLOCK_TOWN_ROSA_SISTERS] = ItemLocation::Base (0x6D, 0x0C, false, "WCT Rosa Sisters", W_CLOCK_TOWN_ROSA_SISTERS, PIECE_OF_HEART, {Category::cWestClockTown, Category::cVanillaHeartPiece,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); + locationTable[W_CLOCK_TOWN_SWORDSMANS_SCHOOL] = ItemLocation::Base (0x54, 0x0C, false, "WCT Swordsman's School", W_CLOCK_TOWN_SWORDSMANS_SCHOOL, PIECE_OF_HEART, {Category::cWestClockTown, Category::cVanillaHeartPiece,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); + locationTable[W_CLOCK_TOWN_ALL_NIGHT_MASK_BUY] = ItemLocation::Base (0x0D, 0x7E, false, "WCT All-Night Mask Purchase", W_CLOCK_TOWN_ALL_NIGHT_MASK_BUY, ALL_NIGHT_MASK, {Category::cWestClockTown, Category::cVanillaMask,Category::cDayThree}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); //locationTable[W_CLOCK_TOWN_LOTTERY] = ItemLocation::Base (0x39, 0x00, true, "WCT Lottery", W_CLOCK_TOWN_LOTTERY, PURPLE_RUPEE, {Category::cWestClockTown}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); locationTable[W_CLOCK_TOWN_BOMB_SHOP_GORON] = ItemLocation::Base (0x0D, 0x34, true, "WCT Bomb Shop Goron", W_CLOCK_TOWN_BOMB_SHOP_GORON, POWDER_KEG, {Category::cWestClockTown, Category::cMerchant,Category::cDayOne, Category::cShop, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); locationTable[W_CLOCK_TOWN_CURIOSITY_BOMB_BAG] = ItemLocation::Base (0x0D, 0x00, true, "WCT Curiosity Shop Bomb Bag", W_CLOCK_TOWN_CURIOSITY_BOMB_BAG, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown, Category::cDayTwo, Category::cShop, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); @@ -246,8 +246,8 @@ void LocationTable_Init() { //Zora Cape locationTable[ZORA_CAPE_GREAT_FAIRY] = ItemLocation::Base (0x26, 0xB2, false, "ZC Great Fairy", ZORA_CAPE_GREAT_FAIRY, DOUBLE_DEFENSE, {Category::cZoraCape,Category::cFairyFountain,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_CAPE ); - locationTable[ZORA_CAPE_BEAVER_RACE_1] = ItemLocation::Base (0x4A, 0x5A, false, "ZC Beaver Race 1", ZORA_CAPE_BEAVER_RACE_1, EMPTY_BOTTLE2, {Category::cZoraCape,Category::cMinigame, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_CAPE ); - locationTable[ZORA_CAPE_BEAVER_RACE_2] = ItemLocation::Base (0x4A, 0x0C, false, "ZC Beaver Race 2", ZORA_CAPE_BEAVER_RACE_2, PIECE_OF_HEART, {Category::cZoraCape,Category::cMinigame, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_CAPE ); + locationTable[ZORA_CAPE_BEAVER_RACE_1] = ItemLocation::Base (0x4A, 0x5A, false, "ZC Beaver Race 1", ZORA_CAPE_BEAVER_RACE_1, EMPTY_BOTTLE2, {Category::cZoraCape,Category::cMinigame, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_CAPE ); + locationTable[ZORA_CAPE_BEAVER_RACE_2] = ItemLocation::Base (0x4A, 0x0C, false, "ZC Beaver Race 2", ZORA_CAPE_BEAVER_RACE_2, PIECE_OF_HEART, {Category::cZoraCape,Category::cMinigame, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_CAPE ); locationTable[ZORA_CAPE_LIKE_LIKE] = ItemLocation::Collectable(0x38, 0x00, false, "ZC Like Like HP", ZORA_CAPE_LIKE_LIKE, PIECE_OF_HEART, {Category::cZoraCape, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_ZORA_CAPE ); locationTable[ZORA_CAPE_LEDGE_NO_TREE] = ItemLocation::Chest (0x38, 0x01, true, "ZC Ledge Without Tree Chest", ZORA_CAPE_LEDGE_NO_TREE, RED_RUPEE, {Category::cZoraCape,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_ZORA_CAPE ); locationTable[ZORA_CAPE_LEDGE_WITH_TREE] = ItemLocation::Chest (0x38, 0x02, true, "ZC Ledge With Tree Chest", ZORA_CAPE_LEDGE_WITH_TREE, RED_RUPEE, {Category::cZoraCape,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_ZORA_CAPE ); @@ -366,68 +366,68 @@ void LocationTable_Init() { -------------------------------*/ //Southern Swamp Skulltla House - locationTable[SSH_MAIN_ROOM_NEAR_CEILING] = ItemLocation::SGSToken (0x27, 0x03, false, "SSH Main Room Near Ceiling", SSH_MAIN_ROOM_NEAR_CEILING, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); - locationTable[SSH_MAIN_ROOM_WATER] = ItemLocation::SGSToken (0x27, 0x23, false, "SSH Main Room Water", SSH_MAIN_ROOM_WATER, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); - locationTable[SSH_MAIN_ROOM_LOWER_LEFT_SOIL] = ItemLocation::SGSToken (0x27, 0x25, false, "SSH Main Room Lower Left Soil", SSH_MAIN_ROOM_LOWER_LEFT_SOIL, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); - locationTable[SSH_MAIN_ROOM_LOWER_RIGHT_SOIL] = ItemLocation::SGSToken (0x27, 0x31, false, "SSH Main Room Lower Right Soil", SSH_MAIN_ROOM_LOWER_RIGHT_SOIL, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); - locationTable[SSH_MAIN_ROOM_UPPER_SOIL] = ItemLocation::SGSToken (0x27, 0x2D, false, "SSH Main Room Upper Soil", SSH_MAIN_ROOM_UPPER_SOIL, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); - locationTable[SSH_MAIN_ROOM_PILLAR] = ItemLocation::SGSToken (0x27, 0x3F, false, "SSH Main Room Pillar", SSH_MAIN_ROOM_PILLAR, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); - locationTable[SSH_MAIN_ROOM_UPPER_PILLAR] = ItemLocation::SGSToken (0x27, 0x4F, false, "SSH Main Room Upper Pillar", SSH_MAIN_ROOM_UPPER_PILLAR, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); - locationTable[SSH_MAIN_ROOM_JAR] = ItemLocation::SGSToken (0x27, 0x79, false, "SSH Main Room Jar", SSH_MAIN_ROOM_JAR, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); - locationTable[SSH_MONUMENT_ROOM_CRATE_1] = ItemLocation::SGSToken (0x27, 0x29, false, "SSH Monument Room Crate 1", SSH_MONUMENT_ROOM_CRATE_1, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); - locationTable[SSH_MONUMENT_ROOM_CRATE_2] = ItemLocation::SGSToken (0x27, 0x6D, false, "SSH Monument Room Crate 2", SSH_MONUMENT_ROOM_CRATE_2, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); - locationTable[SSH_MONUMENT_ROOM_TORCH] = ItemLocation::SGSToken (0x27, 0x0B, false, "SSH Monument Room Torch", SSH_MONUMENT_ROOM_TORCH, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); - locationTable[SSH_MONUMENT_ROOM_ON_MONUMENT] = ItemLocation::SGSToken (0x27, 0x3B, false, "SSH Monument Room On Monument", SSH_MONUMENT_ROOM_ON_MONUMENT, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); - locationTable[SSH_MONUMENT_ROOM_LOWER_WALL] = ItemLocation::SGSToken (0x27, 0x37, false, "SSH Monument Room Lower Wall", SSH_MONUMENT_ROOM_LOWER_WALL, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); - locationTable[SSH_GOLD_ROOM_NEAR_CEILING] = ItemLocation::SGSToken (0x27, 0x07, false, "SSH Gold Room Near Ceiling", SSH_GOLD_ROOM_NEAR_CEILING, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); - locationTable[SSH_GOLD_ROOM_PILLAR] = ItemLocation::SGSToken (0x27, 0x13, false, "SSH Gold Room Pillar", SSH_GOLD_ROOM_PILLAR, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); - locationTable[SSH_GOLD_ROOM_BEEHIVE] = ItemLocation::SGSToken (0x27, 0x49, false, "SSH Gold Room Beehive", SSH_GOLD_ROOM_BEEHIVE, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); - locationTable[SSH_GOLD_ROOM_WALL] = ItemLocation::SGSToken (0x27, 0x67, false, "SSH Gold Room Wall", SSH_GOLD_ROOM_WALL, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); - locationTable[SSH_POT_ROOM_JAR] = ItemLocation::SGSToken (0x27, 0x15, false, "SSH Pot Room Jar", SSH_POT_ROOM_JAR, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); - locationTable[SSH_POT_ROOM_POT_1] = ItemLocation::SGSToken (0x27, 0x41, false, "SSH Pot Room Pot 1", SSH_POT_ROOM_POT_1, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); - locationTable[SSH_POT_ROOM_POT_2] = ItemLocation::SGSToken (0x27, 0x45, false, "SSH Pot Room Pot 2", SSH_POT_ROOM_POT_2, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); - locationTable[SSH_POT_ROOM_BEHIND_VINES] = ItemLocation::SGSToken (0x27, 0x53, false, "SSH Pot Room Behind Vines", SSH_POT_ROOM_BEHIND_VINES, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); - locationTable[SSH_POT_ROOM_WALL] = ItemLocation::SGSToken (0x27, 0x5B, false, "SSH Pot Room Wall", SSH_POT_ROOM_WALL, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); - locationTable[SSH_POT_ROOM_BEEHIVE_1] = ItemLocation::SGSToken (0x27, 0x5D, false, "SSH Pot Room Beehive 1", SSH_POT_ROOM_BEEHIVE_1, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); - locationTable[SSH_POT_ROOM_BEEHIVE_2] = ItemLocation::SGSToken (0x27, 0x71, false, "SSH Pot Room Beehive 2", SSH_POT_ROOM_BEEHIVE_2, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); - locationTable[SSH_TREE_ROOM_TREE_1] = ItemLocation::SGSToken (0x27, 0x76, false, "SSH Tree Room Tree 1", SSH_TREE_ROOM_TREE_1, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); - locationTable[SSH_TREE_ROOM_TREE_2] = ItemLocation::SGSToken (0x27, 0x62, false, "SSH Tree Room Tree 2", SSH_TREE_ROOM_TREE_2, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); - locationTable[SSH_TREE_ROOM_TREE_3] = ItemLocation::SGSToken (0x27, 0x56, false, "SSH Tree Room Tree 3", SSH_TREE_ROOM_TREE_3, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); - locationTable[SSH_TREE_ROOM_GRASS_1] = ItemLocation::SGSToken (0x27, 0x1F, false, "SSH Tree Room Grass 1", SSH_TREE_ROOM_GRASS_1, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); - locationTable[SSH_TREE_ROOM_GRASS_2] = ItemLocation::SGSToken (0x27, 0x1B, false, "SSH Tree Room Grass 2", SSH_TREE_ROOM_GRASS_2, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); - locationTable[SSH_TREE_ROOM_BEEHIVE] = ItemLocation::SGSToken (0x27, 0x69, false, "SSH Tree Room Beehive", SSH_TREE_ROOM_BEEHIVE, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); + locationTable[SSH_MAIN_ROOM_NEAR_CEILING] = ItemLocation::SGSToken (0x27, 0x03, false, "SSH Main Room Near Ceiling", SSH_MAIN_ROOM_NEAR_CEILING, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); + locationTable[SSH_MAIN_ROOM_WATER] = ItemLocation::SGSToken (0x27, 0x23, false, "SSH Main Room Water", SSH_MAIN_ROOM_WATER, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); + locationTable[SSH_MAIN_ROOM_LOWER_LEFT_SOIL] = ItemLocation::SGSToken (0x27, 0x25, false, "SSH Main Room Lower Left Soil", SSH_MAIN_ROOM_LOWER_LEFT_SOIL, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); + locationTable[SSH_MAIN_ROOM_LOWER_RIGHT_SOIL] = ItemLocation::SGSToken (0x27, 0x31, false, "SSH Main Room Lower Right Soil", SSH_MAIN_ROOM_LOWER_RIGHT_SOIL, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); + locationTable[SSH_MAIN_ROOM_UPPER_SOIL] = ItemLocation::SGSToken (0x27, 0x2D, false, "SSH Main Room Upper Soil", SSH_MAIN_ROOM_UPPER_SOIL, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); + locationTable[SSH_MAIN_ROOM_PILLAR] = ItemLocation::SGSToken (0x27, 0x3F, false, "SSH Main Room Pillar", SSH_MAIN_ROOM_PILLAR, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); + locationTable[SSH_MAIN_ROOM_UPPER_PILLAR] = ItemLocation::SGSToken (0x27, 0x4F, false, "SSH Main Room Upper Pillar", SSH_MAIN_ROOM_UPPER_PILLAR, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); + locationTable[SSH_MAIN_ROOM_JAR] = ItemLocation::SGSToken (0x27, 0x79, false, "SSH Main Room Jar", SSH_MAIN_ROOM_JAR, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); + locationTable[SSH_MONUMENT_ROOM_CRATE_1] = ItemLocation::SGSToken (0x27, 0x29, false, "SSH Monument Room Crate 1", SSH_MONUMENT_ROOM_CRATE_1, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); + locationTable[SSH_MONUMENT_ROOM_CRATE_2] = ItemLocation::SGSToken (0x27, 0x6D, false, "SSH Monument Room Crate 2", SSH_MONUMENT_ROOM_CRATE_2, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); + locationTable[SSH_MONUMENT_ROOM_TORCH] = ItemLocation::SGSToken (0x27, 0x0B, false, "SSH Monument Room Torch", SSH_MONUMENT_ROOM_TORCH, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); + locationTable[SSH_MONUMENT_ROOM_ON_MONUMENT] = ItemLocation::SGSToken (0x27, 0x3B, false, "SSH Monument Room On Monument", SSH_MONUMENT_ROOM_ON_MONUMENT, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); + locationTable[SSH_MONUMENT_ROOM_LOWER_WALL] = ItemLocation::SGSToken (0x27, 0x37, false, "SSH Monument Room Lower Wall", SSH_MONUMENT_ROOM_LOWER_WALL, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); + locationTable[SSH_GOLD_ROOM_NEAR_CEILING] = ItemLocation::SGSToken (0x27, 0x07, false, "SSH Gold Room Near Ceiling", SSH_GOLD_ROOM_NEAR_CEILING, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); + locationTable[SSH_GOLD_ROOM_PILLAR] = ItemLocation::SGSToken (0x27, 0x13, false, "SSH Gold Room Pillar", SSH_GOLD_ROOM_PILLAR, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); + locationTable[SSH_GOLD_ROOM_BEEHIVE] = ItemLocation::SGSToken (0x27, 0x49, false, "SSH Gold Room Beehive", SSH_GOLD_ROOM_BEEHIVE, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); + locationTable[SSH_GOLD_ROOM_WALL] = ItemLocation::SGSToken (0x27, 0x67, false, "SSH Gold Room Wall", SSH_GOLD_ROOM_WALL, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); + locationTable[SSH_POT_ROOM_JAR] = ItemLocation::SGSToken (0x27, 0x15, false, "SSH Pot Room Jar", SSH_POT_ROOM_JAR, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); + locationTable[SSH_POT_ROOM_POT_1] = ItemLocation::SGSToken (0x27, 0x41, false, "SSH Pot Room Pot 1", SSH_POT_ROOM_POT_1, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); + locationTable[SSH_POT_ROOM_POT_2] = ItemLocation::SGSToken (0x27, 0x45, false, "SSH Pot Room Pot 2", SSH_POT_ROOM_POT_2, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); + locationTable[SSH_POT_ROOM_BEHIND_VINES] = ItemLocation::SGSToken (0x27, 0x53, false, "SSH Pot Room Behind Vines", SSH_POT_ROOM_BEHIND_VINES, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); + locationTable[SSH_POT_ROOM_WALL] = ItemLocation::SGSToken (0x27, 0x5B, false, "SSH Pot Room Wall", SSH_POT_ROOM_WALL, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); + locationTable[SSH_POT_ROOM_BEEHIVE_1] = ItemLocation::SGSToken (0x27, 0x5D, false, "SSH Pot Room Beehive 1", SSH_POT_ROOM_BEEHIVE_1, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); + locationTable[SSH_POT_ROOM_BEEHIVE_2] = ItemLocation::SGSToken (0x27, 0x71, false, "SSH Pot Room Beehive 2", SSH_POT_ROOM_BEEHIVE_2, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); + locationTable[SSH_TREE_ROOM_TREE_1] = ItemLocation::SGSToken (0x27, 0x76, false, "SSH Tree Room Tree 1", SSH_TREE_ROOM_TREE_1, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); + locationTable[SSH_TREE_ROOM_TREE_2] = ItemLocation::SGSToken (0x27, 0x62, false, "SSH Tree Room Tree 2", SSH_TREE_ROOM_TREE_2, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); + locationTable[SSH_TREE_ROOM_TREE_3] = ItemLocation::SGSToken (0x27, 0x56, false, "SSH Tree Room Tree 3", SSH_TREE_ROOM_TREE_3, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); + locationTable[SSH_TREE_ROOM_GRASS_1] = ItemLocation::SGSToken (0x27, 0x1F, false, "SSH Tree Room Grass 1", SSH_TREE_ROOM_GRASS_1, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); + locationTable[SSH_TREE_ROOM_GRASS_2] = ItemLocation::SGSToken (0x27, 0x1B, false, "SSH Tree Room Grass 2", SSH_TREE_ROOM_GRASS_2, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); + locationTable[SSH_TREE_ROOM_BEEHIVE] = ItemLocation::SGSToken (0x27, 0x69, false, "SSH Tree Room Beehive", SSH_TREE_ROOM_BEEHIVE, SWAMP_SKULLTULA_TOKEN, {Category::cSouthernSwamp, Category::cSwampSkulltula,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SWAMP_SKULLTULA_HOUSE); //Oceanside Spider House - locationTable[OSH_ENTRANCE_LEFT_WALL] = ItemLocation::OGSToken (0x28, 0x37, false, "OSH Entrance Left Wall", OSH_ENTRANCE_LEFT_WALL, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); - locationTable[OSH_ENTRANCE_RIGHT_WALL] = ItemLocation::OGSToken (0x28, 0x33, false, "OSH Entrance Right Wall", OSH_ENTRANCE_RIGHT_WALL, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); - locationTable[OSH_ENTRANCE_WEB] = ItemLocation::OGSToken (0x28, 0x3F, false, "OSH Entrance Web", OSH_ENTRANCE_WEB, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); - locationTable[OSH_LIBRARY_HOLE_BEHIND_PICTURE] = ItemLocation::OGSToken (0x28, 0x0B, false, "OSH Library Hole Behind Picture", OSH_LIBRARY_HOLE_BEHIND_PICTURE, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); - locationTable[OSH_LIBRARY_HOLE_BEHIND_CABINET] = ItemLocation::OGSToken (0x28, 0x0F, false, "OSH Library Hole Behind Cabinet", OSH_LIBRARY_HOLE_BEHIND_CABINET, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); - locationTable[OSH_LIBRARY_ON_CORNER_BOOKSHELF] = ItemLocation::OGSToken (0x28, 0x13, false, "OSH Library On Corner Bookshelf", OSH_LIBRARY_ON_CORNER_BOOKSHELF, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); - locationTable[OSH_LIBRARY_CEILING_EDGE] = ItemLocation::OGSToken (0x28, 0x23, false, "OSH Library Ceiling Edge", OSH_LIBRARY_CEILING_EDGE, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); - locationTable[OSH_LIBRARY_BEHIND_BOOKCASE_1] = ItemLocation::OGSToken (0x28, 0x73, false, "OSH Library Behind Bookcase 1", OSH_LIBRARY_BEHIND_BOOKCASE_1, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); - locationTable[OSH_LIBRARY_BEHIND_BOOKCASE_2] = ItemLocation::OGSToken (0x28, 0x57, false, "OSH Library Behind Bookacse 2", OSH_LIBRARY_BEHIND_BOOKCASE_2, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); - locationTable[OSH_LIBRARY_BEHIND_PICTURE] = ItemLocation::OGSToken (0x28, 0x53, false, "OSH Library Behind Picture", OSH_LIBRARY_BEHIND_PICTURE, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); - locationTable[OSH_SECOND_ROOM_CEILING_EDGE] = ItemLocation::OGSToken (0x28, 0x17, false, "OSH Second Room Ceiling Edge", OSH_SECOND_ROOM_CEILING_EDGE, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); - locationTable[OSH_SECOND_ROOM_CEILING_PLANK] = ItemLocation::OGSToken (0x28, 0x1B, false, "OSH Second Room Ceiling Plank", OSH_SECOND_ROOM_CEILING_PLANK, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); - locationTable[OSH_SECOND_ROOM_JAR] = ItemLocation::OGSToken (0x28, 0x2D, false, "OSH Second Room Jar", OSH_SECOND_ROOM_JAR, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); - locationTable[OSH_SECOND_ROOM_WEBBED_HOLE] = ItemLocation::OGSToken (0x28, 0x3B, false, "OSH Second Room Webbed Hole", OSH_SECOND_ROOM_WEBBED_HOLE, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); - locationTable[OSH_SECOND_ROOM_WEBBED_POT] = ItemLocation::OGSToken (0x28, 0x5D, false, "OSH Second Room Webbed Pot", OSH_SECOND_ROOM_WEBBED_POT, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); - locationTable[OSH_SECOND_ROOM_UPPER_POT] = ItemLocation::OGSToken (0x28, 0x61, false, "OSH Second Room Upper Pot", OSH_SECOND_ROOM_UPPER_POT, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); - locationTable[OSH_SECOND_ROOM_BEHIND_SKULL_1] = ItemLocation::OGSToken (0x28, 0x77, false, "OSH Second Room Behind Skull 1", OSH_SECOND_ROOM_BEHIND_SKULL_1, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); - locationTable[OSH_SECOND_ROOM_BEHIND_SKULL_2] = ItemLocation::OGSToken (0x28, 0x7B, false, "OSH Second Room Behind Skull 2", OSH_SECOND_ROOM_BEHIND_SKULL_2, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); - locationTable[OSH_SECOND_ROOM_LOWER_POT] = ItemLocation::OGSToken (0x28, 0x6D, false, "OSH Second Room Lower Pot", OSH_SECOND_ROOM_LOWER_POT, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); - locationTable[OSH_STORAGE_ROOM_CEILING_WEB] = ItemLocation::OGSToken (0x28, 0x27, false, "OSH Storage Room Ceiling Web", OSH_STORAGE_ROOM_CEILING_WEB, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); - locationTable[OSH_STORAGE_ROOM_BEHIND_CRATE] = ItemLocation::OGSToken (0x28, 0x2B, false, "OSH Storage Room Behind Crate", OSH_STORAGE_ROOM_BEHIND_CRATE, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); - locationTable[OSH_STORAGE_ROOM_WALL] = ItemLocation::OGSToken (0x28, 0x07, false, "OSH Storage Room Wall", OSH_STORAGE_ROOM_WALL, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); - locationTable[OSH_STORAGE_ROOM_CRATE] = ItemLocation::OGSToken (0x28, 0x59, false, "OSH Storage Room Crate", OSH_STORAGE_ROOM_CRATE, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); - locationTable[OSH_STORAGE_ROOM_BARREL] = ItemLocation::OGSToken (0x28, 0x69, false, "OSH Storage Room Barrel", OSH_STORAGE_ROOM_BARREL, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); - locationTable[OSH_COLORED_SKULLS_CEILING_EDGE] = ItemLocation::OGSToken (0x28, 0x1F, false, "OSH Colored Skulls Ceiling Edge", OSH_COLORED_SKULLS_CEILING_EDGE, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); - locationTable[OSH_COLORED_SKULLS_CHANDELIER_1] = ItemLocation::OGSToken (0x28, 0x46, false, "OSH Colored Skulls Chandelier 1", OSH_COLORED_SKULLS_CHANDELIER_1, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); - locationTable[OSH_COLORED_SKULLS_CHANDELIER_2] = ItemLocation::OGSToken (0x28, 0x42, false, "OSH Colored Skulls Chandelier 2", OSH_COLORED_SKULLS_CHANDELIER_2, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); - locationTable[OSH_COLORED_SKULLS_CHANDELIER_3] = ItemLocation::OGSToken (0x28, 0x4A, false, "OSH Colored Skulls Chandelier 3", OSH_COLORED_SKULLS_CHANDELIER_3, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); - locationTable[OSH_COLORED_SKULLS_BEHIND_PICTURE] = ItemLocation::OGSToken (0x28, 0x4F, false, "OSH Colored Skulls Behind Picture", OSH_COLORED_SKULLS_BEHIND_PICTURE, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); - locationTable[OSH_COLORED_SKULLS_POT] = ItemLocation::OGSToken (0x28, 0x65, false, "OSH Colored Skulls Pot", OSH_COLORED_SKULLS_POT, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); + locationTable[OSH_ENTRANCE_LEFT_WALL] = ItemLocation::OGSToken (0x28, 0x37, false, "OSH Entrance Left Wall", OSH_ENTRANCE_LEFT_WALL, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); + locationTable[OSH_ENTRANCE_RIGHT_WALL] = ItemLocation::OGSToken (0x28, 0x33, false, "OSH Entrance Right Wall", OSH_ENTRANCE_RIGHT_WALL, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); + locationTable[OSH_ENTRANCE_WEB] = ItemLocation::OGSToken (0x28, 0x3F, false, "OSH Entrance Web", OSH_ENTRANCE_WEB, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); + locationTable[OSH_LIBRARY_HOLE_BEHIND_PICTURE] = ItemLocation::OGSToken (0x28, 0x0B, false, "OSH Library Hole Behind Picture", OSH_LIBRARY_HOLE_BEHIND_PICTURE, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); + locationTable[OSH_LIBRARY_HOLE_BEHIND_CABINET] = ItemLocation::OGSToken (0x28, 0x0F, false, "OSH Library Hole Behind Cabinet", OSH_LIBRARY_HOLE_BEHIND_CABINET, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); + locationTable[OSH_LIBRARY_ON_CORNER_BOOKSHELF] = ItemLocation::OGSToken (0x28, 0x13, false, "OSH Library On Corner Bookshelf", OSH_LIBRARY_ON_CORNER_BOOKSHELF, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); + locationTable[OSH_LIBRARY_CEILING_EDGE] = ItemLocation::OGSToken (0x28, 0x23, false, "OSH Library Ceiling Edge", OSH_LIBRARY_CEILING_EDGE, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); + locationTable[OSH_LIBRARY_BEHIND_BOOKCASE_1] = ItemLocation::OGSToken (0x28, 0x73, false, "OSH Library Behind Bookcase 1", OSH_LIBRARY_BEHIND_BOOKCASE_1, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); + locationTable[OSH_LIBRARY_BEHIND_BOOKCASE_2] = ItemLocation::OGSToken (0x28, 0x57, false, "OSH Library Behind Bookacse 2", OSH_LIBRARY_BEHIND_BOOKCASE_2, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); + locationTable[OSH_LIBRARY_BEHIND_PICTURE] = ItemLocation::OGSToken (0x28, 0x53, false, "OSH Library Behind Picture", OSH_LIBRARY_BEHIND_PICTURE, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); + locationTable[OSH_SECOND_ROOM_CEILING_EDGE] = ItemLocation::OGSToken (0x28, 0x17, false, "OSH Second Room Ceiling Edge", OSH_SECOND_ROOM_CEILING_EDGE, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); + locationTable[OSH_SECOND_ROOM_CEILING_PLANK] = ItemLocation::OGSToken (0x28, 0x1B, false, "OSH Second Room Ceiling Plank", OSH_SECOND_ROOM_CEILING_PLANK, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); + locationTable[OSH_SECOND_ROOM_JAR] = ItemLocation::OGSToken (0x28, 0x2D, false, "OSH Second Room Jar", OSH_SECOND_ROOM_JAR, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); + locationTable[OSH_SECOND_ROOM_WEBBED_HOLE] = ItemLocation::OGSToken (0x28, 0x3B, false, "OSH Second Room Webbed Hole", OSH_SECOND_ROOM_WEBBED_HOLE, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); + locationTable[OSH_SECOND_ROOM_WEBBED_POT] = ItemLocation::OGSToken (0x28, 0x5D, false, "OSH Second Room Webbed Pot", OSH_SECOND_ROOM_WEBBED_POT, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); + locationTable[OSH_SECOND_ROOM_UPPER_POT] = ItemLocation::OGSToken (0x28, 0x61, false, "OSH Second Room Upper Pot", OSH_SECOND_ROOM_UPPER_POT, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); + locationTable[OSH_SECOND_ROOM_BEHIND_SKULL_1] = ItemLocation::OGSToken (0x28, 0x77, false, "OSH Second Room Behind Skull 1", OSH_SECOND_ROOM_BEHIND_SKULL_1, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); + locationTable[OSH_SECOND_ROOM_BEHIND_SKULL_2] = ItemLocation::OGSToken (0x28, 0x7B, false, "OSH Second Room Behind Skull 2", OSH_SECOND_ROOM_BEHIND_SKULL_2, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); + locationTable[OSH_SECOND_ROOM_LOWER_POT] = ItemLocation::OGSToken (0x28, 0x6D, false, "OSH Second Room Lower Pot", OSH_SECOND_ROOM_LOWER_POT, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); + locationTable[OSH_STORAGE_ROOM_CEILING_WEB] = ItemLocation::OGSToken (0x28, 0x27, false, "OSH Storage Room Ceiling Web", OSH_STORAGE_ROOM_CEILING_WEB, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); + locationTable[OSH_STORAGE_ROOM_BEHIND_CRATE] = ItemLocation::OGSToken (0x28, 0x2B, false, "OSH Storage Room Behind Crate", OSH_STORAGE_ROOM_BEHIND_CRATE, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); + locationTable[OSH_STORAGE_ROOM_WALL] = ItemLocation::OGSToken (0x28, 0x07, false, "OSH Storage Room Wall", OSH_STORAGE_ROOM_WALL, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); + locationTable[OSH_STORAGE_ROOM_CRATE] = ItemLocation::OGSToken (0x28, 0x59, false, "OSH Storage Room Crate", OSH_STORAGE_ROOM_CRATE, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); + locationTable[OSH_STORAGE_ROOM_BARREL] = ItemLocation::OGSToken (0x28, 0x69, false, "OSH Storage Room Barrel", OSH_STORAGE_ROOM_BARREL, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); + locationTable[OSH_COLORED_SKULLS_CEILING_EDGE] = ItemLocation::OGSToken (0x28, 0x1F, false, "OSH Colored Skulls Ceiling Edge", OSH_COLORED_SKULLS_CEILING_EDGE, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); + locationTable[OSH_COLORED_SKULLS_CHANDELIER_1] = ItemLocation::OGSToken (0x28, 0x46, false, "OSH Colored Skulls Chandelier 1", OSH_COLORED_SKULLS_CHANDELIER_1, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); + locationTable[OSH_COLORED_SKULLS_CHANDELIER_2] = ItemLocation::OGSToken (0x28, 0x42, false, "OSH Colored Skulls Chandelier 2", OSH_COLORED_SKULLS_CHANDELIER_2, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); + locationTable[OSH_COLORED_SKULLS_CHANDELIER_3] = ItemLocation::OGSToken (0x28, 0x4A, false, "OSH Colored Skulls Chandelier 3", OSH_COLORED_SKULLS_CHANDELIER_3, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); + locationTable[OSH_COLORED_SKULLS_BEHIND_PICTURE] = ItemLocation::OGSToken (0x28, 0x4F, false, "OSH Colored Skulls Behind Picture", OSH_COLORED_SKULLS_BEHIND_PICTURE, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); + locationTable[OSH_COLORED_SKULLS_POT] = ItemLocation::OGSToken (0x28, 0x65, false, "OSH Colored Skulls Pot", OSH_COLORED_SKULLS_POT, OCEANSIDE_SKULLTULA_TOKEN, {Category::cGreatBayCoast, Category::cOceanSkulltula,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_OCEAN_SKULLTULA_HOUSE); /*-------------------------------- --Stray Fairies--- From d7fc6ff48fe6b5c792868116378390eaa04fd276 Mon Sep 17 00:00:00 2001 From: Phlex <3514085+PhlexPlexico@users.noreply.github.com> Date: Wed, 11 Feb 2026 08:56:16 -0600 Subject: [PATCH 9/9] Update Z3DR subrepo point. Update version number. --- .gitmodules | 2 +- Z3DR | 2 +- source/include/version.hpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitmodules b/.gitmodules index 679158b..12a5f3b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "Z3DR"] path = Z3DR url = https://github.com/Z3DR/mm3dr.git - branch = Songsanity-StartingInventory + branch = dev diff --git a/Z3DR b/Z3DR index d1cd1fb..f8f617f 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit d1cd1fb264051bc83e7d0664d6af2ec57ee070c9 +Subproject commit f8f617feb4c55d6838579fdd0429266db7ec36c1 diff --git a/source/include/version.hpp b/source/include/version.hpp index a4fc544..fae44c5 100644 --- a/source/include/version.hpp +++ b/source/include/version.hpp @@ -1,4 +1,4 @@ #pragma once -#define RANDOMIZER_VERSION "v1.4.4" +#define RANDOMIZER_VERSION "v1.5.0" #define COMMIT_NUMBER "develop"