summaryrefslogtreecommitdiff
path: root/src/resources/mapreader.cpp
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2014-02-15 17:01:46 +0300
committerAndrei Karas <akaras@inbox.ru>2014-02-15 17:01:46 +0300
commit382067b05c4fe97bcf0da0143405375ec295f7c6 (patch)
treef668cd2595ac0c85f0942f88729d3ff1956676fa /src/resources/mapreader.cpp
parentee8191705826d978b7793497fdd307536c709bff (diff)
parent9b329556e748050c4300174e9bdc72b15e5b8cc5 (diff)
downloadplus-382067b05c4fe97bcf0da0143405375ec295f7c6.tar.gz
plus-382067b05c4fe97bcf0da0143405375ec295f7c6.tar.bz2
plus-382067b05c4fe97bcf0da0143405375ec295f7c6.tar.xz
plus-382067b05c4fe97bcf0da0143405375ec295f7c6.zip
Merge branch 'master' into stable
Diffstat (limited to 'src/resources/mapreader.cpp')
-rw-r--r--src/resources/mapreader.cpp106
1 files changed, 71 insertions, 35 deletions
diff --git a/src/resources/mapreader.cpp b/src/resources/mapreader.cpp
index bcafe4bb7..e053e0035 100644
--- a/src/resources/mapreader.cpp
+++ b/src/resources/mapreader.cpp
@@ -30,6 +30,7 @@
#include "tileset.h"
#include "resources/animation.h"
+#include "resources/beingcommon.h"
#include "resources/image.h"
#include "resources/resourcemanager.h"
@@ -42,6 +43,15 @@
#include "debug.h"
+typedef std::map<std::string, XmlNodePtr>::iterator LayerInfoIterator;
+typedef std::set<XML::Document*>::iterator DocIterator;
+
+namespace
+{
+ std::map<std::string, XmlNodePtr> mKnownLayers;
+ std::set<XML::Document*> mKnownDocs;
+} // namespace
+
static int inflateMemory(unsigned char *restrict const in,
const unsigned int inLength,
unsigned char *&restrict out,
@@ -182,53 +192,46 @@ int inflateMemory(unsigned char *restrict const in,
return outLength;
}
+void MapReader::addLayerToList(const std::string &fileName)
+{
+ XML::Document *doc = new XML::Document(fileName);
+ XmlNodePtrConst node = doc->rootNode();
+ if (!node)
+ {
+ delete doc;
+ return;
+ }
+
+ for_each_xml_child_node(childNode, node)
+ {
+ if (!xmlNameEqual(childNode, "layer"))
+ continue;
+ std::string name = XML::getProperty(childNode, "name", "");
+ if (name.empty())
+ continue;
+ name = toLower(name);
+ logger->log("found patch layer: " + name);
+ mKnownLayers[name] = childNode;
+ mKnownDocs.insert(doc);
+ }
+}
+
Map *MapReader::readMap(const std::string &restrict filename,
const std::string &restrict realFilename)
{
BLOCK_START("MapReader::readMap")
logger->log("Attempting to read map %s", realFilename.c_str());
- // Load the file through resource manager
- const ResourceManager *const resman = ResourceManager::getInstance();
- int fileSize;
- void *buffer = resman->loadFile(realFilename, fileSize);
- Map *map = nullptr;
- if (!buffer)
+ XML::Document doc(realFilename);
+ if (!doc.isLoaded())
{
BLOCK_END("MapReader::readMap")
return createEmptyMap(filename, realFilename);
}
- unsigned char *inflated = nullptr;
- unsigned int inflatedSize;
-
- if (realFilename.find(".gz", realFilename.length() - 3)
- != std::string::npos)
- {
- // Inflate the gzipped map data
- inflatedSize = inflateMemory(static_cast<unsigned char*>(buffer),
- fileSize, inflated);
- free(buffer);
-
- if (!inflated)
- {
- logger->log("Could not decompress map file (%s)",
- realFilename.c_str());
- BLOCK_END("MapReader::readMap")
- return nullptr;
- }
- }
- else
- {
- inflated = static_cast<unsigned char*>(buffer);
- inflatedSize = fileSize;
- }
-
- XML::Document doc(reinterpret_cast<char*>(inflated), inflatedSize);
- free(inflated);
-
XmlNodePtrConst node = doc.rootNode();
+ Map *map = nullptr;
// Parse the inflated map data
if (node)
{
@@ -256,6 +259,24 @@ Map *MapReader::readMap(const std::string &restrict filename,
return map;
}
+void MapReader::loadLayers(const std::string &path)
+{
+ loadXmlDir2(path, addLayerToList, ".tmx");
+}
+
+void MapReader::unloadTempLayers()
+{
+ FOR_EACH (DocIterator, it, mKnownDocs)
+ delete (*it);
+ mKnownLayers.clear();
+ mKnownDocs.clear();
+}
+
+static void loadReplaceLayer(LayerInfoIterator &it, Map *const map)
+{
+ MapReader::readLayer((*it).second, map);
+}
+
Map *MapReader::readMap(XmlNodePtrConst node, const std::string &path)
{
if (!node)
@@ -281,6 +302,9 @@ Map *MapReader::readMap(XmlNodePtrConst node, const std::string &path)
return nullptr;
}
+ logger->log("loading replace layer list");
+ loadLayers(path + "_replace.d");
+
Map *const map = new Map(w, h, tilew, tileh);
const std::string fileName = path.substr(path.rfind("/") + 1);
@@ -309,7 +333,18 @@ Map *MapReader::readMap(XmlNodePtrConst node, const std::string &path)
}
else if (xmlNameEqual(childNode, "layer"))
{
- readLayer(childNode, map);
+ std::string name = XML::getProperty(childNode, "name", "");
+ name = toLower(name);
+ LayerInfoIterator it = mKnownLayers.find(name);
+ if (it == mKnownLayers.end())
+ {
+ readLayer(childNode, map);
+ }
+ else
+ {
+ logger->log("load replace layer: " + name);
+ loadReplaceLayer(it, map);
+ }
}
else if (xmlNameEqual(childNode, "properties"))
{
@@ -402,6 +437,7 @@ Map *MapReader::readMap(XmlNodePtrConst node, const std::string &path)
map->setActorsFix(0, atoi(map->getProperty("actorsfix").c_str()));
map->reduce();
map->setWalkLayer(resman->getWalkLayer(fileName, map));
+ unloadTempLayers();
return map;
}