48 lines
2.1 KiB
Python
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")
|