--- title: "Sprint 28 — Joint Briefing" description: "Cross-team coordination, integration points, sprint completion proof" type: sprint status: planning sprint: 28 team: "joint" --- # Sprint 28: Character Visuals — Joint **Goal:** Move beyond placeholder art to final product candidate character visuals, from design specs through asset production and compositor implementation. ## Pre-Sprint Checks | Item | Owner | Status | |------|-------|--------| | Sprint 27 all done (9/9) | SI | confirmed | | D-146 (tile-scale preview) locked — no portrait system | Planning | confirmed | | D-147 (aesthetic taste trait) locked — no cosmetic→apartment pipeline | Planning | confirmed | | Sprint 28 record created in planning status | SI | confirmed (ID: 28) | | All 11 tickets (#683–#694) assigned to Sprint 28 | SI | confirmed | ## Cross-Team Dependencies | Dependency | Upstream | Downstream | Notes | |------------|----------|------------|-------| | #684 (workshop) outputs `docs/design/character-visuals-spec.md` | planning | visual (#686–#692) | Visual team cannot start production without this spec. Block ALL visual tickets until spec is published. | | #684 (workshop) outputs `docs/design/compositor-api-spec.md` | planning | client (#693) | Client compositor architecture must match the workshop-specified API. #693 should read this before writing any code. | | #685 (wireframe) outputs `docs/design/character-creation-screen-wireframe.md` | planning | client (#694) | Client creation screen is a direct implementation of the wireframe. #694 is blocked until wireframe is approved. | | #686 (body type sprites) delivers sprites to `client/assets/sprites/character/body/` | visual | client (#693) | Compositor needs at least one complete body type sprite set as test input. #693 can begin architecture with a stub but must have real sprites for integration testing. | | #693 (compositor) exports its node API | client | client (#694) | The creation screen's preview pane is driven by the compositor node. #694 cannot wire the preview until #693 is testable. | **Action required — workshop start:** Planning team (#684 agent) to publish `docs/design/character-visuals-spec.md` and `docs/design/compositor-api-spec.md` before any visual or client work begins. These are gating documents. SI will update ticket statuses once they are published. **Action required — body sprites handoff:** Visual team (#686 agent) to notify client team (#693 agent) when the first complete body type sprite set is committed to the `visual` branch. Client team needs this for compositor integration testing. ## Sprint Completion Proof Sprint 28 is done when all of the following are observable: **Planning:** - `docs/design/character-visuals-spec.md` exists and is complete (all 7 layer types specified) - `docs/design/compositor-api-spec.md` exists and specifies the layer enum, color override struct, and Godot node architecture - `docs/design/character-creation-screen-wireframe.md` (or `.png`) exists and has been reviewed by Jeroen - `docs/workshops/character-visuals/workshop-outcomes.md` exists with all decisions recorded - Any new D-records filed to `decisions/` for architectural decisions made during the workshop **Visual:** - `client/assets/sprites/character/body/` contains 2 body type sprite sheets (8 directions each) with color mesh region maps - `client/assets/sprites/character/face/` contains 2 face type sprite sheets (8 directions each) - `client/assets/sprites/character/hair/` contains 2 hair style sprite sheets (8 directions each) - `client/assets/sprites/character/expressions/` contains sprite sheets for all workshop-defined expression states (min 3) - `client/assets/sprites/character/overlays/scars/` and `.../tattoos/` each contain 2 overlay sprites - `client/assets/sprites/character/overlays/injuries/` contains damage state overlay sprites (min 3 states) - `client/assets/sprites/character/clothing/` contains 2 clothing set sprite sheets; `.../accessories/` contains 2 sets **Client:** - `client/scripts/rendering/character_compositor.gd` exists and layers all sprite types in the correct workshop-specified order - Color mesh recoloring works: changing a color override in the compositor updates the rendered output in real time - 8-direction rotation works: compositor switches all layer textures consistently - `client/scenes/character_creation.tscn` + `client/ui/character_creation.gd` exist and wire into the new game flow - Preview pane shows the composited character at heavy zoom (≥4×) with live updates on layer/color changes - All layer selection controls are functional (body, face, hair, clothing, accessories, scars, tattoos, colors) - Randomise button works - Keyboard navigation (tab/arrow/enter/esc) is fully functional **Integration eyeball test:** Launch the game → New Game → reach character creation screen → change body type → preview updates → change hair color → preview updates → confirm → game loads with character definition stored. No placeholder gray blobs — you see a recognizably distinct character with distinct hair and clothing. ## Test Plan Alignment Sprint 28 is an art + UI sprint. No new ECS systems, no IPC protocol changes. Test surface: - **#693 compositor:** Unit test (Godot scene runner or headless) that instantiates the compositor with a known `CharacterDefinition`, verifies the correct number of child nodes, and verifies the facing direction swap triggers a texture change. Use a minimal stub sprite (1×1 PNG) for the test — no need for production assets. - **#694 creation screen:** UI test that navigates the creation screen via keyboard input, changes a layer, and asserts the preview compositor was updated. Use `client/tests/` pattern (matching existing test files e.g. `test_dialogue_speaker_colors.gd`). - **Visual sprites:** No automated test. Acceptance is the integration eyeball test above — does the compositor render a legible composited character from the production sprites? - **Do NOT use TestHarness mocks for rendering verification.** Per CLAUDE.md testing preferences: use the live pipeline. For the creation screen preview specifically, the full compositor is the production path — test against it directly. ## Sprint Retro Triggers Flag to SI immediately if any of these conditions are hit: - Workshop spec (#684) is incomplete or contradicts D-146/D-147 — do not start production work until SI escalates to Jeroen - Color mesh recoloring approach selected by the workshop requires shader work that Stig estimates as blocking — surface this before #693 is committed, not after - Body type sprite footprint deviates from the 24×32/64px convention used by `entity_renderer.gd` — this will break gameplay rendering and must be caught before #686 merges - #694 wireframe design (from #685) is received after visual sprites are already in progress and requires a layer reordering — SI to assess impact and decide whether to hold visual or accept the rework cost