#!/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()