add architecture
This commit is contained in:
137
docs/architecture/hud-overview.md
Normal file
137
docs/architecture/hud-overview.md
Normal file
@@ -0,0 +1,137 @@
|
||||
# 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.*
|
||||
Reference in New Issue
Block a user