@@ -12,7 +12,11 @@ sharp.cache(false);
1212
1313export class Optimizer {
1414 private optimizedMap : ITiledMap ;
15- private optimizedTiles : Map < number , number > ;
15+ /**
16+ * A map mapping the old tile id to the new tile id (global) and to the new tile id in the current tileset
17+ * @private
18+ */
19+ private optimizedTiles : Map < number , { global : number ; local : number } > ;
1620 private optimizedTilesets : ITiledMapEmbeddedTileset [ ] ;
1721 private currentTilesetOptimization : ITiledMapEmbeddedTileset ;
1822 private currentExtractedTiles : Promise < Buffer > [ ] ;
@@ -30,7 +34,7 @@ export class Optimizer {
3034 private readonly outputPath : string
3135 ) {
3236 this . optimizedMap = map ;
33- this . optimizedTiles = new Map < number , number > ( ) ;
37+ this . optimizedTiles = new Map < number , { global : number ; local : number } > ( ) ;
3438 this . optimizedTilesets = [ ] ;
3539 this . tileSize = options ?. tile ?. size ?? 32 ;
3640 this . outputSize = options ?. output ?. tileset ?. size ? options ?. output ?. tileset ?. size : 512 ;
@@ -219,7 +223,7 @@ export class Optimizer {
219223
220224 const unflippedTileId = tileId - minBitId ;
221225
222- const existantNewTileId = this . optimizedTiles . get ( unflippedTileId ) ;
226+ const existantNewTileId = this . optimizedTiles . get ( unflippedTileId ) ?. global ;
223227
224228 if ( existantNewTileId ) {
225229 return existantNewTileId + minBitId ;
@@ -265,7 +269,10 @@ export class Optimizer {
265269 if ( tileData && tileData . animation ) {
266270 if ( tileData . animation . length + this . currentExtractedTiles . length > this . tilesetMaxTileCount ) {
267271 for ( let i = 1 ; i < this . tilesetMaxTileCount - this . currentExtractedTiles . length ; i ++ ) {
268- this . optimizedTiles . set ( - 1 , this . optimizedTiles . size + i ) ;
272+ this . optimizedTiles . set ( - 1 , {
273+ global : this . optimizedTiles . size + i ,
274+ local : 0 ,
275+ } ) ;
269276 }
270277
271278 await this . currentTilesetRendering ( ) ;
@@ -275,7 +282,10 @@ export class Optimizer {
275282
276283 const newTileId = this . optimizedTiles . size + 1 ;
277284
278- this . optimizedTiles . set ( unflippedTileId , newTileId ) ;
285+ this . optimizedTiles . set ( unflippedTileId , {
286+ global : newTileId ,
287+ local : this . currentExtractedTiles . length ,
288+ } ) ;
279289
280290 let newTileData : ITiledMapTile | undefined = undefined ;
281291
@@ -322,10 +332,14 @@ export class Optimizer {
322332 newTileData . animation = [ ] ;
323333 for ( const frame of tileData . animation ) {
324334 await this . optimizeNewTile ( oldFirstgid + frame . tileid ) ;
335+ const newTile = this . optimizedTiles . get ( oldFirstgid + frame . tileid ) ?. local ;
336+ if ( newTile === undefined ) {
337+ throw new Error ( `Undefined tile in animation for ${ oldFirstgid + frame . tileid } ` ) ;
338+ }
325339
326340 newTileData . animation . push ( {
327341 duration : frame . duration ,
328- tileid : this . currentExtractedTiles . length - 1 ,
342+ tileid : newTile ,
329343 } ) ;
330344 }
331345 }
0 commit comments