diff --git a/apps/launcher/advancedpage.cpp b/apps/launcher/advancedpage.cpp index d017d3aebe..79530855bb 100644 --- a/apps/launcher/advancedpage.cpp +++ b/apps/launcher/advancedpage.cpp @@ -91,6 +91,7 @@ bool Launcher::AdvancedPage::loadSettings() loadSettingBool(enchantedWeaponsMagicalCheckBox, "enchanted weapons are magical", "Game"); loadSettingBool(permanentBarterDispositionChangeCheckBox, "barter disposition change is permanent", "Game"); loadSettingBool(classicReflectedAbsorbSpellsCheckBox, "classic reflected absorb spells behavior", "Game"); + loadSettingBool(classicCalmSpellsCheckBox, "classic calm spells behavior", "Game"); loadSettingBool( requireAppropriateAmmunitionCheckBox, "only appropriate ammunition bypasses resistance", "Game"); loadSettingBool(uncappedDamageFatigueCheckBox, "uncapped damage fatigue", "Game"); @@ -258,6 +259,7 @@ void Launcher::AdvancedPage::saveSettings() saveSettingBool(enchantedWeaponsMagicalCheckBox, "enchanted weapons are magical", "Game"); saveSettingBool(permanentBarterDispositionChangeCheckBox, "barter disposition change is permanent", "Game"); saveSettingBool(classicReflectedAbsorbSpellsCheckBox, "classic reflected absorb spells behavior", "Game"); + saveSettingBool(classicCalmSpellsCheckBox, "classic calm spells behavior", "Game"); saveSettingBool( requireAppropriateAmmunitionCheckBox, "only appropriate ammunition bypasses resistance", "Game"); saveSettingBool(uncappedDamageFatigueCheckBox, "uncapped damage fatigue", "Game"); diff --git a/apps/openmw/mwmechanics/activespells.cpp b/apps/openmw/mwmechanics/activespells.cpp index 138747e9d4..9cef5142a8 100644 --- a/apps/openmw/mwmechanics/activespells.cpp +++ b/apps/openmw/mwmechanics/activespells.cpp @@ -184,7 +184,7 @@ namespace MWMechanics { if (mIterating) return; - const auto& creatureStats = ptr.getClass().getCreatureStats(ptr); + auto& creatureStats = ptr.getClass().getCreatureStats(ptr); assert(&creatureStats.getActiveSpells() == this); IterationGuard guard{ *this }; // Erase no longer active spells and effects @@ -369,6 +369,15 @@ namespace MWMechanics } ++spellIt; } + + static const bool keepCalm = Settings::Manager::getBool("classic calm spells behavior", "Game"); + if (keepCalm) + { + ESM::MagicEffect::Effects effect + = ptr.getClass().isNpc() ? ESM::MagicEffect::CalmHumanoid : ESM::MagicEffect::CalmCreature; + if (creatureStats.getMagicEffects().get(effect).getMagnitude() > 0.f) + creatureStats.getAiSequence().stopCombat(); + } } void ActiveSpells::addToSpells(const MWWorld::Ptr& ptr, const ActiveSpellParams& spell) diff --git a/files/settings-default.cfg b/files/settings-default.cfg index 3fc46ca981..d82b4a8f7d 100644 --- a/files/settings-default.cfg +++ b/files/settings-default.cfg @@ -263,6 +263,9 @@ actors processing range = 7168 # Make reflected Absorb spells have no practical effect, like in Morrowind. classic reflected absorb spells behavior = true +# Make Calm spells stop combat on every frame +classic calm spells behavior = true + # Show duration of magic effect and lights in the spells window. show effect duration = false diff --git a/files/ui/advancedpage.ui b/files/ui/advancedpage.ui index 6a50fc8a9b..47c17aca03 100644 --- a/files/ui/advancedpage.ui +++ b/files/ui/advancedpage.ui @@ -43,7 +43,7 @@ - + <html><head/><body><p>If enabled NPCs apply evasion maneuver to avoid collisions with others.</p></body></html> @@ -83,6 +83,16 @@ + + + + <html><head/><body><p>Make stealing items from NPCs that were knocked down possible during combat.</p></body></html> + + + Always allow stealing from knocked out actors + + + @@ -143,18 +153,18 @@ + + + + <html><head/><body><p>Stops combat with NPCs affected by Calm spells every frame -- like in Morrowind without the MCP.</p></body></html> + + + Classic Calm spells behavior + + + - - - - <html><head/><body><p>Make stealing items from NPCs that were knocked down possible during combat.</p></body></html> - - - Always allow stealing from knocked out actors - - -