summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog14
-rw-r--r--src/engine.cpp15
-rw-r--r--src/main.cpp3
-rw-r--r--src/monster.cpp4
-rw-r--r--src/resources/equipmentinfo.h2
-rw-r--r--src/resources/monsterdb.cpp151
-rw-r--r--src/resources/monsterdb.h45
-rw-r--r--src/resources/monsterinfo.cpp68
-rw-r--r--src/resources/monsterinfo.h74
9 files changed, 371 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 548c5ead..390456a0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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