diff --git a/include/dusk/settings.h b/include/dusk/settings.h index 326f7f321c..66c55644c5 100644 --- a/include/dusk/settings.h +++ b/include/dusk/settings.h @@ -59,6 +59,13 @@ enum class MenuScaling : u8 { Dusklight = 2, }; +enum class ZoraArmorMode : u8 { + Normal = 0, + Cosmetic = 1, + Mask = 2, + Cosmetic_Mask = 3, +}; + enum class MagicArmorMode : u8 { NORMAL = 0, ON_DAMAGE = 1, @@ -116,6 +123,12 @@ struct ConfigEnumRange { static constexpr auto max = MenuScaling::Dusklight; }; +template <> +struct ConfigEnumRange { + static constexpr auto min = ZoraArmorMode::Normal; + static constexpr auto max = ZoraArmorMode::Cosmetic_Mask; +}; + template <> struct ConfigEnumRange { static constexpr auto min = MagicArmorMode::NORMAL; @@ -264,6 +277,7 @@ struct UserSettings { ConfigVar canTransformAnywhere; ConfigVar fastRoll; ConfigVar fastSpinner; + ConfigVar zoraArmorMode; ConfigVar armorRupeeDrain; ConfigVar invincibleEnemies; diff --git a/src/d/actor/d_a_alink_damage.inc b/src/d/actor/d_a_alink_damage.inc index a57e71bcee..cbdea48f60 100644 --- a/src/d/actor/d_a_alink_damage.inc +++ b/src/d/actor/d_a_alink_damage.inc @@ -168,6 +168,12 @@ f32 daAlink_c::damageMagnification(BOOL i_checkZoraMag, int param_1) { } if (checkZoraWearAbility() && i_checkZoraMag) { + #if TARGET_PC + if (dusk::getSettings().game.zoraArmorMode.getValue() == dusk::ZoraArmorMode::Cosmetic || + dusk::getSettings().game.zoraArmorMode.getValue() == dusk::ZoraArmorMode::Cosmetic_Mask) { + return base_mag; + } + #endif return 10.0f * base_mag; } diff --git a/src/d/actor/d_a_alink_swim.inc b/src/d/actor/d_a_alink_swim.inc index 19131e404a..67ff3f3a03 100644 --- a/src/d/actor/d_a_alink_swim.inc +++ b/src/d/actor/d_a_alink_swim.inc @@ -8,6 +8,12 @@ #include "f_op/f_op_kankyo_mng.h" BOOL daAlink_c::checkZoraWearMaskDraw() { + #if TARGET_PC + if (dusk::getSettings().game.zoraArmorMode.getValue() == dusk::ZoraArmorMode::Mask || + dusk::getSettings().game.zoraArmorMode.getValue() == dusk::ZoraArmorMode::Cosmetic_Mask) { + return checkZoraWearAbility(); + } + #endif return checkZoraWearAbility() && !checkNoResetFlg0(FLG0_SWIM_UP); } diff --git a/src/dusk/config.cpp b/src/dusk/config.cpp index a2b79eaac5..515d04ff81 100644 --- a/src/dusk/config.cpp +++ b/src/dusk/config.cpp @@ -394,6 +394,7 @@ template class ConfigImpl; template class ConfigImpl; template class ConfigImpl; template class ConfigImpl; +template class ConfigImpl; template class ConfigImpl; template class ConfigImpl; diff --git a/src/dusk/settings.cpp b/src/dusk/settings.cpp index e2a2169485..9200064be8 100644 --- a/src/dusk/settings.cpp +++ b/src/dusk/settings.cpp @@ -137,6 +137,7 @@ UserSettings g_userSettings = { .canTransformAnywhere {"game.canTransformAnywhere", false}, .fastRoll {"game.fastRoll", false}, .fastSpinner {"game.fastSpinner", false}, + .zoraArmorMode {"game.zoraArmorMode", ZoraArmorMode::Normal}, .armorRupeeDrain {"game.armorRupeeDrain", MagicArmorMode::NORMAL}, .invincibleEnemies {"game.invincibleEnemies", false}, @@ -284,6 +285,7 @@ void registerSettings() { Register(g_userSettings.game.enableFastIronBoots); Register(g_userSettings.game.canTransformAnywhere); Register(g_userSettings.game.fastRoll); + Register(g_userSettings.game.zoraArmorMode); Register(g_userSettings.game.armorRupeeDrain); Register(g_userSettings.game.restoreWiiGlitches); Register(g_userSettings.game.enableLinkDollRotation); diff --git a/src/dusk/speedrun.cpp b/src/dusk/speedrun.cpp index 275a8de900..cc45950e9e 100644 --- a/src/dusk/speedrun.cpp +++ b/src/dusk/speedrun.cpp @@ -34,6 +34,7 @@ void resetForSpeedrunMode() { getSettings().game.canTransformAnywhere.setSpeedrunValue(false); getSettings().game.fastRoll.setSpeedrunValue(false); getSettings().game.fastSpinner.setSpeedrunValue(false); + getSettings().game.zoraArmorMode.setSpeedrunValue(ZoraArmorMode::Normal); getSettings().game.armorRupeeDrain.setSpeedrunValue(MagicArmorMode::NORMAL); getSettings().game.invincibleEnemies.setSpeedrunValue(false); diff --git a/src/dusk/ui/settings.cpp b/src/dusk/ui/settings.cpp index e2ee60729a..f42cefc791 100644 --- a/src/dusk/ui/settings.cpp +++ b/src/dusk/ui/settings.cpp @@ -101,6 +101,13 @@ constexpr std::array kMenuScalingModeLabels = { "Dusklight", }; +constexpr std::array kZoraArmorModes = { + "Normal", + "Cosmetic", + "Mask", + "Cosmetic + Mask", +}; + constexpr std::array kMagicArmorModes = { "Normal", "On Damage", @@ -1344,6 +1351,40 @@ SettingsWindow::SettingsWindow(bool prelaunch) : mPrelaunch(prelaunch) { "Makes Link's roll animation and movement twice as fast."); addCheat("Fast Spinner", getSettings().game.fastSpinner, "Speeds up Spinner movement while holding R."); + + leftPane.register_control( + leftPane.add_select_button({ + .key = "Zora Armor Behavior", + .getValue = + [] { + return kZoraArmorModes[static_cast(getSettings().game.zoraArmorMode.getValue())]; + }, + .isDisabled = [] { return getSettings().game.speedrunMode.getValue(); }, + .isModified = + [] { + return getSettings().game.zoraArmorMode.getValue() != + getSettings().game.zoraArmorMode.getDefaultValue(); + }, + }), + rightPane, [](Pane& pane) { + for (int i = 0; i < kZoraArmorModes.size(); i++) { + pane.add_button({ + .text = kZoraArmorModes[i], + .isSelected = + [i] { + return getSettings().game.zoraArmorMode.getValue() == static_cast(i); + }, + }) + .on_pressed([i] { + mDoAud_seStartMenu(kSoundItemChange); + getSettings().game.zoraArmorMode.setValue(static_cast(i)); + config::save(); + }); + } + pane.add_rml( + "
Control the behavior of the Zora Armor."); + }); + leftPane.register_control( leftPane.add_select_button({ .key = "Magic Armor Behavior",