From fe650c777767275ec97001dd45972afa598a8a64 Mon Sep 17 00:00:00 2001
From: TheUltimateOptimist <digitalConfidence@web.de>
Date: Mon, 27 Jan 2025 18:13:06 +0100
Subject: [PATCH 1/3] started implementing loadLevel

---
 src/level.cpp | 33 +++++++++++++++++++++++++++++++++
 src/level.hpp |  2 ++
 src/main.cpp  |  2 ++
 3 files changed, 37 insertions(+)

diff --git a/src/level.cpp b/src/level.cpp
index 74c1598..cde52ea 100644
--- a/src/level.cpp
+++ b/src/level.cpp
@@ -3,6 +3,9 @@
 #include "building.hpp"
 #include "effect.hpp"
 #include "engine.hpp"
+#include "highfive/H5File.hpp"
+#include <boost/property_tree/ptree.hpp>
+#include <boost/property_tree/xml_parser.hpp>
 #include "spritesheet.hpp"
 #include "unit.hpp"
 #include <SDL.h>
@@ -22,6 +25,36 @@ Level::Level(std::string name, int width, int height, std::vector<Tile> tiles,
   }
 };
 
+  Level Level::loadLevel(std::string path)
+{
+  HighFive::File file(path, HighFive::File::ReadOnly);
+
+  // read level metadata
+  std::string level_metadata;
+  file.getDataSet("level/metadata").read(level_metadata);
+
+  // read tilesarray
+  std::vector<uint8_t> level_tilesarray;
+  file.getDataSet("level/tilesarray").read(level_tilesarray);
+
+  // extract metadata from xml
+  std::istringstream xmlStream(level_metadata);
+  boost::property_tree::ptree pt;
+  boost::property_tree::read_xml(xmlStream, pt);
+  int width = pt.get<int>("level.width");
+  int height = pt.get<int>("level.height");
+  std::string name = pt.get<std::string>("level.name");
+  std::vector<Tile> tiles;
+  tiles.reserve(width*height);
+  for (uint8_t value : level_tilesarray)
+  {
+    tiles.push_back(Tile())
+  }
+
+
+  throw std::runtime_error("some");
+};
+
 void Level::render(Engine &engine, std::vector<SDL_Event> &events) {
   const int RENDERING_SCALE = 3;
 
diff --git a/src/level.hpp b/src/level.hpp
index 9aff83c..55cbe85 100644
--- a/src/level.hpp
+++ b/src/level.hpp
@@ -21,6 +21,8 @@ public:
         std::vector<Building> buildings, std::vector<Unit> units,
         std::vector<Effect>);
 
+  static Level loadLevel(std::string path);
+
   void render(Engine &engine, std::vector<SDL_Event> &events);
 
 private:
diff --git a/src/main.cpp b/src/main.cpp
index bd7977b..9ac2030 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -30,6 +30,8 @@ int main() {
   Window window("Advanced Wars", 960, 960);
 
   Engine engine(window);
+  Level levell = Level::loadLevel("level.h5");
+  return 0;
 
   // Construct a level
   std::vector<Tile> tiles;
-- 
GitLab


From 8af9f64cad9c019f9f5e8173db2b51572df2d466 Mon Sep 17 00:00:00 2001
From: TheUltimateOptimist <digitalConfidence@web.de>
Date: Mon, 27 Jan 2025 19:46:42 +0100
Subject: [PATCH 2/3] implemented load level

---
 src/level.cpp | 21 +++++++++++++---
 src/main.cpp  | 70 +++------------------------------------------------
 2 files changed, 21 insertions(+), 70 deletions(-)

diff --git a/src/level.cpp b/src/level.cpp
index cde52ea..0d74825 100644
--- a/src/level.cpp
+++ b/src/level.cpp
@@ -44,15 +44,28 @@ Level::Level(std::string name, int width, int height, std::vector<Tile> tiles,
   int width = pt.get<int>("level.width");
   int height = pt.get<int>("level.height");
   std::string name = pt.get<std::string>("level.name");
+
+  // create tiles and buildings vector from tiles array
   std::vector<Tile> tiles;
+  std::vector<Building> buildings;
   tiles.reserve(width*height);
-  for (uint8_t value : level_tilesarray)
+  for (int i = 0; i < level_tilesarray.size(); i++) 
   {
-    tiles.push_back(Tile())
+    int x = i % width;
+    int y = i / width;
+    if (level_tilesarray[i] >= 50) {
+      tiles.push_back(Tile(TileId(TileId::PLAIN), x, y));
+      BuildingId building_id = static_cast<BuildingId>((level_tilesarray[i] - 50) % 5);
+      BuildingFaction faction_id = static_cast<BuildingFaction>((level_tilesarray[i] - 50) / 5);
+      buildings.push_back(Building(x, y, building_id, faction_id));
+    }
+    else {
+      TileId tile_id = static_cast<TileId>(level_tilesarray[i]);
+      tiles.push_back(Tile(tile_id, x, y));
+    }
   }
 
-
-  throw std::runtime_error("some");
+  return Level(name, width, height, tiles, buildings, {}, {});
 };
 
 void Level::render(Engine &engine, std::vector<SDL_Event> &events) {
diff --git a/src/main.cpp b/src/main.cpp
index 9ac2030..cb1a3ce 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -10,6 +10,8 @@
 #include <vector>
 #include <SDL2/SDL.h>
 #include <SDL_image.h>
+#include <stdexcept>
+
 
 using namespace advanced_wars;
 
@@ -30,76 +32,12 @@ int main() {
   Window window("Advanced Wars", 960, 960);
 
   Engine engine(window);
-  Level levell = Level::loadLevel("level.h5");
-  return 0;
-
-  // Construct a level
-  std::vector<Tile> tiles;
-  for (int y = 0; y < 20; y++) {
-    for (int x = 0; x < 20; x++) {
-      tiles.push_back(Tile(TileId::PLAIN, x, y));
-    }
-  }
-
-  // Fill the edges with water
-  for (size_t n = 0; n < 20; n++) {
-    // Vertical
-    tiles.at(n * 20) = Tile(TileId::WATER, 0, n);
-    tiles.at(n * 20 + 19) = Tile(TileId::WATER, 19, n);
-    // Horizontal
-    tiles.at(n) = Tile(TileId::WATER, n, 0);
-    tiles.at(19 * 20 + n) = Tile(TileId::WATER, n, 19);
-  }
-
-  // Make the edges cliffs
-  for (size_t n = 1; n < 19; n++) {
-    // Vertical
-    tiles.at(n * 20 + 1) = Tile(TileId::CLIFF_RIGHT, 1, n);
-    tiles.at(n * 20 + 18) = Tile(TileId::CLIFF_LEFT, 18, n);
-
-    // Horizontal
-    tiles.at(20 + n) = Tile(TileId::CLIFF_BOTTOM, n, 1);
-    tiles.at(18 * 20 + n) = Tile(TileId::CLIFF_TOP, n, 18);
-  }
-
-  // Fix the corners
-  tiles.at(20 + 1) = Tile(TileId::CLIFF_CORNER_TOP_LEFT, 1, 1);
-  tiles.at(20 + 18) = Tile(TileId::CLIFF_CORNER_TOP_RIGHT, 18, 1);
-  tiles.at(18 * 20 + 1) = Tile(TileId::CLIFF_CORNER_BOTTOM_LEFT, 1, 18);
-  tiles.at(18 * 20 + 18) = Tile(TileId::CLIFF_CORNER_BOTTOM_RIGHT, 18, 18);
-
-  // Buildings
-  std::vector<Building> buildings;
-
-  for (int y = 0; y < 6; y++) {
-    for (int x = 0; x < 5; x++) {
-      BuildingId id = static_cast<BuildingId>(x);
-      BuildingFaction faction = static_cast<BuildingFaction>(y);
-
-      buildings.push_back(Building(3 + x, 3 + 2 * y, id, faction));
-    }
-  }
-
-  // Units
-  std::vector<Unit> units;
-
-  for (int y = 0; y < 19; y++) {
-    for (int x = 0; x < 6; x++) {
-      units.push_back(Unit(x + 9, y + 2, UnitFaction::URED,
-                           static_cast<UnitId>(y), static_cast<UnitState>(x)));
-    }
-  }
-
-  std::vector<Effect> effects({Effect(3, 15, EffectId::LAND_EXPLOSION, true),
-                               Effect(5, 15, EffectId::AIR_EXPLOSION, true),
-                               Effect(5, 18, EffectId::NAVAL_EXPLOSION, true)});
 
-  Level level("Osnabrück", 20, 20, tiles, buildings, units, effects);
+  Level level = Level::loadLevel("spritesheet.h5");
 
   engine.set_scene(level);
 
-  Spritesheet spritesheet("/media/data/rust/sprite-extractor/spritesheet.h5",
-                          engine);
+  Spritesheet spritesheet("spritesheet.h5", engine);
 
   engine.set_spritesheet(spritesheet);
 
-- 
GitLab


From ff40eadf45ca0228b13af69bfda73382028a2030 Mon Sep 17 00:00:00 2001
From: TheUltimateOptimist <digitalConfidence@web.de>
Date: Thu, 30 Jan 2025 21:57:12 +0100
Subject: [PATCH 3/3] updated loadLevel for seperate level.h5

---
 src/level.cpp | 4 ++--
 src/main.cpp  | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/level.cpp b/src/level.cpp
index 0d74825..32da84f 100644
--- a/src/level.cpp
+++ b/src/level.cpp
@@ -31,11 +31,11 @@ Level::Level(std::string name, int width, int height, std::vector<Tile> tiles,
 
   // read level metadata
   std::string level_metadata;
-  file.getDataSet("level/metadata").read(level_metadata);
+  file.getDataSet("metadata").read(level_metadata);
 
   // read tilesarray
   std::vector<uint8_t> level_tilesarray;
-  file.getDataSet("level/tilesarray").read(level_tilesarray);
+  file.getDataSet("tilesarray").read(level_tilesarray);
 
   // extract metadata from xml
   std::istringstream xmlStream(level_metadata);
diff --git a/src/main.cpp b/src/main.cpp
index cb1a3ce..c4127df 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -33,7 +33,7 @@ int main() {
 
   Engine engine(window);
 
-  Level level = Level::loadLevel("spritesheet.h5");
+  Level level = Level::loadLevel("../res/level.h5");
 
   engine.set_scene(level);
 
-- 
GitLab