// SPDX-License-Identifier: Zlib // SPDX-FileCopyrightText: (c) 2015-2024 a dinosaur #include "convert.hpp" #include "tmxreader.hpp" #include bool convert::ConvertCharmap(std::vector& out, int idxOffset, uint32_t defaultPal, const TmxReader& tmx) { const auto gfxTiles = tmx.GetGraphicsTiles(); const auto palTiles = tmx.GetPaletteTiles(); const size_t numTiles = tmx.TileCount(); assert(gfxTiles.size() == numTiles); assert(!palTiles.has_value() || palTiles.value().size() == numTiles); out.reserve(numTiles); for (size_t i = 0; i < numTiles; ++i) { const TmxReader::Tile tile = gfxTiles[i]; int tileIdx = std::max(0, static_cast(tmx.LidFromGid(tile.id)) + idxOffset); uint8_t flags = 0x0; // Get flipped! flags |= (tile.flags & TmxReader::FLIP_HORZ) ? 0x4 : 0x0; flags |= (tile.flags & TmxReader::FLIP_VERT) ? 0x8 : 0x0; // Determine palette ID uint32_t idx = 0; if (palTiles.has_value()) idx = tmx.LidFromGid(palTiles.value()[i]); if (idx == 0) idx = defaultPal + 1; flags |= static_cast(idx - 1) << 4; out.push_back(static_cast(tileIdx) | static_cast(flags << 8)); } return true; } bool convert::ConvertCollision(std::vector& out, const TmxReader& tmx) { assert(tmx.GetCollisionTiles().has_value()); const auto clsTiles = tmx.GetCollisionTiles().value(); size_t numTiles = tmx.TileCount(); assert(clsTiles.size() == numTiles); out.reserve(numTiles); for (size_t i = 0; i < numTiles; ++i) { uint8_t id = static_cast(tmx.LidFromGid(clsTiles[i])); out.emplace_back(id); } return true; } bool convert::ConvertObjects(std::vector& out, const TmxReader& tmx) { assert(tmx.GetObjects().has_value()); const auto objects = tmx.GetObjects().value(); for (auto obj : objects) { out.push_back(obj.id); out.emplace_back(static_cast(obj.x * 256.0f)); out.emplace_back(static_cast(obj.y * 256.0f)); } return true; }