summaryrefslogtreecommitdiff
path: root/src/particleemitter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/particleemitter.cpp')
-rw-r--r--src/particleemitter.cpp49
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);
}