#!/usr/bin/env python3 """Apply a generated variant to a Minecraft instance (game closed!). python3 apply_variant.py # e.g. C1, dh-r64, T-deck Copies every config file of out// over the instance. options.txt is *merged* key by key, so GUI scale, resolution, keybinds etc. survive variant switches. Prints what changed. Stdlib only; works on Windows too. """ import shutil import sys from pathlib import Path HERE = Path(__file__).resolve().parent def merge_options(src, dst): new = dict(l.split(":", 1) for l in src.read_text().splitlines() if ":" in l) lines = dst.read_text().splitlines() if dst.exists() else [] seen, out, changed = set(), [], [] for l in lines: k = l.split(":", 1)[0] if k in new: seen.add(k) if l != f"{k}:{new[k]}": changed.append(f"{k}:{new[k]}") l = f"{k}:{new[k]}" out.append(l) for k, v in new.items(): if k not in seen: out.append(f"{k}:{v}") changed.append(f"{k}:{v} (added)") dst.write_text("\n".join(out) + "\n") return changed def main(): if len(sys.argv) != 3: sys.exit(__doc__) vid, game = sys.argv[1], Path(sys.argv[2]) src = HERE / "out" / vid if not src.is_dir(): sys.exit(f"{src} missing - run build.py first") if not (game / "mods").is_dir(): sys.exit(f"{game} doesn't look like a .minecraft dir (no mods/)") for f in sorted(p for p in src.rglob("*") if p.is_file()): rel = f.relative_to(src) dst = game / rel if rel.as_posix() == "options.txt": for c in merge_options(f, dst): print(f"options.txt {c}") continue dst.parent.mkdir(parents=True, exist_ok=True) shutil.copyfile(f, dst) print(f"copied {rel.as_posix()}") (game / "BENCH_VARIANT.txt").write_text(vid + "\n") print(f"applied {vid}; recorded in BENCH_VARIANT.txt") main()