#!/usr/bin/env python3 from os import chdir from pathlib import Path from re import split from subprocess import run from sys import exit from scriptlib import SimulTemplateEntity, find_files, warn def find_entities(vfs_root): base = vfs_root / "public" / "simulation" / "templates" return [ str(fp.relative_to(base).with_suffix("")) for (_, fp) in find_files(vfs_root, ["public"], "simulation/templates", "xml") ] def main(): vfs_root = Path(__file__).resolve().parents[3] / "binaries" / "data" / "mods" simul_templates_path = Path("simulation/templates") simul_template_entity = SimulTemplateEntity(vfs_root) with open("creation.dot", "w", encoding="utf-8") as dot_f: dot_f.write("digraph G {\n") files = sorted(find_entities(vfs_root)) for f in files: if f.startswith("template_"): continue print(f"# {f}...") entity = simul_template_entity.load_inherited(simul_templates_path, f, ["public"]) if ( entity.find("Builder") is not None and entity.find("Builder").find("Entities") is not None ): entities = ( entity.find("Builder") .find("Entities") .text.replace("{civ}", entity.find("Identity").find("Civ").text) ) builders = split(r"\s+", entities.strip()) for builder in builders: if Path(builder) in files: warn(f"Invalid Builder reference: {f} -> {builder}") dot_f.write(f'"{f}" -> "{builder}" [color=green];\n') if ( entity.find("TrainingQueue") is not None and entity.find("TrainingQueue").find("Entities") is not None ): entities = ( entity.find("TrainingQueue") .find("Entities") .text.replace("{civ}", entity.find("Identity").find("Civ").text) ) training_queues = split(r"\s+", entities.strip()) for training_queue in training_queues: if Path(training_queue) in files: warn(f"Invalid TrainingQueue reference: {f} -> {training_queue}") dot_f.write(f'"{f}" -> "{training_queue}" [color=blue];\n') dot_f.write("}\n") if run(["dot", "-V"], capture_output=True, check=False).returncode == 0: exit( run( ["dot", "-Tpng", "creation.dot", "-o", "creation.png"], text=True, check=False ).returncode ) if __name__ == "__main__": chdir(Path(__file__).resolve().parent) main()