background: add support for 1word
This commit is contained in:
parent
8189116a82
commit
dd70828576
@ -8,6 +8,11 @@ from operator import itemgetter
|
|||||||
from aseprite import parse_file
|
from aseprite import parse_file
|
||||||
from aseprite import PaletteChunk, OldPaletteChunk, TilesetChunkInternal, CelChunk_CompressedTilemap
|
from aseprite import PaletteChunk, OldPaletteChunk, TilesetChunkInternal, CelChunk_CompressedTilemap
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
PNB = os.environ.get("PNB", "2WORD")
|
||||||
|
assert PNB in {"2WORD", "1WORD"}
|
||||||
|
|
||||||
def pprinti(o, i):
|
def pprinti(o, i):
|
||||||
s = pformat(o)
|
s = pformat(o)
|
||||||
print(textwrap.indent(s, ' ' * i))
|
print(textwrap.indent(s, ' ' * i))
|
||||||
@ -20,8 +25,25 @@ def pack_bgr555(red, green, blue):
|
|||||||
)
|
)
|
||||||
return struct.pack(">H", bgr)
|
return struct.pack(">H", bgr)
|
||||||
|
|
||||||
def pack_index(i):
|
# 2x2
|
||||||
return struct.pack(">I", i)
|
|
||||||
|
def pack_index_2word(y_flip, x_flip, id):
|
||||||
|
tile_id = id * 8
|
||||||
|
assert tile_id < 0x7fff, tile_id
|
||||||
|
pattern = (int(y_flip) << 31) | (int(x_flip) << 30) | tile_id
|
||||||
|
return struct.pack(">I", pattern)
|
||||||
|
|
||||||
|
def pack_index_1word(y_flip, x_flip, id):
|
||||||
|
tile_id = (id * 8) >> 2
|
||||||
|
assert tile_id < 0x3ff, tile_id
|
||||||
|
pattern = (int(y_flip) << 11) | (int(x_flip) << 10) | tile_id
|
||||||
|
return struct.pack(">H", pattern)
|
||||||
|
|
||||||
|
def pack_index(y_flip, x_flip, id):
|
||||||
|
if PNB == "2WORD":
|
||||||
|
return pack_index_2word(y_flip, x_flip, id)
|
||||||
|
else:
|
||||||
|
return pack_index_1word(y_flip, x_flip, id)
|
||||||
|
|
||||||
def pack_old_palette_chunk(old_palette_chunk):
|
def pack_old_palette_chunk(old_palette_chunk):
|
||||||
with open("palette.bin", "wb") as f:
|
with open("palette.bin", "wb") as f:
|
||||||
@ -111,8 +133,6 @@ def pack_pattern_name_table(f, cel_chunk, x_cells, y_cells):
|
|||||||
if v_pages > 2:
|
if v_pages > 2:
|
||||||
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(y_cells):
|
for y in range(y_cells):
|
||||||
@ -120,7 +140,7 @@ def pack_pattern_name_table(f, cel_chunk, x_cells, y_cells):
|
|||||||
tx = (h_page * x_cells) + x
|
tx = (h_page * x_cells) + x
|
||||||
ty = (v_page * y_cells) + 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, 0, 0))
|
||||||
else:
|
else:
|
||||||
cel_chunk_ix = ty * tile_width + tx
|
cel_chunk_ix = ty * tile_width + tx
|
||||||
tile_data = cel_chunk.data.tile[cel_chunk_ix]
|
tile_data = cel_chunk.data.tile[cel_chunk_ix]
|
||||||
@ -129,9 +149,7 @@ def pack_pattern_name_table(f, cel_chunk, x_cells, y_cells):
|
|||||||
x_flip = (tile_data & cel_chunk.data.bitmask_for_x_flip.value) != 0
|
x_flip = (tile_data & cel_chunk.data.bitmask_for_x_flip.value) != 0
|
||||||
y_flip = (tile_data & cel_chunk.data.bitmask_for_y_flip.value) != 0
|
y_flip = (tile_data & cel_chunk.data.bitmask_for_y_flip.value) != 0
|
||||||
|
|
||||||
pattern = (int(y_flip) << 31) | (int(x_flip) << 30) | tile_id
|
f.write(pack_index(y_flip, x_flip, tile_id))
|
||||||
|
|
||||||
f.write(pack_index(pattern))
|
|
||||||
|
|
||||||
def generate_separate_files(mem):
|
def generate_separate_files(mem):
|
||||||
tilesets, layers, palette, cel_chunks = parse_file(mem)
|
tilesets, layers, palette, cel_chunks = parse_file(mem)
|
||||||
@ -210,6 +228,14 @@ def palette_pad_7shades(f_tmp, palette_size):
|
|||||||
assert False, palette_size
|
assert False, palette_size
|
||||||
return palette_size
|
return palette_size
|
||||||
|
|
||||||
|
def chctla_n0chsz(tileset_chunk):
|
||||||
|
if tileset_chunk.tile_width == 8 and tileset_chunk.tile_height == 8:
|
||||||
|
return CHCTLA__N0CHSZ__1x1_CELL
|
||||||
|
elif tileset_chunk.tile_width == 16 and tileset_chunk.tile_height == 16:
|
||||||
|
return CHCTLA__N0CHSZ__2x2_CELL
|
||||||
|
else:
|
||||||
|
assert False, (tileset_chunk.tile_width, tileset_chunk.tile_height)
|
||||||
|
|
||||||
def generate_7shades(mem, output_filename):
|
def generate_7shades(mem, output_filename):
|
||||||
tilesets, layers, palette, cel_chunks = parse_file(mem)
|
tilesets, layers, palette, cel_chunks = parse_file(mem)
|
||||||
|
|
||||||
@ -239,10 +265,10 @@ def generate_7shades(mem, output_filename):
|
|||||||
size_of_cel_data = character_patterns_end - character_patterns_start
|
size_of_cel_data = character_patterns_end - character_patterns_start
|
||||||
print("character_patterns_size", size_of_cel_data)
|
print("character_patterns_size", size_of_cel_data)
|
||||||
|
|
||||||
tile_character_size = CHCTLA__N0CHSZ__2x2_CELL
|
tile_character_size = chctla_n0chsz(tileset_chunk)
|
||||||
tile_color_mode = CHCTLA__N0CHCN__256_COLOR
|
tile_color_mode = CHCTLA__N0CHCN__256_COLOR
|
||||||
plane_size = PLSZ__N0PLSZ__2x2
|
plane_size = PLSZ__N0PLSZ__2x2
|
||||||
map_data = PNCN0__N0PNB__2WORD
|
map_data = PNCN0__N0PNB__2WORD if PNB == "2WORD" else PNCN0__N0PNB__1WORD
|
||||||
|
|
||||||
header = header_7shades(size_of_cel_data,
|
header = header_7shades(size_of_cel_data,
|
||||||
size_of_map_data,
|
size_of_map_data,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user