mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-01-26 09:35:28 +00:00
Move werewolf silver damage mult applying into a new function
This commit is contained in:
parent
808b8ce8db
commit
64d5cd17d6
@ -308,6 +308,7 @@ namespace MWClass
|
||||
{
|
||||
damage = attack[0] + ((attack[1]-attack[0])*attackStrength);
|
||||
MWMechanics::adjustWeaponDamage(damage, weapon, ptr);
|
||||
MWMechanics::applyWerewolfDamageMult(victim, weapon, damage);
|
||||
MWMechanics::resistNormalWeapon(victim, ptr, weapon, damage);
|
||||
MWMechanics::reduceWeaponCondition(damage, true, weapon, ptr);
|
||||
}
|
||||
|
@ -621,6 +621,7 @@ namespace MWClass
|
||||
}
|
||||
MWMechanics::adjustWeaponDamage(damage, weapon, ptr);
|
||||
resisted = MWMechanics::resistNormalWeapon(victim, ptr, weapon, damage);
|
||||
MWMechanics::applyWerewolfDamageMult(victim, weapon, damage);
|
||||
MWMechanics::reduceWeaponCondition(damage, true, weapon, ptr);
|
||||
healthdmg = true;
|
||||
}
|
||||
|
@ -163,25 +163,30 @@ namespace MWMechanics
|
||||
|
||||
bool resistNormalWeapon(const MWWorld::Ptr &actor, const MWWorld::Ptr& attacker, const MWWorld::Ptr &weapon, float &damage)
|
||||
{
|
||||
if (damage == 0)
|
||||
if (damage == 0 || weapon.isEmpty() || !isNormalWeapon(weapon))
|
||||
return false;
|
||||
|
||||
if (isNormalWeapon(weapon))
|
||||
{
|
||||
const MWMechanics::MagicEffects& effects = actor.getClass().getCreatureStats(actor).getMagicEffects();
|
||||
const float resistance = effects.get(ESM::MagicEffect::ResistNormalWeapons).getMagnitude() / 100.f;
|
||||
const float weakness = effects.get(ESM::MagicEffect::WeaknessToNormalWeapons).getMagnitude() / 100.f;
|
||||
const MWMechanics::MagicEffects& effects = actor.getClass().getCreatureStats(actor).getMagicEffects();
|
||||
const float resistance = effects.get(ESM::MagicEffect::ResistNormalWeapons).getMagnitude() / 100.f;
|
||||
const float weakness = effects.get(ESM::MagicEffect::WeaknessToNormalWeapons).getMagnitude() / 100.f;
|
||||
|
||||
damage *= 1.f - std::min(1.f, resistance-weakness);
|
||||
}
|
||||
|
||||
if ((weapon.get<ESM::Weapon>()->mBase->mData.mFlags & ESM::Weapon::Silver)
|
||||
&& actor.getClass().isNpc() && actor.getClass().getNpcStats(actor).isWerewolf())
|
||||
damage *= MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>().find("fWereWolfSilverWeaponDamageMult")->mValue.getFloat();
|
||||
damage *= 1.f - std::min(1.f, resistance-weakness);
|
||||
|
||||
return (damage == 0);
|
||||
}
|
||||
|
||||
void applyWerewolfDamageMult(const MWWorld::Ptr &actor, const MWWorld::Ptr &weapon, float &damage)
|
||||
{
|
||||
if (damage == 0 || weapon.isEmpty())
|
||||
return;
|
||||
|
||||
const int &flags = weapon.get<ESM::Weapon>()->mBase->mData.mFlags;
|
||||
bool isSilver = flags & ESM::Weapon::Silver;
|
||||
|
||||
if (isSilver && actor.getClass().isNpc() && actor.getClass().getNpcStats(actor).isWerewolf())
|
||||
damage *= MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>().find("fWereWolfSilverWeaponDamageMult")->mValue.getFloat();
|
||||
}
|
||||
|
||||
void projectileHit(const MWWorld::Ptr& attacker, const MWWorld::Ptr& victim, MWWorld::Ptr weapon, const MWWorld::Ptr& projectile,
|
||||
const osg::Vec3f& hitPosition, float attackStrength)
|
||||
{
|
||||
@ -219,6 +224,7 @@ namespace MWMechanics
|
||||
|
||||
adjustWeaponDamage(damage, weapon, attacker);
|
||||
bool resisted = resistNormalWeapon(victim, attacker, projectile, damage);
|
||||
applyWerewolfDamageMult(victim, projectile, damage);
|
||||
|
||||
if (attacker == getPlayer())
|
||||
{
|
||||
|
@ -18,6 +18,8 @@ bool isNormalWeapon (const MWWorld::Ptr& weapon);
|
||||
/// @return was the damage fully resisted?
|
||||
bool resistNormalWeapon (const MWWorld::Ptr& actor, const MWWorld::Ptr& attacker, const MWWorld::Ptr& weapon, float& damage);
|
||||
|
||||
void applyWerewolfDamageMult (const MWWorld::Ptr& actor, const MWWorld::Ptr& weapon, float &damage);
|
||||
|
||||
/// @note for a thrown weapon, \a weapon == \a projectile, for bows/crossbows, \a projectile is the arrow/bolt
|
||||
/// @note \a victim may be empty (e.g. for a hit on terrain), a non-actor (environment objects) or an actor
|
||||
void projectileHit (const MWWorld::Ptr& attacker, const MWWorld::Ptr& victim, MWWorld::Ptr weapon, const MWWorld::Ptr& projectile,
|
||||
|
@ -78,7 +78,10 @@ namespace MWMechanics
|
||||
adjustWeaponDamage(rating, item, actor);
|
||||
|
||||
if (weapon->mData.mType != ESM::Weapon::MarksmanBow && weapon->mData.mType != ESM::Weapon::MarksmanCrossbow)
|
||||
{
|
||||
resistNormalWeapon(enemy, actor, item, rating);
|
||||
applyWerewolfDamageMult(enemy, item, rating);
|
||||
}
|
||||
else if (weapon->mData.mType == ESM::Weapon::MarksmanBow)
|
||||
{
|
||||
if (arrowRating <= 0.f)
|
||||
|
Loading…
x
Reference in New Issue
Block a user