Files
Sprinter-SDCC/applications/PoP/poc/tools/gen_kid_placeholder.py
T

68 lines
2.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
"""
gen_kid_placeholder.py — временная ЗАГЛУШКА персонажа для PoC.
НЕ используем графику оригинальной Prince of Persia (авторские права
Broderbund/Ubisoft) — PoC проверяет управление/коллизии/движок, не
визуальную точность (applications/PoP/docs/PORT_PLAN.md §5). Вместо
этого берём уже лицензированный спрайт-пак, который в проекте и так
используется (examples/rpgwalk/conv_sprites.py) —
third_party/16x16-RPG-characters, один персонаж (индекс 0) той же
раскладкой: 12 кадров (dir*3+frame, dir 0=вниз/1=влево/2=вправо/3=вверх,
3 кадра маятника на направление).
Замену на настоящую графику Кида (если/когда появится легально чистый
источник) пользователь делает сам — вне этого скрипта.
Выход: kid.raw (16×192, 12 кадров) + kid.pal (EGA 16 + цвета спрайта).
"""
from PIL import Image
SRC = ("../../third_party/16x16-RPG-characters/sprites/"
"old-style/02-bard.png")
CHAR = 0 # какой из 8 персонажей листа берём
EGA = [ # B, G, R, pad — как в libbgi/bgi256/_bgi_mode_set.c
(0, 0, 0), (168, 0, 0), (0, 168, 0), (168, 168, 0),
(0, 0, 168), (168, 0, 168), (0, 84, 168), (168, 168, 168),
(84, 84, 84), (255, 84, 84), (84, 255, 84), (255, 255, 84),
(84, 84, 255), (255, 84, 255), (84, 255, 255), (255, 255, 255),
]
BASE = 16
im = Image.open(SRC).convert("RGBA")
assert im.size == (192, 128), im.size
colors = {}
def px(x, y):
r, g, b, a = im.getpixel((x, y))
if a < 128:
return 0xFF
key = (r, g, b)
if key not in colors:
assert BASE + len(colors) < 0xFF
colors[key] = BASE + len(colors)
return colors[key]
bx, by = (CHAR % 4) * 48, (CHAR // 4) * 64
data = bytearray()
for d in range(4):
for f in range(3):
for y in range(16):
for x in range(16):
data.append(px(bx + f * 16 + x, by + d * 16 + y))
open("kid.raw", "wb").write(data)
pal = bytearray()
for b, g, r in EGA:
pal += bytes((b, g, r, 0))
for (r, g, b) in colors:
pal += bytes((b, g, r, 0))
open("kid.pal", "wb").write(pal)
print(f"gen_kid_placeholder: kid.raw 16x192 (12 кадров), "
f"kid.pal EGA+{len(colors)} цветов ({len(pal)} Б)")