diff --git a/src/gfx/process.cpp b/src/gfx/process.cpp index 29b94565..17b7c66f 100644 --- a/src/gfx/process.cpp +++ b/src/gfx/process.cpp @@ -695,12 +695,6 @@ static void outputUnoptimizedMaps( uint8_t tileID = 0; uint8_t bank = 0; for (AttrmapEntry const &attr : attrmap) { - if (tileID == options.maxNbTiles[bank]) { - assume(bank == 0); - bank = 1; - tileID = 0; - } - if (tilemapOutput.has_value()) { (*tilemapOutput) ->sputc((attr.isBackgroundTile() ? 0 : tileID) + options.baseTileIDs[bank]); @@ -714,8 +708,17 @@ static void outputUnoptimizedMaps( } // Background tiles are skipped in the tile data, so they should be skipped in the maps too. - if (!attr.isBackgroundTile()) { + if (attr.isBackgroundTile()) { + continue; + } + + // Compare with `maxNbTiles` *before* incrementing, due to unsigned overflow! + if (tileID + 1 < options.maxNbTiles[bank]) { ++tileID; + } else { + assume(bank == 0); + bank = 1; + tileID = 0; } } } diff --git a/test/gfx/unoptimized-full.2bpp b/test/gfx/unoptimized-full.2bpp new file mode 100644 index 00000000..8e1d54fe Binary files /dev/null and b/test/gfx/unoptimized-full.2bpp differ diff --git a/test/gfx/unoptimized-full.attrmap b/test/gfx/unoptimized-full.attrmap new file mode 100644 index 00000000..fe8b860f Binary files /dev/null and b/test/gfx/unoptimized-full.attrmap differ diff --git a/test/gfx/unoptimized-full.flags b/test/gfx/unoptimized-full.flags new file mode 100644 index 00000000..9dcb6275 --- /dev/null +++ b/test/gfx/unoptimized-full.flags @@ -0,0 +1 @@ +-N 256,256 diff --git a/test/gfx/unoptimized-full.pal b/test/gfx/unoptimized-full.pal new file mode 100644 index 00000000..aa90be83 Binary files /dev/null and b/test/gfx/unoptimized-full.pal differ diff --git a/test/gfx/unoptimized-full.png b/test/gfx/unoptimized-full.png new file mode 100644 index 00000000..cd48d42f Binary files /dev/null and b/test/gfx/unoptimized-full.png differ diff --git a/test/gfx/unoptimized-full.tilemap b/test/gfx/unoptimized-full.tilemap new file mode 100644 index 00000000..553a99f9 Binary files /dev/null and b/test/gfx/unoptimized-full.tilemap differ