jpmschweitzer and Claude Opus 4.6
c71ba8ebb3
test(ui): GameState integration + D-049 compliance tests for monologue display ( #122 )
...
7 tests: snapshot round-trip, null/stale clearing, non-dict rejection,
duration/id preservation, canvas layer constant. before_test/after_test
lifecycle hooks prevent state bleed between test cases.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-20 18:43:41 +01:00
jpmschweitzer and Claude Sonnet 4.6
b49d78ef6a
fix(ui): guard empty text in show_monologue — no ghost slots or queue entries ( #122 )
...
show_monologue() now returns early when text.is_empty(), preventing:
- ghost visible slots with blank labels
- stagger timer advancing on empty calls
- empty strings queuing when slots are full
Tests: add test_show_monologue_with_empty_text_does_not_set_displaying and
two companion cases (stagger timer unchanged, no enqueue when full) anticipating
Hoshe's QA additions to the test suite.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-02-20 18:41:22 +01:00
jpmschweitzer and Claude Sonnet 4.6
1765e2922f
refactor(ui): monologue display — multi-line architecture per Tyre review ( #122 )
...
Rewrites the monologue display system per Tyre architecture review (Sprint 14):
Rendering:
- Up to 3 simultaneous visible lines (VBoxContainer, dynamic node creation)
- Lines created programmatically as MarginContainer > RichTextLabel per slot
- Percentage-based anchors: 5% left, 75–98% vertical (25% area from bottom), 50% max width
- Z-layer 7 in UILayer (CanvasLayer 20, D-049)
Queue:
- 5-entry priority queue; highest priority drains first
- On overflow: incoming line replaces lowest-priority queued entry if it outranks it
- Lower/equal priority incoming lines silently dropped when queue full
API:
show_monologue(text, duration, priority=2, is_urgent=false)
- Replaces old (text, duration, character_type) signature
- main.gd passes priority and is_urgent from MonologueEvent fields
- Confrontation monologue: priority=3, is_urgent=true (D-063)
Colour:
- Reads GameState.lattice_profile at render time (D-032)
- lattice_augmented (detective): standard #d0d4e0 / urgent #e0e8f8
- lattice_baseline (smuggler): standard #d8d0c4 / urgent #f0e4d4
- Fallback for unknown profiles; no crash
Stagger: 0.15s between consecutive fade-ins (spec §5.4)
Opacity: standard 0.85, urgent 1.0; bloom deferred
GameState: adds lattice_profile field, parsed from snapshot
Tests: 27 gdUnit4 test cases — queue order, priority drop, overflow, stagger,
no-overwrite (P0 #477 ), BBCode output, palette selection, slot lifecycle
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-02-20 18:39:49 +01:00
jpmschweitzer and Claude Sonnet 4.6
4365871846
feat(ui): monologue display — queue, character colours, italic BBCode ( #122 )
...
- Queue management: enqueue on mid-display arrival, drain in order, MAX_QUEUE_DEPTH=8 cap, no-overwrite contract (P0 #477 )
- Character colours: detective=#c8e0ff (cool blue), smuggler=#f0c870 (warm amber), fallback to neutral insert text
- Typography: italic via BBCode [i] tags; font size 13px (smaller than dialogue)
- Positioning: bottom-left of viewport, 420×120px, 80px bottom margin above verb list
- main.gd: _get_active_character_type() reads player entity kind.data.character_type; passed to show_monologue() and _on_confrontation_monologue()
- gdUnit4 tests: queue order, depth cap, no-overwrite, BBCode output, colour mapping, fade timer integration
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-02-20 18:31:13 +01:00