#!/usr/bin/env python3 """ build_tile_atlases.py — собирает tileNN.atl для всех 32 типов тайлов из applications/PoP/poc/res/tiles/{TYPE:X}-{N}.png (см. gen_tile_placeholders.py). Для каждого типа находит ВСЕ файлы {TYPE:X}-*.png (сколько бы вариантов ни было — 1 заглушка или много настоящих), сортирует по номеру варианта и собирает через png_strip.py + mkatlas.py. Типы без ни одного файла — пропускаются (room_draw их и так не рисует). Запускать заново каждый раз, когда добавили/заменили картинки в res/tiles/ — атласы просто пересоберутся. """ import re import subprocess import sys from pathlib import Path HERE = Path(__file__).resolve().parent PROJ_ROOT = HERE.parents[3] # .../C-Compiler TILES_DIR = HERE.parent / "res" / "tiles" OUT_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 # см. room.c room_row_h — держать в синхроне PATTERN = re.compile(r"^([0-9A-Fa-f]+)-(\d+)\.png$") def run(cmd): print("+", " ".join(str(c) for c in cmd)) subprocess.run([str(c) for c in cmd], check=True) def main(): by_type = {} for f in TILES_DIR.glob("*.png"): m = PATTERN.match(f.name) if not m: continue t = int(m.group(1), 16) n = int(m.group(2)) by_type.setdefault(t, {})[n] = f if not by_type: sys.exit(f"build_tile_atlases: нет файлов TYPE-N.png в {TILES_DIR}") built = 0 for t in sorted(by_type): variants = by_type[t] files = [variants[n] for n in sorted(variants)] strip_raw = OUT_DIR / f"tile{t:02x}.raw" strip_pal = OUT_DIR / f"tile{t:02x}.pal" atl = OUT_DIR / f"tile{t:02x}.atl" run([sys.executable, PNG_STRIP, strip_raw, strip_pal, *files, "--canvas", f"{ROOM_TILE_W}x{ROOM_ROW_H}", "--anchor", "top-left"]) run([sys.executable, MKATLAS, atl, f"{strip_raw}:{ROOM_TILE_W}x{ROOM_ROW_H}:{len(files)}x1"]) built += 1 print(f"build_tile_atlases: собрано {built} атласов " f"(типы: {', '.join('%X' % t for t in sorted(by_type))})") if __name__ == "__main__": main()