Standardized YAML frontmatter on all 115 sprint briefing files across sprints 1-26 with title, description, type, status, sprint number, and team fields. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
109 lines
7.2 KiB
Markdown
109 lines
7.2 KiB
Markdown
---
|
|
title: "Sprint 18 — Client Briefing"
|
|
description: "Minimap rendering, dialogue UI, knowledge/journal display"
|
|
type: sprint
|
|
status: archived
|
|
sprint: 18
|
|
team: "client"
|
|
---
|
|
|
|
# Sprint 18: Touch — Client Tasks
|
|
|
|
**Goal:** The player can examine entities and objects to generate character-filtered observations; NPCs detect and react when watched; social actions propagate through the relationship graph; minimap renders POIs on the client.
|
|
|
|
**Branch:** `client`
|
|
**Agents:** Stig (UI/rendering), Tyre (architecture), Hoshe (QA)
|
|
|
|
## Carry-over from Sprint 17
|
|
|
|
None. Sprint 17 closed 19/19.
|
|
|
|
## New Tickets
|
|
|
|
| # | Title | Blocked by |
|
|
|---|-------|------------|
|
|
| #151 | Minimap rendering | #148/#149 (both done in Sprint 17) |
|
|
| #174 | Dialogue UI — client (D-061 spec) | #434 (done) |
|
|
| #264 | Knowledge/journal display | — |
|
|
|
|
Use `db/connectors/ticket show <id>` for full details.
|
|
|
|
## Key Decisions
|
|
|
|
- `decisions/architecture.md` — D-020 (client is pure renderer, no game logic in GDScript), D-041 (knowledge graph — client displays KG data from snapshot), D-042 (UI microcopy format — YAML via UIStrings autoload)
|
|
- `decisions/perception.md` — D-013 (diegetic insert/POI system — minimap is insert-layer UI), D-061 (dialogue box spec — 20% max height, no portraits)
|
|
- `decisions/content.md` — D-028 (dialogue architecture — client renders options, server selects), D-062 (invisible locked options), D-064 (walk-away — WASD during dialogue)
|
|
- `decisions/scope.md` — D-027 (vertical slice — dual-character POI and knowledge display)
|
|
|
|
## Notes
|
|
|
|
### #151 — Minimap rendering
|
|
|
|
POI data infrastructure (`PointOfInterest` component, discovery events) landed on the server in Sprint 17 (#148, #149). The `ObserverSnapshot` will carry POI data for discovered points. This ticket wires that data into a rendered minimap overlay.
|
|
|
|
What this ticket must deliver:
|
|
- A `MinimapRenderer` scene or node attached to the insert HUD layer (z-layer 6, diegetic insert per D-049)
|
|
- Nearby POIs rendered as colored dots at their relative compass position from player origin
|
|
- Distant POIs (beyond minimap radius) rendered as directional arrows at the minimap border
|
|
- POI dot color and shape vary by category (the server sends `poi_category` in snapshot — use it)
|
|
- Player is always centered; minimap does not scroll or rotate (fixed-north, D-015)
|
|
- Minimap must be diegetically framed — it reads as a neural insert overlay, not a traditional game HUD
|
|
- If no POIs discovered: minimap is empty but the insert frame still renders (the frame is diegetic, always present)
|
|
|
|
Existing infrastructure to build on:
|
|
- `client/scripts/autoloads/game_state.gd` — holds `current_snapshot` which will include POI array from server
|
|
- `client/scripts/autoloads/ui_strings.gd` — minimap label strings (add to `client/data/ui-strings.yaml` per D-042)
|
|
- `client/scripts/rendering/world_renderer.gd` — reference for how snapshot data drives rendered output
|
|
|
|
Gotcha: POI positions are in simulation tile coordinates. The minimap renders relative compass direction and distance, not absolute tile positions. Convert server tile positions to player-relative vectors in GDScript.
|
|
|
|
### #174 — Dialogue UI — client (implement to D-061 spec)
|
|
|
|
The dialogue box spec (#434, D-061) was delivered in Sprint 7 and is done. This ticket (#174) is the older "Dialogue UI" story whose description has been updated to reference the D-061 spec. Given that the dialogue box, response selection, and walk-away mechanic are already implemented (#434, #435, #437), this ticket now covers the remaining dialogue UI surface not yet wired.
|
|
|
|
What this ticket must deliver — audit first, then implement gaps:
|
|
- Verify the existing dialogue box correctly uses `game_state.current_dialogue` field (set in Sprint 14+)
|
|
- **Examine result display**: the examine verb (#242 server) returns a character-filtered text description. The client needs a display path for this — it should appear as a non-interactive overlay (not a dialogue box, no options), floating above the examined entity or in a dedicated "observation" panel. Design to spec: brief, diegetic, auto-dismisses after 4-6 seconds
|
|
- **Dialogue UI hardening**: confirm invisible locked options (D-062) — no grayed-out elements, no lock icons anywhere in the dialogue tree
|
|
- **Confrontation styling** (#436, D-063): verify italic first-person voice for confrontation options is rendering correctly; confirm the 1-2 second pre-delivery monologue beat fires before the option triggers
|
|
|
|
Integration point: `client/scripts/autoloads/game_state.gd` holds `current_dialogue`. The rendering layer reads this each frame. Examine result will come through a new `current_examine_result` field (coordinate field name with server team).
|
|
|
|
### #264 — Knowledge/journal display
|
|
|
|
Client UI for reviewing accumulated KG facts. The player character's `KnowledgeGraph` is populated server-side and sent down in snapshot as a structured object. This ticket creates the review panel.
|
|
|
|
What this ticket must deliver:
|
|
- A journal/insert panel — toggle key (TBD, coordinate with server team for any keybind — likely `J` or dedicated insert shortcut)
|
|
- Displays accumulated facts grouped by entity: "What I know about Kael Davan", then fact entries with confidence level and source
|
|
- Fact entries show: fact text, `KnowledgeConfidence` level (Suspects / KnowsOf / KnowsDetails / Direct), source (`DirectObservation` / `ToldBy` / `Heard`), and `last_observed_tick` timestamp converted to game-time string
|
|
- `Contradicted` facts rendered with a visual distinction (strikethrough or amber tint) — these are the moments where THE FRIEND arc surfaces in the UI
|
|
- `Stale` facts rendered more dimly than `Active` facts
|
|
- The display is read-only — no player interaction with entries beyond scrolling
|
|
- Diegetic frame: the panel reads as neural insert memory recall. Use `UIStrings` (D-042) for all labels (`client/data/ui-strings.yaml`)
|
|
|
|
Integration with `game_state.gd`: the snapshot does not currently carry a full KG dump — coordinate with server team. The server team will need to add a `player_knowledge` field to `ObserverSnapshot` (or a separate periodic message). Define the wire format jointly before implementation.
|
|
|
|
Key gotcha: the journal panel must close when dialogue opens and vice versa — they cannot be open simultaneously. Both compete for insert-layer attention.
|
|
|
|
## Dependency Chain
|
|
|
|
```
|
|
#151 (minimap) → POI data in snapshot (#148/#149 done) — start immediately
|
|
|
|
#174 (dialogue UI hardening + examine result display) → examine field from server #242
|
|
→ coordinate wire format week 1, implement week 2
|
|
|
|
#264 (knowledge/journal display) → player_knowledge field in snapshot (coordinate with server)
|
|
→ start design week 1, implement after wire format agreed
|
|
```
|
|
|
|
Parallel tracks: #151 can start immediately. #174 and #264 both need a brief coordination with server team on wire format additions — block 30 minutes in week 1 to agree those field names, then implement in parallel.
|
|
|
|
## 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(client): description" --description "body" --base main --head client
|
|
```
|