diff --git a/soh/assets/custom/objects/object_boss_soul/BarkOrHorns b/soh/assets/custom/objects/object_boss_soul/BarkOrHorns
new file mode 100644
index 0000000000..d546ce9bdd
Binary files /dev/null and b/soh/assets/custom/objects/object_boss_soul/BarkOrHorns differ
diff --git a/soh/assets/custom/objects/object_boss_soul/LightNoise b/soh/assets/custom/objects/object_boss_soul/LightNoise
new file mode 100644
index 0000000000..73bcf2a59c
Binary files /dev/null and b/soh/assets/custom/objects/object_boss_soul/LightNoise differ
diff --git a/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_vtx_cull b/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_vtx_cull
new file mode 100644
index 0000000000..0e8c716c31
--- /dev/null
+++ b/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_vtx_cull
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_boss_soul/heart1 b/soh/assets/custom/objects/object_boss_soul/heart1
new file mode 100644
index 0000000000..1fdc62cbd8
Binary files /dev/null and b/soh/assets/custom/objects/object_boss_soul/heart1 differ
diff --git a/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Black b/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Black
new file mode 100644
index 0000000000..03ecd61f55
--- /dev/null
+++ b/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Black
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Horns b/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Horns
new file mode 100644
index 0000000000..28fdc0d1b3
--- /dev/null
+++ b/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Horns
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Jewel b/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Jewel
new file mode 100644
index 0000000000..dbe5cfd531
--- /dev/null
+++ b/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Jewel
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Skull1 b/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Skull1
new file mode 100644
index 0000000000..c32c4ee240
--- /dev/null
+++ b/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Skull1
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_f3dlite_material b/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_f3dlite_material
new file mode 100644
index 0000000000..a3dd769f69
--- /dev/null
+++ b/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_f3dlite_material
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/soh/Enhancements/presets.h b/soh/soh/Enhancements/presets.h
index 965fa26782..78e754d582 100644
--- a/soh/soh/Enhancements/presets.h
+++ b/soh/soh/Enhancements/presets.h
@@ -408,7 +408,6 @@ const std::vector randomizerCvars = {
CVAR_RANDOMIZER_SETTING("DoorOfTime"),
CVAR_RANDOMIZER_SETTING("DungeonCount"),
CVAR_RANDOMIZER_SETTING("EnableBombchuDrops"),
- CVAR_RANDOMIZER_SETTING("EnableGlitchCutscenes"),
CVAR_RANDOMIZER_SETTING("FishingPoleHint"),
CVAR_RANDOMIZER_SETTING("Fishsanity"),
CVAR_RANDOMIZER_SETTING("FishsanityAgeSplit"),
@@ -1200,7 +1199,6 @@ const std::vector hellModePresetEntries = {
PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("CuccosToReturn"), 1),
PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("DoorOfTime"), RO_DOOROFTIME_OPEN),
PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("EnableBombchuDrops"), 1),
- PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("EnableGlitchCutscenes"), 1),
PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ClosedForest"), RO_CLOSED_FOREST_OFF),
PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GanonTrial"), RO_GANONS_TRIALS_SET_NUMBER),
PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GanonTrialCount"), 6),
diff --git a/soh/soh/Enhancements/randomizer/entrance.cpp b/soh/soh/Enhancements/randomizer/entrance.cpp
index 910467e81f..876b22a7f5 100644
--- a/soh/soh/Enhancements/randomizer/entrance.cpp
+++ b/soh/soh/Enhancements/randomizer/entrance.cpp
@@ -20,15 +20,11 @@ void Entrance::SetCondition(ConditionFn newCondition) {
}
bool Entrance::GetConditionsMet() const {
- auto ctx = Rando::Context::GetInstance();
- if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_NO_LOGIC) || ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_VANILLA)) {
- return true;
- } else if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHLESS)) {
- return condition_function();
- } else if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHED)) {
- return condition_function();
- }
- return false;
+ auto ctx = Rando::Context::GetInstance();
+ if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHLESS)) {
+ return condition_function();
+ }
+ return true;
}
std::string Entrance::to_string() const {
diff --git a/soh/soh/Enhancements/randomizer/location_access.h b/soh/soh/Enhancements/randomizer/location_access.h
index 3af0a498d8..986d08d6a3 100644
--- a/soh/soh/Enhancements/randomizer/location_access.h
+++ b/soh/soh/Enhancements/randomizer/location_access.h
@@ -23,14 +23,10 @@ class EventAccess {
bool ConditionsMet() const {
auto ctx = Rando::Context::GetInstance();
- if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_NO_LOGIC) || ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_VANILLA)) {
- return true;
- } else if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHLESS)) {
- return condition_function();
- } else if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHED)) {
+ if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHLESS)) {
return condition_function();
}
- return false;
+ return true;
}
bool CheckConditionAtAgeTime(bool& age, bool& time) {
@@ -71,14 +67,10 @@ class LocationAccess {
bool GetConditionsMet() const {
auto ctx = Rando::Context::GetInstance();
- if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_NO_LOGIC) || ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_VANILLA)) {
- return true;
- } else if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHLESS)) {
- return condition_function();
- } else if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHED)) {
+ if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHLESS)) {
return condition_function();
}
- return false;
+ return true;
}
bool CheckConditionAtAgeTime(bool& age, bool& time) const;
diff --git a/soh/soh/Enhancements/randomizer/option_descriptions.cpp b/soh/soh/Enhancements/randomizer/option_descriptions.cpp
index ee59b1be4e..8abdd26346 100644
--- a/soh/soh/Enhancements/randomizer/option_descriptions.cpp
+++ b/soh/soh/Enhancements/randomizer/option_descriptions.cpp
@@ -698,9 +698,6 @@ void Settings::CreateOptionDescriptions() {
"location is reachable. When disabled, only "
"required items and locations to beat the game "
"will be guaranteed reachable.";
- mOptionDescriptions[RSK_ENABLE_GLITCH_CUTSCENES] =
- "The cutscenes of the Poes in Forest Temple and Darunia in Fire Temple will not be skipped. "
- "These cutscenes are only useful for glitched gameplay and can be safely skipped otherwise.";
mOptionDescriptions[RSK_SHUFFLE_BOSS_SOULS] = "Shuffles 8 boss souls (one for each blue warp dungeon). A boss will not appear until you collect its respective soul."
"\n\"On + Ganon\" will also hide Ganon and Ganondorf behind a boss soul.";
}
diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp
index 2d0ceb48a0..1f44fe2f30 100644
--- a/soh/soh/Enhancements/randomizer/randomizer.cpp
+++ b/soh/soh/Enhancements/randomizer/randomizer.cpp
@@ -2182,13 +2182,6 @@ void RandomizerSettingsWindow::DrawElement() {
ImGui::SameLine();
ImGui::TextColored(ImVec4(1.0f, 0.0f, 0.0f, 1.0f), "Heads up! This will disable all rando settings except for entrance shuffle and starter items");
}
-
- UIWidgets::PaddedSeparator();
-
- // Enable Glitch-Useful Cutscenes
- if (mSettings->GetOption(RSK_ENABLE_GLITCH_CUTSCENES).RenderImGui()) {
- mNeedsUpdate = true;
- }
ImGui::PopItemWidth();
ImGui::EndTable();
}
diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h
index 811e0998be..34f89c2409 100644
--- a/soh/soh/Enhancements/randomizer/randomizerTypes.h
+++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h
@@ -5131,7 +5131,6 @@ typedef enum {
RSK_SKIP_EPONA_RACE,
RSK_COMPLETE_MASK_QUEST,
RSK_SKIP_SCARECROWS_SONG,
- RSK_ENABLE_GLITCH_CUTSCENES,
RSK_SKULLS_SUNS_SONG,
RSK_SHUFFLE_ADULT_TRADE,
RSK_SHUFFLE_MERCHANTS,
@@ -5575,7 +5574,6 @@ typedef enum {
// Logic (glitchless/no logic)
typedef enum {
RO_LOGIC_GLITCHLESS,
- RO_LOGIC_GLITCHED,
RO_LOGIC_NO_LOGIC,
RO_LOGIC_VANILLA,
} RandoOptionLogic;
diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp
index b29cccf97b..13acce622b 100644
--- a/soh/soh/Enhancements/randomizer/settings.cpp
+++ b/soh/soh/Enhancements/randomizer/settings.cpp
@@ -250,6 +250,8 @@ void Settings::CreateOptions() {
mOptions[RSK_KEYRINGS_BOTTOM_OF_THE_WELL] = Option::U8("Bottom of the Well Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsBottomOfTheWell"), "", WidgetType::TristateCheckbox, 0);
mOptions[RSK_KEYRINGS_GTG] = Option::U8("Gerudo Training Ground Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsGTG"), "", WidgetType::TristateCheckbox, 0);
mOptions[RSK_KEYRINGS_GANONS_CASTLE] = Option::U8("Ganon's Castle Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsGanonsCastle"), "", WidgetType::TristateCheckbox, 0);
+ //Dummied out due to redundancy with TimeSavers.SkipChildStealth until such a time that logic needs to consider child stealth e.g. because it's freestanding checks are added to freestanding shuffle.
+ //To undo this dummying, readd this setting to an OptionGroup so it appears in the UI, then edit the timesaver check hooks to look at this, and the timesaver setting to lock itself as needed.
mOptions[RSK_SKIP_CHILD_STEALTH] = Option::Bool("Skip Child Stealth", {"Don't Skip", "Skip"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("SkipChildStealth"), mOptionDescriptions[RSK_SKIP_CHILD_STEALTH], WidgetType::Checkbox, RO_GENERIC_DONT_SKIP);
mOptions[RSK_SKIP_CHILD_ZELDA] = Option::Bool("Skip Child Zelda", {"Don't Skip", "Skip"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("SkipChildZelda"), mOptionDescriptions[RSK_SKIP_CHILD_ZELDA], WidgetType::Checkbox, RO_GENERIC_DONT_SKIP);
mOptions[RSK_SKIP_EPONA_RACE] = Option::Bool("Skip Epona Race", {"Don't Skip", "Skip"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("SkipEponaRace"), mOptionDescriptions[RSK_SKIP_EPONA_RACE], WidgetType::Checkbox, RO_GENERIC_DONT_SKIP);
@@ -257,7 +259,6 @@ void Settings::CreateOptions() {
mOptions[RSK_BIG_POE_COUNT] = Option::U8("Big Poe Target Count", {NumOpts(1, 10)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("BigPoeTargetCount"), mOptionDescriptions[RSK_BIG_POE_COUNT], WidgetType::Slider, 9);
mOptions[RSK_CUCCO_COUNT] = Option::U8("Cuccos to return", {NumOpts(0, 7)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("CuccosToReturn"), mOptionDescriptions[RSK_CUCCO_COUNT], WidgetType::Slider, 7);
mOptions[RSK_COMPLETE_MASK_QUEST] = Option::Bool("Complete Mask Quest", CVAR_RANDOMIZER_SETTING("CompleteMaskQuest"), mOptionDescriptions[RSK_COMPLETE_MASK_QUEST]);
- mOptions[RSK_ENABLE_GLITCH_CUTSCENES] = Option::Bool("Enable Glitch-Useful Cutscenes", CVAR_RANDOMIZER_SETTING("EnableGlitchCutscenes"), mOptionDescriptions[RSK_ENABLE_GLITCH_CUTSCENES]);
mOptions[RSK_GOSSIP_STONE_HINTS] = Option::U8("Gossip Stone Hints", {"No Hints", "Need Nothing", "Mask of Truth", "Stone of Agony"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("GossipStoneHints"), mOptionDescriptions[RSK_GOSSIP_STONE_HINTS], WidgetType::Combobox, RO_GOSSIP_STONES_NEED_NOTHING, false, IMFLAG_NONE);
mOptions[RSK_HINT_CLARITY] = Option::U8("Hint Clarity", {"Obscure", "Ambiguous", "Clear"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("HintClarity"), mOptionDescriptions[RSK_HINT_CLARITY], WidgetType::Combobox, RO_HINT_CLARITY_CLEAR, true, IMFLAG_INDENT);
mOptions[RSK_HINT_DISTRIBUTION] = Option::U8("Hint Distribution", {"Useless", "Balanced", "Strong", "Very Strong"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("HintDistribution"), mOptionDescriptions[RSK_HINT_DISTRIBUTION], WidgetType::Combobox, RO_HINT_DIST_BALANCED, true, IMFLAG_UNINDENT);
@@ -316,7 +317,7 @@ void Settings::CreateOptions() {
mOptions[RSK_STARTING_SKULLTULA_TOKEN] = Option::U8("Gold Skulltula Tokens", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("StartingSkulltulaToken"), "", WidgetType::Slider);
mOptions[RSK_STARTING_HEARTS] = Option::U8("Starting Hearts", {NumOpts(1, 20)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("StartingHearts"), "", WidgetType::Slider, 2);
// TODO: Remainder of Starting Items
- mOptions[RSK_LOGIC_RULES] = Option::U8("Logic", {"Glitchless", "Glitched", "No Logic", "Vanilla"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("LogicRules"), mOptionDescriptions[RSK_LOGIC_RULES], WidgetType::Combobox, RO_LOGIC_GLITCHLESS);
+ mOptions[RSK_LOGIC_RULES] = Option::U8("Logic", {"Glitchless", "No Logic", "Vanilla"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("LogicRules"), mOptionDescriptions[RSK_LOGIC_RULES], WidgetType::Combobox, RO_LOGIC_GLITCHLESS);
mOptions[RSK_ALL_LOCATIONS_REACHABLE] = Option::Bool("All Locations Reachable", {"Off", "On"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("AllLocationsReachable"), mOptionDescriptions[RSK_ALL_LOCATIONS_REACHABLE], WidgetType::Checkbox, RO_GENERIC_ON);
mOptions[RSK_SKULLS_SUNS_SONG] = Option::Bool("Night Skulltula's Expect Sun's Song", CVAR_RANDOMIZER_SETTING("GsExpectSunsSong"), mOptionDescriptions[RSK_SKULLS_SUNS_SONG]);
mOptions[RSK_DAMAGE_MULTIPLIER] = Option::U8("Damage Multiplier", {"x1/2", "x1", "x2", "x4", "x8", "x16", "OHKO"}, OptionCategory::Setting, "", "", WidgetType::Slider, RO_DAMAGE_MULTIPLIER_DEFAULT);
@@ -705,7 +706,6 @@ void Settings::CreateOptions() {
mOptionGroups[RSG_TIMESAVERS_IMGUI] = OptionGroup::SubGroup("Timesavers", {
&mOptions[RSK_CUCCO_COUNT],
&mOptions[RSK_BIG_POE_COUNT],
- &mOptions[RSK_SKIP_CHILD_STEALTH],
&mOptions[RSK_SKIP_CHILD_ZELDA],
&mOptions[RSK_SKIP_EPONA_RACE],
&mOptions[RSK_COMPLETE_MASK_QUEST],
@@ -979,14 +979,12 @@ void Settings::CreateOptions() {
&mOptionGroups[RSG_STARTING_OTHER],
}, OptionGroupType::DEFAULT);
mOptionGroups[RSG_TIMESAVERS] = OptionGroup("Timesaver Settings", {
- &mOptions[RSK_SKIP_CHILD_STEALTH],
&mOptions[RSK_SKIP_CHILD_ZELDA],
&mOptions[RSK_SKIP_EPONA_RACE],
&mOptions[RSK_SKIP_SCARECROWS_SONG],
&mOptions[RSK_BIG_POE_COUNT],
&mOptions[RSK_CUCCO_COUNT],
&mOptions[RSK_COMPLETE_MASK_QUEST],
- &mOptions[RSK_ENABLE_GLITCH_CUTSCENES],
});
mOptionGroups[RSG_MISC] = OptionGroup("Miscellaneous Settings", {
&mOptions[RSK_GOSSIP_STONE_HINTS],
diff --git a/soh/soh/config/ConfigMigrators.h b/soh/soh/config/ConfigMigrators.h
index abfe9a6b1f..48e1e708bc 100644
--- a/soh/soh/config/ConfigMigrators.h
+++ b/soh/soh/config/ConfigMigrators.h
@@ -1319,7 +1319,6 @@ namespace SOH {
{ MigrationAction::Rename, "gRandomizeDoorOfTime", "gRandoSettings.DoorOfTime" },
{ MigrationAction::Rename, "gRandomizeDungeonCount", "gRandoSettings.DungeonCount" },
{ MigrationAction::Rename, "gRandomizeEnableBombchuDrops", "gRandoSettings.EnableBombchuDrops" },
- { MigrationAction::Rename, "gRandomizeEnableGlitchCutscenes", "gRandoSettings.EnableGlitchCutscenes" },
{ MigrationAction::Rename, "gRandomizeEnabledTricks", "gRandoSettings.EnabledTricks" },
{ MigrationAction::Rename, "gRandomizeForest", "gRandoSettings.ClosedForest" },
{ MigrationAction::Rename, "gRandomizeFrogsHint", "gRandoSettings.FrogsHint" },