void Settings::readLayer(SimXMLDocument *document, String groupStack) { for(S32 i=0; document->pushChildElement(i); i++) { const UTF8 *type = document->elementValue(); const UTF8 *name = document->attribute("name"); const UTF8 *value = document->getText(); if(dStrcmp(type, "Group") == 0) { String newStack = groupStack; if(!groupStack.isEmpty()) newStack += "/"; newStack += name; readLayer(document, newStack); } else if(dStrcmp(type, "Setting") == 0) { String nameString = groupStack; if(!groupStack.isEmpty()) nameString += "/"; nameString += name; setDataField(StringTable->insert(nameString.c_str()), NULL, value); } document->popElement(); } }
bool Settings::read() { SimXMLDocument *document = new SimXMLDocument(); document->registerObject(); bool success = true; if(document->loadFile(mFile.c_str())) { clearAllFields(); // set our base element if(document->pushFirstChildElement(getName())) { setModStaticFields(false); readLayer(document); setModStaticFields(true); } else success = false; } else success = false; document->deleteObject(); return success; }
//--------------------------------------------------------------------- void BackgroundFileSerializer::readBackground( Ogre::DataStreamPtr &stream ,BackgroundFile *pDest ) { readSectionHeader( stream, SECTION_NAME_BACK ); auto& layers( pDest->getLayers() ); for( size_t i( 0 ); i < BackgroundFile::LAYER_COUNT; ++i ) { if( i != 0 ) { read1ByteBool( stream, layers[i].enabled ); } readLayer(stream, &layers[i], i); } }
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; }