farmlands/src/resources/ResourceManager/ResourceManager_Levels.cpp

110 lines
2.4 KiB
C++

/*
* ResourceManager_Levels.cpp
*
* Created on: Nov 11, 2016
* Author: tibi
*/
#include <resources/ResourceManager.h>
#include <resources/Resources.h>
#include <fstream>
#include <string>
#include <json.hpp>
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;
}
}
}