4.6 KiB
| 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 |
|
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.pngall exist inpublic/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-22with rating ≥ 4, OR was approved via Theater GUI. - ✗ Each sprite has a row in
LICENSES.md(contract satisfied viap2-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_q1…city_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).