Rooms are data now: geometry per backdrop, sim and renderer both room-aware. First expansion beat: Move HQ to the garage ($3k) — 14x14 of concrete and 2.4kW of service, MODELBEAST-generated backdrop. Heat got teeth: packed carriers choke airflow (+15% heat per extra card) and throttling no longer self-regulates temps, so a crammed rig sustained over 95C ignites — device and cards destroyed, fire spreads heat and can cascade; click flames to beat them out with a hoodie, or a CO2 extinguisher within 3 tiles sacrifices itself automatically. Used cards (P106, MTT S80, RX 580) now die under load. Attention tools: ad-spend slider with log-diminishing hype, and the email Spam Blast — instant catalog-wide views on a 60s cooldown with a 15% blacklist gamble. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
44 lines
1.7 KiB
Python
44 lines
1.7 KiB
Python
#!/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")
|