diff options
author | Andrei Karas <akaras@inbox.ru> | 2015-11-10 20:37:02 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2015-11-10 20:37:02 +0300 |
commit | b7d3acab99fe4975d4598b6c9ac1ad88edfa8506 (patch) | |
tree | a488f015fd7acee7654dab610eb95e904ffaeaa5 /src/effectmanager.cpp | |
parent | 81184f3787f4b9208b7ac1aacb3489ca143c9ccd (diff) | |
download | manaplus-b7d3acab99fe4975d4598b6c9ac1ad88edfa8506.tar.gz manaplus-b7d3acab99fe4975d4598b6c9ac1ad88edfa8506.tar.bz2 manaplus-b7d3acab99fe4975d4598b6c9ac1ad88edfa8506.tar.xz manaplus-b7d3acab99fe4975d4598b6c9ac1ad88edfa8506.zip |
Add support for casting status effect on ground.
Diffstat (limited to 'src/effectmanager.cpp')
-rw-r--r-- | src/effectmanager.cpp | 71 |
1 files changed, 65 insertions, 6 deletions
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<ParticleTimer>::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<ParticleTimer>::iterator, it, mTimers) + { + Particle *const particle = (*it).particle; + if (particle) + particle->kill(); + } + mTimers.clear(); +} |