diff --git a/src/ui/imageproviders.cpp b/src/ui/imageproviders.cpp index 8254ece5..95d40ce6 100644 --- a/src/ui/imageproviders.cpp +++ b/src/ui/imageproviders.cpp @@ -51,13 +51,46 @@ QImage getMetatileImage( QPainter metatile_painter(&metatile_image); bool isTripleLayerMetatile = projectConfig.getTripleLayerMetatilesEnabled(); - int numLayers = isTripleLayerMetatile ? 3: 2; + const int numLayers = 3; // When rendering, metatiles always have 3 layers + int layerType = metatile->layerType; for (int layer = 0; layer < numLayers; layer++) for (int y = 0; y < 2; y++) for (int x = 0; x < 2; x++) { - int l = layerOrder.size() >= numLayers ? layerOrder[layer] : layer; + int l = layerOrder.size() >= numLayers ? (layerOrder[layer] % numLayers) : layer; int bottomLayer = layerOrder.size() >= numLayers ? layerOrder[0] : 0; - Tile tile = metatile->tiles.value((y * 2) + x + (l * 4)); + + // Get the tile to render next + Tile tile; + int tileOffset = (y * 2) + x; + if (isTripleLayerMetatile) { + tile = metatile->tiles.value(tileOffset + (l * 4)); + } else { + // "Vanilla" metatiles only have 8 tiles, but render 12. + // The remaining 4 tiles are rendered either as tile 0 or 0x3014 (invalid) depending on layer type. + switch (layerType) + { + default: + case METATILE_LAYER_MIDDLE_TOP: + if (l == 0) + tile = Tile(0x3014, false, false, 0); + else // Tiles are on layers 1 and 2 + tile = metatile->tiles.value(tileOffset + ((l - 1) * 4)); + break; + case METATILE_LAYER_BOTTOM_MIDDLE: + if (l == 2) + tile = Tile(); + else // Tiles are on layers 0 and 1 + tile = metatile->tiles.value(tileOffset + (l * 4)); + break; + case METATILE_LAYER_BOTTOM_TOP: + if (l == 1) + tile = Tile(); + else // Tiles are on layers 0 and 2 + tile = metatile->tiles.value(tileOffset + ((l == 0 ? 0 : 1) * 4)); + break; + } + } + QImage tile_image = getTileImage(tile.tileId, primaryTileset, secondaryTileset); if (tile_image.isNull()) { // Some metatiles specify tiles that are outside the valid range.