Files
AIGame/Tools/generate_t2_accessory_designs.py

66 lines
4.9 KiB
Python

#!/usr/bin/env python3
"""T2 evolution accessory concept drafts (one head accessory per partner) via the LAN local Turbo API.
T2 keeps the validated T1 mesh, rig and clips and adds a bone-attached accessory, so each draft shows the accessory ALONE,
as a single solid object for image-to-3D. Image 1 = the partner's own design (palette/element only), image 2 = FireCat style.
Drafts go to Doc/Design/Character/{Partner}/T2/drafts/.
Usage:
python Tools/generate_t2_accessory_designs.py # all ten
python Tools/generate_t2_accessory_designs.py FireCat # selected only
"""
from __future__ import annotations
import json
import sys
import requests
from generate_enemy_designs import ROOT, run, status
CHAR = ROOT / "Doc/Design/Character"
STYLE = CHAR / "FireCat/firecat.png"
COMMON = (
"Image 1 shows the companion creature that will wear this accessory: use it ONLY for its palette and element theme, do NOT draw the "
"creature. Image 2 is STYLE ONLY: match its friendly polished chibi 3D mobile-game render and clean rounded readable shapes. "
"Draw exactly ONE small evolution accessory object ALONE, as a game asset for image-to-3D: a chunky solid head-top piece with a "
"flat or gently curved base that would sit on top of a round creature head, compact and roughly as wide as it is tall. "
"Every part is one continuous attached solid piece: no floating gems, no separate sparks, droplets, petals or particles, no thin "
"wires, no chains, no strings. Centered, front three-quarter view from slightly above, whole object in frame with generous margin. "
"Pure solid white #FFFFFF background to all corners, soft studio light, tiny contact shadow. Simple smooth stylized surfaces suitable "
"for a 400-triangle model with a 512 texture. No creature, no head, no body, no text, no watermark, no UI, no stand, no scenery."
)
ACCESSORIES = [
{"id": "RockBall", "pet": 0, "seed": 100001, "subject": "A rock-element evolution crown: a ring of three chunky faceted cyan crystals rising from a rounded grey stone base, the middle crystal tallest."},
{"id": "FireCat", "pet": 1, "seed": 101001, "subject": "A fire-element evolution crest: a single solid stylized flame shape in orange, yellow and red, three soft rounded flame tongues rising from a small golden band base."},
{"id": "BudBud", "pet": 2, "seed": 102001, "subject": "A grass-element evolution bloom: one large open five-petal flower in soft yellow and white with a golden center, sitting on a small cluster of three thick mint leaves as the base."},
{"id": "SparkBird", "pet": 3, "seed": 103001, "subject": "A lightning-element evolution crest: a small golden crown with three solid zigzag lightning-bolt points in bright yellow and cyan."},
{"id": "BubbleTurtle", "pet": 4, "seed": 104001, "subject": "A water-element evolution crown: a small rounded coral crown in soft pink and aqua with two smooth pearl spheres embedded in the front, all fused into one piece."},
{"id": "RockRhino", "pet": 5, "seed": 105001, "subject": "A rock-element evolution helm crest: a chunky faceted teal crystal ridge, three crystals in a row from front to back, set in a rounded grey stone base."},
{"id": "FlameLion", "pet": 6, "seed": 106001, "subject": "A fire-element evolution crown: a small golden crown with five rounded solid flame-shaped points in orange and red, a red gem embedded in the front."},
{"id": "VineSprite", "pet": 7, "seed": 107001, "subject": "A grass-element evolution wreath crown: a thick ring of overlapping forest-green leaves with three fused pink blossoms on the front, solid and chunky."},
{"id": "ThunderLeopard", "pet": 8, "seed": 108001, "subject": "A lightning-element evolution crown: a small silver-violet crown with three solid cyan zigzag lightning-crystal spikes, the middle one tallest."},
{"id": "TideWhale", "pet": 9, "seed": 109001, "subject": "A water-element evolution crown: a rounded seashell crown in pale blue and white, a spiral shell in the middle flanked by two smaller shells, fused into one piece with a pearl in front."},
]
def main() -> None:
wanted = set(sys.argv[1:])
with requests.Session() as session:
state = status(session)
if not (state.get("connected") and state.get("ready")):
raise SystemExit(f"local images not ready: {state}")
for a in ACCESSORIES:
if wanted and a["id"] not in wanted:
continue
refs = [CHAR / a["id"] / f"{a['id'].lower()}.png", STYLE]
# run() writes into {design}/{id}/drafts, so id "T2" lands them in Doc/Design/Character/{Partner}/T2/drafts.
rec = run({**a, "id": "T2", "partner": a["id"], "name": a["id"] + " T2 accessory", "role": "T2 evolution head accessory"}, session, design=CHAR / a["id"], refs=refs, common=COMMON)
print(json.dumps({"id": a["id"], "status": rec["status"], "drafts": len(rec["drafts"]), "error": rec["error"]}, ensure_ascii=False))
if __name__ == "__main__":
main()