#include "level.hpp" #include "../settings.hpp" #include "../configuration.hpp" #include #include #include LevelParameterSet::LevelParameterSet() {} LevelParameterSet::~LevelParameterSet() {} bool LevelParameterSet::load(const std::string& filename) { this->filename = filename; ParameterDict parameters; if (!parameters.load(filename)) { return false; } parameters.get("biome", &biome); parameters.get("heightmap", &heightmap); return true; } Level::Level() { terrain.create(255, 255, Vector3(ANTKEEPER_TERRAIN_WIDTH, ANTKEEPER_TERRAIN_BASE_HEIGHT, ANTKEEPER_TERRAIN_DEPTH)); } Level::~Level() {} bool Level::load(const LevelParameterSet& params) { // Load terrain from heightmap std::string heightmapFilename = std::string("data/textures/") + params.heightmap; if (!terrain.load(heightmapFilename)) { std::cerr << "Failed to load terrain from heightmap file \"" << heightmapFilename << "\" for level \"" << params.filename << "\"" << std::endl; return false; } //application->currentLevelTerrain->getSurfaceModel()->getGroup(0)->material = application->materialLoader->load("data/materials/debug-terrain-surface.mtl"); // Setup terrain surface model instance terrainSurface.setModel(terrain.getSurfaceModel()); terrainSurface.setTranslation(Vector3(0, 0, 0)); // Setup terrain subsurface model instance terrainSubsurface.setModel(terrain.getSubsurfaceModel()); terrainSubsurface.setTranslation(Vector3(0, 0, 0)); return true; } Campaign::Campaign() {} Campaign::~Campaign() {} bool Campaign::load(const std::string& directory) { // Open levels directory DIR* dir = opendir(directory.c_str()); if (dir == nullptr) { std::cout << "Failed to open levels directory \"" << directory << "\"" << std::endl; return false; } // Scan directory for .lvl files for (struct dirent* entry = readdir(dir); entry != nullptr; entry = readdir(dir)) { if (entry->d_type == DT_DIR || *entry->d_name == '.') { continue; } std::string filename = entry->d_name; std::string::size_type delimeter = filename.find_last_of('.'); if (delimeter == std::string::npos) { continue; } std::string extension = filename.substr(delimeter + 1); if (extension != "lvl") { continue; } std::string worldIndexString = filename.substr(0, 2); std::string levelIndexString = filename.substr(3, 2); int worldIndex = -1; int levelIndex = -1; std::stringstream stream; stream << worldIndexString; stream >> worldIndex; worldIndex -= 1; stream.str(std::string()); stream.clear(); stream << levelIndexString; stream >> levelIndex; levelIndex -= 1; if (worldIndex < 0 || levelIndex < 0) { std::cout << "Invalid level parameters file \"" << filename << "\"" << std::endl; continue; } // Resize vector to accommodate maximum world index if (worldIndex >= static_cast(levelParameterSets.size())) { levelParameterSets.resize(worldIndex + 1); } // Resize vector to accommodate maximum level file index if (levelIndex >= static_cast(levelParameterSets[worldIndex].size())) { levelParameterSets[worldIndex].resize(levelIndex + 1); } // Load level parameters LevelParameterSet* levelParams = &levelParameterSets[worldIndex][levelIndex]; if (!levelParams->load(directory + filename)) { std::cout << "Failed to load parameters for level " << (worldIndex + 1) << "-" << (levelIndex + 1) << std::endl; } else { std::cout << "Loaded level parameters for level " << (worldIndex + 1) << "-" << (levelIndex + 1) << std::endl; } } // Close levels directory closedir(dir); return true; }