💿🐜 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.
 

128 lines
2.6 KiB

#include "level.hpp"
#include "../settings.hpp"
#include <dirent.h>
#include <iostream>
#include <sstream>
Level::Level():
worldIndex(-1),
levelIndex(-1)
{}
Level::~Level()
{}
bool Level::load()
{
ParameterDict parameters;
if (!parameters.load(filename))
{
return false;
}
parameters.get("biome", &biome);
parameters.get("heightmap", &heightmap);
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;
stream.str(std::string());
stream.clear();
stream << levelIndexString;
stream >> levelIndex;
if (worldIndex < 0 || levelIndex < 0)
{
std::cout << "Invalid level \"" << filename << "\"" << std::endl;
continue;
}
// Resize vector to accommodate maximum world index
if (worldIndex >= static_cast<int>(levels.size()))
{
levels.resize(worldIndex + 1);
}
// Resize vector to accommodate maximum level index
if (levelIndex >= static_cast<int>(levels[worldIndex].size()))
{
levels[worldIndex].resize(levelIndex + 1);
}
// Add level
Level* level = &levels[worldIndex][levelIndex];
level->filename = directory + filename;
level->worldIndex = worldIndex;
level->levelIndex = levelIndex;
}
// Close levels directory
closedir(dir);
// Load levels
for (std::size_t i = ANTKEEPER_FIRST_WORLD_INDEX; i < levels.size(); ++i)
{
for (std::size_t j = ANTKEEPER_FIRST_LEVEL_INDEX; j < levels[i].size(); ++j)
{
Level* level = &levels[i][j];
if (!level->load())
{
std::cout << "Failed to load level " << i << "-" << j << std::endl;
}
else
{
std::cout << "Loaded level " << i << "-" << j << std::endl;
}
}
}
return true;
}