[art] No operative portraits — 6 squad + 5 enemy types render as text-only cards #9

Closed
opened 2026-09-23 14:33:44 +00:00 by Mark · 1 comment
Owner

Asset gap.

The 6 squad operatives (VEX, DIAZ, ROOK, SABLE, JOLT, HALO) and 5 enemy types (drone, ganger, heavy, sentry, wisp) have no character art. On the title screen (web/index.html -> OPERATIVES panel) they render as flat colored-border rectangles + text. In-mission they render as small abstract icons.

The data layer is complete (web/js/data.js: WEAPONS / SQUAD / ENEMY_TYPES), and the sprite atlas (web/assets/sprites.png) has 32×32 px regions declared for all 11 unit keys (web/js/sprite_atlas.gd REGIONS map + web/js/ui.js SPR map).

What's missing:

  • Per-operative bust portrait for the OPERATIVES selection cards (suggested size: 96×96 or 128×128, 6 of them)
  • Per-enemy portrait for tactical UI / end-of-mission stats (5 of them)

Reference style: cyberpunk-neon, dark backgrounds, neon accents. Existing atlas has 32×32 unit tiles at row 2 (vex/diaz/rook/sable/jolt/halo) and row 3 (drone/ganger/heavy/sentry/wisp) — extend the atlas layout or split into a separate portraits.png.

Acceptance:

  • Title screen OPERATIVES cards show a portrait on the left side
  • In-mission selected-unit panel shows a portrait in the SELECTED panel
  • Atlas update is wired through web/js/ui.js SPR / godot/scripts/sprite_atlas.gd REGIONS

Refs: visual gap confirmed via Playwright screenshot at tools/playwright_smoke.png and live title-screen render.

**Asset gap.** The 6 squad operatives (VEX, DIAZ, ROOK, SABLE, JOLT, HALO) and 5 enemy types (drone, ganger, heavy, sentry, wisp) have **no character art**. On the title screen (`web/index.html` -> OPERATIVES panel) they render as flat colored-border rectangles + text. In-mission they render as small abstract icons. The data layer is complete (`web/js/data.js`: WEAPONS / SQUAD / ENEMY_TYPES), and the sprite atlas (`web/assets/sprites.png`) has 32×32 px regions declared for all 11 unit keys (`web/js/sprite_atlas.gd` REGIONS map + `web/js/ui.js` SPR map). **What's missing:** - Per-operative bust portrait for the OPERATIVES selection cards (suggested size: 96×96 or 128×128, 6 of them) - Per-enemy portrait for tactical UI / end-of-mission stats (5 of them) **Reference style:** cyberpunk-neon, dark backgrounds, neon accents. Existing atlas has 32×32 unit tiles at row 2 (vex/diaz/rook/sable/jolt/halo) and row 3 (drone/ganger/heavy/sentry/wisp) — extend the atlas layout or split into a separate `portraits.png`. **Acceptance:** - Title screen OPERATIVES cards show a portrait on the left side - In-mission selected-unit panel shows a portrait in the SELECTED panel - Atlas update is wired through `web/js/ui.js` SPR / `godot/scripts/sprite_atlas.gd` REGIONS Refs: visual gap confirmed via Playwright screenshot at `tools/playwright_smoke.png` and live title-screen render.
Author
Owner

Decomposed into 4 child issues. Each is gated on the previous via the body dependency chain.

Sequence:

  1. #18 — [art] #9-1: generate 11 cyberpunk-neon portrait PNGs (6 squad + 5 enemy)
    Asset creation: 11 portraits under web/assets/portraits/<id>.png, 96x96 minimum, neon-accent matches the unit color from web/js/data.js SQUAD/ENEMY_TYPES. This is the work that has no substrate in the kilo-gsd lane - needs an artist or generative pipeline. Labels: enhancement, needs-decompose, priority:medium, triage-approved.

  2. #19 — [art] #9-2: extend sprite atlas + ui.js SPR + sprite_atlas.gd REGIONS for 11 portraits
    Wire the portraits into both atlas registries (web SPR map + godot REGIONS Dictionary). The contract is one source of visual truth - both sides must agree. Pick ONE layout decision (per-file PNG vs single-atlas extension) and write that decision into both registries. Depends on #18.

  3. #20 — [art] #9-3: wire portraits into OPERATIVES cards + SELECTED panel
    UI wiring: title screen OPERATIVES cards show portrait on the left (web/js/ui.js showTitle(), the ops+= loop around line 213); in-mission SELECTED panel shows the selected unit portrait. Depends on #19.

  4. #21 — [art] #9-4: visual verification via Playwright + smoke screenshot
    Capture Playwright screenshots of title screen and SELECTED panel, regenerate tools/playwright_smoke.png, add an assertion to tools/playwright_smoke.py for non-zero portrait dimensions. Depends on #20.

Closing parent #9 - children carry the work forward. The kilo-gsd chain picks them up via triage-approved + needs-decompose labels.

Decomposed into 4 child issues. Each is gated on the previous via the body dependency chain. **Sequence:** 1. **#18 — [art] #9-1: generate 11 cyberpunk-neon portrait PNGs (6 squad + 5 enemy)** Asset creation: 11 portraits under `web/assets/portraits/<id>.png`, 96x96 minimum, neon-accent matches the unit color from `web/js/data.js` SQUAD/ENEMY_TYPES. This is the work that has no substrate in the kilo-gsd lane - needs an artist or generative pipeline. Labels: enhancement, needs-decompose, priority:medium, triage-approved. 2. **#19 — [art] #9-2: extend sprite atlas + ui.js SPR + sprite_atlas.gd REGIONS for 11 portraits** Wire the portraits into both atlas registries (web `SPR` map + godot `REGIONS` Dictionary). The contract is one source of visual truth - both sides must agree. Pick ONE layout decision (per-file PNG vs single-atlas extension) and write that decision into both registries. Depends on #18. 3. **#20 — [art] #9-3: wire portraits into OPERATIVES cards + SELECTED panel** UI wiring: title screen OPERATIVES cards show portrait on the left (`web/js/ui.js` showTitle(), the ops+= loop around line 213); in-mission SELECTED panel shows the selected unit portrait. Depends on #19. 4. **#21 — [art] #9-4: visual verification via Playwright + smoke screenshot** Capture Playwright screenshots of title screen and SELECTED panel, regenerate `tools/playwright_smoke.png`, add an assertion to `tools/playwright_smoke.py` for non-zero portrait dimensions. Depends on #20. Closing parent #9 - children carry the work forward. The kilo-gsd chain picks them up via `triage-approved` + `needs-decompose` labels.
Mark closed this issue 2026-09-24 15:16:28 +00:00
Sign in to join this conversation.
No description provided.