From f4fe943b9bb9e3f5a7f4590d217e2c8e878dcf2d Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Mon, 1 Sep 2025 18:16:49 -0500 Subject: [PATCH] add support for 1x1 characters --- aseprite.py | 72 ++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 57 insertions(+), 15 deletions(-) diff --git a/aseprite.py b/aseprite.py index 9fdae94..21280e8 100644 --- a/aseprite.py +++ b/aseprite.py @@ -549,33 +549,65 @@ def pack_character_2x2(tileset_chunk, offset): return bytes(buf) -def pack_character_patterns_2x2(filename, tileset_chunk): +def pack_character_1x1(tileset_chunk, offset): + assert tileset_chunk.tile_width == 8 + assert tileset_chunk.tile_height == 8 + assert type(tileset_chunk.data) == TilesetChunkInternal + + buf = bytearray(8 * 8) + + for y in range(8): + for x in range(8): + tileset_x = x + tileset_y = y + px = tileset_chunk.data.pixel[offset + tileset_y * 8 + tileset_x] + buf[y * 8 + x] = px + + return bytes(buf) + +def pack_character_patterns(filename, tileset_chunk): with open(filename, "wb") as f: for i in range(tileset_chunk.number_of_tiles): offset = tileset_chunk.tile_width * tileset_chunk.tile_height * i - buf = pack_character_2x2(tileset_chunk, offset) + + if tileset_chunk.tile_width == 8 and tileset_chunk.tile_height == 8: + buf = pack_character_1x1(tileset_chunk, offset) + elif tileset_chunk.tile_width == 16 and tileset_chunk.tile_height == 16: + buf = pack_character_2x2(tileset_chunk, offset) + else: + assert False, (tileset_chunk.tile_width, tileset_chunk.tile_height) + f.write(buf) print(filename, f.tell(), file=sys.stderr) -def pack_pattern_name_table_2x2(filename, cel_chunk): +def pack_pattern_name_table(filename, cel_chunk, x_cells, y_cells): with open(filename, "wb") as f: assert type(cel_chunk.data) == CelChunk_CompressedTilemap - assert cel_chunk.data.width_in_number_of_tiles <= 64 - assert cel_chunk.data.height_in_number_of_tiles <= 64 + #assert cel_chunk.data.width_in_number_of_tiles <= 64 + #assert cel_chunk.data.height_in_number_of_tiles <= 64 tile_width = cel_chunk.data.width_in_number_of_tiles tile_height = cel_chunk.data.height_in_number_of_tiles - h_pages = ((tile_width + 31) & (~31)) // 32 - v_pages = ((tile_height + 31) & (~31)) // 32 + print(tile_width, tile_height) + + h_pages = ((tile_width + (x_cells - 1)) & (~(x_cells - 1))) // x_cells + v_pages = ((tile_height + (y_cells - 1)) & (~(y_cells - 1))) // y_cells + + if h_pages > 2: + h_pages = 2 + if v_pages > 2: + v_pages = 2 + + print("h_pages, v_pages", h_pages, v_pages) for v_page in range(v_pages): for h_page in range(h_pages): - for y in range(32): - for x in range(32): - tx = (h_page * 32) + x - ty = (v_page * 32) + y + for y in range(y_cells): + for x in range(x_cells): + tx = (h_page * x_cells) + x + ty = (v_page * y_cells) + y if tx >= tile_width or ty >= tile_height: f.write(pack_index(0)) else: @@ -635,6 +667,9 @@ for _ in range(frame_header.number_of_chunks): elif chunk.chunk_type == 0x2020: # user data pass + elif chunk.chunk_type == 0x2007: + # color profile + pass else: print("unhandled chunk: ") pprinti(chunk, 1) @@ -645,11 +680,18 @@ pack_palette(palette) for tileset_index, tileset_chunk in sorted(tilesets.items(), key=itemgetter(0)): filename = f"character_pattern__tileset_{tileset_index}.bin" - pack_character_patterns_2x2(filename, tileset_chunk) + pack_character_patterns(filename, tileset_chunk) for layer_index, cel_chunk in sorted(cel_chunks.items(), key=itemgetter(0)): filename = f"pattern_name_table__layer_{layer_index}.bin" - pack_pattern_name_table_2x2(filename, cel_chunk) + #layers[layer_index] + print(f"layer={layer_index} layer_name={layers[layer_index].layer_name} tileset={layers[layer_index].tileset_index}"); + tileset_chunk = tilesets[layers[layer_index].tileset_index] -for layer_index, layer_chunk in enumerate(layers): - print(f"layer={layer_index} tileset={layer_chunk.tileset_index}"); + x_cells = 64 // (tileset_chunk.tile_width // 8) + y_cells = 64 // (tileset_chunk.tile_height // 8) + + pack_pattern_name_table(filename, cel_chunk, x_cells, y_cells) + +#for layer_index, layer_chunk in enumerate(layers): +# print(f"layer={layer_index} layer_name={layer_chunk.layer_name} tileset={layer_chunk.tileset_index}");