#!/usr/bin/env python3 """ gen_launchers.py -- generate one Windows .bat per runnable staged scene (patha\\launch\\RUN__.BAT), each starting the virtual board + window + DOSBox via run_demo.py. Also writes launch\\MENU.BAT (a picker). Skips scenes in the MUNGA key=value dialect (they hang FLYK's parser) and the known cwd-only loaders (HPDAVE BDEMO/SAND/TEMP). python gen_launchers.py """ import os, re, glob HERE = os.path.dirname(os.path.abspath(__file__)) STAGE = r"c:\temp\flykc" OUT = os.path.join(HERE, "launch") SKIP = {("HPDAVE", "BDEMO"), ("HPDAVE", "SAND"), ("HPDAVE", "TEMP")} def munga_dialect(path): """MUNGA map-scenes use key=value lines (viewangle=60.0) FLYK can't read.""" try: head = open(path, encoding='latin1').read(600) except OSError: return True return bool(re.search(r'(?m)^\s*(viewangle|clip|fog|backgnd)\s*=', head)) def main(): os.makedirs(OUT, exist_ok=True) entries = [] for prod in ("HPDAVE", "STDAVE", "RPDAVE", "BTDAVE", "FX"): pdir = os.path.join(STAGE, prod) if not os.path.isdir(pdir): continue for scn in sorted(glob.glob(os.path.join(pdir, "*.SCN"))): name = os.path.splitext(os.path.basename(scn))[0].upper() if (prod, name) in SKIP or munga_dialect(scn): continue # ambient particle sim only where it belongs (underwater HPDAVE) sfx = " --sfx" if (prod, name) in { ("HPDAVE", "SHARKS"), ("HPDAVE", "SDEMO"), ("HPDAVE", "BDDEMO"), ("HPDAVE", "FISHSPLS"), ("HPDAVE", "BDPAL")} else "" bat = os.path.join(OUT, f"RUN_{prod}_{name}.BAT") with open(bat, "w") as fp: fp.write( "@echo off\r\n" f"rem {prod}\\{name}.SCN on the virtual VelociRender board\r\n" f"cd /d \"{HERE}\"\r\n" f"python run_demo.py {name} --dir {prod} --prefix {name.lower()}{sfx}\r\n" "pause\r\n") entries.append((prod, name)) print(f" RUN_{prod}_{name}.BAT") with open(os.path.join(OUT, "MENU.BAT"), "w") as fp: fp.write("@echo off\r\nsetlocal enabledelayedexpansion\r\n:menu\r\ncls\r\n" "echo === DPL3 virtual VelociRender scene launcher ===\r\necho.\r\n") for i, (prod, name) in enumerate(entries, 1): fp.write(f"echo {i:3}. {prod:8} {name}\r\n") fp.write("echo.\r\nset /p pick=scene number (or Q): \r\n" "if /i \"%pick%\"==\"Q\" exit /b\r\n") for i, (prod, name) in enumerate(entries, 1): fp.write(f"if \"%pick%\"==\"{i}\" call \"%~dp0RUN_{prod}_{name}.BAT\"\r\n") fp.write("goto menu\r\n") print(f"\n{len(entries)} launchers + MENU.BAT -> {OUT}") if __name__ == "__main__": main()