Skip to content

Commit 74919b5

Browse files
committed
fix: Fixing animation optimization issue
When a tile was used several times in the same animation, it would be improperly renumbered if the tile was already optimized before. This prevented animations going back and forth to work correctly.
1 parent ff47c0d commit 74919b5

File tree

1 file changed

+20
-6
lines changed

1 file changed

+20
-6
lines changed

src/Optimizer.ts

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,11 @@ sharp.cache(false);
1212

1313
export 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

Comments
 (0)