5 #ifndef TILESON_MAP_HPP
6 #define TILESON_MAP_HPP
8 #include "../objects/Color.hpp"
9 #include "../objects/Vector2.hpp"
11 #include "../interfaces/IJson.hpp"
12 #include "../json/NlohmannJson.hpp"
13 #include "../json/PicoJson.hpp"
15 #include "../json/Json11.hpp"
20 #include "../common/Enums.hpp"
27 inline Map() =
default;
44 [[nodiscard]]
inline const std::string &
getType()
const;
47 [[nodiscard]]
inline std::vector<tson::Layer> &
getLayers();
49 [[nodiscard]]
inline std::vector<tson::Tileset> &
getTilesets();
53 [[nodiscard]]
inline const std::map<uint32_t, tson::Tile *> &
getTileMap()
const;
59 inline T
get(
const std::string &name);
69 inline bool createTilesetData(
IJson &json);
70 inline void processData();
72 Colori m_backgroundColor; ;
74 int m_hexsideLength {};
76 std::vector<tson::Layer> m_layers;
78 int m_nextObjectId {};
79 std::string m_orientation;
81 std::string m_renderOrder;
82 std::string m_staggerAxis;
83 std::string m_staggerIndex;
84 std::string m_tiledVersion;
86 std::vector<tson::Tileset> m_tilesets;
91 std::string m_statusMessage {
"OK"};
93 std::map<uint32_t, tson::Tile*> m_tileMap;
96 int m_compressionLevel {-1};
100 std::map<uint32_t, tson::Tile> m_flaggedTileMap;
112 return m_properties.getValue<T>(name);
133 parse(json, decompressors);
143 m_decompressors = decompressors;
145 bool allFound =
true;
146 if(json.
count(
"compressionlevel") > 0)
147 m_compressionLevel = json[
"compressionlevel"].
get<
int>();
149 if(json.
count(
"backgroundcolor") > 0) m_backgroundColor =
Colori(json[
"backgroundcolor"].get<std::string>());
150 if(json.
count(
"width") > 0 && json.
count(
"height") > 0 )
151 m_size = {json[
"width"].
get<
int>(), json[
"height"].get<int>()};
else allFound =
false;
152 if(json.
count(
"hexsidelength") > 0) m_hexsideLength = json[
"hexsidelength"].get<int>();
153 if(json.
count(
"infinite") > 0) m_isInfinite = json[
"infinite"].get<bool>();
154 if(json.
count(
"nextlayerid") > 0) m_nextLayerId = json[
"nextlayerid"].get<int>();
155 if(json.
count(
"nextobjectid") > 0) m_nextObjectId = json[
"nextobjectid"].get<int>();
else allFound =
false;
156 if(json.
count(
"orientation") > 0) m_orientation = json[
"orientation"].get<std::string>();
else allFound =
false;
157 if(json.
count(
"renderorder") > 0) m_renderOrder = json[
"renderorder"].get<std::string>();
158 if(json.
count(
"staggeraxis") > 0) m_staggerAxis = json[
"staggeraxis"].get<std::string>();
159 if(json.
count(
"staggerindex") > 0) m_staggerIndex = json[
"staggerindex"].get<std::string>();
160 if(json.
count(
"tiledversion") > 0) m_tiledVersion = json[
"tiledversion"].get<std::string>();
else allFound =
false;
161 if(json.
count(
"tilewidth") > 0 && json.
count(
"tileheight") > 0 )
162 m_tileSize = {json[
"tilewidth"].
get<
int>(), json[
"tileheight"].get<int>()};
else allFound =
false;
163 if(json.
count(
"type") > 0) m_type = json[
"type"].get<std::string>();
170 if(json.
count(
"layers") > 0 && json[
"layers"].
isArray())
172 auto &array = json.
array(
"layers");
173 std::for_each(array.begin(), array.end(), [&](std::unique_ptr<IJson> &item)
175 m_layers.emplace_back(*item, this);
179 if(json.
count(
"properties") > 0 && json[
"properties"].
isArray())
181 auto &array = json.
array(
"properties");
182 std::for_each(array.begin(), array.end(), [&](std::unique_ptr<IJson> &item)
184 m_properties.add(*item);
187 if(!createTilesetData(json))
198 bool tson::Map::createTilesetData(
IJson &json)
201 if(json.
count(
"tilesets") > 0 && json[
"tilesets"].isArray())
204 auto &tilesets = json.
array(
"tilesets");
205 std::for_each(tilesets.begin(), tilesets.end(), [&](std::unique_ptr<IJson> &item)
207 m_tilesets.emplace_back();
212 std::for_each(tilesets.begin(), tilesets.end(), [&](std::unique_ptr<IJson> &item)
214 item->directory(json.directory());
215 if(!m_tilesets[i].parse(*item, this))
227 void tson::Map::processData()
230 for(
auto &tileset : m_tilesets)
232 std::for_each(tileset.getTiles().begin(), tileset.getTiles().end(), [&](
tson::Tile &tile) { m_tileMap[tile.getGid()] = &tile; });
234 std::for_each(m_layers.begin(), m_layers.end(), [&](
tson::Layer &layer)
236 layer.assignTileMap(&m_tileMap);
237 layer.createTileData(m_size, m_isInfinite);
238 const std::set<uint32_t> &flaggedTiles = layer.getUniqueFlaggedTiles();
239 for(uint32_t ftile : flaggedTiles)
241 tson::Tile tile {ftile, layer.getMap()};
242 if(m_tileMap.count(tile.getGid()))
244 tson::Tile *originalTile = m_tileMap[tile.getGid()];
245 tile.addTilesetAndPerformCalculations(originalTile->getTileset());
246 tile.setProperties(originalTile->getProperties());
247 m_flaggedTileMap[ftile] = tile;
248 m_tileMap[ftile] = &m_flaggedTileMap[ftile];
261 return m_backgroundColor;
279 return m_hexsideLength;
297 return m_nextLayerId;
306 return m_nextObjectId;
315 return m_orientation;
324 return m_renderOrder;
333 return m_staggerAxis;
342 return m_staggerIndex;
351 return m_tiledVersion;
410 auto result = std::find_if(m_layers.begin(), m_layers.end(), [&](
const tson::Layer &item) { return item.getName() == name; });
411 if(result == m_layers.end())
414 return &result.operator*();
425 auto result = std::find_if(m_tilesets.begin(), m_tilesets.end(), [&](
const tson::Tileset &item) {return item.getName() == name; });
426 if(result == m_tilesets.end())
429 return &result.operator*();
440 auto result = std::find_if(m_tilesets.begin(), m_tilesets.end(), [&](
const tson::Tileset &tileset)
442 int firstId = tileset.getFirstgid();
443 int lastId = (firstId + tileset.getTileCount()) - 1;
445 return (gid >= firstId && gid <= lastId);
447 if(result == m_tilesets.end())
450 return &result.operator*();
460 if(m_properties.hasProperty(name))
461 return m_properties.getProperty(name);
472 return m_statusMessage;
486 return m_decompressors;
496 return m_compressionLevel;
Definition: DecompressorContainer.hpp:16
T get(std::string_view key)
Definition: IJson.hpp:72
virtual bool isArray() const =0
virtual size_t count(std::string_view key) const =0
virtual std::vector< std::unique_ptr< IJson > > array()=0
void resolveFlaggedTiles()
Definition: Layer.hpp:617
const Vector2i & getSize() const
Definition: Map.hpp:268
ParseStatus getStatus() const
Definition: Map.hpp:465
const std::string & getType() const
Definition: Map.hpp:367
std::vector< tson::Layer > & getLayers()
Definition: Map.hpp:385
const Vector2i & getTileSize() const
Definition: Map.hpp:358
const std::string & getRenderOrder() const
Definition: Map.hpp:322
const std::string & getOrientation() const
Definition: Map.hpp:313
int getCompressionLevel() const
Definition: Map.hpp:494
std::vector< tson::Tileset > & getTilesets()
Definition: Map.hpp:403
const std::string & getStaggerAxis() const
Definition: Map.hpp:331
Tileset * getTileset(const std::string &name)
Definition: Map.hpp:423
const std::string & getStaggerIndex() const
Definition: Map.hpp:340
T get(const std::string &name)
Definition: Map.hpp:110
tson::Property * getProp(const std::string &name)
Definition: Map.hpp:458
int getNextObjectId() const
Definition: Map.hpp:304
Tileset * getTilesetByGid(uint32_t gid)
Definition: Map.hpp:438
bool parse(IJson &json, tson::DecompressorContainer *decompressors)
Definition: Map.hpp:141
Layer * getLayer(const std::string &name)
Definition: Map.hpp:408
PropertyCollection & getProperties()
Definition: Map.hpp:394
const std::string & getTiledVersion() const
Definition: Map.hpp:349
const std::map< uint32_t, tson::Tile * > & getTileMap() const
Definition: Map.hpp:479
const Colori & getBackgroundColor() const
Definition: Map.hpp:259
int getNextLayerId() const
Definition: Map.hpp:295
int getHexsideLength() const
Definition: Map.hpp:277
DecompressorContainer * getDecompressors()
Definition: Map.hpp:484
bool isInfinite() const
Definition: Map.hpp:286
const std::string & getStatusMessage() const
Definition: Map.hpp:470
Definition: PropertyCollection.hpp:15
Definition: Property.hpp:21
Definition: Tileset.hpp:24
Definition: Base64.hpp:12
ParseStatus
Definition: Enums.hpp:43
Vector2< int > Vector2i
Definition: Vector2.hpp:51
Color< uint8_t > Colori
Definition: Color.hpp:89