From a4d2f2c0373848fa8a886c1dddc6247b81527df3 Mon Sep 17 00:00:00 2001 From: Ira Rice Date: Mon, 13 Oct 2008 09:34:46 +0000 Subject: Added mob particle attack effects to mobs. Inspired by the TMW patch in their trunk client. --- src/monster.cpp | 21 +++++++++++++++++++++ src/particle.cpp | 4 ++-- src/particle.h | 4 ++-- src/particleemitter.cpp | 4 +++- src/particleemitter.h | 2 +- src/resources/monsterdb.cpp | 6 ++++++ src/resources/monsterinfo.h | 8 ++++++++ 7 files changed, 43 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/monster.cpp b/src/monster.cpp index 2b6fadce..61f1f5c3 100644 --- a/src/monster.cpp +++ b/src/monster.cpp @@ -46,6 +46,7 @@ Monster::Monster(Uint32 id, Uint16 job, Map *map): // Setup Monster sprites int c = BASE_SPRITE; + const std::list &sprites = info.getSprites(); for (std::list::const_iterator i = sprites.begin(); i != sprites.end(); @@ -103,6 +104,8 @@ Being::Type Monster::getType() const void Monster::setAction(Action action) { SpriteAction currentAction = ACTION_INVALID; + int rotation = 0; + std::string particleEffect; switch (action) { @@ -116,6 +119,24 @@ void Monster::setAction(Action action) case ATTACK: currentAction = ACTION_ATTACK; mSprites[BASE_SPRITE]->reset(); + + //attack particle effect + particleEffect = getInfo().getAttackParticleEffect(); + if (particleEffect != "") + { + switch (mDirection) + { + case DOWN: rotation = 0; break; + case LEFT: rotation = 90; break; + case UP: rotation = 180; break; + case RIGHT: rotation = 270; break; + default: break; + } + Particle *p; + p = particleEngine->addEffect( + particleEffect, 0, 0, rotation); + controlParticle(p); + } break; case STAND: currentAction = ACTION_STAND; diff --git a/src/particle.cpp b/src/particle.cpp index 8591838f..703b34c3 100644 --- a/src/particle.cpp +++ b/src/particle.cpp @@ -226,7 +226,7 @@ Particle::update() Particle* Particle::addEffect(const std::string &particleEffectFile, - int pixelX, int pixelY) + int pixelX, int pixelY, int rotation) { Particle *newParticle = NULL; @@ -290,7 +290,7 @@ Particle::addEffect(const std::string &particleEffectFile, continue; ParticleEmitter *newEmitter; - newEmitter = new ParticleEmitter(emitterNode, newParticle, mMap); + newEmitter = new ParticleEmitter(emitterNode, newParticle, mMap, rotation); newParticle->addEmitter(newEmitter); } diff --git a/src/particle.h b/src/particle.h index f281864d..a21fe88b 100644 --- a/src/particle.h +++ b/src/particle.h @@ -109,7 +109,7 @@ class Particle : public Sprite */ Particle* addEffect(const std::string &particleEffectFile, - int pixelX, int pixelY); + int pixelX, int pixelY, int rotation = 0); /** * Creates a standalone text particle. @@ -318,7 +318,7 @@ class Particle : public Sprite // follow-point particles Particle *mTarget; /**< The particle that attracts this particle*/ - float mAcceleration; /**< Acceleration towards the target particle in pixels per game-tick²*/ + float mAcceleration; /**< Acceleration towards the target particle in pixels per game-tick�*/ float mInvDieDistance; /**< Distance in pixels from the target particle that causes the destruction of the particle*/ float mMomentum; /**< How much speed the particle retains after each game tick*/ }; diff --git a/src/particleemitter.cpp b/src/particleemitter.cpp index 816a5d28..08944cdd 100644 --- a/src/particleemitter.cpp +++ b/src/particleemitter.cpp @@ -38,7 +38,7 @@ #define SIN45 0.707106781f #define DEG_RAD_FACTOR 0.017453293f -ParticleEmitter::ParticleEmitter(xmlNodePtr emitterNode, Particle *target, Map *map): +ParticleEmitter::ParticleEmitter(xmlNodePtr emitterNode, Particle *target, Map *map, int rotation): mOutputPauseLeft(0), mParticleImage(0) { @@ -102,7 +102,9 @@ ParticleEmitter::ParticleEmitter(xmlNodePtr emitterNode, Particle *target, Map * else if (name == "horizontal-angle") { mParticleAngleHorizontal = readMinMax(propertyNode, 0.0f); + mParticleAngleHorizontal.minVal += rotation; mParticleAngleHorizontal.minVal *= DEG_RAD_FACTOR; + mParticleAngleHorizontal.maxVal += rotation; mParticleAngleHorizontal.maxVal *= DEG_RAD_FACTOR; } else if (name == "vertical-angle") diff --git a/src/particleemitter.h b/src/particleemitter.h index 5cf3fd46..c237c1ba 100644 --- a/src/particleemitter.h +++ b/src/particleemitter.h @@ -45,7 +45,7 @@ class ParticleEmitter /** * Constructor. */ - ParticleEmitter(xmlNodePtr emitterNode, Particle *target, Map *map); + ParticleEmitter(xmlNodePtr emitterNode, Particle *target, Map *map, int rotation = 0); /** * Copy Constructor (necessary for reference counting of particle images) diff --git a/src/resources/monsterdb.cpp b/src/resources/monsterdb.cpp index 73e9d666..8d8dd133 100644 --- a/src/resources/monsterdb.cpp +++ b/src/resources/monsterdb.cpp @@ -126,6 +126,12 @@ MonsterDB::load() } } + if (xmlStrEqual(spriteNode->name, BAD_CAST "attack")) + { + std::string event = XML::getProperty(spriteNode, "particle-effect", ""); + currentInfo->addAttackParticleEffect(event); + } + if (xmlStrEqual(spriteNode->name, BAD_CAST "particlefx")) { currentInfo->addParticleEffect( diff --git a/src/resources/monsterinfo.h b/src/resources/monsterinfo.h index 2f690756..c5345bd8 100644 --- a/src/resources/monsterinfo.h +++ b/src/resources/monsterinfo.h @@ -87,11 +87,19 @@ class MonsterInfo std::string getSound(MonsterSoundEvent event) const; + std::string + getAttackParticleEffect() const { return mAttackParticle; } + + void + addAttackParticleEffect(const std::string &particleEffect) + { mAttackParticle = particleEffect; } + const std::list& getParticleEffects() const { return mParticleEffects; } private: std::string mName; + std::string mAttackParticle; std::list mSprites; Being::TargetCursorSize mTargetCursorSize; std::map* > mSounds; -- cgit v1.2.3-70-g09d2