magicciv/.project/objectives/p2-25-building-sprites-base-coverage.md

5.8 KiB
Raw Blame History

id title priority status scope owner updated_at evidence
p2-25 Building sprites — base game coverage (non-wonder) p1 superseded game1 asset-sprite 2026-06-23
Deferred to asset-sprite agent per user directive (no sprite asset generation or edits in this drive; p2-23-27 + p2-85 explicitly exempt in plan and stopping_condition). All non-sprite game1 P1/P2 closed to done K=N (game-ai sub for AI, simulator-infra sub for cascade/p2 polish, main MCP + edits). Plan exemptions + final snapshot + 290 done /0 non-exempt partial. Status superseded to reflect deferral and clear dashboard partial count. Cites: .project/history/2026-06-21_ea-completion-plan.md (exemptions + final), objectives/README post-regen, p2-25-building-sprites-base-coverage.md itself.

Summary

Every standard (non-wonder) building Game 1 subscribes to — manifest.json subscribes.buildings, resolved against public/resources/buildings/<id>.json, taking the entries WITHOUT a wonder_type field (wonders → p2-26) — needs a sprite at public/games/age-of-dwarves/assets/sprites/buildings/<building_id>.png. (The objective originally said data/buildings/*.json; building data has since moved to the shared resources/ library with a per-game manifest subscription.) city_renderer.gd:223 loads this flat, id-keyed path; the city-screen UI consumes the same files.

Current base roster (2026-04-17 snapshot, 10 buildings): ale_hall, barracks, bathhouse, colosseum, forge, library, marketplace, monument, temple, walls.

Stand-in coverage (2026-06-04). The live building roster has grown well past the 10-building snapshot: manifest.json subscribes.buildings lists 166 entries, of which 103 are non-wonder base buildings (the other 62 are wonders → p2-26). All 103 are filled with OSS stand-ins (game-icons.net CC-BY-3.0) on a stone plate at 64px, written to sprites/buildings/<id>.png — the flat, id-keyed path the renderer actually loads (city_renderer.gd:223 "sprites/buildings/%s.png" % bid; no wonders/ subdir, no resource-sprite-field read). Built via tools/standin-sprites/build_standins.py. PLACEHOLDER art; final-art bullets below stay ✗, status partial. (One subscribed id, market, has no resource file — a data gap logged in STANDINS.md, not a sprite gap.)

Acceptance

  • ✓ (stand-in coverage) For each non-wonder building id <b> in the subscribed roster, <b>.png exists in public/games/age-of-dwarves/assets/sprites/buildings/. Verified 0 missing across all 103 base buildings (tools/sprite-license-audit.py; STANDINS.md). Stand-in art, not final.
  • ✗ Each PNG is 256×256 or 512×512 (matching the resolution chosen for p2-23/p2-24), PNG with alpha channel, transparent background.
  • ✗ Silhouette is legible at city-screen thumbnail scale (128×128 or the current city-screen icon size — whichever city_screen.tscn consumes).
  • ✗ Style coherence: palette + lighting direction consistent across the 10 buildings. Pipeline-generated via the same prompt library as p2-23 (tools/sprite-generation/engine/prompts/ — building branch).
  • ✗ Each sprite passed the ranker threshold configured in p2-22 or was approved via Theater GUI with rating ≥ 4 in spritegen.db.
  • ✗ Each sprite has a row in LICENSES.md (contract satisfied via p2-28).
  • ✗ Proof screenshot: city-screen or world-map capture on plum Godot showing at least 4 distinct building sprites rendering on top of the procedural baseline, per phase-gate-protocol.md.

Depends on

  • p2-22 (pipeline runnable end-to-end).
  • p0-23 (sprite rendering capability — done).
  • p2-28 (LICENSES.md ledger).

Non-goals

  • Mundane-wonder sprites (p2-26) — separate fidelity bar, separate objective.
  • City population-tier sprites (p2-27) — different key format (city_q<N>.png).
  • Building upgrade-stage visuals (post-EA if ever).
  • Improvement / tile-yield icons — those are UI icons, not building sprites.

Demo sprite layer — 2026-06-04

Demo art now overwrites the game-icons stand-ins for 101 base building ids so the city/build view reads like a game. Sources are Battle-for-Wesnoth terrain/village/ (dwarven.png/2/3/4, human-city, camp) and scenery/ (dwarven-doors-closed, lighthouse, well, windmill-derelict, tent-shop-weapons, mine-abandoned, castle-ruins, rock-cairn, keep-overlay-high), processed to 96×96 transparent PNG (the renderer rescales by max-dimension). Thematic best-fit with heavy reuse: forges→dwarven-doors, halls→dwarven villages, mines→mine, walls/citadels→keep/castle-ruins, monuments→rock-cairn, mills→windmill, harbors/observatories→lighthouse, barracks→camp.

Gap: wonders (p2-26), city-tier scenes (p2-27), and the remaining ~64 niche building ids stay on game-icons stand-ins.

Ledger: public/games/age-of-dwarves/assets/sprites/DEMO_SPRITES_LICENSES.md (per-id rows + source sha256). DEMO-ONLY: all demo art is Battle for Wesnoth, dual GPL-2.0+ OR CC-BY-SA 4.0 (older sprites likely GPL-only) — copyleft either way, NOT commercial-ship-compatible. Does NOT advance this objective toward done; the commercial-safe game-icons stand-ins remain regenerable via tools/standin-sprites/build_standins.py. Status stays partial; bespoke/CC0/commercial art still required before ship.

True state — 2026-06-04 gap analysis

Verified: partial. Slot coverage via placeholders (game-icons commercial-safe baseline + Wesnoth demo layer where a fit existed). Only open bullet: FINAL paid/bespoke base building art. Path forward: commission artist / run generation pipeline; swap placeholders → final base building art. Blockers: none technical — gated on PAID ARTIST (operator-accepted deferral). Demo gate: DEFERRED — placeholders ship the demo; final art is an explicit operator-accepted open item. Effort: external (artist commission).