#!/usr/bin/env python3 """TEXT-Chunk -> PNG-Seiten (+ texinfo.txt) und zurück. text_export.py export level.wad outdir # pageNN_fXX.png, texinfo.txt text_export.py import level.wad outdir neu.wad # geänderte PNGs zurückschreiben """ import glob import os import re import sys import numpy as np from PIL import Image sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) import textchunk as T # noqa: E402 import wadtool # noqa: E402 def main(): cmd, wad, out = sys.argv[1:4] ch = wadtool.read(wad) tc = wadtool.get(ch, 'TEXT') t = T.parse(tc[1]) if cmd == 'export': os.makedirs(out, exist_ok=True) for i, p in enumerate(t['pages']): if p['flags'] == 0: Image.fromarray(p['px']).save(f'{out}/page{i:02d}_f{p["flags"]:02x}.png') else: Image.fromarray(T.abgr1555_to_rgba(p['px'])).save(f'{out}/page{i:02d}_f{p["flags"]:02x}.png') with open(f'{out}/texinfo.txt', 'w') as f: f.write('# idx flags page clut x0 x1 y0 y1\n') for i, e in enumerate(T.tex_entries(t['tail'])): f.write(f'{i} {e[0]:#06x} {e[1]} {e[2]:#04x} {e[3]} {e[4]} {e[5]} {e[6]}\n') print(f'{len(t["pages"])} Seiten, {len(T.tex_entries(t["tail"]))} Texturen -> {out}') elif cmd == 'import': for fn in glob.glob(f'{out}/page*.png'): i = int(re.search(r'page(\d+)', fn).group(1)) p = t['pages'][i] img = np.asarray(Image.open(fn).convert('RGBA')) assert img.shape[:2] == (p['h'], p['w']), fn new = T.rgba_to_abgr1555(img) # unveränderte Pixel exakt erhalten (Rundung 8->5 Bit verlustfrei rückwärts) old = T.abgr1555_to_rgba(p['px']) same = (old == img).all(-1) p['px'] = np.where(same, p['px'], new).astype(np.uint16) tc[1] = T.build(t) wadtool.write(sys.argv[4], ch) print('geschrieben:', sys.argv[4]) if __name__ == '__main__': main()