diff options
-rw-r--r-- | src/animatedsprite.cpp | 4 | ||||
-rw-r--r-- | src/animatedsprite.h | 4 | ||||
-rw-r--r-- | src/being.cpp | 38 | ||||
-rw-r--r-- | src/being.h | 4 | ||||
-rw-r--r-- | src/effectmanager.cpp | 38 |
5 files changed, 67 insertions, 21 deletions
diff --git a/src/animatedsprite.cpp b/src/animatedsprite.cpp index 0842186fc..d60107b15 100644 --- a/src/animatedsprite.cpp +++ b/src/animatedsprite.cpp @@ -46,7 +46,8 @@ AnimatedSprite::AnimatedSprite(SpriteDef *const sprite): mFrame(nullptr), mNumber(100), mNumber1(100), - mDelayLoad(nullptr) + mDelayLoad(nullptr), + mTerminated(false) { mAlpha = 1.0f; @@ -174,6 +175,7 @@ bool AnimatedSprite::update(const int time) { // Animation finished, reset to default play(SpriteAction::STAND); + mTerminated = true; } // Make sure something actually changed diff --git a/src/animatedsprite.h b/src/animatedsprite.h index 054fcdb68..2d8a55f26 100644 --- a/src/animatedsprite.h +++ b/src/animatedsprite.h @@ -101,6 +101,9 @@ class AnimatedSprite final : public Sprite void setSprite(SpriteDef *const sprite) { mSprite = sprite; } + bool isTerminated() const + { return mTerminated; } + static void setEnableCache(const bool b) { mEnableCache = b; } @@ -122,6 +125,7 @@ class AnimatedSprite final : public Sprite unsigned mNumber; unsigned mNumber1; AnimationDelayLoad *mDelayLoad; + bool mTerminated; static bool mEnableCache; }; diff --git a/src/being.cpp b/src/being.cpp index 4e26e84a6..4243c5a6f 100644 --- a/src/being.cpp +++ b/src/being.cpp @@ -205,6 +205,7 @@ Being::Being(const int id, const Type type, const uint16_t subtype, mEmotionSprite(nullptr), mEmotionTime(0), mSpeechTime(0), + mAnimationEffect(nullptr), mAttackSpeed(350), mAction(STAND), mSubType(0xFFFF), @@ -295,6 +296,9 @@ Being::~Being() mDispName = nullptr; delete mText; mText = nullptr; + + delete mAnimationEffect; + mAnimationEffect = nullptr; } void Being::setSubtype(const uint16_t subtype) @@ -1200,6 +1204,8 @@ void Being::setAction(const Action &action, const int attackId) play(currentAction); if (mEmotionSprite) mEmotionSprite->play(currentAction); + if (mAnimationEffect) + mAnimationEffect->play(currentAction); mAction = action; } @@ -1253,6 +1259,8 @@ void Being::setDirection(const uint8_t direction) CompoundSprite::setSpriteDirection(dir); if (mEmotionSprite) mEmotionSprite->setSpriteDirection(dir); + if (mAnimationEffect) + mAnimationEffect->setSpriteDirection(dir); recalcSpritesOrder(); } @@ -1325,8 +1333,19 @@ void Being::logic() mText = nullptr; } + const int time = tick_time * MILLISECONDS_IN_A_TICK; if (mEmotionSprite) - mEmotionSprite->update(tick_time * MILLISECONDS_IN_A_TICK); + mEmotionSprite->update(time); + + if (mAnimationEffect) + { + mAnimationEffect->update(time); + if (mAnimationEffect->isTerminated()) + { + delete mAnimationEffect; + mAnimationEffect = nullptr; + } + } int frameCount = static_cast<int>(getFrameCount()); #ifdef MANASERV_SUPPORT @@ -1495,12 +1514,12 @@ void Being::logic() void Being::drawEmotion(Graphics *const graphics, const int offsetX, const int offsetY) { - if (!mEmotionSprite) - return; - const int px = getPixelX() - offsetX - 16; const int py = getPixelY() - offsetY - 64 - 32; - mEmotionSprite->draw(graphics, px, py); + if (mEmotionSprite) + mEmotionSprite->draw(graphics, px, py); + if (mAnimationEffect) + mAnimationEffect->draw(graphics, px, py); } void Being::drawSpeech(const int offsetX, const int offsetY) @@ -2821,6 +2840,8 @@ void Being::removeSpecialEffect() mChildParticleEffects.removeLocally(mSpecialParticle); mSpecialParticle = nullptr; } + delete mAnimationEffect; + mAnimationEffect = nullptr; } void Being::updateAwayEffect() @@ -2831,6 +2852,13 @@ void Being::updateAwayEffect() removeAfkEffect(); } +void Being::addEffect(const std::string &name) +{ + delete mAnimationEffect; + mAnimationEffect = AnimatedSprite::load( + paths.getStringValue("sprites") + name); +} + BeingEquipBackend::BeingEquipBackend(Being *const being): mBeing(being) { diff --git a/src/being.h b/src/being.h index 88fcae859..7c8fcb173 100644 --- a/src/being.h +++ b/src/being.h @@ -861,6 +861,8 @@ class Being : public ActorSprite, public ConfigListener void removeSpecialEffect(); + void addEffect(const std::string &name); + static uint8_t genderToInt(const Gender sex) A_WARN_UNUSED; static Gender intToGender(uint8_t sex) A_WARN_UNUSED; @@ -890,6 +892,8 @@ class Being : public ActorSprite, public ConfigListener /** Time until the last speech sentence disappears */ int mSpeechTime; + AnimatedSprite* mAnimationEffect; + int mAttackSpeed; /**< Attack speed */ Action mAction; /**< Action the being is performing */ diff --git a/src/effectmanager.cpp b/src/effectmanager.cpp index f7e1ccbaa..ac4f80afc 100644 --- a/src/effectmanager.cpp +++ b/src/effectmanager.cpp @@ -70,17 +70,20 @@ bool EffectManager::trigger(const int id, Being *const being, bool rValue = false; FOR_EACH (std::vector<EffectDescription>::const_iterator, i, mEffects) { - if ((*i).id == id) + const EffectDescription &effect = *i; + if (effect.id == id) { rValue = true; - if (!(*i).gfx.empty()) + if (!effect.gfx.empty()) { Particle *const selfFX = particleEngine->addEffect( - (*i).gfx, 0, 0, rotation); + effect.gfx, 0, 0, rotation); being->controlParticle(selfFX); } - if (!(*i).sfx.empty()) - soundManager.playSfx((*i).sfx); + if (!effect.sfx.empty()) + soundManager.playSfx(effect.sfx); + if (!effect.sprite.empty()) + being->addEffect(effect.sprite); break; } } @@ -96,16 +99,19 @@ Particle *EffectManager::triggerReturn(const int id, Being *const being, Particle *rValue = nullptr; FOR_EACH (std::vector<EffectDescription>::const_iterator, i, mEffects) { - if ((*i).id == id) + const EffectDescription &effect = *i; + if (effect.id == id) { - if (!(*i).gfx.empty()) + if (!effect.gfx.empty()) { rValue = particleEngine->addEffect( - (*i).gfx, 0, 0, rotation); + effect.gfx, 0, 0, rotation); being->controlParticle(rValue); } - if (!(*i).sfx.empty()) - soundManager.playSfx((*i).sfx); + if (!effect.sfx.empty()) + soundManager.playSfx(effect.sfx); + if (!effect.sprite.empty()) + being->addEffect(effect.sprite); break; } } @@ -121,13 +127,15 @@ bool EffectManager::trigger(const int id, const int x, const int y, bool rValue = false; FOR_EACH (std::vector<EffectDescription>::const_iterator, i, mEffects) { - if ((*i).id == id) + const EffectDescription &effect = *i; + if (effect.id == id) { rValue = true; - if (!(*i).gfx.empty() && particleEngine) - particleEngine->addEffect((*i).gfx, x, y, rotation); - if (!(*i).sfx.empty()) - soundManager.playSfx((*i).sfx); + if (!effect.gfx.empty() && particleEngine) + particleEngine->addEffect(effect.gfx, x, y, rotation); + if (!effect.sfx.empty()) + soundManager.playSfx(effect.sfx); + // TODO add sprite effect to position break; } } |