# WBP_AccessibilityUI — Widget (Subtitle Display, Accessibility Overlays) **Parent Class:** `UUserWidget` (created via Widget Blueprint) **Dependencies:** `BPC_DialoguePlaybackSystem`, `BPC_NarrativeStateSystem`, `SS_SettingsSystem` **File:** `WBP_AccessibilityUI` --- ## Purpose Provides subtitle rendering, speaking-name display, subtitle background styling, and accessibility-focused UI overlays (high-contrast mode, colorblind filters, font scaling). Listens to dialogue events from `BPC_DialoguePlaybackSystem` and settings changes from `SS_SettingsSystem`. --- ## Responsibilities - Display subtitles at the bottom-center of the screen with speaker name, dialogue text, and optional background - Support multi-line subtitle display with timed progression - Display speaker name above the subtitle text (optional per settings) - React to accessibility settings: font size scaling, background opacity, colorblind mode, high-contrast mode - Fade subtitles in/out on line start/end - Queue subtitle lines if multiple fire rapidly - Handle subtitle grouping: one line at a time per speaker, multi-speaker stacking --- ## Variables | Name | Type | Description | |------|------|-------------| | `SubtitleContainer` | `VerticalBox` | Vertical stack for active subtitle lines | | `SpeakerNameText` | `TextBlock` | Current speaker's display name | | `SubtitleText` | `TextBlock` | Current subtitle line text | | `SubtitleBackground` | `Image` or `Border` | Background behind subtitle text | | `AnimSubtitleIn` | `WidgetAnimation` | Fade in subtitle | | `AnimSubtitleOut` | `WidgetAnimation` | Fade out subtitle | | `ActiveSubtitles` | Array of `FSubtitleLine` | Currently displayed subtitle lines | | `SubtitleQueue` | Array of `FSubtitleLine` | Queue if multiple lines arrive simultaneously | | `bSubtitlesEnabled` | Bool | From settings | | `SubtitleFontScale` | Float | 0.8, 1.0, 1.2, 1.5 from settings | | `SubtitleBackgroundOpacity` | Float | 0.0 to 1.0 from settings | | `bHighContrastMode` | Bool | From settings | | `bIsCurrentlySpeaking` | Bool | Prevents flicker between rapid lines | --- ## Structs ```cpp FSubtitleLine { FText SpeakerName; // "Dr. Hartmann" FText LineText; // "The tumor is benign..." float Duration; // seconds, from dialogue data float StartTime; // world time when line started bool bIsFinalLine; // if true, marks end of dialogue sequence FColor SpeakerColor; // optional per-speaker color } ``` --- ## Functions / Events | Name | Inputs | Outputs | Description | |------|--------|---------|-------------| | `Construct` | — | — | Bind to dialogue dispatchers, load accessibility settings | | `OnDialogueLineStarted` | Data: `FSubtitleLine` | — | Add subtitle to display, start fade-in timer | | `OnDialogueLineComplete` | Data: `FSubtitleLine` | — | Start fade-out, remove from active list after animation | | `OnDialogueSequenceEnded` | — | — | Clear all subtitles, fade out | | `DisplaySubtitle` | Line: `FSubtitleLine` | — | Set speaker name, text, background; play AnimSubtitleIn | | `HideSubtitle` | Line: `FSubtitleLine` | — | Play AnimSubtitleOut, remove from container | | `SetSubtitlesEnabled` | bEnabled: Bool | — | Show/hide subtitle container | | `ApplyFontScale` | Scale: Float | — | Set subtitle text font size (scalar) | | `SetBackgroundOpacity` | Opacity: Float | — | Set subtitle background render opacity | | `ApplyHighContrastMode` | bEnabled: Bool | — | Toggle high-contrast subtitle background/text colors | | `OnAccessibilitySettingsChanged` | Settings: `S_AccessibilitySettings` | — | Apply all accessibility settings at once | | `ClearAllSubtitles` | — | — | Remove all active subtitles immediately | --- ## Blueprint Flow — Subtitle Lifecycle ```mermaid sequenceDiagram participant Dialogue as BPC_DialoguePlaybackSystem participant Sub as WBP_AccessibilityUI participant Timer as Internal Timer Dialogue->>Sub: OnDialogueLineStarted LineData Sub->>Sub: DisplaySubtitle LineData Sub->>Sub: Set SpeakerNameText, SubtitleText Sub->>Sub: PlayAnimation FadeIn Sub->>Timer: SetTimer by LineData.Duration Timer-->>Sub: Timer expired Sub->>Sub: PlayAnimation FadeOut Sub->>Sub: OnDialogueLineComplete LineData Dialogue->>Sub: OnDialogueSequenceEnded Sub->>Sub: ClearAllSubtitles ``` --- ## Accessibility Settings Consumption ```mermaid flowchart LR A[SS_SettingsSystem] -->|Read on Construct| B[Cache settings] B --> C[SetSubtitlesEnabled] B --> D[ApplyFontScale] B --> E[SetBackgroundOpacity] B --> F[ApplyHighContrastMode] A -->|OnAccessibilitySettingsChanged dispatcher| G[Re-apply all] ``` --- ## Event Dispatchers | Name | Parameters | Fired When | |------|-----------|------------| | `OnSubtitleStarted` | Line: `FSubtitleLine` | A new subtitle line appears | | `OnSubtitleEnded` | Line: `FSubtitleLine` | A subtitle line ends | | `OnAllSubtitlesCleared` | — | All subtitles removed | --- ## Communications With | Target System | Method | Why | |--------------|--------|-----| | [`BPC_DialoguePlaybackSystem`](../07-narrative/) | Dispatchers (`OnLineStarted`, `OnLineComplete`, `OnSequenceEnded`) | Receive subtitle data | | [`SS_SettingsSystem`] | Direct reads, dispatcher on settings changed | Apply accessibility preferences | | [`WBP_HUD`](33_WBP_HUD.md) | Parent reference | Positioning within HUD canvas | | [`BPC_NarrativeStateSystem`] | Query | Speaker display name overrides | --- ## Reuse Notes The subtitle display widget is purely reactive — it never fetches or filters dialogue data. It can be embedded in any HUD canvas (first-person, third-person, diegetic screen overlay). The `FSubtitleLine` struct is intentionally compatible with the `DA_DialogueSequence` line format. If no speaker name is provided, the `SpeakerNameText` collapses and the subtitle text fills the full width. High-contrast mode inverts colors for readability against any background.