diff --git a/include/core/tile.h b/include/core/tile.h index 1a862987..bd673f74 100644 --- a/include/core/tile.h +++ b/include/core/tile.h @@ -18,6 +18,7 @@ public: int palette; uint16_t rawValue() const; + void sanitize(); static int getIndexInTileset(int); }; diff --git a/src/core/tile.cpp b/src/core/tile.cpp index 56465160..10baa720 100644 --- a/src/core/tile.cpp +++ b/src/core/tile.cpp @@ -30,6 +30,17 @@ uint16_t Tile::rawValue() const { | ((this->palette & 0xF) << 12)); } +void Tile::sanitize() { + if (tileId < 0 || tileId >= Project::getNumTilesTotal()) { + logWarn(QString("Resetting tile's invalid tile id '%1' to 0.").arg(tileId)); + tileId = 0; + } + if (palette < 0 || palette >= Project::getNumPalettesTotal()) { + logWarn(QString("Resetting tile's invalid palette id '%1' to 0.").arg(palette)); + palette = 0; + } +} + int Tile::getIndexInTileset(int tileId) { if (tileId < Project::getNumTilesPrimary()) { return tileId; diff --git a/src/core/tileset.cpp b/src/core/tileset.cpp index b87cfa69..9a055690 100644 --- a/src/core/tileset.cpp +++ b/src/core/tileset.cpp @@ -120,6 +120,12 @@ QList Tileset::getPalette(int paletteId, Tileset *primaryTileset, Tileset ? primaryTileset : secondaryTileset; auto palettes = useTruePalettes ? tileset->palettes : tileset->palettePreviews; + + if (paletteId < 0 || paletteId >= palettes.length()){ + logError(QString("Invalid tileset palette id '%1' requested.").arg(paletteId)); + return paletteTable; + } + for (int i = 0; i < palettes.at(paletteId).length(); i++) { paletteTable.append(palettes.at(paletteId).at(i)); } diff --git a/src/mainwindow_scriptapi.cpp b/src/mainwindow_scriptapi.cpp index 784a0354..931bc26a 100644 --- a/src/mainwindow_scriptapi.cpp +++ b/src/mainwindow_scriptapi.cpp @@ -991,8 +991,11 @@ void MainWindow::setMetatileTiles(int metatileId, QJSValue tilesObj, int tileSta // Write to metatile using as many of the given Tiles as possible int numTileObjs = qMin(tilesObj.property("length").toInt(), numTiles); int i = 0; - for (; i < numTileObjs; i++, tileStart++) - metatile->tiles[tileStart] = Scripting::toTile(tilesObj.property(i)); + for (; i < numTileObjs; i++, tileStart++) { + Tile tile = Scripting::toTile(tilesObj.property(i)); + tile.sanitize(); + metatile->tiles[tileStart] = tile; + } // Fill remainder of specified length with empty Tiles for (; i < numTiles; i++, tileStart++) @@ -1011,6 +1014,7 @@ void MainWindow::setMetatileTiles(int metatileId, int tileId, bool xflip, bool y // Write to metatile using Tiles of the specified value Tile tile = Tile(tileId, xflip, yflip, palette); + tile.sanitize(); for (int i = tileStart; i <= tileEnd; i++) metatile->tiles[i] = tile; diff --git a/src/scripting.cpp b/src/scripting.cpp index ef757464..946380ab 100644 --- a/src/scripting.cpp +++ b/src/scripting.cpp @@ -239,17 +239,17 @@ QJSValue Scripting::position(int x, int y) { } Tile Scripting::toTile(QJSValue obj) { - if (!obj.hasProperty("tileId") - || !obj.hasProperty("xflip") - || !obj.hasProperty("yflip") - || !obj.hasProperty("palette")) { - return Tile(); - } Tile tile = Tile(); - tile.tileId = obj.property("tileId").toInt(); - tile.xflip = obj.property("xflip").toBool(); - tile.yflip = obj.property("yflip").toBool(); - tile.palette = obj.property("palette").toInt(); + + if (obj.hasProperty("tileId")) + tile.tileId = obj.property("tileId").toInt(); + if (obj.hasProperty("xflip")) + tile.xflip = obj.property("xflip").toBool(); + if (obj.hasProperty("yflip")) + tile.yflip = obj.property("yflip").toBool(); + if (obj.hasProperty("palette")) + tile.palette = obj.property("palette").toInt(); + return tile; }