move speed modifier settings to cheats (#6277)

Combine into one speed modifier. Refactor config migrations. Add v6
This commit is contained in:
Philip Dubé
2026-03-02 18:26:37 +00:00
committed by GitHub
parent 6f01d68c3c
commit 2a335b1cd8
9 changed files with 1514 additions and 1663 deletions

View File

@@ -172,8 +172,7 @@ extern "C"
extern s32 gSystemArenaLogSeverity;
extern u8 __osPfsInodeCacheBank;
extern s32 __osPfsLastChannel;
extern u8 gWalkSpeedToggle1;
extern u8 gWalkSpeedToggle2;
extern u8 gWalkSpeedToggle;
extern f32 iceTrapScale;
extern f32 triforcePieceScale;
extern f32 mysteryItemScale;

View File

@@ -1601,77 +1601,6 @@ void SohInputEditorWindow::DrawLinkTab() {
if (ImGui::CollapsingHeader("Modifier Buttons")) {
DrawButtonLine("M1", portIndex, BTN_CUSTOM_MODIFIER1);
DrawButtonLine("M2", portIndex, BTN_CUSTOM_MODIFIER2);
ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0));
CVarCheckbox("Enable speed modifiers", CVAR_SETTING("WalkModifier.Enabled"),
CheckboxOptions()
.Color(THEME_COLOR)
.Tooltip("Hold the assigned button to change the maximum walking or swimming speed"));
if (CVarGetInteger(CVAR_SETTING("WalkModifier.Enabled"), 0)) {
CVarBtnSelector(
"Speed Modifier 1 Button Combo", CVAR_SETTING("WalkModifier.Mod1Btn"),
BtnSelectorOptions()
.DefaultValue(BTN_CUSTOM_MODIFIER1)
.Color(THEME_COLOR)
.Tooltip(
"Buttons that activate Speed Modifier 1.\n\n"
"If \"Toggle modifier instead of holding\" is off, hold this combo to apply the modifier.\n"
"If it is on, tap this combo to toggle the modifier on/off."));
CVarBtnSelector(
"Speed Modifier 2 Button Combo", CVAR_SETTING("WalkModifier.Mod2Btn"),
BtnSelectorOptions()
.DefaultValue(BTN_CUSTOM_MODIFIER2)
.Color(THEME_COLOR)
.Tooltip(
"Buttons that activate Speed Modifier 2.\n\n"
"If \"Toggle modifier instead of holding\" is off, hold this combo to apply the modifier.\n"
"If it is on, tap this combo to toggle the modifier on/off."));
UIWidgets::Spacer(5);
Ship::GuiWindow::BeginGroupPanel("Speed Modifier", ImGui::GetContentRegionAvail());
CVarCheckbox("Toggle modifier instead of holding", CVAR_SETTING("WalkModifier.SpeedToggle"),
CheckboxOptions().Color(THEME_COLOR));
Ship::GuiWindow::BeginGroupPanel("Walk Modifier", ImGui::GetContentRegionAvail());
CVarCheckbox("Don't affect jump distance/velocity", CVAR_SETTING("WalkModifier.DoesntChangeJump"),
CheckboxOptions().Color(THEME_COLOR));
CVarSliderFloat("Walk Modifier 1: %.0f %%", CVAR_SETTING("WalkModifier.Mapping1"),
FloatSliderOptions()
.Color(THEME_COLOR)
.IsPercentage()
.Min(0.0f)
.Max(5.0f)
.DefaultValue(1.0f)
.ShowButtons(true));
CVarSliderFloat("Walk Modifier 2: %.0f %%", CVAR_SETTING("WalkModifier.Mapping2"),
FloatSliderOptions()
.Color(THEME_COLOR)
.IsPercentage()
.Min(0.0f)
.Max(5.0f)
.DefaultValue(1.0f)
.ShowButtons(true));
Ship::GuiWindow::EndGroupPanel(0);
Ship::GuiWindow::BeginGroupPanel("Swim Modifier", ImGui::GetContentRegionAvail());
CVarSliderFloat("Swim Modifier 1: %.0f %%", CVAR_SETTING("WalkModifier.SwimMapping1"),
FloatSliderOptions()
.Color(THEME_COLOR)
.IsPercentage()
.Min(0.0f)
.Max(5.0f)
.DefaultValue(1.0f)
.ShowButtons(true));
CVarSliderFloat("Swim Modifier 2: %.0f %%", CVAR_SETTING("WalkModifier.SwimMapping2"),
FloatSliderOptions()
.Color(THEME_COLOR)
.IsPercentage()
.Min(0.0f)
.Max(5.0f)
.DefaultValue(1.0f)
.ShowButtons(true));
Ship::GuiWindow::EndGroupPanel(0);
Ship::GuiWindow::EndGroupPanel(0);
}
ImGui::EndDisabled();
}
if (ImGui::CollapsingHeader("Ocarina Controls")) {

View File

@@ -1471,6 +1471,7 @@ extern "C" void InitOTR(int argc, char* argv[]) {
conf->RegisterVersionUpdater(std::make_shared<SOH::ConfigVersion3Updater>());
conf->RegisterVersionUpdater(std::make_shared<SOH::ConfigVersion4Updater>());
conf->RegisterVersionUpdater(std::make_shared<SOH::ConfigVersion5Updater>());
conf->RegisterVersionUpdater(std::make_shared<SOH::ConfigVersion6Updater>());
conf->RunVersionUpdates();
SohGui::SetupGuiElements();

View File

@@ -1824,6 +1824,24 @@ void SohMenu::AddMenuEnhancements() {
.Callback([](WidgetInfo& info) { SwitchAge(); });
path.column = SECTION_COLUMN_3;
AddWidget(path, "Speed Modifier", WIDGET_SEPARATOR_TEXT);
AddWidget(path, "Toggle modifier instead of holding", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_CHEAT("SpeedModifier.SpeedToggle"));
AddWidget(path, "Don't affect jump distance/velocity", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_CHEAT("SpeedModifier.DoesntChangeJump"));
AddWidget(path, "Nultiplier:", WIDGET_CVAR_SLIDER_FLOAT)
.CVar(CVAR_CHEAT("SpeedModifier.Value"))
.Options(FloatSliderOptions().IsPercentage().Min(1.0f).Max(5.0f).DefaultValue(1.0f).ShowButtons(true).Format(
"%.0f%%"));
AddWidget(path, "Button Combination:", WIDGET_CVAR_BTN_SELECTOR)
.CVar(CVAR_CHEAT("SpeedModifier.Btn"))
.Options(
BtnSelectorOptions()
.DefaultValue(BTN_CUSTOM_MODIFIER1)
.Tooltip("Buttons that activate Speed Modifier 1.\n\n"
"If \"Toggle modifier instead of holding\" is off, hold this combo to apply the modifier.\n"
"If it is on, tap this combo to toggle the modifier on/off."));
AddWidget(path, "Save States", WIDGET_SEPARATOR_TEXT);
AddWidget(path, ICON_FA_EXCLAMATION_TRIANGLE " WARNING!!!! " ICON_FA_EXCLAMATION_TRIANGLE, WIDGET_TEXT)
.Options(TextOptions().Color(Colors::Orange));

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -30,4 +30,10 @@ class ConfigVersion5Updater final : public Ship::ConfigVersionUpdater {
ConfigVersion5Updater();
void Update(Ship::Config* conf);
};
class ConfigVersion6Updater final : public Ship::ConfigVersionUpdater {
public:
ConfigVersion6Updater();
void Update(Ship::Config* conf);
};
} // namespace SOH

View File

@@ -344,8 +344,7 @@ void Player_Action_80850E84(Player* this, PlayState* play);
void Player_Action_CsAction(Player* this, PlayState* play);
#pragma region[SoH]
u8 gWalkSpeedToggle1;
u8 gWalkSpeedToggle2;
u8 gWalkSpeedToggle;
s32 spawn_boomerang_ivan(EnPartner* this, PlayState* play) {
if (!CVarGetInteger(CVAR_ENHANCEMENT("IvanCoopModeEnabled"), 0)) {
@@ -7138,22 +7137,17 @@ void func_8083DFE0(Player* this, f32* arg1, s16* arg2) {
maxSpeed *= 1.5f;
}
if (CVarGetInteger(CVAR_SETTING("WalkModifier.Enabled"), 0) &&
!CVarGetInteger(CVAR_SETTING("WalkModifier.DoesntChangeJump"), 0)) {
if (CVarGetInteger(CVAR_SETTING("WalkModifier.SpeedToggle"), 0)) {
if (gWalkSpeedToggle1) {
maxSpeed *= CVarGetFloat(CVAR_SETTING("WalkModifier.Mapping1"), 1.0f);
} else if (gWalkSpeedToggle2) {
maxSpeed *= CVarGetFloat(CVAR_SETTING("WalkModifier.Mapping2"), 1.0f);
if (CVarGetFloat(CVAR_CHEAT("SpeedModifier.Value"), 1.0f) != 1.0f &&
!CVarGetInteger(CVAR_CHEAT("SpeedModifier.DoesntChangeJump"), 0)) {
if (CVarGetInteger(CVAR_CHEAT("SpeedModifier.SpeedToggle"), 0)) {
if (gWalkSpeedToggle) {
maxSpeed *= CVarGetFloat(CVAR_CHEAT("SpeedModifier.Mapping"), 1.0f);
}
} else {
const s32 mod1Mask = CVarGetInteger(CVAR_SETTING("WalkModifier.Mod1Btn"), BTN_CUSTOM_MODIFIER1);
const s32 mod2Mask = CVarGetInteger(CVAR_SETTING("WalkModifier.Mod2Btn"), BTN_CUSTOM_MODIFIER2);
const s32 mod1Mask = CVarGetInteger(CVAR_CHEAT("SpeedModifier.Btn"), BTN_CUSTOM_MODIFIER1);
if (mod1Mask != 0 && CHECK_BTN_ALL(sControlInput->cur.button, mod1Mask)) {
maxSpeed *= CVarGetFloat(CVAR_SETTING("WalkModifier.Mapping1"), 1.0f);
} else if (mod2Mask != 0 && CHECK_BTN_ALL(sControlInput->cur.button, mod2Mask)) {
maxSpeed *= CVarGetFloat(CVAR_SETTING("WalkModifier.Mapping2"), 1.0f);
maxSpeed *= CVarGetFloat(CVAR_CHEAT("SpeedModifier.Value"), 1.0f);
}
}
}
@@ -8889,21 +8883,16 @@ void Player_Action_80842180(Player* this, PlayState* play) {
sp2C *= 1.5f;
}
if (CVarGetInteger(CVAR_SETTING("WalkModifier.Enabled"), 0)) {
if (CVarGetInteger(CVAR_SETTING("WalkModifier.SpeedToggle"), 0)) {
if (gWalkSpeedToggle1) {
sp2C *= CVarGetFloat(CVAR_SETTING("WalkModifier.Mapping1"), 1.0f);
} else if (gWalkSpeedToggle2) {
sp2C *= CVarGetFloat(CVAR_SETTING("WalkModifier.Mapping2"), 1.0f);
if (CVarGetFloat(CVAR_CHEAT("SpeedModifier.Value"), 1.0f) != 1.0f) {
if (CVarGetInteger(CVAR_CHEAT("SpeedModifier.SpeedToggle"), 0)) {
if (gWalkSpeedToggle) {
sp2C *= CVarGetFloat(CVAR_CHEAT("SpeedModifier.Value"), 1.0f);
}
} else {
const s32 mod1Mask = CVarGetInteger(CVAR_SETTING("WalkModifier.Mod1Btn"), BTN_CUSTOM_MODIFIER1);
const s32 mod2Mask = CVarGetInteger(CVAR_SETTING("WalkModifier.Mod2Btn"), BTN_CUSTOM_MODIFIER2);
const s32 mod1Mask = CVarGetInteger(CVAR_CHEAT("SpeedModifier.Btn"), BTN_CUSTOM_MODIFIER1);
if (mod1Mask != 0 && CHECK_BTN_ALL(sControlInput->cur.button, mod1Mask)) {
sp2C *= CVarGetFloat(CVAR_SETTING("WalkModifier.Mapping1"), 1.0f);
} else if (mod2Mask != 0 && CHECK_BTN_ALL(sControlInput->cur.button, mod2Mask)) {
sp2C *= CVarGetFloat(CVAR_SETTING("WalkModifier.Mapping2"), 1.0f);
sp2C *= CVarGetFloat(CVAR_CHEAT("SpeedModifier.Value"), 1.0f);
}
}
}
@@ -12317,18 +12306,13 @@ void Player_Update(Actor* thisx, PlayState* play) {
}
}
if (CVarGetInteger(CVAR_SETTING("WalkModifier.Enabled"), 0) &&
CVarGetInteger(CVAR_SETTING("WalkModifier.SpeedToggle"), 0)) {
const s32 mod1Mask = CVarGetInteger(CVAR_SETTING("WalkModifier.Mod1Btn"), BTN_CUSTOM_MODIFIER1);
const s32 mod2Mask = CVarGetInteger(CVAR_SETTING("WalkModifier.Mod2Btn"), BTN_CUSTOM_MODIFIER2);
if (CVarGetInteger(CVAR_CHEAT("SpeedModifier.Value"), 1.0f) != 1.0f &&
CVarGetInteger(CVAR_CHEAT("SpeedModifier.SpeedToggle"), 0)) {
const s32 mod1Mask = CVarGetInteger(CVAR_CHEAT("SpeedModifier.Btn"), BTN_CUSTOM_MODIFIER1);
if (mod1Mask != 0 && CHECK_BTN_ALL(sControlInput->cur.button, mod1Mask) &&
CHECK_BTN_ANY(sControlInput->press.button, mod1Mask)) {
gWalkSpeedToggle1 = !gWalkSpeedToggle1;
}
if (mod2Mask != 0 && CHECK_BTN_ALL(sControlInput->cur.button, mod2Mask) &&
CHECK_BTN_ANY(sControlInput->press.button, mod2Mask)) {
gWalkSpeedToggle2 = !gWalkSpeedToggle2;
gWalkSpeedToggle = !gWalkSpeedToggle;
}
}
@@ -12784,23 +12768,18 @@ void func_8084AEEC(Player* this, f32* arg1, f32 arg2, s16 arg3) {
// #region SOH [Enhancement]
f32 swimMod = 1.0f;
if (CVarGetInteger(CVAR_SETTING("WalkModifier.Enabled"), 0) == 1) {
if (CVarGetInteger(CVAR_SETTING("WalkModifier.SpeedToggle"), 0) == 1) {
if (gWalkSpeedToggle1) {
swimMod *= CVarGetFloat(CVAR_SETTING("WalkModifier.SwimMapping1"), 1.0f);
} else if (gWalkSpeedToggle2) {
swimMod *= CVarGetFloat(CVAR_SETTING("WalkModifier.SwimMapping2"), 1.0f);
if (CVarGetFloat(CVAR_CHEAT("SpeedModifier.Value"), 1.0f) != 1.0f) {
if (CVarGetInteger(CVAR_CHEAT("SpeedModifier.SpeedToggle"), 0) == 1) {
if (gWalkSpeedToggle) {
swimMod *= CVarGetFloat(CVAR_CHEAT("SpeedModifier.Value"), 1.0f);
}
// sControlInput is NULL to prevent inputs while surfacing after obtaining an underwater item so we want to
// ignore it for that case
} else if (sControlInput != NULL) {
const s32 mod1Mask = CVarGetInteger(CVAR_SETTING("WalkModifier.Mod1Btn"), BTN_CUSTOM_MODIFIER1);
const s32 mod2Mask = CVarGetInteger(CVAR_SETTING("WalkModifier.Mod2Btn"), BTN_CUSTOM_MODIFIER2);
const s32 mod1Mask = CVarGetInteger(CVAR_CHEAT("SpeedModifier.Btn"), BTN_CUSTOM_MODIFIER1);
if (mod1Mask != 0 && CHECK_BTN_ALL(sControlInput->cur.button, mod1Mask)) {
swimMod *= CVarGetFloat(CVAR_SETTING("WalkModifier.SwimMapping1"), 1.0f);
} else if (mod2Mask != 0 && CHECK_BTN_ALL(sControlInput->cur.button, mod2Mask)) {
swimMod *= CVarGetFloat(CVAR_SETTING("WalkModifier.SwimMapping2"), 1.0f);
swimMod *= CVarGetFloat(CVAR_CHEAT("SpeedModifier.Value"), 1.0f);
}
}
temp1 = this->skelAnime.curFrame - 10.0f;
@@ -14048,7 +14027,7 @@ void func_8084DBC4(PlayState* play, Player* this, f32 arg2) {
func_8084AEEC(this, &this->linearVelocity, sp2C * 0.5f, sp2A);
// Original implementation of func_8084AEEC (SurfaceWithoutSwimMod) to prevent velocity increases via swim mod which
// push Link into the air #region SOH [Enhancement]
if (CVarGetInteger(CVAR_SETTING("WalkModifier.Enabled"), 0)) {
if (CVarGetFloat(CVAR_CHEAT("SpeedModifier.Value"), 1.0f) != 1.0f) {
SurfaceWithoutSwimMod(this, &this->actor.velocity.y, arg2, this->yaw);
// #endregion
} else {

View File

@@ -13,8 +13,7 @@ void Opening_SetupTitleScreen(OpeningContext* this) {
this->state.running = false;
gSaveContext.linkAge = 0;
gSaveContext.fileNum = 0xFF;
gWalkSpeedToggle1 = 0;
gWalkSpeedToggle2 = 0;
gWalkSpeedToggle = 0;
Sram_InitDebugSave();
gSaveContext.cutsceneIndex = 0xFFF3;
gSaveContext.sceneSetupIndex = 7;