- UI SFX v3: procedurally synthesized one-shots (Tools/synth_ui_sfx.py) wired to buttons, rewards, errors and red dots via UiSfx, gated by the SFX setting. - Five formal enemies (Hornlet, Dashlet, Shellhorn, HornCaptain, GreatHorn): Hunyuan 50k -> 2000-tri XPbr, DGXA TokenRig, Idle/Walk/Attack, nested per type in PrototypeArena; PrototypeBattle.Enemy gains presentation-only Moving/Strikes. - Formal partners for all ten pets in the arena and portraits, including new VineSprite, ThunderLeopard and TideWhale. - Pipeline fixes: reject local TokenRig fallback, drop loose mesh islands, configurable Unity run_script timeout, companion static stage. - Also includes concurrent work from another tool in this working tree (FlameLion, enemy combat FX, challenge mode, home explorer, server updates). - Resources registered in Doc/ResDesc_*.md; verified on isolated :18081. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
23 lines
1.1 KiB
Python
23 lines
1.1 KiB
Python
#!/usr/bin/env python3
|
|
"""Contact sheet of enemy concept drafts (rows = enemies, columns = seeds) for picking: Doc/Design/Character/Enemy/drafts_sheet.png"""
|
|
from pathlib import Path
|
|
from PIL import Image, ImageDraw, ImageFont
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
DESIGN = ROOT / "Doc/Design/Character/Enemy"
|
|
ORDER = ["Hornlet", "Dashlet", "Shellhorn", "HornCaptain", "GreatHorn"]
|
|
CELL, LABEL = 320, 28
|
|
rows = [(n, sorted((DESIGN / n / "drafts").glob("*.png"))) for n in ORDER if (DESIGN / n / "drafts").exists()]
|
|
cols = max(len(f) for _, f in rows)
|
|
sheet = Image.new("RGB", (cols * CELL, len(rows) * (CELL + LABEL)), "white")
|
|
draw = ImageDraw.Draw(sheet)
|
|
font = ImageFont.load_default()
|
|
for r, (name, files) in enumerate(rows):
|
|
for c, f in enumerate(files):
|
|
im = Image.open(f).convert("RGB"); im.thumbnail((CELL, CELL))
|
|
x, y = c * CELL, r * (CELL + LABEL)
|
|
sheet.paste(im, (x, y + LABEL))
|
|
draw.text((x + 6, y + 8), f"{name} #{c + 1} ({f.stem.split('_')[-1]})", fill="black", font=font)
|
|
sheet.save(DESIGN / "drafts_sheet.png")
|
|
print(DESIGN / "drafts_sheet.png")
|