From b7d3acab99fe4975d4598b6c9ac1ad88edfa8506 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Tue, 10 Nov 2015 20:37:02 +0300 Subject: Add support for casting status effect on ground. --- src/effectmanager.cpp | 71 ++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 65 insertions(+), 6 deletions(-) (limited to 'src/effectmanager.cpp') diff --git a/src/effectmanager.cpp b/src/effectmanager.cpp index e88dc0a74..3a76f3e6d 100644 --- a/src/effectmanager.cpp +++ b/src/effectmanager.cpp @@ -37,7 +37,8 @@ EffectManager *effectManager = nullptr; EffectManager::EffectManager() : - mEffects() + mEffects(), + mTimers() { logger->log1("Effects are now loading"); loadXmlFile(paths.getStringValue("effectsFile")); @@ -80,7 +81,8 @@ EffectManager::~EffectManager() { } -bool EffectManager::triggerDirection(const int id, Being *const being, +bool EffectManager::triggerDirection(const int id, + Being *const being, const SpriteDirection::Type &direction) { int rotation; @@ -110,7 +112,8 @@ bool EffectManager::triggerDirection(const int id, Being *const being, return trigger(id, being, rotation); } -bool EffectManager::trigger(const int id, Being *const being, +bool EffectManager::trigger(const int id, + Being *const being, const int rotation) { if (!being || !particleEngine) @@ -141,7 +144,8 @@ bool EffectManager::trigger(const int id, Being *const being, return rValue; } -Particle *EffectManager::triggerReturn(const int id, Being *const being, +Particle *EffectManager::triggerReturn(const int id, + Being *const being, const int rotation) { if (!being || !particleEngine) @@ -169,7 +173,9 @@ Particle *EffectManager::triggerReturn(const int id, Being *const being, return rValue; } -bool EffectManager::trigger(const int id, const int x, const int y, +bool EffectManager::trigger(const int id, + const int x, const int y, + const int endTime, const int rotation) { if (!particleEngine) @@ -183,7 +189,13 @@ bool EffectManager::trigger(const int id, const int x, const int y, { rValue = true; if (!effect.gfx.empty()) - particleEngine->addEffect(effect.gfx, x, y, rotation); + { + Particle *const particle = particleEngine->addEffect(effect.gfx, + x, y, + rotation); + if (particle) + mTimers.push_back(ParticleTimer(particle, endTime)); + } if (!effect.sfx.empty()) soundManager.playSfx(effect.sfx); // TODO add sprite effect to position @@ -203,3 +215,50 @@ void EffectManager::triggerDefault(int effectId, return; trigger(effectId, being); } + +void EffectManager::triggerDefault(int effectId, + const int x, + const int y, + const int endTime, + const int defaultEffectId) +{ + if (effectId == -1) + effectId = defaultEffectId; + if (effectId == -1) + return; + trigger(effectId, x, y, endTime); +} + +void EffectManager::logic() +{ + const int time = cur_time; + bool found(true); + while (found) + { + found = false; + FOR_EACH (std::list::iterator, it, mTimers) + { + const ParticleTimer &timer = *it; + if (timer.endTime < time) + { + found = true; + Particle *const particle = timer.particle; + if (particle) + particle->kill(); + mTimers.erase(it); + break; + } + } + } +} + +void EffectManager::clear() +{ + FOR_EACH (std::list::iterator, it, mTimers) + { + Particle *const particle = (*it).particle; + if (particle) + particle->kill(); + } + mTimers.clear(); +} -- cgit v1.2.3-60-g2f50