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

  1. #include "level.hpp"
  2. #include "../settings.hpp"
  3. #include "../configuration.hpp"
  4. #include <dirent.h>
  5. #include <iostream>
  6. #include <sstream>
  7. LevelParameterSet::LevelParameterSet()
  8. {}
  9. LevelParameterSet::~LevelParameterSet()
  10. {}
  11. bool LevelParameterSet::load(const std::string& filename)
  12. {
  13. this->filename = filename;
  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. Level::Level()
  24. {
  25. terrain.create(255, 255, Vector3(ANTKEEPER_TERRAIN_WIDTH, ANTKEEPER_TERRAIN_BASE_HEIGHT, ANTKEEPER_TERRAIN_DEPTH));
  26. }
  27. Level::~Level()
  28. {}
  29. bool Level::load(const LevelParameterSet& params)
  30. {
  31. // Load terrain from heightmap
  32. std::string heightmapFilename = std::string("data/textures/") + params.heightmap;
  33. if (!terrain.load(heightmapFilename))
  34. {
  35. std::cerr << "Failed to load terrain from heightmap file \"" << heightmapFilename << "\" for level \"" << params.filename << "\"" << std::endl;
  36. return false;
  37. }
  38. //application->currentLevelTerrain->getSurfaceModel()->getGroup(0)->material = application->materialLoader->load("data/materials/debug-terrain-surface.mtl");
  39. // Setup terrain surface model instance
  40. terrainSurface.setModel(terrain.getSurfaceModel());
  41. terrainSurface.setTranslation(Vector3(0, 0, 0));
  42. // Setup terrain subsurface model instance
  43. terrainSubsurface.setModel(terrain.getSubsurfaceModel());
  44. terrainSubsurface.setTranslation(Vector3(0, 0, 0));
  45. return true;
  46. }
  47. Campaign::Campaign()
  48. {}
  49. Campaign::~Campaign()
  50. {}
  51. bool Campaign::load(const std::string& directory)
  52. {
  53. // Open levels directory
  54. DIR* dir = opendir(directory.c_str());
  55. if (dir == nullptr)
  56. {
  57. std::cout << "Failed to open levels directory \"" << directory << "\"" << std::endl;
  58. return false;
  59. }
  60. // Scan directory for .lvl files
  61. for (struct dirent* entry = readdir(dir); entry != nullptr; entry = readdir(dir))
  62. {
  63. if (entry->d_type == DT_DIR || *entry->d_name == '.')
  64. {
  65. continue;
  66. }
  67. std::string filename = entry->d_name;
  68. std::string::size_type delimeter = filename.find_last_of('.');
  69. if (delimeter == std::string::npos)
  70. {
  71. continue;
  72. }
  73. std::string extension = filename.substr(delimeter + 1);
  74. if (extension != "lvl")
  75. {
  76. continue;
  77. }
  78. std::string worldIndexString = filename.substr(0, 2);
  79. std::string levelIndexString = filename.substr(3, 2);
  80. int worldIndex = -1;
  81. int levelIndex = -1;
  82. std::stringstream stream;
  83. stream << worldIndexString;
  84. stream >> worldIndex;
  85. worldIndex -= 1;
  86. stream.str(std::string());
  87. stream.clear();
  88. stream << levelIndexString;
  89. stream >> levelIndex;
  90. levelIndex -= 1;
  91. if (worldIndex < 0 || levelIndex < 0)
  92. {
  93. std::cout << "Invalid level parameters file \"" << filename << "\"" << std::endl;
  94. continue;
  95. }
  96. // Resize vector to accommodate maximum world index
  97. if (worldIndex >= static_cast<int>(levelParameterSets.size()))
  98. {
  99. levelParameterSets.resize(worldIndex + 1);
  100. }
  101. // Resize vector to accommodate maximum level file index
  102. if (levelIndex >= static_cast<int>(levelParameterSets[worldIndex].size()))
  103. {
  104. levelParameterSets[worldIndex].resize(levelIndex + 1);
  105. }
  106. // Load level parameters
  107. LevelParameterSet* levelParams = &levelParameterSets[worldIndex][levelIndex];
  108. if (!levelParams->load(directory + filename))
  109. {
  110. std::cout << "Failed to load parameters for level " << (worldIndex + 1) << "-" << (levelIndex + 1) << std::endl;
  111. }
  112. else
  113. {
  114. std::cout << "Loaded level parameters for level " << (worldIndex + 1) << "-" << (levelIndex + 1) << std::endl;
  115. }
  116. }
  117. // Close levels directory
  118. closedir(dir);
  119. return true;
  120. }