Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/utility/tileset_updater.hpp
diff options
context:
space:
mode:
authorKae <80987908+Novaenia@users.noreply.github.com>2023-06-20 14:33:09 +1000
committerKae <80987908+Novaenia@users.noreply.github.com>2023-06-20 14:33:09 +1000
commit6352e8e3196f78388b6c771073f9e03eaa612673 (patch)
treee23772f79a7fbc41bc9108951e9e136857484bf4 /source/utility/tileset_updater.hpp
parent6741a057e5639280d85d0f88ba26f000baa58f61 (diff)
everything everywhere
all at once
Diffstat (limited to 'source/utility/tileset_updater.hpp')
-rw-r--r--source/utility/tileset_updater.hpp102
1 files changed, 102 insertions, 0 deletions
diff --git a/source/utility/tileset_updater.hpp b/source/utility/tileset_updater.hpp
new file mode 100644
index 0000000..8848a00
--- /dev/null
+++ b/source/utility/tileset_updater.hpp
@@ -0,0 +1,102 @@
+#include "StarImage.hpp"
+#include "StarTilesetDatabase.hpp"
+
+namespace Star {
+
+STAR_STRUCT(Tile);
+STAR_CLASS(TileDatabase);
+STAR_CLASS(Tileset);
+
+struct Tile {
+ String source, database, tileset, name;
+ ImageConstPtr image;
+ Tiled::Properties properties;
+};
+
+class TileDatabase {
+public:
+ TileDatabase(String const& name);
+
+ void defineTile(TilePtr const& tile);
+ TilePtr getTile(String const& tileName) const;
+ String name() const;
+ StringSet tileNames() const;
+
+private:
+ Map<String, TilePtr> m_tiles;
+ String m_name;
+};
+
+class Tileset {
+public:
+ Tileset(String const& source, String const& name, TileDatabasePtr const& database);
+
+ void defineTile(TilePtr const& tile);
+ void exportTileset() const;
+
+ String name() const;
+ TileDatabasePtr database() const;
+
+private:
+ String imageDirName(String const& baseExportDir) const;
+ String relativePathBase() const;
+ Json imageFileReference(String const& fileName) const;
+ Json tileImageReference(String const& tileName, String const& database) const;
+
+ // Exports an image for each tile into its own file. Tiles can represent
+ // objects with all different sizes, so we use Tiled's "collection of images"
+ // tileset feature, which puts each image in its own file.
+ void exportTilesetImages(String const& exportDir) const;
+
+ // Read the tileset from the given path, or create a new tileset root
+ // structure if it doesn't already exist.
+ Json getTilesetJson(String const& tilesetPath) const;
+
+ // Determine which tiles already exist in the tileset, returning a map
+ // which contains the id of each named tile, and the next available Id after
+ // the highest Id seen in the tileset.
+ pair<StringMap<size_t>, size_t> indexExistingTiles(Json tileset) const;
+
+ // Update existing and insert new tile definitions in the tileProperties and
+ // tileImages objects.
+ StringSet updateTiles(JsonObject& tileProperties,
+ JsonObject& tileImages,
+ StringMap<size_t> const& existingTiles,
+ size_t& nextId,
+ String const& tilesetPath) const;
+
+ // Mark the given tiles as 'invalid' so they can't be used. (Actually removing
+ // them from the tileset would cause the tile indices to change and break
+ // existing maps.)
+ void invalidateTiles(StringSet const& invalidTiles,
+ StringMap<size_t> const& existingTiles,
+ JsonObject& tileProperties,
+ JsonObject& tileImages,
+ String const& tilesetPath) const;
+
+ String m_source, m_name;
+ List<TilePtr> m_tiles;
+ TileDatabasePtr m_database;
+};
+
+class TilesetUpdater {
+public:
+ void defineAssetSource(String const& source);
+ void defineTile(TilePtr const& tile);
+ void exportTilesets();
+
+private:
+ TileDatabasePtr const& getDatabase(TilePtr const& tile);
+ TilesetPtr const& getTileset(TilePtr const& tile);
+
+ // Asset Source -> Tileset Name -> Tileset
+ StringMap<StringMap<TilesetPtr>> m_tilesets;
+ // Asset Source -> Database Name -> Database
+ StringMap<StringMap<TileDatabasePtr>> m_databases;
+
+ // Images that existed before running update_tilesets:
+ // Asset Source -> Database Name -> Tile Name
+ StringMap<StringMap<StringSet>> m_preexistingImages;
+};
+
+}