diff options
author | Philipp Sehmisch <tmw@crushnet.org> | 2006-11-29 21:17:16 +0000 |
---|---|---|
committer | Philipp Sehmisch <tmw@crushnet.org> | 2006-11-29 21:17:16 +0000 |
commit | 25df9c6c3b735fea87ded284665e866c39144705 (patch) | |
tree | c265eaa0560eb40b1a334b91c24fff7b9962b3d1 | |
parent | 34baa9637d2319f52b4e1b1f3294994557151113 (diff) | |
download | mana-client-25df9c6c3b735fea87ded284665e866c39144705.tar.gz mana-client-25df9c6c3b735fea87ded284665e866c39144705.tar.bz2 mana-client-25df9c6c3b735fea87ded284665e866c39144705.tar.xz mana-client-25df9c6c3b735fea87ded284665e866c39144705.zip |
Implemented MonsterDB namespace
-rw-r--r-- | ChangeLog | 14 | ||||
-rw-r--r-- | src/engine.cpp | 15 | ||||
-rw-r--r-- | src/main.cpp | 3 | ||||
-rw-r--r-- | src/monster.cpp | 4 | ||||
-rw-r--r-- | src/resources/equipmentinfo.h | 2 | ||||
-rw-r--r-- | src/resources/monsterdb.cpp | 151 | ||||
-rw-r--r-- | src/resources/monsterdb.h | 45 | ||||
-rw-r--r-- | src/resources/monsterinfo.cpp | 68 | ||||
-rw-r--r-- | src/resources/monsterinfo.h | 74 |
9 files changed, 371 insertions, 5 deletions
@@ -1,3 +1,17 @@ +2006-11-29 Philipp Sehmisch <tmw@crushnet.org> + + * src/resources/equipment.h: Made getSprite return a constant reference + * src/resources/monsterdb.cpp, src/resources/monsterdb.h, + src/resources/monsterinfo.cpp, src/resources/monsterinfo.h, + src/main.cpp: Added the MonsterDB namespace that reads the monsters.xml + and maps monster IDs to names, sprite definitions and sound effects. + * src/monster.cpp: Get sprite definition filenames from MonsterDB + * src/engine.cpp: Show monster name when targeting a monster + * data/monsters.xml, data/graphics/sprites/Makefile.AM, + data/graphics/sprites/CMakeLists.txt, data/graphics/sprites/monster*: + Renamed all monster sprites to more associative names + (whew, we got to train some monkeys for tasks like that) + 2006-11-27 Bjørn Lindeijer <bjorn@lindeijer.nl> * tmw.cbp: Updated Code::Blocks project file. diff --git a/src/engine.cpp b/src/engine.cpp index d0d37c67..a6177b30 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -46,6 +46,7 @@ #include "resources/mapreader.h" +#include "resources/monsterdb.h" #include "resources/resourcemanager.h" #include "resources/spriteset.h" @@ -281,10 +282,18 @@ void Engine::draw(Graphics *graphics) if ((target = player_node->getTarget())) { graphics->setFont(speechFont); - graphics->setColor(gcn::Color(255, 255, 255)); - int dy = (target->getType() == Being::PLAYER) ? 90 : 52; + graphics->setColor(gcn::Color(255, 32, 32)); + int dy = (target->getType() == Being::PLAYER) ? 80 : 42; - graphics->drawText("[TARGET]", target->getPixelX() - (int)view_x + 15, + std::string mobName = ""; + + if (target->mJob >= 1002 ) + { + int mobId = target->mJob - 1002; + mobName = MonsterDB::get(mobId).getName(); + } + + graphics->drawText(mobName, target->getPixelX() - (int)view_x + 15, target->getPixelY() - (int)view_y - dy, gcn::Graphics::CENTER); } diff --git a/src/main.cpp b/src/main.cpp index f1a4ed88..6f34e0b8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -74,6 +74,7 @@ #include "resources/equipmentdb.h" #include "resources/image.h" #include "resources/itemdb.h" +#include "resources/monsterdb.h" #include "resources/resourcemanager.h" #include "resources/spriteset.h" @@ -311,6 +312,7 @@ void init_engine(const Options &options) // Load XML databases EquipmentDB::load(); ItemDB::load(); + MonsterDB::load(); } /** Clear the engine */ @@ -336,6 +338,7 @@ void exit_engine() // Unload XML databases EquipmentDB::unload(); ItemDB::unload(); + MonsterDB::unload(); ResourceManager::deleteInstance(); delete logger; diff --git a/src/monster.cpp b/src/monster.cpp index 7fffd34e..e3d2b5a8 100644 --- a/src/monster.cpp +++ b/src/monster.cpp @@ -26,6 +26,8 @@ #include "animatedsprite.h" #include "game.h" +#include "resources/monsterdb.h" + #include "utils/tostring.h" @@ -33,7 +35,7 @@ Monster::Monster(Uint32 id, Uint16 job, Map *map): Being(id, job, map) { mSprites[BASE_SPRITE] = new AnimatedSprite( - "graphics/sprites/monster" + toString(job - 1002) + ".xml"); + "data/graphics/sprites/" + MonsterDB::get(job-1002).getSprite()); } void diff --git a/src/resources/equipmentinfo.h b/src/resources/equipmentinfo.h index bc3bdd8d..93a1cb42 100644 --- a/src/resources/equipmentinfo.h +++ b/src/resources/equipmentinfo.h @@ -38,7 +38,7 @@ class EquipmentInfo void
setSlot (int slot) { mSlot = slot; };
- std::string
+ const std::string&
getSprite(int gender) {return animationFiles[gender]; };
void
diff --git a/src/resources/monsterdb.cpp b/src/resources/monsterdb.cpp new file mode 100644 index 00000000..f61c2d39 --- /dev/null +++ b/src/resources/monsterdb.cpp @@ -0,0 +1,151 @@ +/*
+ * The Mana World
+ * Copyright 2004 The Mana World Development Team
+ *
+ * This file is part of The Mana World.
+ *
+ * The Mana World 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.
+ *
+ * The Mana World 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 The Mana World; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * $Id:
+ */
+
+#include "monsterdb.h"
+
+#include "resourcemanager.h"
+
+#include "../log.h"
+
+#include "../utils/dtor.h"
+#include "../utils/xml.h"
+
+namespace
+{
+ MonsterDB::MonsterInfos mMonsterInfos;
+ MonsterInfo mUnknown;
+}
+
+void
+MonsterDB::load()
+{
+ mUnknown.setSprite("error.xml");
+ mUnknown.setName("unnamed");
+
+ logger->log("Initializing monster database...");
+
+ ResourceManager *resman = ResourceManager::getInstance();
+ int size;
+ char *data = (char*)resman->loadFile("monsters.xml", size);
+
+ if (!data)
+ {
+ logger->error("Monster Database: Could not find monsters.xml!");
+ }
+
+ xmlDocPtr doc = xmlParseMemory(data, size);
+ free(data);
+
+ if (!doc)
+ {
+ logger->error("Monster Database: Error while parsing monster database (monsters.xml)!");
+ }
+
+ xmlNodePtr rootNode = xmlDocGetRootElement(doc);
+ if (!rootNode || !xmlStrEqual(rootNode->name, BAD_CAST "monsters"))
+ {
+ logger->error("Monster Database: monster.xml is not a valid database file!");
+ }
+
+ //iterate <monster>s
+ for ( xmlNodePtr monsterNode = rootNode->xmlChildrenNode;
+ monsterNode != NULL;
+ monsterNode = monsterNode->next)
+ {
+
+ if (!xmlStrEqual(monsterNode->name, BAD_CAST "monster"))
+ {
+ continue;
+ }
+
+ MonsterInfo *currentInfo = new MonsterInfo();
+
+ currentInfo->setName (XML::getProperty(monsterNode, "name", "unnamed"));
+
+ //iterate <sprite>s and <sound>s
+ for ( xmlNodePtr spriteNode = monsterNode->xmlChildrenNode;
+ spriteNode != NULL;
+ spriteNode = spriteNode->next)
+ {
+ if (xmlStrEqual(spriteNode->name, BAD_CAST "sprite"))
+ {
+ currentInfo->setSprite((const char*) spriteNode->xmlChildrenNode->content);
+ }
+
+ if (xmlStrEqual(spriteNode->name, BAD_CAST "sound"))
+ {
+ std::string event = XML::getProperty(spriteNode, "event", "");
+ const char *filename;
+ filename = (const char*) spriteNode->xmlChildrenNode->content;
+
+ if (event == "hit")
+ {
+ currentInfo->addSFX(EVENT_HIT, filename);
+ }
+ else if (event == "miss")
+ {
+ currentInfo->addSFX(EVENT_MISS, filename);
+ }
+ else if (event == "hurt")
+ {
+ currentInfo->addSFX(EVENT_HURT, filename);
+ }
+ else if (event == "die")
+ {
+ currentInfo->addSFX(EVENT_DIE, filename);
+ }
+ else
+ {
+ logger->log("MonsterDB: Warning, sound effect %s for unknown event %s of monster %s",
+ filename, event.c_str(), currentInfo->getName().c_str());
+ }
+ }
+ }
+ mMonsterInfos[XML::getProperty(monsterNode, "id", 0)] = currentInfo;
+ }
+}
+
+void
+MonsterDB::unload()
+{
+ for_each ( mMonsterInfos.begin(), mMonsterInfos.end(),
+ make_dtor(mMonsterInfos));
+ mMonsterInfos.clear();
+}
+
+
+const MonsterInfo&
+MonsterDB::get (int id)
+{
+ MonsterInfoIterator i = mMonsterInfos.find(id);
+
+ if (i == mMonsterInfos.end())
+ {
+ logger->log("MonsterDB: Warning, unknown monster ID %d requested", id);
+ return mUnknown;
+ }
+ else
+ {
+ return *(i->second);
+ }
+}
diff --git a/src/resources/monsterdb.h b/src/resources/monsterdb.h new file mode 100644 index 00000000..b105665a --- /dev/null +++ b/src/resources/monsterdb.h @@ -0,0 +1,45 @@ +/*
+ * The Mana World
+ * Copyright 2004 The Mana World Development Team
+ *
+ * This file is part of The Mana World.
+ *
+ * The Mana World 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.
+ *
+ * The Mana World 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 The Mana World; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * $Id:
+ */
+
+#ifndef _TMW_MONSTER_DB_H
+#define _TMW_MONSTER_DB_H
+
+#include <map>
+
+#include "monsterinfo.h"
+
+namespace MonsterDB
+{
+ void
+ load();
+
+ void
+ unload();
+
+ const MonsterInfo& get (int id);
+
+ typedef std::map<int, MonsterInfo*> MonsterInfos;
+ typedef MonsterInfos::iterator MonsterInfoIterator;
+}
+
+#endif
diff --git a/src/resources/monsterinfo.cpp b/src/resources/monsterinfo.cpp new file mode 100644 index 00000000..e60fb4e2 --- /dev/null +++ b/src/resources/monsterinfo.cpp @@ -0,0 +1,68 @@ +/*
+ * The Mana World
+ * Copyright 2004 The Mana World Development Team
+ *
+ * This file is part of The Mana World.
+ *
+ * The Mana World 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.
+ *
+ * The Mana World 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 The Mana World; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * $Id: monsterinfo.cpp 2650 2006-09-03 15:00:47Z b_lindeijer $
+ */
+
+#include "monsterinfo.h"
+
+#include "../utils/dtor.h"
+
+MonsterInfo::MonsterInfo():
+ mSprite("error.xml")
+{
+
+}
+
+MonsterInfo::~MonsterInfo()
+{
+ //kill vectors in mSoundEffects
+ for_each ( mSounds.begin(), mSounds.end(),
+ make_dtor(mSounds));
+ mSounds.clear();
+}
+
+
+void
+MonsterInfo::addSFX (SoundEvent event, std::string filename)
+{
+ if (mSounds.find(event) == mSounds.end())
+ {
+ mSounds[event] = new std::vector<std::string>;
+ }
+
+ mSounds[event]->push_back(filename);
+}
+
+
+std::string
+MonsterInfo::getSFX (SoundEvent event)
+{
+ std::map<SoundEvent, std::vector<std::string>* >::iterator i = mSounds.find(event);
+
+ if (i == mSounds.end())
+ {
+ return "";
+ }
+ else
+ {
+ return i->second->at(rand()%i->second->size());
+ }
+}
diff --git a/src/resources/monsterinfo.h b/src/resources/monsterinfo.h new file mode 100644 index 00000000..8129338a --- /dev/null +++ b/src/resources/monsterinfo.h @@ -0,0 +1,74 @@ +/*
+ * The Mana World
+ * Copyright 2004 The Mana World Development Team
+ *
+ * This file is part of The Mana World.
+ *
+ * The Mana World 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.
+ *
+ * The Mana World 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 The Mana World; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * $Id: monsterinfo.h 2650 2006-09-03 15:00:47Z b_lindeijer $
+ */
+
+#ifndef _TMW_MONSTERINFO_H_
+#define _TMW_MONSTERINFO_H_
+
+#include <map>
+#include <string>
+#include <vector>
+
+
+enum SoundEvent
+{
+ EVENT_HIT,
+ EVENT_MISS,
+ EVENT_HURT,
+ EVENT_DIE
+};
+
+
+class MonsterInfo
+{
+ public:
+ MonsterInfo();
+
+ ~MonsterInfo();
+
+ void
+ setName(std::string name) { mName = name; } ;
+
+ void
+ setSprite(std::string filename) { mSprite = filename; }
+
+ void
+ addSFX (SoundEvent event, std::string filename);
+
+ const std::string&
+ getName () const { return mName; };
+
+ const std::string&
+ getSprite () const { return mSprite; };
+
+ std::string
+ getSFX (SoundEvent event);
+
+ private:
+
+ std::string mName;
+ std::string mSprite;
+
+ std::map<SoundEvent, std::vector<std::string>* > mSounds;
+};
+
+#endif
|