# 06 — UI, Menus & Diegetic Presentation Systems (Systems 44-57) **Category Purpose:** These 14 systems form the complete UI layer — menu management, HUD presentation, inventory display, interaction prompts, notifications, screen effects, settings, accessibility, and diegetic in-world interfaces. The `SS_UIManager` is the central orchestrator; all widgets operate under its stack-based menu system. The architectural principle "UI Reads, Never Writes" applies: widgets display data but never own game logic. --- ## System Index | # | System | Asset Type | Role | |---|--------|-----------|------| | 44 | `SS_UIManager` | Subsystem | UI subsystem; menu stack, context-based switching, input mode | | 45 | `WBP_AccessibilityUI` | Widget | Accessibility settings; subtitles, colorblind, controller | | 46 | `WBP_DiegeticHUDFrame` | Widget | Diegetic in-world HUD frame (wristwatch, helmet display) | | 47 | `WBP_HUDController` | Widget | Root HUD widget; manages all HUD sub-widgets | | 48 | `WBP_InteractionPromptDisplay` | Widget | Interaction prompt popup; key, description, hold progress | | 49 | `WBP_InventoryMenu` | Widget | Inventory grid UI; drag-drop, sort, examine, equip, drop | | 50 | `WBP_JournalDocumentViewer` | Widget | Document/journal viewer; pages, font styles, highlights | | 51 | `WBP_MainMenu` | Widget | Main menu; new game, continue, load, settings, quit | | 52 | `WBP_MenuFlowController` | Widget | Menu state machine; transitions, back navigation | | 53 | `WBP_NotificationToast` | Widget | Toast notification; objective update, item found, achievement | | 54 | `WBP_ObjectiveDisplay` | Widget | Active objective HUD element; current quest/objective | | 55 | `WBP_PauseMenu` | Widget | Pause menu; resume, settings, save, load, quit | | 56 | `WBP_ScreenEffectController` | Widget | Full-screen effects; damage vignette, stress, flash | | 57 | `WBP_SettingsMenu` | Widget | Settings menu; audio, video, controls, gameplay | --- ## Architecture: UI Layer ``` ┌────────────────────────────────────────────────────────────────┐ │ UI ARCHITECTURE │ │ │ │ SS_UIManager (GameInstanceSubsystem) │ │ │ Menu stack: push/pop menus with priority │ │ │ Context switching: Default → Hiding → Wristwatch → UI │ │ │ Input mode coordination with SS_EnhancedInputManager │ │ │ │ │ ├─► WBP_MenuFlowController (menu state machine) │ │ │ ├─► WBP_MainMenu │ │ │ ├─► WBP_PauseMenu │ │ │ ├─► WBP_SettingsMenu → WBP_AccessibilityUI │ │ │ └─► WBP_CreditsScreen │ │ │ │ │ └─► WBP_HUDController (ingame HUD root) │ │ ├─► WBP_ObjectiveDisplay (current objective) │ │ ├─► WBP_InteractionPromptDisplay (interact prompt) │ │ ├─► WBP_NotificationToast (popup notifications) │ │ ├─► WBP_ScreenEffectController (damage/stress FX) │ │ ├─► WBP_DiegeticHUDFrame (in-world wristwatch) │ │ └─► WBP_InventoryMenu (inventory screen) │ │ └─► WBP_JournalDocumentViewer (documents) │ └────────────────────────────────────────────────────────────────┘ ``` --- ## 44 — SS_UIManager: UI Orchestrator **What It Does:** The central UI authority. Manages a menu stack for push/pop navigation, handles context-based UI switching (Default/Hiding/Wristwatch/UI modes), coordinates input mode changes with `SS_EnhancedInputManager` (cursor visibility, input blocking), and provides the canonical entry point for opening any menu. **How It Works Internally:** **Menu Stack:** - `PushMenu(MenuWidget)` — adds to stack, opens widget, applies input mode - `PopMenu()` — removes top, returns to previous, restores input mode - Priority-based: UI(100) > Inspection(20) > WristwatchUI(10) > Hiding(5) > Default(0) - Higher priority menus block lower ones **Context Switching:** - Listens to game state changes (death, hiding, combat) - Automatically shows/hides appropriate HUD elements per context - Coordinates with `SS_EnhancedInputManager` for input mode changes (game-only vs UI-only vs game-and-UI) **Input Mode Coordination:** - On menu open: request UI input mode (show cursor, block game input) - On menu close: request game input mode (hide cursor, enable game input) - Handles edge cases: pause menu over inventory, settings over pause --- ## 47 — WBP_HUDController: Root HUD Widget **What It Does:** The root widget that owns and manages all HUD sub-widgets. Handles visibility toggling based on game context, manages layout, and routes data from gameplay systems to correct sub-widgets. **Key Sub-Widgets Managed:** - Health/stamina/stress bars (bound to respective system dispatchers) - `WBP_ObjectiveDisplay` — current quest text - `WBP_InteractionPromptDisplay` — shows/hides based on `OnTargetFound`/`OnTargetLost` - `WBP_NotificationToast` — queued notification display - `WBP_ScreenEffectController` — damage vignette, stress overlay - `WBP_DiegeticHUDFrame` — wristwatch HUD for immersive mode **Data Flow:** HUD binds to dispatchers; never polls. `OnHealthChanged` → update health bar. `OnObjectiveTagsChanged` → update objective text. `OnTargetFound` → show interaction prompt. --- ## 48 — WBP_InteractionPromptDisplay: Interaction Prompt **What It Does:** Shows the "Press E to Open" style prompt when the player looks at an interactable. Handles three input modes: - **Press:** shows key icon + action text - **Hold:** shows radial fill progress bar + action text - **DoubleTap:** shows double-tap indicator Binds to `BPC_InteractionDetector.OnTargetFound/Lost` and `OnHoldProgressUpdated`. --- ## 49 — WBP_InventoryMenu: Inventory Grid UI **What It Does:** Full inventory screen with drag-and-drop grid layout. Displays all items from `BPC_InventorySystem`, supports sort modes, item inspection, equip/unequip, drop, use, and combine operations. **Features:** - Grid-based layout with item icons and stack counts - Drag-and-drop between slots (rearrange) - Right-click context menu: Use, Equip, Drop, Examine, Combine - Category tabs for filtering - Weight bar showing current/max capacity - Tooltip on hover showing item details (name, description, stats) - Quick slot assignment (drag to hotbar) **Data Binding:** Subscribes to all `BPC_InventorySystem` event dispatchers. On any change, refreshes the affected slot, not the entire grid. --- ## 51-57: Menu & Screen Widgets - **51 WBP_MainMenu:** New Game, Continue, Load Game, Settings, Quit. Checks save manifest for Continue availability. - **52 WBP_MenuFlowController:** State machine for menu navigation. Handles transitions, back button, and prevents menu stacking bugs. - **53 WBP_NotificationToast:** Animated popup for objectives, items, achievements. Queued system — multiple toasts stack vertically with auto-dismiss. - **54 WBP_ObjectiveDisplay:** Shows current active objective text on HUD. Updates on `GS_CoreGameState.OnObjectiveTagsChanged`. - **55 WBP_PauseMenu:** Resume, Settings, Save, Load, Quit to Menu. Checks `GM_CoreGameMode.bPauseAllowed`. - **56 WBP_ScreenEffectController:** Full-screen post-process effects driven by gameplay state: damage vignette (red flash on hit), stress overlay (chromatic aberration, darkening), healing glow, death fade to black. - **57 WBP_SettingsMenu:** Audio (volume sliders per bus), Video (resolution, quality), Controls (key rebinding via `SS_EnhancedInputManager`), Gameplay settings, Accessibility tab → `WBP_AccessibilityUI`. --- ## 45-46, 50: Supporting Widgets - **45 WBP_AccessibilityUI:** Subtitle toggle/size, colorblind modes, controller remapping, difficulty presets, hold-to-confirm toggle. Reads/writes via `SS_SettingsSystem`. - **46 WBP_DiegeticHUDFrame:** In-world HUD rendered on wristwatch or helmet display via `BPC_DiegeticDisplay`. Shows minimap, compass, health, ammo — diegetic (exists in world) not screen-space. - **50 WBP_JournalDocumentViewer:** Reads documents from `BPC_DocumentArchiveSystem`. Page-turning interface with font styles, highlighted keywords, and categorization. --- ## Common Implementation Patterns in This Category 1. **UI Reads, Never Writes:** Widgets bind to gameplay dispatchers and display data. They call functions on systems (UseItem, EquipItem) but never own game state. 2. **Menu Stack Navigation:** `SS_UIManager.PushMenu()` / `PopMenu()` ensures clean navigation without manual visibility management. 3. **Context Priority Ladder:** Default(0) < Hiding(5) < WristwatchUI(10) < Inspection(20) < UI(100). Higher priority contexts override lower ones automatically. 4. **Input Mode Sync:** Every menu open/close coordinates with `SS_EnhancedInputManager` for cursor + input blocking. 5. **Dispatcher Binding, Not Polling:** All HUD widgets bind to gameplay dispatchers on construct and unbind on destruct. No widget uses Event Tick for polling. 6. **Toast Queue:** Notifications are queued and displayed sequentially with auto-dismiss — prevents notification spam. --- ## Multiplayer Networking **All UI is local per-client. Zero networking code in widgets.** ### UI Networking Pattern ``` Server state changes → replicated variable → OnRep fires dispatcher → Widget (local) already bound to that dispatcher → Widget updates with zero multiplayer awareness ``` ### Category Rules - **WBP_* Widgets:** Local only. Bind to replicated dispatchers from gameplay systems. Use the same binding code as single-player. - **SS_UIManager:** Local per-client. Menu stack is per-player — different players can be in different menus. - **Input mode changes:** Handled per-client by `SS_EnhancedInputManager` listening to game phase dispatchers. - **HUD visibility:** Each client independently determines what to show based on their replicated state (e.g., hiding player sees different HUD than exposed player). --- *Developer Reference v1.0 — 06 UI Systems. Companion to docs/blueprints/06-ui/ specs.*