Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitmodules
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
[submodule "Z3DR"]
path = Z3DR
url = https://github.com/Z3DR/mm3dr.git
branch = dev
branch = dev
29 changes: 28 additions & 1 deletion source/fill.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -873,6 +873,20 @@ 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<ItemKey> 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<LocationKey> ocarinaLocations = FilterFromPool(allLocations, []( const LocationKey loc) {return Location(loc)->IsCategory(Category::cNoOcarinaStart);});
std::vector<ItemKey> SoTItem = FilterAndEraseFromPool(ItemPool, [](const ItemKey i) { return ItemTable(i).GetHintKey() == SONG_OF_TIME; });
NoRepeatOnTokens = true;
AssumedFill(SoTItem, ocarinaLocations, true);
NoRepeatOnTokens = false;
}
//If Ocarina is shuffled place that first
if (StartingOcarina.Value<u8>() == 0) {
//Get acceptable Ocarina Locations
Expand All @@ -883,6 +897,19 @@ int Fill() {
AssumedFill(ocarinaItem, ocarinaLocations, true);
NoRepeatOnTokens = false;
}
//If Songs are at song locations get all song locations and place them there
if (ShuffleSongs.Value<u8>() == u8(1)){
std::vector<LocationKey> 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 (ShuffleGFRewards.Is((u8)GreatFairyRewardShuffleSetting::GFREWARDSHUFFLE_ALL_GREAT_FARIES)){
//get GF locations
Expand Down Expand Up @@ -922,7 +949,7 @@ int Fill() {
//std::vector<ItemKey> 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,
Expand Down
14 changes: 13 additions & 1 deletion source/hint_list.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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**"}
Expand Down Expand Up @@ -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({
Expand Down Expand Up @@ -1431,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({
Expand Down Expand Up @@ -1675,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**"}});
Expand Down
1 change: 1 addition & 0 deletions source/include/keys.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
1 change: 1 addition & 0 deletions source/include/logic.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
3 changes: 3 additions & 0 deletions source/include/setting_descriptions.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
3 changes: 3 additions & 0 deletions source/include/settings.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion source/include/version.hpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#pragma once

#define RANDOMIZER_VERSION "v1.4.4"
#define RANDOMIZER_VERSION "v1.5.0"
#define COMMIT_NUMBER "develop"
22 changes: 11 additions & 11 deletions source/item_list.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 );
Expand Down
Loading