#!/usr/bin/env python3 """One-off: generate additional sprites without re-running the whole batch. Usage: python3 tools/mb_add.py (edit NEW below per run)""" import json, pathlib, sys sys.path.insert(0, str(pathlib.Path(__file__).parent)) from mb_gen import ROOT, STYLE, flux_spec, run_batch, upload, beat NEW = [ ("extinguisher", "a red CO2 fire extinguisher standing on the floor"), ] ROOMS = [ ("garage", "empty isometric double garage interior for a video game, 2:1 isometric projection, " "two visible walls meeting at back corner, sealed metal roller door on one wall, bare concrete " "floor with subtle square grid lines, exposed stud walls, hanging work light, night time, " "moody blue-purple lighting with one neon strip, no vehicles, no furniture, no people, no text, " "clean detailed painterly game art", 1024, 768), ] gen = ROOT / "public/assets/gen" run_batch([flux_spec(n, d, w, h) for n, d, w, h in ROOMS], gen) raw = run_batch([flux_spec(n, STYLE + d, 768, 768) for n, d in NEW], gen) beat("bg removal for new sprites") cuts = run_batch( [(f"{n}_cut", "bg_remove_local", upload(gen / f"{n}.png"), {"resolution": 1024, "background": "transparent"}) for n, _ in NEW], gen) # autocrop like the main pipeline from PIL import Image for n, _ in NEW: p = gen / f"{n}_cut.png" im = Image.open(p).convert("RGBA") bbox = im.split()[-1].getbbox() if bbox: l, t, r, b = bbox im.crop((max(0, l - 8), max(0, t - 8), min(im.width, r + 8), min(im.height, b + 8))).save(p) mpath = ROOT / "tools/mb_manifest.json" m = json.loads(mpath.read_text()) m.update(raw); m.update(cuts) mpath.write_text(json.dumps(m, indent=2)) beat(f"added {list(raw)} + cuts")