# HUD System Architecture — Modular Game Framework

**Architecture Overview | UE 5.5–5.7 | Widget Blueprint**

This document explains how the 14 UI widgets in `docs/blueprints/06-ui/` connect and interact. Use this as a wiring reference when implementing the HUD layer.

---

## Widget Hierarchy

```mermaid
flowchart TD
    WBP_HUDController[WBP_HUDController — Root HUD Container] --> Diegetic[WBP_DiegeticHUDFrame — Health, Stress, Stamina, Compass]
    WBP_HUDController --> Prompt[WBP_InteractionPromptDisplay — Interaction cues]
    WBP_HUDController --> Subtitle[WBP_AccessibilityUI — Subtitles, Accessibility overlays]
    WBP_HUDController --> Toast[WBP_NotificationToast — Toast messages]
    WBP_HUDController --> Objective[WBP_ObjectiveDisplay — Active objectives]
    WBP_HUDController --> ScreenFX[WBP_ScreenEffectController — Damage, Stress, Flash]
    
    SS_UIManager[SS_UIManager — Menu Stack Manager] --> MainMenu[WBP_MainMenu]
    SS_UIManager --> PauseMenu[WBP_PauseMenu]
    SS_UIManager --> Inventory[WBP_InventoryMenu]
    SS_UIManager --> Journal[WBP_JournalDocumentViewer]
    SS_UIManager --> Settings[WBP_SettingsMenu]
    SS_UIManager --> MenuFlow[WBP_MenuFlowController — State Machine]
    
    SS_UIManager -.->|Input Mode Sync| SS_EnhancedInputManager
    SS_UIManager -.->|Visibility| WBP_HUDController
```

---

## Two-Layer Architecture

| Layer | Manager | Widgets | When Visible |
|-------|---------|---------|-------------|
| **HUD Layer** | `WBP_HUDController` | 45-48, 53-54, 56 | Gameplay only |
| **Menu Layer** | `SS_UIManager` (44) | 49-52, 55, 57 | On top of gameplay (pause, menu, inventory) |

**Rule:** `WBP_HUDController` hides when any full-screen menu opens. `SS_UIManager` handles the menu stack (push/pop). Only one layer is interactive at a time.

---

## Widget Quick Reference

| # | Widget | Lines | Role | Key Input | Key Output |
|---|--------|-------|------|-----------|------------|
| 44 | `SS_UIManager` | — | Menu stack subsystem | `PushMenu`/`PopMenu` | Input mode, cursor state |
| 45 | `WBP_AccessibilityUI` | 141 | Subtitles + accessibility | `OnDialogueLine` dispatcher | Subtitle text on screen |
| 46 | `WBP_DiegeticHUDFrame` | 89 | In-world HUD skin | Player state dispatchers | Health/stress/stamina display |
| 47 | `WBP_HUDController` | 114 | Root HUD container | Game phase changes | Child widget visibility |
| 48 | `WBP_InteractionPromptDisplay` | 135 | Interaction cues | `OnFocusGained`/`OnFocusLost` | Prompt text + progress ring |
| 49 | `WBP_InventoryMenu` | — | Inventory grid UI | `BPC_InventorySystem` data | Drag-drop, equip, drop |
| 50 | `WBP_JournalDocumentViewer` | — | Document/journal reader | `BPC_DocumentArchiveSystem` | Paged text with font styles |
| 51 | `WBP_MainMenu` | — | Main menu screen | Game start/load events | New game, continue, settings |
| 52 | `WBP_MenuFlowController` | — | Menu state machine | Menu transitions | Back navigation |
| 53 | `WBP_NotificationToast` | 52 | Toast notifications | Any system dispatcher | Slide-in text + icon |
| 54 | `WBP_ObjectiveDisplay` | 86 | Objective overlay | `BPC_ObjectiveSystem` events | Objective text + progress |
| 55 | `WBP_PauseMenu` | — | Pause menu | Pause input action | Resume, save, load, quit |
| 56 | `WBP_ScreenEffectController` | 43 | Full-screen effects | Health/stress events | Damage vignette, flash |
| 57 | `WBP_SettingsMenu` | — | Settings screen | `SS_SettingsSystem` | Audio/video/controls tabs |

---

## Data Flow: HUD Widgets

```
Player State Components          HUD Layer
┌─────────────────────┐          ┌──────────────────────────┐
│ BPC_HealthSystem     │─OnHealthChanged──→│ WBP_DiegeticHUDFrame     │
│ BPC_StressSystem     │─OnStressTierChanged→│ WBP_ScreenEffectController│
│ BPC_StaminaSystem    │─OnStaminaChanged─→│ (via WBP_HUDController)  │
│ BPC_InteractionDetector│─OnFocusGained───→│ WBP_InteractionPromptDisplay│
│ BPC_DialoguePlayback │─OnDialogueLine───→│ WBP_AccessibilityUI      │
│ BPC_ObjectiveSystem  │─OnObjectiveUpdate→│ WBP_ObjectiveDisplay     │
│ Any System           │─ShowToast───────→│ WBP_NotificationToast    │
└─────────────────────┘          └──────────────────────────┘

Key: WBP_ widgets NEVER write to game state. They only read via dispatchers.
```

---

## Data Flow: Menu Widgets

```
Input Event                    Menu Layer (SS_UIManager)
┌──────────────────┐           ┌─────────────────────────┐
│ IA_Pause          │──→       │ PushMenu(PauseMenu)      │
│ IA_Inventory      │──→       │ PushMenu(InventoryMenu)  │
│ IA_Journal        │──→       │ PushMenu(JournalViewer)  │
│ IA_Escape (back)  │──→       │ PopMenu() — back nav     │
│                   │           │                         │
│ WBP_SettingsMenu  │──SetFloat→│ SS_SettingsSystem        │
│                   │           │  └→ SS_AudioManager.SetBusVolume│
│                   │           │  └→ Save to persistent storage│
└──────────────────┘           └─────────────────────────┘
```

---

## Implementation Order (Dependency-Safe)

| Step | Widget | Depends On | Reason |
|------|--------|-----------|--------|
| 1 | `WBP_HUDController` (47) | *(none)* | Root container — must exist first |
| 2 | `WBP_DiegeticHUDFrame` (46) | 47 | Parented by HUDController |
| 3 | `WBP_InteractionPromptDisplay` (48) | 47, `BPC_InteractionDetector` (16) | Needs prompt data |
| 4 | `WBP_NotificationToast` (53) | 47 | Parented by HUDController |
| 5 | `WBP_ObjectiveDisplay` (54) | 47, `BPC_ObjectiveSystem` (59) | Needs objective data |
| 6 | `WBP_ScreenEffectController` (56) | 47 | Parented by HUDController |
| 7 | `WBP_AccessibilityUI` (45) | 47, `BPC_DialoguePlaybackSystem` (60) | Needs dialogue events |
| 8 | `SS_UIManager` (44) | *(none — subsystem)* | Menu stack manager |
| 9 | `WBP_MenuFlowController` (52) | 44 | Menu state machine |
| 10 | `WBP_MainMenu` (51) | 44, 52 | First menu pushed |
| 11 | `WBP_PauseMenu` (55) | 44, 52 | Push on pause |
| 12 | `WBP_SettingsMenu` (57) | 44, 52, `SS_SettingsSystem` (105) | Push from menus |
| 13 | `WBP_InventoryMenu` (49) | 44, `BPC_InventorySystem` (31) | Needs inventory data |
| 14 | `WBP_JournalDocumentViewer` (50) | 44, `BPC_DocumentArchiveSystem` (29) | Needs document data |

---

## Key Integration Points with New Systems (130-135)

| Widget | Integration |
|--------|------------|
| `WBP_HUDController` | Reads `BPC_StateManager (130).OnStateChanged` — hides HUD during `InCutscene`, `InMainMenu`, `Loading` |
| `WBP_InteractionPromptDisplay` | Calls `BPC_StateManager.IsActionPermitted(ActionTag)` — shows "Blocked: [Reason]" when action denied |
| `WBP_InteractionPromptDisplay` | Reads `BPC_StateManager.OnStateChangeDenied` — displays `BlockReason` to player |
| `WBP_SettingsMenu` | Calls `SS_AudioManager (132).SetBusVolume()` for each volume slider |
| `WBP_SettingsMenu` | Calls `SS_AudioManager.GetBusVolume()` to populate slider defaults |
| `WBP_AccessibilityUI` | Reads `BPC_StateManager.GetHeartRate()` for visual heartbeat indicator (deaf accessibility) |
| `WBP_DiegeticHUDFrame` | Reads `BPC_StateManager.GetVitalSignal()` to show heart rate tier indicator |

---

*Architecture Overview: HUD System. See [`44_SS_UIManager.md`](../blueprints/06-ui/44_SS_UIManager.md) for the menu stack subsystem spec. See [`47_WBP_HUDController.md`](../blueprints/06-ui/47_WBP_HUDController.md) for the root HUD container spec.*
