#263 — Diegetic time display on insert HUD: New time_display.gd on InsertOverlay (CanvasLayer 10) shows station local time (HH:MM), day phase with cycle-tinted color, and day number. Reads SimulationTime from GameState.game_time. Adds Constants.format_game_time() helper. Placeholder layout pending #314 wireframe.
#537 — E-Talk overlay relationship color (Phase 1):interaction_list.gd renders a 3px left-edge accent bar in D-033 relationship color (teal/green/amber/red). Cross-references entity_id against visible_entities. NPC name and dialogue tier hint deferred to Phase 2 (needs server protocol extension).
No server changes required — all data already in ObserverSnapshot.
Sprint 17 completion proof (client)
Time is visible — insert HUD shows current game time in diegetic format, advances as ticks pass
E-Talk overlay is informative — interaction overlay shows relationship color
Test plan
22 tests for #263 (time formatting, GameState parsing, snapshot wiring, scene integration)
30 tests for #537 (D-033 color mapping, relationship lookup, regression, edge cases)
## Summary
Sprint 17 client deliverables:
- **#263 — Diegetic time display on insert HUD:** New `time_display.gd` on InsertOverlay (CanvasLayer 10) shows station local time (HH:MM), day phase with cycle-tinted color, and day number. Reads `SimulationTime` from `GameState.game_time`. Adds `Constants.format_game_time()` helper. Placeholder layout pending #314 wireframe.
- **#537 — E-Talk overlay relationship color (Phase 1):** `interaction_list.gd` renders a 3px left-edge accent bar in D-033 relationship color (teal/green/amber/red). Cross-references entity_id against visible_entities. NPC name and dialogue tier hint deferred to Phase 2 (needs server protocol extension).
No server changes required — all data already in `ObserverSnapshot`.
## Sprint 17 completion proof (client)
- [x] Time is visible — insert HUD shows current game time in diegetic format, advances as ticks pass
- [x] E-Talk overlay is informative — interaction overlay shows relationship color
## Test plan
- 22 tests for #263 (time formatting, GameState parsing, snapshot wiring, scene integration)
- 30 tests for #537 (D-033 color mapping, relationship lookup, regression, edge cases)
Time display on InsertOverlay (CanvasLayer 10) shows station local
time (HH:MM), day phase with cycle-tinted color, and day number.
Reads SimulationTime from GameState.game_time via update_from_state().
Adds Constants.format_game_time() helper for testability.
Placeholder layout — position refines when #314 wireframe lands.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Phase 1: interaction_list.gd shows a 3px left-edge accent bar in
D-033 relationship color (teal/green/amber/red) at 85% alpha.
Cross-references entity_id against visible_entities via
_cache_entity_relationship(). NPC name and tier hint deferred to
Phase 2 (requires server protocol extension).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fix test API mismatches: time display tests target InsertOverlay/
TimeDisplay and time_display.gd; E-Talk tests rewritten to target
interaction_list.gd _cache_entity_relationship() and _relationship_color
state. Phase 2 tests (name, tier hint) marked as skip placeholders.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- constants.gd: clamp format_game_time input to 0..1439 (Hoshe #2)
- interaction_list.gd: add public hide_list() wrapper (Hoshe #3, Tyre #1)
- main.gd: call hide_list() instead of private _hide()
- time_display.gd: cache font geometry in update_from_state(), use boolean
_has_data flag instead of string guard (Tyre #2)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- interaction_list.gd: skip queue_redraw() when position unchanged (Tyre #4)
- time_display.tscn: widen bounding rect 154x44→184x54, add clip note
for #314 wireframe (Tyre #3)
- test_time_display_sprint17.gd: document private state access pattern
in header (Tyre #5), add upper bound assertion for D-031 1439 max (Hoshe #6)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
Sprint 17 client deliverables:
time_display.gdon InsertOverlay (CanvasLayer 10) shows station local time (HH:MM), day phase with cycle-tinted color, and day number. ReadsSimulationTimefromGameState.game_time. AddsConstants.format_game_time()helper. Placeholder layout pending #314 wireframe.interaction_list.gdrenders a 3px left-edge accent bar in D-033 relationship color (teal/green/amber/red). Cross-references entity_id against visible_entities. NPC name and dialogue tier hint deferred to Phase 2 (needs server protocol extension).No server changes required — all data already in
ObserverSnapshot.Sprint 17 completion proof (client)
Test plan
PR Review: client → main (#62)
Hoshe (Code Quality): REQUEST_CHANGES
test_relationship_known_maps_to_greenwill fail — no"Known"match branch incolor_for_relationship().format_game_timeno guard on negative or >1439 input.interaction_list._hide(). Use public API instead."--:--"string guard is fragile — prefer boolean flag.<= 1439) per D-031.Tyre (Architecture): REQUEST_CHANGES
Summary: Core logic elegant — signature caching, draw-based rendering, D-031 alignment correct. Two patterns need fixing.
_hide()private coupling — route through public API._draw()callsget_string_size()4x/frame. Cache geometry inupdate_from_state().queue_redraw()every frame — could skip when position unchanged.Verdict: CHANGES REQUESTED
Key issues: Failing test (Known/green), private API coupling (
_hide()), unguarded input range, per-frame font measurement.Re-Review: client → main (#62)
Hoshe (Code Quality): APPROVE
All 4 original warnings fixed. No new issues.
Knowntest wrong assertionformat_game_timeno input guardmain.gdcalls private_hide()hide_list()_draw()4x get_string_size/frame_cache_geometry()_has_databooleanis_less_equal(1439)Tyre (Architecture): APPROVE
Both warnings fixed. All suggestions addressed.
_hide()private couplingqueue_redraw()every frameVerdict: APPROVED
Pull request closed