add support for 1x1 characters
This commit is contained in:
parent
b763b8da0e
commit
f4fe943b9b
72
aseprite.py
72
aseprite.py
@ -549,33 +549,65 @@ def pack_character_2x2(tileset_chunk, offset):
|
|||||||
|
|
||||||
return bytes(buf)
|
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:
|
with open(filename, "wb") as f:
|
||||||
for i in range(tileset_chunk.number_of_tiles):
|
for i in range(tileset_chunk.number_of_tiles):
|
||||||
offset = tileset_chunk.tile_width * tileset_chunk.tile_height * i
|
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)
|
f.write(buf)
|
||||||
|
|
||||||
print(filename, f.tell(), file=sys.stderr)
|
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:
|
with open(filename, "wb") as f:
|
||||||
assert type(cel_chunk.data) == CelChunk_CompressedTilemap
|
assert type(cel_chunk.data) == CelChunk_CompressedTilemap
|
||||||
assert cel_chunk.data.width_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
|
#assert cel_chunk.data.height_in_number_of_tiles <= 64
|
||||||
|
|
||||||
tile_width = cel_chunk.data.width_in_number_of_tiles
|
tile_width = cel_chunk.data.width_in_number_of_tiles
|
||||||
tile_height = cel_chunk.data.height_in_number_of_tiles
|
tile_height = cel_chunk.data.height_in_number_of_tiles
|
||||||
|
|
||||||
h_pages = ((tile_width + 31) & (~31)) // 32
|
print(tile_width, tile_height)
|
||||||
v_pages = ((tile_height + 31) & (~31)) // 32
|
|
||||||
|
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 v_page in range(v_pages):
|
||||||
for h_page in range(h_pages):
|
for h_page in range(h_pages):
|
||||||
for y in range(32):
|
for y in range(y_cells):
|
||||||
for x in range(32):
|
for x in range(x_cells):
|
||||||
tx = (h_page * 32) + x
|
tx = (h_page * x_cells) + x
|
||||||
ty = (v_page * 32) + y
|
ty = (v_page * y_cells) + y
|
||||||
if tx >= tile_width or ty >= tile_height:
|
if tx >= tile_width or ty >= tile_height:
|
||||||
f.write(pack_index(0))
|
f.write(pack_index(0))
|
||||||
else:
|
else:
|
||||||
@ -635,6 +667,9 @@ for _ in range(frame_header.number_of_chunks):
|
|||||||
elif chunk.chunk_type == 0x2020:
|
elif chunk.chunk_type == 0x2020:
|
||||||
# user data
|
# user data
|
||||||
pass
|
pass
|
||||||
|
elif chunk.chunk_type == 0x2007:
|
||||||
|
# color profile
|
||||||
|
pass
|
||||||
else:
|
else:
|
||||||
print("unhandled chunk: ")
|
print("unhandled chunk: ")
|
||||||
pprinti(chunk, 1)
|
pprinti(chunk, 1)
|
||||||
@ -645,11 +680,18 @@ pack_palette(palette)
|
|||||||
|
|
||||||
for tileset_index, tileset_chunk in sorted(tilesets.items(), key=itemgetter(0)):
|
for tileset_index, tileset_chunk in sorted(tilesets.items(), key=itemgetter(0)):
|
||||||
filename = f"character_pattern__tileset_{tileset_index}.bin"
|
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)):
|
for layer_index, cel_chunk in sorted(cel_chunks.items(), key=itemgetter(0)):
|
||||||
filename = f"pattern_name_table__layer_{layer_index}.bin"
|
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):
|
x_cells = 64 // (tileset_chunk.tile_width // 8)
|
||||||
print(f"layer={layer_index} tileset={layer_chunk.tileset_index}");
|
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}");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user