magicciv/.project/objectives/p2-27-city-population-tier-sprites.md

4.6 KiB
Raw Permalink Blame History

id title priority status scope owner updated_at evidence
p2-27 City population-tier sprites — city_q1 through city_q5 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-27-city-population-tier-sprites.md itself.

Summary

CityRenderer looks up a city's sprite via SPRITE_LOOKUP_CITY_FORMAT = "sprites/cities/city_q%d.png" (city_renderer.gd:29) with the quality bucket computed as clampi(city.population / CITY_QUALITY_BUCKET + 1, 1, CITY_QUALITY_MAX) — five buckets, five PNGs. Tiny scope relative to the other children, but the key format and renderer path are distinct enough to warrant its own objective — can flip done early.

Stand-in coverage (2026-06-04). All five tiers filled with OSS stand-ins (game-icons.net CC-BY-3.0, hut → huts-village → village → hill-fort → castle — a clear size/density progression) at sprites/cities/city_q<N>.png, the exact path city_renderer.gd:29 SPRITE_LOOKUP_CITY_FORMAT loads. Built via tools/standin-sprites/build_standins.py. PLACEHOLDER art; final-art bullets (native 256/512px, ranker, reviewed proof screenshot) stay ✗, status partial.

Acceptance

  • ✓ (stand-in coverage) city_q1.png, city_q2.png, city_q3.png, city_q4.png, city_q5.png all exist in public/games/age-of-dwarves/assets/sprites/cities/ (STANDINS.md; tools/sprite-license-audit.py). Stand-in art, not final.
  • ✗ Each PNG is 256×256 or 512×512 (matching the chosen resolution for p2-23/p2-25), PNG with alpha channel, transparent background.
  • ✗ Visual progression: each tier is clearly "larger / denser" than the previous — a player glancing at the map can tell q1 from q3 without zoom.
  • ✗ Silhouette legible at the world-map rendered size (the resolved size in city_renderer.gd _draw_city_sprite()).
  • ✗ Each sprite passed the ranker threshold configured in p2-22 with rating ≥ 4, OR was approved via Theater GUI.
  • ✗ Each sprite has a row in LICENSES.md (contract satisfied via p2-28).
  • ✗ Proof screenshot: plum Godot capture of a game late enough to have cities at three distinct population tiers, showing the tier sprites rendering distinctly on the world map. 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

  • Per-race city visual variation (Game 2 / Game 3).
  • Animated smoke / activity on top of city sprites (post-EA).
  • Capital-marker sprite (separate visual — currently handled via owner-colour ring + baseline draw in city_renderer.gd).

Demo sprite layer — 2026-06-04

The 2026-06-04 demo art pass (Battle-for-Wesnoth) covered units and base buildings only. The city population-tier sprites (city_q1city_q5, sprites/cities/) were NOT touched and remain game-icons stand-ins. Wesnoth's village tiles are single-structure, not the 5-frame population-progression scenes this objective requires, so they are not a fit even as demo art.

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 city tier-progression art (q1..q5). Path forward: commission artist / run generation pipeline; swap placeholders → final city tier-progression art (q1..q5). 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).