diff options
Diffstat (limited to 'src/particleemitter.cpp')
-rw-r--r-- | src/particleemitter.cpp | 49 |
1 files changed, 45 insertions, 4 deletions
diff --git a/src/particleemitter.cpp b/src/particleemitter.cpp index dc9931a5..bfeaa139 100644 --- a/src/particleemitter.cpp +++ b/src/particleemitter.cpp @@ -26,16 +26,20 @@ #include "particleemitter.h" #include "rotationalparticle.h" +#include "resources/dye.h" #include "resources/image.h" #include "resources/imageset.h" #include "resources/resourcemanager.h" +#include "map.h" #include <cmath> #define SIN45 0.707106781f #define DEG_RAD_FACTOR 0.017453293f -ParticleEmitter::ParticleEmitter(xmlNodePtr emitterNode, Particle *target, Map *map, int rotation): +ParticleEmitter::ParticleEmitter(xmlNodePtr emitterNode, Particle *target, + Map *map, int rotation, + const std::string& dyePalettes): mOutputPauseLeft(0), mParticleImage(0) { @@ -94,6 +98,9 @@ ParticleEmitter::ParticleEmitter(xmlNodePtr emitterNode, Particle *target, Map * // Don't leak when multiple images are defined if (!image.empty() && !mParticleImage) { + if (!dyePalettes.empty()) + Dye::instantiate(image, dyePalettes); + ResourceManager *resman = ResourceManager::getInstance(); mParticleImage = resman->getImage(image); } @@ -182,7 +189,8 @@ ParticleEmitter::ParticleEmitter(xmlNodePtr emitterNode, Particle *target, Map * } else if (xmlStrEqual(propertyNode->name, BAD_CAST "emitter")) { - ParticleEmitter newEmitter(propertyNode, mParticleTarget, map); + ParticleEmitter newEmitter(propertyNode, mParticleTarget, map, + rotation, dyePalettes); mParticleChildEmitters.push_back(newEmitter); } else if (xmlStrEqual(propertyNode->name, BAD_CAST "rotation")) @@ -199,8 +207,12 @@ ParticleEmitter::ParticleEmitter(xmlNodePtr emitterNode, Particle *target, Map * int delay = XML::getProperty(frameNode, "delay", 0); int offsetX = XML::getProperty(frameNode, "offsetX", 0); int offsetY = XML::getProperty(frameNode, "offsetY", 0); - offsetY -= imageset->getHeight() - 32; - offsetX -= imageset->getWidth() / 2 - 16; + if (mMap) + { + offsetX -= imageset->getWidth() / 2 + - mMap->getTileWidth() / 2; + offsetY -= imageset->getHeight() - mMap->getTileHeight(); + } if (xmlStrEqual(frameNode->name, BAD_CAST "frame")) { @@ -320,6 +332,30 @@ ParticleEmitter::ParticleEmitter(xmlNodePtr emitterNode, Particle *target, Map * mParticleAnimation.addTerminator(); } } // for frameNode + } else if (xmlStrEqual(propertyNode->name, BAD_CAST "deatheffect")) + { + mDeathEffect = (const char*)propertyNode->xmlChildrenNode->content; + mDeathEffectConditions = 0x00; + if (XML::getBoolProperty(propertyNode, "on-floor", true)) + { + mDeathEffectConditions += Particle::DEAD_FLOOR; + } + if (XML::getBoolProperty(propertyNode, "on-sky", true)) + { + mDeathEffectConditions += Particle::DEAD_SKY; + } + if (XML::getBoolProperty(propertyNode, "on-other", false)) + { + mDeathEffectConditions += Particle::DEAD_OTHER; + } + if (XML::getBoolProperty(propertyNode, "on-impact", true)) + { + mDeathEffectConditions += Particle::DEAD_IMPACT; + } + if (XML::getBoolProperty(propertyNode, "on-timeout", true)) + { + mDeathEffectConditions += Particle::DEAD_TIMEOUT; + } } } } @@ -469,6 +505,11 @@ std::list<Particle *> ParticleEmitter::createParticles(int tick) newParticle->addEmitter(new ParticleEmitter(*i)); } + if (!mDeathEffect.empty()) + { + newParticle->setDeathEffect(mDeathEffect, mDeathEffectConditions); + } + newParticles.push_back(newParticle); } |