00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <cassert>
00023
00024 #include "game-server/mapmanager.hpp"
00025
00026 #include "game-server/map.hpp"
00027 #include "game-server/mapcomposite.hpp"
00028 #include "game-server/mapreader.hpp"
00029 #include "game-server/resourcemanager.hpp"
00030 #include "utils/logger.h"
00031 #include "utils/xml.hpp"
00032
00036 static MapManager::Maps maps;
00037
00038 const MapManager::Maps &MapManager::getMaps()
00039 {
00040 return maps;
00041 }
00042
00043 void MapManager::initialize(const std::string &mapReferenceFile)
00044 {
00045 int size;
00046 char *data = ResourceManager::loadFile(mapReferenceFile, size);
00047
00048 if (!data) {
00049 LOG_ERROR("Map Manager: Could not find " << mapReferenceFile << "!");
00050 free(data);
00051 return;
00052 }
00053
00054 xmlDocPtr doc = xmlParseMemory(data, size);
00055 free(data);
00056
00057 if (!doc)
00058 {
00059 LOG_ERROR("Map Manager: Error while parsing map database ("
00060 << mapReferenceFile << ")!");
00061 return;
00062 }
00063
00064 xmlNodePtr node = xmlDocGetRootElement(doc);
00065 if (!node || !xmlStrEqual(node->name, BAD_CAST "maps"))
00066 {
00067 LOG_ERROR("Map Manager: " << mapReferenceFile
00068 << " is not a valid database file!");
00069 xmlFreeDoc(doc);
00070 return;
00071 }
00072
00073 LOG_INFO("Loading map reference...");
00074 for (node = node->xmlChildrenNode; node != NULL; node = node->next)
00075 {
00076 if (!xmlStrEqual(node->name, BAD_CAST "map")) {
00077 continue;
00078 }
00079
00080 int id = XML::getProperty(node, "id", 0);
00081 std::string name = XML::getProperty(node, "name", std::string());
00082 if (id != 0 && !name.empty())
00083 {
00084 maps[id] = new MapComposite(id, name);
00085 }
00086 }
00087
00088 xmlFreeDoc(doc);
00089 }
00090
00091 void MapManager::deinitialize()
00092 {
00093 for (Maps::iterator i = maps.begin(), i_end = maps.end(); i != i_end; ++i)
00094 {
00095 delete i->second;
00096 }
00097 maps.clear();
00098 }
00099
00100 MapComposite *MapManager::getMap(int mapId)
00101 {
00102 Maps::iterator i = maps.find(mapId);
00103 return (i != maps.end()) ? i->second : NULL;
00104 }
00105
00106 MapComposite *MapManager::getMap(const std::string &mapName)
00107 {
00108 Maps::iterator i;
00109 for (i = maps.begin(); i != maps.end(); ++i)
00110 {
00111 if (i->second->getName() == mapName)
00112 return i->second;
00113 }
00114 return NULL;
00115 }
00116
00117 void MapManager::raiseActive(int mapId)
00118 {
00119 Maps::iterator i = maps.find(mapId);
00120 assert(i != maps.end());
00121 MapComposite *composite = i->second;
00122 if (composite->isActive())
00123 {
00124 return;
00125 }
00126
00127 std::string file = "maps/" + composite->getName() + ".tmx";
00128 if (!ResourceManager::exists(file))
00129 {
00130 file += ".gz";
00131 }
00132 MapReader::readMap(file, composite);
00133
00134 LOG_INFO("Activated map \"" << file << "\" (id " << mapId << ")");
00135 }
00136
00137
00138