00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "resources/npcdb.h"
00023
00024 #include "log.h"
00025
00026 #include "utils/gettext.h"
00027 #include "utils/xml.h"
00028
00029 namespace
00030 {
00031 NPCInfos mNPCInfos;
00032 NPCInfo mUnknown;
00033 bool mLoaded = false;
00034 }
00035
00036 void NPCDB::load()
00037 {
00038 if (mLoaded)
00039 return;
00040
00041 NPCsprite *unknownSprite = new NPCsprite;
00042 unknownSprite->sprite = "error.xml";
00043 unknownSprite->variant = 0;
00044 mUnknown.sprites.push_back(unknownSprite);
00045
00046 logger->log("Initializing NPC database...");
00047
00048 XML::Document doc("npcs.xml");
00049 xmlNodePtr rootNode = doc.rootNode();
00050
00051 if (!rootNode || !xmlStrEqual(rootNode->name, BAD_CAST "npcs"))
00052 {
00053 logger->error(_("NPC Database: Error while loading npcs.xml!"));
00054 }
00055
00056
00057 for_each_xml_child_node(npcNode, rootNode)
00058 {
00059 if (!xmlStrEqual(npcNode->name, BAD_CAST "npc"))
00060 continue;
00061
00062 int id = XML::getProperty(npcNode, "id", 0);
00063 if (id == 0)
00064 {
00065 logger->log("NPC Database: NPC with missing ID in npcs.xml!");
00066 continue;
00067 }
00068
00069 NPCInfo *currentInfo = new NPCInfo;
00070
00071 for_each_xml_child_node(spriteNode, npcNode)
00072 {
00073 if (xmlStrEqual(spriteNode->name, BAD_CAST "sprite"))
00074 {
00075 NPCsprite *currentSprite = new NPCsprite;
00076 currentSprite->sprite = (const char*)spriteNode->xmlChildrenNode->content;
00077 currentSprite->variant = XML::getProperty(spriteNode, "variant", 0);
00078 currentInfo->sprites.push_back(currentSprite);
00079 }
00080 else if (xmlStrEqual(spriteNode->name, BAD_CAST "particlefx"))
00081 {
00082 std::string particlefx = (const char*)spriteNode->xmlChildrenNode->content;
00083 currentInfo->particles.push_back(particlefx);
00084 }
00085 }
00086 mNPCInfos[id] = currentInfo;
00087 }
00088
00089 mLoaded = true;
00090 }
00091
00092 void NPCDB::unload()
00093 {
00094 for ( NPCInfosIterator i = mNPCInfos.begin();
00095 i != mNPCInfos.end();
00096 i++)
00097 {
00098 while (!i->second->sprites.empty())
00099 {
00100 delete i->second->sprites.front();
00101 i->second->sprites.pop_front();
00102 }
00103 delete i->second;
00104 }
00105
00106 mNPCInfos.clear();
00107
00108 while (!mUnknown.sprites.empty())
00109 {
00110 delete mUnknown.sprites.front();
00111 mUnknown.sprites.pop_front();
00112 }
00113
00114 mLoaded = false;
00115 }
00116
00117 const NPCInfo& NPCDB::get(int id)
00118 {
00119 NPCInfosIterator i = mNPCInfos.find(id);
00120
00121 if (i == mNPCInfos.end())
00122 {
00123 logger->log("NPCDB: Warning, unknown NPC ID %d requested", id);
00124 return mUnknown;
00125 }
00126 else
00127 {
00128 return *(i->second);
00129 }
00130 }