|
|
- #include "level.hpp"
- #include "../settings.hpp"
- #include "../configuration.hpp"
-
- #include <dirent.h>
- #include <iostream>
- #include <sstream>
-
- 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<int>(levelParameterSets.size()))
- {
- levelParameterSets.resize(worldIndex + 1);
- }
-
- // Resize vector to accommodate maximum level file index
- if (levelIndex >= static_cast<int>(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;
- }
|