From bb43ec9b35b3f45d55de492834b5d45f550890f5 Mon Sep 17 00:00:00 2001 From: scrawl Date: Sat, 16 Nov 2013 03:16:21 +0100 Subject: [PATCH] Implement damage tick effects --- apps/openmw/mwmechanics/activespells.cpp | 12 ++++++++---- apps/openmw/mwmechanics/actors.cpp | 18 ++++++++++++++++-- apps/openmw/mwmechanics/actors.hpp | 2 +- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/apps/openmw/mwmechanics/activespells.cpp b/apps/openmw/mwmechanics/activespells.cpp index 3a9321f398..89543476b0 100644 --- a/apps/openmw/mwmechanics/activespells.cpp +++ b/apps/openmw/mwmechanics/activespells.cpp @@ -269,6 +269,14 @@ namespace MWMechanics if (effectIt->mRange != range) continue; + const ESM::MagicEffect *magicEffect = + MWBase::Environment::get().getWorld()->getStore().get().find ( + effectIt->mEffectID); + + if (caster.getRefData().getHandle() == "player" && actor != caster + && magicEffect->mData.mFlags & ESM::MagicEffect::Harmful) + MWBase::Environment::get().getWindowManager()->setEnemy(actor); + // Try resisting effect in case its harmful const ESM::Spell *spell = MWBase::Environment::get().getWorld()->getStore().get().search (id); @@ -287,10 +295,6 @@ namespace MWMechanics // TODO: For Area effects, launch a growing particle effect that applies the effect to more actors as it hits them. Best managed in World. - const ESM::MagicEffect *magicEffect = - MWBase::Environment::get().getWorld()->getStore().get().find ( - effectIt->mEffectID); - // Only the sound of the first effect plays if (first) { diff --git a/apps/openmw/mwmechanics/actors.cpp b/apps/openmw/mwmechanics/actors.cpp index 3d52ce8e69..576c830da7 100644 --- a/apps/openmw/mwmechanics/actors.cpp +++ b/apps/openmw/mwmechanics/actors.cpp @@ -29,7 +29,7 @@ namespace MWMechanics // magic effects adjustMagicEffects (ptr); calculateDynamicStats (ptr); - calculateCreatureStatModifiers (ptr); + calculateCreatureStatModifiers (ptr, duration); if(!MWBase::Environment::get().getWindowManager()->isGuiMode()) { @@ -145,7 +145,7 @@ namespace MWMechanics stats.setFatigue (fatigue); } - void Actors::calculateCreatureStatModifiers (const MWWorld::Ptr& ptr) + void Actors::calculateCreatureStatModifiers (const MWWorld::Ptr& ptr, float duration) { CreatureStats &creatureStats = MWWorld::Class::get(ptr).getCreatureStats(ptr); const MagicEffects &effects = creatureStats.getMagicEffects(); @@ -167,10 +167,24 @@ namespace MWMechanics stat.setModifier(effects.get(EffectKey(ESM::MagicEffect::FortifyHealth+i)).mMagnitude - effects.get(EffectKey(ESM::MagicEffect::DrainHealth+i)).mMagnitude); + float damage = creatureStats.getMagicEffects().get(EffectKey(ESM::MagicEffect::DamageHealth)).mMagnitude; + stat.setCurrent(stat.getCurrent() - damage * duration); + creatureStats.setDynamic(i, stat); } + // Apply damage ticks + int damageEffects[] = { + ESM::MagicEffect::FireDamage, ESM::MagicEffect::ShockDamage, ESM::MagicEffect::FrostDamage, ESM::MagicEffect::Poison + }; + for (unsigned int i=0; i health = creatureStats.getHealth(); + health.setCurrent(health.getCurrent() - magnitude * duration); + creatureStats.setHealth(health); + } } void Actors::calculateNpcStatModifiers (const MWWorld::Ptr& ptr) diff --git a/apps/openmw/mwmechanics/actors.hpp b/apps/openmw/mwmechanics/actors.hpp index eeef22635c..251c38ec0e 100644 --- a/apps/openmw/mwmechanics/actors.hpp +++ b/apps/openmw/mwmechanics/actors.hpp @@ -40,7 +40,7 @@ namespace MWMechanics void calculateDynamicStats (const MWWorld::Ptr& ptr); - void calculateCreatureStatModifiers (const MWWorld::Ptr& ptr); + void calculateCreatureStatModifiers (const MWWorld::Ptr& ptr, float duration); void calculateNpcStatModifiers (const MWWorld::Ptr& ptr); void calculateRestoration (const MWWorld::Ptr& ptr, float duration);