Plug leaks in Metatile
This commit is contained in:
parent
8e2388cf62
commit
8187b2d4bb
9 changed files with 46 additions and 36 deletions
|
@ -11,8 +11,9 @@ class Metatile
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Metatile();
|
Metatile();
|
||||||
|
Metatile(const Metatile &other);
|
||||||
public:
|
public:
|
||||||
QList<Tile> *tiles = nullptr;
|
QList<Tile> tiles;
|
||||||
uint16_t behavior; // 8 bits RSE, 9 bits FRLG
|
uint16_t behavior; // 8 bits RSE, 9 bits FRLG
|
||||||
uint8_t layerType;
|
uint8_t layerType;
|
||||||
uint8_t encounterType; // FRLG only
|
uint8_t encounterType; // FRLG only
|
||||||
|
|
|
@ -2,10 +2,21 @@
|
||||||
#include "tileset.h"
|
#include "tileset.h"
|
||||||
#include "project.h"
|
#include "project.h"
|
||||||
|
|
||||||
Metatile::Metatile()
|
Metatile::Metatile() :
|
||||||
{
|
behavior(0),
|
||||||
tiles = new QList<Tile>;
|
layerType(0),
|
||||||
}
|
encounterType(0),
|
||||||
|
terrainType(0)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
Metatile::Metatile(const Metatile &other) :
|
||||||
|
tiles(other.tiles),
|
||||||
|
behavior(other.behavior),
|
||||||
|
layerType(other.layerType),
|
||||||
|
encounterType(other.encounterType),
|
||||||
|
terrainType(other.terrainType),
|
||||||
|
label(other.label)
|
||||||
|
{ }
|
||||||
|
|
||||||
Metatile* Metatile::copy() {
|
Metatile* Metatile::copy() {
|
||||||
Metatile *copy = new Metatile;
|
Metatile *copy = new Metatile;
|
||||||
|
@ -13,10 +24,9 @@ Metatile* Metatile::copy() {
|
||||||
copy->layerType = this->layerType;
|
copy->layerType = this->layerType;
|
||||||
copy->encounterType = this->encounterType;
|
copy->encounterType = this->encounterType;
|
||||||
copy->terrainType = this->terrainType;
|
copy->terrainType = this->terrainType;
|
||||||
copy->tiles = new QList<Tile>;
|
|
||||||
copy->label = this->label;
|
copy->label = this->label;
|
||||||
for (Tile tile : *this->tiles) {
|
for (const Tile &tile : this->tiles) {
|
||||||
copy->tiles->append(tile);
|
copy->tiles.append(tile);
|
||||||
}
|
}
|
||||||
return copy;
|
return copy;
|
||||||
}
|
}
|
||||||
|
@ -27,8 +37,8 @@ void Metatile::copyInPlace(Metatile *other) {
|
||||||
this->encounterType = other->encounterType;
|
this->encounterType = other->encounterType;
|
||||||
this->terrainType = other->terrainType;
|
this->terrainType = other->terrainType;
|
||||||
this->label = other->label;
|
this->label = other->label;
|
||||||
for (int i = 0; i < this->tiles->length(); i++) {
|
for (int i = 0; i < this->tiles.length(); i++) {
|
||||||
(*this->tiles)[i] = other->tiles->at(i);
|
this->tiles[i] = other->tiles.at(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -75,14 +75,14 @@ QList<Metatile*> *MetatileParser::parse(QString filepath, bool *error, bool prim
|
||||||
QList<Metatile*> *metatiles = new QList<Metatile*>();
|
QList<Metatile*> *metatiles = new QList<Metatile*>();
|
||||||
for (int i = 0; i < numMetatiles; i++) {
|
for (int i = 0; i < numMetatiles; i++) {
|
||||||
Metatile *metatile = new Metatile();
|
Metatile *metatile = new Metatile();
|
||||||
QList<Tile> *tiles = new QList<Tile>();
|
QList<Tile> tiles;
|
||||||
for (int j = 0; j < 8; j++) {
|
for (int j = 0; j < 8; j++) {
|
||||||
int metatileOffset = 4 + i * metatileSize + j * 2;
|
int metatileOffset = 4 + i * metatileSize + j * 2;
|
||||||
uint16_t word = static_cast<uint16_t>(
|
uint16_t word = static_cast<uint16_t>(
|
||||||
static_cast<unsigned char>(in.at(metatileOffset)) |
|
static_cast<unsigned char>(in.at(metatileOffset)) |
|
||||||
(static_cast<unsigned char>(in.at(metatileOffset + 1)) << 8));
|
(static_cast<unsigned char>(in.at(metatileOffset + 1)) << 8));
|
||||||
Tile tile(word & 0x3ff, (word >> 10) & 1, (word >> 11) & 1, (word >> 12) & 0xf);
|
Tile tile(word & 0x3ff, (word >> 10) & 1, (word >> 11) & 1, (word >> 12) & 0xf);
|
||||||
tiles->append(tile);
|
tiles.append(tile);
|
||||||
}
|
}
|
||||||
|
|
||||||
int attrOffset = 4 + (numMetatiles * metatileSize) + (i * attrSize);
|
int attrOffset = 4 + (numMetatiles * metatileSize) + (i * attrSize);
|
||||||
|
|
|
@ -71,8 +71,7 @@ Metatile* Tileset::getMetatile(int index, Tileset *primaryTileset, Tileset *seco
|
||||||
if (!tileset || !tileset->metatiles) {
|
if (!tileset || !tileset->metatiles) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
Metatile *metatile = tileset->metatiles->value(local_index, nullptr);
|
return tileset->metatiles->value(local_index, nullptr);
|
||||||
return metatile;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Tileset::metatileIsValid(uint16_t metatileId, Tileset *primaryTileset, Tileset *secondaryTileset) {
|
bool Tileset::metatileIsValid(uint16_t metatileId, Tileset *primaryTileset, Tileset *secondaryTileset) {
|
||||||
|
|
|
@ -1219,16 +1219,16 @@ void MainWindow::on_actionNew_Tileset_triggered() {
|
||||||
int tilesPerMetatile = projectConfig.getTripleLayerMetatilesEnabled() ? 12 : 8;
|
int tilesPerMetatile = projectConfig.getTripleLayerMetatilesEnabled() ? 12 : 8;
|
||||||
Metatile *mt = new Metatile();
|
Metatile *mt = new Metatile();
|
||||||
for(int j = 0; j < tilesPerMetatile; ++j){
|
for(int j = 0; j < tilesPerMetatile; ++j){
|
||||||
Tile *tile = new Tile();
|
Tile tile;
|
||||||
//Create a checkerboard-style dummy tileset
|
//Create a checkerboard-style dummy tileset
|
||||||
if(((i / 8) % 2) == 0)
|
if(((i / 8) % 2) == 0)
|
||||||
tile->tile = ((i % 2) == 0) ? 1 : 2;
|
tile.tile = ((i % 2) == 0) ? 1 : 2;
|
||||||
else
|
else
|
||||||
tile->tile = ((i % 2) == 1) ? 1 : 2;
|
tile.tile = ((i % 2) == 1) ? 1 : 2;
|
||||||
tile->xflip = false;
|
tile.xflip = false;
|
||||||
tile->yflip = false;
|
tile.yflip = false;
|
||||||
tile->palette = 0;
|
tile.palette = 0;
|
||||||
mt->tiles->append(*tile);
|
mt->tiles.append(tile);
|
||||||
}
|
}
|
||||||
mt->behavior = 0;
|
mt->behavior = 0;
|
||||||
mt->layerType = 0;
|
mt->layerType = 0;
|
||||||
|
@ -1239,7 +1239,7 @@ void MainWindow::on_actionNew_Tileset_triggered() {
|
||||||
}
|
}
|
||||||
newSet->palettes = new QList<QList<QRgb>>();
|
newSet->palettes = new QList<QList<QRgb>>();
|
||||||
newSet->palettePreviews = new QList<QList<QRgb>>();
|
newSet->palettePreviews = new QList<QList<QRgb>>();
|
||||||
newSet->palettePaths = *new QList<QString>();
|
newSet->palettePaths.clear();
|
||||||
for(int i = 0; i < 16; ++i) {
|
for(int i = 0; i < 16; ++i) {
|
||||||
QList<QRgb> *currentPal = new QList<QRgb>();
|
QList<QRgb> *currentPal = new QList<QRgb>();
|
||||||
for(int i = 0; i < 16;++i) {
|
for(int i = 0; i < 16;++i) {
|
||||||
|
|
|
@ -1088,7 +1088,7 @@ void Project::saveTilesetMetatiles(Tileset *tileset) {
|
||||||
for (Metatile *metatile : *tileset->metatiles) {
|
for (Metatile *metatile : *tileset->metatiles) {
|
||||||
int numTiles = projectConfig.getTripleLayerMetatilesEnabled() ? 12 : 8;
|
int numTiles = projectConfig.getTripleLayerMetatilesEnabled() ? 12 : 8;
|
||||||
for (int i = 0; i < numTiles; i++) {
|
for (int i = 0; i < numTiles; i++) {
|
||||||
Tile tile = metatile->tiles->at(i);
|
Tile tile = metatile->tiles.at(i);
|
||||||
uint16_t value = static_cast<uint16_t>((tile.tile & 0x3ff)
|
uint16_t value = static_cast<uint16_t>((tile.tile & 0x3ff)
|
||||||
| ((tile.xflip & 1) << 10)
|
| ((tile.xflip & 1) << 10)
|
||||||
| ((tile.yflip & 1) << 11)
|
| ((tile.yflip & 1) << 11)
|
||||||
|
@ -1626,7 +1626,7 @@ void Project::loadTilesetMetatiles(Tileset* tileset) {
|
||||||
tile.xflip = (word >> 10) & 1;
|
tile.xflip = (word >> 10) & 1;
|
||||||
tile.yflip = (word >> 11) & 1;
|
tile.yflip = (word >> 11) & 1;
|
||||||
tile.palette = (word >> 12) & 0xf;
|
tile.palette = (word >> 12) & 0xf;
|
||||||
metatile->tiles->append(tile);
|
metatile->tiles.append(tile);
|
||||||
}
|
}
|
||||||
metatiles->append(metatile);
|
metatiles->append(metatile);
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,7 @@ QImage getMetatileImage(
|
||||||
metatile_image.fill(Qt::black);
|
metatile_image.fill(Qt::black);
|
||||||
|
|
||||||
Metatile* metatile = Tileset::getMetatile(tile, primaryTileset, secondaryTileset);
|
Metatile* metatile = Tileset::getMetatile(tile, primaryTileset, secondaryTileset);
|
||||||
if (!metatile || !metatile->tiles) {
|
if (!metatile) {
|
||||||
metatile_image.fill(Qt::magenta);
|
metatile_image.fill(Qt::magenta);
|
||||||
return metatile_image;
|
return metatile_image;
|
||||||
}
|
}
|
||||||
|
@ -46,7 +46,7 @@ QImage getMetatileImage(
|
||||||
for (int x = 0; x < 2; x++) {
|
for (int x = 0; x < 2; x++) {
|
||||||
int l = layerOrder.size() >= numLayers ? layerOrder[layer] : layer;
|
int l = layerOrder.size() >= numLayers ? layerOrder[layer] : layer;
|
||||||
int bottomLayer = layerOrder.size() >= numLayers ? layerOrder[0] : 0;
|
int bottomLayer = layerOrder.size() >= numLayers ? layerOrder[0] : 0;
|
||||||
Tile tile_ = metatile->tiles->value((y * 2) + x + (l * 4));
|
Tile tile_ = metatile->tiles.value((y * 2) + x + (l * 4));
|
||||||
QImage tile_image = getTileImage(tile_.tile, primaryTileset, secondaryTileset);
|
QImage tile_image = getTileImage(tile_.tile, primaryTileset, secondaryTileset);
|
||||||
if (tile_image.isNull()) {
|
if (tile_image.isNull()) {
|
||||||
// Some metatiles specify tiles that are outside the valid range.
|
// Some metatiles specify tiles that are outside the valid range.
|
||||||
|
|
|
@ -25,7 +25,7 @@ void MetatileLayersItem::draw() {
|
||||||
QPainter painter(&pixmap);
|
QPainter painter(&pixmap);
|
||||||
int numTiles = isTripleLayerMetatile ? 12 : 8;
|
int numTiles = isTripleLayerMetatile ? 12 : 8;
|
||||||
for (int i = 0; i < numTiles; i++) {
|
for (int i = 0; i < numTiles; i++) {
|
||||||
Tile tile = this->metatile->tiles->at(i);
|
Tile tile = this->metatile->tiles.at(i);
|
||||||
QImage tileImage = getPalettedTileImage(tile.tile, this->primaryTileset, this->secondaryTileset, tile.palette, true)
|
QImage tileImage = getPalettedTileImage(tile.tile, this->primaryTileset, this->secondaryTileset, tile.palette, true)
|
||||||
.mirrored(tile.xflip, tile.yflip)
|
.mirrored(tile.xflip, tile.yflip)
|
||||||
.scaled(16, 16);
|
.scaled(16, 16);
|
||||||
|
|
|
@ -361,7 +361,7 @@ void TilesetEditor::onSelectedTilesChanged() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void TilesetEditor::onMetatileLayerTileChanged(int x, int y) {
|
void TilesetEditor::onMetatileLayerTileChanged(int x, int y) {
|
||||||
const QList<QPoint> tileCoords = QList<QPoint>{
|
static const QList<QPoint> tileCoords = QList<QPoint>{
|
||||||
QPoint(0, 0),
|
QPoint(0, 0),
|
||||||
QPoint(1, 0),
|
QPoint(1, 0),
|
||||||
QPoint(0, 1),
|
QPoint(0, 1),
|
||||||
|
@ -387,11 +387,11 @@ void TilesetEditor::onMetatileLayerTileChanged(int x, int y) {
|
||||||
if (tileIndex < maxTileIndex
|
if (tileIndex < maxTileIndex
|
||||||
&& tileCoords.at(tileIndex).x() >= x
|
&& tileCoords.at(tileIndex).x() >= x
|
||||||
&& tileCoords.at(tileIndex).y() >= y){
|
&& tileCoords.at(tileIndex).y() >= y){
|
||||||
Tile *tile = &(*this->metatile->tiles)[tileIndex];
|
Tile &tile = this->metatile->tiles[tileIndex];
|
||||||
tile->tile = tiles.at(selectedTileIndex).tile;
|
tile.tile = tiles.at(selectedTileIndex).tile;
|
||||||
tile->xflip = tiles.at(selectedTileIndex).xflip;
|
tile.xflip = tiles.at(selectedTileIndex).xflip;
|
||||||
tile->yflip = tiles.at(selectedTileIndex).yflip;
|
tile.yflip = tiles.at(selectedTileIndex).yflip;
|
||||||
tile->palette = tiles.at(selectedTileIndex).palette;
|
tile.palette = tiles.at(selectedTileIndex).palette;
|
||||||
}
|
}
|
||||||
selectedTileIndex++;
|
selectedTileIndex++;
|
||||||
}
|
}
|
||||||
|
@ -416,7 +416,7 @@ void TilesetEditor::onMetatileLayerSelectionChanged(QPoint selectionOrigin, int
|
||||||
for (int i = 0; i < width; i++) {
|
for (int i = 0; i < width; i++) {
|
||||||
int tileIndex = ((x + i) / 2 * 4) + ((y + j) * 2) + ((x + i) % 2);
|
int tileIndex = ((x + i) / 2 * 4) + ((y + j) * 2) + ((x + i) % 2);
|
||||||
if (tileIndex < maxTileIndex) {
|
if (tileIndex < maxTileIndex) {
|
||||||
tiles.append(this->metatile->tiles->at(tileIndex));
|
tiles.append(this->metatile->tiles.at(tileIndex));
|
||||||
tileIdxs.append(tileIndex);
|
tileIdxs.append(tileIndex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -740,7 +740,7 @@ void TilesetEditor::on_actionChange_Metatiles_Count_triggered()
|
||||||
metatile->encounterType = 0;
|
metatile->encounterType = 0;
|
||||||
metatile->terrainType = 0;
|
metatile->terrainType = 0;
|
||||||
for (int i = 0; i < numTiles; i++) {
|
for (int i = 0; i < numTiles; i++) {
|
||||||
metatile->tiles->append(tile);
|
metatile->tiles.append(tile);
|
||||||
}
|
}
|
||||||
this->primaryTileset->metatiles->append(metatile);
|
this->primaryTileset->metatiles->append(metatile);
|
||||||
}
|
}
|
||||||
|
@ -760,7 +760,7 @@ void TilesetEditor::on_actionChange_Metatiles_Count_triggered()
|
||||||
metatile->encounterType = 0;
|
metatile->encounterType = 0;
|
||||||
metatile->terrainType = 0;
|
metatile->terrainType = 0;
|
||||||
for (int i = 0; i < numTiles; i++) {
|
for (int i = 0; i < numTiles; i++) {
|
||||||
metatile->tiles->append(tile);
|
metatile->tiles.append(tile);
|
||||||
}
|
}
|
||||||
this->secondaryTileset->metatiles->append(metatile);
|
this->secondaryTileset->metatiles->append(metatile);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue