/* * The Mana Client * Copyright (C) 2006-2009 The Mana World Development Team * Copyright (C) 2009-2012 The Mana Developers * * This file is part of The Mana Client. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef PARTICLEEMITTER_H #define PARTICLEEMITTER_H #include "particleemitterprop.h" #include "resources/animation.h" #include "resources/resource.h" #include "utils/xml.h" #include class Image; class Map; class Particle; /** * Every Particle can have one or more particle emitters that create new * particles when they are updated */ class ParticleEmitter { public: ParticleEmitter(xmlNodePtr emitterNode, Particle *target, Map *map, int rotation = 0, const std::string& dyePalettes = std::string()); /** * Copy Constructor (necessary for reference counting of particle images) */ ParticleEmitter(const ParticleEmitter &o); /** * Assignment operator that calls the copy constructor */ ParticleEmitter & operator=(const ParticleEmitter &o); ~ParticleEmitter(); /** * Spawns new particles * @return: a list of created particles */ std::list createParticles(int tick); /** * Sets the target of the particles that are created */ void setTarget(Particle *target) { mParticleTarget = target; }; /** * Changes the size of the emitter so that the effect fills a * rectangle of this size */ void adjustSize(int w, int h); private: template ParticleEmitterProp readParticleEmitterProp(xmlNodePtr propertyNode, T def); /** * initial position of particles: */ ParticleEmitterProp mParticlePosX, mParticlePosY, mParticlePosZ; /** * initial vector of particles: */ ParticleEmitterProp mParticleAngleHorizontal, mParticleAngleVertical; /** * Initial velocity of particles */ ParticleEmitterProp mParticlePower; /* * Vector changing of particles: */ ParticleEmitterProp mParticleGravity; ParticleEmitterProp mParticleRandomness; ParticleEmitterProp mParticleBounce; bool mParticleFollow; /* * Properties of targeting particles: */ Particle *mParticleTarget; ParticleEmitterProp mParticleAcceleration; ParticleEmitterProp mParticleDieDistance; ParticleEmitterProp mParticleMomentum; /* * Behavior over time of the particles: */ ParticleEmitterProp mParticleLifetime; ParticleEmitterProp mParticleFadeOut; ParticleEmitterProp mParticleFadeIn; Map *mMap; /**< Map the particles are spawned on */ ParticleEmitterProp mOutput; /**< Number of particles spawned per update */ ParticleEmitterProp mOutputPause; /**< Pause in frames between two spawns */ int mOutputPauseLeft = 0; /* * Graphical representation of the particles */ ResourceRef mParticleImage; /**< Particle image, if used */ Animation mParticleAnimation; /**< Filename of particle animation file */ Animation mParticleRotation; /**< Filename of particle rotation file */ ParticleEmitterProp mParticleAlpha; /**< Opacity of the graphical representation of the particles */ /* * Death effect of the particles */ std::string mDeathEffect; char mDeathEffectConditions; /** List of emitters the spawned particles are equipped with */ std::list mParticleChildEmitters; }; #endif