From f37804be8df08c618f33bae6a3e6c3c1ebd9ed52 Mon Sep 17 00:00:00 2001 From: alex baldwin Date: Sun, 19 Jul 2026 00:20:36 -0400 Subject: [PATCH 1/4] use tilesets in aseprite --- .gitignore | 4 +- lib.d.ts | 57 +++++- netlify/functions/counter.ts | 2 +- package.json | 9 +- pnpm-lock.yaml | 17 +- src/_data/elsewhere.json | 2 +- src/_data/icon-sources.json | 2 +- src/_data/icons-16.json | 12 +- src/_data/icons-32.json | 8 +- src/assets/aseprite.11ty.ts | 333 +++++++++++++++++++++++++---------- src/assets/dice.aseprite | Bin 528 -> 528 bytes src/assets/icons-16.aseprite | Bin 713 -> 937 bytes src/assets/icons-32.aseprite | Bin 1238 -> 1303 bytes 13 files changed, 319 insertions(+), 127 deletions(-) diff --git a/.gitignore b/.gitignore index fb9831c..7b8fce0 100644 --- a/.gitignore +++ b/.gitignore @@ -6,5 +6,5 @@ dist # Local Netlify folder .netlify - -tmp/ \ No newline at end of file +tmp/ +./node-aseprite \ No newline at end of file diff --git a/lib.d.ts b/lib.d.ts index 8a82902..079f7bc 100644 --- a/lib.d.ts +++ b/lib.d.ts @@ -76,7 +76,7 @@ declare module "aseprite" { RGBA = 32, } - enum ChunkType { + export enum ChunkType { PALETTE_OLD_1 = 4, PALETTE_OLD_2 = 17, LAYER = 8196, @@ -89,6 +89,7 @@ declare module "aseprite" { PALETTE = 8217, USERDATA = 8224, SLICE = 8226, + TILESET = 8227, } interface FlagsBitset { @@ -122,10 +123,11 @@ declare module "aseprite" { numChunks: number; } & KaitaiProperties, Aseprite>; - enum CelType { + export enum CelType { RAW = 0, LINKED = 1, COMPRESSED = 2, + COMPRESSED_TILEMAP = 3, } type CelChunkData = { layerIndex: number; @@ -150,8 +152,47 @@ declare module "aseprite" { pixelsCompressed: Uint8Array; pixels: I extends true ? Buffer : undefined; } + | { + type: CelType.COMPRESSED_TILEMAP; + tilesWidth: number; + tilesHeight: number; + bitsPerTile: number; + tileIdBitmask: number; + xFlipBitmask: number; + yFlipBitmask: number; + dFlipBitmask: number; + tilesCompressed: Uint8Array; + tiles: I extends true ? Buffer : undefined; + } ) & KaitaiProperties, Aseprite>; + type TilesetChunkData = { + tilesetId: number; + numTiles: number; + tileWidth: number; + tileHeight: number; + baseIndex: number; + name: string; + pixelsCompressed: Uint8Array; + pixels: I extends true ? Buffer : undefined; + }; + export enum LayerType { + IMAGE = 0, + GROUP = 1, + TILEMAP = 2, + } + type LayerChunkData = { + blendMode: number; // TODO enum + opacity: number; + name: string; + } & ( + | { type: LayerType.IMAGE } + | { type: LayerType.GROUP } + | { + type: LayerType.TILEMAP; + tilesetIndex: number; + } + ); type Color = { r: number; g: number; b: number }; type Packet = { skip: number; numColors: number; colors: Color[] }; type PaletteOldChunkData = { @@ -175,13 +216,17 @@ declare module "aseprite" { }; type CelExtraChunk = { type: ChunkType.CEL_EXTRA }; type UserdataChunk = { type: ChunkType.USERDATA }; - type LayerChunk = { type: ChunkType.LAYER }; + type LayerChunk = { type: ChunkType.LAYER; data: LayerChunkData }; type TagsChunk = { type: ChunkType.TAGS }; type PaletteChunk = { type: ChunkType.PALETTE; data: PaletteChunkData; }; type MaskChunk = { type: ChunkType.MASK }; + type TilesetChunk = { + type: ChunkType.TILESET; + data: TilesetChunkData; + }; type Chunk = { size: number } & ( | ColorProfileChunk | PaletteOld1Chunk @@ -193,6 +238,7 @@ declare module "aseprite" { | TagsChunk | PaletteChunk | MaskChunk + | TilesetChunk ) & KaitaiProperties, Aseprite>; @@ -201,7 +247,7 @@ declare module "aseprite" { chunks: Chunk[]; } & KaitaiProperties, Aseprite>; - type Aseprite = { + export type Aseprite = { header: Header; frames: Frame[]; } & KaitaiProperties; @@ -218,6 +264,9 @@ declare module "aseprite" { CelChunk: { CelTypeEnum: typeof CelType; }; + LayerChunk: { + TypeEnum: typeof LayerType; + }; }; }; } diff --git a/netlify/functions/counter.ts b/netlify/functions/counter.ts index d4a0994..b0911e4 100644 --- a/netlify/functions/counter.ts +++ b/netlify/functions/counter.ts @@ -53,7 +53,7 @@ function counterTemplate(digits: string[], align: string | null) {