diff --git a/CHANGELOG.md b/CHANGELOG.md index 799f5e0658..47f94c6952 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,7 @@ Bug #6143: Capturing a screenshot makes engine to be a temporary unresponsive Bug #6165: Paralyzed player character can pickup items when the inventory is open Bug #6174: Spellmaking and Enchanting sliders differences from vanilla + Bug #6184: Command and Calm and Demoralize and Frenzy and Rally magic effects inconsistencies with vanilla Feature #2554: Modifying an object triggers the instances table to scroll to the corresponding record Feature #2780: A way to see current OpenMW version in the console Feature #3616: Allow Zoom levels on the World Map diff --git a/apps/openmw/mwmechanics/actors.cpp b/apps/openmw/mwmechanics/actors.cpp index 844b2b6987..21ec5d987b 100644 --- a/apps/openmw/mwmechanics/actors.cpp +++ b/apps/openmw/mwmechanics/actors.cpp @@ -1158,21 +1158,15 @@ namespace MWMechanics // AI setting modifiers int creature = !ptr.getClass().isNpc(); - if (creature && ptr.get()->mBase->mData.mType == ESM::Creature::Humanoid) - creature = false; - // Note: the Creature variants only work on normal creatures, not on daedra or undead creatures. - if (!creature || ptr.get()->mBase->mData.mType == ESM::Creature::Creatures) - { - Stat stat = creatureStats.getAiSetting(CreatureStats::AI_Fight); - stat.setModifier(static_cast(effects.get(ESM::MagicEffect::FrenzyHumanoid + creature).getMagnitude() - - effects.get(ESM::MagicEffect::CalmHumanoid+creature).getMagnitude())); - creatureStats.setAiSetting(CreatureStats::AI_Fight, stat); + Stat stat = creatureStats.getAiSetting(CreatureStats::AI_Fight); + stat.setModifier(static_cast(effects.get(ESM::MagicEffect::FrenzyHumanoid + creature).getMagnitude() + - effects.get(ESM::MagicEffect::CalmHumanoid+creature).getMagnitude())); + creatureStats.setAiSetting(CreatureStats::AI_Fight, stat); - stat = creatureStats.getAiSetting(CreatureStats::AI_Flee); - stat.setModifier(static_cast(effects.get(ESM::MagicEffect::DemoralizeHumanoid + creature).getMagnitude() - - effects.get(ESM::MagicEffect::RallyHumanoid+creature).getMagnitude())); - creatureStats.setAiSetting(CreatureStats::AI_Flee, stat); - } + stat = creatureStats.getAiSetting(CreatureStats::AI_Flee); + stat.setModifier(static_cast(effects.get(ESM::MagicEffect::DemoralizeHumanoid + creature).getMagnitude() + - effects.get(ESM::MagicEffect::RallyHumanoid+creature).getMagnitude())); + creatureStats.setAiSetting(CreatureStats::AI_Flee, stat); if (creature && ptr.get()->mBase->mData.mType == ESM::Creature::Undead) { Stat stat = creatureStats.getAiSetting(CreatureStats::AI_Flee); diff --git a/apps/openmw/mwmechanics/spellcasting.cpp b/apps/openmw/mwmechanics/spellcasting.cpp index 6b07fdbb86..502e56edf7 100644 --- a/apps/openmw/mwmechanics/spellcasting.cpp +++ b/apps/openmw/mwmechanics/spellcasting.cpp @@ -383,6 +383,25 @@ namespace MWMechanics target.getClass().getCreatureStats(target).getActiveSpells().purgeAll(magnitude, true); return true; } + else if(target.getClass().isActor() && effectId >= ESM::MagicEffect::CalmHumanoid && effectId <= ESM::MagicEffect::RallyCreature) + { + // Treat X Humanoid spells on creatures and X Creature spells on NPCs as instant effects and remove their VFX + bool affectsCreatures = (effectId - ESM::MagicEffect::CalmHumanoid) & 1; + if(affectsCreatures == target.getClass().isNpc()) + { + MWBase::Environment::get().getWorld()->getAnimation(target)->removeEffect(effectId); + return true; + } + } + else if(target.getClass().isActor() && effectId == ESM::MagicEffect::TurnUndead) + { + // Diverge from vanilla by giving scripts a chance to detect Turn Undead on non-undead, but still remove the effect and VFX + if(target.getClass().isNpc() || target.get()->mBase->mData.mType != ESM::Creature::Undead) + { + MWBase::Environment::get().getWorld()->getAnimation(target)->removeEffect(effectId); + return true; + } + } else if (target.getClass().isActor() && target == getPlayer()) { MWRender::Animation* anim = MWBase::Environment::get().getWorld()->getAnimation(mCaster);