--- title: "Sprint 28 — Visual Briefing" description: "Character sprite production: body types, faces, hair, expressions, overlays, clothing — all layers for compositor" type: sprint status: planning sprint: 28 team: "visual" --- # Sprint 28: Character Visuals — Visual Tasks **Goal:** Move beyond placeholder art to final product candidate character visuals, from design specs through asset production and compositor implementation. **Branch:** `visual` **Agents:** Araminta (art direction) ## New Tickets | # | Title | Blocked by | |---|-------|------------| | #686 | Body type sprites | #684 (workshop) | | #687 | Face type sprites | #684 (workshop) | | #688 | Hair type sprites | #684 (workshop) | | #689 | Facial expression sprites | #684 (workshop) | | #690 | Scar and tattoo overlay sprites | #684 (workshop) | | #691 | Visible injuries overlay sprites | #684 (workshop) | | #692 | Clothing, apparel and accessory layer sprites | #684 (workshop) | Use `tooling/db/ticket show ` for full details. ## Key Decisions - `decisions/architecture.md` — D-134 (full character customisation: hair, clothing, colors at tile scale — readability solved through outline/highlight, not by limiting options), D-043 (art direction: "functional warmth" visual style), D-044 (visual hierarchy: entity > object > structure), D-046 (lighting system: three-reference model), D-066 (dual-scale grid: 0.5m simulation, 1m visual) - `decisions/scope.md` — D-146 (tile-scale sprite with heavy zoom as the preview — these sprites ARE the final product at game scale) ## Notes ### Blocking condition — wait for #684 outputs All seven tickets are blocked by #684 (planning workshop). Do not start production until the workshop outputs `docs/design/character-visuals-spec.md`. That document defines: - Layer ordering for the compositor - Color mesh region definitions per layer type - 8-direction rotation consistency rules - Expression state list - Damage state progression for injuries If the workshop spec is incomplete in any area, block the relevant ticket and flag to SI before proceeding. ### Existing sprite reference Current placeholder sprites are at `client/assets/sprites/`: - `npc_generic_{north,south,east,west}_64.png` — 64×64 px source textures, 4 directions - Rendered at 0.5 scale → 32×32 runtime footprint within 32×32 visual tiles (D-066) - Entity footprint in `entity_renderer.gd`: 24×32 within the 32×32 tile (ENTITY_WIDTH/HEIGHT constants) All new sprites must maintain this 64×64 px source resolution and 4-direction (or 8-direction, per workshop spec) convention. The compositor (#693) will layer them — produce each layer as a separate sprite sheet, not composited into a single texture. ### #686 — Body type sprites Base layer. All other character sprites composite on top of this. **Deliverables:** - 2 distinct body type sprite sheets (8 directions each = 16 sprites per body type) - Color mesh region map per body type (defines recolorable skin/clothing zones) - Source files and exported PNGs at `client/assets/sprites/character/body/` **Art guidance:** Body type is the widest-impact decision — proportions set the silhouette that all overlaid layers must match. Produce body_a and body_b with visibly distinct silhouettes while sharing the same feet-anchor point and 24×32 footprint convention. Color mesh regions: at minimum, skin region must be separately recolorable. ### #687 — Face type sprites Overlay on the upper portion of the body sprite. **Deliverables:** - 2 distinct face type sprite sheets (8 directions each) - Color mesh region map per face (skin tone recolorability at minimum) - Source files and exported PNGs at `client/assets/sprites/character/face/` **Art guidance:** Face sprites overlay on the head region of the body. The 8-direction face must register exactly with the 8-direction body for all orientations. Skin tone region should match the body skin region color mesh ID for consistent tinting. ### #688 — Hair type sprites Overlay on top of the face layer. **Deliverables:** - 2 distinct hair style sprite sheets (8 directions each) - Color mesh region map per style (hair color region fully recolorable) - Source files and exported PNGs at `client/assets/sprites/character/hair/` **Art guidance:** Hair sprites must read at 32×32 game resolution. Silhouette is more important than fine detail — thick, distinct hair shapes read better than thin ones at tile scale. Test at 32px, not at the 64px source. ### #689 — Facial expression sprites Overlay states on the face layer. Expression sprites swap the face layer's neutral state. **Deliverables:** - Named expression state sprite sheets (states defined by workshop — minimum: neutral, alert, distressed) - 8 directions per expression state - Source files and exported PNGs at `client/assets/sprites/character/expressions/` **Art guidance:** At tile scale, expression reads through body posture and head angle as much as facial detail. Exaggerate. Neutral is the default — alert and distressed are the two most important non-neutral states. Count of expression states is TBD by the workshop spec. ### #690 — Scar and tattoo overlay sprites Additive overlays above the skin layer. Placement must work for both body types. **Deliverables:** - 2 scar overlay sprites (with placement anchors, 8 directions each) - 2 tattoo overlay sprites (with placement anchors, 8 directions each) - Source files and exported PNGs at `client/assets/sprites/character/overlays/scars/` and `.../tattoos/` **Art guidance:** These are visible at tile scale only when zoomed in (character creation preview, heavy zoom mode per D-146). Placement anchors must be defined relative to the body sprite coordinate system so the compositor can offset them correctly per body type. ### #691 — Visible injuries overlay sprites Damage state overlays representing combat injury. These appear during gameplay, not just in character creation. **Deliverables:** - Damage state overlay sprites (states defined by workshop — minimum: light damage, heavy damage, critical) - 8 directions per damage state - Source files and exported PNGs at `client/assets/sprites/character/overlays/injuries/` **Art guidance:** Injury overlays are visible during gameplay at normal zoom (32×32). They must read clearly at that scale. Use color and silhouette change (blood, torn clothing, posture change baked in) — not fine line detail. ### #692 — Clothing, apparel and accessory layer sprites Outermost visible layer. Must handle occlusion of face/hair layers when appropriate (e.g. helmets). **Deliverables:** - 2 clothing set sprite sheets (full outfit, 8 directions each) - 2 accessory sprite sheets (8 directions each) - Layer ordering and occlusion rules documented in the spec (or confirmed against workshop spec) - Color mesh region map per clothing set (primary + secondary color regions) - Source files and exported PNGs at `client/assets/sprites/character/clothing/` and `.../accessories/` **Art guidance:** Clothing is what the player sees 99% of the time during gameplay. Make it read clearly at 32×32. Two clothing sets should have visibly different silhouettes (one formal/professional, one casual/work). Color mesh regions: minimum two — primary garment color, secondary accent. ## Dependency Chain ``` #684 (workshop) → #686 (body) → #693 (client compositor — body sprites are its first input) #684 (workshop) → #687 (face) #684 (workshop) → #688 (hair) #684 (workshop) → #689 (expressions) #684 (workshop) → #690 (scars/tattoos) #684 (workshop) → #691 (injuries) #684 (workshop) → #692 (clothing/accessories) #686–#692 can all run in parallel after #684 completes. #686 is highest priority — it unblocks #693 (client compositor). ``` ## PR Workflow When ready to submit, create a PR with `tea` CLI. **All flags are required** to avoid TTY prompts (see `CLAUDE.md` "Gitea access" section): ```bash tea pr create --repo jpmschweitzer/settled-reach --login schweitz --title "feat(assets): character sprite layers — body, face, hair, expressions, overlays, clothing" --description "body" --base main --head visual ```