144 lines
3.7 KiB
Python
Executable File
144 lines
3.7 KiB
Python
Executable File
#! /usr/bin/enb python3
|
|
|
|
from PIL import Image
|
|
import xml.etree.ElementTree
|
|
|
|
def discover_palette(img, px):
|
|
palette = []
|
|
for y in range(img.height):
|
|
for x in range(img.width):
|
|
if px[x,y] not in palette:
|
|
palette.append(px[x,y])
|
|
return sorted(palette)
|
|
|
|
def encode_rle(img, px, palette):
|
|
lines = []
|
|
for y in range(img.height):
|
|
x = 0
|
|
pairs = []
|
|
strip = (None, 0)
|
|
while x < img.width:
|
|
next_color = palette.index(px[x,y])
|
|
if next_color == strip[0] and strip[1] < 32:
|
|
strip = (strip[0], strip[1] + 1)
|
|
else:
|
|
if strip[1] > 0:
|
|
pairs.append(strip)
|
|
strip = (next_color, 1)
|
|
x += 1
|
|
if strip[1] > 0:
|
|
pairs.append(strip)
|
|
lines.append(pairs)
|
|
return lines
|
|
|
|
def unalpha_palette(palette):
|
|
newp = []
|
|
for i, (r, g, b, a) in enumerate(palette):
|
|
assert a == 255 or (a == 0 and i == 0)
|
|
if a == 0:
|
|
newp.append(None)
|
|
else:
|
|
newp.append((r, g, b))
|
|
return newp
|
|
|
|
def main():
|
|
print("Encoding BG...")
|
|
|
|
img = Image.open("bg.png")
|
|
px = img.load()
|
|
palette = discover_palette(img, px)
|
|
|
|
print("Palette:", palette)
|
|
assert len(palette) == 4
|
|
|
|
bgdata = [bytes(64*x + (y-1) for (x, y) in pairs)
|
|
for pairs in encode_rle(img, px, palette)]
|
|
|
|
print("")
|
|
print("Encoding tiles...")
|
|
|
|
img = Image.open("tileset.png")
|
|
px = img.load()
|
|
palette = discover_palette(img, px)
|
|
|
|
print("Palette:", palette)
|
|
print("Encoded palette:", unalpha_palette(palette))
|
|
tiles = []
|
|
|
|
for i in range(img.width // 16):
|
|
subimg = img.crop((16*i, 0, 16*i+16, 16))
|
|
subpx = subimg.load()
|
|
tiledata = bytes()
|
|
|
|
for y in range(16):
|
|
for x in range(16):
|
|
tiledata += bytes([48 + palette.index(subpx[x,y])])
|
|
tiles.append(tiledata)
|
|
|
|
print("")
|
|
print("Encoding sprites...")
|
|
|
|
img = Image.open("sprites.png")
|
|
px = img.load()
|
|
palette = discover_palette(img, px)
|
|
|
|
print("Palette:", palette)
|
|
print("Encoded palette:", unalpha_palette(palette))
|
|
sprites = []
|
|
|
|
for i in range(img.width // 16):
|
|
subimg = img.crop((16*i, 0, 16*i+16, img.height))
|
|
subpx = subimg.load()
|
|
spritedata = bytes()
|
|
|
|
for y in range(img.height):
|
|
for x in range(16):
|
|
spritedata += bytes([48 + palette.index(subpx[x,y])])
|
|
sprites.append(spritedata)
|
|
|
|
print("")
|
|
print("Encoding maps...")
|
|
|
|
tree = xml.etree.ElementTree.parse("maps.tmx")
|
|
layers = tree.getroot().findall("layer")
|
|
encoded_layers = []
|
|
|
|
for l in layers:
|
|
csv = l.find("data").text
|
|
csv = [int(x) for x in csv.split(",")]
|
|
|
|
encoded = []
|
|
streak = False
|
|
for (index, value) in enumerate(csv):
|
|
if value == 0:
|
|
streak = False
|
|
continue
|
|
if streak == False:
|
|
encoded.append(-index)
|
|
streak = True
|
|
encoded.append(value - 1)
|
|
|
|
print(encoded)
|
|
encoded_layers.append(encoded)
|
|
|
|
with open("gg_data.py", "w") as fp:
|
|
fp.write(f"bg = {bgdata}\n")
|
|
|
|
fp.write("tiles = [\n")
|
|
for tiledata in tiles:
|
|
fp.write(f" {tiledata},\n")
|
|
fp.write("]\n")
|
|
|
|
fp.write("sprites = [\n")
|
|
for spritedata in sprites:
|
|
fp.write(f" {spritedata},\n")
|
|
fp.write("]\n")
|
|
|
|
fp.write("levels = [\n")
|
|
for encoded in encoded_layers:
|
|
text = str(encoded).replace(" ", "")
|
|
fp.write(f" {text},\n")
|
|
fp.write("]\n")
|
|
|
|
main()
|