#!/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 = [ ("immersion_tank", "an open-top industrial immersion cooling tank filled with glowing clear mineral oil, server boards submerged inside, tubes and a small pump, sci-fi green glow"), ("crac_unit", "a tall white industrial precision air conditioning unit for server rooms, floor standing, vent grilles, small status screen"), ] ROOMS = [ ("warehouse", "empty isometric industrial warehouse interior for a video game, 2:1 isometric projection, " "two visible corrugated metal walls meeting at back corner, huge bare concrete floor with subtle " "square grid lines, steel roof trusses hinted at top, high windows, sodium work lights, night time, " "moody blue-purple lighting with cyan accents, no shelving, no vehicles, 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")