10#include "../objects/Color.hpp"
11#include "../objects/Vector2.hpp"
13#include "../interfaces/IJson.hpp"
14#include "../json/NlohmannJson.hpp"
15#include "../json/PicoJson.hpp"
17#include "../json/Json11.hpp"
22#include "../common/Enums.hpp"
26 using LinkedFileParser = std::function<std::unique_ptr<IJson>(std::string relativePath)>;
32 inline Map() =
default;
49 [[nodiscard]]
inline const std::string &
getType()
const;
50 [[nodiscard]]
inline const std::string &
getClassType()
const;
55 [[nodiscard]]
inline std::vector<tson::Layer> &
getLayers();
57 [[nodiscard]]
inline std::vector<tson::Tileset> &
getTilesets();
61 [[nodiscard]]
inline const std::map<uint32_t, tson::Tile *> &
getTileMap()
const;
67 inline T
get(
const std::string &name);
78 inline IJson* parseLinkedFile(
const std::string& path);
79 inline bool createTilesetData(
IJson &json);
80 inline void processData();
82 Colori m_backgroundColor; ;
84 int m_hexsideLength {};
86 std::vector<tson::Layer> m_layers;
88 int m_nextObjectId {};
89 std::string m_orientation;
91 std::string m_renderOrder;
92 std::string m_staggerAxis;
93 std::string m_staggerIndex;
94 std::string m_tiledVersion;
96 std::vector<tson::Tileset> m_tilesets;
102 std::string m_statusMessage {
"OK"};
104 std::map<uint32_t, tson::Tile*> m_tileMap{};
107 int m_compressionLevel {-1};
112 std::map<uint32_t, tson::Tile> m_flaggedTileMap{};
114 std::string m_classType{};
115 std::shared_ptr<tson::TiledClass> m_class {};
118 std::map<std::string, std::unique_ptr<IJson>> m_linkedFiles;
130 return m_properties.getValue<T>(name);
152 parse(json, decompressors, project, linkedFileParser);
163 m_decompressors = decompressors;
165 m_linkedFileParser = linkedFileParser;
167 if(!m_linkedFileParser)
170 m_linkedFileParser = [&json](std::string relativePath) -> std::unique_ptr<IJson>
175 std::unique_ptr<IJson> linkedFileJson = json.
create();
176 bool parseOk = linkedFileJson->parse(json.
directory() / relativePath);
178 return linkedFileJson;
184 bool allFound =
true;
185 if(json.
count(
"compressionlevel") > 0)
186 m_compressionLevel = json[
"compressionlevel"].get<int>();
188 if(json.
count(
"backgroundcolor") > 0) m_backgroundColor =
Colori(json[
"backgroundcolor"].get<std::string>());
189 if(json.
count(
"width") > 0 && json.
count(
"height") > 0 )
190 m_size = {json[
"width"].
get<
int>(), json[
"height"].get<int>()};
else allFound =
false;
191 if(json.
count(
"hexsidelength") > 0) m_hexsideLength = json[
"hexsidelength"].get<int>();
192 if(json.
count(
"infinite") > 0) m_isInfinite = json[
"infinite"].get<bool>();
193 if(json.
count(
"nextlayerid") > 0) m_nextLayerId = json[
"nextlayerid"].get<int>();
194 if(json.
count(
"nextobjectid") > 0) m_nextObjectId = json[
"nextobjectid"].get<int>();
else allFound =
false;
195 if(json.
count(
"orientation") > 0) m_orientation = json[
"orientation"].get<std::string>();
else allFound =
false;
196 if(json.
count(
"renderorder") > 0) m_renderOrder = json[
"renderorder"].get<std::string>();
197 if(json.
count(
"staggeraxis") > 0) m_staggerAxis = json[
"staggeraxis"].get<std::string>();
198 if(json.
count(
"staggerindex") > 0) m_staggerIndex = json[
"staggerindex"].get<std::string>();
199 if(json.
count(
"tiledversion") > 0) m_tiledVersion = json[
"tiledversion"].get<std::string>();
else allFound =
false;
200 if(json.
count(
"tilewidth") > 0 && json.
count(
"tileheight") > 0 )
201 m_tileSize = {json[
"tilewidth"].
get<
int>(), json[
"tileheight"].get<int>()};
else allFound =
false;
202 if(json.
count(
"type") > 0) m_type = json[
"type"].get<std::string>();
203 if(json.
count(
"class") > 0) m_classType = json[
"class"].get<std::string>();
210 if(json.
count(
"layers") > 0 && json[
"layers"].
isArray())
212 auto &array = json.
array(
"layers");
213 std::for_each(array.begin(), array.end(), [&](std::unique_ptr<IJson> &item)
215 m_layers.emplace_back(*item, this);
219 if(json.
count(
"properties") > 0 && json[
"properties"].
isArray())
221 auto &array = json.
array(
"properties");
222 std::for_each(array.begin(), array.end(), [&](std::unique_ptr<IJson> &item)
224 m_properties.add(*item, m_project);
229 if(json.
count(
"parallaxoriginx") > 0)
230 parallaxOrigin.
x = json[
"parallaxoriginx"].
get<
float>();
231 if(json.
count(
"parallaxoriginy") > 0)
232 parallaxOrigin.y = json[
"parallaxoriginy"].
get<
float>();
234 m_parallaxOrigin = parallaxOrigin;
236 if(!createTilesetData(json))
241 m_linkedFiles.clear();
251tson::IJson* tson::Map::parseLinkedFile(
const std::string& relativePath)
253 auto it = m_linkedFiles.find(relativePath);
254 if(it == m_linkedFiles.end())
256 if (!m_linkedFileParser)
return nullptr;
257 std::unique_ptr<IJson> linkedFileJson = m_linkedFileParser(relativePath);
261 auto result = m_linkedFiles.emplace(relativePath, std::move(linkedFileJson));
262 return result.first->second.get();
264 else return it->second.get();
270bool tson::Map::createTilesetData(IJson &json)
273 if(json.count(
"tilesets") > 0 && json[
"tilesets"].isArray())
276 auto &tilesets = json.array(
"tilesets");
277 std::for_each(tilesets.begin(), tilesets.end(), [&](std::unique_ptr<IJson> &)
279 m_tilesets.emplace_back();
284 std::for_each(tilesets.begin(), tilesets.end(), [&](std::unique_ptr<IJson> &item)
286 item->directory(json.directory());
287 if(!m_tilesets[i].parse(*item, this))
299void tson::Map::processData()
302 for(
auto &tileset : m_tilesets)
304 std::set<std::uint32_t> usedIds;
305 for(
auto& tile : tileset.getTiles())
307 if (usedIds.count(tile.getGid()) != 0)
311 usedIds.insert(tile.getGid());
312 m_tileMap[tile.getGid()] = &tile;
315 std::for_each(m_layers.begin(), m_layers.end(), [&](
tson::Layer &layer)
317 layer.assignTileMap(&m_tileMap);
318 layer.createTileData(m_size, m_isInfinite);
319 const std::set<uint32_t> &flaggedTiles = layer.getUniqueFlaggedTiles();
320 for(uint32_t ftile : flaggedTiles)
322 tson::Tile tile {ftile, layer.getMap()};
323 if(m_tileMap.count(tile.getGid()))
325 tson::Tile *originalTile = m_tileMap[tile.getGid()];
326 tile.addTilesetAndPerformCalculations(originalTile->getTileset());
327 tile.setProperties(originalTile->getProperties());
328 m_flaggedTileMap[ftile] = tile;
329 m_tileMap[ftile] = &m_flaggedTileMap[ftile];
342 return m_backgroundColor;
360 return m_hexsideLength;
378 return m_nextLayerId;
387 return m_nextObjectId;
396 return m_orientation;
405 return m_renderOrder;
414 return m_staggerAxis;
423 return m_staggerIndex;
432 return m_tiledVersion;
491 auto result = std::find_if(m_layers.begin(), m_layers.end(), [&](
const tson::Layer &item) { return item.getName() == name; });
492 if(result == m_layers.end())
495 return &result.operator*();
506 auto result = std::find_if(m_tilesets.begin(), m_tilesets.end(), [&](
const tson::Tileset &item) {return item.getName() == name; });
507 if(result == m_tilesets.end())
510 return &result.operator*();
521 auto result = std::find_if(m_tilesets.begin(), m_tilesets.end(), [&](
const tson::Tileset &tileset)
523 auto const firstId = static_cast<uint32_t>(tileset.getFirstgid());
524 auto const lastId = static_cast<uint32_t>((firstId + tileset.getTileCount()) - 1);
526 return (gid >= firstId && gid <= lastId);
528 if(result == m_tilesets.end())
531 return &result.operator*();
541 if(m_properties.hasProperty(name))
542 return m_properties.getProperty(name);
553 return m_statusMessage;
567 return m_decompressors;
577 return m_compressionLevel;
587 return m_parallaxOrigin;
Definition DecompressorContainer.hpp:16
virtual std::unique_ptr< IJson > create()=0
T get(std::string_view key)
Definition IJson.hpp:82
virtual bool isArray() const =0
virtual fs::path directory() 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:547
const Vector2i & getSize() const
Definition Map.hpp:349
ParseStatus getStatus() const
Definition Map.hpp:546
const std::string & getType() const
Definition Map.hpp:448
std::vector< tson::Layer > & getLayers()
Definition Map.hpp:466
const Vector2i & getTileSize() const
Definition Map.hpp:439
const std::string & getRenderOrder() const
Definition Map.hpp:403
const std::string & getOrientation() const
Definition Map.hpp:394
bool parse(IJson &json, tson::DecompressorContainer *decompressors, tson::Project *project, tson::LinkedFileParser linkedFileParser=nullptr)
Definition Map.hpp:161
int getCompressionLevel() const
Definition Map.hpp:575
std::vector< tson::Tileset > & getTilesets()
Definition Map.hpp:484
const std::string & getStaggerAxis() const
Definition Map.hpp:412
Tileset * getTileset(const std::string &name)
Definition Map.hpp:504
const std::string & getStaggerIndex() const
Definition Map.hpp:421
T get(const std::string &name)
Definition Map.hpp:128
tson::Property * getProp(const std::string &name)
Definition Map.hpp:539
const Vector2f & getParallaxOrigin() const
Definition Map.hpp:585
int getNextObjectId() const
Definition Map.hpp:385
Tileset * getTilesetByGid(uint32_t gid)
Definition Map.hpp:519
Layer * getLayer(const std::string &name)
Definition Map.hpp:489
PropertyCollection & getProperties()
Definition Map.hpp:475
const std::string & getTiledVersion() const
Definition Map.hpp:430
const std::map< uint32_t, tson::Tile * > & getTileMap() const
Definition Map.hpp:560
const Colori & getBackgroundColor() const
Definition Map.hpp:340
const std::string & getClassType() const
Definition Map.hpp:595
int getNextLayerId() const
Definition Map.hpp:376
tson::TiledClass * getClass()
Definition tileson_forward.hpp:20
int getHexsideLength() const
Definition Map.hpp:358
DecompressorContainer * getDecompressors()
Definition Map.hpp:565
Project * getProject()
Definition Map.hpp:590
bool isInfinite() const
Definition Map.hpp:367
const std::string & getStatusMessage() const
Definition Map.hpp:551
Definition Project.hpp:20
Definition PropertyCollection.hpp:15
Definition Property.hpp:23
Definition TiledClass.hpp:11
Definition Tileset.hpp:24
T x
Definition Vector2.hpp:21
std::function< std::unique_ptr< IJson >(std::string relativePath)> LinkedFileParser
Definition Map.hpp:26
ParseStatus
Definition Enums.hpp:46
Vector2< int > Vector2i
Definition Vector2.hpp:51
Color< uint8_t > Colori
Definition Color.hpp:89