Files
Sprinter-SDCC/applications/PoP/poc/tools/build_room_palette.py
T
snark13 cd8d566d82 applications/PoP: порт Prince of Persia — PoC (roomtest) + пайплайн
Порт PoP на Sprinter.  Текущий PoC — applications/PoP/roomtest/:
комната 1 (фон-композиция тайлов) + Kid с управлением на raw-клавиатуре
и коллизией с картой.

- roomtest — pop_bg (фон), pop_kid (спрайты Kid, column-major флип,
  seqtbl-анимация), pop_ctrl (порт control() PoP на held-state
  kbd_raw), pop_map (коллизия seg004/005: бег/стоп у стены,
  падение/приземление, отскок seq_47, вертикальный прыжок K4.1).
  MEMORY=small (DATA сразу за CODE, ~23КБ кода не лезет в huge).
- toolchain (PoP) — pop_pack_kid/pop_pack_bg/render_room/extract —
  распаковка res-графики MSDOS в атласы + композиция комнат.
- toolchain/ (корень) — make_hdd.sh (быстрый HDD-тест вместо FDD),
  png_strip.py / room_compose.py (ассет-пайплайн).
- docs — PORT_PLAN, KID_PLAN, форматы ресурсов (Apple II / MSDOS / DAT).
- bgtest/coltest/poc — ранние PoC (фон, коллизия, первый прототип).

.gitignore: build-артефакты applications/*/*/*; исключены внешние
референс-репозитории (SDLPoP/mininim/PR/Apple-II — свои git-клоны) и
оригинальные game-данные MSDOS/ (копирайт, только для реверса форматов).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 17:51:08 +03:00

76 lines
3.3 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
"""
build_room_palette.py — сводит kid.pal (уже собран
gen_kid_placeholder.py) + Floor + Wall тайлы в ОДНУ merged-палитру
room.pal, грузимую ОДИН раз через gfx_pal_fload (см. poc.c) — экран
показывает Kid и тайлы ОДНОВРЕМЕННО, значит их "свои" цвета обязаны
жить в одной палитре (см. --seed-pal в toolchain/png_strip.py).
На вход — только типы, которые Фаза 1 реально рисует (room_draw
рисует только загруженные атласы; Floor/Wall — единственные твёрдые
типы с нетривиальной картинкой заглушки, см. gen_tile_placeholders.py
draw_floor_like/draw_wall_like). Остальные 30 типов из Фазы 1
исключены полностью (не грузятся, не рисуются, PORT_PLAN.md §5) —
добавить сюда, когда понадобятся.
Перезаписывает res/tiles/tile01.raw/.atl (Floor) и tile14.raw/.atl
(Wall, TILE_WALL=0x14 — room.c ищет "tile%02x.atl" ОБЯЗАТЕЛЬНО в hex,
не decimal!) с индексами палитры, согласованными с kid.pal; пишет
kid+floor+wall.pal рядом с kid.pal (poc.c грузит её вместо отдельной
kid.pal).
"""
import subprocess
import sys
from pathlib import Path
HERE = Path(__file__).resolve().parent
PROJ_ROOT = HERE.parents[3]
TILES_DIR = HERE.parent / "res" / "tiles"
PNG_STRIP = PROJ_ROOT / "toolchain" / "png_strip.py"
MKATLAS = PROJ_ROOT / "toolchain" / "mkatlas.py"
ROOM_TILE_W = 32
ROOM_ROW_H = 64
KID_PAL = HERE / "kid.pal"
OUT_PAL = HERE / "room.pal"
TYPES = [0x01, 0x14, 0x03, 0x13, 0x0E, 0x0B] # Floor, Wall, Pillar, Torch, Debris, Loose
# (2026-07-16: временное ограничение до 2 типов снято — корень
# вероятностного "снега" найден: tile_atlas_load()/room_draw() трогали
# W3 транзитивно (через atlas_load/gfx_blit_part) ИЗ БАНКА, который сам
# живёт в W3 — конфликт. Обе функции переехали в room_draw.c (HOME),
# см. её шапку.)
def run(cmd):
print("+", " ".join(str(c) for c in cmd))
subprocess.run([str(c) for c in cmd], check=True)
def main():
if not KID_PAL.exists():
sys.exit(f"build_room_palette: нет {KID_PAL} — сначала gen_kid_placeholder.py")
seed = KID_PAL
for t in TYPES:
base = f"tile{t:02x}" # room.c ищет "tile%02x.atl" — hex, не decimal
png = TILES_DIR / f"{t:X}-0.png"
raw = TILES_DIR / f"{base}.raw"
pal = TILES_DIR / f"{base}_merged.pal"
atl = TILES_DIR / f"{base}.atl"
run([sys.executable, PNG_STRIP, raw, pal, png,
"--canvas", f"{ROOM_TILE_W}x{ROOM_ROW_H}",
"--anchor", "top-left", "--seed-pal", seed])
run([sys.executable, MKATLAS, atl, f"{raw}:{ROOM_TILE_W}x{ROOM_ROW_H}:1x1"])
seed = pal
import shutil
shutil.copyfile(seed, OUT_PAL)
print(f"build_room_palette: итоговая палитра -> {OUT_PAL}")
if __name__ == "__main__":
main()