69 lines
1.5 KiB
Python
69 lines
1.5 KiB
Python
import sys
|
|
import struct
|
|
|
|
with open(sys.argv[1], 'rb') as f:
|
|
buf = f.read()
|
|
|
|
stride = 320
|
|
|
|
def get_tile(buf, tx, ty):
|
|
tile = []
|
|
for y in range(8):
|
|
row = []
|
|
for x in range(8):
|
|
yy = ty * 8 + y
|
|
xx = tx * 8 + x
|
|
ix = yy * stride + xx
|
|
px = buf[ix]
|
|
row.append(px)
|
|
tile.append(tuple(row))
|
|
return tuple(tile)
|
|
|
|
def tile_input(buf):
|
|
tiles = []
|
|
pattern = []
|
|
|
|
for ty in range(240 // 8):
|
|
for tx in range(320 // 8):
|
|
tile = get_tile(buf, tx, ty)
|
|
#if tile in tiles:
|
|
# pass
|
|
#else:
|
|
# tiles.append(tile)
|
|
#tile_ix = tiles.index(tile)
|
|
tiles.append(tile)
|
|
tile_ix = len(tiles) - 1
|
|
pattern.append(tile_ix)
|
|
|
|
return tiles, pattern
|
|
|
|
|
|
def emit_tile(tile):
|
|
for row in tile:
|
|
for ix in range(len(row) // 2):
|
|
a = row[ix * 2 + 0]
|
|
b = row[ix * 2 + 1]
|
|
c = ((a & 0xf) << 4) | ((b & 0xf) << 0)
|
|
yield c
|
|
|
|
def emit_tiles(tiles):
|
|
for tile in tiles:
|
|
yield from emit_tile(tile)
|
|
|
|
def emit_tile_data(tiles):
|
|
b = bytes(emit_tiles(tiles))
|
|
with open(sys.argv[2], 'wb') as f:
|
|
f.write(b)
|
|
|
|
def emit_pattern_data(pattern):
|
|
with open(sys.argv[3], 'wb') as f:
|
|
for ix in pattern:
|
|
assert ix < 1200, ix
|
|
b = struct.pack('>H', ix)
|
|
f.write(b)
|
|
|
|
assert len(sys.argv) == 4, len(sys.argv)
|
|
tiles, pattern = tile_input(buf)
|
|
emit_tile_data(tiles)
|
|
emit_pattern_data(pattern)
|