mirror of
https://github.com/ScrelliCopter/tmx2gba.git
synced 2025-02-21 03:29:25 +11:00
77 lines
1.9 KiB
C++
77 lines
1.9 KiB
C++
// SPDX-License-Identifier: Zlib
|
|
// SPDX-FileCopyrightText: (c) 2015-2024 a dinosaur
|
|
|
|
#include "convert.hpp"
|
|
#include "tmxreader.hpp"
|
|
#include <cassert>
|
|
|
|
|
|
bool convert::ConvertCharmap(std::vector<uint16_t>& 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<int>(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<uint8_t>(idx - 1) << 4;
|
|
|
|
out.push_back(static_cast<uint16_t>(tileIdx) | static_cast<uint16_t>(flags << 8));
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool convert::ConvertCollision(std::vector<uint8_t>& 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<uint8_t>(tmx.LidFromGid(clsTiles[i]));
|
|
out.emplace_back(id);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
bool convert::ConvertObjects(std::vector<uint32_t>& 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<int>(obj.x * 256.0f));
|
|
out.emplace_back(static_cast<int>(obj.y * 256.0f));
|
|
}
|
|
|
|
return true;
|
|
}
|