#!/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)} Б)")