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