forked from teamnwah/openmw-tes3coop
Apply drowning damage based on the update duration
1 damage every 0.33 seconds is 3 damage a second. Applying it this way avoid having to track another stat.
This commit is contained in:
parent
f216b25be8
commit
189541aa72
2 changed files with 27 additions and 35 deletions
|
@ -11,10 +11,12 @@
|
|||
|
||||
#include "../mwworld/class.hpp"
|
||||
#include "../mwworld/inventorystore.hpp"
|
||||
#include "../mwworld/player.hpp"
|
||||
|
||||
#include "../mwbase/world.hpp"
|
||||
#include "../mwbase/environment.hpp"
|
||||
#include "../mwbase/windowmanager.hpp"
|
||||
#include "../mwbase/soundmanager.hpp"
|
||||
|
||||
#include "npcstats.hpp"
|
||||
#include "creaturestats.hpp"
|
||||
|
@ -162,33 +164,37 @@ namespace MWMechanics
|
|||
|
||||
void Actors::updateDrowning(const MWWorld::Ptr& ptr, float duration)
|
||||
{
|
||||
NpcStats &stats = MWWorld::Class::get(ptr).getNpcStats(ptr);
|
||||
if(MWBase::Environment::get().getWorld()->isSubmerged(ptr) &&
|
||||
MWBase::World *world = MWBase::Environment::get().getWorld();
|
||||
NpcStats &stats = ptr.getClass().getNpcStats(ptr);
|
||||
if(world->isSubmerged(ptr) &&
|
||||
stats.getMagicEffects().get(ESM::MagicEffect::WaterBreathing).mMagnitude == 0)
|
||||
{
|
||||
float timeLeft = 0.0f;
|
||||
if(stats.getFatigue().getCurrent() == 0)
|
||||
stats.setTimeToStartDrowning(0);
|
||||
|
||||
float timeLeft = stats.getTimeToStartDrowning()-duration;
|
||||
if(timeLeft < 0.0f)
|
||||
timeLeft = 0.0f;
|
||||
|
||||
stats.setTimeToStartDrowning(timeLeft);
|
||||
else
|
||||
{
|
||||
timeLeft = stats.getTimeToStartDrowning() - duration;
|
||||
if(timeLeft < 0.0f)
|
||||
timeLeft = 0.0f;
|
||||
stats.setTimeToStartDrowning(timeLeft);
|
||||
}
|
||||
if(timeLeft == 0.0f)
|
||||
stats.setLastDrowningHitTime(stats.getLastDrowningHitTime()+duration);
|
||||
{
|
||||
// If drowning, apply 3 points of damage per second
|
||||
ptr.getClass().setActorHealth(ptr, stats.getHealth().getCurrent() - 3.0f*duration);
|
||||
|
||||
// Play a drowning sound as necessary for the player
|
||||
if(ptr == world->getPlayer().getPlayer())
|
||||
{
|
||||
MWBase::SoundManager *sndmgr = MWBase::Environment::get().getSoundManager();
|
||||
if(!sndmgr->getSoundPlaying(MWWorld::Ptr(), "drown"))
|
||||
sndmgr->playSound("drown", 1.0f, 1.0f);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
stats.setTimeToStartDrowning(20);
|
||||
stats.setLastDrowningHitTime(0);
|
||||
}
|
||||
//if npc is drowning and it's time to hit, then hit
|
||||
while(stats.getTimeToStartDrowning() == 0.0f && stats.getLastDrowningHitTime() > 0.33f)
|
||||
{
|
||||
stats.setLastDrowningHitTime(stats.getLastDrowningHitTime()-0.33f);
|
||||
//fixme: replace it with something different once screen hit effects are implemented (blood on screen)
|
||||
MWWorld::Class::get(ptr).setActorHealth(ptr, stats.getHealth().getCurrent()-1.0f);
|
||||
}
|
||||
}
|
||||
|
||||
Actors::Actors() : mDuration (0) {}
|
||||
|
|
|
@ -8,7 +8,6 @@
|
|||
#include "../mwbase/world.hpp"
|
||||
#include "../mwbase/windowmanager.hpp"
|
||||
#include "../mwbase/dialoguemanager.hpp"
|
||||
#include "../mwbase/soundmanager.hpp"
|
||||
|
||||
#include "../mwworld/class.hpp"
|
||||
#include "../mwworld/player.hpp"
|
||||
|
@ -288,23 +287,10 @@ namespace MWMechanics
|
|||
MWBase::Environment::get().getWindowManager()->setValue ("level", stats.getLevel());
|
||||
}
|
||||
|
||||
//update drowning sound
|
||||
MWBase::World *world = MWBase::Environment::get().getWorld();
|
||||
MWBase::SoundManager * sndmgr = MWBase::Environment::get().getSoundManager();
|
||||
MWWorld::Ptr playerPtr = world->getPlayer().getPlayer();
|
||||
NpcStats& playerStats = MWWorld::Class::get(playerPtr).getNpcStats(playerPtr);
|
||||
if(!sndmgr->getSoundPlaying(MWWorld::Ptr(), "drown") && playerStats.getTimeToStartDrowning()==0.0)
|
||||
{
|
||||
sndmgr->playSound("drown",1.0,1.0,MWBase::SoundManager::Play_TypeSfx,MWBase::SoundManager::Play_Loop);
|
||||
}
|
||||
if(playerStats.getTimeToStartDrowning()>0.0)
|
||||
{
|
||||
//no need to check if it's playing, stop sound does nothing in that case
|
||||
sndmgr->stopSound("drown");
|
||||
}
|
||||
|
||||
if (mUpdatePlayer)
|
||||
{
|
||||
MWBase::World *world = MWBase::Environment::get().getWorld();
|
||||
|
||||
// basic player profile; should not change anymore after the creation phase is finished.
|
||||
MWBase::WindowManager *winMgr =
|
||||
MWBase::Environment::get().getWindowManager();
|
||||
|
|
Loading…
Reference in a new issue