/** * Loads the tileset with the given \a fileName. If the tileset is already * loaded, returns that instance. * * When an error occurs during loading it is assigned to the optional \a error * parameter. */ SharedTileset TilesetManager::loadTileset(const QString &fileName, QString *error) { SharedTileset tileset = findTileset(fileName); if (!tileset) tileset = readTileset(fileName, error); return tileset; }
Map *MapReader::readMap(const xmlNodePtr &node, const std::string &path) { // Take the filename off the path const std::string pathDir = path.substr(0, path.rfind("/") + 1); const int w = XML::getProperty(node, "width", 0); const int h = XML::getProperty(node, "height", 0); const int tilew = XML::getProperty(node, "tilewidth", DEFAULT_TILE_WIDTH); const int tileh = XML::getProperty(node, "tileheight", DEFAULT_TILE_HEIGHT); Map *map = new Map(w, h, tilew, tileh); for_each_xml_child_node(childNode, node) { if (xmlStrEqual(childNode->name, BAD_CAST "tileset")) { Tileset *tileset = readTileset(childNode, pathDir, map); if (tileset) map->addTileset(tileset); } else if (xmlStrEqual(childNode->name, BAD_CAST "layer")) readLayer(childNode, map); else if (xmlStrEqual(childNode->name, BAD_CAST "properties")) readProperties(childNode, map); else if (xmlStrEqual(childNode->name, BAD_CAST "objectgroup")) { // The object group offset is applied to each object individually const int tileOffsetX = XML::getProperty(childNode, "x", 0); const int tileOffsetY = XML::getProperty(childNode, "y", 0); const int offsetX = tileOffsetX * tilew; const int offsetY = tileOffsetY * tileh; for_each_xml_child_node(objectNode, childNode) { if (xmlStrEqual(objectNode->name, BAD_CAST "object")) { const std::string objType = XML::getProperty(objectNode, "type", ""); if (objType == "WARP" || objType == "NPC" || objType == "SCRIPT" || objType == "SPAWN") { // Silently skip server-side objects. continue; } const std::string objName = XML::getProperty(objectNode, "name", ""); const int objX = XML::getProperty(objectNode, "x", 0); const int objY = XML::getProperty(objectNode, "y", 0); logger->log("- Loading object name: %s type: %s at %d:%d", objName.c_str(), objType.c_str(), objX, objY); if (objType == "PARTICLE_EFFECT") { if (objName.empty()) { logger->log(" Warning: No particle file given"); continue; } map->addParticleEffect(objName, objX + offsetX, objY + offsetY); } else logger->log(" Warning: Unknown object type"); } } } } map->initializeOverlays(); return map; }
Map *MapReader::readMap(xmlNodePtr node, const std::string &path) { // Take the filename off the path const std::string pathDir = path.substr(0, path.rfind("/") + 1); const int w = XML::getProperty(node, "width", 0); const int h = XML::getProperty(node, "height", 0); const int tilew = XML::getProperty(node, "tilewidth", -1); const int tileh = XML::getProperty(node, "tileheight", -1); if (tilew < 0 || tileh < 0) { logger->log("MapReader: Warning: " "Unitialized tile width or height value for map: %s", path.c_str()); return 0; } Map *map = new Map(w, h, tilew, tileh); for_each_xml_child_node(childNode, node) { if (xmlStrEqual(childNode->name, BAD_CAST "tileset")) { Tileset *tileset = readTileset(childNode, pathDir, map); if (tileset) { map->addTileset(tileset); } } else if (xmlStrEqual(childNode->name, BAD_CAST "layer")) { readLayer(childNode, map); } else if (xmlStrEqual(childNode->name, BAD_CAST "properties")) { readProperties(childNode, map); } else if (xmlStrEqual(childNode->name, BAD_CAST "objectgroup")) { // The object group offset is applied to each object individually const int tileOffsetX = XML::getProperty(childNode, "x", 0); const int tileOffsetY = XML::getProperty(childNode, "y", 0); const int offsetX = tileOffsetX * tilew; const int offsetY = tileOffsetY * tileh; for_each_xml_child_node(objectNode, childNode) { if (xmlStrEqual(objectNode->name, BAD_CAST "object")) { std::string objType = XML::getProperty(objectNode, "type", ""); objType = toUpper(objType); if (objType == "NPC" || objType == "SCRIPT" || objType == "SPAWN") { // Silently skip server-side objects. continue; } const std::string objName = XML::getProperty(objectNode, "name", ""); const int objX = XML::getProperty(objectNode, "x", 0); const int objY = XML::getProperty(objectNode, "y", 0); const int objW = XML::getProperty(objectNode, "width", 0); const int objH = XML::getProperty(objectNode, "height", 0); logger->log("- Loading object name: %s type: %s at %d:%d", objName.c_str(), objType.c_str(), objX, objY); if (objType == "PARTICLE_EFFECT") { if (objName.empty()) { logger->log(" Warning: No particle file given"); continue; } map->addParticleEffect(objName, objX + offsetX, objY + offsetY, objW, objH); } else if (objType == "WARP") { if (config.getValue("showWarps", 1)) { map->addParticleEffect( paths.getStringValue("particles") + paths.getStringValue("portalEffectFile"), objX, objY, objW, objH); } } else { logger->log(" Warning: Unknown object type"); } } } } } map->initializeAmbientLayers(); return map; }