diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6dc479fb4..ec9f14f5b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -5,7 +5,7 @@ set(CMAKE_CXX_STANDARD 20 CACHE STRING "The C++ standard to use")
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version")
-project(Ship VERSION 9.0.1 LANGUAGES C CXX)
+project(Ship VERSION 9.0.2 LANGUAGES C CXX)
include(CMake/soh-cvars.cmake)
include(CMake/lus-cvars.cmake)
diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/item_name_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/item_name_static.xml
index 266b3c200..1bc074c2f 100644
--- a/soh/assets/xml/GC_MQ_NTSC_J/textures/item_name_static.xml
+++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/item_name_static.xml
@@ -239,7 +239,7 @@
-
+
diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/item_name_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/item_name_static.xml
index 266b3c200..1bc074c2f 100644
--- a/soh/assets/xml/GC_MQ_NTSC_U/textures/item_name_static.xml
+++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/item_name_static.xml
@@ -239,7 +239,7 @@
-
+
diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/item_name_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/item_name_static.xml
index 266b3c200..1bc074c2f 100644
--- a/soh/assets/xml/GC_NMQ_NTSC_J/textures/item_name_static.xml
+++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/item_name_static.xml
@@ -239,7 +239,7 @@
-
+
diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/item_name_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/item_name_static.xml
index 266b3c200..1bc074c2f 100644
--- a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/item_name_static.xml
+++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/item_name_static.xml
@@ -239,7 +239,7 @@
-
+
diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/item_name_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/item_name_static.xml
index 266b3c200..1bc074c2f 100644
--- a/soh/assets/xml/GC_NMQ_NTSC_U/textures/item_name_static.xml
+++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/item_name_static.xml
@@ -239,7 +239,7 @@
-
+
diff --git a/soh/assets/xml/N64_NTSC_10/textures/item_name_static.xml b/soh/assets/xml/N64_NTSC_10/textures/item_name_static.xml
index 266b3c200..1bc074c2f 100644
--- a/soh/assets/xml/N64_NTSC_10/textures/item_name_static.xml
+++ b/soh/assets/xml/N64_NTSC_10/textures/item_name_static.xml
@@ -239,7 +239,7 @@
-
+
diff --git a/soh/assets/xml/N64_NTSC_11/textures/item_name_static.xml b/soh/assets/xml/N64_NTSC_11/textures/item_name_static.xml
index 266b3c200..1bc074c2f 100644
--- a/soh/assets/xml/N64_NTSC_11/textures/item_name_static.xml
+++ b/soh/assets/xml/N64_NTSC_11/textures/item_name_static.xml
@@ -239,7 +239,7 @@
-
+
diff --git a/soh/assets/xml/N64_NTSC_12/textures/item_name_static.xml b/soh/assets/xml/N64_NTSC_12/textures/item_name_static.xml
index 266b3c200..1bc074c2f 100644
--- a/soh/assets/xml/N64_NTSC_12/textures/item_name_static.xml
+++ b/soh/assets/xml/N64_NTSC_12/textures/item_name_static.xml
@@ -239,7 +239,7 @@
-
+
diff --git a/soh/soh/Enhancements/Presets/PresetEntries.cpp b/soh/soh/Enhancements/Presets/PresetEntries.cpp
index ebf6d4a19..c9ca5c24f 100644
--- a/soh/soh/Enhancements/Presets/PresetEntries.cpp
+++ b/soh/soh/Enhancements/Presets/PresetEntries.cpp
@@ -46,7 +46,7 @@ const std::vector vanillaPlusPresetEntries = {
PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixZoraHintDialogue"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixVineFall"), 1),
PRESET_ENTRY_S32(CVAR_ENHANCEMENT("EnemySpawnsOverWaterboxes"), 1),
PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixSawSoftlock"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DekuNutUpgradeFix"), 1),
- PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixGrokenGiantsKnife"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixMenuLR"), 1),
+ PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixBrokenGiantsKnife"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixMenuLR"), 1),
PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixDungeonMinimapIcon"), 1),
PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TwoHandedIdle"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NaviTextFix"), 1),
PRESET_ENTRY_S32(CVAR_ENHANCEMENT("GerudoWarriorClothingFix"), 1),
@@ -125,7 +125,7 @@ const std::vector enhancedPresetEntries = {
PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixZoraHintDialogue"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixVineFall"), 1),
PRESET_ENTRY_S32(CVAR_ENHANCEMENT("EnemySpawnsOverWaterboxes"), 1),
PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixSawSoftlock"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DekuNutUpgradeFix"), 1),
- PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixGrokenGiantsKnife"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixMenuLR"), 1),
+ PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixBrokenGiantsKnife"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixMenuLR"), 1),
PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixDungeonMinimapIcon"), 1),
PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TwoHandedIdle"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NaviTextFix"), 1),
PRESET_ENTRY_S32(CVAR_ENHANCEMENT("GerudoWarriorClothingFix"), 1),
@@ -251,7 +251,7 @@ const std::vector randomizerPresetEntries = {
PRESET_ENTRY_S32(CVAR_ENHANCEMENT("EnemySpawnsOverWaterboxes"), 1),
PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixSawSoftlock"), 1),
PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DekuNutUpgradeFix"), 1),
- PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixGrokenGiantsKnife"), 1),
+ PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixBrokenGiantsKnife"), 1),
PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixMenuLR"), 1),
PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixDungeonMinimapIcon"), 1),
PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TwoHandedIdle"), 1),
diff --git a/soh/soh/Enhancements/controls/InputViewer.cpp b/soh/soh/Enhancements/controls/InputViewer.cpp
index 3ae3bc1ba..1d6695d25 100644
--- a/soh/soh/Enhancements/controls/InputViewer.cpp
+++ b/soh/soh/Enhancements/controls/InputViewer.cpp
@@ -151,7 +151,7 @@ void InputViewer::DrawElement() {
}
ImVec2 mainPos = ImGui::GetWindowPos();
- ImVec2 size = ImGui::GetContentRegionAvail();
+ ImVec2 size = ImGui::GetMainViewport()->WorkSize;
#ifdef __WIIU__
const float scale = CVarGetFloat(CVAR_INPUT_VIEWER("Scale"), 1.0f) * 2.0f;
diff --git a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp
index e0f530bc2..8074fa707 100644
--- a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp
+++ b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp
@@ -2376,10 +2376,12 @@ void CosmeticsEditorWindow::DrawElement() {
.Step(0.01f)
.Size(ImVec2(300.0f, 0.0f))
.Color(THEME_COLOR));
+ ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0));
UIWidgets::CVarCheckbox("Randomize All on New Scene", CVAR_COSMETIC("RandomizeAllOnNewScene"),
UIWidgets::CheckboxOptions()
.Color(THEME_COLOR)
.Tooltip("Enables randomizing all unlocked cosmetics when you enter a new scene."));
+ ImGui::EndDisabled();
UIWidgets::CVarCheckbox(
"Advanced Mode", CVAR_COSMETIC("AdvancedMode"),
UIWidgets::CheckboxOptions()
@@ -2408,13 +2410,15 @@ void CosmeticsEditorWindow::DrawElement() {
}
}
}
+ ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0));
if (UIWidgets::Button("Randomize All", UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) {
CosmeticsEditor_RandomizeAll();
}
+ ImGui::EndDisabled();
+
ImGui::SameLine();
if (UIWidgets::Button("Reset All", UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) {
- CVarClearBlock("gCosmetics");
- ApplyOrResetCustomGfxPatches();
+ CosmeticsEditor_ResetAll();
}
if (UIWidgets::Button("Lock All", UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) {
for (auto& [id, cosmeticOption] : cosmeticOptions) {
@@ -2432,6 +2436,7 @@ void CosmeticsEditorWindow::DrawElement() {
}
}
+ ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0));
if (UIWidgets::Button("Rainbow All", UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) {
for (auto& [id, cosmeticOption] : cosmeticOptions) {
if (!CVarGetInteger(cosmeticOption.lockedCvar, 0) &&
@@ -2441,6 +2446,8 @@ void CosmeticsEditorWindow::DrawElement() {
}
}
}
+ ImGui::EndDisabled();
+
ImGui::SameLine();
if (UIWidgets::Button("Un-Rainbow All", UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) {
for (auto& [id, cosmeticOption] : cosmeticOptions) {
@@ -2470,6 +2477,7 @@ void CosmeticsEditorWindow::DrawElement() {
if (ImGui::BeginTabItem("Keys")) {
+ ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0));
UIWidgets::Separator(true, true, 2.0f, 2.0f);
if (UIWidgets::Button("Give all keys dungeon-specific colors",
@@ -2483,6 +2491,7 @@ void CosmeticsEditorWindow::DrawElement() {
DrawCosmeticGroup(COSMETICS_GROUP_SMALL_KEYS);
DrawCosmeticGroup(COSMETICS_GROUP_BOSS_KEYS);
+ ImGui::EndDisabled();
ImGui::EndTabItem();
}
diff --git a/soh/soh/Enhancements/debugger/MessageViewer.cpp b/soh/soh/Enhancements/debugger/MessageViewer.cpp
index 83aac4d6c..c018b0017 100644
--- a/soh/soh/Enhancements/debugger/MessageViewer.cpp
+++ b/soh/soh/Enhancements/debugger/MessageViewer.cpp
@@ -27,6 +27,7 @@ void MessageViewer::InitElement() {
}
void MessageViewer::DrawElement() {
+ ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0));
ImGui::Text("Table ID");
ImGui::SameLine();
PushStyleInput(THEME_COLOR);
@@ -78,6 +79,7 @@ void MessageViewer::DrawElement() {
mDisplayCustomMessageClicked = true;
}
PopStyleButton();
+ ImGui::EndDisabled();
}
void MessageViewer::UpdateElement() {
diff --git a/soh/soh/Enhancements/debugger/SohConsoleWindow.cpp b/soh/soh/Enhancements/debugger/SohConsoleWindow.cpp
index d5090e7e5..19be376ed 100644
--- a/soh/soh/Enhancements/debugger/SohConsoleWindow.cpp
+++ b/soh/soh/Enhancements/debugger/SohConsoleWindow.cpp
@@ -12,6 +12,7 @@ void SohConsoleWindow::UpdateElement() {
}
void SohConsoleWindow::DrawElement() {
+ ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0));
UIWidgets::PushStyleInput(THEME_COLOR);
// Small font (13) to match hardcoded width values in the LUS window.. set large font after below TODO addressed
ImGui::PushFont(OTRGlobals::Instance->fontMonoSmall);
@@ -27,4 +28,5 @@ void SohConsoleWindow::DrawElement() {
ImGui::PopFont();
UIWidgets::PopStyleInput();
+ ImGui::EndDisabled();
}
diff --git a/soh/soh/Enhancements/debugger/SohGfxDebuggerWindow.cpp b/soh/soh/Enhancements/debugger/SohGfxDebuggerWindow.cpp
index 06d81577d..def23cacc 100644
--- a/soh/soh/Enhancements/debugger/SohGfxDebuggerWindow.cpp
+++ b/soh/soh/Enhancements/debugger/SohGfxDebuggerWindow.cpp
@@ -10,7 +10,9 @@ void SohGfxDebuggerWindow::UpdateElement() {
}
void SohGfxDebuggerWindow::DrawElement() {
+ ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0));
ImGui::PushFont(OTRGlobals::Instance->fontMonoLarger);
GfxDebuggerWindow::DrawElement();
ImGui::PopFont();
+ ImGui::EndDisabled();
}
diff --git a/soh/soh/Enhancements/debugger/actorViewer.cpp b/soh/soh/Enhancements/debugger/actorViewer.cpp
index 8ae940ffb..515da6491 100644
--- a/soh/soh/Enhancements/debugger/actorViewer.cpp
+++ b/soh/soh/Enhancements/debugger/actorViewer.cpp
@@ -849,6 +849,7 @@ void ActorViewer_AddTagForAllActors() {
}
void ActorViewerWindow::DrawElement() {
+ ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0));
static Actor* display;
static Actor empty{};
static Actor* fetch = NULL;
@@ -1186,6 +1187,7 @@ void ActorViewerWindow::DrawElement() {
actors.clear();
}
}
+ ImGui::EndDisabled();
}
void ActorViewerWindow::InitElement() {
diff --git a/soh/soh/Enhancements/debugger/colViewer.cpp b/soh/soh/Enhancements/debugger/colViewer.cpp
index e3abba484..352d4b962 100644
--- a/soh/soh/Enhancements/debugger/colViewer.cpp
+++ b/soh/soh/Enhancements/debugger/colViewer.cpp
@@ -58,6 +58,7 @@ using namespace UIWidgets;
// Draws the ImGui window for the collision viewer
void ColViewerWindow::DrawElement() {
+ ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0));
CheckboxOptions checkOpt = CheckboxOptions().Color(THEME_COLOR);
ComboboxOptions comboOpt = ComboboxOptions().Color(THEME_COLOR);
CVarCheckbox("Enabled", CVAR_DEVELOPER_TOOLS("ColViewer.Enabled"), checkOpt);
@@ -139,6 +140,7 @@ void ColViewerWindow::DrawElement() {
UIWidgets::Tooltip(colorHelpText.c_str());
}
PopStyleHeader();
+ ImGui::EndDisabled();
}
// Calculates the normal for a triangle at the 3 specified points
diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp
index a97a41d16..499e8d1ad 100644
--- a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp
+++ b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp
@@ -1665,6 +1665,7 @@ void ResetBaseOptions() {
void SaveEditorWindow::DrawElement() {
PushStyleTabs(THEME_COLOR);
ImGui::PushFont(OTRGlobals::Instance->fontMonoLarger);
+ ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0));
if (ImGui::BeginTabBar("SaveContextTabBar", ImGuiTabBarFlags_NoCloseWithMiddleMouseButton)) {
ResetBaseOptions();
@@ -1706,6 +1707,7 @@ void SaveEditorWindow::DrawElement() {
ImGui::EndTabBar();
}
+ ImGui::EndDisabled();
ImGui::PopFont();
PopStyleTabs();
}
diff --git a/soh/soh/Enhancements/debugger/dlViewer.cpp b/soh/soh/Enhancements/debugger/dlViewer.cpp
index 7cedcdf26..a02aa7d95 100644
--- a/soh/soh/Enhancements/debugger/dlViewer.cpp
+++ b/soh/soh/Enhancements/debugger/dlViewer.cpp
@@ -89,6 +89,7 @@ void PerformDisplayListSearch() {
}
void DLViewerWindow::DrawElement() {
+ ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0));
// Debounce the search field as listing otr files is expensive
UIWidgets::PushStyleInput(THEME_COLOR);
ImGui::PushFont(OTRGlobals::Instance->fontMonoLarger);
@@ -122,6 +123,7 @@ void DLViewerWindow::DrawElement() {
if (activeDisplayList == "") {
ImGui::PopFont();
+ ImGui::EndDisabled();
return;
}
@@ -131,6 +133,8 @@ void DLViewerWindow::DrawElement() {
if (res->GetInitData()->Type != static_cast(Fast::ResourceType::DisplayList)) {
ImGui::Text("Resource type is not a Display List. Please choose another.");
+ ImGui::PopFont();
+ ImGui::EndDisabled();
return;
}
@@ -325,13 +329,10 @@ void DLViewerWindow::DrawElement() {
}
ImGui::EndGroup();
}
- } catch (const std::exception& e) {
- ImGui::Text("Error displaying DL instructions.");
- ImGui::PopFont();
- return;
- }
+ } catch (const std::exception& e) { ImGui::Text("Error displaying DL instructions."); }
ImGui::PopFont();
+ ImGui::EndDisabled();
}
void DLViewerWindow::InitElement() {
diff --git a/soh/soh/Enhancements/debugger/hookDebugger.cpp b/soh/soh/Enhancements/debugger/hookDebugger.cpp
index 113862282..146db2ddc 100644
--- a/soh/soh/Enhancements/debugger/hookDebugger.cpp
+++ b/soh/soh/Enhancements/debugger/hookDebugger.cpp
@@ -77,6 +77,7 @@ void DrawHookRegisteringInfos(const char* hookName) {
}
void HookDebuggerWindow::DrawElement() {
+ ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0));
#ifndef __cpp_lib_source_location
ImGui::TextColored(yellow, "Some features of the Hook Debugger are unavailable because SoH was compiled "
"without \"\" support "
@@ -93,6 +94,7 @@ void HookDebuggerWindow::DrawElement() {
}
ImGui::PopFont();
+ ImGui::EndDisabled();
}
void HookDebuggerWindow::InitElement() {
diff --git a/soh/soh/Enhancements/debugger/valueViewer.cpp b/soh/soh/Enhancements/debugger/valueViewer.cpp
index 1ea117444..4544979cb 100644
--- a/soh/soh/Enhancements/debugger/valueViewer.cpp
+++ b/soh/soh/Enhancements/debugger/valueViewer.cpp
@@ -154,6 +154,7 @@ void RegisterValueViewerHooks() {
RegisterShipInitFunc initFunc(RegisterValueViewerHooks, { CVAR_NAME });
void ValueViewerWindow::DrawElement() {
+ ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0));
UIWidgets::CVarCheckbox("Enable Printing", CVAR_NAME, UIWidgets::CheckboxOptions().Color(THEME_COLOR));
ImGui::BeginGroup();
@@ -275,6 +276,7 @@ void ValueViewerWindow::DrawElement() {
}
ImGui::EndGroup();
}
+ ImGui::EndDisabled();
}
void ValueViewerWindow::InitElement() {
diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h b/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h
index 44d0e643a..ecd970b31 100644
--- a/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h
+++ b/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h
@@ -15,6 +15,7 @@ DEFINE_HOOK(OnItemReceive, (GetItemEntry itemEntry));
DEFINE_HOOK(OnSaleEnd, (GetItemEntry itemEntry));
DEFINE_HOOK(OnTransitionEnd, (int16_t sceneNum));
DEFINE_HOOK(OnSceneInit, (int16_t sceneNum));
+DEFINE_HOOK(AfterSceneCommands, (int16_t sceneNum));
DEFINE_HOOK(OnSceneFlagSet, (int16_t sceneNum, int16_t flagType, int16_t flag));
DEFINE_HOOK(OnSceneFlagUnset, (int16_t sceneNum, int16_t flagType, int16_t flag));
DEFINE_HOOK(OnFlagSet, (int16_t flagType, int16_t flag));
diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp
index 9231da843..5e52bed71 100644
--- a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp
+++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp
@@ -45,12 +45,18 @@ void GameInteractor_ExecuteOnTransitionEndHooks(int16_t sceneNum) {
GameInteractor::Instance->ExecuteHooksForFilter(sceneNum);
}
-void GameInteractor_ExecuteOnSceneInitHooks(int16_t sceneNum) {
+void GameInteractor_ExecuteOnSceneInit(int16_t sceneNum) {
GameInteractor::Instance->ExecuteHooks(sceneNum);
GameInteractor::Instance->ExecuteHooksForID(sceneNum, sceneNum);
GameInteractor::Instance->ExecuteHooksForFilter(sceneNum);
}
+void GameInteractor_ExecuteAfterSceneCommands(int16_t sceneNum) {
+ GameInteractor::Instance->ExecuteHooks(sceneNum);
+ GameInteractor::Instance->ExecuteHooksForID(sceneNum, sceneNum);
+ GameInteractor::Instance->ExecuteHooksForFilter(sceneNum);
+}
+
void GameInteractor_ExecuteOnSceneFlagSet(int16_t sceneNum, int16_t flagType, int16_t flag) {
GameInteractor::Instance->ExecuteHooks(sceneNum, flagType, flag);
GameInteractor::Instance->ExecuteHooksForFilter(sceneNum, flagType, flag);
diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h
index 33c8d2681..b1f9195b4 100644
--- a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h
+++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h
@@ -18,6 +18,7 @@ void GameInteractor_ExecuteOnItemReceiveHooks(GetItemEntry itemEntry);
void GameInteractor_ExecuteOnSaleEndHooks(GetItemEntry itemEntry);
void GameInteractor_ExecuteOnTransitionEndHooks(int16_t sceneNum);
void GameInteractor_ExecuteOnSceneInit(int16_t sceneNum);
+void GameInteractor_ExecuteAfterSceneCommands(int16_t sceneNum);
void GameInteractor_ExecuteOnSceneFlagSet(int16_t sceneNum, int16_t flagType, int16_t flag);
void GameInteractor_ExecuteOnSceneFlagUnset(int16_t sceneNum, int16_t flagType, int16_t flag);
void GameInteractor_ExecuteOnFlagSet(int16_t flagType, int16_t flag);
diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h
index 6c18a6edb..d57d5029a 100644
--- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h
+++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h
@@ -951,7 +951,7 @@ typedef enum {
// false
// ```
// #### `args`
- // - '*Fishing' (&this)
+ // - '*Fishing'
VB_GIVE_RANDO_GLITCH_FISHING_PRIZE,
// #### `result`
diff --git a/soh/soh/Enhancements/randomizer/context.cpp b/soh/soh/Enhancements/randomizer/context.cpp
index 4127ab21a..fa755325e 100644
--- a/soh/soh/Enhancements/randomizer/context.cpp
+++ b/soh/soh/Enhancements/randomizer/context.cpp
@@ -180,6 +180,8 @@ void Context::GenerateLocationPool() {
location.GetRandomizerCheck() == RC_HF_DEKU_SCRUB_GROTTO)) ||
(location.GetRCType() == RCTYPE_ADULT_TRADE && mOptions[RSK_SHUFFLE_ADULT_TRADE].Is(RO_GENERIC_OFF)) ||
(location.GetRCType() == RCTYPE_COW && mOptions[RSK_SHUFFLE_COWS].Is(RO_GENERIC_OFF)) ||
+ (location.GetRandomizerCheck() == RC_LH_HYRULE_LOACH &&
+ mOptions[RSK_FISHSANITY].IsNot(RO_FISHSANITY_HYRULE_LOACH)) ||
(location.GetRCType() == RCTYPE_FISH && !mFishsanity->GetFishLocationIncluded(&location)) ||
(location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_OFF)) ||
(location.GetRCType() == RCTYPE_GRASS && mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_OFF)) ||
diff --git a/soh/soh/Enhancements/randomizer/fishsanity.cpp b/soh/soh/Enhancements/randomizer/fishsanity.cpp
index 8d4435f9a..99636d1a4 100644
--- a/soh/soh/Enhancements/randomizer/fishsanity.cpp
+++ b/soh/soh/Enhancements/randomizer/fishsanity.cpp
@@ -74,13 +74,10 @@ Fishsanity::~Fishsanity() {
bool Fishsanity::GetFishLocationIncluded(Rando::Location* loc, FishsanityOptionsSource optionsSource) {
auto [mode, numFish, ageSplit] = GetOptions(optionsSource);
- if (loc->GetRCType() != RCTYPE_FISH || mode == RO_FISHSANITY_OFF) {
+ if (loc->GetRCType() != RCTYPE_FISH || mode == RO_FISHSANITY_OFF || mode == RO_FISHSANITY_HYRULE_LOACH) {
return false;
}
RandomizerCheck rc = loc->GetRandomizerCheck();
- if (mode == RO_FISHSANITY_HYRULE_LOACH && rc != RC_LH_HYRULE_LOACH) {
- return false;
- }
// Are pond fish enabled, and is this a pond fish location?
if (mode != RO_FISHSANITY_OVERWORLD && numFish > 0 && loc->GetScene() == SCENE_FISHING_POND &&
loc->GetActorID() == ACTOR_FISHING) {
diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp
index a10e8b67f..bd267aebe 100644
--- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp
+++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp
@@ -245,10 +245,6 @@ void RandomizerOnFlagSetHandler(int16_t flagType, int16_t flag) {
Flags_SetRandomizerInf(RAND_INF_ZELDAS_LETTER);
}
- if (flagType == FLAG_EVENT_CHECK_INF && flag == EVENTCHKINF_OBTAINED_POCKET_EGG) {
- Flags_SetRandomizerInf(RAND_INF_WEIRD_EGG);
- }
-
RandomizerCheck rc = GetRandomizerCheckFromFlag(flagType, flag);
if (rc == RC_UNKNOWN_CHECK)
return;
@@ -1765,10 +1761,6 @@ void RandomizerOnSceneInitHandler(int16_t sceneNum) {
// Handle updated link spawn positions
Entrance_OverrideSpawnScene(sceneNum, gPlayState->curSpawn);
-
- Entrance_OverrideWeatherState();
- // Need to reinitialize the environment after replacing the weather mode
- Play_InitEnvironment(gPlayState, gPlayState->skyboxId);
}
// LACs & Prelude checks
@@ -1807,6 +1799,13 @@ void RandomizerOnSceneInitHandler(int16_t sceneNum) {
});
}
+void RandomizerAfterSceneCommandsHandler(int16_t sceneNum) {
+ // ENTRTODO: Move all entrance rando handling to a dedicated file
+ if (RAND_GET_OPTION(RSK_SHUFFLE_ENTRANCES)) {
+ Entrance_OverrideWeatherState();
+ }
+}
+
void EnSi_DrawRandomizedItem(EnSi* enSi, PlayState* play) {
GetItemEntry randoItem = enSi->sohGetItemEntry;
if (CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MysteriousShuffle"), 0)) {
@@ -2362,6 +2361,7 @@ void RandomizerRegisterHooks() {
static uint32_t onDialogMessageHook = 0;
static uint32_t onVanillaBehaviorHook = 0;
static uint32_t onSceneInitHook = 0;
+ static uint32_t afterSceneCommandsHook = 0;
static uint32_t onActorInitHook = 0;
static uint32_t onActorUpdateHook = 0;
static uint32_t onPlayerUpdateHook = 0;
@@ -2398,6 +2398,7 @@ void RandomizerRegisterHooks() {
GameInteractor::Instance->UnregisterGameHook(onDialogMessageHook);
GameInteractor::Instance->UnregisterGameHook(onVanillaBehaviorHook);
GameInteractor::Instance->UnregisterGameHook(onSceneInitHook);
+ GameInteractor::Instance->UnregisterGameHook(afterSceneCommandsHook);
GameInteractor::Instance->UnregisterGameHook(onActorInitHook);
GameInteractor::Instance->UnregisterGameHook(onActorUpdateHook);
GameInteractor::Instance->UnregisterGameHook(onPlayerUpdateHook);
@@ -2430,6 +2431,7 @@ void RandomizerRegisterHooks() {
onDialogMessageHook = 0;
onVanillaBehaviorHook = 0;
onSceneInitHook = 0;
+ afterSceneCommandsHook = 0;
onActorInitHook = 0;
onActorUpdateHook = 0;
onPlayerUpdateHook = 0;
@@ -2481,6 +2483,8 @@ void RandomizerRegisterHooks() {
RandomizerOnVanillaBehaviorHandler);
onSceneInitHook =
GameInteractor::Instance->RegisterGameHook(RandomizerOnSceneInitHandler);
+ afterSceneCommandsHook = GameInteractor::Instance->RegisterGameHook(
+ RandomizerAfterSceneCommandsHandler);
onActorInitHook =
GameInteractor::Instance->RegisterGameHook(RandomizerOnActorInitHandler);
onActorUpdateHook =
diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp
index ded6c8279..451225273 100644
--- a/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp
+++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp
@@ -63,8 +63,8 @@ void RegionTable_Init_GanonsCastle() {
}, {
//Locations
LOCATION(RC_GANONS_CASTLE_FOREST_TRIAL_CHEST, logic->CanKillEnemy(RE_WOLFOS)),
- LOCATION(RC_GANONS_CASTLE_FOREST_TRIAL_POT_1, logic->CanBreakPots() && (logic->CanUse(RG_FIRE_ARROWS) || logic->CanUse(RG_DINS_FIRE))),
- LOCATION(RC_GANONS_CASTLE_FOREST_TRIAL_POT_2, logic->CanBreakPots() && (logic->CanUse(RG_FIRE_ARROWS) || logic->CanUse(RG_DINS_FIRE))),
+ LOCATION(RC_GANONS_CASTLE_FOREST_TRIAL_POT_1, logic->CanBreakPots() && (logic->CanUse(RG_FIRE_ARROWS) || (logic->CanUse(RG_DINS_FIRE) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT))))),
+ LOCATION(RC_GANONS_CASTLE_FOREST_TRIAL_POT_2, logic->CanBreakPots() && (logic->CanUse(RG_FIRE_ARROWS) || (logic->CanUse(RG_DINS_FIRE) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT))))),
}, {});
areaTable[RR_GANONS_CASTLE_FIRE_TRIAL] = Region("Ganon's Castle Fire Trial", "Ganon's Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {
diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp
index bdcdf9a4c..dbf467b0f 100644
--- a/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp
+++ b/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp
@@ -34,7 +34,7 @@ void RegionTable_Init_CastleGrounds() {
}, {
//Exits
Entrance(RR_CASTLE_GROUNDS, []{return true;}),
- Entrance(RR_HC_GARDEN, []{return logic->CanUse(RG_WEIRD_EGG) || !ctx->GetOption(RSK_SHUFFLE_WEIRD_EGG) || (ctx->GetTrickOption(RT_DAMAGE_BOOST_SIMPLE) && logic->HasExplosives() && logic->CanJumpslash());}),
+ Entrance(RR_HC_GARDEN, []{return logic->CanUse(RG_WEIRD_EGG) || (ctx->GetTrickOption(RT_DAMAGE_BOOST_SIMPLE) && logic->HasExplosives() && logic->CanJumpslash());}),
Entrance(RR_HC_GREAT_FAIRY_FOUNTAIN, []{return logic->BlastOrSmash();}),
Entrance(RR_HC_STORMS_GROTTO, []{return logic->CanOpenStormsGrotto();}),
});
diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp
index 9fd460d93..0c4ed2e89 100644
--- a/soh/soh/Enhancements/randomizer/logic.cpp
+++ b/soh/soh/Enhancements/randomizer/logic.cpp
@@ -121,8 +121,6 @@ bool Logic::HasItem(RandomizerGet itemName) {
case RG_STONE_OF_AGONY:
case RG_GERUDO_MEMBERSHIP_CARD:
return CheckQuestItem(RandoGetToQuestItem.at(itemName));
- case RG_RUTOS_LETTER:
- return CheckEventChkInf(EVENTCHKINF_OBTAINED_RUTOS_LETTER);
case RG_DOUBLE_DEFENSE:
return GetSaveContext()->isDoubleDefenseAcquired;
case RG_FISHING_POLE:
@@ -171,6 +169,7 @@ bool Logic::HasItem(RandomizerGet itemName) {
case RG_BACK_TOWER_KEY:
case RG_HYLIA_LAB_KEY:
case RG_FISHING_HOLE_KEY:
+ case RG_RUTOS_LETTER:
return CheckRandoInf(RandoGetToRandInf.at(itemName));
// Boss Keys
case RG_EPONA:
@@ -1455,6 +1454,7 @@ std::map Logic::RandoGetToEquipFlag = {
std::map Logic::RandoGetToRandInf = {
{ RG_ZELDAS_LETTER, RAND_INF_ZELDAS_LETTER },
{ RG_WEIRD_EGG, RAND_INF_WEIRD_EGG },
+ { RG_RUTOS_LETTER, RAND_INF_OBTAINED_RUTOS_LETTER },
{ RG_GOHMA_SOUL, RAND_INF_GOHMA_SOUL },
{ RG_KING_DODONGO_SOUL, RAND_INF_KING_DODONGO_SOUL },
{ RG_BARINADE_SOUL, RAND_INF_BARINADE_SOUL },
@@ -1819,7 +1819,7 @@ void Logic::ApplyItemEffect(Item& item, bool state) {
mSaveContext->inventory.items[slot] = itemId;
} break;
case RG_RUTOS_LETTER:
- SetEventChkInf(EVENTCHKINF_OBTAINED_RUTOS_LETTER, state);
+ SetRandoInf(RAND_INF_OBTAINED_RUTOS_LETTER, state);
break;
case RG_GOHMA_SOUL:
case RG_KING_DODONGO_SOUL:
diff --git a/soh/soh/Enhancements/randomizer/option.cpp b/soh/soh/Enhancements/randomizer/option.cpp
index 43fcc2f65..bec719d4b 100644
--- a/soh/soh/Enhancements/randomizer/option.cpp
+++ b/soh/soh/Enhancements/randomizer/option.cpp
@@ -368,7 +368,9 @@ void OptionGroup::Disable() {
bool OptionGroup::RenderImGui() const { // NOLINT(*-no-recursion)
ImGuiWindow* window = ImGui::GetCurrentWindow();
bool changed = false;
- ImGui::BeginDisabled(mDisabled);
+ ImGui::BeginDisabled(mDisabled || CVarGetInteger(CVAR_SETTING("DisableChanges"), 0) ||
+ CVarGetInteger(CVAR_GENERAL("RandoGenerating"), 0) ||
+ CVarGetInteger(CVAR_GENERAL("OnFileSelectNameEntry"), 0));
if (mContainerType == WidgetContainerType::TABLE) {
if (ImGui::BeginTable(mName.c_str(), static_cast(mSubGroups.size()),
ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) {
diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp
index 7a5f8dd69..f1ecd608c 100644
--- a/soh/soh/Enhancements/randomizer/randomizer.cpp
+++ b/soh/soh/Enhancements/randomizer/randomizer.cpp
@@ -3690,6 +3690,7 @@ void RandomizerSettingsWindow::DrawElement() {
locationsTabOpen = false;
tricksTabOpen = false;
}
+ ImGui::EndDisabled();
UIWidgets::Spacer(0);
UIWidgets::CVarCheckbox("Manual seed entry", CVAR_RANDOMIZER_SETTING("ManualSeedEntry"),
@@ -3725,9 +3726,7 @@ void RandomizerSettingsWindow::DrawElement() {
}
UIWidgets::Spacer(0);
- ImGui::BeginDisabled((CVarGetInteger(CVAR_RANDOMIZER_SETTING("DontGenerateSpoiler"), 0) &&
- gSaveContext.gameMode != GAMEMODE_FILE_SELECT) ||
- GameInteractor::IsSaveLoaded());
+ ImGui::BeginDisabled((gSaveContext.gameMode != GAMEMODE_FILE_SELECT) || GameInteractor::IsSaveLoaded());
if (UIWidgets::Button("Generate Randomizer",
UIWidgets::ButtonOptions().Size(ImVec2(250.f, 0.f)).Color(THEME_COLOR))) {
ctx->SetSpoilerLoaded(false);
@@ -3746,7 +3745,6 @@ void RandomizerSettingsWindow::DrawElement() {
// ImGui::Text("Settings File: %s", presetfilepath.c_str());
UIWidgets::Separator(true, true, 0.f, 0.f);
- ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0));
ImGuiWindow* window = ImGui::GetCurrentWindow();
static ImVec2 cellPadding(8.0f, 8.0f);
@@ -3762,8 +3760,6 @@ void RandomizerSettingsWindow::DrawElement() {
ImGui::EndTabItem();
}
- ImGui::BeginDisabled(CVarGetInteger(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS) ==
- RO_LOGIC_VANILLA);
if (ImGui::BeginTabItem("Items")) {
ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cellPadding);
ImGui::BeginDisabled(CVarGetInteger(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS) ==
@@ -3775,23 +3771,23 @@ void RandomizerSettingsWindow::DrawElement() {
ImGui::PopStyleVar(1);
ImGui::EndTabItem();
}
- ImGui::EndDisabled();
- ImGui::BeginDisabled(CVarGetInteger(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS) ==
- RO_LOGIC_VANILLA);
if (ImGui::BeginTabItem("Gameplay")) {
+ ImGui::BeginDisabled(CVarGetInteger(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS) ==
+ RO_LOGIC_VANILLA);
ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cellPadding);
if (mSettings->GetOptionGroup(RSG_GAMEPLAY_IMGUI_TABLE).RenderImGui()) {
mNeedsUpdate = true;
}
+ ImGui::EndDisabled();
ImGui::PopStyleVar(1);
ImGui::EndTabItem();
}
- ImGui::EndDisabled();
- ImGui::BeginDisabled(CVarGetInteger(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS) ==
- RO_LOGIC_VANILLA);
if (ImGui::BeginTabItem("Locations")) {
+ ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0) || disableEditingRandoSettings ||
+ CVarGetInteger(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS) ==
+ RO_LOGIC_VANILLA);
ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cellPadding);
if (!locationsTabOpen) {
locationsTabOpen = true;
@@ -3924,10 +3920,10 @@ void RandomizerSettingsWindow::DrawElement() {
}
ImGui::PopStyleVar(1);
ImGui::EndTabItem();
+ ImGui::EndDisabled();
} else {
locationsTabOpen = false;
}
- ImGui::EndDisabled();
if (ImGui::BeginTabItem("Tricks/Glitches")) {
if (!tricksTabOpen) {
@@ -3975,8 +3971,9 @@ void RandomizerSettingsWindow::DrawElement() {
ImGui::EndTable();
}
- ImGui::BeginDisabled(CVarGetInteger(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS) ==
- RO_LOGIC_VANILLA);
+ ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0) || disableEditingRandoSettings ||
+ CVarGetInteger(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS) ==
+ RO_LOGIC_VANILLA);
// Tricks
static std::unordered_map areaTreeDisabled{
@@ -4354,9 +4351,6 @@ void RandomizerSettingsWindow::DrawElement() {
ImGui::EndTabBar();
}
UIWidgets::PopStyleTabs();
-
- ImGui::EndDisabled();
- ImGui::EndDisabled();
}
void RandomizerSettingsWindow::UpdateElement() {
diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp
index 93798fea5..6c670e447 100644
--- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp
+++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp
@@ -1258,8 +1258,13 @@ void BeginFloatWindows(std::string UniqueName, bool& open, ImGuiWindowFlags flag
windowFlags |= ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoMove;
}
}
- ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(Color_Background.r / 255.0f, Color_Background.g / 255.0f,
- Color_Background.b / 255.0f, Color_Background.a / 255.0f));
+ auto maybeParent = ImGui::GetCurrentWindow();
+ ImGuiWindow* window = ImGui::FindWindowByName(UniqueName.c_str());
+ if (window != NULL && window->DockTabIsVisible && window->ParentWindow != NULL &&
+ std::string(window->ParentWindow->Name).compare(0, strlen("Main - Deck"), "Main - Deck") == 0) {
+ Color_Background.a = 255;
+ }
+ ImGui::PushStyleColor(ImGuiCol_WindowBg, VecFromRGBA8(Color_Background));
ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0, 0, 0, 0));
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 4.0f);
ImGui::Begin(UniqueName.c_str(), &open, windowFlags);
@@ -2075,11 +2080,13 @@ void CheckTrackerSettingsWindow::DrawElement() {
.DefaultIndex(TRACKER_COMBO_BUTTON_L));
}
}
+ ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0));
UIWidgets::CVarCheckbox("Vanilla/MQ Dungeon Spoilers", CVAR_TRACKER_CHECK("MQSpoilers"),
UIWidgets::CheckboxOptions()
.Tooltip("If enabled, Vanilla/MQ dungeons will show on the tracker immediately. "
"Otherwise, Vanilla/MQ dungeon locations must be unlocked.")
.Color(THEME_COLOR));
+ ImGui::EndDisabled();
if (UIWidgets::CVarCheckbox(
"Hide unshuffled shop item checks", CVAR_TRACKER_CHECK("HideUnshuffledShopChecks"),
UIWidgets::CheckboxOptions()
@@ -2100,6 +2107,7 @@ void CheckTrackerSettingsWindow::DrawElement() {
UIWidgets::CheckboxOptions()
.Tooltip("If enabled, will show a check's logic when hovering over it.")
.Color(THEME_COLOR));
+ ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0));
if (UIWidgets::CVarCheckbox("Enable Available Checks", CVAR_TRACKER_CHECK("EnableAvailableChecks"),
UIWidgets::CheckboxOptions()
.Tooltip("If enabled, will show the checks that are available to be collected "
@@ -2108,6 +2116,7 @@ void CheckTrackerSettingsWindow::DrawElement() {
enableAvailableChecks = CVarGetInteger(CVAR_TRACKER_CHECK("EnableAvailableChecks"), 0);
RecalculateAvailableChecks();
}
+ ImGui::EndDisabled();
// Filtering settings
UIWidgets::PaddedSeparator();
diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp
index f93172647..b71bae5b3 100644
--- a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp
+++ b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp
@@ -690,6 +690,7 @@ void EntranceTrackerSettingsWindow::DrawElement() {
UIWidgets::CheckboxOptions()
.Tooltip("Automatically scroll to the first available entrance in the current scene")
.Color(THEME_COLOR));
+ ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0));
UIWidgets::CVarCheckbox("Highlight previous", CVAR_TRACKER_ENTRANCE("HighlightPrevious"),
UIWidgets::CheckboxOptions()
.Tooltip("Highlight the previous entrance that Link came from")
@@ -698,6 +699,7 @@ void EntranceTrackerSettingsWindow::DrawElement() {
UIWidgets::CheckboxOptions()
.Tooltip("Highlight available entrances in the current scene")
.Color(THEME_COLOR));
+ ImGui::EndDisabled();
UIWidgets::CVarCheckbox("Hide undiscovered", CVAR_TRACKER_ENTRANCE("CollapseUndiscovered"),
UIWidgets::CheckboxOptions()
.Tooltip("Collapse undiscovered entrances towards the bottom of each group")
@@ -724,6 +726,7 @@ void EntranceTrackerSettingsWindow::DrawElement() {
UIWidgets::RadioButtonsOptions().Color(THEME_COLOR).Tooltip("Group entrances by their entrance type"));
ImGui::Text("Spoiler Reveal");
+ ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0));
UIWidgets::CVarCheckbox(
"Show Source", CVAR_TRACKER_ENTRANCE("ShowFrom"),
UIWidgets::CheckboxOptions().Tooltip("Reveal the sourcefor undiscovered entrances").Color(THEME_COLOR));
@@ -731,7 +734,7 @@ void EntranceTrackerSettingsWindow::DrawElement() {
UIWidgets::CheckboxOptions()
.Tooltip("Reveal the destination for undiscovered entrances")
.Color(THEME_COLOR));
-
+ ImGui::EndDisabled();
ImGui::EndTable();
}
diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h
index 048fcc86c..b6cb4d1dd 100644
--- a/soh/soh/Enhancements/randomizer/randomizer_inf.h
+++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h
@@ -1952,6 +1952,7 @@ typedef enum {
RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_7,
RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_8,
// End Grass
+ RAND_INF_OBTAINED_RUTOS_LETTER,
// If you add anything to this list, you need to update the size of randomizerInf in z64save.h to be
// ceil(RAND_INF_MAX / 16)
diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp
index b86da3c0c..9b7b1fd39 100644
--- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp
+++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp
@@ -1162,8 +1162,10 @@ void BeginFloatingWindows(std::string UniqueName, ImGuiWindowFlags flags = 0) {
}
}
auto color = VecFromRGBA8(CVarGetColor(CVAR_TRACKER_ITEM("BgColor.Value"), { 0, 0, 0, 0 }));
+ auto maybeParent = ImGui::GetCurrentWindow();
ImGuiWindow* window = ImGui::FindWindowByName(UniqueName.c_str());
- if (window != NULL && window->DockTabIsVisible) {
+ if (window != NULL && window->DockTabIsVisible && window->ParentWindow != NULL &&
+ std::string(window->ParentWindow->Name).compare(0, strlen("Main - Deck"), "Main - Deck") == 0) {
color.w = 1.0f;
}
ImGui::PushStyleColor(ImGuiCol_WindowBg, color);
diff --git a/soh/soh/Notification/Notification.cpp b/soh/soh/Notification/Notification.cpp
index 4ba779e54..14873b068 100644
--- a/soh/soh/Notification/Notification.cpp
+++ b/soh/soh/Notification/Notification.cpp
@@ -61,7 +61,7 @@ void Window::Draw() {
ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoFocusOnAppearing |
ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoTitleBar |
ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoMove |
- ImGuiWindowFlags_NoScrollbar);
+ ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoSavedSettings);
ImGui::SetWindowFontScale(CVarGetFloat(CVAR_SETTING("Notifications.Size"), 1.8f)); // Make this adjustable
diff --git a/soh/soh/SohGui/Menu.cpp b/soh/soh/SohGui/Menu.cpp
index a1321a6f6..87c362496 100644
--- a/soh/soh/SohGui/Menu.cpp
+++ b/soh/soh/SohGui/Menu.cpp
@@ -65,6 +65,8 @@ uint32_t GetVectorIndexOf(std::vector& vector, std::string value) {
return std::distance(vector.begin(), std::find(vector.begin(), vector.end(), value));
}
+static bool raceDisableActive = false;
+
void Menu::InsertSidebarSearch() {
menuEntries["Settings"].sidebars.emplace("Search", searchSidebarEntry);
uint32_t curIndex = 0;
@@ -228,7 +230,7 @@ std::unordered_map& Menu::GetDisabledMap() {
}
void Menu::MenuDrawItem(WidgetInfo& widget, uint32_t width, UIWidgets::Colors menuThemeIndex) {
- disabledTempTooltip = "This setting is disabled because: \n\n";
+ disabledTempTooltip = "This setting is disabled because: \n";
disabledValue = false;
disabledTooltip = " ";
@@ -241,11 +243,16 @@ void Menu::MenuDrawItem(WidgetInfo& widget, uint32_t width, UIWidgets::Colors me
if (!widget.activeDisables.empty()) {
widget.options->disabled = true;
for (auto option : widget.activeDisables) {
- disabledTempTooltip += std::string("- ") + disabledMap.at(option).reason + std::string("\n");
+ disabledTempTooltip += std::string("\n- ") + disabledMap.at(option).reason;
}
widget.options->disabledTooltip = disabledTempTooltip.c_str();
}
}
+ if (widget.raceDisable && raceDisableActive) {
+ widget.options->disabled = true;
+ disabledTempTooltip += std::string("\n- Race Lockout Active");
+ widget.options->disabledTooltip = disabledTempTooltip.c_str();
+ }
if (widget.sameLine) {
ImGui::SameLine();
@@ -492,6 +499,8 @@ void Menu::DrawElement() {
info.active = info.evaluation(info);
}
+ raceDisableActive = CVarGetInteger(CVAR_SETTING("DisableChanges"), 0);
+
windowHeight = ImGui::GetMainViewport()->WorkSize.y;
windowWidth = ImGui::GetMainViewport()->WorkSize.x;
auto windowFlags = ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoSavedSettings;
diff --git a/soh/soh/SohGui/MenuTypes.h b/soh/soh/SohGui/MenuTypes.h
index 162f80ac5..de78e8961 100644
--- a/soh/soh/SohGui/MenuTypes.h
+++ b/soh/soh/SohGui/MenuTypes.h
@@ -109,6 +109,7 @@ struct WidgetInfo {
const char* windowName = "";
bool isHidden = false;
bool sameLine = false;
+ bool raceDisable = true;
WidgetInfo& CVar(const char* cVar_) {
cVar = cVar_;
@@ -191,6 +192,10 @@ struct WidgetInfo {
customFunction = customFunction_;
return *this;
}
+ WidgetInfo& RaceDisable(bool disable) {
+ raceDisable = disable;
+ return *this;
+ }
};
struct WidgetPath {
diff --git a/soh/soh/SohGui/ResolutionEditor.cpp b/soh/soh/SohGui/ResolutionEditor.cpp
index 298e2c470..d33a7b43c 100644
--- a/soh/soh/SohGui/ResolutionEditor.cpp
+++ b/soh/soh/SohGui/ResolutionEditor.cpp
@@ -371,29 +371,37 @@ void RegisterResolutionWidgets() {
WidgetPath path = { "Settings", "Graphics", SECTION_COLUMN_2 };
// Resolution visualiser
- mSohMenu->AddWidget(path, "Viewport dimensions: {} x {}", WIDGET_TEXT).PreFunc([](WidgetInfo& info) {
- info.name = fmt::format("Viewport dimensions: {} x {}", gfx_current_game_window_viewport.width,
- gfx_current_game_window_viewport.height);
- });
- mSohMenu->AddWidget(path, "Internal resolution: {} x {}", WIDGET_TEXT).PreFunc([](WidgetInfo& info) {
- info.name =
- fmt::format("Internal resolution: {} x {}", gfx_current_dimensions.width, gfx_current_dimensions.height);
- });
+ mSohMenu->AddWidget(path, "Viewport dimensions: {} x {}", WIDGET_TEXT)
+ .RaceDisable(false)
+ .PreFunc([](WidgetInfo& info) {
+ info.name = fmt::format("Viewport dimensions: {} x {}", gfx_current_game_window_viewport.width,
+ gfx_current_game_window_viewport.height);
+ });
+ mSohMenu->AddWidget(path, "Internal resolution: {} x {}", WIDGET_TEXT)
+ .RaceDisable(false)
+ .PreFunc([](WidgetInfo& info) {
+ info.name = fmt::format("Internal resolution: {} x {}", gfx_current_dimensions.width,
+ gfx_current_dimensions.height);
+ });
// Activator
mSohMenu->AddWidget(path, "Enable advanced settings.", WIDGET_CVAR_CHECKBOX)
- .CVar(CVAR_PREFIX_ADVANCED_RESOLUTION ".Enabled");
+ .CVar(CVAR_PREFIX_ADVANCED_RESOLUTION ".Enabled")
+ .RaceDisable(false);
// Error/Warning display
mSohMenu
->AddWidget(path, ICON_FA_EXCLAMATION_TRIANGLE " Significant frame rate (FPS) drops may be occuring.",
WIDGET_TEXT)
+ .RaceDisable(false)
.PreFunc(
[](WidgetInfo& info) { info.isHidden = !(!CVarGetInteger(CVAR_LOW_RES_MODE, 0) && IsDroppingFrames()); })
.Options(TextOptions().Color(Colors::Orange));
mSohMenu->AddWidget(path, ICON_FA_QUESTION_CIRCLE " \"N64 Mode\" is overriding these settings.", WIDGET_TEXT)
+ .RaceDisable(false)
.PreFunc([](WidgetInfo& info) { info.isHidden = !CVarGetInteger(CVAR_LOW_RES_MODE, 0); })
.Options(TextOptions().Color(Colors::LightBlue));
mSohMenu->AddWidget(path, "Click to disable N64 mode", WIDGET_BUTTON)
+ .RaceDisable(false)
.PreFunc([](WidgetInfo& info) { info.isHidden = !CVarGetInteger(CVAR_LOW_RES_MODE, 0); })
.Callback([](WidgetInfo& info) {
CVarSetInteger(CVAR_LOW_RES_MODE, 0);
@@ -401,17 +409,18 @@ void RegisterResolutionWidgets() {
});
// Aspect Ratio
- mSohMenu->AddWidget(path, "AspectSep", WIDGET_SEPARATOR).PreFunc([](WidgetInfo& info) {
+ mSohMenu->AddWidget(path, "AspectSep", WIDGET_SEPARATOR).RaceDisable(false).PreFunc([](WidgetInfo& info) {
if (mSohMenu->GetDisabledMap().at(DISABLE_FOR_ADVANCED_RESOLUTION_OFF).active) {
info.activeDisables.push_back(DISABLE_FOR_ADVANCED_RESOLUTION_OFF);
}
});
- mSohMenu->AddWidget(path, "Force aspect ratio:", WIDGET_TEXT).PreFunc([](WidgetInfo& info) {
+ mSohMenu->AddWidget(path, "Force aspect ratio:", WIDGET_TEXT).RaceDisable(false).PreFunc([](WidgetInfo& info) {
if (mSohMenu->GetDisabledMap().at(DISABLE_FOR_ADVANCED_RESOLUTION_OFF).active) {
info.activeDisables.push_back(DISABLE_FOR_ADVANCED_RESOLUTION_OFF);
}
});
mSohMenu->AddWidget(path, "(Select \"Off\" to disable.)", WIDGET_TEXT)
+ .RaceDisable(false)
.PreFunc([](WidgetInfo& info) {
if (mSohMenu->GetDisabledMap().at(DISABLE_FOR_ADVANCED_RESOLUTION_OFF).active) {
info.activeDisables.push_back(DISABLE_FOR_ADVANCED_RESOLUTION_OFF);
@@ -422,6 +431,7 @@ void RegisterResolutionWidgets() {
// Presets
mSohMenu->AddWidget(path, "Aspect Ratio", WIDGET_COMBOBOX)
.ValuePointer(&item_aspectRatio)
+ .RaceDisable(false)
.PreFunc([](WidgetInfo& info) {
if (mSohMenu->GetDisabledMap().at(DISABLE_FOR_ADVANCED_RESOLUTION_OFF).active) {
info.activeDisables.push_back(DISABLE_FOR_ADVANCED_RESOLUTION_OFF);
@@ -443,44 +453,49 @@ void RegisterResolutionWidgets() {
Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame();
})
.Options(ComboboxOptions().ComboMap(aspectRatioPresetLabels));
- mSohMenu->AddWidget(path, "AspectRatioCustom", WIDGET_CUSTOM).CustomFunction([](WidgetInfo& info) {
- // Hide aspect ratio input fields if using one of the presets.
- if (item_aspectRatio == default_aspectRatio && !showHorizontalResField) {
- // Declare input interaction bools outside of IF statement to prevent Y field from disappearing.
- const bool input_X =
- UIWidgets::SliderFloat("X", &aspectRatioX,
- UIWidgets::FloatSliderOptions({ { .disabled = disabled_everything } })
- .Min(0.1f)
- .Max(32.0f)
- .Step(0.001f)
- .Format("%3f")
- .Color(THEME_COLOR)
- .LabelPosition(UIWidgets::LabelPositions::Near)
- .ComponentAlignment(UIWidgets::ComponentAlignments::Right));
- const bool input_Y =
- UIWidgets::SliderFloat("Y", &aspectRatioY,
- UIWidgets::FloatSliderOptions({ { .disabled = disabled_everything } })
- .Min(0.1f)
- .Max(24.0f)
- .Step(0.001f)
- .Format("%3f")
- .Color(THEME_COLOR)
- .LabelPosition(UIWidgets::LabelPositions::Near)
- .ComponentAlignment(UIWidgets::ComponentAlignments::Right));
- if (input_X || input_Y) {
- item_aspectRatio = default_aspectRatio;
- update[UPDATE_aspectRatioX] = true;
- update[UPDATE_aspectRatioY] = true;
+ mSohMenu->AddWidget(path, "AspectRatioCustom", WIDGET_CUSTOM)
+ .RaceDisable(false)
+ .CustomFunction([](WidgetInfo& info) {
+ // Hide aspect ratio input fields if using one of the presets.
+ if (item_aspectRatio == default_aspectRatio && !showHorizontalResField) {
+ // Declare input interaction bools outside of IF statement to prevent Y field from disappearing.
+ const bool input_X =
+ UIWidgets::SliderFloat("X", &aspectRatioX,
+ UIWidgets::FloatSliderOptions({ { .disabled = disabled_everything } })
+ .Min(0.1f)
+ .Max(32.0f)
+ .Step(0.001f)
+ .Format("%3f")
+ .Color(THEME_COLOR)
+ .LabelPosition(UIWidgets::LabelPositions::Near)
+ .ComponentAlignment(UIWidgets::ComponentAlignments::Right));
+ const bool input_Y =
+ UIWidgets::SliderFloat("Y", &aspectRatioY,
+ UIWidgets::FloatSliderOptions({ { .disabled = disabled_everything } })
+ .Min(0.1f)
+ .Max(24.0f)
+ .Step(0.001f)
+ .Format("%3f")
+ .Color(THEME_COLOR)
+ .LabelPosition(UIWidgets::LabelPositions::Near)
+ .ComponentAlignment(UIWidgets::ComponentAlignments::Right));
+ if (input_X || input_Y) {
+ item_aspectRatio = default_aspectRatio;
+ update[UPDATE_aspectRatioX] = true;
+ update[UPDATE_aspectRatioY] = true;
+ }
+ } else if (showHorizontalResField) { // Show calculated aspect ratio
+ if (item_aspectRatio) {
+ ImGui::Dummy({ 0, 2 });
+ const float resolvedAspectRatio =
+ (float)gfx_current_dimensions.width / gfx_current_dimensions.height;
+ ImGui::Text("Aspect ratio: %.2f:1", resolvedAspectRatio);
+ }
}
- } else if (showHorizontalResField) { // Show calculated aspect ratio
- if (item_aspectRatio) {
- ImGui::Dummy({ 0, 2 });
- const float resolvedAspectRatio = (float)gfx_current_dimensions.width / gfx_current_dimensions.height;
- ImGui::Text("Aspect ratio: %.2f:1", resolvedAspectRatio);
- }
- }
- });
- mSohMenu->AddWidget(path, "MoreResolutionSettings", WIDGET_CUSTOM).CustomFunction(ResolutionCustomWidget);
+ });
+ mSohMenu->AddWidget(path, "MoreResolutionSettings", WIDGET_CUSTOM)
+ .CustomFunction(ResolutionCustomWidget)
+ .RaceDisable(false);
}
void UpdateResolutionVars() {
diff --git a/soh/soh/SohGui/SohMenuDevTools.cpp b/soh/soh/SohGui/SohMenuDevTools.cpp
index 0588ae508..91d456c95 100644
--- a/soh/soh/SohGui/SohMenuDevTools.cpp
+++ b/soh/soh/SohGui/SohMenuDevTools.cpp
@@ -93,6 +93,7 @@ void SohMenu::AddMenuDevTools() {
AddSidebarEntry("Dev Tools", path.sidebarName, 1);
AddWidget(path, "Popout Stats Window", WIDGET_WINDOW_BUTTON)
.CVar(CVAR_WINDOW("SohStats"))
+ .RaceDisable(false)
.WindowName("Stats##Soh")
.Options(WindowButtonOptions().Tooltip("Enables the separate Stats Window."));
diff --git a/soh/soh/SohGui/SohMenuEnhancements.cpp b/soh/soh/SohGui/SohMenuEnhancements.cpp
index 786183882..0b78892d4 100644
--- a/soh/soh/SohGui/SohMenuEnhancements.cpp
+++ b/soh/soh/SohGui/SohMenuEnhancements.cpp
@@ -85,6 +85,7 @@ void SohMenu::AddMenuEnhancements() {
AddWidget(path, "Saving", WIDGET_SEPARATOR_TEXT);
AddWidget(path, "Autosave", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("Autosave"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip(
"Save the game automatically on a 3 minute interval and when soft-resetting the game. The interval "
"autosave will wait if the game is paused in any way (dialogue, pause screen up, cutscenes, "
@@ -168,9 +169,11 @@ void SohMenu::AddMenuEnhancements() {
AddWidget(path, "Controls", WIDGET_SEPARATOR_TEXT);
AddWidget(path, "Answer Navi Prompt with L Button", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("NaviOnL"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip("Speak to Navi with L but enter First-Person Camera with C-Up."));
AddWidget(path, "Don't Require Input for Credits Sequence", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("NoInputForCredits"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip(
"Removes the Input Requirement on Text boxes after defeating Ganon, allowing the Credits "
"Sequence to continue to progress."));
@@ -202,14 +205,20 @@ void SohMenu::AddMenuEnhancements() {
AddWidget(path, "Item Count Messages", WIDGET_SEPARATOR_TEXT);
AddWidget(path, "Gold Skulltula Tokens", WIDGET_CVAR_CHECKBOX)
- .CVar(CVAR_ENHANCEMENT("InjectItemCounts.GoldSkulltula"));
- AddWidget(path, "Pieces of Heart", WIDGET_CVAR_CHECKBOX).CVar(CVAR_ENHANCEMENT("InjectItemCounts.HeartPiece"));
- AddWidget(path, "Heart Containers", WIDGET_CVAR_CHECKBOX).CVar(CVAR_ENHANCEMENT("InjectItemCounts.HeartContainer"));
+ .CVar(CVAR_ENHANCEMENT("InjectItemCounts.GoldSkulltula"))
+ .RaceDisable(false);
+ AddWidget(path, "Pieces of Heart", WIDGET_CVAR_CHECKBOX)
+ .CVar(CVAR_ENHANCEMENT("InjectItemCounts.HeartPiece"))
+ .RaceDisable(false);
+ AddWidget(path, "Heart Containers", WIDGET_CVAR_CHECKBOX)
+ .CVar(CVAR_ENHANCEMENT("InjectItemCounts.HeartContainer"))
+ .RaceDisable(false);
path.column = SECTION_COLUMN_3;
AddWidget(path, "Misc", WIDGET_SEPARATOR_TEXT);
AddWidget(path, "Disable Crit Wiggle", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("DisableCritWiggle"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip("Disable Random Camera Wiggle at Low Health."));
AddWidget(path, "Better Owl", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("BetterOwl"))
@@ -430,27 +439,32 @@ void SohMenu::AddMenuEnhancements() {
AddWidget(path, "Mods", WIDGET_SEPARATOR_TEXT);
AddWidget(path, "Use Alternate Assets", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_SETTING("AltAssets"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip(
"Toggle between standard assets and alternate assets. Usually mods will indicate if "
"this setting has to be used or not."));
AddWidget(path, "Disable Bomb Billboarding", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("DisableBombBillboarding"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip(
"Disables bombs always rotating to face the camera. To be used in conjunction with mods that want to "
"replace bombs with 3D objects."));
AddWidget(path, "Disable Grotto Fixed Rotation", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("DisableGrottoRotation"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip(
"Disables Grottos rotating with the Camera. To be used in conjuction with mods that want to "
"replace grottos with 3D objects."));
AddWidget(path, "Ingame Text Spacing: %d", WIDGET_CVAR_SLIDER_INT)
.CVar(CVAR_ENHANCEMENT("TextSpacing"))
+ .RaceDisable(false)
.Options(IntSliderOptions().Min(4).Max(6).DefaultValue(6).Tooltip(
"Space between text characters (useful for HD font textures)."));
AddWidget(path, "Models & Textures", WIDGET_SEPARATOR_TEXT);
AddWidget(path, "Disable LOD", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("DisableLOD"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip(
"Turns off the Level of Detail setting, making models use their Higher-Poly variants at any distance."));
AddWidget(path, "Enemy Health Bars", WIDGET_CVAR_CHECKBOX)
@@ -458,18 +472,22 @@ void SohMenu::AddMenuEnhancements() {
.Options(CheckboxOptions().Tooltip("Renders a health bar for Enemies when Z-Targeted."));
AddWidget(path, "Enable 3D Dropped Items/Projectiles", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("NewDrops"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip(
"Replaces most 2D items and projectiles on the overworld with their equivalent 3D models."));
AddWidget(path, "Animated Link in Pause Menu", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("PauseMenuAnimatedLink"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip("Turns the Static Image of Link in the Pause Menu's Equipment Subscreen "
"into a model cycling through his idle animations."));
AddWidget(path, "Show Age-Dependent Equipment", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("EquipmentAlwaysVisible"))
+ .RaceDisable(false)
.Callback([](WidgetInfo& info) { UpdatePatchHand(); })
.Options(CheckboxOptions().Tooltip("Makes all equipment visible, regardless of age."));
AddWidget(path, "Scale Adult Equipment as Child", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("ScaleAdultEquipmentAsChild"))
+ .RaceDisable(false)
.PreFunc([](WidgetInfo& info) {
info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("EquipmentAlwaysVisible"), 0) == 0;
})
@@ -478,11 +496,14 @@ void SohMenu::AddMenuEnhancements() {
"not work properly with some mods."));
AddWidget(path, "Show Gauntlets in First Person", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("FirstPersonGauntlets"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip("Renders Gauntlets when using the Bow and Hookshot like in OoT3D."));
AddWidget(path, "Show Chains on Both Sides of Locked Doors", WIDGET_CVAR_CHECKBOX)
- .CVar(CVAR_ENHANCEMENT("ShowDoorLocksOnBothSides"));
+ .CVar(CVAR_ENHANCEMENT("ShowDoorLocksOnBothSides"))
+ .RaceDisable(false);
AddWidget(path, "Color Temple of Time's Medallions", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("ToTMedallionsColors"))
+ .RaceDisable(false)
.Callback([](WidgetInfo& info) { PatchToTMedallions(); })
.Options(CheckboxOptions().Tooltip(
"When Medallions are collected, the Medallion imprints around the Master Sword Pedestal in the Temple "
@@ -500,15 +521,18 @@ void SohMenu::AddMenuEnhancements() {
"in Hot/Underwater conditions."));
AddWidget(path, "Remember Minimap State Between Areas", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("RememberMapToggleState"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip(
- "Preverse the minimap visibility state when going between areas rather than default it to \"on\" "
+ "Preserve the minimap visibility state when going between areas rather than default it to \"on\" "
"when going through loading zones."));
AddWidget(path, "Visual Stone of Agony", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("VisualAgony"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip(
"Displays an icon and plays a sound when Stone of Agony should be activated, for those without rumble."));
AddWidget(path, "Disable HUD Heart Animations", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("NoHUDHeartAnimation"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip("Disables the Beating Animation of the Hearts on the HUD."));
AddWidget(path, "Glitch Line-up Tick", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("DrawLineupTick"))
@@ -517,26 +541,32 @@ void SohMenu::AddMenuEnhancements() {
"UI based line-ups do not work outside of 4:3"));
AddWidget(path, "Disable Black Bar Letterboxes", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("DisableBlackBars"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip(
"Disables Black Bar Letterboxes during cutscenes and Z-Targeting. NOTE: There may be minor visual "
"glitches that were covered up by the black bars. Please disable this setting before reporting a bug."));
AddWidget(path, "Dynamic Wallet Icon", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("DynamicWalletIcon"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip(
"Changes the Rupee in the Wallet icon to match the wallet size you currently have."));
AddWidget(path, "Always Show Dungeon Entrances", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("AlwaysShowDungeonMinimapIcon"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip("Always shows dungeon entrance icons on the Minimap."));
AddWidget(path, "More Info in File Select", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("FileSelectMoreInfo"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip(
"Shows what items you have collected in the File Select screen, like in N64 Randomizer."));
AddWidget(path, "Better Ammo Rendering in Pause Menu", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("BetterAmmoRendering"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip(
"Ammo counts in the pause menu will work correctly regardless of the position of items in the Inventory."));
AddWidget(path, "Enable Passage of Time on File Select", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("TimeFlowFileSelect"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip("The skybox in the background of the File Select screen will go through the "
"day and night cycle over time."));
@@ -544,14 +574,17 @@ void SohMenu::AddMenuEnhancements() {
AddWidget(path, "Misc.", WIDGET_SEPARATOR_TEXT);
AddWidget(path, "N64 Mode", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_LOW_RES_MODE)
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip(
"Sets the aspect ratio to 4:3 and lowers resolution to 240p, the N64's native resolution."));
AddWidget(path, "Remove Spin Attack Darkness", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("RemoveSpinAttackDarkness"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip("Remove the Darkness that appears when charging a Spin Attack."));
- AddWidget(path, "Draw Distance", WIDGET_SEPARATOR_TEXT);
+ AddWidget(path, "Draw Distance", WIDGET_SEPARATOR_TEXT).RaceDisable(false);
AddWidget(path, "Increase Actor Draw Distance: %dx", WIDGET_CVAR_SLIDER_INT)
.CVar(CVAR_ENHANCEMENT("DisableDrawDistance"))
+ .RaceDisable(false)
.Callback([](WidgetInfo& info) {
if (CVarGetInteger(CVAR_ENHANCEMENT("DisableDrawDistance"), 1) <= 1) {
CVarSetInteger(CVAR_ENHANCEMENT("DisableKokiriDrawDistance"), 0);
@@ -561,6 +594,7 @@ void SohMenu::AddMenuEnhancements() {
"Increases the range in which Actors/Objects are drawn."));
AddWidget(path, "Kokiri Draw Distance", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("DisableKokiriDrawDistance"))
+ .RaceDisable(false)
.PreFunc(
[](WidgetInfo& info) { info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("DisableDrawDistance"), 1) <= 1; })
.Options(CheckboxOptions().Tooltip(
@@ -860,7 +894,7 @@ void SohMenu::AddMenuEnhancements() {
[](WidgetInfo& info) { info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("CrouchStabHammerFix"), 0) == 0; })
.Options(CheckboxOptions().Tooltip("Make crouch stabbing always do the same damage as a regular slash."));
AddWidget(path, "Fix Broken Giant's Knife Bug", WIDGET_CVAR_CHECKBOX)
- .CVar(CVAR_ENHANCEMENT("FixGrokenGiantsKnife"))
+ .CVar(CVAR_ENHANCEMENT("FixBrokenGiantsKnife"))
.PreFunc([](WidgetInfo& info) {
info.options->disabled = IS_RANDO && GameInteractor::IsSaveLoaded(true);
info.options->disabledTooltip = "This setting is forcefully enabled when you are playing a Randomizer.";
@@ -896,22 +930,27 @@ void SohMenu::AddMenuEnhancements() {
AddWidget(path, "Graphical Fixes", WIDGET_SEPARATOR_TEXT);
AddWidget(path, "Fix L&R Pause Menu", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("FixMenuLR"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip("Makes the L and R buttons in the pause menu the same color."));
AddWidget(path, "Fix Dungeon Entrances", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("FixDungeonMinimapIcon"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip(
"Removes the Dungeon Entrance icon on the top-left corner of the screen when no dungeon is present on the "
"current map."));
AddWidget(path, "Fix Two-Handed Idle Animations", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("TwoHandedIdle"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip(
"Re-Enables the two-handed idle animation, a seemingly finished animation that was disabled on accident "
"in the original game."));
AddWidget(path, "Fix Navi Text HUD Position", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("NaviTextFix"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip("Correctly centers the Navi text prompt on the HUD's C-Up button."));
AddWidget(path, "Fix Gerudo Warrior's Clothing Colors", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("GerudoWarriorClothingFix"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip(
"Prevent the Gerudo Warrior's clothes changing color when changing Link's tunic or "
"using bombs in front of her."));
@@ -922,15 +961,18 @@ void SohMenu::AddMenuEnhancements() {
"Fixes authentic out of bounds texture reads, instead loading textures with the correct size."));
AddWidget(path, "Fix Link's Eyes Open while Sleeping", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("FixEyesOpenWhileSleeping"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip(
"Fixes Link's eyes being open in the opening cutscene when he is supposed to be sleeping."));
AddWidget(path, "Fix Hand Holding Hammer", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("FixHammerHand"))
+ .RaceDisable(false)
.Callback([](WidgetInfo& info) { UpdatePatchHand(); })
.Options(CheckboxOptions().Tooltip(
"Fixes Adult Link having a backwards Left hand when holding the Megaton Hammer."));
AddWidget(path, "Fix Vanishing Paths", WIDGET_CVAR_COMBOBOX)
.CVar(CVAR_ENHANCEMENT("SceneSpecificDirtPathFix"))
+ .RaceDisable(false)
.Callback([](WidgetInfo& info) {
if (gPlayState != NULL) {
UpdateDirtPathFixState(gPlayState->sceneNum);
@@ -948,6 +990,7 @@ void SohMenu::AddMenuEnhancements() {
AddWidget(path, "Audio Fixes", WIDGET_SEPARATOR_TEXT);
AddWidget(path, "Fix Missing Jingle after 5 Silver Rupees", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("SilverRupeeJingleExtend"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip(
"Adds 5 higher pitches for the Silver Rupee Jingle for the rooms with more than 5 Silver Rupees. "
"Only relevant for playthroughs involving Master Quest Dungeons."));
@@ -955,10 +998,12 @@ void SohMenu::AddMenuEnhancements() {
AddWidget(path, "Desync Fixes", WIDGET_SEPARATOR_TEXT);
AddWidget(path, "Fix Darunia Dancing too Fast", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("FixDaruniaDanceSpeed"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip(
"Fixes Darunia's dancing speed so he dances to the beat of Saria's Song, like in the Original Game."));
AddWidget(path, "Fix Credits Timing (PAL)", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("CreditsFix"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip(
"Extend certain credits scenes so the music lines up properly with the visuals. (PAL only)"));
@@ -966,6 +1011,7 @@ void SohMenu::AddMenuEnhancements() {
AddWidget(path, "Graphical Restorations", WIDGET_SEPARATOR_TEXT);
AddWidget(path, "Red Ganon Blood", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("RedGanonBlood"))
+ .RaceDisable(false)
.Options(
CheckboxOptions().Tooltip("Restore the original red blood from NTSC 1.0/1.1. Disable for Green blood."));
AddWidget(path, "Restore Old Gold Skulltula Cutscene", WIDGET_CVAR_CHECKBOX)
@@ -974,6 +1020,7 @@ void SohMenu::AddMenuEnhancements() {
"Restore pre-release behavior where defeating a Gold Skulltula will play a cutscene showing it die."));
AddWidget(path, "Pulsate Boss Icon", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("PulsateBossIcon"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip(
"Restores an unfinished feature to pulsate the boss room icon when you are in the boss room."));
@@ -1657,6 +1704,7 @@ void SohMenu::AddMenuEnhancements() {
path.column = SECTION_COLUMN_1;
AddWidget(path, "Popout Cosmetics Editor Window", WIDGET_WINDOW_BUTTON)
.CVar(CVAR_WINDOW("CosmeticsEditor"))
+ .RaceDisable(false)
.WindowName("Cosmetics Editor")
.Options(WindowButtonOptions().Tooltip("Enables the separate Cosmetics Editor Window."));
@@ -1665,6 +1713,7 @@ void SohMenu::AddMenuEnhancements() {
AddSidebarEntry("Enhancements", path.sidebarName, 1);
AddWidget(path, "Popout Audio Editor Window", WIDGET_WINDOW_BUTTON)
.CVar(CVAR_WINDOW("AudioEditor"))
+ .RaceDisable(false)
.WindowName("Audio Editor")
.Options(WindowButtonOptions().Tooltip("Enables the separate Audio Editor Window."));
@@ -1673,6 +1722,7 @@ void SohMenu::AddMenuEnhancements() {
AddSidebarEntry("Enhancements", path.sidebarName, 2);
AddWidget(path, "Popout Gameplay Stats Window", WIDGET_WINDOW_BUTTON)
.CVar(CVAR_WINDOW("GameplayStats"))
+ .RaceDisable(false)
.WindowName("Gameplay Stats")
.Options(WindowButtonOptions().Tooltip("Enables the separate Gameplay Stats Window."));
@@ -1681,6 +1731,7 @@ void SohMenu::AddMenuEnhancements() {
AddSidebarEntry("Enhancements", path.sidebarName, 1);
AddWidget(path, "Popout Time Splits Window", WIDGET_WINDOW_BUTTON)
.CVar(CVAR_WINDOW("TimeSplits"))
+ .RaceDisable(false)
.WindowName("Time Splits")
.Options(WindowButtonOptions().Tooltip("Enables the separate Time Splits Window."));
@@ -1689,19 +1740,23 @@ void SohMenu::AddMenuEnhancements() {
AddSidebarEntry("Enhancements", path.sidebarName, 3);
AddWidget(path, "Toggle Timers Window", WIDGET_WINDOW_BUTTON)
.CVar(CVAR_WINDOW("TimeDisplayEnabled"))
+ .RaceDisable(false)
.WindowName("Additional Timers")
.Options(WindowButtonOptions().Tooltip("Enables the separate Additional Timers Window."));
AddWidget(path, "Font Scale: %.2fx", WIDGET_CVAR_SLIDER_FLOAT)
.CVar(CVAR_TIME_DISPLAY("FontScale"))
+ .RaceDisable(false)
.Callback([](WidgetInfo& info) { TimeDisplayInitSettings(); })
.Options(FloatSliderOptions().Min(1.0f).Max(5.0f).DefaultValue(1.0f).Format("%.2fx"));
AddWidget(path, "Hide Background", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_TIME_DISPLAY("ShowWindowBG"))
+ .RaceDisable(false)
.Callback([](WidgetInfo& info) { TimeDisplayInitSettings(); });
for (auto& timer : timeDisplayList) {
- AddWidget(path, timer.timeLabel, WIDGET_CVAR_CHECKBOX).CVar(timer.timeEnable).Callback([](WidgetInfo& info) {
- TimeDisplayUpdateDisplayOptions();
- });
+ AddWidget(path, timer.timeLabel, WIDGET_CVAR_CHECKBOX)
+ .RaceDisable(false)
+ .CVar(timer.timeEnable)
+ .Callback([](WidgetInfo& info) { TimeDisplayUpdateDisplayOptions(); });
}
}
diff --git a/soh/soh/SohGui/SohMenuNetwork.cpp b/soh/soh/SohGui/SohMenuNetwork.cpp
index 1c67ce28d..637c78285 100644
--- a/soh/soh/SohGui/SohMenuNetwork.cpp
+++ b/soh/soh/SohGui/SohMenuNetwork.cpp
@@ -39,7 +39,7 @@ void SohMenu::AddMenuNetwork() {
})
.Options(ButtonOptions().Tooltip("https://github.com/HarbourMasters/sail"));
AddWidget(path, "Host & Port", WIDGET_CUSTOM).CustomFunction([](WidgetInfo& info) {
- ImGui::BeginDisabled(Sail::Instance->isEnabled);
+ ImGui::BeginDisabled(Sail::Instance->isEnabled || CVarGetInteger(CVAR_SETTING("DisableChanges"), 0));
ImGui::Text("%s", info.name.c_str());
CVarInputString("##HostSail", CVAR_REMOTE_SAIL("Host"),
InputOptions()
@@ -111,7 +111,7 @@ void SohMenu::AddMenuNetwork() {
})
.Options(ButtonOptions().Tooltip("https://crowdcontrol.live"));
AddWidget(path, "Host & Port", WIDGET_CUSTOM).CustomFunction([](WidgetInfo& info) {
- ImGui::BeginDisabled(CrowdControl::Instance->isEnabled);
+ ImGui::BeginDisabled(CrowdControl::Instance->isEnabled || CVarGetInteger(CVAR_SETTING("DisableChanges"), 0));
ImGui::Text("%s", info.name.c_str());
CVarInputString("##HostCrowdControl", CVAR_REMOTE_CROWD_CONTROL("Host"),
InputOptions()
diff --git a/soh/soh/SohGui/SohMenuRandomizer.cpp b/soh/soh/SohGui/SohMenuRandomizer.cpp
index 9c95431e8..8f4e6e43b 100644
--- a/soh/soh/SohGui/SohMenuRandomizer.cpp
+++ b/soh/soh/SohGui/SohMenuRandomizer.cpp
@@ -29,6 +29,7 @@ void SohMenu::AddMenuRandomizer() {
.DefaultValue(true));
AddWidget(path, "Random Rupee Names", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_RANDOMIZER_ENHANCEMENT("RandomizeRupeeNames"))
+ .RaceDisable(false)
.Options(CheckboxOptions()
.Tooltip("When obtaining Rupees, randomize what the Rupee is called in the textbox.")
.DefaultValue(true));
@@ -60,6 +61,7 @@ void SohMenu::AddMenuRandomizer() {
.DefaultValue(true));
AddWidget(path, "Quest Item Fanfares", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_RANDOMIZER_ENHANCEMENT("QuestItemFanfares"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip(
"Play unique fanfares when obtaining quest items (medallions/stones/songs). Note that these "
"fanfares can be longer than usual."));
@@ -71,6 +73,7 @@ void SohMenu::AddMenuRandomizer() {
"so you never know what you're getting."));
AddWidget(path, "Simpler Boss Soul Models", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_RANDOMIZER_ENHANCEMENT("SimplerBossSoulModels"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip(
"When shuffling boss souls, they'll appear as a simpler model instead of showing the boss' models."
"This might make boss souls more distinguishable from a distance, and can help with performance."));
@@ -93,6 +96,7 @@ void SohMenu::AddMenuRandomizer() {
AddSidebarEntry("Randomizer", path.sidebarName, 1);
AddWidget(path, "Popout Plandomizer Window", WIDGET_WINDOW_BUTTON)
.CVar(CVAR_WINDOW("PlandomizerEditor"))
+ .RaceDisable(false)
.WindowName("Plandomizer Editor")
.Options(WindowButtonOptions().Tooltip("Enables the separate Randomizer Settings Window."));
@@ -103,12 +107,14 @@ void SohMenu::AddMenuRandomizer() {
AddWidget(path, "Item Tracker", WIDGET_SEPARATOR_TEXT);
AddWidget(path, "Toggle Item Tracker", WIDGET_WINDOW_BUTTON)
.CVar(CVAR_WINDOW("ItemTracker"))
+ .RaceDisable(false)
.WindowName("Item Tracker")
.Options(WindowButtonOptions().Tooltip("Toggles the Item Tracker.").EmbedWindow(false));
AddWidget(path, "Item Tracker Settings", WIDGET_SEPARATOR_TEXT);
AddWidget(path, "Popout Item Tracker Settings", WIDGET_WINDOW_BUTTON)
.CVar(CVAR_WINDOW("ItemTrackerSettings"))
+ .RaceDisable(false)
.WindowName("Item Tracker Settings")
.Options(WindowButtonOptions().Tooltip("Enables the separate Item Tracker Settings Window."));
@@ -119,12 +125,14 @@ void SohMenu::AddMenuRandomizer() {
AddWidget(path, "Entrance Tracker", WIDGET_SEPARATOR_TEXT);
AddWidget(path, "Toggle Entrance Tracker", WIDGET_WINDOW_BUTTON)
.CVar(CVAR_WINDOW("EntranceTracker"))
+ .RaceDisable(false)
.WindowName("Entrance Tracker")
.Options(WindowButtonOptions().Tooltip("Toggles the Entrance Tracker.").EmbedWindow(false));
AddWidget(path, "Entrance Tracker Settings", WIDGET_SEPARATOR_TEXT);
AddWidget(path, "Popout Entrance Tracker Settings", WIDGET_WINDOW_BUTTON)
.CVar(CVAR_WINDOW("EntranceTrackerSettings"))
+ .RaceDisable(false)
.WindowName("Entrance Tracker Settings")
.Options(WindowButtonOptions().Tooltip("Enables the separate Entrance Tracker Settings Window."));
@@ -135,12 +143,14 @@ void SohMenu::AddMenuRandomizer() {
AddWidget(path, "Check Tracker", WIDGET_SEPARATOR_TEXT);
AddWidget(path, "Toggle Check Tracker", WIDGET_WINDOW_BUTTON)
.CVar(CVAR_WINDOW("CheckTracker"))
+ .RaceDisable(false)
.WindowName("Check Tracker")
.Options(WindowButtonOptions().Tooltip("Toggles the Check Tracker.").EmbedWindow(false));
AddWidget(path, "Check Tracker Settings", WIDGET_SEPARATOR_TEXT);
AddWidget(path, "Popout Check Tracker Settings", WIDGET_WINDOW_BUTTON)
.CVar(CVAR_WINDOW("CheckTrackerSettings"))
+ .RaceDisable(false)
.WindowName("Check Tracker Settings")
.Options(WindowButtonOptions().Tooltip("Enables the separate Check Tracker Settings Window."));
}
diff --git a/soh/soh/SohGui/SohMenuSettings.cpp b/soh/soh/SohGui/SohMenuSettings.cpp
index 2b1f77799..909c647bd 100644
--- a/soh/soh/SohGui/SohMenuSettings.cpp
+++ b/soh/soh/SohGui/SohMenuSettings.cpp
@@ -95,6 +95,7 @@ void SohMenu::AddMenuSettings() {
AddWidget(path, "Menu Settings", WIDGET_SEPARATOR_TEXT);
AddWidget(path, "Menu Theme", WIDGET_CVAR_COMBOBOX)
.CVar(CVAR_SETTING("Menu.Theme"))
+ .RaceDisable(false)
.Options(ComboboxOptions()
.Tooltip("Changes the Theme of the Menu Widgets.")
.ComboMap(menuThemeOptions)
@@ -102,18 +103,21 @@ void SohMenu::AddMenuSettings() {
#if not defined(__SWITCH__) and not defined(__WIIU__)
AddWidget(path, "Menu Controller Navigation", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_IMGUI_CONTROLLER_NAV)
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip(
"Allows controller navigation of the port menu (Settings, Enhancements,...)\nCAUTION: "
"This will disable game inputs while the menu is visible.\n\nD-pad to move between "
"items, A to select, B to move up in scope."));
AddWidget(path, "Menu Background Opacity", WIDGET_CVAR_SLIDER_FLOAT)
.CVar(CVAR_SETTING("Menu.BackgroundOpacity"))
+ .RaceDisable(false)
.Options(FloatSliderOptions().DefaultValue(0.85f).IsPercentage().Tooltip(
"Sets the opacity of the background of the port menu."));
AddWidget(path, "General Settings", WIDGET_SEPARATOR_TEXT);
AddWidget(path, "Cursor Always Visible", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_SETTING("CursorVisibility"))
+ .RaceDisable(false)
.Callback([](WidgetInfo& info) {
Ship::Context::GetInstance()->GetWindow()->SetForceCursorVisibility(
CVarGetInteger(CVAR_SETTING("CursorVisibility"), 0));
@@ -122,6 +126,7 @@ void SohMenu::AddMenuSettings() {
#endif
AddWidget(path, "Search In Sidebar", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_SETTING("Menu.SidebarSearch"))
+ .RaceDisable(false)
.Callback([](WidgetInfo& info) {
if (CVarGetInteger(CVAR_SETTING("Menu.SidebarSearch"), 0)) {
mSohMenu->InsertSidebarSearch();
@@ -133,13 +138,16 @@ void SohMenu::AddMenuSettings() {
"Displays the Search menu as a sidebar entry in Settings instead of in the header."));
AddWidget(path, "Search Input Autofocus", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_SETTING("Menu.SearchAutofocus"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip(
"Search input box gets autofocus when visible. Does not affect using other widgets."));
AddWidget(path, "Alt Assets Tab hotkey", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_SETTING("Mods.AlternateAssetsHotkey"))
+ .RaceDisable(false)
.Options(
CheckboxOptions().Tooltip("Allows pressing the Tab key to toggle alternate assets").DefaultValue(true));
AddWidget(path, "Open App Files Folder", WIDGET_BUTTON)
+ .RaceDisable(false)
.Callback([](WidgetInfo& info) {
std::string filesPath = Ship::Context::GetInstance()->GetAppDirectoryPath();
SDL_OpenURL(std::string("file:///" + std::filesystem::absolute(filesPath).string()).c_str());
@@ -149,6 +157,7 @@ void SohMenu::AddMenuSettings() {
AddWidget(path, "Boot", WIDGET_SEPARATOR_TEXT);
AddWidget(path, "Boot Sequence", WIDGET_CVAR_COMBOBOX)
.CVar(CVAR_SETTING("BootSequence"))
+ .RaceDisable(false)
.Options(ComboboxOptions()
.DefaultIndex(BOOTSEQUENCE_DEFAULT)
.LabelPosition(LabelPositions::Far)
@@ -160,9 +169,12 @@ void SohMenu::AddMenuSettings() {
"File Select: Skip to file select menu"));
AddWidget(path, "Languages", WIDGET_SEPARATOR_TEXT);
- AddWidget(path, "Translate Title Screen", WIDGET_CVAR_CHECKBOX).CVar(CVAR_SETTING("TitleScreenTranslation"));
+ AddWidget(path, "Translate Title Screen", WIDGET_CVAR_CHECKBOX)
+ .CVar(CVAR_SETTING("TitleScreenTranslation"))
+ .RaceDisable(false);
AddWidget(path, "Language", WIDGET_CVAR_COMBOBOX)
.CVar(CVAR_SETTING("Languages"))
+ .RaceDisable(false)
.PreFunc([](WidgetInfo& info) {
auto options = std::static_pointer_cast(info.options);
SohMenu::UpdateLanguageMap(options->comboMap);
@@ -176,14 +188,17 @@ void SohMenu::AddMenuSettings() {
#if defined(_WIN32) || defined(__APPLE__)
AddWidget(path, "Text to Speech", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_SETTING("A11yTTS"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip("Enables text to speech for in game dialog"));
#endif
AddWidget(path, "Disable Idle Camera Re-Centering", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_SETTING("A11yDisableIdleCam"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip("Disables the automatic re-centering of the camera when idle."));
AddWidget(path, "EXPERIMENTAL", WIDGET_SEPARATOR_TEXT).Options(TextOptions().Color(Colors::Orange));
AddWidget(path, "ImGui Menu Scaling", WIDGET_CVAR_COMBOBOX)
.CVar(CVAR_SETTING("ImGuiScale"))
+ .RaceDisable(false)
.Options(ComboboxOptions()
.ComboMap(imguiScaleOptions)
.Tooltip("Changes the scaling of the ImGui menu elements.")
@@ -214,9 +229,11 @@ void SohMenu::AddMenuSettings() {
AddWidget(path, "Master Volume: %d %%", WIDGET_CVAR_SLIDER_INT)
.CVar(CVAR_SETTING("Volume.Master"))
+ .RaceDisable(false)
.Options(IntSliderOptions().Min(0).Max(100).DefaultValue(40).ShowButtons(true).Format(""));
AddWidget(path, "Main Music Volume: %d %%", WIDGET_CVAR_SLIDER_INT)
.CVar(CVAR_SETTING("Volume.MainMusic"))
+ .RaceDisable(false)
.Options(IntSliderOptions().Min(0).Max(100).DefaultValue(100).ShowButtons(true).Format(""))
.Callback([](WidgetInfo& info) {
Audio_SetGameVolume(SEQ_PLAYER_BGM_MAIN,
@@ -224,6 +241,7 @@ void SohMenu::AddMenuSettings() {
});
AddWidget(path, "Sub Music Volume: %d %%", WIDGET_CVAR_SLIDER_INT)
.CVar(CVAR_SETTING("Volume.SubMusic"))
+ .RaceDisable(false)
.Options(IntSliderOptions().Min(0).Max(100).DefaultValue(100).ShowButtons(true).Format(""))
.Callback([](WidgetInfo& info) {
Audio_SetGameVolume(SEQ_PLAYER_BGM_SUB,
@@ -231,6 +249,7 @@ void SohMenu::AddMenuSettings() {
});
AddWidget(path, "Fanfare Volume: %d %%", WIDGET_CVAR_SLIDER_INT)
.CVar(CVAR_SETTING("Volume.Fanfare"))
+ .RaceDisable(false)
.Options(IntSliderOptions().Min(0).Max(100).DefaultValue(100).ShowButtons(true).Format(""))
.Callback([](WidgetInfo& info) {
Audio_SetGameVolume(SEQ_PLAYER_FANFARE,
@@ -238,11 +257,12 @@ void SohMenu::AddMenuSettings() {
});
AddWidget(path, "Sound Effects Volume: %d %%", WIDGET_CVAR_SLIDER_INT)
.CVar(CVAR_SETTING("Volume.SFX"))
+ .RaceDisable(false)
.Options(IntSliderOptions().Min(0).Max(100).DefaultValue(100).ShowButtons(true).Format(""))
.Callback([](WidgetInfo& info) {
Audio_SetGameVolume(SEQ_PLAYER_SFX, ((float)CVarGetInteger(CVAR_SETTING("Volume.SFX"), 100) / 100.0f));
});
- AddWidget(path, "Audio API (Needs reload)", WIDGET_AUDIO_BACKEND);
+ AddWidget(path, "Audio API (Needs reload)", WIDGET_AUDIO_BACKEND).RaceDisable(false);
// Graphics Settings
static int32_t maxFps = 360;
@@ -253,10 +273,12 @@ void SohMenu::AddMenuSettings() {
AddSidebarEntry("Settings", "Graphics", 3);
AddWidget(path, "Graphics Options", WIDGET_SEPARATOR_TEXT);
AddWidget(path, "Toggle Fullscreen", WIDGET_BUTTON)
+ .RaceDisable(false)
.Callback([](WidgetInfo& info) { Ship::Context::GetInstance()->GetWindow()->ToggleFullscreen(); })
.Options(ButtonOptions().Tooltip("Toggles Fullscreen On/Off."));
AddWidget(path, "Internal Resolution", WIDGET_CVAR_SLIDER_FLOAT)
.CVar(CVAR_INTERNAL_RESOLUTION)
+ .RaceDisable(false)
.Callback([](WidgetInfo& info) {
Ship::Context::GetInstance()->GetWindow()->SetResolutionMultiplier(
CVarGetFloat(CVAR_INTERNAL_RESOLUTION, 1));
@@ -281,6 +303,7 @@ void SohMenu::AddMenuSettings() {
#ifndef __WIIU__
AddWidget(path, "Anti-aliasing (MSAA)", WIDGET_CVAR_SLIDER_INT)
.CVar(CVAR_MSAA_VALUE)
+ .RaceDisable(false)
.Callback([](WidgetInfo& info) {
Ship::Context::GetInstance()->GetWindow()->SetMsaaLevel(CVarGetInteger(CVAR_MSAA_VALUE, 1));
})
@@ -297,6 +320,7 @@ void SohMenu::AddMenuSettings() {
const char* fpsFormat = fps == 20 ? "Original (%d)" : "%d";
AddWidget(path, "Current FPS", WIDGET_CVAR_SLIDER_INT)
.CVar(CVAR_SETTING("InterpolationFPS"))
+ .RaceDisable(false)
.Callback([](WidgetInfo& info) {
auto options = std::static_pointer_cast(info.options);
int32_t defaultValue = options->defaultValue;
@@ -313,28 +337,33 @@ void SohMenu::AddMenuSettings() {
.Options(IntSliderOptions().Tooltip(tooltip).Min(20).Max(maxFps).DefaultValue(20).Format(fpsFormat));
AddWidget(path, "Match Refresh Rate", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_SETTING("MatchRefreshRate"))
+ .RaceDisable(false)
.Options(CheckboxOptions().Tooltip("Matches interpolation value to the refresh rate of your display."));
- AddWidget(path, "Renderer API (Needs reload)", WIDGET_VIDEO_BACKEND);
+ AddWidget(path, "Renderer API (Needs reload)", WIDGET_VIDEO_BACKEND).RaceDisable(false);
AddWidget(path, "Enable Vsync", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_VSYNC_ENABLED)
+ .RaceDisable(false)
.PreFunc([](WidgetInfo& info) { info.isHidden = mSohMenu->disabledMap.at(DISABLE_FOR_NO_VSYNC).active; })
.Options(CheckboxOptions()
.Tooltip("Removes tearing, but clamps your max FPS to your displays refresh rate.")
.DefaultValue(true));
AddWidget(path, "Windowed Fullscreen", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_SDL_WINDOWED_FULLSCREEN)
+ .RaceDisable(false)
.PreFunc([](WidgetInfo& info) {
info.isHidden = mSohMenu->disabledMap.at(DISABLE_FOR_NO_WINDOWED_FULLSCREEN).active;
})
.Options(CheckboxOptions().Tooltip("Enables Windowed Fullscreen Mode."));
AddWidget(path, "Allow multi-windows", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENABLE_MULTI_VIEWPORTS)
+ .RaceDisable(false)
.PreFunc(
[](WidgetInfo& info) { info.isHidden = mSohMenu->disabledMap.at(DISABLE_FOR_NO_MULTI_VIEWPORT).active; })
.Options(CheckboxOptions().Tooltip(
"Allows multiple windows to be opened at once. Requires a reload to take effect."));
AddWidget(path, "Texture Filter (Needs reload)", WIDGET_CVAR_COMBOBOX)
.CVar(CVAR_TEXTURE_FILTER)
+ .RaceDisable(false)
.Options(ComboboxOptions().Tooltip("Sets the applied Texture Filtering.").ComboMap(textureFilteringMap));
path.column = SECTION_COLUMN_2;
@@ -347,6 +376,7 @@ void SohMenu::AddMenuSettings() {
AddWidget(path, "Controller Bindings", WIDGET_SEPARATOR_TEXT);
AddWidget(path, "Popout Bindings Window", WIDGET_WINDOW_BUTTON)
.CVar(CVAR_WINDOW("ControllerConfiguration"))
+ .RaceDisable(false)
.WindowName("Configure Controller")
.Options(WindowButtonOptions().Tooltip("Enables the separate Bindings Window."));
@@ -356,12 +386,14 @@ void SohMenu::AddMenuSettings() {
AddWidget(path, "Input Viewer", WIDGET_SEPARATOR_TEXT);
AddWidget(path, "Toggle Input Viewer", WIDGET_WINDOW_BUTTON)
.CVar(CVAR_WINDOW("InputViewer"))
+ .RaceDisable(false)
.WindowName("Input Viewer")
.Options(WindowButtonOptions().Tooltip("Toggles the Input Viewer.").EmbedWindow(false));
AddWidget(path, "Input Viewer Settings", WIDGET_SEPARATOR_TEXT);
AddWidget(path, "Popout Input Viewer Settings", WIDGET_WINDOW_BUTTON)
.CVar(CVAR_WINDOW("InputViewerSettings"))
+ .RaceDisable(false)
.WindowName("Input Viewer Settings")
.Options(WindowButtonOptions().Tooltip("Enables the separate Input Viewer Settings Window."));
@@ -371,12 +403,14 @@ void SohMenu::AddMenuSettings() {
AddSidebarEntry("Settings", path.sidebarName, 3);
AddWidget(path, "Position", WIDGET_CVAR_COMBOBOX)
.CVar(CVAR_SETTING("Notifications.Position"))
+ .RaceDisable(false)
.Options(ComboboxOptions()
.Tooltip("Which corner of the screen notifications appear in.")
.ComboMap(notificationPosition)
.DefaultIndex(3));
AddWidget(path, "Duration (seconds):", WIDGET_CVAR_SLIDER_FLOAT)
.CVar(CVAR_SETTING("Notifications.Duration"))
+ .RaceDisable(false)
.Options(FloatSliderOptions()
.Tooltip("How long notifications are displayed for.")
.Format("%.1f")
@@ -386,12 +420,14 @@ void SohMenu::AddMenuSettings() {
.DefaultValue(10.0f));
AddWidget(path, "Background Opacity", WIDGET_CVAR_SLIDER_FLOAT)
.CVar(CVAR_SETTING("Notifications.BgOpacity"))
+ .RaceDisable(false)
.Options(FloatSliderOptions()
.Tooltip("How opaque the background of notifications is.")
.DefaultValue(0.5f)
.IsPercentage());
AddWidget(path, "Size:", WIDGET_CVAR_SLIDER_FLOAT)
.CVar(CVAR_SETTING("Notifications.Size"))
+ .RaceDisable(false)
.Options(FloatSliderOptions()
.Tooltip("How large notifications are.")
.Format("%.1f")
@@ -400,6 +436,7 @@ void SohMenu::AddMenuSettings() {
.Max(5.0f)
.DefaultValue(1.8f));
AddWidget(path, "Test Notification", WIDGET_BUTTON)
+ .RaceDisable(false)
.Callback([](WidgetInfo& info) {
Notification::Emit({
.itemIcon = "__OTR__textures/icon_item_24_static/gQuestIconGoldSkulltulaTex",
diff --git a/soh/soh/z_play_otr.cpp b/soh/soh/z_play_otr.cpp
index 54f4b0016..23e61261c 100644
--- a/soh/soh/z_play_otr.cpp
+++ b/soh/soh/z_play_otr.cpp
@@ -3,7 +3,7 @@
#include
#include "soh/resource/type/Scene.h"
#include
-#include "soh/Enhancements/game-interactor/GameInteractor.h"
+#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
#include "global.h"
#include "vt.h"
#include
@@ -59,7 +59,7 @@ extern "C" void OTRPlay_SpawnScene(PlayState* play, s32 sceneId, s32 spawn) {
osSyncPrintf("ROOM SIZE=%fK\n", roomSize / 1024.0f);
- GameInteractor::Instance->ExecuteHooks(play->sceneNum);
+ GameInteractor_ExecuteOnSceneInit(play->sceneNum);
SPDLOG_INFO("Scene Init - sceneNum: {0:#x}, entranceIndex: {1:#x}", play->sceneNum, gSaveContext.entranceIndex);
}
@@ -79,6 +79,7 @@ void OTRPlay_InitScene(PlayState* play, s32 spawn) {
YREG(15) = 0;
gSaveContext.worldMapArea = 0;
OTRScene_ExecuteCommands(play, (SOH::Scene*)play->sceneSegment);
+ GameInteractor_ExecuteAfterSceneCommands(play->sceneNum);
Play_InitEnvironment(play, play->skyboxId);
/* auto data = static_cast(Ship::Context::GetInstance()
->GetResourceManager()
diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c
index facbbfd81..4ead0d268 100644
--- a/soh/src/code/z_parameter.c
+++ b/soh/src/code/z_parameter.c
@@ -2411,6 +2411,9 @@ u8 Item_Give(PlayState* play, u8 item) {
}
}
} else {
+ if (item == ITEM_LETTER_RUTO) {
+ Flags_SetRandomizerInf(RAND_INF_OBTAINED_RUTOS_LETTER);
+ }
for (i = 0; i < 4; i++) {
if (gSaveContext.inventory.items[temp + i] == ITEM_NONE) {
gSaveContext.inventory.items[temp + i] = item;
@@ -2434,6 +2437,9 @@ u8 Item_Give(PlayState* play, u8 item) {
}
} else {
Flags_SetRandomizerInf(item - ITEM_WEIRD_EGG + RAND_INF_CHILD_TRADES_HAS_WEIRD_EGG);
+ if (item == ITEM_WEIRD_EGG) {
+ Flags_SetRandomizerInf(RAND_INF_WEIRD_EGG);
+ }
}
}
diff --git a/soh/src/overlays/actors/ovl_Fishing/z_fishing.c b/soh/src/overlays/actors/ovl_Fishing/z_fishing.c
index 94d7e15ca..4d42de65f 100644
--- a/soh/src/overlays/actors/ovl_Fishing/z_fishing.c
+++ b/soh/src/overlays/actors/ovl_Fishing/z_fishing.c
@@ -5170,7 +5170,7 @@ void Fishing_HandleOwnerDialog(Fishing* this, PlayState* play) {
if (Actor_HasParent(&this->actor, play)) {
this->stateAndTimer = 24;
} else {
- if (!GameInteractor_Should(VB_GIVE_RANDO_GLITCH_FISHING_PRIZE, false, &this)) {
+ if (!GameInteractor_Should(VB_GIVE_RANDO_GLITCH_FISHING_PRIZE, false, this)) {
Actor_OfferGetItem(&this->actor, play, GI_SCALE_GOLDEN, 2000.0f, 1000.0f);
}
}
diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c
index ddee9d0af..6638893f5 100644
--- a/soh/src/overlays/actors/ovl_player_actor/z_player.c
+++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c
@@ -12773,9 +12773,8 @@ s16 func_8084ABD8(PlayState* play, Player* this, s32 arg2, s16 arg3) {
if (!CVarGetInteger(CVAR_SETTING("MoveInFirstPerson"), 0)) {
temp2 += sControlInput->rel.stick_y * 240.0f * invertYAxisMulti * yAxisMulti;
}
- if (CVarGetInteger(CVAR_SETTING("Controls.RightStickAim"), 0) &&
- fabsf(sControlInput->cur.right_stick_y) > 15.0f) {
- temp2 += sControlInput->cur.right_stick_y * 240.0f * invertYAxisMulti * yAxisMulti;
+ if (CVarGetInteger(CVAR_SETTING("Controls.RightStickAim"), 0)) {
+ temp2 += sControlInput->rel.right_stick_y * 240.0f * invertYAxisMulti * yAxisMulti;
}
if (fabsf(sControlInput->cur.gyro_x) > 0.01f) {
temp2 += (-sControlInput->cur.gyro_x) * 750.0f;
@@ -12792,9 +12791,8 @@ s16 func_8084ABD8(PlayState* play, Player* this, s32 arg2, s16 arg3) {
if (!CVarGetInteger(CVAR_SETTING("MoveInFirstPerson"), 0)) {
temp2 += sControlInput->rel.stick_x * -16.0f * invertXAxisMulti * xAxisMulti;
}
- if (CVarGetInteger(CVAR_SETTING("Controls.RightStickAim"), 0) &&
- fabsf(sControlInput->cur.right_stick_x) > 15.0f) {
- temp2 += sControlInput->cur.right_stick_x * -16.0f * invertXAxisMulti * xAxisMulti;
+ if (CVarGetInteger(CVAR_SETTING("Controls.RightStickAim"), 0)) {
+ temp2 += sControlInput->rel.right_stick_x * -16.0f * invertXAxisMulti * xAxisMulti;
}
if (fabsf(sControlInput->cur.gyro_y) > 0.01f) {
temp2 += (sControlInput->cur.gyro_y) * 750.0f * invertXAxisMulti;
@@ -12810,10 +12808,9 @@ s16 func_8084ABD8(PlayState* play, Player* this, s32 arg2, s16 arg3) {
(s32)((1.0f - Math_CosS(sControlInput->rel.stick_y * 200)) * 1500.0f) * invertYAxisMulti *
yAxisMulti;
}
- if (CVarGetInteger(CVAR_SETTING("Controls.RightStickAim"), 0) &&
- fabsf(sControlInput->cur.right_stick_y) > 15.0f) {
- temp3 += ((sControlInput->cur.right_stick_y >= 0) ? 1 : -1) *
- (s32)((1.0f - Math_CosS(sControlInput->cur.right_stick_y * 200)) * 1500.0f) * invertYAxisMulti *
+ if (CVarGetInteger(CVAR_SETTING("Controls.RightStickAim"), 0)) {
+ temp3 += ((sControlInput->rel.right_stick_y >= 0) ? 1 : -1) *
+ (s32)((1.0f - Math_CosS(sControlInput->rel.right_stick_y * 200)) * 1500.0f) * invertYAxisMulti *
yAxisMulti;
}
if (fabsf(sControlInput->cur.gyro_x) > 0.01f) {
@@ -12831,10 +12828,9 @@ s16 func_8084ABD8(PlayState* play, Player* this, s32 arg2, s16 arg3) {
(s32)((1.0f - Math_CosS(sControlInput->rel.stick_x * 200)) * -1500.0f) * invertXAxisMulti *
xAxisMulti;
}
- if (CVarGetInteger(CVAR_SETTING("Controls.RightStickAim"), 0) &&
- fabsf(sControlInput->cur.right_stick_x) > 15.0f) {
- temp3 += ((sControlInput->cur.right_stick_x >= 0) ? 1 : -1) *
- (s32)((1.0f - Math_CosS(sControlInput->cur.right_stick_x * 200)) * -1500.0f) * invertXAxisMulti *
+ if (CVarGetInteger(CVAR_SETTING("Controls.RightStickAim"), 0)) {
+ temp3 += ((sControlInput->rel.right_stick_x >= 0) ? 1 : -1) *
+ (s32)((1.0f - Math_CosS(sControlInput->rel.right_stick_x * 200)) * -1500.0f) * invertXAxisMulti *
xAxisMulti;
}
if (fabsf(sControlInput->cur.gyro_y) > 0.01f) {