💿🐜 Antkeeper source code https://antkeeper.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

149 lines
3.6 KiB

#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;
}