GravityGuyPython/encode_data.py

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()