diff --git a/src/dusk/ui/settings.cpp b/src/dusk/ui/settings.cpp index b113926a74..5a6c1cb941 100644 --- a/src/dusk/ui/settings.cpp +++ b/src/dusk/ui/settings.cpp @@ -136,301 +136,6 @@ SelectButton& config_percent_select(Pane& leftPane, Pane& rightPane, ConfigVar(content, Pane::Type::Controlled); - auto& rightPane = add_child(content, Pane::Type::Uncontrolled); - - // TODO: Individual sliders for Main Music, Sub Music, Sound Effects, and Fanfare. - leftPane.add_section("Volume"); - leftPane - .add_child(NumberButton::Props{ - .key = "Master Volume", - .getValue = [] { return getSettings().audio.masterVolume.getValue(); }, - .setValue = - [](int value) { - getSettings().audio.masterVolume.setValue(value); - config::Save(); - audio::SetMasterVolume(value / 100.f); - }, - .isModified = - [] { - return getSettings().audio.masterVolume.getValue() != - getSettings().audio.masterVolume.getDefaultValue(); - }, - .max = 100, - .suffix = "%", - }) - .on_focus([&rightPane](Rml::Event&) { - rightPane.clear(); - rightPane.add_text("Adjusts the volume of all sounds in the game."); - }); - - leftPane.add_section("Effects"); - config_bool_select(leftPane, rightPane, getSettings().audio.enableReverb, - { - .key = "Enable Reverb", - .helpText = "Enables the reverb effect in game audio.", - .onChange = [](bool value) { audio::SetEnableReverb(value); }, - }); - config_bool_select(leftPane, rightPane, getSettings().audio.enableHrtf, - { - .key = "Enable Spatial Sound", - .helpText = - "Emulate surround sound via HRTF. Recommended only for use with headphones!", - .onChange = [](bool value) { audio::EnableHrtf = value; }, - }); - config_bool_select(leftPane, rightPane, getSettings().audio.menuSounds, - { - .key = "Dusk Menu Sounds", - .helpText = "Play sound effects when navigating the Dusk menu.", - }); - - leftPane.add_section("Tweaks"); - config_bool_select(leftPane, rightPane, getSettings().game.noLowHpSound, - { - .key = "No Low HP Sound", - .helpText = "Disable the beeping sound when having low health.", - }); - config_bool_select(leftPane, rightPane, getSettings().game.midnasLamentNonStop, - { - .key = "Non-Stop Midna's Lament", - .helpText = "Prevents enemy music while Midna's Lament is playing.", - }); - }); - - add_tab("Cheats", [this](Rml::Element* content) { - auto& leftPane = add_child(content, Pane::Type::Controlled); - auto& rightPane = add_child(content, Pane::Type::Uncontrolled); - - auto addCheat = [&](const Rml::String& key, ConfigVar& value, - const Rml::String& helpText) { - config_bool_select(leftPane, rightPane, value, - { - .key = key, - .helpText = helpText, - .isDisabled = [] { return getSettings().game.speedrunMode; }, - }); - }; - - leftPane.add_section("Resources"); - addCheat("Infinite Hearts", getSettings().game.infiniteHearts, "Keeps your health full."); - addCheat( - "Infinite Arrows", getSettings().game.infiniteArrows, "Keeps your arrow count full."); - addCheat("Infinite Bombs", getSettings().game.infiniteBombs, "Keeps all bomb bags full."); - addCheat("Infinite Oil", getSettings().game.infiniteOil, "Keeps your lantern oil full."); - addCheat("Infinite Oxygen", getSettings().game.infiniteOxygen, - "Keeps your underwater oxygen meter full."); - addCheat( - "Infinite Rupees", getSettings().game.infiniteRupees, "Keeps your rupee count full."); - addCheat("No Item Timer", getSettings().game.enableIndefiniteItemDrops, - "Item drops such as rupees and hearts will never disappear after they drop."); - - leftPane.add_section("Abilities"); - addCheat( - "Moon Jump (R+A)", getSettings().game.moonJump, "Hold R and A to rise into the air."); - addCheat("Super Clawshot", getSettings().game.superClawshot, - "Extends clawshot behavior beyond the normal game rules."); - addCheat("Always Greatspin", getSettings().game.alwaysGreatspin, - "Allows the Great Spin attack without requiring full health."); - addCheat("Fast Iron Boots", getSettings().game.enableFastIronBoots, - "Speeds up movement while wearing the Iron Boots."); - addCheat("Can Transform Anywhere", getSettings().game.canTransformAnywhere, - "Allows transforming even if NPCs are looking."); - addCheat("Fast Spinner", getSettings().game.fastSpinner, - "Speeds up Spinner movement while holding R."); - addCheat("Free Magic Armor", getSettings().game.freeMagicArmor, - "Lets the magic armor work without consuming rupees."); - }); - - add_tab("Gameplay", [this](Rml::Element* content) { - auto& leftPane = add_child(content, Pane::Type::Controlled); - auto& rightPane = add_child(content, Pane::Type::Uncontrolled); - - auto addOption = [&](const Rml::String& key, ConfigVar& value, - const Rml::String& helpText) { - config_bool_select(leftPane, rightPane, value, - { - .key = key, - .helpText = helpText, - }); - }; - auto addSpeedrunDisabledOption = [&](const Rml::String& key, ConfigVar& value, - const Rml::String& helpText) { - config_bool_select(leftPane, rightPane, value, - { - .key = key, - .helpText = helpText, - .isDisabled = [] { return getSettings().game.speedrunMode; }, - }); - }; - - leftPane.add_section("General"); - addOption("Mirror Mode", getSettings().game.enableMirrorMode, - "Mirrors the world horizontally, matching the Wii version of the game."); - addOption("Disable Main HUD", getSettings().game.disableMainHUD, - "Disables the main HUD of the game.
Useful for recording or a more immersive " - "experience."); - addOption("Restore Wii 1.0 Glitches", getSettings().game.restoreWiiGlitches, - "Restores patched glitches from Wii USA 1.0, the first released version."); - addOption("Enable Rotating Link Doll", getSettings().game.enableLinkDollRotation, - "Enables rotating Link in the collection menu with the C-Stick."); - - leftPane.add_section("Difficulty"); - leftPane - .add_child(NumberButton::Props{ - .key = "Damage Multiplier", - .getValue = [] { return getSettings().game.damageMultiplier.getValue(); }, - .setValue = - [](int value) { - getSettings().game.damageMultiplier.setValue(value); - config::Save(); - }, - .isDisabled = [] { return getSettings().game.speedrunMode; }, - .isModified = - [] { - return getSettings().game.damageMultiplier.getValue() != - getSettings().game.damageMultiplier.getDefaultValue(); - }, - .min = 1, - .max = 8, - .prefix = "x", - }) - .on_focus([&rightPane](Rml::Event&) { - rightPane.clear(); - rightPane.add_text("Multiplies incoming damage."); - }); - addSpeedrunDisabledOption( - "Instant Death", getSettings().game.instantDeath, "Any hit will instantly kill you."); - addSpeedrunDisabledOption("No Heart Drops", getSettings().game.noHeartDrops, - "Hearts will never drop from enemies, pots, and various other places."); - - leftPane.add_section("Quality of Life"); - addOption("Bigger Wallets", getSettings().game.biggerWallets, - "Wallet sizes are like in the HD version. (500, 1000, 2000)"); - addOption("Disable Rupee Cutscenes", getSettings().game.disableRupeeCutscenes, - "Rupees will not play cutscenes after you have collected them the first time."); - addOption("Faster Climbing", getSettings().game.fastClimbing, - "Quicker climbing on ladders and vines like the HD version."); - addOption("Faster Tears of Light", getSettings().game.fastTears, - "Tears of Light dropped by Shadow Insects pop out faster like the HD version."); - config_bool_select(leftPane, rightPane, getSettings().game.autoSave, - { - .key = "Autosave", - .icon = "warning", - .helpText = - "Autosaves the game when going to a new area, opening a dungeon door, " - "or getting a new item.

Experimental " - "feature: Use at your own risk.", - }); - addOption("Instant Saves", getSettings().game.instantSaves, - "Skips the delay when writing to the Memory Card."); - addOption("Hold B for Instant Text", getSettings().game.instantText, - "Makes text scroll immediately by holding B."); - addOption("No Climbing Miss Animation", getSettings().game.noMissClimbing, - "Prevents Link from playing a struggle animation when grabbing ledges or " - "climbing on vines."); - addOption("No Rupee Returns", getSettings().game.noReturnRupees, - "Always collect Rupees even if your Wallet is too full."); - addOption("No Sword Recoil", getSettings().game.noSwordRecoil, - "Link will not recoil when his sword hits walls."); - addOption("No 2nd Fish for Cat", getSettings().game.no2ndFishForCat, - "Skip needing to catch a second fish for Sera's cat."); - addOption("Sun's Song (R+X)", getSettings().game.sunsSong, - "Allows Wolf Link to howl and change the time of day."); - addOption("Quick Transform (R+Y)", getSettings().game.enableQuickTransform, - "Transform instantly by pressing R and Y simultaneously."); - - leftPane.add_section("Speedrunning"); - config_bool_select(leftPane, rightPane, getSettings().game.speedrunMode, - { - .key = "Speedrun Mode", - .helpText = - "Enables speedrunning options while restricting certain gameplay modifiers.", - .onChange = [](bool) { reset_for_speedrun_mode(); }, - }); - config_bool_select(leftPane, rightPane, getSettings().game.liveSplitEnabled, - { - .key = "LiveSplit Connection", - .helpText = "Connect to LiveSplit server on localhost:16834.", - .onChange = - [](bool enabled) { - if (enabled) { - speedrun::connectLiveSplit(); - } else { - speedrun::disconnectLiveSplit(); - } - }, - .isDisabled = [] { return !getSettings().game.speedrunMode; }, - }); - }); - - add_tab("Input", [this](Rml::Element* content) { - auto& leftPane = add_child(content, Pane::Type::Controlled); - auto& rightPane = add_child(content, Pane::Type::Uncontrolled); - - auto addOption = [&](const Rml::String& key, ConfigVar& value, - const Rml::String& helpText, std::function isDisabled = {}) { - config_bool_select(leftPane, rightPane, value, - { - .key = key, - .helpText = helpText, - .isDisabled = std::move(isDisabled), - }); - }; - - leftPane.add_section("Controller"); - leftPane.add_button("Configure Controller") - .on_pressed([this] { push(std::make_unique()); }) - .on_focus([&rightPane](Rml::Event&) { - rightPane.clear(); - rightPane.add_text("Open controller binding configuration."); - }); - - leftPane.add_section("Camera"); - addOption("Free Camera", getSettings().game.freeCamera, - "Enables twin-stick camera control, letting the C-Stick move the camera vertically as " - "well as horizontally."); - addOption("Invert Camera X Axis", getSettings().game.invertCameraXAxis, - "Invert horizontal camera movement."); - addOption("Invert Camera Y Axis", getSettings().game.invertCameraYAxis, - "Invert vertical camera movement when Free Camera is enabled.", - [] { return !getSettings().game.freeCamera; }); - config_percent_select(leftPane, rightPane, getSettings().game.freeCameraSensitivity, - "Free Camera Sensitivity", "Adjusts twin-stick camera sensitivity.", 50, 200, 5, - [] { return !getSettings().game.freeCamera; }); - - leftPane.add_section("Gyro"); - addOption("Gyro Aim", getSettings().game.enableGyroAim, - "Enables gyro controls while in look mode, aiming a hawk, and aiming " - "supported items.

Supported items include the Slingshot, Gale Boomerang, " - "Hero's Bow, Clawshot(s), Ball and Chain, and Dominion Rod."); - addOption("Gyro Rollgoal", getSettings().game.enableGyroRollgoal, - "Enables gyro controls for Rollgoal in Hena's Cabin."); - config_percent_select(leftPane, rightPane, getSettings().game.gyroSensitivityY, - "Gyro Pitch Sensitivity", "Controls vertical gyro aiming sensitivity.", 25, 400, 5, - [] { return !gyro_enabled(); }); - config_percent_select(leftPane, rightPane, getSettings().game.gyroSensitivityX, - "Gyro Yaw Sensitivity", "Controls horizontal gyro aiming sensitivity.", 25, 400, 5, - [] { return !gyro_enabled(); }); - config_percent_select(leftPane, rightPane, getSettings().game.gyroSensitivityRollgoal, - "Rollgoal Sensitivity", "Controls how strongly gyro input tilts the Rollgoal table.", - 25, 400, 5, [] { return !getSettings().game.enableGyroRollgoal; }); - config_percent_select(leftPane, rightPane, getSettings().game.gyroDeadband, "Gyro Deadband", - "Ignores small gyro movement to reduce drift and jitter.", 0, 50, 1, - [] { return !gyro_enabled(); }); - config_percent_select(leftPane, rightPane, getSettings().game.gyroSmoothing, - "Gyro Smoothing", "Higher values smooth gyro input over time.", 0, 100, 1, - [] { return !gyro_enabled(); }); - addOption("Invert Gyro Pitch", getSettings().game.gyroInvertPitch, - "Invert vertical gyro aiming.", [] { return !gyro_enabled(); }); - addOption("Invert Gyro Yaw", getSettings().game.gyroInvertYaw, - "Invert horizontal gyro aiming.", [] { return !gyro_enabled(); }); - - leftPane.add_section("Tools"); - addOption("Turbo Key", getSettings().game.enableTurboKeybind, - "Hold Tab to increase game speed by up to 4x.", - [] { return getSettings().game.speedrunMode; }); - }); add_tab("Graphics", [this](Rml::Element* content) { auto& leftPane = add_child(content, Pane::Type::Controlled); @@ -625,6 +330,302 @@ SettingsWindow::SettingsWindow() { }); }); + add_tab("Input", [this](Rml::Element* content) { + auto& leftPane = add_child(content, Pane::Type::Controlled); + auto& rightPane = add_child(content, Pane::Type::Uncontrolled); + + auto addOption = [&](const Rml::String& key, ConfigVar& value, + const Rml::String& helpText, std::function isDisabled = {}) { + config_bool_select(leftPane, rightPane, value, + { + .key = key, + .helpText = helpText, + .isDisabled = std::move(isDisabled), + }); + }; + + leftPane.add_section("Controller"); + leftPane.add_button("Configure Controller") + .on_pressed([this] { push(std::make_unique()); }) + .on_focus([&rightPane](Rml::Event&) { + rightPane.clear(); + rightPane.add_text("Open controller binding configuration."); + }); + + leftPane.add_section("Camera"); + addOption("Free Camera", getSettings().game.freeCamera, + "Enables twin-stick camera control, letting the C-Stick move the camera vertically as " + "well as horizontally."); + addOption("Invert Camera X Axis", getSettings().game.invertCameraXAxis, + "Invert horizontal camera movement."); + addOption("Invert Camera Y Axis", getSettings().game.invertCameraYAxis, + "Invert vertical camera movement when Free Camera is enabled.", + [] { return !getSettings().game.freeCamera; }); + config_percent_select(leftPane, rightPane, getSettings().game.freeCameraSensitivity, + "Free Camera Sensitivity", "Adjusts twin-stick camera sensitivity.", 50, 200, 5, + [] { return !getSettings().game.freeCamera; }); + + leftPane.add_section("Gyro"); + addOption("Gyro Aim", getSettings().game.enableGyroAim, + "Enables gyro controls while in look mode, aiming a hawk, and aiming " + "supported items.

Supported items include the Slingshot, Gale Boomerang, " + "Hero's Bow, Clawshot(s), Ball and Chain, and Dominion Rod."); + addOption("Gyro Rollgoal", getSettings().game.enableGyroRollgoal, + "Enables gyro controls for Rollgoal in Hena's Cabin."); + config_percent_select(leftPane, rightPane, getSettings().game.gyroSensitivityY, + "Gyro Pitch Sensitivity", "Controls vertical gyro aiming sensitivity.", 25, 400, 5, + [] { return !gyro_enabled(); }); + config_percent_select(leftPane, rightPane, getSettings().game.gyroSensitivityX, + "Gyro Yaw Sensitivity", "Controls horizontal gyro aiming sensitivity.", 25, 400, 5, + [] { return !gyro_enabled(); }); + config_percent_select(leftPane, rightPane, getSettings().game.gyroSensitivityRollgoal, + "Rollgoal Sensitivity", "Controls how strongly gyro input tilts the Rollgoal table.", + 25, 400, 5, [] { return !getSettings().game.enableGyroRollgoal; }); + config_percent_select(leftPane, rightPane, getSettings().game.gyroDeadband, "Gyro Deadband", + "Ignores small gyro movement to reduce drift and jitter.", 0, 50, 1, + [] { return !gyro_enabled(); }); + config_percent_select(leftPane, rightPane, getSettings().game.gyroSmoothing, + "Gyro Smoothing", "Higher values smooth gyro input over time.", 0, 100, 1, + [] { return !gyro_enabled(); }); + addOption("Invert Gyro Pitch", getSettings().game.gyroInvertPitch, + "Invert vertical gyro aiming.", [] { return !gyro_enabled(); }); + addOption("Invert Gyro Yaw", getSettings().game.gyroInvertYaw, + "Invert horizontal gyro aiming.", [] { return !gyro_enabled(); }); + + leftPane.add_section("Tools"); + addOption("Turbo Key", getSettings().game.enableTurboKeybind, + "Hold Tab to increase game speed by up to 4x.", + [] { return getSettings().game.speedrunMode; }); + }); + + add_tab("Audio", [this](Rml::Element* content) { + auto& leftPane = add_child(content, Pane::Type::Controlled); + auto& rightPane = add_child(content, Pane::Type::Uncontrolled); + + // TODO: Individual sliders for Main Music, Sub Music, Sound Effects, and Fanfare. + leftPane.add_section("Volume"); + leftPane + .add_child(NumberButton::Props{ + .key = "Master Volume", + .getValue = [] { return getSettings().audio.masterVolume.getValue(); }, + .setValue = + [](int value) { + getSettings().audio.masterVolume.setValue(value); + config::Save(); + audio::SetMasterVolume(value / 100.f); + }, + .isModified = + [] { + return getSettings().audio.masterVolume.getValue() != + getSettings().audio.masterVolume.getDefaultValue(); + }, + .max = 100, + .suffix = "%", + }) + .on_focus([&rightPane](Rml::Event&) { + rightPane.clear(); + rightPane.add_text("Adjusts the volume of all sounds in the game."); + }); + + leftPane.add_section("Effects"); + config_bool_select(leftPane, rightPane, getSettings().audio.enableReverb, + { + .key = "Enable Reverb", + .helpText = "Enables the reverb effect in game audio.", + .onChange = [](bool value) { audio::SetEnableReverb(value); }, + }); + config_bool_select(leftPane, rightPane, getSettings().audio.enableHrtf, + { + .key = "Enable Spatial Sound", + .helpText = + "Emulate surround sound via HRTF. Recommended only for use with headphones!", + .onChange = [](bool value) { audio::EnableHrtf = value; }, + }); + config_bool_select(leftPane, rightPane, getSettings().audio.menuSounds, + { + .key = "Dusk Menu Sounds", + .helpText = "Play sound effects when navigating the Dusk menu.", + }); + + leftPane.add_section("Tweaks"); + config_bool_select(leftPane, rightPane, getSettings().game.noLowHpSound, + { + .key = "No Low HP Sound", + .helpText = "Disable the beeping sound when having low health.", + }); + config_bool_select(leftPane, rightPane, getSettings().game.midnasLamentNonStop, + { + .key = "Non-Stop Midna's Lament", + .helpText = "Prevents enemy music while Midna's Lament is playing.", + }); + }); + + add_tab("Gameplay", [this](Rml::Element* content) { + auto& leftPane = add_child(content, Pane::Type::Controlled); + auto& rightPane = add_child(content, Pane::Type::Uncontrolled); + + auto addOption = [&](const Rml::String& key, ConfigVar& value, + const Rml::String& helpText) { + config_bool_select(leftPane, rightPane, value, + { + .key = key, + .helpText = helpText, + }); + }; + auto addSpeedrunDisabledOption = [&](const Rml::String& key, ConfigVar& value, + const Rml::String& helpText) { + config_bool_select(leftPane, rightPane, value, + { + .key = key, + .helpText = helpText, + .isDisabled = [] { return getSettings().game.speedrunMode; }, + }); + }; + + leftPane.add_section("General"); + addOption("Mirror Mode", getSettings().game.enableMirrorMode, + "Mirrors the world horizontally, matching the Wii version of the game."); + addOption("Disable Main HUD", getSettings().game.disableMainHUD, + "Disables the main HUD of the game.
Useful for recording or a more immersive " + "experience."); + addOption("Restore Wii 1.0 Glitches", getSettings().game.restoreWiiGlitches, + "Restores patched glitches from Wii USA 1.0, the first released version."); + addOption("Enable Rotating Link Doll", getSettings().game.enableLinkDollRotation, + "Enables rotating Link in the collection menu with the C-Stick."); + + leftPane.add_section("Difficulty"); + leftPane + .add_child(NumberButton::Props{ + .key = "Damage Multiplier", + .getValue = [] { return getSettings().game.damageMultiplier.getValue(); }, + .setValue = + [](int value) { + getSettings().game.damageMultiplier.setValue(value); + config::Save(); + }, + .isDisabled = [] { return getSettings().game.speedrunMode; }, + .isModified = + [] { + return getSettings().game.damageMultiplier.getValue() != + getSettings().game.damageMultiplier.getDefaultValue(); + }, + .min = 1, + .max = 8, + .prefix = "x", + }) + .on_focus([&rightPane](Rml::Event&) { + rightPane.clear(); + rightPane.add_text("Multiplies incoming damage."); + }); + addSpeedrunDisabledOption( + "Instant Death", getSettings().game.instantDeath, "Any hit will instantly kill you."); + addSpeedrunDisabledOption("No Heart Drops", getSettings().game.noHeartDrops, + "Hearts will never drop from enemies, pots, and various other places."); + + leftPane.add_section("Quality of Life"); + addOption("Bigger Wallets", getSettings().game.biggerWallets, + "Wallet sizes are like in the HD version. (500, 1000, 2000)"); + addOption("Disable Rupee Cutscenes", getSettings().game.disableRupeeCutscenes, + "Rupees will not play cutscenes after you have collected them the first time."); + addOption("Faster Climbing", getSettings().game.fastClimbing, + "Quicker climbing on ladders and vines like the HD version."); + addOption("Faster Tears of Light", getSettings().game.fastTears, + "Tears of Light dropped by Shadow Insects pop out faster like the HD version."); + config_bool_select(leftPane, rightPane, getSettings().game.autoSave, + { + .key = "Autosave", + .icon = "warning", + .helpText = + "Autosaves the game when going to a new area, opening a dungeon door, " + "or getting a new item.

Experimental " + "feature: Use at your own risk.", + }); + addOption("Instant Saves", getSettings().game.instantSaves, + "Skips the delay when writing to the Memory Card."); + addOption("Hold B for Instant Text", getSettings().game.instantText, + "Makes text scroll immediately by holding B."); + addOption("No Climbing Miss Animation", getSettings().game.noMissClimbing, + "Prevents Link from playing a struggle animation when grabbing ledges or " + "climbing on vines."); + addOption("No Rupee Returns", getSettings().game.noReturnRupees, + "Always collect Rupees even if your Wallet is too full."); + addOption("No Sword Recoil", getSettings().game.noSwordRecoil, + "Link will not recoil when his sword hits walls."); + addOption("No 2nd Fish for Cat", getSettings().game.no2ndFishForCat, + "Skip needing to catch a second fish for Sera's cat."); + addOption("Sun's Song (R+X)", getSettings().game.sunsSong, + "Allows Wolf Link to howl and change the time of day."); + addOption("Quick Transform (R+Y)", getSettings().game.enableQuickTransform, + "Transform instantly by pressing R and Y simultaneously."); + + leftPane.add_section("Speedrunning"); + config_bool_select(leftPane, rightPane, getSettings().game.speedrunMode, + { + .key = "Speedrun Mode", + .helpText = + "Enables speedrunning options while restricting certain gameplay modifiers.", + .onChange = [](bool) { reset_for_speedrun_mode(); }, + }); + config_bool_select(leftPane, rightPane, getSettings().game.liveSplitEnabled, + { + .key = "LiveSplit Connection", + .helpText = "Connect to LiveSplit server on localhost:16834.", + .onChange = + [](bool enabled) { + if (enabled) { + speedrun::connectLiveSplit(); + } else { + speedrun::disconnectLiveSplit(); + } + }, + .isDisabled = [] { return !getSettings().game.speedrunMode; }, + }); + }); + + add_tab("Cheats", [this](Rml::Element* content) { + auto& leftPane = add_child(content, Pane::Type::Controlled); + auto& rightPane = add_child(content, Pane::Type::Uncontrolled); + + auto addCheat = [&](const Rml::String& key, ConfigVar& value, + const Rml::String& helpText) { + config_bool_select(leftPane, rightPane, value, + { + .key = key, + .helpText = helpText, + .isDisabled = [] { return getSettings().game.speedrunMode; }, + }); + }; + + leftPane.add_section("Resources"); + addCheat("Infinite Hearts", getSettings().game.infiniteHearts, "Keeps your health full."); + addCheat( + "Infinite Arrows", getSettings().game.infiniteArrows, "Keeps your arrow count full."); + addCheat("Infinite Bombs", getSettings().game.infiniteBombs, "Keeps all bomb bags full."); + addCheat("Infinite Oil", getSettings().game.infiniteOil, "Keeps your lantern oil full."); + addCheat("Infinite Oxygen", getSettings().game.infiniteOxygen, + "Keeps your underwater oxygen meter full."); + addCheat( + "Infinite Rupees", getSettings().game.infiniteRupees, "Keeps your rupee count full."); + addCheat("No Item Timer", getSettings().game.enableIndefiniteItemDrops, + "Item drops such as rupees and hearts will never disappear after they drop."); + + leftPane.add_section("Abilities"); + addCheat( + "Moon Jump (R+A)", getSettings().game.moonJump, "Hold R and A to rise into the air."); + addCheat("Super Clawshot", getSettings().game.superClawshot, + "Extends clawshot behavior beyond the normal game rules."); + addCheat("Always Greatspin", getSettings().game.alwaysGreatspin, + "Allows the Great Spin attack without requiring full health."); + addCheat("Fast Iron Boots", getSettings().game.enableFastIronBoots, + "Speeds up movement while wearing the Iron Boots."); + addCheat("Can Transform Anywhere", getSettings().game.canTransformAnywhere, + "Allows transforming even if NPCs are looking."); + addCheat("Fast Spinner", getSettings().game.fastSpinner, + "Speeds up Spinner movement while holding R."); + addCheat("Free Magic Armor", getSettings().game.freeMagicArmor, + "Lets the magic armor work without consuming rupees."); + }); + // TODO: Reorganize all of this? add_tab("Interface", [this](Rml::Element* content) { auto& leftPane = add_child(content, Pane::Type::Controlled);