/* * ResourceManager_Levels.cpp * * Created on: Nov 11, 2016 * Author: tibi */ #include #include #include #include #include using namespace nlohmann; namespace farmlands { namespace resources { void ResourceManager::loadLevelLayer(model::Level* level, size_t layer, int resourceId) { assert(RInfo[resourceId].type == ResourceType::LevelLayer); char buffer[1024 * 10]; // Open file std::ifstream in(getPath(resourceId)); if (!in) throw 0; // TODO: replace with exception type // Read CSV file line by line for (size_t row = 0; row < level->rowCount(); row++) { in.getline(buffer, sizeof(buffer)); if (in.eof()) throw 0; // TODO: replace with exception type // Separated by comma (or maybe semicolon) char* nextNum = strtok(buffer, ",;"); for (size_t col = 0; col < level->columnCount() && nextNum != NULL; col++) { model::Cell cell = (model::Cell)strtol(nextNum, NULL, 10); level->setCell(layer, row, col, cell); nextNum = strtok(NULL, ",;"); } } in.close(); } void ResourceManager::loadLevel(int levelId) { // Sanity checks assert(RInfo[levelId].type == ResourceType::Level); // Open file std::ifstream levelIn(getPath(levelId)); if (!levelIn) throw 0; // TODO: replace with exception type // Parse file json levelJs; levelIn>>levelJs; size_t layerCount = levelJs.value("layerCount", 0u); size_t rowCount = levelJs.value("height", 0u); size_t colCount = levelJs.value("width", 0u); assert(layerCount > 0 && rowCount > 0 && colCount > 0); model::Level* level = new model::Level(layerCount, rowCount, colCount); level->m_cellWidth = levelJs.value("cellWidth", 0u); level->m_cellHeight = levelJs.value("cellHeight", 0u); // Read layers json layersJs = levelJs["layers"]; size_t layer = 0; for (auto it = layersJs.begin(); it != layersJs.end(); it++, layer++) { std::string cellsFileName = it->value("cellsFile", std::string()); loadLevelLayer(level, layer, getId(cellsFileName)); std::string textureFileName = it->value("textureFile", std::string()); int textureId = getId(textureFileName); level->setTexture(layer, textureId); loadTexture(textureId); } m_loadedResources[levelId].loaded = true; m_loadedResources[levelId].level = level; } model::Level* ResourceManager::level(int id) { assert(RInfo[id].type == ResourceType::Level); return m_loadedResources[id].level; } } }