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

summaryrefslogtreecommitdiff
path: root/source/utility/tileset_updater.hpp
blob: 8848a0075d50ba66ad1ae141f2bfa9ee8c73118e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
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;
};

}