Add body-camera timeline to the shift review
- New src/game/ui/event_timeline.gd flattens every recorded incident event (ADR-0005) into one time-ordered list and shows time, person, and a one-line summary. Step with Left/Right or the buttons; Esc returns to the review. No live 3D replay in this first version. - Shift review gains a "Body camera timeline" button that hands the review to the timeline; the review dim is hidden while it is open (stacked overlays made the screen nearly black) and restored on close. - ShiftCoordinator records started_at_ms so the review can stamp events as mm:ss. - 8 new string keys for the timeline UI and the review button. Tests/docs - Headless suite 113 -> 120 (test_event_timeline.gd), new smoke_timeline.gd that opens the timeline from the review, steps through every event, and closes back. - README, TODO section moved to DONE, MEMORY notes. Version 0.2.6.
This commit is contained in:
1 parent
921bab796e
commit
1b976bf351
14 files changed
+614
-71
No files matched your search
@@ -21,11 +21,11 @@ Session memory for durable decisions, state, and gotchas. Keep concise, remove o
|
||||
Windowed control smoke: `godot --path . --script res://src/test/smoke_focus_radial.gd` → exit 0.
|
||||
- `main` is in sync with origin. **v0.2.2** tags the session-shell + world-follow-up commit;
|
||||
CI builds the portable binaries, NSIS installer, and AppImage on the tag push.
|
||||
- Next work: `TODO.md` body-camera replay timeline, then NPC theater poses (sit/photo/perform)
|
||||
and audio.
|
||||
- Next work: `TODO.md` NPC theater poses (sit/photo/perform), then audio and accessibility.
|
||||
- Do not re-open `override_access`. Do not bind wand to `W`. Do not remove the radio easter egg.
|
||||
|
||||
## Current State
|
||||
|
||||
- Access artifacts: `src/core/access_loadout.gd` builds from event `override_access` + venue policy.
|
||||
Spawn signal is now `(profile, intent, npc_id, event)`. Recognition is not auto-attached to every
|
||||
guest. `AccessVerifier.verify(..., already_screened=false)` so Joke Shop scoring uses
|
||||
@@ -94,6 +94,12 @@ Session memory for durable decisions, state, and gotchas. Keep concise, remove o
|
||||
`_begin_incident()` now starts one per focused NPC (`has_open_incident()` guard), verbs call
|
||||
`_ensure_incident()`, and `ShiftCoordinator._finish_shift()` closes leftovers as `unresolved`
|
||||
before building the review.
|
||||
- **Body-camera timeline (2026-10-31):** `src/game/ui/event_timeline.gd` flattens
|
||||
`review.incidents.incidents[].events` into one time-ordered list (`flatten`), formats each row
|
||||
with `describe`, and steps with Left/Right or the buttons. `ShiftCoordinator.started_at_ms`
|
||||
gives the review an absolute start for mm:ss stamps. `GameManager._open_timeline` hides the
|
||||
review dim (two stacked overlays made the screen nearly black) and `_timeline_from_review`
|
||||
restores it on close. Smoke: `src/test/smoke_timeline.gd`.
|
||||
- **Radio dispatch was dead after the first shift:** `coordinator.setup()` builds a new
|
||||
`RadioSystem`, so the `responder_arrived` connection made in `_ready` was lost on every venue
|
||||
switch/restart (responders never resolved anything). `_connect_radio()` now re-wires it next to
|
||||
@@ -204,8 +210,10 @@ Session memory for durable decisions, state, and gotchas. Keep concise, remove o
|
||||
- Screen-design references (`tools/screen_designs.py`, tests in `tools/test_screen_designs.py`):
|
||||
`generate` turns the screen descriptions in `docs/` (README captions, ADRs 0007–0010,
|
||||
PLAN, architecture) into reference images under `docs/screens/designs/` — `--draft`
|
||||
draws offline Pillow wireframes, `--ai` generates OpenRouter mockups (default model
|
||||
`openai/gpt-5-image-mini`). `compare` checks `docs/screenshots/*.png` for aspect/size/
|
||||
draws offline Pillow wireframes, `--ai` generates realistic 3D scenes / in-game UI via
|
||||
OpenRouter (default model `openai/gpt-5-image-mini`). Screens are tagged `scene` or
|
||||
`ui`; prompts get a shared art-direction suffix, and requests use a 3:2 landscape
|
||||
source cropped to 16:9 (not a square centre-crop). `compare` checks `docs/screenshots/*.png` for aspect/size/
|
||||
blank-frame and coarse layout/palette/detail drift. Drift distances are warnings, not
|
||||
failures: a mockup never matches a real render, so semantic composition is a follow-up
|
||||
vision-model judge (tracked in TODO).
|
||||
|
||||
Reference in new issue
Block a user