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