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

127 lines
2.6 KiB

  1. #include "level.hpp"
  2. #include "../settings.hpp"
  3. #include <dirent.h>
  4. #include <iostream>
  5. #include <sstream>
  6. Level::Level():
  7. worldIndex(-1),
  8. levelIndex(-1)
  9. {}
  10. Level::~Level()
  11. {}
  12. bool Level::load()
  13. {
  14. ParameterDict parameters;
  15. if (!parameters.load(filename))
  16. {
  17. return false;
  18. }
  19. parameters.get("biome", &biome);
  20. parameters.get("heightmap", &heightmap);
  21. return true;
  22. }
  23. Campaign::Campaign()
  24. {}
  25. Campaign::~Campaign()
  26. {}
  27. bool Campaign::load(const std::string& directory)
  28. {
  29. // Open levels directory
  30. DIR* dir = opendir(directory.c_str());
  31. if (dir == nullptr)
  32. {
  33. std::cout << "Failed to open levels directory \"" << directory << "\"" << std::endl;
  34. return false;
  35. }
  36. // Scan directory for .lvl files
  37. for (struct dirent* entry = readdir(dir); entry != nullptr; entry = readdir(dir))
  38. {
  39. if (entry->d_type == DT_DIR || *entry->d_name == '.')
  40. {
  41. continue;
  42. }
  43. std::string filename = entry->d_name;
  44. std::string::size_type delimeter = filename.find_last_of('.');
  45. if (delimeter == std::string::npos)
  46. {
  47. continue;
  48. }
  49. std::string extension = filename.substr(delimeter + 1);
  50. if (extension != "lvl")
  51. {
  52. continue;
  53. }
  54. std::string worldIndexString = filename.substr(0, 2);
  55. std::string levelIndexString = filename.substr(3, 2);
  56. int worldIndex = -1;
  57. int levelIndex = -1;
  58. std::stringstream stream;
  59. stream << worldIndexString;
  60. stream >> worldIndex;
  61. stream.str(std::string());
  62. stream.clear();
  63. stream << levelIndexString;
  64. stream >> levelIndex;
  65. if (worldIndex < 0 || levelIndex < 0)
  66. {
  67. std::cout << "Invalid level \"" << filename << "\"" << std::endl;
  68. continue;
  69. }
  70. // Resize vector to accommodate maximum world index
  71. if (worldIndex >= static_cast<int>(levels.size()))
  72. {
  73. levels.resize(worldIndex + 1);
  74. }
  75. // Resize vector to accommodate maximum level index
  76. if (levelIndex >= static_cast<int>(levels[worldIndex].size()))
  77. {
  78. levels[worldIndex].resize(levelIndex + 1);
  79. }
  80. // Add level
  81. Level* level = &levels[worldIndex][levelIndex];
  82. level->filename = directory + filename;
  83. level->worldIndex = worldIndex;
  84. level->levelIndex = levelIndex;
  85. }
  86. // Close levels directory
  87. closedir(dir);
  88. // Load levels
  89. for (std::size_t i = ANTKEEPER_FIRST_WORLD_INDEX; i < levels.size(); ++i)
  90. {
  91. for (std::size_t j = ANTKEEPER_FIRST_LEVEL_INDEX; j < levels[i].size(); ++j)
  92. {
  93. Level* level = &levels[i][j];
  94. if (!level->load())
  95. {
  96. std::cout << "Failed to load level " << i << "-" << j << std::endl;
  97. }
  98. else
  99. {
  100. std::cout << "Loaded level " << i << "-" << j << std::endl;
  101. }
  102. }
  103. }
  104. return true;
  105. }