diff --git a/include/dusk/settings.h b/include/dusk/settings.h index be8d6e18d0..874ad08f0b 100644 --- a/include/dusk/settings.h +++ b/include/dusk/settings.h @@ -37,7 +37,9 @@ enum class GyroMode : u8 { enum class MagicArmorMode : u8 { NORMAL = 0, ON_DAMAGE = 1, - NEVER = 2, + DOUBLE_DEFENSE = 2, + INVINCIBLE = 3, + COSMETIC = 4, }; namespace config { @@ -68,7 +70,7 @@ struct ConfigEnumRange { template <> struct ConfigEnumRange { static constexpr auto min = MagicArmorMode::NORMAL; - static constexpr auto max = MagicArmorMode::NEVER; + static constexpr auto max = MagicArmorMode::COSMETIC; }; } diff --git a/src/d/actor/d_a_alink.cpp b/src/d/actor/d_a_alink.cpp index f9b4304d80..b1206dffe3 100644 --- a/src/d/actor/d_a_alink.cpp +++ b/src/d/actor/d_a_alink.cpp @@ -12738,7 +12738,19 @@ void daAlink_c::setMagicArmorBrk(int i_status) { BOOL daAlink_c::checkMagicArmorHeavy() const { #if TARGET_PC - return checkMagicArmorWearAbility() && (dComIfGs_getRupee() == 0 && dusk::getSettings().game.armorRupeeDrain.getValue() == dusk::MagicArmorMode::NORMAL); + if(!checkMagicArmorWearAbility()) { + return false; + } + + switch(dusk::getSettings().game.armorRupeeDrain) { + case dusk::MagicArmorMode::NORMAL: + return dComIfGs_getRupee() == 0; + case dusk::MagicArmorMode::ON_DAMAGE: + case dusk::MagicArmorMode::DOUBLE_DEFENSE: + case dusk::MagicArmorMode::INVINCIBLE: + case dusk::MagicArmorMode::COSMETIC: + return false; + } #else return checkMagicArmorWearAbility() && dComIfGs_getRupee() == 0; #endif diff --git a/src/d/actor/d_a_alink_damage.inc b/src/d/actor/d_a_alink_damage.inc index d4e96b0ff0..a57e71bcee 100644 --- a/src/d/actor/d_a_alink_damage.inc +++ b/src/d/actor/d_a_alink_damage.inc @@ -192,7 +192,7 @@ int daAlink_c::setDamagePoint(int i_dmgAmount, BOOL i_checkZoraMag, BOOL i_setDm if (checkMagicArmorNoDamage()) { #if TARGET_PC - if(dusk::getSettings().game.armorRupeeDrain.getValue() == dusk::MagicArmorMode::NEVER) { + if(dusk::getSettings().game.armorRupeeDrain.getValue() == dusk::MagicArmorMode::INVINCIBLE) { i_dmgAmount = 0; } #endif @@ -202,6 +202,11 @@ int daAlink_c::setDamagePoint(int i_dmgAmount, BOOL i_checkZoraMag, BOOL i_setDm if (!mpHIO->mDamage.m.mInvincible && g_debugHpMode == 0) #endif { +#if TARGET_PC + if(checkMagicArmorWearAbility() && dusk::getSettings().game.armorRupeeDrain.getValue() == dusk::MagicArmorMode::DOUBLE_DEFENSE) { + i_dmgAmount /= 2; + } +#endif dComIfGp_setItemLifeCount(-i_dmgAmount, 0); } @@ -281,7 +286,26 @@ BOOL daAlink_c::checkIcePolygonDamage(cBgS_PolyInfo* i_poly) { } BOOL daAlink_c::checkMagicArmorNoDamage() { +#ifdef TARGET_PC + if (!checkMagicArmorWearAbility()) { + return false; + } + + switch(dusk::getSettings().game.armorRupeeDrain) { + case dusk::MagicArmorMode::NORMAL: + return !checkMagicArmorHeavy(); + case dusk::MagicArmorMode::ON_DAMAGE: + return dComIfGs_getRupee() != 0; + case dusk::MagicArmorMode::DOUBLE_DEFENSE: + return false; + case dusk::MagicArmorMode::INVINCIBLE: + return true; + case dusk::MagicArmorMode::COSMETIC: + return false; + } +#else return checkMagicArmorWearAbility() && !checkMagicArmorHeavy(); +#endif } int daAlink_c::checkPolyDamage() { diff --git a/src/dusk/ui/settings.cpp b/src/dusk/ui/settings.cpp index 157cef73d3..1de757628f 100644 --- a/src/dusk/ui/settings.cpp +++ b/src/dusk/ui/settings.cpp @@ -64,7 +64,9 @@ constexpr std::array kGyroInputModeLabels = { constexpr std::array kMagicArmorModes = { "Normal", "On Damage", - "Never", + "Double Defense", + "Invincible", + "Cosmetic", }; bool try_parse_backend(std::string_view backend, AuroraBackend& outBackend) { @@ -1142,7 +1144,7 @@ SettingsWindow::SettingsWindow(bool prelaunch) : mPrelaunch(prelaunch) { "Speeds up Spinner movement while holding R."); leftPane.register_control( leftPane.add_select_button({ - .key = "Magic Armor Rupee Drain", + .key = "Magic Armor Behavior", .getValue = [] { return kMagicArmorModes[static_cast(getSettings().game.armorRupeeDrain.getValue())]; @@ -1169,7 +1171,13 @@ SettingsWindow::SettingsWindow(bool prelaunch) : mPrelaunch(prelaunch) { config::Save(); }); } - pane.add_rml("Control when the Magic Armor uses rupees."); + pane.add_rml( + "
Control the behavior of the Magic Armor." + "
Normal is its original behavior." + "
On Damage only uses rupees when damaged. You will not become heavy when you run out." + "
Double Defense never uses rupees and halves damage taken." + "
Invincible never uses rupees and is immune to damage." + "
Cosmetic uses no rupees and provides no other benefits."); }); addCheat("Invincible Enemies", getSettings().game.invincibleEnemies, "Prevents enemies from taking damage.");