From e2496af5c5a660cbf4f07a1c976746dbe70a72fd Mon Sep 17 00:00:00 2001 From: capostrophic Date: Wed, 31 Jul 2019 13:54:27 +0300 Subject: [PATCH] Vanilla-friendly ranged crits (bug #5067) --- CHANGELOG.md | 1 + apps/openmw/mwmechanics/combat.cpp | 23 +++++++++-------------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bf1f80705b..0fd68274dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -108,6 +108,7 @@ Bug #5056: Calling Cast function on player doesn't equip the spell but casts it Bug #5060: Magic effect visuals stop when death animation begins instead of when it ends Bug #5063: Shape named "Tri Shadow" in creature mesh is visible if it isn't hidden + Bug #5067: Ranged attacks on unaware opponents ("critical hits") differ from the vanilla engine Bug #5069: Blocking creatures' attacks doesn't degrade shields Bug #5074: Paralyzed actors greet the player Bug #5075: Enchanting cast style can be changed if there's no object diff --git a/apps/openmw/mwmechanics/combat.cpp b/apps/openmw/mwmechanics/combat.cpp index b39d769b28..9258c6b2de 100644 --- a/apps/openmw/mwmechanics/combat.cpp +++ b/apps/openmw/mwmechanics/combat.cpp @@ -229,23 +229,18 @@ namespace MWMechanics applyWerewolfDamageMult(victim, projectile, damage); if (attacker == getPlayer()) - { attacker.getClass().skillUsageSucceeded(attacker, weaponSkill, 0); - const MWMechanics::AiSequence& sequence = victim.getClass().getCreatureStats(victim).getAiSequence(); - bool unaware = !sequence.isInCombat() - && !MWBase::Environment::get().getMechanicsManager()->awarenessCheck(attacker, victim); - - if (unaware) - { - damage *= gmst.find("fCombatCriticalStrikeMult")->mValue.getFloat(); - MWBase::Environment::get().getWindowManager()->messageBox("#{sTargetCriticalStrike}"); - MWBase::Environment::get().getSoundManager()->playSound3D(victim, "critical damage", 1.0f, 1.0f); - } - } - - if (victim.getClass().getCreatureStats(victim).getKnockedDown()) + const MWMechanics::AiSequence& sequence = victim.getClass().getCreatureStats(victim).getAiSequence(); + bool unaware = attacker == getPlayer() && !sequence.isInCombat() + && !MWBase::Environment::get().getMechanicsManager()->awarenessCheck(attacker, victim); + bool knockedDown = victim.getClass().getCreatureStats(victim).getKnockedDown(); + if (knockedDown || unaware) + { damage *= gmst.find("fCombatKODamageMult")->mValue.getFloat(); + if (!knockedDown) + MWBase::Environment::get().getSoundManager()->playSound3D(victim, "critical damage", 1.0f, 1.0f); + } } reduceWeaponCondition(damage, validVictim, weapon, attacker);