Sector& LevelParser::ParseLevel(const std::string& levelString) { Sector* levelSector = new Sector; levelSector->SetName(levelString); TableSharedData sharedData; XmlParseMaster master(sharedData); ActionXmlParseHelper actionHelper; master.AddHelper(actionHelper); EntityXmlParseHelper entityHelper; master.AddHelper(entityHelper); SectorXmlParseHelper sectorHelper; master.AddHelper(sectorHelper); WorldXmlParseHelper worldHelper; master.AddHelper(worldHelper); FloatXmlParseHelper floatHelper; master.AddHelper(floatHelper); IntegerXmlParseHelper intHelper; master.AddHelper(intHelper); MatrixXmlParseHelper matrixHelper; master.AddHelper(matrixHelper); ReactionXmlParseHelper reactionHelper; master.AddHelper(reactionHelper); StringXmlParseHelper stringHelper; master.AddHelper(stringHelper); TableXmlParseHelper tableHelper; master.AddHelper(tableHelper); VectorXmlParseHelper vectorHelper; master.AddHelper(vectorHelper); float x = 0.0f, y = 0.0f; for (std::uint32_t i = 0; i < levelString.length(); ++i) { const char& symbol = levelString.at(i); if (symbol != '\n') { if (symbol != '.') { std::string path = CONTENT_PATH; master.ParseFromFile(path.append(mSymbolTable[symbol])); World* world = sharedData.GetCurrentScope()[WORLDS_KEY][0].As<World>(); Sector* sector = world->Sectors().Get<Scope*>()->As<Sector>(); Entity* entity = sector->Entities().Get<Scope*>()->As<Entity>(); if (entity) if (entity->Is(EntityTile::TypeIdClass())) levelSector->Adopt(CreateTile(entity, x, y), ENTITIES_KEY); else if (entity->Is(EntityPlayer::TypeIdClass())) levelSector->Adopt(CreatePlayer(entity, x, y), ENTITIES_KEY); else if (entity->Is(EntityMovable::TypeIdClass())) levelSector->Adopt(CreateMovable(entity, x, y), ENTITIES_KEY); } x += 1.0f; } else { y += 1.0f; x = 0.0f; } sharedData.Clear(); } return *levelSector; }