Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
ed92bb7
Enable freestanding items other than heart pieces and keys
boomshroom Aug 8, 2024
edcf859
Add option to disable freestanding rupee & heart shuffle
boomshroom Aug 8, 2024
a535f59
Add items to pool
boomshroom Aug 8, 2024
fb8e2bd
Actually add shuffle setting
boomshroom Aug 8, 2024
9c3827e
Define overworld locations
boomshroom Aug 8, 2024
f5bf045
Add logic for overworld freestanding checks
boomshroom Aug 8, 2024
0cac9ca
Add freestanding items for child dungeons.
boomshroom Aug 8, 2024
169580e
Add checks for Ice Cavern and Bottom of the Well
boomshroom Aug 13, 2024
ae17244
Add checks for Forest Temple and Gerudo Training Grounds
boomshroom Aug 14, 2024
2a58e47
Add checks for Fire Temple and Water Temple
boomshroom Aug 14, 2024
2f463c1
Add Shadow Temple checks
boomshroom Aug 15, 2024
ead0bba
Define Spirit Temple and Ganon's Castle hearts
boomshroom Aug 15, 2024
f8c438e
Add remaining checks to dungeon definitions
boomshroom Aug 15, 2024
00b8c86
Fix missing logic
boomshroom Aug 15, 2024
5ec64f8
Merge remote-tracking branch 'origin/develop-rando' into shuffle_free…
boomshroom Aug 15, 2024
066004a
Add freestanding checks to Save Flags Editor
boomshroom Aug 16, 2024
7affcb4
Fix flags for Zora Fountain underwater rupees
boomshroom Aug 16, 2024
0075f26
Add option to enable freestanding shuffle for either dungeons or over…
boomshroom Aug 16, 2024
6dfb5c7
Add missing MQ checks and fix mac & windows compile error
boomshroom Aug 16, 2024
bcc10ea
Improve description and add hint text
boomshroom Aug 16, 2024
56a8f2d
Merge remote-tracking branch 'origin/develop-rando' into shuffle_free…
boomshroom Aug 18, 2024
298cec2
Update logic for Bombchu fixes
boomshroom Aug 18, 2024
54cc685
Merge remote-tracking branch 'origin/develop-rando' into shuffle_free…
boomshroom Aug 23, 2024
1e9092c
Add missing Spirit Temple MQ hearts
boomshroom Aug 23, 2024
5819cd4
Add missing settings entries
boomshroom Aug 28, 2024
e430514
Merge remote-tracking branch 'origin/develop-rando' into shuffle_free…
boomshroom Aug 29, 2024
b50d14d
Actually add Forest Temple trick to the tricks menu.
boomshroom Aug 29, 2024
702578a
freestanding_shuffle merge
Caladius Sep 19, 2024
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
1 change: 0 additions & 1 deletion soh/include/z64actor.h
Original file line number Diff line number Diff line change
Expand Up @@ -291,7 +291,6 @@ typedef struct EnItem00 {
/* 0x15C */ f32 scale;
/* 0x160 */ ColliderCylinder collider;
// #region SOH [Randomizer]
GetItemEntry randoGiEntry;
RandomizerCheck randoCheck;
RandomizerInf randoInf;
/* */ s16 ogParams;
Expand Down
2 changes: 1 addition & 1 deletion soh/include/z64save.h
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@ typedef struct {
// #endregion
// #region SOH [Randomizer]
// Upstream TODO: Move these to their own struct or name to more obviously specific to Randomizer
/* */ u16 randomizerInf[RAND_INF_MAX / 16];
/* */ u16 randomizerInf[(RAND_INF_MAX + 15) / 16];
/* */ u8 mqDungeonCount;
/* */ u16 adultTradeItems;
/* */ u8 triforcePiecesCollected;
Expand Down
177 changes: 176 additions & 1 deletion soh/soh/Enhancements/debugger/debugSaveEditor.h

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions soh/soh/Enhancements/randomizer/3drando/category.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ enum class Category {
cAdultTrade,
cPot,
cBeehive,
cFreestanding,
};

enum class OptionCategory {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() {
/*french*/ "Selon moi, la #peste Mojo dans l'Arbre Mojo# vend #[[1]]#.", {QM_RED, QM_GREEN}));
// /*spanish*/ Según dicen, un #deku del Gran Árbol Deku# vende #[[1]]#.

hintTextTable[RHT_DEKU_TREE_HEART] = HintText(CustomMessage("They say that a #heart in the Deku Tree# hides #[[1]]#.",
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));

/*--------------------------
| DODONGOS CAVERN |
---------------------------*/
Expand Down Expand Up @@ -279,6 +283,10 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));

hintTextTable[RHT_DODONGOS_CAVERN_HEART] = HintText(CustomMessage("They say that a #heart in Dodongo's Cavern# hides #[[1]]#.",
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));

/*--------------------------
| JABU JABUS BELLY |
---------------------------*/
Expand Down Expand Up @@ -430,6 +438,15 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));


hintTextTable[RHT_JABU_JABU_RUPEE] = HintText(CustomMessage("They say that #underwater in Jabu-Jabu's Belly# lies #[[1]]#.",
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));

hintTextTable[RHT_JABU_JABU_HEART] = HintText(CustomMessage("They say that near a #central lift in Jabu-Jabu's Belly# lies #[[1]]#.",
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));

/*--------------------------
| FOREST TEMPLE |
---------------------------*/
Expand Down Expand Up @@ -657,6 +674,11 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The
/*french*/ "", {QM_RED, QM_GREEN}));



hintTextTable[RHT_FOREST_TEMPLE_HEART] = HintText(CustomMessage("They say that a #heart in the Forest Temple# hides #[[1]]#.",
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));

/*--------------------------
| FIRE TEMPLE |
---------------------------*/
Expand Down Expand Up @@ -849,6 +871,10 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));

hintTextTable[RHT_FIRE_TEMPLE_HEART] = HintText(CustomMessage("They say that a #heart in the Fire Temple# hides #[[1]]#.",
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));

/*--------------------------
| WATER TEMPLE |
---------------------------*/
Expand Down Expand Up @@ -980,6 +1006,10 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));

hintTextTable[RHT_WATER_TEMPLE_HEART] = HintText(CustomMessage("They say that in a #river in the Water Temple# lies #[[1]]#.",
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));

/*--------------------------
| SPIRIT TEMPLE |
---------------------------*/
Expand Down Expand Up @@ -1217,6 +1247,14 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));

hintTextTable[RHT_SPIRIT_TEMPLE_HEART] = HintText(CustomMessage("They say that on a #small platform# in the Spirit Temple lies #[[1]]#.",
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));

hintTextTable[RHT_SPIRIT_TEMPLE_MQ_HEART] = HintText(CustomMessage("They say that guarded by a #ring of flame# in the Spirit Temple is #[[1]]#.",
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));

/*--------------------------
| SHADOW TEMPLE |
---------------------------*/
Expand Down Expand Up @@ -1464,6 +1502,10 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));

hintTextTable[RHT_SHADOW_TEMPLE_HEART] = HintText(CustomMessage("They say that a #heart in the Shadow Temple# hides #[[1]]#.",
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));

/*--------------------------
| BOTTOM OF THE WELL |
---------------------------*/
Expand Down Expand Up @@ -1586,6 +1628,14 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));

hintTextTable[RHT_BOTTOM_OF_THE_WELL_HEART] = HintText(CustomMessage("They say that a #heart within the well# hides #[[1]]#.",
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));

hintTextTable[RHT_BOTTOM_OF_THE_WELL_RUPEE] = HintText(CustomMessage("They say that a #hidden path through the floor# the well# leads to #[[1]]#.",
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));

/*--------------------------
| ICE CAVERN |
---------------------------*/
Expand Down Expand Up @@ -1663,6 +1713,14 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th
/*german*/ "",
/*french*/ "", { QM_RED, QM_GREEN }));

hintTextTable[RHT_ICE_CAVERN_HEART] = HintText(CustomMessage("They say that atop on a #frozen pillar# lies #[[1]]#.",
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));

hintTextTable[RHT_ICE_CAVERN_RUPEE] = HintText(CustomMessage("They say that a #rupee in a frozen cavern# hides #[[1]]#.",
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));

/*--------------------------
| GERUDO TRAINING GROUNDS |
---------------------------*/
Expand Down Expand Up @@ -1841,6 +1899,10 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th
/*french*/ "Selon moi, #derrière un bloc argent# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN}));
// /*spanish*/ Según dicen, una #hazaña de fuerza# premia a las bandidas con #[[1]]#.

hintTextTable[RHT_GERUDO_TRAINING_GROUNDS_HEART] = HintText(CustomMessage("They say that a watching a #trial with Dinalfos# is #[[1]]#.",
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));

/*--------------------------
| GANONS CASTLE |
---------------------------*/
Expand Down Expand Up @@ -2037,5 +2099,10 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th
hintTextTable[RHT_POT_GANONS_CASTLE] = HintText(CustomMessage("They say that a #pot in Ganon's Castle# contains #[[1]]#.",
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));

hintTextTable[RHT_GANONS_CASTLE_HEART] = HintText(CustomMessage("They say that a #heart in Ganon's Castle# hides #[[1]]#.",
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -1539,5 +1539,65 @@ void StaticData::HintTable_Init_Exclude_Overworld() {
hintTextTable[RHT_POT_HYRULE_CASTLE] = HintText(CustomMessage("They say that a #pot in Hyrule Castle# contains #[[1]]#.",
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));
hintTextTable[RHT_KOKIRI_FOREST_RUPEE] = HintText(CustomMessage("They say that a rupee in a #tranquil forest# hides #[[1]]#.",
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));
// /*spanish*/
hintTextTable[RHT_KOKIRI_FOREST_HEART] = HintText(CustomMessage("They say that a heart in a #tranquil forest# hides #[[1]]#.",
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));
// /*spanish*/
hintTextTable[RHT_SARIAS_HOUSE_HEART] = HintText(CustomMessage("They say that a heart in a #dear friend's home# hides #[[1]]#.",
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));
// /*spanish*/
hintTextTable[RHT_LOST_WOODS_RUPEE] = HintText(CustomMessage("They say that under a #boulder in the woods# lies #[[1]]#.",
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));
// /*spanish*/
hintTextTable[RHT_LOST_WOODS_SHORTCUT_RUPEE] = HintText(CustomMessage("They say that in a #pool of water in the woods# lies #[[1]]#.",
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));
// /*spanish*/
hintTextTable[RHT_LAKE_HYLIA_RUPEE] = HintText(CustomMessage("They say that just off the #coast of a lake# lies #[[1]]#.",
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));
// /*spanish*/
hintTextTable[RHT_LABORATORY_RUPEE] = HintText(CustomMessage("They say that at the #bottom of a tank# lies #[[1]]#.",
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));
// /*spanish*/
hintTextTable[RHT_DAMPES_GRAVE_RUPEE] = HintText(CustomMessage("They say that within a #quick-footed spirit's grave# lies #[[1]]#.",
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));
// /*spanish*/
hintTextTable[RHT_GERUDO_VALLEY_GROTTO_RUPEE] = HintText(CustomMessage("They say that an Octarok in an #underground spring# guards #[[1]]#.",
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));
// /*spanish*/
hintTextTable[RHT_DEATH_MOUNTAIN_TRAIL_RUPEE] = HintText(CustomMessage("They say that beneath a boulder on a #mountain's cliffside# lies #[[1]]#.",
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));
// /*spanish*/
hintTextTable[RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_HEART] = HintText(CustomMessage("They say that accompanying a #cow in a small cave# is #[[1]]#.",
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));
// /*spanish*/
hintTextTable[RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_RUPEE] = HintText(CustomMessage("They say that accompanying a #cow in a small cave# is #[[1]]#.",
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));
// /*spanish*/
hintTextTable[RHT_DEATH_MOUNTAIN_CRATER_RUPEE] = HintText(CustomMessage("They say that on a #small platform suspended above lava# lies #[[1]]#.",
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));
// /*spanish*/
hintTextTable[RHT_ZORAS_RIVER_WATERFALL_RUPEE] = HintText(CustomMessage("They say that beneath a #waterfall feeding a narrow river# lies #[[1]]#.",
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));
// /*spanish*/
hintTextTable[RHT_ZORAS_FOUNTAIN_RUPEE] = HintText(CustomMessage("They say that at the bottom of a #partially-frozen spring# lies #[[1]]#.",
/*german*/ "",
/*french*/ "", {QM_RED, QM_GREEN}));
// /*spanish*/
}
}
26 changes: 26 additions & 0 deletions soh/soh/Enhancements/randomizer/3drando/item_pool.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -618,6 +618,30 @@ static void PlaceVanillaOverworldFish() {
}
}

static void PlaceFreestandingItems() {
auto ctx = Rando::Context::GetInstance();
auto option = ctx->GetOption(RSK_SHUFFLE_FREESTANDING);
for (RandomizerCheck loc : ctx->GetLocations(Rando::StaticData::overworldLocations, Category::cFreestanding)) {
RandomizerGet vanillaItem = Rando::StaticData::GetLocation(loc)->GetVanillaItem();
if (option.Is(RO_TOKENSANITY_OVERWORLD) || option.Is(RO_TOKENSANITY_ALL)) {
AddItemToMainPool(vanillaItem);
} else {
ctx->PlaceItemInLocation(loc, vanillaItem, false, true);
}
}

for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) {
for (RandomizerCheck loc : ctx->GetLocations(dungeon->GetDungeonLocations(), Category::cFreestanding)) {
RandomizerGet vanillaItem = Rando::StaticData::GetLocation(loc)->GetVanillaItem();
if (option.Is(RO_TOKENSANITY_DUNGEONS) || option.Is(RO_TOKENSANITY_ALL)) {
AddItemToMainPool(vanillaItem);
} else {
ctx->PlaceItemInLocation(loc, vanillaItem, false, true);
}
}
}
}

static void SetScarceItemPool() {
ReplaceMaxItem(RG_PROGRESSIVE_BOMBCHUS, 3);
ReplaceMaxItem(RG_BOMBCHU_5, 1);
Expand Down Expand Up @@ -1236,6 +1260,8 @@ void GenerateItemPool() {
PlaceVanillaDekuScrubItems();
}

PlaceFreestandingItems();

AddItemsToPool(ItemPool, alwaysItems);
AddItemsToPool(ItemPool, dungeonRewards);

Expand Down
Loading