Files
AIGame/Tools/enemy_design_sheet.py
T
udxandClaude Opus 5.5 89e0fa246f Add formal enemies, remaining formal partners and synthesized UI SFX
- 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>
2026-10-21 12:23:55 +08:00

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")