Files

48 lines
2.1 KiB
Python

#!/usr/bin/env python3
# Pixelize all raw sheets to 32 and 64 px and build contact sheets.
import os, subprocess, sys
from PIL import Image
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from creatures import CREATURES
D = "/home/zink/Projects/dungeoncraft/art/generated/sprites"
T = "/home/zink/Projects/dungeoncraft/tools/pixelize_sprite.py"
PY = "/tmp/sprvenv/bin/python"
EXTRA = {} # id -> extra args
for line in open(os.path.join(os.path.dirname(os.path.abspath(__file__)), "extra.txt")) if os.path.exists(os.path.join(os.path.dirname(os.path.abspath(__file__)), "extra.txt")) else []:
if line.strip():
k, v = line.split(None, 1)
EXTRA[k] = v.split()
ids = sys.argv[1:] or [c["id"] for c in CREATURES]
for cid in ids:
raw = f"{D}/{cid}-raw.png"
if not os.path.exists(raw):
print(cid, "missing raw"); continue
for size, colors in ((32, 16), (64, 24)):
cmd = [PY, "-I", T, raw, f"{D}/{cid}", "--views", "5", "--size", str(size), "--colors", str(colors),
"--feet", str(size - 1), "--outline-weight", "0.6"] + EXTRA.get(cid, [])
r = subprocess.run(cmd, capture_output=True, text=True)
print(cid, size, (r.stdout + r.stderr).strip().splitlines()[-1:])
prev = f"{D}/{cid}-{size}-preview.png"
if os.path.exists(prev):
os.remove(prev)
# contact sheets: 64 px versions at 2x with labels, 32 px at 2x beside
from PIL import ImageDraw
allids = [c["id"] for c in CREATURES]
for part, chunk in enumerate((allids[:10], allids[10:20], allids[20:])):
W = 320 * 2 + 20 + 160 * 2
im = Image.new("RGBA", (W, len(chunk) * 140), (96, 92, 104, 255))
d = ImageDraw.Draw(im)
for i, cid in enumerate(chunk):
y = i * 140
d.text((2, y), cid, fill=(255, 255, 255, 255))
for size, x, sc in ((64, 0, 2), (32, 660, 2)):
p = f"{D}/{cid}-{size}.png"
if os.path.exists(p):
s = Image.open(p).convert("RGBA")
s = s.resize((s.width * sc, s.height * sc), Image.NEAREST)
im.alpha_composite(s, (x, y + 12))
im.save(f"/tmp/sprites-contact-{part}.png")