summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--src/being.cpp3
-rw-r--r--src/monster.cpp14
-rw-r--r--src/resources/monsterdb.cpp6
-rw-r--r--src/resources/monsterinfo.cpp5
-rw-r--r--src/resources/monsterinfo.h8
6 files changed, 39 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index eedb63dd..75603284 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,11 @@
2007-12-28 Philipp Sehmisch <tmw@crushnet.org>
* data/maps/new_3-1.tmx: Some mapping errors fixed by Zipon.
+ * src/being.cpp, src/monster.cpp, src/resources/monsterinfo.cpp,
+ src/resources/monsterinfo.h: Added the possibility to assign particle
+ effects to monsters in the monster database.
+ * data/monsters.xml: Added flame particle effect to fire goblin as a
+ proof of concept.
2007-12-26 Bjørn Lindeijer <bjorn@lindeijer.nl>
diff --git a/src/being.cpp b/src/being.cpp
index b068270b..ad60dc2f 100644
--- a/src/being.cpp
+++ b/src/being.cpp
@@ -83,7 +83,6 @@ Being::~Being()
{
std::for_each(mSprites.begin(), mSprites.end(), make_dtor(mSprites));
clearPath();
- setMap(NULL);
for ( std::list<Particle *>::iterator i = mChildParticleEffects.begin();
i != mChildParticleEffects.end();
@@ -92,6 +91,8 @@ Being::~Being()
(*i)->kill();
}
+ setMap(NULL);
+
instances--;
if (instances == 0)
diff --git a/src/monster.cpp b/src/monster.cpp
index 779b4f56..e2a07e86 100644
--- a/src/monster.cpp
+++ b/src/monster.cpp
@@ -26,6 +26,7 @@
#include "animatedsprite.h"
#include "game.h"
#include "sound.h"
+#include "particle.h"
#include "resources/monsterdb.h"
@@ -35,7 +36,9 @@
Monster::Monster(Uint32 id, Uint16 job, Map *map):
Being(id, job, map)
{
- std::string filename = MonsterDB::get(job - 1002).getSprite();
+ const MonsterInfo& info = MonsterDB::get(job - 1002);
+
+ std::string filename = info.getSprite();
if (filename != "")
{
mSprites[BASE_SPRITE] = AnimatedSprite::load(
@@ -45,6 +48,15 @@ Monster::Monster(Uint32 id, Uint16 job, Map *map):
{
mSprites[BASE_SPRITE] = AnimatedSprite::load("graphics/sprites/error.xml");
}
+
+ const std::list<std::string> &particleEffects = info.getParticleEffects();
+ for ( std::list<std::string>::const_iterator i = particleEffects.begin();
+ i != particleEffects.end();
+ i++
+ )
+ {
+ controlParticle(particleEngine->addEffect((*i), 0, 0));
+ }
}
void
diff --git a/src/resources/monsterdb.cpp b/src/resources/monsterdb.cpp
index 84e3a219..e007eda0 100644
--- a/src/resources/monsterdb.cpp
+++ b/src/resources/monsterdb.cpp
@@ -142,6 +142,12 @@ MonsterDB::load()
filename, event.c_str(), currentInfo->getName().c_str());
}
}
+
+ if (xmlStrEqual(spriteNode->name, BAD_CAST "particlefx"))
+ {
+ currentInfo->addParticleEffect(
+ (const char*) spriteNode->xmlChildrenNode->content);
+ }
}
mMonsterInfos[XML::getProperty(monsterNode, "id", 0)] = currentInfo;
}
diff --git a/src/resources/monsterinfo.cpp b/src/resources/monsterinfo.cpp
index c4c9ce10..8238dc3e 100644
--- a/src/resources/monsterinfo.cpp
+++ b/src/resources/monsterinfo.cpp
@@ -70,3 +70,8 @@ MonsterInfo::getSound(MonsterSoundEvent event) const
return i->second->at(rand()%i->second->size());
}
}
+
+void MonsterInfo::addParticleEffect(std::string filename)
+{
+ mParticleEffects.push_back(filename);
+}
diff --git a/src/resources/monsterinfo.h b/src/resources/monsterinfo.h
index 7d49db1a..d9d17510 100644
--- a/src/resources/monsterinfo.h
+++ b/src/resources/monsterinfo.h
@@ -27,6 +27,7 @@
#include <map>
#include <string>
#include <vector>
+#include <list>
#include "../being.h"
@@ -71,6 +72,9 @@ class MonsterInfo
void
addSound(MonsterSoundEvent event, std::string filename);
+ void
+ addParticleEffect(std::string filename);
+
const std::string&
getName() const { return mName; }
@@ -83,11 +87,15 @@ class MonsterInfo
std::string
getSound(MonsterSoundEvent event) const;
+ const std::list<std::string>&
+ getParticleEffects() const { return mParticleEffects; }
+
private:
std::string mName;
std::string mSprite;
Being::TargetCursorSize mTargetCursorSize;
std::map<MonsterSoundEvent, std::vector<std::string>* > mSounds;
+ std::list<std::string> mParticleEffects;
};
#endif