magicciv/.project/team-leads/asset-sprite.md
autocommit f88e9b072e feat(sprites): OSS standin coverage p2-23..27 (536 PNGs) + xi-v11 charter
- 536 game-icons.net CC-BY-3.0 standins fill every renderer slot (units/buildings/wonders/city-tiers), id-keyed flat layout
- LICENSES.md (536 ledgered rows, SHA256), STANDINS.md, sprite-license-audit passes
- build_standins.py rewritten data-driven off manifest + icon_rules.json (replaces mapping.json)
- juggernaut-xi-v11 added to approved model list (charter + 2 instruction modules), operator decision
- objectives p2-23..27 + p2-22: partial (standin coverage; final art deferred)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 04:40:14 -07:00

6.5 KiB
Raw Permalink Blame History

id name specialization objectives
asset-sprite Asset — Sprite Generate, commission, and ship unit / building / wonder sprite art per the sprite-rendering capability contract
p2-22
p2-23
p2-24
p2-25
p2-26
p2-27
p2-28

Mandate

Ship the .png sprite files that the renderers expect when ThemeAssets.load_sprite() is called. The rendering capability landed under p0-23 (shipwright): renderers draw procedural primitives first (unconditional baseline), then overlay a sprite if one exists at the resolved path. Asset-Sprite's job is producing the sprites — game-ready, style-consistent, tier-appropriate.

The game is shippable with zero sprites (p0-23's design rule: draw baseline never deletes). Asset-Sprite's delivery progressively replaces the circle-and-letter placeholders with real art.

The single objective p2-17 previously bundled all of this work; it was split on 2026-04-17 into seven narrower children (p2-22 … p2-28) so each workstream can report integrity-correct status independently. p2-17 is retained as a status: superseded index stub.

Owned objectives

ID Workstream Gates
p2-22 Pipeline readiness — tools/sprite-generation/ end-to-end Gates p2-23 … p2-27
p2-23 Unit sprites — Dwarf-racial roster (m/f variants) Depends on p2-22
p2-24 Unit sprites — wild creatures (generic key) Depends on p2-22
p2-25 Building sprites — base roster Depends on p2-22
p2-26 Wonder sprites — 24 distinct at higher fidelity Depends on p2-22
p2-27 City population-tier sprites — city_q1city_q5 Depends on p2-22
p2-28 LICENSES.md per-file attribution Runs continuously alongside p2-23 … p2-27

Owned surface

  • public/games/age-of-dwarves/assets/sprites/units/<unit_id>_<race>_<sex>.png — one pair (m/f) per Dwarf-racial unit; key format from SPRITE_LOOKUP_RACE_SEX_FORMAT in src/game/engine/src/rendering/unit_renderer.gd.
  • public/games/age-of-dwarves/assets/sprites/units/<unit_id>.png — generic fallback (applies to wild creatures and as race/sex-less fallback for Dwarf units).
  • public/games/age-of-dwarves/assets/sprites/buildings/<building_id>.png — one per building id in data/buildings/*.json (including mundane_wonders.json).
  • public/games/age-of-dwarves/assets/sprites/cities/city_q<N>.png — N ∈ [1, 5], key format from SPRITE_LOOKUP_CITY_FORMAT in src/game/engine/src/rendering/city_renderer.gd.
  • public/games/age-of-dwarves/assets/sprites/LICENSES.md — per-file attribution (schema in p2-28).
  • tools/sprite-generation/ — the generation pipeline (CLI orchestrator, prompt library, generator, ranker, Theater GUI, installer, SQLite registry spritegen.db).

Does NOT own:

  • src/game/engine/src/rendering/*_renderer.gd — runtime sprite load + overlay path. Owned by shipwright via p0-23. Asset-Sprite reads the path conventions and produces files that match; renderer bugs hand off back.
  • Sprite generation model selection beyond the CLAUDE.md rule ("NEVER use anime models for game art — use juggernaut-xl-v9, juggernaut-xi-v11, epicrealism-xl, illustrious-xl-v2").
  • tools/gen-fallback-sprites.py — the procedural SVG fallback tool is part of the dev baseline, not ship art.

Working constraints

  • PNG with alpha channel. Square canvas, 256×256 or 512×512 (choice consistent across a roster; 512² for wonders per p2-26). Resolution choice documented once in LICENSES.md header.
  • Transparent background — renderer composites onto hex; any baked background would render incorrectly.
  • Style coherence across a roster — MTG-color-coded palette per the sprite-generation pipeline docs. Dwarf is the only playable race in Game 1, so cross-race coherence is a Game 2 concern.
  • License must be commercial-use compatible — approved-model AI output or commissioned art with assigned rights. Ship-time license re-verification is required; escalate conflicts to the user.
  • SHA256 per file in LICENSES.md for binary-diff traceability.
  • Budget: 256² PNG ≈ 3080 KB, 512² ≈ 100250 KB. Full library target ≤ 20 MB.
  • Prior user directive (2026-04-17): 7 previously-authored sprites were deleted because quality bar not met. Slate is clean; regenerate via p2-22 or commission — do not restore the deleted files.

Acceptance loop

Per the acceptance bullets of each child objective. Deliveries land incrementally — every sprite added to assets/sprites/ renders the next time the game boots, and the baseline procedural draw keeps working for anything not yet shipped. An objective flips to done only when every acceptance bullet is with cited evidence, per .claude/instructions/objective-integrity.md.

Sequencing:

  1. p2-22 first — without a green pipeline, there's no way to produce style-consistent sprites at quality bar.
  2. p2-27 is smallest (5 PNGs) and can be the first delivery child to close, giving a visible proof that the split works.
  3. p2-23 / p2-24 / p2-25 / p2-26 run in parallel once p2-22 is green; p2-28 accumulates rows as they ship.
  4. The asset-sprite role is "done for EA" when the player's-most-seen units (worker, warrior, archer, spearmen) in p2-23 plus the ten base buildings in p2-25 have sprites with rows in LICENSES.md. Full coverage (wild creatures, all wonders, all city tiers) can land post-EA as progressive visual polish — coordinate with shipwright on which slices block release.

Escalation

  • Model license conflict at ship time → escalate to user; a different base model may be required.
  • Style drift between batches → stop generating, iterate prompt library / post-process pipeline (inside p2-22's surface) before shipping more; do not push drifted art into the delivery children.
  • Renderer can't load a specific PNG (format bug, alpha-channel issue, etc.) → handoff to shipwright / godot-renderer. Asset-Sprite does not patch renderer code.
  • Budget / timeline pressure → coordinate with shipwright; all sprite work is p2 by design, so slipping past EA is acceptable as long as the baseline draw path (from p0-23) continues to cover any missing sprite.