level_loader.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. #include "level_loader.h"
  2. #include "../../render/gl/camera.h"
  3. #include "../../render/scene_renderer.h"
  4. #include "../core/component.h"
  5. #include "../core/world.h"
  6. #include "../systems/owner_registry.h"
  7. #include "../units/factory.h"
  8. #include "../visuals/visual_catalog.h"
  9. #include "environment.h"
  10. #include "map_definition.h"
  11. #include "map_loader.h"
  12. #include "map_transformer.h"
  13. #include "terrain_service.h"
  14. #include <QDebug>
  15. namespace Game {
  16. namespace Map {
  17. LevelLoadResult LevelLoader::loadFromAssets(const QString &mapPath,
  18. Engine::Core::World &world,
  19. Render::GL::Renderer &renderer,
  20. Render::GL::Camera &camera) {
  21. LevelLoadResult res;
  22. auto &owners = Game::Systems::OwnerRegistry::instance();
  23. Game::Visuals::VisualCatalog visualCatalog;
  24. QString visualsErr;
  25. if (!visualCatalog.loadFromJsonFile("assets/visuals/unit_visuals.json",
  26. &visualsErr)) {
  27. res.ok = false;
  28. res.errorMessage =
  29. QString("Failed to load visual catalog: %1").arg(visualsErr);
  30. qWarning() << res.errorMessage;
  31. return res;
  32. }
  33. auto unitReg = std::make_shared<Game::Units::UnitFactoryRegistry>();
  34. Game::Units::registerBuiltInUnits(*unitReg);
  35. Game::Map::MapTransformer::setFactoryRegistry(unitReg);
  36. Game::Map::MapDefinition def;
  37. QString err;
  38. if (Game::Map::MapLoader::loadFromJsonFile(mapPath, def, &err)) {
  39. res.ok = true;
  40. res.mapName = def.name;
  41. Game::Map::TerrainService::instance().initialize(def);
  42. Game::Map::Environment::apply(def, renderer, camera);
  43. res.camFov = def.camera.fovY;
  44. res.camNear = def.camera.nearPlane;
  45. res.camFar = def.camera.farPlane;
  46. res.gridWidth = def.grid.width;
  47. res.gridHeight = def.grid.height;
  48. res.tileSize = def.grid.tileSize;
  49. res.maxTroopsPerPlayer = def.maxTroopsPerPlayer;
  50. res.victoryConfig = def.victory;
  51. auto rt =
  52. Game::Map::MapTransformer::applyToWorld(def, world, &visualCatalog);
  53. if (!rt.unitIds.empty()) {
  54. res.playerUnitId = rt.unitIds.front();
  55. } else {
  56. auto reg = Game::Map::MapTransformer::getFactoryRegistry();
  57. if (reg) {
  58. Game::Units::SpawnParams sp;
  59. sp.position = QVector3D(0.0f, 0.0f, 0.0f);
  60. sp.playerId = 0;
  61. sp.unitType = "archer";
  62. sp.aiControlled = !owners.isPlayer(sp.playerId);
  63. if (auto unit = reg->create("archer", world, sp)) {
  64. res.playerUnitId = unit->id();
  65. } else {
  66. qWarning() << "LevelLoader: Fallback archer spawn failed";
  67. }
  68. }
  69. }
  70. bool hasBarracks = false;
  71. for (auto *e : world.getEntitiesWith<Engine::Core::UnitComponent>()) {
  72. if (auto *u = e->getComponent<Engine::Core::UnitComponent>()) {
  73. if (u->unitType == "barracks" && owners.isPlayer(u->ownerId)) {
  74. hasBarracks = true;
  75. break;
  76. }
  77. }
  78. }
  79. if (!hasBarracks) {
  80. auto reg2 = Game::Map::MapTransformer::getFactoryRegistry();
  81. if (reg2) {
  82. Game::Units::SpawnParams sp;
  83. sp.position = QVector3D(-4.0f, 0.0f, -3.0f);
  84. sp.playerId = owners.getLocalPlayerId();
  85. sp.unitType = "barracks";
  86. sp.aiControlled = !owners.isPlayer(sp.playerId);
  87. reg2->create("barracks", world, sp);
  88. }
  89. }
  90. } else {
  91. res.ok = false;
  92. res.errorMessage = QString("Map load failed: %1").arg(err);
  93. qWarning() << "LevelLoader: Map load failed:" << err
  94. << " - applying default environment";
  95. Game::Map::Environment::applyDefault(renderer, camera);
  96. res.ok = false;
  97. res.camFov = camera.getFOV();
  98. res.camNear = camera.getNear();
  99. res.camFar = camera.getFar();
  100. res.gridWidth = 50;
  101. res.gridHeight = 50;
  102. res.tileSize = 1.0f;
  103. auto reg = Game::Map::MapTransformer::getFactoryRegistry();
  104. if (reg) {
  105. Game::Units::SpawnParams sp;
  106. sp.position = QVector3D(0.0f, 0.0f, 0.0f);
  107. sp.playerId = 0;
  108. sp.unitType = "archer";
  109. sp.aiControlled = !owners.isPlayer(sp.playerId);
  110. if (auto unit = reg->create("archer", world, sp)) {
  111. res.playerUnitId = unit->id();
  112. }
  113. }
  114. }
  115. return res;
  116. }
  117. } // namespace Map
  118. } // namespace Game